diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..f79a823d7
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+; editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+continuation_indent_size = 2
+end_of_line = lf
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+max_line_length = 120
+tab_width = 2
+; trim_trailing_whitespace = true ; disabled until files are cleaned up
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
deleted file mode 100644
index 4cf8cff54..000000000
--- a/.github/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,132 +0,0 @@
-
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-We as members, contributors, and leaders pledge to make participation in our
-community a harassment-free experience for everyone, regardless of age, body
-size, visible or invisible disability, ethnicity, sex characteristics, gender
-identity and expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, religion, or sexual identity
-and orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming,
-diverse, inclusive, and healthy community.
-
-## Our Standards
-
-Examples of behavior that contributes to a positive environment for our
-community include:
-
-* Demonstrating empathy and kindness toward other people
-* Being respectful of differing opinions, viewpoints, and experiences
-* Giving and gracefully accepting constructive feedback
-* Accepting responsibility and apologizing to those affected by our mistakes,
- and learning from the experience
-* Focusing on what is best not just for us as individuals, but for the
- overall community
-
-Examples of unacceptable behavior include:
-
-* The use of sexualized language or imagery, and sexual attention or
- advances of any kind
-* Trolling, insulting or derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or email
- address, without their explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Enforcement Responsibilities
-
-Community leaders are responsible for clarifying and enforcing our standards of
-acceptable behavior and will take appropriate and fair corrective action in
-response to any behavior that they deem inappropriate, threatening, offensive,
-or harmful.
-
-Community leaders have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are
-not aligned to this Code of Conduct, and will communicate reasons for moderation
-decisions when appropriate.
-
-## Scope
-
-This Code of Conduct applies within all community spaces, and also applies when
-an individual is officially representing the community in public spaces.
-Examples of representing our community include using an official e-mail address,
-posting via an official social media account, or acting as an appointed
-representative at an online or offline event.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the community leaders responsible for enforcement.
-All complaints will be reviewed and investigated promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the
-reporter of any incident.
-
-## Enforcement Guidelines
-
-Community leaders will follow these Community Impact Guidelines in determining
-the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-
-**Community Impact**: Use of inappropriate language or other behavior deemed
-unprofessional or unwelcome in the community.
-
-**Consequence**: A private, written warning from community leaders, providing
-clarity around the nature of the violation and an explanation of why the
-behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-
-**Community Impact**: A violation through a single incident or series
-of actions.
-
-**Consequence**: A warning with consequences for continued behavior. No
-interaction with the people involved, including unsolicited interaction with
-those enforcing the Code of Conduct, for a specified period of time. This
-includes avoiding interactions in community spaces as well as external channels
-like social media. Violating these terms may lead to a temporary or
-permanent ban.
-
-### 3. Temporary Ban
-
-**Community Impact**: A serious violation of community standards, including
-sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public
-communication with the community for a specified period of time. No public or
-private interaction with the people involved, including unsolicited interaction
-with those enforcing the Code of Conduct, is allowed during this period.
-Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Ban
-
-**Community Impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
-individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within
-the community.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 2.0, available at
-[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
-
-Community Impact Guidelines were inspired by
-[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
-
-For answers to common questions about this code of conduct, see the FAQ at
-[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
-at [https://www.contributor-covenant.org/translations][translations].
-
-[homepage]: https://www.contributor-covenant.org
-[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
-[Mozilla CoC]: https://github.com/mozilla/diversity
-[FAQ]: https://www.contributor-covenant.org/faq
-[translations]: https://www.contributor-covenant.org/translations
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
deleted file mode 100644
index 26e62e89e..000000000
--- a/.github/ISSUE_TEMPLATE/bug_report.yaml
+++ /dev/null
@@ -1,65 +0,0 @@
-name: Problems with a script.
-description: Generate a report on an issue pertaining specifically to a script. For other inquires please share them in the Discussions section.
-body:
- - type: markdown
- attributes:
- value: |
- **IMPORTANT:** Failure to comply with the following guidelines may result in immediate closure.
- - Prior to submitting, kindly search the closed issues to check if the problem you are reporting has already been addressed and resolved. If you come across a closed issue that pertains to your problem, please leave a comment on that issue instead of creating a new one.
- - If the default Linux distribution is not adhered to, script support will be discontinued.
- - When encountering the error message `[ERROR] in line 23: exit code *: while executing command "$@" > /dev/null 2>&1`, make sure to run the script in verbose mode to accurately determine the underlying issue.
- - For suggestions, questions or feature/script requests, please share them in the [Discussions section.](https://github.com/tteck/Proxmox/discussions)
- - type: input
- id: guidelines
- attributes:
- label: Please verify that you have read and understood the guidelines.
- placeholder: 'yes'
- validations:
- required: true
- - type: textarea
- id: bug
- attributes:
- label: A clear and concise description of the issue.
- validations:
- required: true
- - type: dropdown
- id: settings
- validations:
- required: true
- attributes:
- label: What settings are you currently utilizing?
- options:
- -
- - Default Settings
- - Advanced Settings
- - type: markdown
- attributes:
- value: (if Advanced Settings, please try Default Settings before creating an issue)
- - type: dropdown
- id: distribution
- validations:
- required: true
- attributes:
- label: Which Linux distribution are you employing?
- options:
- -
- - Alpine
- - Debian 11
- - Debian 12
- - Ubuntu 20.04
- - Ubuntu 22.04
- - Ubuntu 24.04
- - type: textarea
- id: screenshot
- attributes:
- label: If relevant, including screenshots or a code block can be helpful in clarifying the issue.
- placeholder: Code blocks begin and conclude by enclosing the code with three backticks (```) above and below it.
- validations:
- required: false
- - type: textarea
- id: reproduce
- attributes:
- label: Please provide detailed steps to reproduce the issue.
- placeholder: First do this, then this ...
- validations:
- required: false
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..7a00d8ed9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+script.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4d99a84ba..94a28fe1e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
Changelog
@@ -13,25 +13,833 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
> [!NOTE]
All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
+> [!IMPORTANT]
+Do not break established syntax in this file, as it is automatically updated by a Github Workflow
+
+## 2025-01-08
+
+### Changed
+
+### 🌐 Website
+
+- update postgresql json to add post install password setup [@rdiazlugo](https://github.com/rdiazlugo) ([#1318](https://github.com/community-scripts/ProxmoxVE/pull/1318))
+
+### 🧰 Maintenance
+
+- fix(ci): formatting event & chmod +x [@se-bastiaan](https://github.com/se-bastiaan) ([#1335](https://github.com/community-scripts/ProxmoxVE/pull/1335))
+- fix: correctly handle pull_request_target event [@se-bastiaan](https://github.com/se-bastiaan) ([#1327](https://github.com/community-scripts/ProxmoxVE/pull/1327))
+
+## 2025-01-07
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix: Folder-Check for Updatescript Zammad [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1309](https://github.com/community-scripts/ProxmoxVE/pull/1309))
+
+### 🧰 Maintenance
+
+- fix: permissions of validate pipelines [@se-bastiaan](https://github.com/se-bastiaan) ([#1316](https://github.com/community-scripts/ProxmoxVE/pull/1316))
+- Set Execution Rights for GH-Action: Validate Scripts [@MickLesk](https://github.com/MickLesk) ([#1312](https://github.com/community-scripts/ProxmoxVE/pull/1312))
+
+## 2025-01-06
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: Typesense [@tlissak](https://github.com/tlissak) ([#1291](https://github.com/community-scripts/ProxmoxVE/pull/1291))
+- New script: GLPI [@opastorello](https://github.com/opastorello) ([#1201](https://github.com/community-scripts/ProxmoxVE/pull/1201))
+
+### 🚀 Updated Scripts
+
+- Fix Tag in HyperHDR Script [@MickLesk](https://github.com/MickLesk) ([#1299](https://github.com/community-scripts/ProxmoxVE/pull/1299))
+- [Fix]: Fixed rm Bug in pf2etools [@MickLesk](https://github.com/MickLesk) ([#1292](https://github.com/community-scripts/ProxmoxVE/pull/1292))
+- Fix: Homebox Update Script [@MickLesk](https://github.com/MickLesk) ([#1284](https://github.com/community-scripts/ProxmoxVE/pull/1284))
+- Add ca-certificates for Install (Frigate) [@MickLesk](https://github.com/MickLesk) ([#1282](https://github.com/community-scripts/ProxmoxVE/pull/1282))
+- fix: buffer from base64 in formatting pipeline [@se-bastiaan](https://github.com/se-bastiaan) ([#1285](https://github.com/community-scripts/ProxmoxVE/pull/1285))
+
+### 🧰 Maintenance
+
+- Add reapproval of Changelog-PR [@MickLesk](https://github.com/MickLesk) ([#1279](https://github.com/community-scripts/ProxmoxVE/pull/1279))
+- ci: combine header checks into workflow with PR comment [@se-bastiaan](https://github.com/se-bastiaan) ([#1257](https://github.com/community-scripts/ProxmoxVE/pull/1257))
+- ci: change filename checks into steps with PR comment [@se-bastiaan](https://github.com/se-bastiaan) ([#1255](https://github.com/community-scripts/ProxmoxVE/pull/1255))
+- ci: add pipeline for code formatting checks [@se-bastiaan](https://github.com/se-bastiaan) ([#1239](https://github.com/community-scripts/ProxmoxVE/pull/1239))
+
+## 2025-01-05
+
+### Changed
+
+### 💥 Breaking Changes
+
+- [Breaking] Update Zigbee2mqtt to v.2.0.0 (Read PR Description) [@MickLesk](https://github.com/MickLesk) ([#1221](https://github.com/community-scripts/ProxmoxVE/pull/1221))
+
+### ❔ Unlabelled
+
+- Add RAM and Disk units [@oOStroudyOo](https://github.com/oOStroudyOo) ([#1261](https://github.com/community-scripts/ProxmoxVE/pull/1261))
+
+## 2025-01-04
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix gpg key pf2tools & 5etools [@MickLesk](https://github.com/MickLesk) ([#1242](https://github.com/community-scripts/ProxmoxVE/pull/1242))
+- Homarr: Fix missing curl dependency [@MickLesk](https://github.com/MickLesk) ([#1238](https://github.com/community-scripts/ProxmoxVE/pull/1238))
+- Homeassistan Core: Fix Python3 and add missing dependencies [@MickLesk](https://github.com/MickLesk) ([#1236](https://github.com/community-scripts/ProxmoxVE/pull/1236))
+- Fix: Update Python for HomeAssistant [@MickLesk](https://github.com/MickLesk) ([#1227](https://github.com/community-scripts/ProxmoxVE/pull/1227))
+- OneDev: Add git-lfs [@MickLesk](https://github.com/MickLesk) ([#1225](https://github.com/community-scripts/ProxmoxVE/pull/1225))
+- Pf2eTools & 5eTools: Fixing npm build [@TheRealVira](https://github.com/TheRealVira) ([#1213](https://github.com/community-scripts/ProxmoxVE/pull/1213))
+
+### 🌐 Website
+
+- Bump next from 15.0.2 to 15.1.3 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#1212](https://github.com/community-scripts/ProxmoxVE/pull/1212))
+
+### 🧰 Maintenance
+
+- [GitHub Action] Add filename case check [@quantumryuu](https://github.com/quantumryuu) ([#1228](https://github.com/community-scripts/ProxmoxVE/pull/1228))
+
+## 2025-01-03
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Improve Homarr Installation [@MickLesk](https://github.com/MickLesk) ([#1208](https://github.com/community-scripts/ProxmoxVE/pull/1208))
+- Fix: Zabbix-Update Script [@MickLesk](https://github.com/MickLesk) ([#1205](https://github.com/community-scripts/ProxmoxVE/pull/1205))
+- Update Script: Lazylibrarian [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1190](https://github.com/community-scripts/ProxmoxVE/pull/1190))
+- Fix: Memos update function [@MickLesk](https://github.com/MickLesk) ([#1207](https://github.com/community-scripts/ProxmoxVE/pull/1207))
+- Keep Lubelogger data after update to a new version [@JcMinarro](https://github.com/JcMinarro) ([#1200](https://github.com/community-scripts/ProxmoxVE/pull/1200))
+
+### 🌐 Website
+
+- Update Nextcloud-LXC JSON [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1191](https://github.com/community-scripts/ProxmoxVE/pull/1191))
+
+### 🧰 Maintenance
+
+- Github action to check metadata lines in scripts. [@quantumryuu](https://github.com/quantumryuu) ([#1110](https://github.com/community-scripts/ProxmoxVE/pull/1110))
+
+## 2025-01-02
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: Pf2eTools [@TheRealVira](https://github.com/TheRealVira) ([#1162](https://github.com/community-scripts/ProxmoxVE/pull/1162))
+- New Script: 5etools [@TheRealVira](https://github.com/TheRealVira) ([#1157](https://github.com/community-scripts/ProxmoxVE/pull/1157))
+
+### 🚀 Updated Scripts
+
+- Update config template in blocky-install.sh [@xFichtl1](https://github.com/xFichtl1) ([#1059](https://github.com/community-scripts/ProxmoxVE/pull/1059))
+
+## 2025-01-01
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: Komodo [@MickLesk](https://github.com/MickLesk) ([#1167](https://github.com/community-scripts/ProxmoxVE/pull/1167))
+- New Script: Firefly [@quantumryuu](https://github.com/quantumryuu) ([#616](https://github.com/community-scripts/ProxmoxVE/pull/616))
+- New Script: Semaphore [@quantumryuu](https://github.com/quantumryuu) ([#596](https://github.com/community-scripts/ProxmoxVE/pull/596))
+
+### 🚀 Updated Scripts
+
+- Fix Script Homepage: add version during build step [@se-bastiaan](https://github.com/se-bastiaan) ([#1155](https://github.com/community-scripts/ProxmoxVE/pull/1155))
+- Happy new Year! Update Copyright to 2025 [@MickLesk](https://github.com/MickLesk) ([#1150](https://github.com/community-scripts/ProxmoxVE/pull/1150))
+- Update Kernel-Clean to new Version & Bugfixing [@MickLesk](https://github.com/MickLesk) ([#1147](https://github.com/community-scripts/ProxmoxVE/pull/1147))
+- Fix chromium installation for ArchiveBox [@tkunzfeld](https://github.com/tkunzfeld) ([#1140](https://github.com/community-scripts/ProxmoxVE/pull/1140))
+
+### 🌐 Website
+
+- Fix Category of Semaphore [@MickLesk](https://github.com/MickLesk) ([#1148](https://github.com/community-scripts/ProxmoxVE/pull/1148))
+
+### 🧰 Maintenance
+
+- Correctly check for changed files in Shellcheck workflow [@se-bastiaan](https://github.com/se-bastiaan) ([#1156](https://github.com/community-scripts/ProxmoxVE/pull/1156))
+
+## 2024-12-31 - Happy new Year! 🎉✨
+
+### Changed
+
+### 💥 Breaking Changes
+
+- Add ExecReload to prometheus.service [@BasixKOR](https://github.com/BasixKOR) ([#1131](https://github.com/community-scripts/ProxmoxVE/pull/1131))
+- Fix: Figlet Version & Font Check [@MickLesk](https://github.com/MickLesk) ([#1133](https://github.com/community-scripts/ProxmoxVE/pull/1133))
+
+### 🚀 Updated Scripts
+
+- Fix: Copy issue after update in Bookstack LXC [@MickLesk](https://github.com/MickLesk) ([#1137](https://github.com/community-scripts/ProxmoxVE/pull/1137))
+- Omada: Switch Base-URL to prevent issues [@MickLesk](https://github.com/MickLesk) ([#1135](https://github.com/community-scripts/ProxmoxVE/pull/1135))
+- fix: guacd service not start during Apache-Guacamole script installation process [@PhoenixEmik](https://github.com/PhoenixEmik) ([#1122](https://github.com/community-scripts/ProxmoxVE/pull/1122))
+- Fix Homepage-Script: Installation/Update [@MickLesk](https://github.com/MickLesk) ([#1129](https://github.com/community-scripts/ProxmoxVE/pull/1129))
+- Netbox: Updating URL to https [@surajsbmn](https://github.com/surajsbmn) ([#1124](https://github.com/community-scripts/ProxmoxVE/pull/1124))
+
+## 2024-12-30
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- [Archivebox] Fix wrong port being printed post install. [@Strana-Mechty](https://github.com/Strana-Mechty) ([#1105](https://github.com/community-scripts/ProxmoxVE/pull/1105))
+- fix: add homepage version during build step [@se-bastiaan](https://github.com/se-bastiaan) ([#1107](https://github.com/community-scripts/ProxmoxVE/pull/1107))
+
+### 🌐 Website
+
+- Fix Trilium Website to TriliumNext [@tmkis2](https://github.com/tmkis2) ([#1103](https://github.com/community-scripts/ProxmoxVE/pull/1103))
+
+## 2024-12-29
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: Grist [@cfurrow](https://github.com/cfurrow) ([#1076](https://github.com/community-scripts/ProxmoxVE/pull/1076))
+- New Script: TeddyCloud Server [@dsiebel](https://github.com/dsiebel) ([#1064](https://github.com/community-scripts/ProxmoxVE/pull/1064))
+
+### 🚀 Updated Scripts
+
+- Fix Install / Update on Grist Script [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1091](https://github.com/community-scripts/ProxmoxVE/pull/1091))
+
+### 🌐 Website
+
+- fix: Update add-lxc-iptag.json warn to warning [@BramSuurdje](https://github.com/BramSuurdje) ([#1094](https://github.com/community-scripts/ProxmoxVE/pull/1094))
+
+### 🧰 Maintenance
+
+- Introduce editorconfig for more consistent formatting [@dsiebel](https://github.com/dsiebel) ([#1073](https://github.com/community-scripts/ProxmoxVE/pull/1073))
+
+## 2024-12-28
+
+### Changed
+
+### 💥 Breaking Changes
+
+- Add Figlet into Repo | Creation of local ASCII Header [@MickLesk](https://github.com/MickLesk) ([#1072](https://github.com/community-scripts/ProxmoxVE/pull/1072))
+- Add an IP-Update for MOTD if IP Changed [@MickLesk](https://github.com/MickLesk) ([#1067](https://github.com/community-scripts/ProxmoxVE/pull/1067))
+
+### 🚀 Updated Scripts
+
+- Zabbix: Fix SQL Path for 7.2 [@MickLesk](https://github.com/MickLesk) ([#1069](https://github.com/community-scripts/ProxmoxVE/pull/1069))
+- Authentik: added missing port to access url [@TheRealVira](https://github.com/TheRealVira) ([#1065](https://github.com/community-scripts/ProxmoxVE/pull/1065))
+
+## 2024-12-27
+
+### Changed
+
+### ✨ New Scripts
+
+- new scripts for Authentik [@remz1337](https://github.com/remz1337) ([#291](https://github.com/community-scripts/ProxmoxVE/pull/291))
+
+### 🚀 Updated Scripts
+
+- Add 8.0 for MongoDB Installation [@MickLesk](https://github.com/MickLesk) ([#1046](https://github.com/community-scripts/ProxmoxVE/pull/1046))
+- Update Zabbix to 7.2. Release [@MickLesk](https://github.com/MickLesk) ([#1048](https://github.com/community-scripts/ProxmoxVE/pull/1048))
+- Apache-Guacamole script bug fix [@sannier3](https://github.com/sannier3) ([#1039](https://github.com/community-scripts/ProxmoxVE/pull/1039))
+
+### 🌐 Website
+
+- Updated SAB documentation based on RAM increase [@TheRealVira](https://github.com/TheRealVira) ([#1035](https://github.com/community-scripts/ProxmoxVE/pull/1035))
+
+### ❔ Unlabelled
+
+- Patch Figlet Repo if missing [@MickLesk](https://github.com/MickLesk) ([#1044](https://github.com/community-scripts/ProxmoxVE/pull/1044))
+- fix Tags for Advanced Settings [@MickLesk](https://github.com/MickLesk) ([#1042](https://github.com/community-scripts/ProxmoxVE/pull/1042))
+
+## 2024-12-26
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: Jenkins [@quantumryuu](https://github.com/quantumryuu) ([#1019](https://github.com/community-scripts/ProxmoxVE/pull/1019))
+- New Script: 2FAuth [@jkrgr0](https://github.com/jkrgr0) ([#943](https://github.com/community-scripts/ProxmoxVE/pull/943))
+
+### 🚀 Updated Scripts
+
+- ChangeDetection Update: Update also Browsers [@Niklas04](https://github.com/Niklas04) ([#1027](https://github.com/community-scripts/ProxmoxVE/pull/1027))
+- ensure all RFC1918 local Ipv4 addresses are in iptag script [@AskAlice](https://github.com/AskAlice) ([#992](https://github.com/community-scripts/ProxmoxVE/pull/992))
+- Fix Proxmox DataCenter: incorrect build.func url [@rbradley0](https://github.com/rbradley0) ([#1013](https://github.com/community-scripts/ProxmoxVE/pull/1013))
+
+### 🧰 Maintenance
+
+- [GitHub Actions] Introduce Shellcheck to check bash code [@andygrunwald](https://github.com/andygrunwald) ([#1018](https://github.com/community-scripts/ProxmoxVE/pull/1018))
+
+## 2024-12-25
+
+### Changed
+
+### ✨ New Scripts
+
+- add: pve-datacenter-manager [@CrazyWolf13](https://github.com/CrazyWolf13) ([#947](https://github.com/community-scripts/ProxmoxVE/pull/947))
+
+### 🚀 Updated Scripts
+
+- Fix Script: Alpine Nextcloud Upload File Size Limit [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#933](https://github.com/community-scripts/ProxmoxVE/pull/933))
+- Doubled RAM for SAB [@TheRealVira](https://github.com/TheRealVira) ([#1007](https://github.com/community-scripts/ProxmoxVE/pull/1007))
+
+## 2024-12-23
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix Navidrome Update & Install [@MickLesk](https://github.com/MickLesk) ([#991](https://github.com/community-scripts/ProxmoxVE/pull/991))
+- Update emby.sh to correct port [@Rageplant](https://github.com/Rageplant) ([#989](https://github.com/community-scripts/ProxmoxVE/pull/989))
+
+## 2024-12-21
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- update Port in homeassistant-core CT [@fraefel](https://github.com/fraefel) ([#961](https://github.com/community-scripts/ProxmoxVE/pull/961))
+
+## 2024-12-20
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: Apache Guacamole [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#657](https://github.com/community-scripts/ProxmoxVE/pull/657))
+- New Script: silverbullet [@dsiebel](https://github.com/dsiebel) ([#659](https://github.com/community-scripts/ProxmoxVE/pull/659))
+- New Script: Zammad [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#640](https://github.com/community-scripts/ProxmoxVE/pull/640))
+- New Script: CheckMk [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#926](https://github.com/community-scripts/ProxmoxVE/pull/926))
+
+### 🚀 Updated Scripts
+
+- Fix: Remove PHP Key generation in Bookstack Update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#948](https://github.com/community-scripts/ProxmoxVE/pull/948))
+
+### 🌐 Website
+
+- Update checkmk description [@BramSuurdje](https://github.com/BramSuurdje) ([#954](https://github.com/community-scripts/ProxmoxVE/pull/954))
+- Add Login Note for Checkmk [@MickLesk](https://github.com/MickLesk) ([#940](https://github.com/community-scripts/ProxmoxVE/pull/940))
+
+### ❔ Unlabelled
+
+- Update build.func to display the Proxmox Hostname [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#894](https://github.com/community-scripts/ProxmoxVE/pull/894))
+
+## 2024-12-19
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix: Bookstack Update Function [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#844](https://github.com/community-scripts/ProxmoxVE/pull/844))
+- mysql not showing ip after install [@snow2k9](https://github.com/snow2k9) ([#924](https://github.com/community-scripts/ProxmoxVE/pull/924))
+- Fix Omada - Crawling latest version [@MickLesk](https://github.com/MickLesk) ([#918](https://github.com/community-scripts/ProxmoxVE/pull/918))
+
+### 🌐 Website
+
+- Fix script path formatting in InstallMethod component [@BramSuurdje](https://github.com/BramSuurdje) ([#909](https://github.com/community-scripts/ProxmoxVE/pull/909))
+- Fix Part-DB Docu (cred command) [@EvilBlood](https://github.com/EvilBlood) ([#898](https://github.com/community-scripts/ProxmoxVE/pull/898))
+- Enhance Tooltip component by adding CircleHelp icon and fix instructions in script component [@BramSuurdje](https://github.com/BramSuurdje) ([#910](https://github.com/community-scripts/ProxmoxVE/pull/910))
+
+## 2024-12-18
+
+### Changed
+
+### ✨ New Scripts
+
+- New script: Part-DB LXC [@bvdberg01](https://github.com/bvdberg01) ([#591](https://github.com/community-scripts/ProxmoxVE/pull/591))
+
+### 🚀 Updated Scripts
+
+- Fix Kernel-Clean for Proxmox 8.x [@MickLesk](https://github.com/MickLesk) ([#904](https://github.com/community-scripts/ProxmoxVE/pull/904))
+- [Frigate] Remove SSE 4.2 from instruction set supporting OpenVino [@remz1337](https://github.com/remz1337) ([#902](https://github.com/community-scripts/ProxmoxVE/pull/902))
+
+### 🌐 Website
+
+- New Metadata Category: "Coding & AI" [@newzealandpaul](https://github.com/newzealandpaul) ([#890](https://github.com/community-scripts/ProxmoxVE/pull/890))
+- Moved Webmin to "Server & Networking" [@newzealandpaul](https://github.com/newzealandpaul) ([#891](https://github.com/community-scripts/ProxmoxVE/pull/891))
+
+## 2024-12-17
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix Alpine-Nextcloud: Bump PHP Version to 8.3 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#865](https://github.com/community-scripts/ProxmoxVE/pull/865))
+- Correction of Jellyfin CT Port [@mneten](https://github.com/mneten) ([#884](https://github.com/community-scripts/ProxmoxVE/pull/884))
+- fix spinner on lxc-ip-tag [@MickLesk](https://github.com/MickLesk) ([#876](https://github.com/community-scripts/ProxmoxVE/pull/876))
+- Fix Keycloak Installation [@MickLesk](https://github.com/MickLesk) ([#874](https://github.com/community-scripts/ProxmoxVE/pull/874))
+- Fix ports ressources [@MickLesk](https://github.com/MickLesk) ([#867](https://github.com/community-scripts/ProxmoxVE/pull/867))
+
+### 🧰 Maintenance
+
+- Small Changes to the PR Template [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#862](https://github.com/community-scripts/ProxmoxVE/pull/862))
+
+### ❔ Unlabelled
+
+- calculate terminal size for header_info [@MickLesk](https://github.com/MickLesk) ([#879](https://github.com/community-scripts/ProxmoxVE/pull/879))
+- Fix header creation with figlet for alpine [@MickLesk](https://github.com/MickLesk) ([#869](https://github.com/community-scripts/ProxmoxVE/pull/869))
+
+## 2024-12-16
+
+### Changed
+
+### 💥 Breaking Changes
+
+- Massive Update: build.func | install.func | create_lxc.sh (Part 1) [@MickLesk](https://github.com/MickLesk) ([#643](https://github.com/community-scripts/ProxmoxVE/pull/643))
+- Update ALL CT's to new default (Part 2) [@MickLesk](https://github.com/MickLesk) ([#710](https://github.com/community-scripts/ProxmoxVE/pull/710))
+
+### ✨ New Scripts
+
+- New Script: LXC IP-Tag [@MickLesk](https://github.com/MickLesk) ([#536](https://github.com/community-scripts/ProxmoxVE/pull/536))
+
+### 🚀 Updated Scripts
+
+- Increase Size | Description & Download-URL of Debian VM [@MickLesk](https://github.com/MickLesk) ([#837](https://github.com/community-scripts/ProxmoxVE/pull/837))
+- Update Script: Remove Docker Compose Question [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#847](https://github.com/community-scripts/ProxmoxVE/pull/847))
+
+### 🌐 Website
+
+- Bump nanoid from 3.3.7 to 3.3.8 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#845](https://github.com/community-scripts/ProxmoxVE/pull/845))
+
+### ❔ Unlabelled
+
+- Fix SSH root access in install.func [@havardthom](https://github.com/havardthom) ([#858](https://github.com/community-scripts/ProxmoxVE/pull/858))
+- Fix variable name for CT_TYPE override [@remz1337](https://github.com/remz1337) ([#855](https://github.com/community-scripts/ProxmoxVE/pull/855))
+- Keeps the same style after writing the SEARCH icon [@remz1337](https://github.com/remz1337) ([#851](https://github.com/community-scripts/ProxmoxVE/pull/851))
+
+## 2024-12-13
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix Keycloak Update Function [@MickLesk](https://github.com/MickLesk) ([#762](https://github.com/community-scripts/ProxmoxVE/pull/762))
+- Fix config bug in Alpine Vaultwarden [@havardthom](https://github.com/havardthom) ([#775](https://github.com/community-scripts/ProxmoxVE/pull/775))
+
+### 🌐 Website
+
+- Change MISC from red to green [@MickLesk](https://github.com/MickLesk) ([#815](https://github.com/community-scripts/ProxmoxVE/pull/815))
+- Update some JSON Files for Website [@MickLesk](https://github.com/MickLesk) ([#812](https://github.com/community-scripts/ProxmoxVE/pull/812))
+- Update Notes & Documentation for Proxmox Backup Server [@MickLesk](https://github.com/MickLesk) ([#804](https://github.com/community-scripts/ProxmoxVE/pull/804))
+
+### 🧰 Maintenance
+
+- Github: Optimize Issue Template & PR Template [@MickLesk](https://github.com/MickLesk) ([#802](https://github.com/community-scripts/ProxmoxVE/pull/802))
+
+## 2024-12-12
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Update jellyfin.sh / Fix infinite loop [@gerpo](https://github.com/gerpo) ([#792](https://github.com/community-scripts/ProxmoxVE/pull/792))
+
+### 🌐 Website
+
+- Fix port and website in nextcloudpi.json [@PhoenixEmik](https://github.com/PhoenixEmik) ([#790](https://github.com/community-scripts/ProxmoxVE/pull/790))
+- Add post-install note to mqtt.json [@havardthom](https://github.com/havardthom) ([#783](https://github.com/community-scripts/ProxmoxVE/pull/783))
+
+### 🧰 Maintenance
+
+- Filter pull requests on main branch in changelog-pr.yml [@havardthom](https://github.com/havardthom) ([#793](https://github.com/community-scripts/ProxmoxVE/pull/793))
+- Fix Z-Wave JS UI Breaking Change in CHANGELOG.md [@havardthom](https://github.com/havardthom) ([#781](https://github.com/community-scripts/ProxmoxVE/pull/781))
+
+## 2024-12-09
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix PostgreSQL password bug in Umami install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#750](https://github.com/community-scripts/ProxmoxVE/pull/750))
+
+## 2024-12-08
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Use MongoDB 4.4 in Unifi for non-AVX users [@havardthom](https://github.com/havardthom) ([#691](https://github.com/community-scripts/ProxmoxVE/pull/691))
+
+### 🌐 Website
+
+- Move homarr to Dashboards section [@CrazyWolf13](https://github.com/CrazyWolf13) ([#740](https://github.com/community-scripts/ProxmoxVE/pull/740))
+
+## 2024-12-07
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Zigbee2MQTT: Remove dev branch choice until v2.0.0 release [@havardthom](https://github.com/havardthom) ([#702](https://github.com/community-scripts/ProxmoxVE/pull/702))
+- Fix Hoarder build failure by installing Chromium stable [@vhsdream](https://github.com/vhsdream) ([#723](https://github.com/community-scripts/ProxmoxVE/pull/723))
+
+### 🌐 Website
+
+- Bugfix: Include script name in website search [@havardthom](https://github.com/havardthom) ([#731](https://github.com/community-scripts/ProxmoxVE/pull/731))
+
+### ❔ Unlabelled
+
+- Fix broken build.func [@havardthom](https://github.com/havardthom) ([#736](https://github.com/community-scripts/ProxmoxVE/pull/736))
+
+## 2024-12-06
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix bugs in Komga update [@DysfunctionalProgramming](https://github.com/DysfunctionalProgramming) ([#717](https://github.com/community-scripts/ProxmoxVE/pull/717))
+- Bookstack: Fix Update function composer [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#700](https://github.com/community-scripts/ProxmoxVE/pull/700))
+
+### 🌐 Website
+
+- fix: note component in json-editor getting out of focus when typing and revert theme switch animation [@BramSuurdje](https://github.com/BramSuurdje) ([#706](https://github.com/community-scripts/ProxmoxVE/pull/706))
+
+### 🧰 Maintenance
+
+- Update frontend CI/CD workflow [@havardthom](https://github.com/havardthom) ([#703](https://github.com/community-scripts/ProxmoxVE/pull/703))
+
+## 2024-12-05
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- PostgreSQL: Change authentication method from peer to md5 for UNIX sockets [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#650](https://github.com/community-scripts/ProxmoxVE/pull/650))
+- Fix stdout in unifi.sh [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#688](https://github.com/community-scripts/ProxmoxVE/pull/688))
+- Fix `rm` bug in Vikunja update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#692](https://github.com/community-scripts/ProxmoxVE/pull/692))
+
+## 2024-12-04
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Update Spelling 'Environment' in nginxproxymanager [@MathijsG](https://github.com/MathijsG) ([#676](https://github.com/community-scripts/ProxmoxVE/pull/676))
+
+### 🌐 Website
+
+- Update homepage.json documentation and website links [@patchmonkey](https://github.com/patchmonkey) ([#668](https://github.com/community-scripts/ProxmoxVE/pull/668))
+
+## 2024-12-03
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: Onedev [@quantumryuu](https://github.com/quantumryuu) ([#612](https://github.com/community-scripts/ProxmoxVE/pull/612))
+
+### 🚀 Updated Scripts
+
+- Script Update: SnipeIT [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#641](https://github.com/community-scripts/ProxmoxVE/pull/641))
+
+## 2024-12-02
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: Hoarder LXC [@vhsdream](https://github.com/vhsdream) ([#567](https://github.com/community-scripts/ProxmoxVE/pull/567))
+- New script: SnipeIT LXC [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#538](https://github.com/community-scripts/ProxmoxVE/pull/538))
+- New Script: Glance [@quantumryuu](https://github.com/quantumryuu) ([#595](https://github.com/community-scripts/ProxmoxVE/pull/595))
+- New script: Unbound LXC [@wimb0](https://github.com/wimb0) ([#547](https://github.com/community-scripts/ProxmoxVE/pull/547))
+- New script: Mylar3 LXC [@davalanche](https://github.com/davalanche) ([#554](https://github.com/community-scripts/ProxmoxVE/pull/554))
+
+### 🚀 Updated Scripts
+
+- Stirling-PDF: replace dependency for v0.35.0 and add check and fix in stirling-pdf.sh [@vhsdream](https://github.com/vhsdream) ([#614](https://github.com/community-scripts/ProxmoxVE/pull/614))
+- qbittorrent: do not override the configuration port in systemd [@zdraganov](https://github.com/zdraganov) ([#618](https://github.com/community-scripts/ProxmoxVE/pull/618))
+
+### 🌐 Website
+
+- chore: Update unbound logo to have only the actual logo [@BramSuurdje](https://github.com/BramSuurdje) ([#648](https://github.com/community-scripts/ProxmoxVE/pull/648))
+- fix: vaultwarden info mismatch [@BramSuurdje](https://github.com/BramSuurdje) ([#645](https://github.com/community-scripts/ProxmoxVE/pull/645))
+- Wallos json fix [@quantumryuu](https://github.com/quantumryuu) ([#630](https://github.com/community-scripts/ProxmoxVE/pull/630))
+
+## 2024-11-30
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Convert line endings in the-lounge.sh [@jamezpolley](https://github.com/jamezpolley) ([#599](https://github.com/community-scripts/ProxmoxVE/pull/599))
+
+### 🌐 Website
+
+- add some Information for Monitor-All Script [@MickLesk](https://github.com/MickLesk) ([#605](https://github.com/community-scripts/ProxmoxVE/pull/605))
+
+## 2024-11-29
+
+### Changed
+
+### ✨ New Scripts
+
+- New Script: The Lounge IRC [@quantumryuu](https://github.com/quantumryuu) ([#571](https://github.com/community-scripts/ProxmoxVE/pull/571))
+- New Script: LubeLogger [@quantumryuu](https://github.com/quantumryuu) ([#574](https://github.com/community-scripts/ProxmoxVE/pull/574))
+- New Script: Inspircd [@quantumryuu](https://github.com/quantumryuu) ([#576](https://github.com/community-scripts/ProxmoxVE/pull/576))
+
+### 🚀 Updated Scripts
+
+- Fix msg_error on zwave-js-ui [@MickLesk](https://github.com/MickLesk) ([#585](https://github.com/community-scripts/ProxmoxVE/pull/585))
+- Fix Kimai Apache2 Rights [@MickLesk](https://github.com/MickLesk) ([#577](https://github.com/community-scripts/ProxmoxVE/pull/577))
+
+## 2024-11-28
+
+### Changed
+
+### 💥 Breaking Changes
+
+- Fix Z-Wave JS UI script [@MickLesk](https://github.com/MickLesk) ([#546](https://github.com/community-scripts/ProxmoxVE/pull/546))
+ - [Migration guide](https://github.com/community-scripts/ProxmoxVE/discussions/635)
+
+### 🚀 Updated Scripts
+
+- Add vitest, add json validation tests, fix broken json files [@havardthom](https://github.com/havardthom) ([#566](https://github.com/community-scripts/ProxmoxVE/pull/566))
+- Add update script to Pocketbase [@dsiebel](https://github.com/dsiebel) ([#535](https://github.com/community-scripts/ProxmoxVE/pull/535))
+- Fix MongoDB install in Unifi script [@havardthom](https://github.com/havardthom) ([#564](https://github.com/community-scripts/ProxmoxVE/pull/564))
+- Remove changing DISK_REF for zfspool mikrotik-routeros.sh [@tjcomserv](https://github.com/tjcomserv) ([#529](https://github.com/community-scripts/ProxmoxVE/pull/529))
+
+### 🌐 Website
+
+- Show Changelog on Mobile Devices [@MickLesk](https://github.com/MickLesk) ([#558](https://github.com/community-scripts/ProxmoxVE/pull/558))
+
+## 2024-11-27
+
+### Changed
+
+### 💥 Breaking Changes
+
+- Zabbix: Use Agent2 as Default | Update Script added | some other Improvements [@MickLesk](https://github.com/MickLesk) ([#527](https://github.com/community-scripts/ProxmoxVE/pull/527))
+
+### 🚀 Updated Scripts
+
+- Fix: install mosquitto from mosquitto repo [@dsiebel](https://github.com/dsiebel) ([#534](https://github.com/community-scripts/ProxmoxVE/pull/534))
+- Patch Netbird Script | Container Boot-Check | Debian/Ubuntu Only [@MickLesk](https://github.com/MickLesk) ([#528](https://github.com/community-scripts/ProxmoxVE/pull/528))
+- Install MongoDB 4.2 for non-AVX CPUs in Unifi LXC [@ColinOppenheim](https://github.com/ColinOppenheim) ([#319](https://github.com/community-scripts/ProxmoxVE/pull/319))
+
+### 🌐 Website
+
+- Fix json error in zabbix.json [@havardthom](https://github.com/havardthom) ([#543](https://github.com/community-scripts/ProxmoxVE/pull/543))
+- Fix another json error in add-netbird-lxc.json [@havardthom](https://github.com/havardthom) ([#545](https://github.com/community-scripts/ProxmoxVE/pull/545))
+
+## 2024-11-26
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix Vikunja install script to prevent database deletion upon updating [@vhsdream](https://github.com/vhsdream) ([#524](https://github.com/community-scripts/ProxmoxVE/pull/524))
+
+## 2024-11-25
+
+### Changed
+
+### 💥 Breaking Changes
+
+- Remove Scrypted script [@MickLesk](https://github.com/MickLesk) ([#511](https://github.com/community-scripts/ProxmoxVE/pull/511))
+ - Because of request from Scrypted maintainer: [#494](https://github.com/community-scripts/ProxmoxVE/issues/494)
+ - Official Scrypted script can be used instead: https://docs.scrypted.app/installation.html#proxmox-ve
+
+### 🚀 Updated Scripts
+
+- Fix bugs in Calibre-Web update [@havardthom](https://github.com/havardthom) ([#517](https://github.com/community-scripts/ProxmoxVE/pull/517))
+- Fix upload folder in listmonk LXC [@bvdberg01](https://github.com/bvdberg01) ([#515](https://github.com/community-scripts/ProxmoxVE/pull/515))
+
+### 🌐 Website
+
+- Fix website url in Zoraxy documentation [@miggi92](https://github.com/miggi92) ([#506](https://github.com/community-scripts/ProxmoxVE/pull/506))
+
+## 2024-11-24
+
+### Changed
+
+### ✨ New Scripts
+
+- New script: listmonk LXC [@bvdberg01](https://github.com/bvdberg01) ([#442](https://github.com/community-scripts/ProxmoxVE/pull/442))
+
+### 🧰 Maintenance
+
+- Add release title to github-release.yml [@havardthom](https://github.com/havardthom) ([#481](https://github.com/community-scripts/ProxmoxVE/pull/481))
+
+## 2024-11-23
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix Actual Budget install missing build tools [@cour64](https://github.com/cour64) ([#455](https://github.com/community-scripts/ProxmoxVE/pull/455))
+- Fix Vikunja Update [@MickLesk](https://github.com/MickLesk) ([#440](https://github.com/community-scripts/ProxmoxVE/pull/440))
+- Patch PostInstall-Script to PVE 8.3 | Add PVE 8.3 in Security [@MickLesk](https://github.com/MickLesk) ([#431](https://github.com/community-scripts/ProxmoxVE/pull/431))
+
+### 🌐 Website
+
+- Frontend: fix reported issue with json-editor page and add OS select in installmethod [@BramSuurdje](https://github.com/BramSuurdje) ([#426](https://github.com/community-scripts/ProxmoxVE/pull/426))
+- Fixed Typo [@BenBakDev](https://github.com/BenBakDev) ([#441](https://github.com/community-scripts/ProxmoxVE/pull/441))
+
+### 🧰 Maintenance
+
+- Fix newline issue in changelog pr [@havardthom](https://github.com/havardthom) ([#474](https://github.com/community-scripts/ProxmoxVE/pull/474))
+- Remove newline in changelog-pr action [@havardthom](https://github.com/havardthom) ([#461](https://github.com/community-scripts/ProxmoxVE/pull/461))
+- Add action that creates github release based on CHANGELOG.md [@havardthom](https://github.com/havardthom) ([#462](https://github.com/community-scripts/ProxmoxVE/pull/462))
+
+## 2024-11-21
+
+### Changed
+
+### ✨ New Scripts
+
+- Add new LXC: NextPVR [@MickLesk](https://github.com/MickLesk) ([#391](https://github.com/community-scripts/ProxmoxVE/pull/391))
+- Add new LXC: Kimai [@MickLesk](https://github.com/MickLesk) ([#397](https://github.com/community-scripts/ProxmoxVE/pull/397))
+
+### 🚀 Updated Scripts
+
+- Add .env file support for HomeBox [@404invalid-user](https://github.com/404invalid-user) ([#383](https://github.com/community-scripts/ProxmoxVE/pull/383))
+- RDTClient Remove .NET 8.0 | Add .NET 9.0 [@MickLesk](https://github.com/MickLesk) ([#413](https://github.com/community-scripts/ProxmoxVE/pull/413))
+- Remove old resource message from vaultwarden [@havardthom](https://github.com/havardthom) ([#402](https://github.com/community-scripts/ProxmoxVE/pull/402))
+
+### 🌐 Website
+
+- Add PostInstall Documentation to zigbee2mqtt.json [@MickLesk](https://github.com/MickLesk) ([#411](https://github.com/community-scripts/ProxmoxVE/pull/411))
+- Fix incorrect hdd values in json files [@havardthom](https://github.com/havardthom) ([#403](https://github.com/community-scripts/ProxmoxVE/pull/403))
+- Website: Add discord link to navbar [@BramSuurdje](https://github.com/BramSuurdje) ([#405](https://github.com/community-scripts/ProxmoxVE/pull/405))
+
+### 🧰 Maintenance
+
+- Use github app in changelog-pr.yml and add auto approval [@havardthom](https://github.com/havardthom) ([#416](https://github.com/community-scripts/ProxmoxVE/pull/416))
+
+## 2024-11-20
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- LinkWarden: Moved PATH into service [@newzealandpaul](https://github.com/newzealandpaul) ([#376](https://github.com/community-scripts/ProxmoxVE/pull/376))
+
+### 🌐 Website
+
+- Replace dash "-" with "/" in metadata [@newzealandpaul](https://github.com/newzealandpaul) ([#374](https://github.com/community-scripts/ProxmoxVE/pull/374))
+- Proxmox VE Cron LXC Updater: Add tteck's notes. [@newzealandpaul](https://github.com/newzealandpaul) ([#378](https://github.com/community-scripts/ProxmoxVE/pull/378))
+
+## 2024-11-19
+
+### Changed
+
+### 🚀 Updated Scripts
+
+- Fix Wallos Update [@MickLesk](https://github.com/MickLesk) ([#339](https://github.com/community-scripts/ProxmoxVE/pull/339))
+- Linkwarden: Move Secret Key above in install.sh [@MickLesk](https://github.com/MickLesk) ([#356](https://github.com/community-scripts/ProxmoxVE/pull/356))
+- Linkwarden: add gnupg to installed dependencies [@erfansamandarian](https://github.com/erfansamandarian) ([#349](https://github.com/community-scripts/ProxmoxVE/pull/349))
+
+### 🌐 Website
+
+- Add *Arr Suite category for Website [@MickLesk](https://github.com/MickLesk) ([#370](https://github.com/community-scripts/ProxmoxVE/pull/370))
+- Refactor Buttons component to use a ButtonLink for cleaner code, simplifying the source URL generation and layout [@BramSuurdje](https://github.com/BramSuurdje) ([#371](https://github.com/community-scripts/ProxmoxVE/pull/371))
+
+### 🧰 Maintenance
+
+- [github]: add new Frontend_Report / Issue_Report & optimize config.yml [@MickLesk](https://github.com/MickLesk) ([#226](https://github.com/community-scripts/ProxmoxVE/pull/226))
+- [chore] Update FUNDING.yml [@MickLesk](https://github.com/MickLesk) ([#352](https://github.com/community-scripts/ProxmoxVE/pull/352))
+
+## 2024-11-18
+
+### Changed
+
+### 💥 Breaking Changes
+
+- Massive Update - Remove old storage check, add new storage and resource check to all scripts - Remove downscaling with pct set [@MickLesk](https://github.com/MickLesk) ([#333](https://github.com/community-scripts/ProxmoxVE/pull/333))
+
+### ✨ New Scripts
+
+- new scripts for NetBox [@bvdberg01](https://github.com/bvdberg01) ([#308](https://github.com/community-scripts/ProxmoxVE/pull/308))
+
+### 🚀 Updated Scripts
+
+- Support SSE 4.2 in Frigate script [@anishp55](https://github.com/anishp55) ([#328](https://github.com/community-scripts/ProxmoxVE/pull/328))
+- Bugfix: Wallos Patch (Cron Log & Media Backup) [@MickLesk](https://github.com/MickLesk) ([#331](https://github.com/community-scripts/ProxmoxVE/pull/331))
+- Linkwarden - Harmonize Script, Add Monolith & Bugfixing [@MickLesk](https://github.com/MickLesk) ([#306](https://github.com/community-scripts/ProxmoxVE/pull/306))
+- Fix optional installs in Cockpit LXC [@havardthom](https://github.com/havardthom) ([#317](https://github.com/community-scripts/ProxmoxVE/pull/317))
+
+### 🌐 Website
+
+- Added additional instructions to nginxproxymanager [@newzealandpaul](https://github.com/newzealandpaul) ([#329](https://github.com/community-scripts/ProxmoxVE/pull/329))
+
+### 🧰 Maintenance
+
+- Verify changes before commit in changelog-pr.yml [@havardthom](https://github.com/havardthom) ([#310](https://github.com/community-scripts/ProxmoxVE/pull/310))
+
+## 2024-11-17
+
+### Changed
+
+### ✨ New Scripts
+
+- Add Komga LXC [@DysfunctionalProgramming](https://github.com/DysfunctionalProgramming) ([#275](https://github.com/community-scripts/ProxmoxVE/pull/275))
+
+### 🚀 Updated Scripts
+
+- Tweak: Patch Prometheus for v.3.0.0 [@MickLesk](https://github.com/MickLesk) ([#300](https://github.com/community-scripts/ProxmoxVE/pull/300))
+- Wavelog - Small Adjustment [@HB9HIL](https://github.com/HB9HIL) ([#292](https://github.com/community-scripts/ProxmoxVE/pull/292))
+
+### 🌐 Website
+
+- Add Note for Komga Installation (Website) [@MickLesk](https://github.com/MickLesk) ([#303](https://github.com/community-scripts/ProxmoxVE/pull/303))
+- Fix Komga logo [@havardthom](https://github.com/havardthom) ([#298](https://github.com/community-scripts/ProxmoxVE/pull/298))
+
+### 🧰 Maintenance
+
+- Add github workflow for automatic changelog PR [@havardthom](https://github.com/havardthom) ([#299](https://github.com/community-scripts/ProxmoxVE/pull/299))
+- Use website label in autolabeler [@havardthom](https://github.com/havardthom) ([#297](https://github.com/community-scripts/ProxmoxVE/pull/297))
+
+## 2024-11-16
+
+### Changed
+
+- **Recyclarr LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/recyclarr-install.sh)
+ - NEW Script
+- **Wavelog LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/wavelog-install.sh)
+ - NEW Script
+- **Vaultwarden LXC:** RAM has now been increased to 6144 MB [(PR)](https://github.com/community-scripts/ProxmoxVE/pull/285)
+ - Breaking Change
+
+
+## 2024-11-05
+
+### Changed
+
+- **Bookstack LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/bookstack-install.sh)
+ - NEW Script
+- **Vikunja LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/vikunja-install.sh)
+ - NEW Script
+
+## 2024-11-04
+
+### Breaking Change
+- **Automatic Update of Repository:** The update function now uses the new repository `community-scripts/ProxmoxVE` for Debian/Ubuntu LXC containers.
+
+ ```bash
+ bash -c "$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/misc/update-repo.sh)"
+
+## 2024-10-31
+
+### Changed
+
+- **NZBGet LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/nzbget-install.sh)
+ - NEW Script
+- **Memos LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/memos-install.sh)
+ - NEW Script
+
## 2024-10-27
### Changed
-- **Open WebUI LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/8a21f6e7f025a911865395d4c0fa9a001bd0d512)
+- **Open WebUI LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/8a21f6e7f025a911865395d4c0fa9a001bd0d512)
- Refactor Script to add an option to install Ollama.
## 2024-10-26
### Changed
-- **AdventureLog LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/adventurelog-install.sh)
+- **AdventureLog LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adventurelog-install.sh)
- NEW Script
## 2024-10-25
### Changed
-- **Zoraxy LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/468a5d367ded4cf453a1507452e112ac3e234e2a)
+- **Zoraxy LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/468a5d367ded4cf453a1507452e112ac3e234e2a)
- Switch built from source to a pre-compiled binary version.
- Breaking Change
@@ -39,41 +847,41 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
-- **Wallos LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/wallos-install.sh)
+- **Wallos LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/wallos-install.sh)
- NEW Script
-- **Open WebUI LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/openwebui-install.sh)
+- **Open WebUI LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/openwebui-install.sh)
- NEW Script
## 2024-10-19
### Changed
-- **Cockpit LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/cockpit-install.sh)
+- **Cockpit LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/cockpit-install.sh)
- NEW Script
-- **Neo4j LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/neo4j-install.sh)
+- **Neo4j LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/neo4j-install.sh)
- NEW Script
## 2024-10-18
### Changed
-- **ArchiveBox LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/archivebox-install.sh)
+- **ArchiveBox LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/archivebox-install.sh)
- NEW Script
## 2024-10-15
### Changed
-- **evcc LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/evcc-install.sh)
+- **evcc LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/evcc-install.sh)
- NEW Script
## 2024-10-10
### Changed
-- **MySQL LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/mysql-install.sh)
+- **MySQL LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/mysql-install.sh)
- NEW Script
-- **Tianji LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/4c83a790ac9b040da1f11ad2cbe13d3fc5f480e9)
+- **Tianji LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/4c83a790ac9b040da1f11ad2cbe13d3fc5f480e9)
- Breaking Change
- Switch from `pm2` process management to `systemd`
@@ -81,7 +889,7 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
-- **Home Assistant Core LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/f2937febe69b2bad8b3a14eb84aa562a8f14cc6a) [(Commit)](https://github.com/tteck/Proxmox/commit/f2966ced7f457fd506f865f7f5b70ea12c4b0049)
+- **Home Assistant Core LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/f2937febe69b2bad8b3a14eb84aa562a8f14cc6a) [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/f2966ced7f457fd506f865f7f5b70ea12c4b0049)
- Refactor Code
- Breaking Change
- Home Assistant has transitioned to using `uv` for managing the virtual environment and installing additional modules.
@@ -90,23 +898,23 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
-- **HomeBox LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/homebox-install.sh)
+- **HomeBox LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/homebox-install.sh)
- NEW Script
-- **Zipline LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/zipline-install.sh)
+- **Zipline LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/zipline-install.sh)
- NEW Script
## 2024-09-13
### Changed
-- **Tianji LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/tianji-install.sh)
+- **Tianji LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/tianji-install.sh)
- NEW Script
## 2024-08-21
### Changed
-- **WireGuard LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/723365a79df7cc0fd29b1af8f7ef200a7e0921b1)
+- **WireGuard LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/723365a79df7cc0fd29b1af8f7ef200a7e0921b1)
- Refactor Code
- Breaking Change
@@ -114,7 +922,7 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
-- **CommaFeed LXC** [(Commit)](https://github.com/tteck/Proxmox/commit/0a33d1739ec3a49011411929bd46a260e92e99f9)
+- **CommaFeed LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/0a33d1739ec3a49011411929bd46a260e92e99f9)
- Refactor Code
- Breaking Change
@@ -122,30 +930,30 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
-- **lldap LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/lldap-install.sh)
+- **lldap LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/lldap-install.sh)
- NEW Script
## 2024-07-26
### Changed
-- **Gitea LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/gitea-install.sh)
+- **Gitea LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/gitea-install.sh)
- NEW Script
## 2024-06-30
### Changed
-- **All Scripts** [(Commit)](https://github.com/tteck/Proxmox/commit/39ea1d4a20b83c07d084ebafdc811eec3548f289)
+- **All Scripts** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/39ea1d4a20b83c07d084ebafdc811eec3548f289)
- Requires Proxmox Virtual Environment version 8.1 or later.
## 2024-06-27
### Changed
-- **Kubo LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/kubo-install.sh)
+- **Kubo LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/kubo-install.sh)
- NEW Script
-- **RabbitMQ LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/rabbitmq-install.sh)
+- **RabbitMQ LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/rabbitmq-install.sh)
- NEW Script
- **Scrutiny LXC**
- Removed from website, broken.
@@ -161,27 +969,27 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
-- **MySpeed LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/myspeed-install.sh)
+- **MySpeed LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/myspeed-install.sh)
- NEW Script
## 2024-06-13
### Changed
-- **PeaNUT LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/peanut-install.sh)
+- **PeaNUT LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/peanut-install.sh)
- NEW Script
- **Website**
- If the Changelog has changed recently, the link on the website will pulse.
-- **Spoolman LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/spoolman-install.sh)
+- **Spoolman LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/spoolman-install.sh)
- NEW Script
## 2024-06-12
### Changed
-- **MeTube LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/metube-install.sh)
+- **MeTube LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/metube-install.sh)
- NEW Script
-- **Matterbridge LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/matterbridge-install.sh)
+- **Matterbridge LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/matterbridge-install.sh)
- NEW Script
- **Website**
- Reopen the gh-pages site (https://tteck.github.io/Proxmox/)
@@ -190,14 +998,14 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
-- **Zabbix LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/zabbix-install.sh)
+- **Zabbix LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/zabbix-install.sh)
- NEW Script
## 2024-06-06
### Changed
-- **Petio LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/petio-install.sh)
+- **Petio LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/petio-install.sh)
- NEW Script
- **Website**
- Important notices will now be displayed on the landing page.
@@ -206,14 +1014,14 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
-- **FlareSolverr LXC** [(View Source)](https://github.com/tteck/Proxmox/blob/main/install/flaresolverr-install.sh)
+- **FlareSolverr LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/flaresolverr-install.sh)
- NEW Script
## 2024-05-31
### Changed
-- **Advanced Settings** [(Commit)](https://github.com/tteck/Proxmox/commit/fc9dff220b4ea426d3a75178ad8accacae4683ca)
+- **Advanced Settings** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/fc9dff220b4ea426d3a75178ad8accacae4683ca)
- Passwords are now masked
## 2024-05-30
@@ -1041,7 +1849,7 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
- **Proxmox VE Monitor-All**
- - Skip instances based on onboot and templates. [8c2a3cc](https://github.com/tteck/Proxmox/commit/8c2a3cc4d774fa13d17f695d6bdf9a4deedb1372).
+ - Skip instances based on onboot and templates. [8c2a3cc](https://github.com/community-scripts/ProxmoxVE/commit/8c2a3cc4d774fa13d17f695d6bdf9a4deedb1372).
## 2023-06-12
@@ -1177,7 +1985,7 @@ All LXC instances created using this repository come pre-installed with Midnight
- **InfluxDB LXC**
- Choosing InfluxDB v1 will result in Chronograf being installed automatically.
-- **[User Submitted Guides](https://github.com/tteck/Proxmox/blob/main/USER_SUBMITTED_GUIDES.md)**
+- **[User Submitted Guides](https://github.com/community-scripts/ProxmoxVE/blob/main/USER_SUBMITTED_GUIDES.md)**
- Informative guides that demonstrate how to install various software packages using Proxmox VE Helper Scripts.
## 2023-04-14
@@ -1571,7 +2379,7 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
- **Proxmox LXC Updater**
- - Now updates Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, ArchLinux [(@Uruknara)](https://github.com/tteck/Proxmox/commits?author=Uruknara)
+ - Now updates Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, ArchLinux [(@Uruknara)](https://github.com/community-scripts/ProxmoxVE/commits?author=Uruknara)
## 2022-11-13
@@ -2274,28 +3082,28 @@ All LXC instances created using this repository come pre-installed with Midnight
### Changed
- **Node-Red LXC**
- - Add Install [Themes Script](https://raw.githubusercontent.com/tteck/Proxmox/main/misc/images/node-red-themes.png)
+ - Add Install Themes Script
## 2022-02-16
### Changed
- **Home Assistant Container LXC**
- - Add Options to [Update Menu](https://raw.githubusercontent.com/tteck/Proxmox/main/misc/images/update-menu.png)
+ - Add Options to Update Menu
## 2022-02-14
### Changed
- **Home Assistant Container LXC**
- - Add [Update Menu](https://raw.githubusercontent.com/tteck/Proxmox/main/misc/images/update-menu.png)
+ - Add Update Menu
## 2022-02-13
### Changed
- **Mariadb LXC**
- - Add [Adminer](https://raw.githubusercontent.com/tteck/Proxmox/main/misc/images/adminer.png) (formerly phpMinAdmin), a full-featured database management tool
+ - Add Adminer (formerly phpMinAdmin), a full-featured database management tool
## 2022-02-12
@@ -2387,7 +3195,7 @@ All LXC instances created using this repository come pre-installed with Midnight
- `va-driver-all` is preinstalled
- now using Ubuntu 21.10
- **misc**
- - new GUI script [(Screenshot)](https://raw.githubusercontent.com/tteck/Proxmox/main/misc/images/pms-copy-data.png) to copy data from one Plex Media Server LXC to another Plex Media Server LXC
+ - new GUI script to copy data from one Plex Media Server LXC to another Plex Media Server LXC
## Initial Catch up - 2022-01-23
diff --git a/CODE-AUDIT.md b/CODE-AUDIT.md
index 46db7c9c7..158a5c6ce 100644
--- a/CODE-AUDIT.md
+++ b/CODE-AUDIT.md
@@ -1,14 +1,14 @@
-
+
Exploring the Scripts and Steps Involved in an Application LXC Installation
-1) [adguard.sh](https://github.com/tteck/Proxmox/blob/main/ct/adguard.sh): This script collects system parameters. (Also holds the function to update the application.)
-2) [build.func](https://github.com/tteck/Proxmox/blob/main/misc/build.func): Adds user settings and integrates collected information.
-3) [create_lxc.sh](https://github.com/tteck/Proxmox/blob/main/ct/create_lxc.sh): Constructs the LXC container.
-4) [adguard-install.sh](https://github.com/tteck/Proxmox/blob/main/install/adguard-install.sh): Executes functions from [install.func](https://github.com/tteck/Proxmox/blob/main/misc/install.func), and installs the application.
-5) [adguard.sh](https://github.com/tteck/Proxmox/blob/main/ct/adguard.sh) (again): To display the completion message.
+1) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh): This script collects system parameters. (Also holds the function to update the application.)
+2) [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func): Adds user settings and integrates collected information.
+3) [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/create_lxc.sh): Constructs the LXC container.
+4) [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh): Executes functions from [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), and installs the application.
+5) [adguard.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/adguard.sh) (again): To display the completion message.
-The installation process uses reusable scripts: [build.func](https://github.com/tteck/Proxmox/blob/main/misc/build.func), [create_lxc.sh](https://github.com/tteck/Proxmox/blob/main/ct/create_lxc.sh), and [install.func](https://github.com/tteck/Proxmox/blob/main/misc/install.func), which are not specific to any particular application.
+The installation process uses reusable scripts: [build.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/build.func), [create_lxc.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/ct/create_lxc.sh), and [install.func](https://github.com/community-scripts/ProxmoxVE/blob/main/misc/install.func), which are not specific to any particular application.
-To gain a better understanding, focus on reviewing [adguard-install.sh](https://github.com/tteck/Proxmox/blob/main/install/adguard-install.sh). This script contains the commands and configurations for installing and configuring AdGuard Home within the LXC container.
+To gain a better understanding, focus on reviewing [adguard-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/install/adguard-install.sh). This script contains the commands and configurations for installing and configuring AdGuard Home within the LXC container.
diff --git a/LICENSE b/LICENSE
index 86316b3f8..7961c9517 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2021-2024 tteck
+Copyright (c) 2021-2025 asylumexp
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 4b1d1b52f..66a72bfd7 100644
--- a/README.md
+++ b/README.md
@@ -33,4 +33,4 @@ If you would like to offer support, I would appreciate a star on the repository,
## Compatibility Guide
-[View Compatibility Guide here](https://pimox-scripts.com)
\ No newline at end of file
+[View Compatibility Guide here](https://pimox-scripts.com)
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..c8530d506
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,23 @@
+## Supported Versions
+This project currently supports the following versions of Proxmox VE:
+
+| Version | Supported |
+| ------- | ------------------ |
+| 8.3.x | :white_check_mark: |
+| 8.2.x | :white_check_mark: |
+| 8.1.x | :white_check_mark: |
+| 8.0.x | Limited support* ❕|
+| < 8.0 | :x: |
+
+*Version 8.0.x has limited support. Security updates may not be provided for all issues in this version.
+
+## Reporting a Vulnerability
+
+Security vulnerabilities shouldn’t be reported publicly to prevent potential exploitation. Instead, please report any vulnerabilities privately by reaching out directly to us. You can either join our [Discord server](https://discord.gg/UHrpNWGwkH) and send a direct message to a maintainer or contact us via email at contact@community-scripts.org. Be sure to include a detailed description of the vulnerability and the steps to reproduce it. Thank you for helping us keep our project secure!
+
+Once a vulnerability has been reported, the project maintainers will review it and acknowledge the report within 7 business days. We will then work to address the vulnerability and provide a fix as soon as possible. Depending on the severity of the issue, a patch may be released immediately or included in the next scheduled update.
+
+Please note that not all reported vulnerabilities may be accepted. The project maintainers reserve the right to decline a vulnerability report if it is deemed to be a low-risk issue or if it conflicts with the project's design or architecture. In such cases, we will provide an explanation for the decision.
+
+If you have any questions or concerns about this security policy, please don't hesitate to contact the project maintainers.
+
diff --git a/USER_SUBMITTED_GUIDES.md b/USER_SUBMITTED_GUIDES.md
index a1a3aae9e..795993950 100644
--- a/USER_SUBMITTED_GUIDES.md
+++ b/USER_SUBMITTED_GUIDES.md
@@ -1,6 +1,6 @@
User Submitted Guides
diff --git a/ct/2fauth.sh b/ct/2fauth.sh
new file mode 100644
index 000000000..58181a1f4
--- /dev/null
+++ b/ct/2fauth.sh
@@ -0,0 +1,90 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: jkrgr0
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://docs.2fauth.app/
+
+# App Default Values
+APP="2FAuth"
+TAGS="2fa;authenticator"
+var_cpu="1"
+var_ram="512"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ # Check if installation is present | -f for file, -d for folder
+ if [[ ! -d "/opt/2fauth" ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ # Crawling the new version and checking whether an update is required
+ RELEASE=$(curl -s https://api.github.com/repos/Bubka/2FAuth/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ "${RELEASE}" != "$(cat /opt/2fauth_version.txt)" ]] || [[ ! -f /opt/2fauth_version.txt ]]; then
+ msg_info "Updating $APP to ${RELEASE}"
+
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+
+ # Creating Backup
+ msg_info "Creating Backup"
+ mv "/opt/2fauth" "/opt/2fauth-backup"
+ msg_ok "Backup Created"
+
+ # Execute Update
+ wget -q "https://github.com/Bubka/2FAuth/archive/refs/tags/${RELEASE}.zip"
+ unzip -q "${RELEASE}.zip"
+ mv "2FAuth-${RELEASE//v}/" "/opt/2fauth"
+ mv "/opt/2fauth-backup/.env" "/opt/2fauth/.env"
+ mv "/opt/2fauth-backup/storage" "/opt/2fauth/storage"
+ cd "/opt/2fauth" || return
+
+ chown -R www-data: "/opt/2fauth"
+ chmod -R 755 "/opt/2fauth"
+
+ export COMPOSER_ALLOW_SUPERUSER=1
+ composer install --no-dev --prefer-source &>/dev/null
+
+ php artisan 2fauth:install
+
+ # Cleaning up
+ msg_info "Cleaning Up"
+ rm -rf "v${RELEASE}.zip"
+ $STD apt-get -y autoremove
+ $STD apt-get -y autoclean
+ msg_ok "Cleanup Completed"
+
+ # Last Action
+ echo "${RELEASE}" >/opt/2fauth_version.txt
+ msg_ok "Updated $APP to ${RELEASE}"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:80${CL}"
\ No newline at end of file
diff --git a/ct/5etools.sh b/ct/5etools.sh
new file mode 100644
index 000000000..4f7597c65
--- /dev/null
+++ b/ct/5etools.sh
@@ -0,0 +1,113 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: TheRealVira
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://5e.tools/
+
+# App Default Values
+APP="5etools"
+var_tags="wiki"
+var_cpu="1"
+var_ram="512"
+var_disk="13"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ # Check if installation is present | -f for file, -d for folder
+ if [[ ! -d "/opt/${APP}" ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ RELEASE=$(curl -s https://api.github.com/repos/5etools-mirror-3/5etools-src/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f "/opt/${APP}_version.txt" ]]; then
+ # Crawling the new version and checking whether an update is required
+ msg_info "Updating System"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated System"
+
+ # Execute Update
+ msg_info "Updating base 5etools"
+ cd /opt
+ wget -q "https://github.com/5etools-mirror-3/5etools-src/archive/refs/tags/${RELEASE}.zip"
+ unzip -q "${RELEASE}.zip"
+ mv "/opt/${APP}/img" "/opt/img-backup"
+ rm -rf "/opt/${APP}"
+ mv "${APP}-src-${RELEASE:1}" "/opt/${APP}"
+ mv "/opt/img-backup" "/opt/${APP}/img"
+ cd /opt/5etools
+ $STD npm install
+ $STD npm run build
+ cd ~
+ echo "${RELEASE}" >"/opt/${APP}_version.txt"
+ chown -R www-data: "/opt/${APP}"
+ chmod -R 755 "/opt/${APP}"
+ msg_ok "Updated base 5etools"
+ # Cleaning up
+ msg_info "Cleaning Up"
+ rm -rf /opt/${RELEASE}.zip
+ $STD apt-get -y autoremove
+ $STD apt-get -y autoclean
+ msg_ok "Cleanup Completed"
+ else
+ msg_ok "No update required. Base ${APP} is already at ${RELEASE}"
+ fi
+
+ IMG_RELEASE=$(curl -s https://api.github.com/repos/5etools-mirror-2/5etools-img/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ "${IMG_RELEASE}" != "$(cat /opt/${APP}_IMG_version.txt)" ]] || [[ ! -f "/opt/${APP}_IMG_version.txt" ]]; then
+ # Crawling the new version and checking whether an update is required
+ msg_info "Updating System"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated System"
+
+ # Execute Update
+ msg_info "Updating 5etools images"
+ curl -sSL "https://github.com/5etools-mirror-2/5etools-img/archive/refs/tags/${IMG_RELEASE}.zip" > "${IMG_RELEASE}.zip"
+ unzip -q "${IMG_RELEASE}.zip"
+ rm -rf "/opt/${APP}/img"
+ mv "${APP}-img-${IMG_RELEASE:1}" "/opt/${APP}/img"
+ echo "${IMG_RELEASE}" >"/opt/${APP}_IMG_version.txt"
+ chown -R www-data: "/opt/${APP}"
+ chmod -R 755 "/opt/${APP}"
+
+ msg_ok "Updating 5etools images"
+
+ # Cleaning up
+ msg_info "Cleaning Up"
+ rm -rf /opt/${RELEASE}.zip
+ rm -rf ${IMG_RELEASE}.zip
+ $STD apt-get -y autoremove
+ $STD apt-get -y autoclean
+ msg_ok "Cleanup Completed"
+ else
+ msg_ok "No update required. ${APP} images are already at ${IMG_RELEASE}"
+ fi
+
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/actualbudget.sh b/ct/actualbudget.sh
index 25745fad4..a53695843 100644
--- a/ct/actualbudget.sh
+++ b/ct/actualbudget.sh
@@ -1,77 +1,52 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://actualbudget.org/
-function header_info {
-clear
-cat <<"EOF"
- ___ __ __ ____ __ __
- / | _____/ /___ ______ _/ / / __ )__ ______/ /___ ____ / /_
- / /| |/ ___/ __/ / / / __ `/ / / __ / / / / __ / __ `/ _ \/ __/
- / ___ / /__/ /_/ /_/ / /_/ / / / /_/ / /_/ / /_/ / /_/ / __/ /_
-/_/ |_\___/\__/\__,_/\__,_/_/ /_____/\__,_/\__,_/\__, /\___/\__/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Actual Budget"
-var_disk="4"
+var_tags="finance"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/actualbudget ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-systemctl stop actualbudget.service
-cd /opt/actualbudget
-git pull &>/dev/null
-yarn install &>/dev/null
-systemctl start actualbudget.service
-msg_ok "Successfully Updated ${APP}"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/actualbudget ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ systemctl stop actualbudget.service
+ cd /opt/actualbudget
+ git pull &>/dev/null
+ yarn install &>/dev/null
+ systemctl start actualbudget.service
+ msg_ok "Successfully Updated ${APP}"
+ exit
}
start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 1024
-pct set $CTID -cores 1
-msg_ok "Set Container to Normal Resources"
+
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5006${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5006${CL}"
\ No newline at end of file
diff --git a/ct/adguard.sh b/ct/adguard.sh
index 87a1a0ae7..59bb5233b 100644
--- a/ct/adguard.sh
+++ b/ct/adguard.sh
@@ -1,87 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://adguard.com/
-function header_info {
-clear
-cat <<"EOF"
- ___ __ __
- / | ____/ /___ ___ ______ __________/ /
- / /| |/ __ / __ / / / / __ / ___/ __ /
- / ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ /
-/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/
- /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Adguard"
-var_disk="2"
+var_tags="adblock"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/AdGuardHome ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-wget -qL https://static.adguard.com/adguardhome/release/AdGuardHome_linux_amd64.tar.gz
-msg_info "Stopping AdguardHome"
-systemctl stop AdGuardHome
-msg_ok "Stopped AdguardHome"
-
-msg_info "Updating AdguardHome"
-tar -xvf AdGuardHome_linux_amd64.tar.gz &>/dev/null
-mkdir -p adguard-backup
-cp -r /opt/AdGuardHome/AdGuardHome.yaml /opt/AdGuardHome/data adguard-backup/
-cp AdGuardHome/AdGuardHome /opt/AdGuardHome/AdGuardHome
-cp -r adguard-backup/* /opt/AdGuardHome/
-msg_ok "Updated AdguardHome"
-
-msg_info "Starting AdguardHome"
-systemctl start AdGuardHome
-msg_ok "Started AdguardHome"
-
-msg_info "Cleaning Up"
-rm -rf AdGuardHome_linux_amd64.tar.gz AdGuardHome adguard-backup
-msg_ok "Cleaned"
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/AdGuardHome ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "Adguard Home should be updated via the user interface."
+ exit
}
start
@@ -89,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
diff --git a/ct/adventurelog.sh b/ct/adventurelog.sh
index 3d7137e57..3bc9605e9 100644
--- a/ct/adventurelog.sh
+++ b/ct/adventurelog.sh
@@ -1,104 +1,77 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://adventurelog.app/
-function header_info {
-clear
-cat <<"EOF"
- ___ __ __ __
- / | ____/ / _____ ____ / /___ __________ / / ____ ____ _
- / /| |/ __ / | / / _ \/ __ \/ __/ / / / ___/ _ \/ / / __ \/ __ `/
- / ___ / /_/ /| |/ / __/ / / / /_/ /_/ / / / __/ /___/ /_/ / /_/ /
-/_/ |_\__,_/ |___/\___/_/ /_/\__/\__,_/_/ \___/_____/\____/\__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="AdventureLog"
+var_tags="traveling"
var_disk="7"
var_cpu="2"
var_ram="2048"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
function update_script() {
-header_info
-if [[ ! -d /opt/adventurelog ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-RELEASE=$(curl -s https://api.github.com/repos/seanmorley15/AdventureLog/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping Services"
- systemctl stop adventurelog-backend
- systemctl stop adventurelog-frontend
- msg_ok "Services Stopped"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/adventurelog ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/seanmorley15/AdventureLog/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Services"
+ systemctl stop adventurelog-backend
+ systemctl stop adventurelog-frontend
+ msg_ok "Services Stopped"
- msg_info "Updating ${APP} to ${RELEASE}"
- cp /opt/adventurelog/backend/server/.env /opt/server.env
- cp /opt/adventurelog/frontend/env /opt/frontend.env
- wget -q "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip"
- unzip -q v${RELEASE}.zip
- mv AdventureLog-${RELEASE} /opt/adventurelog
- mv /opt/server.env /opt/adventurelog/backend/server/.env
- cd /opt/adventurelog/backend/server
- pip install --upgrade pip &>/dev/null
- pip install -r requirements.txt &>/dev/null
- python3 manage.py collectstatic --noinput &>/dev/null
- python3 manage.py migrate &>/dev/null
-
- mv /opt/frontend.env /opt/adventurelog/frontend/.env
- cd /opt/adventurelog/frontend
- pnpm install &>/dev/null
- pnpm run build &>/dev/null
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cp /opt/adventurelog/backend/server/.env /opt/server.env
+ cp /opt/adventurelog/frontend/.env /opt/frontend.env
+ wget -q "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q v${RELEASE}.zip
+ mv AdventureLog-${RELEASE} /opt/adventurelog
+ mv /opt/server.env /opt/adventurelog/backend/server/.env
+ cd /opt/adventurelog/backend/server
+ pip install --upgrade pip &>/dev/null
+ pip install -r requirements.txt &>/dev/null
+ python3 manage.py collectstatic --noinput &>/dev/null
+ python3 manage.py migrate &>/dev/null
- msg_info "Starting Services"
- systemctl start adventurelog-backend
- systemctl start adventurelog-frontend
- msg_ok "Started Services"
+ mv /opt/frontend.env /opt/adventurelog/frontend/.env
+ cd /opt/adventurelog/frontend
+ pnpm install &>/dev/null
+ pnpm run build &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP}"
- msg_info "Cleaning Up"
- rm -rf v${RELEASE}.zip
- msg_ok "Cleaned"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Starting Services"
+ systemctl start adventurelog-backend
+ systemctl start adventurelog-frontend
+ msg_ok "Started Services"
+
+ msg_info "Cleaning Up"
+ rm -rf v${RELEASE}.zip
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -106,5 +79,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
\ No newline at end of file
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/agentdvr.sh b/ct/agentdvr.sh
index 9d0ead0f7..95b48125f 100644
--- a/ct/agentdvr.sh
+++ b/ct/agentdvr.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.ispyconnect.com/
-function header_info {
-clear
-cat <<"EOF"
- ___ __ ____ _ ______
- / | ____ ____ ____ / /_/ __ \ | / / __ \
- / /| |/ __ `/ _ \/ __ \/ __/ / / / | / / /_/ /
- / ___ / /_/ / __/ / / / /_/ /_/ /| |/ / _, _/
-/_/ |_\__, /\___/_/ /_/\__/_____/ |___/_/ |_|
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="AgentDVR"
-var_disk="8"
+var_tags="dvr"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="ubuntu"
var_version="22.04"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/agentdvr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/agentdvr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -64,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP}${CL} should be reachable by going to the following URL.
- ${BL}http://${IP}:8090${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8090${CL}"
\ No newline at end of file
diff --git a/ct/alpine-docker.sh b/ct/alpine-docker.sh
index 55142c7cf..790242a81 100644
--- a/ct/alpine-docker.sh
+++ b/ct/alpine-docker.sh
@@ -1,58 +1,28 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
-function header_info {
- clear
- cat <<"EOF"
- ____ __
- / __ \____ _____/ /_ __ _____
- / / / / __ \/ ___/ //_/ _ \/ ___/
- / /_/ / /_/ / /__/ ,< / __/ /
-/_____/\____/\___/_/|_|\___/_/
- Alpine
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Alpine-Docker"
-var_disk="2"
+var_tags="docker;alpine"
var_cpu="1"
var_ram="1024"
+var_disk="2"
var_os="alpine"
var_version="3.20"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt
diff --git a/ct/alpine-grafana.sh b/ct/alpine-grafana.sh
index 0b47b6183..f23656d78 100644
--- a/ct/alpine-grafana.sh
+++ b/ct/alpine-grafana.sh
@@ -1,58 +1,28 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
-function header_info {
- clear
- cat <<"EOF"
- ______ ____
- / ____/________ _/ __/___ _____ ____ _
- / / __/ ___/ __ / /_/ __ / __ \/ __ /
-/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
-\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/
- Alpine
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Alpine-Grafana"
-var_disk="1"
+var_tags="alpine;monitoring"
var_cpu="1"
var_ram="256"
+var_disk="1"
var_os="alpine"
-var_version="3.19"
+var_version="3.20"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt
diff --git a/ct/alpine-nextcloud.sh b/ct/alpine-nextcloud.sh
index f82469f90..229faf2be 100644
--- a/ct/alpine-nextcloud.sh
+++ b/ct/alpine-nextcloud.sh
@@ -1,57 +1,28 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
-function header_info {
- clear
- cat <<"EOF"
- _ __ __ __ __ __ __ __
- / | / /__ _ __/ /______/ /___ __ ______/ / / / / /_ __/ /_
- / |/ / _ \| |/_/ __/ ___/ / __ \/ / / / __ / / /_/ / / / / __ \
- / /| / __/> /_/ /__/ / /_/ / /_/ / /_/ / / __ / /_/ / /_/ /
-/_/ |_/\___/_/|_|\__/\___/_/\____/\__,_/\__,_/ /_/ /_/\__,_/_.___/
-Alpine
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Alpine-Nextcloud"
-var_disk="2"
+var_tags="alpine;cloud"
var_cpu="2"
var_ram="1024"
+var_disk="2"
var_os="alpine"
-var_version="3.19"
+var_version="3.20"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
if [[ ! -d /usr/share/webapps/nextcloud ]]; then
msg_error "No ${APP} Installation Found!"
diff --git a/ct/alpine-vaultwarden.sh b/ct/alpine-vaultwarden.sh
index d1a1e140b..9f0d20d43 100644
--- a/ct/alpine-vaultwarden.sh
+++ b/ct/alpine-vaultwarden.sh
@@ -1,58 +1,28 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
-function header_info {
- clear
- cat <<"EOF"
- _ __ ____ __
-| | / /___ ___ __/ / /__ ______ __________/ /__ ____
-| | / / __ `/ / / / / __/ | /| / / __ `/ ___/ __ / _ \/ __ \
-| |/ / /_/ / /_/ / / /_ | |/ |/ / /_/ / / / /_/ / __/ / / /
-|___/\__,_/\__,_/_/\__/ |__/|__/\__,_/_/ \__,_/\___/_/ /_/
- Alpine
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Alpine-Vaultwarden"
-var_disk="0.3"
+var_tags="alpine;vault"
var_cpu="1"
var_ram="256"
+var_disk="0.3"
var_os="alpine"
-var_version="3.19"
+var_version="3.20"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt
@@ -85,7 +55,7 @@ function update_script() {
sed -i "s|\"admin_token\": .*|\"admin_token\": \"${TOKEN}\",|" /var/lib/vaultwarden/config.json
fi
rc-service vaultwarden restart -q
- fi
+ fi
clear
exit
;;
diff --git a/ct/alpine-zigbee2mqtt.sh b/ct/alpine-zigbee2mqtt.sh
index 1faf4c1ee..f392a8933 100644
--- a/ct/alpine-zigbee2mqtt.sh
+++ b/ct/alpine-zigbee2mqtt.sh
@@ -1,58 +1,28 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
-function header_info {
- clear
- cat <<"EOF"
- _____ _ __ ___ __ _______ ____________
-/__ / (_)___ _/ /_ ___ ___ |__ \ / |/ / __ \/_ __/_ __/
- / / / / __ / __ \/ _ \/ _ \__/ // /|_/ / / / / / / / /
- / /__/ / /_/ / /_/ / __/ __/ __// / / / /_/ / / / / /
-/____/_/\__, /_.___/\___/\___/____/_/ /_/\___\_\/_/ /_/
- /____/ Alpine
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Alpine-Zigbee2MQTT"
+var_tags="alpine;zigbee;mqtt;smarthome"
var_disk="0.3"
var_cpu="1"
var_ram="256"
var_os="alpine"
-var_version="3.19"
+var_version="3.20"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt
diff --git a/ct/alpine.sh b/ct/alpine.sh
index f7557342e..493dce5a9 100644
--- a/ct/alpine.sh
+++ b/ct/alpine.sh
@@ -2,67 +2,37 @@
source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
# Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
-function header_info {
-clear
-cat <<"EOF"
- ___ __ _
- / | / /___ (_)___ ___
- / /| | / / __ \/ / __ \/ _ \
- / ___ |/ / /_/ / / / / / __/
-/_/ |_/_/ .___/_/_/ /_/\___/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Alpine"
-var_disk="0.1"
+var_tags="os;alpine"
var_cpu="1"
var_ram="512"
+var_disk="0.1"
var_os="alpine"
-var_version="3.19"
+var_version="3.20"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW="-password alpine"
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
- "1" "Check for Alpine Updates" ON \
- 3>&1 1>&2 2>&3)
+ UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
+ "1" "Check for Alpine Updates" ON \
+ 3>&1 1>&2 2>&3)
-header_info
-if [ "$UPD" == "1" ]; then
-apk update && apk upgrade
-exit;
-fi
+ header_info
+ if [ "$UPD" == "1" ]; then
+ apk update && apk upgrade
+ exit
+ fi
}
start
diff --git a/ct/apache-cassandra.sh b/ct/apache-cassandra.sh
index adf0d3e4b..1463c52ec 100644
--- a/ct/apache-cassandra.sh
+++ b/ct/apache-cassandra.sh
@@ -1,64 +1,40 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://cassandra.apache.org/_/index.html
-function header_info {
-clear
-cat <<"EOF"
- ___ __ ______ __
- / | ____ ____ ______/ /_ ___ / ____/___ _______________ _____ ____/ /________ _
- / /| | / __ \/ __ `/ ___/ __ \/ _ \ / / / __ `/ ___/ ___/ __ `/ __ \/ __ / ___/ __ `/
- / ___ |/ /_/ / /_/ / /__/ / / / __/ / /___/ /_/ (__ |__ ) /_/ / / / / /_/ / / / /_/ /
-/_/ |_/ .___/\__,_/\___/_/ /_/\___/ \____/\__,_/____/____/\__,_/_/ /_/\__,_/_/ \__,_/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Apache-Cassandra"
-var_disk="4"
+var_tags="database;NoSQL"
var_cpu="1"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
-VERBOSE="yes"
+var_unprivileged="1"
+
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/cassandra.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/cassandra.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -66,3 +42,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/apache-couchdb.sh b/ct/apache-couchdb.sh
index ca197b92c..3744d2c0d 100644
--- a/ct/apache-couchdb.sh
+++ b/ct/apache-couchdb.sh
@@ -1,64 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://couchdb.apache.org/
-function header_info {
-clear
-cat <<"EOF"
- ___ __ ______ __ ____ ____
- / | ____ ____ ______/ /_ ___ / ____/___ __ _______/ /_ / __ \/ __ )
- / /| | / __ \/ __ `/ ___/ __ \/ _ \ / / / __ \/ / / / ___/ __ \/ / / / __ |
- / ___ |/ /_/ / /_/ / /__/ / / / __/ / /___/ /_/ / /_/ / /__/ / / / /_/ / /_/ /
-/_/ |_/ .___/\__,_/\___/_/ /_/\___/ \____/\____/\__,_/\___/_/ /_/_____/_____/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Apache-CouchDB"
-var_disk="10"
+var_tags="database"
var_cpu="2"
var_ram="4096"
+var_disk="10"
var_os="debian"
var_version="12"
-VERBOSE="yes"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/couchdb.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/couchdb.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -66,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5984/_utils/${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5984/_utils/${CL}"
diff --git a/ct/apache-guacamole.sh b/ct/apache-guacamole.sh
new file mode 100644
index 000000000..be8057d79
--- /dev/null
+++ b/ct/apache-guacamole.sh
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/build.func)
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Michel Roegl-Brunner (michelroegl-brunner)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://guacamole.apache.org/
+
+#App Default Values
+APP="Apache-Guacamole"
+TAGS="webserver;remote"
+var_disk="4"
+var_cpu="1"
+var_ram="2048"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/apache-guacamole ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "Ther is currently no automatic update function for ${APP}."
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/guacamole${CL}"
+
diff --git a/ct/apt-cacher-ng.sh b/ct/apt-cacher-ng.sh
index 46c76bb7a..57c8edff2 100644
--- a/ct/apt-cacher-ng.sh
+++ b/ct/apt-cacher-ng.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://wiki.debian.org/AptCacherNg
-function header_info {
-clear
-cat <<"EOF"
- ___ __ ______ __ _ ________
- / | ____ / /_ / ____/___ ______/ /_ ___ _____ / | / / ____/
- / /| | / __ \/ __/__/ / / __ `/ ___/ __ \/ _ \/ ___/__/ |/ / / __
- / ___ |/ /_/ / /_/__/ /___/ /_/ / /__/ / / / __/ / /__/ /| / /_/ /
-/_/ |_/ .___/\__/ \____/\__,_/\___/_/ /_/\___/_/ /_/ |_/\____/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Apt-Cacher-NG"
-var_disk="2"
+var_tags="caching"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} maintenance page should be reachable by going to the following URL.
- ${BL}http://${IP}:3142/acng-report.html${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3142/acng-report.html{CL}"
diff --git a/ct/archivebox.sh b/ct/archivebox.sh
index cc9542bf6..3d599b39d 100644
--- a/ct/archivebox.sh
+++ b/ct/archivebox.sh
@@ -1,80 +1,53 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://archivebox.io/
-function header_info {
-clear
-cat <<"EOF"
- ___ __ _ ____
- / | __________/ /_ (_) _____ / __ )____ _ __
- / /| | / ___/ ___/ __ \/ / | / / _ \/ __ / __ \| |/_/
- / ___ |/ / / /__/ / / / /| |/ / __/ /_/ / /_/ /> <
-/_/ |_/_/ \___/_/ /_/_/ |___/\___/_____/\____/_/|_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="ArchiveBox"
-var_disk="8"
+var_tags="archive;bookmark"
var_cpu="2"
var_ram="1024"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/archivebox ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-msg_info "Stopping ${APP}"
-systemctl stop archivebox
-msg_ok "Stopped ${APP}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/archivebox ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop archivebox
+ msg_ok "Stopped ${APP}"
-msg_info "Updating ${APP}"
-cd /opt/archivebox/data
-pip install --upgrade --ignore-installed archivebox
-sudo -u archivebox archivebox init
-msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP}"
+ cd /opt/archivebox/data
+ pip install --upgrade --ignore-installed archivebox
+ sudo -u archivebox archivebox init
+ msg_ok "Updated ${APP}"
-msg_info "Starting ${APP}"
-systemctl start archivebox
-msg_ok "Started ${APP}"
+ msg_info "Starting ${APP}"
+ systemctl start archivebox
+ msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -82,5 +55,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8000/admin/login${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000/admin/login${CL}"
diff --git a/ct/aria2.sh b/ct/aria2.sh
index 35a968c38..78baadb03 100644
--- a/ct/aria2.sh
+++ b/ct/aria2.sh
@@ -1,64 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://aria2.github.io/
-function header_info {
-clear
-cat <<"EOF"
- ___ _ ___
- / | _____(_)___ |__ \
- / /| | / ___/ / __ `/_/ /
- / ___ |/ / / / /_/ / __/
-/_/ |_/_/ /_/\__,_/____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Aria2"
-var_disk="8"
+var_tags="download-utility"
var_cpu="2"
-var_ram="1028"
+var_ram="1024"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -66,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:6880${CL}"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6880${CL}"
diff --git a/ct/audiobookshelf.sh b/ct/audiobookshelf.sh
index f362184a9..efd7c2589 100644
--- a/ct/audiobookshelf.sh
+++ b/ct/audiobookshelf.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.audiobookshelf.org/
-function header_info {
-clear
-cat <<"EOF"
- ___ __ __ __ ______
- ____ ___ ______/ (_)___ / /_ ____ ____ / /_______/ /_ ___ / / __/
- / __ `/ / / / __ / / __ \/ __ \/ __ \/ __ \/ //_/ ___/ __ \/ _ \/ / /_
-/ /_/ / /_/ / /_/ / / /_/ / /_/ / /_/ / /_/ / ,< (__ ) / / / __/ / __/
-\__,_/\__,_/\__,_/_/\____/_.___/\____/\____/_/|_/____/_/ /_/\___/_/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="audiobookshelf"
-var_disk="4"
+var_tags="podcast;audiobook"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/trusted.gpg.d/audiobookshelf-ppa.asc ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-echo "This application receives updates through the APT package manager."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/trusted.gpg.d/audiobookshelf-ppa.asc ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ echo "This application receives updates through the APT package manager."
+ exit
}
start
@@ -64,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:13378${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:13378${CL}"
diff --git a/ct/authentik.sh b/ct/authentik.sh
new file mode 100644
index 000000000..4bfccd791
--- /dev/null
+++ b/ct/authentik.sh
@@ -0,0 +1,84 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: remz1337
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+
+# App Default Values
+APP="Authentik"
+var_tags="identity-provider"
+var_disk="15"
+var_cpu="6"
+var_ram="8192"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/authentik-server.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/goauthentik/authentik/releases/latest | grep "tarball_url" | awk '{print substr($2, 2, length($2)-3)}')
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop authentik-server
+ systemctl stop authentik-worker
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Building ${APP} website"
+ mkdir -p /opt/authentik
+ wget -qO authentik.tar.gz "${RELEASE}"
+ tar -xzf authentik.tar.gz -C /opt/authentik --strip-components 1 --overwrite
+ rm -rf authentik.tar.gz
+ cd /opt/authentik/website
+ npm install &>/dev/null
+ npm run build-bundled &>/dev/null
+ cd /opt/authentik/web
+ npm install &>/dev/null
+ npm run build &>/dev/null
+ msg_ok "Built ${APP} website"
+
+ msg_info "Installing Python Dependencies"
+ cd /opt/authentik
+ poetry install --only=main --no-ansi --no-interaction --no-root &>/dev/null
+ poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt &>/dev/null
+ pip install --no-cache-dir -r requirements.txt &>/dev/null
+ pip install . &>/dev/null
+ msg_ok "Installed Python Dependencies"
+
+ msg_info "Updating ${APP} to v${RELEASE} (Patience)"
+ cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints
+ bash /opt/authentik/lifecycle/ak migrate &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting ${APP}"
+ systemctl start authentik-server
+ systemctl start authentik-worker
+ msg_ok "Started ${APP}"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000/if/flow/initial-setup/${CL}"
diff --git a/ct/autobrr.sh b/ct/autobrr.sh
index f4c0f0868..1754759b8 100644
--- a/ct/autobrr.sh
+++ b/ct/autobrr.sh
@@ -1,76 +1,53 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://autobrr.com/
-function header_info {
-clear
-cat <<"EOF"
- ___ __ __
- / | __ __/ /_____ / /_ __________
- / /| |/ / / / __/ __ \/ __ \/ ___/ ___/
- / ___ / /_/ / /_/ /_/ / /_/ / / / /
-/_/ |_\__,_/\__/\____/_.___/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Autobrr"
-var_disk="8"
+var_tags="arr;"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /root/.config/autobrr/config.toml ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Stopping ${APP} LXC"
-systemctl stop autobrr.service
-msg_ok "Stopped ${APP} LXC"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /root/.config/autobrr/config.toml ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP} LXC"
+ systemctl stop autobrr.service
+ msg_ok "Stopped ${APP} LXC"
-msg_info "Updating ${APP} LXC"
-rm -rf /usr/local/bin/*
-wget -q $(curl -s https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_arm64 | cut -d\" -f4)
-tar -C /usr/local/bin -xzf autobrr*.tar.gz
-rm -rf autobrr*.tar.gz
-msg_ok "Updated ${APP} LXC"
+ msg_info "Updating ${APP} LXC"
+ rm -rf /usr/local/bin/*
+ wget -q $(curl -s https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4)
+ tar -C /usr/local/bin -xzf autobrr*.tar.gz
+ rm -rf autobrr*.tar.gz
+ msg_ok "Updated ${APP} LXC"
-msg_info "Starting ${APP} LXC"
-systemctl start autobrr.service
-msg_ok "Started ${APP} LXC"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ${APP} LXC"
+ systemctl start autobrr.service
+ msg_ok "Started ${APP} LXC"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -78,5 +55,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:7474${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7474${CL}"
\ No newline at end of file
diff --git a/ct/bazarr.sh b/ct/bazarr.sh
index adc795242..da551e6a5 100755
--- a/ct/bazarr.sh
+++ b/ct/bazarr.sh
@@ -1,64 +1,38 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.bazarr.media/
-function header_info {
-clear
-cat <<"EOF"
- ____
- / __ )____ _____ ____ ___________
- / __ / __ `/_ / / __ `/ ___/ ___/
- / /_/ / /_/ / / /_/ /_/ / / / /
-/_____/\__,_/ /___/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Bazarr"
-var_disk="4"
+var_tags="arr"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var/lib/bazarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var/lib/bazarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
exit
}
@@ -67,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:6767${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6767${CL}"
\ No newline at end of file
diff --git a/ct/blocky.sh b/ct/blocky.sh
index ef9d69318..d23a0c953 100644
--- a/ct/blocky.sh
+++ b/ct/blocky.sh
@@ -1,65 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://0xerr0r.github.io/blocky/latest/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ __
- / __ )/ /___ _____/ /____ __
- / __ / / __ \/ ___/ //_/ / / /
- / /_/ / / /_/ / /__/ ,< / /_/ /
-/_____/_/\____/\___/_/|_|\__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Blocky"
-var_disk="2"
+var_tags="adblock"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,3 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4000${CL}"
\ No newline at end of file
diff --git a/ct/bookstack.sh b/ct/bookstack.sh
new file mode 100644
index 000000000..cf2a14bb1
--- /dev/null
+++ b/ct/bookstack.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/BookStackApp/BookStack
+
+# App Default Values
+APP="Bookstack"
+var_tags="organizer"
+var_cpu="1"
+var_ram="1024"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/bookstack ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/BookStackApp/BookStack/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Apache2"
+ systemctl stop apache2
+ msg_ok "Services Stopped"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ mv /opt/bookstack /opt/bookstack-backup
+ wget -q --directory-prefix=/opt "https://github.com/BookStackApp/BookStack/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q /opt/v${RELEASE}.zip -d /opt
+ mv /opt/BookStack-${RELEASE} /opt/bookstack
+ cp /opt/bookstack-backup/.env /opt/bookstack/.env
+ cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/
+ cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/
+ cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/
+ cd /opt/bookstack
+ COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev &>/dev/null
+ php artisan migrate --force &>/dev/null
+ chown www-data:www-data -R /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage
+ chmod -R 755 /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage
+ chmod -R 775 /opt/bookstack/storage /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads
+ chmod -R 640 /opt/bookstack/.env
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Apache2"
+ systemctl start apache2
+ msg_ok "Started Apache2"
+
+ msg_info "Cleaning Up"
+ rm -rf /opt/bookstack-backup
+ rm -rf /opt/v${RELEASE}.zip
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/bunkerweb.sh b/ct/bunkerweb.sh
index 4f2508436..13d4548c2 100644
--- a/ct/bunkerweb.sh
+++ b/ct/bunkerweb.sh
@@ -1,63 +1,36 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.bunkerweb.io/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ _ __ __
- / __ )__ ______ / /_____ ____| | / /__ / /_
- / __ / / / / __ \/ //_/ _ \/ ___/ | /| / / _ \/ __ \
- / /_/ / /_/ / / / / ,< / __/ / | |/ |/ / __/ /_/ /
-/_____/\__,_/_/ /_/_/|_|\___/_/ |__/|__/\___/_.___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="BunkerWeb"
-var_disk="4"
+var_tags="webserver"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /etc/bunkerweb ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-
-RELEASE=$(curl -s https://api.github.com/repos/bunkerity/bunkerweb/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/bunkerweb ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ RELEASE=$(curl -s https://api.github.com/repos/bunkerity/bunkerweb/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating ${APP} to ${RELEASE}"
cat </etc/apt/preferences.d/bunkerweb
@@ -82,5 +55,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} setup should be reachable by going to the following URL.
- ${BL}http://${IP}/setup${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/setup${CL}"
\ No newline at end of file
diff --git a/ct/caddy.sh b/ct/caddy.sh
index f4e8d0410..f972ce537 100644
--- a/ct/caddy.sh
+++ b/ct/caddy.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://caddyserver.com/
-function header_info {
-clear
-cat <<"EOF"
- ______ __ __
- / ____/___ _____/ /___/ /_ __
- / / / __ `/ __ / __ / / / /
-/ /___/ /_/ / /_/ / /_/ / /_/ /
-\____/\__,_/\__,_/\__,_/\__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Caddy"
-var_disk="2"
+var_tags="webserver"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /etc/caddy ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/caddy ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,3 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:80${CL}"
\ No newline at end of file
diff --git a/ct/calibre-web.sh b/ct/calibre-web.sh
index 120cf942b..b3cf82816 100644
--- a/ct/calibre-web.sh
+++ b/ct/calibre-web.sh
@@ -1,70 +1,46 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# Co-Author: remz1337
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: remz1337
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/janeczku/calibre-web
-function header_info {
-clear
-cat <<"EOF"
- ______ ___ __ _ __ __
- / ____/___ _/ (_) /_ ________ | | / /__ / /_
- / / / __ `/ / / __ \/ ___/ _ \___| | /| / / _ \/ __ \
-/ /___/ /_/ / / / /_/ / / / __/___/ |/ |/ / __/ /_/ /
-\____/\__,_/_/_/_.___/_/ \___/ |__/|__/\___/_.___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Calibre-Web"
-var_disk="4"
+var_tags="eBook"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
if [[ ! -f /etc/systemd/system/cps.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
- header_info
- msg_info "Updating $APP LXC"
+ msg_info "Stopping ${APP}"
systemctl stop cps
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP}"
cd /opt/kepubify
- rm kepubify-linux-arm64
- curl -fsSLO https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-arm64 &>/dev/null
- chmod +x kepubify-linux-arm64
+ rm -rf kepubify-linux-64bit
+ curl -fsSLO https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-64bit
+ chmod +x kepubify-linux-64bit
menu_array=("1" "Enables gdrive as storage backend for your ebooks" OFF \
"2" "Enables sending emails via a googlemail account without enabling insecure apps" OFF \
"3" "Enables displaying of additional author infos on the authors page" OFF \
@@ -72,33 +48,33 @@ function update_script() {
"5" "Enables login via google or github oauth" OFF \
"6" "Enables extracting of metadata from epub, fb2, pdf files, and also extraction of covers from cbr, cbz, cbt files" OFF \
"7" "Enables extracting of metadata from cbr, cbz, cbt files" OFF \
- "8" "Enables syncing with your kobo reader" OFF )
+ "8" "Enables syncing with your kobo reader" OFF)
if [ -f "/opt/calibre-web/options.txt" ]; then
cps_options="$(cat /opt/calibre-web/options.txt)"
- IFS=',' read -ra ADDR <<< "$cps_options"
+ IFS=',' read -ra ADDR <<<"$cps_options"
for i in "${ADDR[@]}"; do
- if [ $i == "gdrive" ]; then
- line=0
- elif [ $i == "gmail" ]; then
- line=1
- elif [ $i == "goodreads" ]; then
- line=2
- elif [ $i == "ldap" ]; then
- line=3
- elif [ $i == "oauth" ]; then
- line=4
- elif [ $i == "metadata" ]; then
- line=5
- elif [ $i == "comics" ]; then
- line=6
- elif [ $i == "kobo" ]; then
- line=7
- fi
- array_index=$(( 3*line + 2 ))
+ if [ $i == "gdrive" ]; then
+ line=0
+ elif [ $i == "gmail" ]; then
+ line=1
+ elif [ $i == "goodreads" ]; then
+ line=2
+ elif [ $i == "ldap" ]; then
+ line=3
+ elif [ $i == "oauth" ]; then
+ line=4
+ elif [ $i == "metadata" ]; then
+ line=5
+ elif [ $i == "comics" ]; then
+ line=6
+ elif [ $i == "kobo" ]; then
+ line=7
+ fi
+ array_index=$((3 * line + 2))
menu_array[$array_index]=ON
done
fi
- if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
+ if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
CHOICES=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CALIBRE-WEB OPTIONS" --separate-output --checklist "Choose Additional Options" 15 125 8 "${menu_array[@]}" 3>&1 1>&2 2>&3)
spinner &
SPINNER_PID=$!
@@ -107,29 +83,29 @@ function update_script() {
for CHOICE in $CHOICES; do
case "$CHOICE" in
"1")
- options+=( gdrive )
+ options+=(gdrive)
;;
"2")
- options+=( gmail )
+ options+=(gmail)
;;
"3")
- options+=( goodreads )
+ options+=(goodreads)
;;
"4")
- options+=( ldap )
+ options+=(ldap)
apt-get install -qqy libldap2-dev libsasl2-dev
;;
"5")
- options+=( oauth )
+ options+=(oauth)
;;
"6")
- options+=( metadata )
+ options+=(metadata)
;;
"7")
- options+=( comics )
+ options+=(comics)
;;
"8")
- options+=( kobo )
+ options+=(kobo)
;;
*)
echo "Unsupported item $CHOICE!" >&2
@@ -138,16 +114,22 @@ function update_script() {
esac
done
fi
- if [ ! -z "$options" ] && [ ${#options[@]} -gt 0 ]; then
- cps_options=$(IFS=, ; echo "${options[*]}")
- echo $cps_options > /opt/calibre-web/options.txt
- pip install --upgrade calibreweb[$cps_options]
+ if [ ${#options[@]} -gt 0 ]; then
+ cps_options=$(
+ IFS=,
+ echo "${options[*]}"
+ )
+ echo $cps_options >/opt/calibre-web/options.txt
+ pip install --upgrade calibreweb[$cps_options] &>/dev/null
else
- rm /opt/calibre-web/options.txt 2> /dev/null
- pip install --upgrade calibreweb
+ rm -rf /opt/calibre-web/options.txt
+ pip install --upgrade calibreweb &>/dev/null
fi
+
+ msg_info "Starting ${APP}"
systemctl start cps
- msg_ok "Updated $APP LXC"
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
exit
}
@@ -155,10 +137,7 @@ start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 512
-pct set $CTID -cores 1
-msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8083${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8083${CL}"
diff --git a/ct/casaos.sh b/ct/casaos.sh
index d23937eff..b3e2b0b03 100644
--- a/ct/casaos.sh
+++ b/ct/casaos.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://casaos.io/
-function header_info {
-clear
-cat <<"EOF"
- ______ ____ _____
- / ____/___ __________ _/ __ \/ ___/
- / / / __ `/ ___/ __ `/ / / /\__ \
-/ /___/ /_/ (__ ) /_/ / /_/ /___/ /
-\____/\__,_/____/\__,_/\____//____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="CasaOS"
-var_disk="8"
+var_tags="cloud"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated ${APP} LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP} ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/changedetection.sh b/ct/changedetection.sh
index 030821b4a..2929bb87d 100644
--- a/ct/changedetection.sh
+++ b/ct/changedetection.sh
@@ -1,81 +1,75 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://changedetection.io/
-function header_info {
-clear
-cat <<"EOF"
- ________ ____ __ __ _
- / ____/ /_ ____ _____ ____ ____ / __ \___ / /____ _____/ /_(_)___ ____
- / / / __ \/ __ `/ __ \/ __ `/ _ \ / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \
-/ /___/ / / / /_/ / / / / /_/ / __/ / /_/ / __/ /_/ __/ /__/ /_/ / /_/ / / / /
-\____/_/ /_/\__,_/_/ /_/\__, /\___/ /_____/\___/\__/\___/\___/\__/_/\____/_/ /_/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Change Detection"
-var_disk="8"
+var_tags="monitoring;crawler"
var_cpu="2"
var_ram="1024"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/changedetection.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-if ! dpkg -s libjpeg-dev >/dev/null 2>&1; then
- apt-get update
- apt-get install -y libjpeg-dev
-fi
-pip3 install changedetection.io --upgrade &>/dev/null
-pip3 install playwright --upgrade &>/dev/null
-if [[ -f /etc/systemd/system/browserless.service ]]; then
- git -C /opt/browserless/ fetch --all &>/dev/null
- git -C /opt/browserless/ reset --hard origin/main &>/dev/null
- npm update --prefix /opt/browserless &>/dev/null
- npm run build --prefix /opt/browserless &>/dev/null
- npm run build:function --prefix /opt/browserless &>/dev/null
- npm prune production --prefix /opt/browserless &>/dev/null
- systemctl restart browserless
-else
- msg_error "No Browserless Installation Found!"
-fi
-systemctl restart changedetection
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -f /etc/systemd/system/changedetection.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if ! dpkg -s libjpeg-dev >/dev/null 2>&1; then
+ msg_info "Installing Dependencies"
+ apt-get update
+ apt-get install -y libjpeg-dev
+ msg_ok "Updated Dependencies"
+ fi
+
+ msg_info "Updating ${APP}"
+ pip3 install changedetection.io --upgrade &>/dev/null
+ msg_ok "Updated ${APP}"
+
+ msg_info "Updating Playwright"
+ pip3 install playwright --upgrade &>/dev/null
+ msg_ok "Updated Playwright"
+
+ if [[ -f /etc/systemd/system/browserless.service ]]; then
+ msg_info "Updating Browserless (Patience)"
+ git -C /opt/browserless/ fetch --all &>/dev/null
+ git -C /opt/browserless/ reset --hard origin/main &>/dev/null
+ npm update --prefix /opt/browserless &>/dev/null
+ /opt/browserless/node_modules/playwright-core/cli.js install --with-deps &>/dev/null
+ # Update Chrome separately, as it has to be done with the force option. Otherwise the installation of other browsers will not be done if Chrome is already installed.
+ /opt/browserless/node_modules/playwright-core/cli.js install --force chrome &>/dev/null
+ /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit &>/dev/null
+ npm run build --prefix /opt/browserless &>/dev/null
+ npm run build:function --prefix /opt/browserless &>/dev/null
+ npm prune production --prefix /opt/browserless &>/dev/null
+ systemctl restart browserless
+ msg_ok "Updated Browserless"
+ else
+ msg_error "No Browserless Installation Found!"
+ fi
+
+ systemctl restart changedetection
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -83,5 +77,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
diff --git a/ct/channels.sh b/ct/channels.sh
index 18fa63a40..b856712b2 100644
--- a/ct/channels.sh
+++ b/ct/channels.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://getchannels.com/dvr-server/
-function header_info {
-clear
-cat <<"EOF"
- ________ __ ____ _ ______ _____
- / ____/ /_ ____ _____ ____ ___ / /____ / __ \ | / / __ \ / ___/___ ______ _____ _____
- / / / __ \/ __ `/ __ \/ __ \/ _ \/ / ___/ / / / / | / / /_/ / \__ \/ _ \/ ___/ | / / _ \/ ___/
-/ /___/ / / / /_/ / / / / / / / __/ (__ ) / /_/ /| |/ / _, _/ ___/ / __/ / | |/ / __/ /
-\____/_/ /_/\__,_/_/ /_/_/ /_/\___/_/____/ /_____/ |___/_/ |_| /____/\___/_/ |___/\___/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Channels"
-var_disk="8"
+var_tags="dvr"
var_cpu="2"
var_ram="1024"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/channels-dvr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/channels-dvr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -64,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:8089 ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8089${CL}"
\ No newline at end of file
diff --git a/ct/checkmk.sh b/ct/checkmk.sh
new file mode 100644
index 000000000..e44d48169
--- /dev/null
+++ b/ct/checkmk.sh
@@ -0,0 +1,59 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Michel Roegl-Brunner (michelroegl-brunner)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://checkmk.com/
+
+APP="checkmk"
+var_tags="monitoring"
+var_cpu="2"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+header_info "$APP"
+base_settings
+
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /opt/checkmk_version.txt ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | grep -v "*-rc" | tail -n +2 | head -n 1)
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating ${APP} to v${RELEASE}"
+ omd stop monitoring &>/dev/null
+ omd cp monitoring monitoringbackup &>/dev/null
+ wget -q https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb -O /opt/checkmk.deb
+ apt-get install -y /opt/checkmk.deb &>/dev/null
+ omd --force -V ${RELEASE}.cre update --conflict=install monitoring &>/dev/null
+ omd start monitoring &>/dev/null
+ omd -f rm monitoringbackup &>/dev/null
+ omd cleanup &>/dev/null
+ rm -rf /opt/checkmk.deb
+ msg_ok "Updated ${APP} to v${RELEASE}"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/monitoring${CL}"
diff --git a/ct/cloudflared.sh b/ct/cloudflared.sh
index 91d2ea41d..3ae6f45d1 100644
--- a/ct/cloudflared.sh
+++ b/ct/cloudflared.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.cloudflare.com/
-function header_info {
-clear
-cat <<"EOF"
- ________ ________ __
- / ____/ /___ __ ______/ / __/ /___ _________ ____/ /
- / / / / __ \/ / / / __ / /_/ / __ `/ ___/ _ \/ __ /
-/ /___/ / /_/ / /_/ / /_/ / __/ / /_/ / / / __/ /_/ /
-\____/_/\____/\__,_/\__,_/_/ /_/\__,_/_/ \___/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Cloudflared"
-var_disk="2"
+var_tags="network;cloudflare"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,3 +44,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/cockpit.sh b/ct/cockpit.sh
index d6ac3c731..f48f78eb3 100644
--- a/ct/cockpit.sh
+++ b/ct/cockpit.sh
@@ -1,119 +1,92 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: havardthom
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck | Co-Author: havardthom
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://cockpit-project.org/
-function header_info {
-clear
-cat <<"EOF"
- ______ __ _ __
- / ____/___ _____/ /______ (_) /_
- / / / __ \/ ___/ //_/ __ \/ / __/
-/ /___/ /_/ / /__/ ,< / /_/ / / /_
-\____/\____/\___/_/|_/ .___/_/\__/
- /_/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Cockpit"
-var_disk="4"
+var_tags="monitoring;network"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-if [[ ! -d /etc/cockpit ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
- "1" "Update LXC" ON \
- "2" "Install cockpit-file-sharing" OFF \
- "3" "Install cockpit-identities" OFF \
- "4" "Install cockpit-navigator" OFF \
- 3>&1 1>&2 2>&3)
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/cockpit ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
+ "1" "Update LXC" ON \
+ "2" "Install cockpit-file-sharing" OFF \
+ "3" "Install cockpit-identities" OFF \
+ "4" "Install cockpit-navigator" OFF \
+ 3>&1 1>&2 2>&3)
-header_info
-if [ "$UPD" == "1" ]; then
- msg_info "Updating ${APP} LXC"
- apt-get update &>/dev/null
- apt-get -y upgrade &>/dev/null
- msg_ok "Updated ${APP} LXC"
- exit
-fi
-if [ "$UPD" == "2" ]; then
- msg_info "Installing dependencies (patience)"
- apt-get install -y attr &>/dev/null
- apt-get install -y nfs-kernel-server &>/dev/null
- apt-get install -y samba &>/dev/null
- apt-get install -y samba-common-bin &>/dev/null
- apt-get install -y winbind &>/dev/null
- apt-get install -y gawk &>/dev/null
- msg_ok "Installed dependencies"
- msg_info "Installing Cockpit file sharing"
- LATEST=$(curl -s https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
- wget -q https://github.com/45Drives/cockpit-file-sharing/releases/download/v${LATEST}/cockpit-file-sharing_${LATEST}-1focal_all.deb
- dpkg -i cockpit-file-sharing_${LATEST}-1focal_all.deb &>/dev/null
- rm cockpit-file-sharing_${LATEST}-1focal_all.deb
- msg_ok "Installed Cockpit file sharing"
- exit
-fi
-if [ "$UPD" == "3" ]; then
- msg_info "Installing dependencies (patience)"
- apt-get install -y psmisc &>/dev/null
- apt-get install -y samba &>/dev/null
- apt-get install -y samba-common-bin &>/dev/null
- msg_ok "Installed dependencies"
- msg_info "Installing Cockpit identities"
- LATEST=$(curl -s https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
- wget -q https://github.com/45Drives/cockpit-identities/releases/download/v${LATEST}/cockpit-identities_${LATEST}-1focal_all.deb
- dpkg -i cockpit-identities_${LATEST}-1focal_all.deb &>/dev/null
- rm cockpit-identities_${LATEST}-1focal_all.deb
- msg_ok "Installed Cockpit identities"
- exit
-fi
-if [ "$UPD" == "4" ]; then
- msg_info "Installing dependencies"
- apt-get install -y rsync &>/dev/null
- apt-get install -y zip &>/dev/null
- msg_ok "Installed dependencies"
- msg_info "Installing Cockpit navigator"
- LATEST=$(curl -s https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
- wget -q https://github.com/45Drives/cockpit-navigator/releases/download/v${LATEST}/cockpit-navigator_${LATEST}-1focal_all.deb
- dpkg -i cockpit-navigator_${LATEST}-1focal_all.deb &>/dev/null
- rm cockpit-navigator_${LATEST}-1focal_all.deb
- msg_ok "Installed Cockpit navigator"
- exit
-fi
+ if [ "$UPD" == "1" ]; then
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
+ fi
+ if [ "$UPD" == "2" ]; then
+ msg_info "Installing dependencies (patience)"
+ apt-get install -y attr &>/dev/null
+ apt-get install -y nfs-kernel-server &>/dev/null
+ apt-get install -y samba &>/dev/null
+ apt-get install -y samba-common-bin &>/dev/null
+ apt-get install -y winbind &>/dev/null
+ apt-get install -y gawk &>/dev/null
+ msg_ok "Installed dependencies"
+ msg_info "Installing Cockpit file sharing"
+ wget -q $(curl -s https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
+ dpkg -i cockpit-file-sharing_*focal_all.deb &>/dev/null
+ rm cockpit-file-sharing_*focal_all.deb
+ msg_ok "Installed Cockpit file sharing"
+ exit
+ fi
+ if [ "$UPD" == "3" ]; then
+ msg_info "Installing dependencies (patience)"
+ apt-get install -y psmisc &>/dev/null
+ apt-get install -y samba &>/dev/null
+ apt-get install -y samba-common-bin &>/dev/null
+ msg_ok "Installed dependencies"
+ msg_info "Installing Cockpit identities"
+ wget -q $(curl -s https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
+ dpkg -i cockpit-identities_*focal_all.deb &>/dev/null
+ rm cockpit-identities_*focal_all.deb
+ msg_ok "Installed Cockpit identities"
+ exit
+ fi
+ if [ "$UPD" == "4" ]; then
+ msg_info "Installing dependencies"
+ apt-get install -y rsync &>/dev/null
+ apt-get install -y zip &>/dev/null
+ msg_ok "Installed dependencies"
+ msg_info "Installing Cockpit navigator"
+ wget -q $(curl -s https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
+ dpkg -i cockpit-navigator_*focal_all.deb &>/dev/null
+ rm cockpit-navigator_*focal_all.deb
+ msg_ok "Installed Cockpit navigator"
+ exit
+ fi
}
start
@@ -121,5 +94,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:9090${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9090${CL}"
\ No newline at end of file
diff --git a/ct/commafeed.sh b/ct/commafeed.sh
index 738a98da7..239732636 100644
--- a/ct/commafeed.sh
+++ b/ct/commafeed.sh
@@ -1,82 +1,59 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.commafeed.com/#/welcome
-function header_info {
-clear
-cat <<"EOF"
- ______ ______ __
- / ____/___ ____ ___ ____ ___ ____ _/ ____/__ ___ ____/ /
- / / / __ \/ __ `__ \/ __ `__ \/ __ `/ /_ / _ \/ _ \/ __ /
-/ /___/ /_/ / / / / / / / / / / / /_/ / __/ / __/ __/ /_/ /
-\____/\____/_/ /_/ /_/_/ /_/ /_/\__,_/_/ \___/\___/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="CommaFeed"
-var_disk="4"
+var_tags="rss-reader"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/commafeed ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -sL https://api.github.com/repos/Athou/commafeed/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop commafeed
- msg_ok "Stopped ${APP}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/commafeed ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -sL https://api.github.com/repos/Athou/commafeed/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop commafeed
+ msg_ok "Stopped ${APP}"
- msg_info "Updating ${APP} to ${RELEASE}"
- wget -q https://github.com/Athou/commafeed/releases/download/${RELEASE}/commafeed-${RELEASE}-h2-jvm.zip
- unzip -q commafeed-${RELEASE}-h2-jvm.zip
- rsync -a --exclude 'data/' commafeed-${RELEASE}-h2/ /opt/commafeed/
- rm -rf commafeed-${RELEASE}-h2 commafeed-${RELEASE}-h2-jvm.zip
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ wget -q https://github.com/Athou/commafeed/releases/download/${RELEASE}/commafeed-${RELEASE}-h2-jvm.zip
+ unzip -q commafeed-${RELEASE}-h2-jvm.zip
+ rsync -a --exclude 'data/' commafeed-${RELEASE}-h2/ /opt/commafeed/
+ rm -rf commafeed-${RELEASE}-h2 commafeed-${RELEASE}-h2-jvm.zip
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
- msg_info "Starting ${APP}"
- systemctl start commafeed
- msg_ok "Started ${APP}"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Starting ${APP}"
+ systemctl start commafeed
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -84,5 +61,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8082${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8082${CL}"
diff --git a/ct/create_lxc.sh b/ct/create_lxc.sh
index 6da46a871..f0a2ffd2f 100644
--- a/ct/create_lxc.sh
+++ b/ct/create_lxc.sh
@@ -1,23 +1,33 @@
#!/usr/bin/env bash
-# Copyright (c) 2021-2024 tteck
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# Co-Author: MickLesk
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
# This sets verbose mode if the global variable is set to "yes"
# if [ "$VERBOSE" == "yes" ]; then set -x; fi
# This function sets color variables for formatting output in the terminal
+# Colors
YW=$(echo "\033[33m")
+YWB=$(echo "\033[93m")
BL=$(echo "\033[36m")
RD=$(echo "\033[01;31m")
GN=$(echo "\033[1;92m")
+
+# Formatting
CL=$(echo "\033[m")
-CM="${GN}✓${CL}"
-CROSS="${RD}✗${CL}"
+UL=$(echo "\033[4m")
+BOLD=$(echo "\033[1m")
BFR="\\r\\033[K"
HOLD=" "
+TAB=" "
+
+# Icons
+CM="${TAB}✔️${TAB}${CL}"
+CROSS="${TAB}✖️${TAB}${CL}"
+INFO="${TAB}💡${TAB}${CL}"
# This sets error handling options and defines the error_handler function to handle errors
set -Eeuo pipefail
@@ -36,19 +46,24 @@ function error_handler() {
# This function displays a spinner.
function spinner() {
- local chars="/-\|"
- local spin_i=0
- printf "\e[?25l"
- while true; do
- printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}"
- sleep 0.1
- done
+ local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
+ local spin_i=0
+ local interval=0.1
+ printf "\e[?25l"
+
+ local color="${YWB}"
+
+ while true; do
+ printf "\r ${color}%s${CL}" "${frames[spin_i]}"
+ spin_i=$(( (spin_i + 1) % ${#frames[@]} ))
+ sleep "$interval"
+ done
}
# This function displays an informational message with a yellow color.
function msg_info() {
local msg="$1"
- echo -ne " ${HOLD} ${YW}${msg} "
+ echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}"
spinner &
SPINNER_PID=$!
}
@@ -58,7 +73,7 @@ function msg_ok() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
printf "\e[?25h"
local msg="$1"
- echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
+ echo -e "${BFR}${CM}${GN}${msg}${CL}"
}
# This function displays a error message with a red color.
@@ -66,7 +81,7 @@ function msg_error() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
printf "\e[?25h"
local msg="$1"
- echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
+ echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
}
# This checks for the presence of valid Container Storage and Template Storage locations
@@ -105,7 +120,7 @@ function select_storage() {
local TAG=$(echo $line | awk '{print $1}')
local TYPE=$(echo $line | awk '{printf "%-10s", $2}')
local FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}')
- local ITEM=" Type: $TYPE Free: $FREE "
+ local ITEM="Type: $TYPE Free: $FREE "
local OFFSET=2
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
local MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
@@ -123,11 +138,14 @@ function select_storage() {
"Which storage pool you would like to use for the ${CONTENT_LABEL,,}?\nTo make a selection, use the Spacebar.\n" \
16 $(($MSG_MAX_LENGTH + 23)) 6 \
"${MENU[@]}" 3>&1 1>&2 2>&3) || exit "Menu aborted."
+ if [ $? -ne 0 ]; then
+ echo -e "${CROSS}${RD} Menu aborted by user.${CL}"
+ exit 0
+ fi
done
- printf $STORAGE
+ printf "%s" "$STORAGE"
fi
}
-
# Test if required variables are set
[[ "${CTID:-}" ]] || exit "You need to set 'CTID' variable."
[[ "${PCT_OSTYPE:-}" ]] || exit "You need to set 'PCT_OSTYPE' variable."
diff --git a/ct/cronicle.sh b/ct/cronicle.sh
index 43ef798fe..bcaf25c77 100644
--- a/ct/cronicle.sh
+++ b/ct/cronicle.sh
@@ -1,124 +1,101 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://cronicle.net/
-function header_info {
-clear
-cat <<"EOF"
- ______ _ __
- / ____/________ ____ (_)____/ /__
- / / / ___/ __ \/ __ \/ / ___/ / _ \
-/ /___/ / / /_/ / / / / / /__/ / __/
-\____/_/ \____/_/ /_/_/\___/_/\___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Cronicle"
-var_disk="2"
+var_tags="task-scheduler"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \
- "1" "Update ${APP}" ON \
- "2" "Install ${APP} Worker" OFF \
- 3>&1 1>&2 2>&3)
+ header_info
+ check_container_storage
+ check_container_resources
+ UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \
+ "1" "Update ${APP}" ON \
+ "2" "Install ${APP} Worker" OFF \
+ 3>&1 1>&2 2>&3)
-if [ "$UPD" == "1" ]; then
-header_info
-if [[ ! -d /opt/cronicle ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
- if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
- if ! command -v npm >/dev/null 2>&1; then
- echo "Installing NPM..."
- apt-get install -y npm >/dev/null 2>&1
- echo "Installed NPM..."
+ if [ "$UPD" == "1" ]; then
+ if [[ ! -d /opt/cronicle ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
fi
- fi
-msg_info "Updating ${APP}"
-/opt/cronicle/bin/control.sh upgrade &>/dev/null
-msg_ok "Updated ${APP}"
-exit
-fi
-if [ "$UPD" == "2" ]; then
- if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
- if ! command -v npm >/dev/null 2>&1; then
- echo "Installing NPM..."
- apt-get install -y npm >/dev/null 2>&1
- echo "Installed NPM..."
+ if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
+ if ! command -v npm >/dev/null 2>&1; then
+ echo "Installing NPM..."
+ apt-get install -y npm >/dev/null 2>&1
+ echo "Installed NPM..."
+ fi
fi
+ msg_info "Updating ${APP}"
+ /opt/cronicle/bin/control.sh upgrade &>/dev/null
+ msg_ok "Updated ${APP}"
+ exit
fi
-LATEST=$(curl -sL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
-IP=$(hostname -I | awk '{print $1}')
-msg_info "Installing Dependencies"
+ if [ "$UPD" == "2" ]; then
+ if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
+ if ! command -v npm >/dev/null 2>&1; then
+ echo "Installing NPM..."
+ apt-get install -y npm >/dev/null 2>&1
+ echo "Installed NPM..."
+ fi
+ fi
+ LATEST=$(curl -sL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
+ IP=$(hostname -I | awk '{print $1}')
+ msg_info "Installing Dependencies"
-apt-get install -y git &>/dev/null
-apt-get install -y make &>/dev/null
-apt-get install -y g++ &>/dev/null
-apt-get install -y gcc &>/dev/null
-apt-get install -y ca-certificates &>/dev/null
-apt-get install -y gnupg &>/dev/null
-msg_ok "Installed Dependencies"
+ apt-get install -y git &>/dev/null
+ apt-get install -y make &>/dev/null
+ apt-get install -y g++ &>/dev/null
+ apt-get install -y gcc &>/dev/null
+ apt-get install -y ca-certificates &>/dev/null
+ apt-get install -y gnupg &>/dev/null
+ msg_ok "Installed Dependencies"
-msg_info "Setting up Node.js Repository"
-mkdir -p /etc/apt/keyrings
-curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
-echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
-msg_ok "Set up Node.js Repository"
+ msg_info "Setting up Node.js Repository"
+ mkdir -p /etc/apt/keyrings
+ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
+ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
+ msg_ok "Set up Node.js Repository"
-msg_info "Installing Node.js"
-apt-get update &>/dev/null
-apt-get install -y nodejs &>/dev/null
-msg_ok "Installed Node.js"
+ msg_info "Installing Node.js"
+ apt-get update &>/dev/null
+ apt-get install -y nodejs &>/dev/null
+ msg_ok "Installed Node.js"
-msg_info "Installing Cronicle Worker"
-mkdir -p /opt/cronicle
-cd /opt/cronicle
-tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1 &>/dev/null
-npm install &>/dev/null
-node bin/build.js dist &>/dev/null
-sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
-/opt/cronicle/bin/control.sh start &>/dev/null
-cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled &>/dev/null
-chmod 775 /etc/init.d/cronicled
-update-rc.d cronicled defaults &>/dev/null
-msg_ok "Installed Cronicle Worker"
-echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n"
-exit
-fi
+ msg_info "Installing Cronicle Worker"
+ mkdir -p /opt/cronicle
+ cd /opt/cronicle
+ tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1 &>/dev/null
+ npm install &>/dev/null
+ node bin/build.js dist &>/dev/null
+ sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
+ /opt/cronicle/bin/control.sh start &>/dev/null
+ cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled &>/dev/null
+ chmod 775 /etc/init.d/cronicled
+ update-rc.d cronicled defaults &>/dev/null
+ msg_ok "Installed Cronicle Worker"
+ echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n"
+ exit
+ fi
}
start
@@ -126,5 +103,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Primary should be reachable by going to the following URL.
- ${BL}http://${IP}:3012${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3012${CL}"
\ No newline at end of file
diff --git a/ct/daemonsync.sh b/ct/daemonsync.sh
index 8d06eb914..daeaaa155 100644
--- a/ct/daemonsync.sh
+++ b/ct/daemonsync.sh
@@ -1,73 +1,49 @@
#!/usr/bin/env bash
-# source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://daemonsync.me/
-echo "Unsupported. View notes on GitHub."
+# App Default Values
+APP="Daemon Sync"
+var_tags="sync"
+var_cpu="1"
+var_ram="512"
+var_disk="8"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
-# function header_info {
-# clear
-# cat <<"EOF"
-# ____ _____
-# / __ \____ ____ ____ ___ ____ ____ / ___/__ ______ _____
-# / / / / __ / _ \/ __ __ \/ __ \/ __ \ \__ \/ / / / __ \/ ___/
-# / /_/ / /_/ / __/ / / / / / /_/ / / / / ___/ / /_/ / / / / /__
-# /_____/\__,_/\___/_/ /_/ /_/\____/_/ /_/ /____/\__, /_/ /_/\___/
-# /____/
-# EOF
-# }
-# header_info
-# echo -e "Loading..."
-# APP="Daemon Sync"
-# var_disk="8"
-# var_cpu="1"
-# var_ram="512"
-# var_os="debian"
-# var_version="12"
-# variables
-# color
-# catch_errors
+# App Output & Base Settings
+header_info "$APP"
+base_settings
-# function default_settings() {
-# CT_TYPE="1"
-# PW=""
-# CT_ID=$NEXTID
-# HN=$NSAPP
-# DISK_SIZE="$var_disk"
-# CORE_COUNT="$var_cpu"
-# RAM_SIZE="$var_ram"
-# BRG="vmbr0"
-# NET="dhcp"
-# GATE=""
-# APT_CACHER=""
-# APT_CACHER_IP=""
-# DISABLEIP6="no"
-# MTU=""
-# SD=""
-# NS=""
-# MAC=""
-# VLAN=""
-# SSH="no"
-# VERB="no"
-# echo_default
-# }
+# Core
+variables
+color
+catch_errors
-# function update_script() {
-# header_info
-# if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-# msg_info "Updating $APP LXC"
-# apt-get update &>/dev/null
-# apt-get -y upgrade &>/dev/null
-# msg_ok "Updated $APP LXC"
-# exit
-# }
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
+}
-# start
-# build_container
-# description
+start
+build_container
+description
-# msg_ok "Completed Successfully!\n"
-# echo -e "${APP} should be reachable by going to the following URL.
-# ${BL}http://${IP}:8084${CL} \n"
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8084${CL}"
\ No newline at end of file
diff --git a/ct/dashy.sh b/ct/dashy.sh
index 55f006027..a49f16115 100644
--- a/ct/dashy.sh
+++ b/ct/dashy.sh
@@ -1,103 +1,80 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://dashy.to/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \____ ______/ /_ __ __
- / / / / __ / ___/ __ \/ / / /
- / /_/ / /_/ (__ ) / / / /_/ /
-/_____/\__,_/____/_/ /_/\__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Dashy"
-var_disk="6"
+var_tags="dashboard"
var_cpu="2"
var_ram="2048"
+var_disk="6"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/dashy/public/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-
-RELEASE=$(curl -sL https://api.github.com/repos/Lissy93/dashy/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
-if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop dashy
- msg_ok "Stopped ${APP}"
-
- msg_info "Backing up conf.yml"
- cd ~
- if [[ -f /opt/dashy/public/conf.yml ]]; then
- cp -R /opt/dashy/public/conf.yml conf.yml
- else
- cp -R /opt/dashy/user-data/conf.yml conf.yml
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/dashy/public/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
fi
- msg_ok "Backed up conf.yml"
- msg_info "Updating ${APP} to ${RELEASE}"
- rm -rf /opt/dashy
- mkdir -p /opt/dashy
- wget -qO- https://github.com/Lissy93/dashy/archive/refs/tags/${RELEASE}.tar.gz | tar -xz -C /opt/dashy --strip-components=1
- cd /opt/dashy
- npm install
- npm run build
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ RELEASE=$(curl -sL https://api.github.com/repos/Lissy93/dashy/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop dashy
+ msg_ok "Stopped ${APP}"
- msg_info "Restoring conf.yml"
- cd ~
- cp -R conf.yml /opt/dashy/user-data
- msg_ok "Restored conf.yml"
+ msg_info "Backing up conf.yml"
+ cd ~
+ if [[ -f /opt/dashy/public/conf.yml ]]; then
+ cp -R /opt/dashy/public/conf.yml conf.yml
+ else
+ cp -R /opt/dashy/user-data/conf.yml conf.yml
+ fi
+ msg_ok "Backed up conf.yml"
- msg_info "Cleaning"
- rm -rf conf.yml /opt/dashy/public/conf.yml
- msg_ok "Cleaned"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ rm -rf /opt/dashy
+ mkdir -p /opt/dashy
+ wget -qO- https://github.com/Lissy93/dashy/archive/refs/tags/${RELEASE}.tar.gz | tar -xz -C /opt/dashy --strip-components=1
+ cd /opt/dashy
+ npm install
+ npm run build
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
- msg_info "Starting Dashy"
- systemctl start dashy
- msg_ok "Started Dashy"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Restoring conf.yml"
+ cd ~
+ cp -R conf.yml /opt/dashy/user-data
+ msg_ok "Restored conf.yml"
+
+ msg_info "Cleaning"
+ rm -rf conf.yml /opt/dashy/public/conf.yml
+ msg_ok "Cleaned"
+
+ msg_info "Starting Dashy"
+ systemctl start dashy
+ msg_ok "Started Dashy"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -105,5 +82,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:4000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4000${CL}"
\ No newline at end of file
diff --git a/ct/debian.sh b/ct/debian.sh
index 98b2b3990..3888f98ed 100644
--- a/ct/debian.sh
+++ b/ct/debian.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.debian.org/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ _
- / __ \___ / /_ (_)___ ____
- / / / / _ \/ __ \/ / __ `/ __ \
- / /_/ / __/ /_/ / / /_/ / / / /
-/_____/\___/_.___/_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Debian"
-var_disk="2"
+var_tags="os"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,3 +44,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/deconz.sh b/ct/deconz.sh
index 09f6f6d33..72e47b543 100644
--- a/ct/deconz.sh
+++ b/ct/deconz.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.phoscon.de/en/conbee2/software#deconz
-function header_info {
-clear
-cat <<"EOF"
- __ __________ _ _______
- ____/ /__ / ____/ __ \/ | / /__ /
- / __ / _ \/ / / / / / |/ / / /
-/ /_/ / __/ /___/ /_/ / /| / / /__
-\__,_/\___/\____/\____/_/ |_/ /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="deCONZ"
-var_disk="4"
+var_tags="zigbee"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/deconz.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/deconz.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/deluge.sh b/ct/deluge.sh
index b46f385ef..e707da0a1 100644
--- a/ct/deluge.sh
+++ b/ct/deluge.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.deluge-torrent.org/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \___ / /_ ______ ____
- / / / / _ \/ / / / / __ `/ _ \
- / /_/ / __/ / /_/ / /_/ / __/
-/_____/\___/_/\__,_/\__, /\___/
- /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Deluge"
-var_disk="4"
+var_tags="torrent"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/deluged.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-pip3 install deluge[all] --upgrade
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/deluged.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ pip3 install deluge[all] --upgrade
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8112${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8112${CL}"
\ No newline at end of file
diff --git a/ct/docker.sh b/ct/docker.sh
index f5541ec22..36d2d973f 100644
--- a/ct/docker.sh
+++ b/ct/docker.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.docker.com/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \____ _____/ /_ __ _____
- / / / / __ \/ ___/ //_/ _ \/ ___/
- / /_/ / /_/ / /__/ ,< / __/ /
-/_____/\____/\___/_/|_|\___/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Docker"
-var_disk="4"
+var_tags="docker"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated ${APP} LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
}
start
@@ -67,3 +44,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/dockge.sh b/ct/dockge.sh
index 2de514ba4..7e659ff9c 100644
--- a/ct/dockge.sh
+++ b/ct/dockge.sh
@@ -1,66 +1,43 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://dockge.kuma.pet/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \____ _____/ /______ ____
- / / / / __ \/ ___/ //_/ __ `/ _ \
- / /_/ / /_/ / /__/ ,< / /_/ / __/
-/_____/\____/\___/_/|_|\__, /\___/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Dockge"
-var_disk="18"
+var_tags="docker"
var_cpu="2"
var_ram="2048"
+var_disk="18"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/dockge ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-cd /opt/dockge
-docker compose pull
-docker compose up -d
-msg_ok "Updated ${APP}"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/dockge ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ cd /opt/dockge
+ docker compose pull
+ docker compose up -d
+ msg_ok "Updated ${APP}"
+ exit
}
start
@@ -68,5 +45,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5001${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5001${CL}"
\ No newline at end of file
diff --git a/ct/emby.sh b/ct/emby.sh
index 64bac5051..ccc668119 100644
--- a/ct/emby.sh
+++ b/ct/emby.sh
@@ -1,76 +1,53 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://emby.media/
-function header_info {
-clear
-cat <<"EOF"
- ______ __
- / ____/___ ___ / /_ __ __
- / __/ / __ __ \/ __ \/ / / /
- / /___/ / / / / / /_/ / /_/ /
-/_____/_/ /_/ /_/_.___/\__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Emby"
-var_disk="8"
+var_tags="media"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="ubuntu"
var_version="22.04"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/emby-server ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-LATEST=$(curl -sL https://api.github.com/repos/MediaBrowser/Emby.Releases/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
-msg_info "Stopping ${APP}"
-systemctl stop emby-server
-msg_ok "Stopped ${APP}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/emby-server ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ LATEST=$(curl -sL https://api.github.com/repos/MediaBrowser/Emby.Releases/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
+ msg_info "Stopping ${APP}"
+ systemctl stop emby-server
+ msg_ok "Stopped ${APP}"
-msg_info "Updating ${APP}"
-wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_arm64.deb &>/dev/null
-dpkg -i emby-server-deb_${LATEST}_arm64.deb &>/dev/null
-rm emby-server-deb_${LATEST}_arm64.deb
-msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP}"
+ wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_amd64.deb &>/dev/null
+ dpkg -i emby-server-deb_${LATEST}_amd64.deb &>/dev/null
+ rm emby-server-deb_${LATEST}_amd64.deb
+ msg_ok "Updated ${APP}"
-msg_info "Starting ${APP}"
-systemctl start emby-server
-msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ${APP}"
+ systemctl start emby-server
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -78,5 +55,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8096${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8096${CL}"
diff --git a/ct/emqx.sh b/ct/emqx.sh
index 6d4229c67..330544bc1 100644
--- a/ct/emqx.sh
+++ b/ct/emqx.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.emqx.com/en
-function header_info {
-clear
-cat <<"EOF"
- ________ _______ _ __
- / ____/ |/ / __ \ | |/ /
- / __/ / /|_/ / / / / | /
- / /___/ / / / /_/ / / |
-/_____/_/ /_/\___\_\/_/|_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="EMQX"
-var_disk="4"
+var_tags="mqtt"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:18083${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:18083${CL}"
diff --git a/ct/ersatztv.sh b/ct/ersatztv.sh
index e2f52dba0..f64237702 100644
--- a/ct/ersatztv.sh
+++ b/ct/ersatztv.sh
@@ -1,83 +1,57 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
-# Source: https://github.com/ErsatzTV/ErsatzTV/
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://ersatztv.org/
-
-function header_info {
-clear
-cat <<"EOF"
- ______ __ _______ __
- / ____/_____________ _/ /_____/_ __/ | / /
- / __/ / ___/ ___/ __ `/ __/_ / / / | | / /
- / /___/ / (__ ) /_/ / /_ / /_/ / | |/ /
-/_____/_/ /____/\__,_/\__/ /___/_/ |___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="ErsatzTV"
-var_disk="5"
+var_tags="iptv"
var_cpu="1"
var_ram="1024"
+var_disk="5"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
function update_script() {
-header_info
-if [[ ! -d /opt/ErsatzTV ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/ErsatzTV ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
-msg_info "Stopping ErsatzTV"
-systemctl stop ersatzTV
-msg_ok "Stopped ErsatzTV"
+ msg_info "Stopping ErsatzTV"
+ systemctl stop ersatzTV
+ msg_ok "Stopped ErsatzTV"
-msg_info "Updating ErsatzTV"
-RELEASE=$(curl -s https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1)
-cp -R /opt/ErsatzTV/ ErsatzTV-backup
-rm ErsatzTV-backup/ErsatzTV
-rm -rf /opt/ErsatzTV
-wget -qO- "https://github.com/ErsatzTV/ErsatzTV/releases/download/${RELEASE}/ErsatzTV-${RELEASE}-linux-arm64.tar.gz" | tar -xz -C /opt
-mv "/opt/ErsatzTV-${RELEASE}-linux-arm64" /opt/ErsatzTV
-cp -R ErsatzTV-backup/* /opt/ErsatzTV/
-rm -rf ErsatzTV-backup
-msg_ok "Updated ErsatzTV"
+ msg_info "Updating ErsatzTV"
+ RELEASE=$(curl -s https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1)
+ cp -R /opt/ErsatzTV/ ErsatzTV-backup
+ rm ErsatzTV-backup/ErsatzTV
+ rm -rf /opt/ErsatzTV
+ wget -qO- "https://github.com/ErsatzTV/ErsatzTV/releases/download/${RELEASE}/ErsatzTV-${RELEASE}-linux-x64.tar.gz" | tar -xz -C /opt
+ mv "/opt/ErsatzTV-${RELEASE}-linux-x64" /opt/ErsatzTV
+ cp -R ErsatzTV-backup/* /opt/ErsatzTV/
+ rm -rf ErsatzTV-backup
+ msg_ok "Updated ErsatzTV"
-msg_info "Starting ErsatzTV"
-systemctl start ersatzTV
-msg_ok "Started ErsatzTV"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ErsatzTV"
+ systemctl start ersatzTV
+ msg_ok "Started ErsatzTV"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -85,5 +59,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:8409${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8409${CL}"
\ No newline at end of file
diff --git a/ct/esphome.sh b/ct/esphome.sh
index e86d11c8d..8b297f04d 100644
--- a/ct/esphome.sh
+++ b/ct/esphome.sh
@@ -1,76 +1,53 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://esphome.io/
-function header_info {
-clear
-cat <<"EOF"
- ___________ ____ __ __
- / ____/ ___// __ \/ / / /___ ____ ___ ___
- / __/ \__ \/ /_/ / /_/ / __ \/ __ `__ \/ _ \
- / /___ ___/ / ____/ __ / /_/ / / / / / / __/
-/_____//____/_/ /_/ /_/\____/_/ /_/ /_/\___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="ESPHome"
-var_disk="4"
+var_tags="automation"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/esphomeDashboard.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Stopping ESPHome"
-systemctl stop esphomeDashboard
-msg_ok "Stopped ESPHome"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/esphomeDashboard.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ESPHome"
+ systemctl stop esphomeDashboard
+ msg_ok "Stopped ESPHome"
-msg_info "Updating ESPHome"
-if [[ -d /srv/esphome ]]; then
- source /srv/esphome/bin/activate &>/dev/null
-fi
-pip3 install -U esphome &>/dev/null
-msg_ok "Updated ESPHome"
+ msg_info "Updating ESPHome"
+ if [[ -d /srv/esphome ]]; then
+ source /srv/esphome/bin/activate &>/dev/null
+ fi
+ pip3 install -U esphome &>/dev/null
+ msg_ok "Updated ESPHome"
-msg_info "Starting ESPHome"
-systemctl start esphomeDashboard
-msg_ok "Started ESPHome"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ESPHome"
+ systemctl start esphomeDashboard
+ msg_ok "Started ESPHome"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -78,5 +55,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:6052${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6052${CL}"
\ No newline at end of file
diff --git a/ct/evcc.sh b/ct/evcc.sh
index d7aa048ee..1e5e2670e 100644
--- a/ct/evcc.sh
+++ b/ct/evcc.sh
@@ -1,64 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://evcc.io/en/
-function header_info {
-clear
-cat <<"EOF"
- ___ _ ____________
- / _ \ | / / ___/ ___/
-/ __/ |/ / /__/ /__
-\___/|___/\___/\___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="evcc"
-var_disk="4"
+var_tags="solar;ev;automation"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/evcc-stable.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating evcc LXC"
-apt update &>/dev/null
-apt --only-upgrade install -y evcc &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/evcc-stable.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating evcc LXC"
+ apt update &>/dev/null
+ apt --only-upgrade install -y evcc &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -66,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:7070${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7070${CL}"
\ No newline at end of file
diff --git a/ct/fenrus.sh b/ct/fenrus.sh
index c0764dd2f..477e312ec 100644
--- a/ct/fenrus.sh
+++ b/ct/fenrus.sh
@@ -1,87 +1,67 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# Co-Author: Scorpoon
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: Scorpoon
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/revenz/Fenrus
-function header_info {
-clear
-cat <<"EOF"
- ______
- / ____/__ ____ _______ _______
- / /_ / _ \/ __ \/ ___/ / / / ___/
- / __/ / __/ / / / / / /_/ (__ )
-/_/ \___/_/ /_/_/ \__,_/____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Fenrus"
-var_disk="4"
+var_tags="dashboard"
var_cpu="1"
var_ram="512"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/${APP} ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
-msg_info "Updating ${APP}"
-systemctl stop ${APP}
-git clone https://github.com/revenz/Fenrus.git
-cd Fenrus || exit
-gitVersionNumber=$(git rev-parse HEAD)
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/${APP} ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
+ msg_info "Updating ${APP}"
+ systemctl stop ${APP}
+ git clone https://github.com/revenz/Fenrus.git
+ cd Fenrus || exit
+ gitVersionNumber=$(git rev-parse HEAD)
-if [[ "${gitVersionNumber}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- mkdir /opt/fenrus-data-backup
- cp -r "/opt/${APP}/data/" /opt/fenrus-data-backup/data
- if [[ ! -d /opt/fenrus-data-backup/data ]]; then msg_error "Backup of data folder failed! exiting..."; rm -r /opt/fenrus-data-backup/; exit; fi
- export DOTNET_CLI_TELEMETRY_OPTOUT=1
- dotnet publish -c Release -o "/opt/${APP}/" Fenrus.csproj
- cp -r /opt/fenrus-data-backup/data/ "/opt/${APP}/"
- echo "${gitVersionNumber}" >"/opt/${APP}_version.txt"
- rm -r /opt/fenrus-data-backup/
- msg_ok "Updated $APP"
-else
- msg_ok "No update required. ${APP} is already up to date"
-fi
-cd ..
-rm -r Fenrus/
+ if [[ "${gitVersionNumber}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ mkdir /opt/fenrus-data-backup
+ cp -r "/opt/${APP}/data/" /opt/fenrus-data-backup/data
+ if [[ ! -d /opt/fenrus-data-backup/data ]]; then
+ msg_error "Backup of data folder failed! exiting..."
+ rm -r /opt/fenrus-data-backup/
+ exit
+ fi
+ export DOTNET_CLI_TELEMETRY_OPTOUT=1
+ dotnet publish -c Release -o "/opt/${APP}/" Fenrus.csproj
+ cp -r /opt/fenrus-data-backup/data/ "/opt/${APP}/"
+ echo "${gitVersionNumber}" >"/opt/${APP}_version.txt"
+ rm -r /opt/fenrus-data-backup/
+ msg_ok "Updated $APP"
+ else
+ msg_ok "No update required. ${APP} is already up to date"
+ fi
+ cd ..
+ rm -r Fenrus/
-systemctl start ${APP}
-exit
+ systemctl start ${APP}
+ exit
}
start
@@ -89,5 +69,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
diff --git a/ct/fhem.sh b/ct/fhem.sh
index dcc3359a9..45df0076a 100644
--- a/ct/fhem.sh
+++ b/ct/fhem.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://fhem.de/
-function header_info {
-clear
-cat <<"EOF"
- ________
- / ____/ /_ ___ ____ ___
- / /_ / __ \/ _ \/ __ `__ \
- / __/ / / / / __/ / / / / /
-/_/ /_/ /_/\___/_/ /_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
-APP="Fhem"
-var_disk="8"
+# App Default Values
+APP="FHEM"
+var_tags="automation"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/fhem.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/fhem.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8083${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8083${CL}"
\ No newline at end of file
diff --git a/ct/firefly.sh b/ct/firefly.sh
new file mode 100644
index 000000000..13d834893
--- /dev/null
+++ b/ct/firefly.sh
@@ -0,0 +1,84 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: quantumryuu
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://firefly-iii.org/
+
+# App Default Values
+APP="Firefly"
+var_tags="finance"
+var_cpu="1"
+var_ram="1024"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+header_info
+check_container_storage
+check_container_resources
+
+ if [[ ! -d /opt/firefly ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/firefly-iii/firefly-iii/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Apache2"
+ systemctl stop apache2
+ msg_ok "Stopped Apache2"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cp /opt/firefly/.env /opt/.env
+ cp -r /opt/firefly/storage /opt/storage
+ rm -rf /opt/firefly/*
+ cd /opt
+ wget -q "https://github.com/firefly-iii/firefly-iii/releases/download/v${RELEASE}/FireflyIII-v${RELEASE}.tar.gz"
+ tar -xzf FireflyIII-v${RELEASE}.tar.gz -C /opt/firefly --exclude='storage'
+ cd /opt/firefly
+ composer install --no-dev --no-interaction &>/dev/null
+ php artisan migrate --seed --force &>/dev/null
+ php artisan firefly:decrypt-all &>/dev/null
+ php artisan cache:clear &>/dev/null
+ php artisan view:clear &>/dev/null
+ php artisan firefly:upgrade-database &>/dev/null
+ php artisan firefly:laravel-passport-keys &>/dev/null
+ chown -R www-data:www-data /opt/firefly
+ chmod -R 775 /opt/firefly/storage
+
+ echo "${RELEASE}" >"/opt/${APP}_version.txt"
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Apache2"
+ systemctl start apache2
+ msg_ok "Started Apache2"
+
+ msg_info "Cleaning up"
+ rm -rf /opt/FireflyIII-v${RELEASE}.tar.gz
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/flaresolverr.sh b/ct/flaresolverr.sh
index f816efe01..15976ba69 100644
--- a/ct/flaresolverr.sh
+++ b/ct/flaresolverr.sh
@@ -1,70 +1,50 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# Co-Author: remz1337
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: remz1337
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/FlareSolverr/FlareSolverr
-function header_info {
-clear
-cat <<"EOF"
- ________ _____ __
- / ____/ /___ _________ / ___/____ / / _____ __________
- / /_ / / __ `/ ___/ _ \\__ \/ __ \/ / | / / _ \/ ___/ ___/
- / __/ / / /_/ / / / __/__/ / /_/ / /| |/ / __/ / / /
-/_/ /_/\__,_/_/ \___/____/\____/_/ |___/\___/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="FlareSolverr"
-var_disk="4"
+var_tags="proxy"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
header_info
- if [[ ! -f /etc/systemd/system/flaresolverr.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
- whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/flaresolverr.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
RELEASE=$(wget -q https://github.com/FlareSolverr/FlareSolverr/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
- if [[ ! -d /opt/flaresolverr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
- msg_info "Updating $APP LXC"
- systemctl stop flaresolverr
- cd /opt/flaresolverr
- git pull
- systemctl start flaresolverr
- msg_ok "Updated $APP LXC"
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Updating $APP LXC"
+ systemctl stop flaresolverr
+ wget -q https://github.com/FlareSolverr/FlareSolverr/releases/download/$RELEASE/flaresolverr_linux_x64.tar.gz
+ tar -xzf flaresolverr_linux_x64.tar.gz -C /opt
+ rm flaresolverr_linux_x64.tar.gz
+ systemctl start flaresolverr
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated $APP LXC"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
exit
}
@@ -72,10 +52,7 @@ start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 512
-pct set $CTID -cores 1
-msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8191${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8191${CL}"
\ No newline at end of file
diff --git a/ct/flowiseai.sh b/ct/flowiseai.sh
index 11dbb2831..5c510c11e 100644
--- a/ct/flowiseai.sh
+++ b/ct/flowiseai.sh
@@ -1,77 +1,50 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://flowiseai.com/
-function header_info {
-clear
-cat <<"EOF"
- ________ _ ___ ____
- / ____/ /___ _ __(_)_______ / | / _/
- / /_ / / __ \ | /| / / / ___/ _ \/ /| | / /
- / __/ / / /_/ / |/ |/ / (__ ) __/ ___ |_/ /
-/_/ /_/\____/|__/|__/_/____/\___/_/ |_/___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="FlowiseAI"
+var_tags="low-code"
var_disk="10"
var_cpu="4"
var_ram="4096"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/flowise.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
-msg_info "Updating ${APP}"
-systemctl stop flowise
-npm install -g flowise --upgrade
-systemctl start flowise
-msg_ok "Updated ${APP}"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/flowise.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ systemctl stop flowise
+ npm install -g flowise --upgrade
+ systemctl start flowise
+ msg_ok "Updated ${APP}"
+ exit
}
start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 2048
-pct set $CTID -cores 2
-msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/forgejo.sh b/ct/forgejo.sh
index a5ad32e21..bbcb9de82 100644
--- a/ct/forgejo.sh
+++ b/ct/forgejo.sh
@@ -1,83 +1,59 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://forgejo.org/
-function header_info {
- clear
- cat <<"EOF"
- ______ _
- / ____/___ _________ ___ (_)___
- / /_ / __ \/ ___/ __ `/ _ \ / / __ \
- / __/ / /_/ / / / /_/ / __/ / / /_/ /
-/_/ \____/_/ \__, /\___/_/ /\____/
- /____/ /___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Forgejo"
-var_disk="10"
+var_tags="git"
var_cpu="2"
var_ram="2048"
+var_disk="10"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/forgejo ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Stopping ${APP}"
-systemctl stop forgejo
-msg_ok "Stopped ${APP}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/forgejo ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop forgejo
+ msg_ok "Stopped ${APP}"
-msg_info "Updating ${APP}"
-RELEASE=$(curl -s https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | grep -oP '"tag_name":\s*"\K[^"]+' | sed 's/^v//')
-wget -qO forgejo-$RELEASE-linux-amd64 "https://codeberg.org/forgejo/forgejo/releases/download/v${RELEASE}/forgejo-${RELEASE}-linux-arm64"
-rm -rf /opt/forgejo/*
-cp -r forgejo-$RELEASE-linux-arm64 /opt/forgejo/forgejo-$RELEASE-linux-arm64
-chmod +x /opt/forgejo/forgejo-$RELEASE-linux-arm64
-ln -sf /opt/forgejo/forgejo-$RELEASE-linux-arm64 /usr/local/bin/forgejo
-msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP}"
+ RELEASE=$(curl -s https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | grep -oP '"tag_name":\s*"\K[^"]+' | sed 's/^v//')
+ wget -qO forgejo-$RELEASE-linux-amd64 "https://codeberg.org/forgejo/forgejo/releases/download/v${RELEASE}/forgejo-${RELEASE}-linux-amd64"
+ rm -rf /opt/forgejo/*
+ cp -r forgejo-$RELEASE-linux-amd64 /opt/forgejo/forgejo-$RELEASE-linux-amd64
+ chmod +x /opt/forgejo/forgejo-$RELEASE-linux-amd64
+ ln -sf /opt/forgejo/forgejo-$RELEASE-linux-amd64 /usr/local/bin/forgejo
+ msg_ok "Updated ${APP}"
-msg_info "Cleaning"
-rm -rf forgejo-$RELEASE-linux-arm64
-msg_ok "Cleaned"
+ msg_info "Cleaning"
+ rm -rf forgejo-$RELEASE-linux-amd64
+ msg_ok "Cleaned"
-msg_info "Starting ${APP}"
-systemctl start forgejo
-msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ${APP}"
+ systemctl start forgejo
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -85,5 +61,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/frigate.sh b/ct/frigate.sh
index d2b7c2fd0..0dda2fac0 100644
--- a/ct/frigate.sh
+++ b/ct/frigate.sh
@@ -1,78 +1,46 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Authors: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://frigate.video/
-function header_info {
- clear
- cat <<"EOF"
- ______ _ __
- / ____/____(_)___ _____ _/ /____
- / /_ / ___/ / __ `/ __ `/ __/ _ \
- / __/ / / / / /_/ / /_/ / /_/ __/
-/_/ /_/ /_/\__, /\__,_/\__/\___/
- /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Frigate"
-var_disk="20"
+var_tags="nvr"
var_cpu="4"
var_ram="4096"
+var_disk="20"
var_os="debian"
var_version="11"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
- if [[ ! -f /etc/systemd/system/frigate.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/frigate.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
msg_error "To update Frigate, create a new container and transfer your configuration."
- exit
+ exit
}
start
build_container
description
-msg_info "Setting Container to Normal Resources"
-STATUS=$(pct status $CTID | grep -oP '(?<=status: ).*')
-if [ "$STATUS" == "running" ]; then
- pct set $CTID -memory 1024
-else
- echo -e " ⚠️ ${RD}Container is not running. Will need to change memory to 1024MB manually.${CL}"
-fi
-msg_ok "Set Normal Resources"
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5000${CL} \n"
-echo -e "go2rtc should be reachable by going to the following URL.
- ${BL}http://${IP}:1984${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
\ No newline at end of file
diff --git a/ct/gitea.sh b/ct/gitea.sh
index 87400ccd8..f8912e585 100644
--- a/ct/gitea.sh
+++ b/ct/gitea.sh
@@ -1,71 +1,47 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# Co-author: Rogue-King
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: Rogue-King
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://about.gitea.com/
-function header_info {
-clear
-cat <<"EOF"
- ______ _ __
- / ____/(_)/ /____ ____ _
- / / __// // __/ _ \/ __ /
-/ /_/ // // /_/ __/ /_/ /
-\____//_/ \__/\___/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Gitea"
-var_disk="8"
+var_tags="git"
var_cpu="1"
var_ram="1024"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /usr/local/bin/gitea ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(wget -q https://github.com/go-gitea/gitea/releases/latest -O - | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//')
-msg_info "Updating $APP to ${RELEASE}"
-wget -q https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-arm64
-systemctl stop gitea
-rm -rf /usr/local/bin/gitea
-mv gitea* /usr/local/bin/gitea
-chmod +x /usr/local/bin/gitea
-systemctl start gitea
-msg_ok "Updated $APP Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /usr/local/bin/gitea ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(wget -q https://github.com/go-gitea/gitea/releases/latest -O - | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//')
+ msg_info "Updating $APP to ${RELEASE}"
+ wget -q https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-amd64
+ systemctl stop gitea
+ rm -rf /usr/local/bin/gitea
+ mv gitea* /usr/local/bin/gitea
+ chmod +x /usr/local/bin/gitea
+ systemctl start gitea
+ msg_ok "Updated $APP Successfully"
+ exit
}
start
@@ -73,5 +49,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/glance.sh b/ct/glance.sh
new file mode 100644
index 000000000..f4f46bf8a
--- /dev/null
+++ b/ct/glance.sh
@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: kristocopani
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/glanceapp/glance
+
+# App Default Values
+APP="Glance"
+var_tags="dashboard"
+var_cpu="1"
+var_ram="512"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -f /etc/systemd/system/glance.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ RELEASE=$(curl -s https://api.github.com/repos/glanceapp/glance/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop glance
+ msg_ok "Stopped Service"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ wget -q https://github.com/glanceapp/glance/releases/download/v${RELEASE}/glance-linux-amd64.tar.gz
+ rm -rf /opt/glance/glance
+ tar -xzf glance-linux-amd64.tar.gz -C /opt/glance
+ echo "${RELEASE}" >"/opt/${APP}_version.txt"
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Service"
+ systemctl start glance
+ msg_ok "Started Service"
+
+ msg_info "Cleaning up"
+ rm -rf /opt/glance-linux-amd64.tar.gz
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
\ No newline at end of file
diff --git a/ct/glpi.sh b/ct/glpi.sh
new file mode 100644
index 000000000..ab5dcad17
--- /dev/null
+++ b/ct/glpi.sh
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: tteck (tteckster)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+
+# App Default Values
+APP="GLPI"
+var_tags="asset-management;foss"
+var_cpu="2"
+var_ram="2048"
+var_disk="10"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -d /opt/glpi ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/glpi-project/glpi/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_error "Ther is currently no automatic update function for ${APP}."
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:80${CL}"
diff --git a/ct/go2rtc.sh b/ct/go2rtc.sh
index 58506b617..d4dc7a744 100644
--- a/ct/go2rtc.sh
+++ b/ct/go2rtc.sh
@@ -1,70 +1,46 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/AlexxIT/go2rtc
-function header_info {
-clear
-cat <<"EOF"
- ___ __
- ____ _____ |__ \ _____/ /______
- / __ `/ __ \__/ // ___/ __/ ___/
- / /_/ / /_/ / __// / / /_/ /__
- \__, /\____/____/_/ \__/\___/
-/____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="go2rtc"
-var_disk="4"
+var_tags="recorder;video"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/go2rtc ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-systemctl stop go2rtc
-cd /opt/go2rtc
-rm go2rtc_linux_amd64
-wget -q https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_arm64
-chmod +x go2rtc_linux_arm64
-systemctl start go2rtc
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/go2rtc ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ systemctl stop go2rtc
+ cd /opt/go2rtc
+ rm go2rtc_linux_amd64
+ wget -q https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64
+ chmod +x go2rtc_linux_amd64
+ systemctl start go2rtc
+ msg_ok "Updated $APP"
+ exit
}
start
@@ -72,5 +48,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:1984${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:1984${CL}"
\ No newline at end of file
diff --git a/ct/gokapi.sh b/ct/gokapi.sh
index 138748436..51be914b0 100644
--- a/ct/gokapi.sh
+++ b/ct/gokapi.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/Forceu/Gokapi
-function header_info {
-clear
-cat <<"EOF"
- ______ __ _
- / ____/___ / /______ _____ (_)
- / / __/ __ \/ //_/ __ `/ __ \/ /
-/ /_/ / /_/ / ,< / /_/ / /_/ / /
-\____/\____/_/|_|\__,_/ .___/_/
- /_/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Gokapi"
-var_disk="4"
+var_tags="file;sharing"
var_cpu="1"
var_ram="512"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/gokapi ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/gokapi ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -64,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:53842/setup${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:53842/setup${CL}"
\ No newline at end of file
diff --git a/ct/gotify.sh b/ct/gotify.sh
index 89eda7515..b3419c5e2 100644
--- a/ct/gotify.sh
+++ b/ct/gotify.sh
@@ -1,84 +1,61 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://gotify.net/
-function header_info {
-clear
-cat <<"EOF"
- ______ __ _ ____
- / ____/___ / /_(_) __/_ __
- / / __/ __ \/ __/ / /_/ / / /
-/ /_/ / /_/ / /_/ / __/ /_/ /
-\____/\____/\__/_/_/ \__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Gotify"
-var_disk="2"
+var_tags="notification"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/gotify ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/gotify ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
-RELEASE=$(curl -s https://api.github.com/repos/gotify/server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop gotify
- msg_ok "Stopped ${APP}"
+ RELEASE=$(curl -s https://api.github.com/repos/gotify/server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop gotify
+ msg_ok "Stopped ${APP}"
- msg_info "Updating ${APP} to ${RELEASE}"
- cd /opt/gotify
- wget -q https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip
- unzip -oq gotify-linux-amd64.zip
- rm -rf gotify-linux-amd64.zip
- chmod +x gotify-linux-amd64
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cd /opt/gotify
+ wget -q https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip
+ unzip -oq gotify-linux-amd64.zip
+ rm -rf gotify-linux-amd64.zip
+ chmod +x gotify-linux-amd64
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
- msg_info "Starting ${APP}"
- systemctl start gotify
- msg_ok "Started ${APP}"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Starting ${APP}"
+ systemctl start gotify
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -86,5 +63,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP} ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/grafana.sh b/ct/grafana.sh
index 8673256f3..15c4ea0b0 100644
--- a/ct/grafana.sh
+++ b/ct/grafana.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://grafana.com/
-function header_info {
-clear
-cat <<"EOF"
- ______ ____
- / ____/________ _/ __/___ _____ ____ _
- / / __/ ___/ __ / /_/ __ / __ \/ __ /
-/ /_/ / / / /_/ / __/ /_/ / / / / /_/ /
-\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Grafana"
-var_disk="2"
+var_tags="monitoring;visualization"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/grafana.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/grafana.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/grist.sh b/ct/grist.sh
new file mode 100644
index 000000000..4c4479f64
--- /dev/null
+++ b/ct/grist.sh
@@ -0,0 +1,80 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Source: https://github.com/gristlabs/grist-core
+# Author: tteck (tteckster)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+
+# App Default Values
+APP="Grist"
+var_tags="database;spreadsheet"
+var_cpu="1"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -d /opt/grist ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ RELEASE=$(curl -s https://api.github.com/repos/gristlabs/grist-core/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+
+ msg_info "Stopping ${APP} Service"
+ systemctl stop grist
+ msg_ok "Stopped ${APP} Service"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ rm -rf grist_bak
+ mv grist grist_bak
+ wget -q https://github.com/gristlabs/grist-core/archive/refs/tags/v${RELEASE}.zip
+ unzip -q v$RELEASE.zip
+ mv grist-core-${RELEASE} grist
+ cp -n /opt/grist_bak/.env /opt/grist/.env
+ cd grist
+ yarn install >/dev/null 2>&1
+ yarn run build:prod >/dev/null 2>&1
+ yarn run install:python >/dev/null 2>&1
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting ${APP} Service"
+ systemctl start grist
+ msg_ok "Started ${APP} Service"
+
+ msg_info "Cleaning up"
+ rm -rf /opt/v$RELEASE.zip
+ msg_ok "Cleaned"
+
+ msg_ok "Updated Successfully!\n"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}Grist: http://${IP}:8484${CL}"
diff --git a/ct/grocy.sh b/ct/grocy.sh
index 1bc9e4665..ebc0d4091 100644
--- a/ct/grocy.sh
+++ b/ct/grocy.sh
@@ -1,75 +1,52 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://grocy.info/
-function header_info {
-clear
-cat <<"EOF"
- ____ __________ _______ __
- / __ / ___/ __ \/ ___/ / / /
- / /_/ / / / /_/ / /__/ /_/ /
- \__, /_/ \____/\___/\__, /
-/____/ /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="grocy"
-var_disk="2"
+var_tags="grocery;household"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apache2/sites-available/grocy.conf ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-php_version=$(php -v | head -n 1 | awk '{print $2}')
-if [[ ! $php_version == "8.3"* ]]; then
- msg_info "Updating PHP"
- curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
- echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ bookworm main" >/etc/apt/sources.list.d/php.list
- apt-get update
- apt-get install -y php8.3 php8.3-cli php8.3-{bz2,curl,mbstring,intl,sqlite3,fpm,gd,zip,xml}
- systemctl reload apache2
- apt autoremove
- msg_ok "Updated PHP"
-fi
-msg_info "Updating ${APP}"
-bash /var/www/html/update.sh
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apache2/sites-available/grocy.conf ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ php_version=$(php -v | head -n 1 | awk '{print $2}')
+ if [[ ! $php_version == "8.3"* ]]; then
+ msg_info "Updating PHP"
+ curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
+ echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ bookworm main" >/etc/apt/sources.list.d/php.list
+ apt-get update
+ apt-get install -y php8.3 php8.3-cli php8.3-{bz2,curl,mbstring,intl,sqlite3,fpm,gd,zip,xml}
+ systemctl reload apache2
+ apt autoremove
+ msg_ok "Updated PHP"
+ fi
+ msg_info "Updating ${APP}"
+ bash /var/www/html/update.sh
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -77,5 +54,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/headscale.sh b/ct/headscale.sh
index 9f2b7d6ce..a6bba636c 100644
--- a/ct/headscale.sh
+++ b/ct/headscale.sh
@@ -1,82 +1,58 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/juanfont/headscale
-function header_info {
-clear
-cat <<"EOF"
- __ __ __ __
- / / / /__ ____ _____/ /_____________ _/ /__
- / /_/ / _ \/ __ `/ __ / ___/ ___/ __ `/ / _ \
- / __ / __/ /_/ / /_/ (__ ) /__/ /_/ / / __/
-/_/ /_/\___/\__,_/\__,_/____/\___/\__,_/_/\___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Headscale"
-var_disk="2"
+var_tags="tailscale"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /etc/headscale ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/headscale ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/juanfont/headscale/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop headscale
+ msg_ok "Stopped ${APP}"
-RELEASE=$(curl -s https://api.github.com/repos/juanfont/headscale/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop headscale
- msg_ok "Stopped ${APP}"
+ msg_info "Updating $APP to v${RELEASE}"
+ wget -q https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_amd64.deb
+ dpkg -i headscale_${RELEASE}_linux_amd64.deb
+ rm headscale_${RELEASE}_linux_amd64.deb
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated $APP to ${RELEASE}"
- msg_info "Updating $APP to v${RELEASE}"
- wget -q https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_arm64.deb
- dpkg -i headscale_${RELEASE}_linux_arm64.deb
- rm headscale_${RELEASE}_linux_arm64.deb
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated $APP to ${RELEASE}"
-
- msg_info "Starting ${APP}"
- systemctl start headscale
- msg_ok "Started ${APP}"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Starting ${APP}"
+ systemctl start headscale
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -84,3 +60,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/heimdall-dashboard.sh b/ct/heimdall-dashboard.sh
index 6f8a163e6..355490792 100644
--- a/ct/heimdall-dashboard.sh
+++ b/ct/heimdall-dashboard.sh
@@ -1,105 +1,77 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://heimdall.site/
-function header_info {
-clear
-cat <<"EOF"
- _ _ _ _ ___ _ _ _
- /\ /\___(_)_ __ ___ __| | __ _| | | / \__ _ ___| |__ | |__ ___ __ _ _ __ __| |
- / /_/ / _ \ | '_ ` _ \ / _` |/ _` | | | / /\ / _` / __| '_ \| '_ \ / _ \ / _` | '__/ _` |
-/ __ / __/ | | | | | | (_| | (_| | | | / /_// (_| \__ \ | | | |_) | (_) | (_| | | | (_| |
-\/ /_/ \___|_|_| |_| |_|\__,_|\__,_|_|_| /___,' \__,_|___/_| |_|_.__/ \___/ \__,_|_| \__,_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Heimdall-Dashboard"
-var_disk="2"
+var_tags="dashboard"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/Heimdall ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -sX GET "https://api.github.com/repos/linuxserver/Heimdall/releases/latest" | awk '/tag_name/{print $4;exit}' FS='[""]')
-if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop heimdall
- sleep 1
- msg_ok "Stopped ${APP}"
-
- msg_info "Backing up Data"
- cp -R /opt/Heimdall/database database-backup
- cp -R /opt/Heimdall/public public-backup
- sleep 1
- msg_ok "Backed up Data"
-
- msg_info "Updating Heimdall Dashboard to ${RELEASE}"
- wget -q https://github.com/linuxserver/Heimdall/archive/${RELEASE}.tar.gz
- tar xzf ${RELEASE}.tar.gz
- VER=$(curl -s https://api.github.com/repos/linuxserver/Heimdall/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
- cp -R Heimdall-${VER}/* /opt/Heimdall
- cd /opt/Heimdall
- apt-get install -y composer &>/dev/null
- COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload &>/dev/null
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated Heimdall Dashboard to ${RELEASE}"
-
- msg_info "Restoring Data"
- cd ~
- cp -R database-backup/* /opt/Heimdall/database
- cp -R public-backup/* /opt/Heimdall/public
- sleep 1
- msg_ok "Restored Data"
-
- msg_info "Cleanup"
- rm -rf {${RELEASE}.tar.gz,Heimdall-${VER},public-backup,database-backup,Heimdall}
- sleep 1
- msg_ok "Cleaned"
-
- msg_info "Starting ${APP}"
- systemctl start heimdall.service
- sleep 2
- msg_ok "Started ${APP}"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}."
-fi
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/Heimdall ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -sX GET "https://api.github.com/repos/linuxserver/Heimdall/releases/latest" | awk '/tag_name/{print $4;exit}' FS='[""]')
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop heimdall
+ sleep 1
+ msg_ok "Stopped ${APP}"
+ msg_info "Backing up Data"
+ cp -R /opt/Heimdall/database database-backup
+ cp -R /opt/Heimdall/public public-backup
+ sleep 1
+ msg_ok "Backed up Data"
+ msg_info "Updating Heimdall Dashboard to ${RELEASE}"
+ wget -q https://github.com/linuxserver/Heimdall/archive/${RELEASE}.tar.gz
+ tar xzf ${RELEASE}.tar.gz
+ VER=$(curl -s https://api.github.com/repos/linuxserver/Heimdall/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ cp -R Heimdall-${VER}/* /opt/Heimdall
+ cd /opt/Heimdall
+ apt-get install -y composer &>/dev/null
+ COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated Heimdall Dashboard to ${RELEASE}"
+ msg_info "Restoring Data"
+ cd ~
+ cp -R database-backup/* /opt/Heimdall/database
+ cp -R public-backup/* /opt/Heimdall/public
+ sleep 1
+ msg_ok "Restored Data"
+ msg_info "Cleanup"
+ rm -rf {${RELEASE}.tar.gz,Heimdall-${VER},public-backup,database-backup,Heimdall}
+ sleep 1
+ msg_ok "Cleaned"
+ msg_info "Starting ${APP}"
+ systemctl start heimdall.service
+ sleep 2
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}."
+ fi
+ exit
}
start
@@ -107,5 +79,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:7990${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7990${CL}"
\ No newline at end of file
diff --git a/ct/hivemq.sh b/ct/hivemq.sh
index ed2b55c5b..4093ff505 100644
--- a/ct/hivemq.sh
+++ b/ct/hivemq.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.hivemq.com/
-function header_info {
-clear
-cat <<"EOF"
- __ ___ __ _______ ____________
- / / / (_) _____ / |/ / __ \ / ____/ ____/
- / /_/ / / | / / _ \/ /|_/ / / / / / / / __/
- / __ / /| |/ / __/ / / / /_/ / / /___/ /___
-/_/ /_/_/ |___/\___/_/ /_/\___\_\ \____/_____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="HiveMQ"
-var_disk="4"
+var_tags="mqtt"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -64,3 +41,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/hoarder.sh b/ct/hoarder.sh
new file mode 100644
index 000000000..ea8e40ce9
--- /dev/null
+++ b/ct/hoarder.sh
@@ -0,0 +1,82 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz) & vhsdream
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://hoarder.app/
+
+# App Default Values
+APP="Hoarder"
+var_tags="bookmark"
+var_cpu="2"
+var_ram="4096"
+var_disk="8"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/hoarder ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/hoarder-app/hoarder/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ PREV_RELEASE=$(cat /opt/${APP}_version.txt)
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "${PREV_RELEASE}" ]]; then
+ msg_info "Stopping Services"
+ systemctl stop hoarder-web hoarder-workers hoarder-browser
+ msg_ok "Stopped Services"
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ mv /opt/hoarder/.env /opt/.env
+ rm -rf /opt/hoarder
+ wget -q "https://github.com/hoarder-app/hoarder/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q v${RELEASE}.zip
+ mv hoarder-${RELEASE} /opt/hoarder
+ cd /opt/hoarder/apps/web
+ pnpm install --frozen-lockfile &>/dev/null
+ pnpm exec next build --experimental-build-mode compile &>/dev/null
+ cp -r /opt/hoarder/apps/web/.next/standalone/apps/web/server.js /opt/hoarder/apps/web
+ cd /opt/hoarder/apps/workers
+ pnpm install --frozen-lockfile &>/dev/null
+ export DATA_DIR=/opt/hoarder_data
+ cd /opt/hoarder/packages/db
+ pnpm migrate &>/dev/null
+ mv /opt/.env /opt/hoarder/.env
+ sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /opt/hoarder/.env
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Services"
+ systemctl start hoarder-browser hoarder-workers hoarder-web
+ msg_ok "Started Services"
+ msg_info "Cleaning up"
+ rm -R /opt/v${RELEASE}.zip
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/homarr.sh b/ct/homarr.sh
index 315b893bb..94c103751 100644
--- a/ct/homarr.sh
+++ b/ct/homarr.sh
@@ -1,74 +1,79 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://homarr.dev/
-function header_info {
-clear
-cat <<"EOF"
- __ __
- / / / /___ ____ ___ ____ ___________
- / /_/ / __ \/ __ `__ \/ __ `/ ___/ ___/
- / __ / /_/ / / / / / / /_/ / / / /
-/_/ /_/\____/_/ /_/ /_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Homarr"
-var_disk="8"
+var_tags="arr;dashboard"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/homarr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP (Patience)"
-systemctl stop homarr
-cd /opt/homarr
-if ! git pull; then
- echo "Already up to date."
- systemctl start homarr
- echo "No update required."
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/homarr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/ajnart/homarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Services"
+ systemctl stop homarr
+ msg_ok "Services Stopped"
+
+ msg_info "Backing up Data"
+ mkdir -p /opt/homarr-data-backup
+ cp /opt/homarr/.env /opt/homarr-data-backup/.env
+ cp /opt/homarr/database/db.sqlite /opt/homarr-data-backup/db.sqlite
+ cp -r /opt/homarr/data/configs /opt/homarr-data-backup/configs
+ msg_ok "Backed up Data"
+
+ msg_info "Updating ${APP} to ${RELEASE}"
+ wget -q "https://github.com/ajnart/homarr/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q v${RELEASE}.zip
+ rm -rf v${RELEASE}.zip
+ rm -rf /opt/homarr
+ mv homarr-${RELEASE} /opt/homarr
+ mv /opt/homarr-data-backup/.env /opt/homarr/.env
+ cd /opt/homarr
+ yarn install &>/dev/null
+ yarn build &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP}"
+
+ msg_info "Restoring Data"
+ rm -rf /opt/homarr/data/configs
+ mv /opt/homarr-data-backup/configs /opt/homarr/data/configs
+ mv /opt/homarr-data-backup/db.sqlite /opt/homarr/database/db.sqlite
+ yarn db:migrate &>/dev/null
+ rm -rf /opt/homarr-data-backup
+ msg_ok "Restored Data"
+
+ msg_info "Starting Services"
+ systemctl start homarr
+ msg_ok "Started Services"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
exit
-fi
-yarn install
-yarn build
-systemctl start homarr
-msg_ok "Updated $APP"
-exit
}
start
@@ -76,5 +81,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/homeassistant-core.sh b/ct/homeassistant-core.sh
index 560767a5b..3c88224ae 100644
--- a/ct/homeassistant-core.sh
+++ b/ct/homeassistant-core.sh
@@ -1,58 +1,33 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.home-assistant.io/
-function header_info {
- clear
- cat <<"EOF"
- _ _ _ _ ___
- /\ /\___ _ __ ___ ___ /_\ ___ ___(_)___| |_ __ _ _ __ | |_ / __\___ _ __ ___
- / /_/ / _ \| '_ ` _ \ / _ \ //_\\/ __/ __| / __| __/ _` | '_ \| __| / / / _ \| '__/ _ \
-/ __ / (_) | | | | | | __/ / _ \__ \__ \ \__ \ || (_| | | | | |_ / /__| (_) | | | __/
-\/ /_/ \___/|_| |_| |_|\___| \_/ \_/___/___/_|___/\__\__,_|_| |_|\__| \____/\___/|_| \___|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Home Assistant-Core"
-var_disk="8"
+var_tags="automation;smarthome"
var_cpu="2"
var_ram="1024"
+var_disk="8"
var_os="ubuntu"
var_version="24.04"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
if [[ ! -d /srv/homeassistant ]]; then
msg_error "No ${APP} Installation Found!"
exit
@@ -64,7 +39,6 @@ function update_script() {
"2" "Install HACS" OFF \
"3" "Install FileBrowser" OFF \
3>&1 1>&2 2>&3)
- header_info
if [ "$UPD" == "1" ]; then
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SELECT BRANCH" --yesno "Use Beta Branch?" 10 58); then
clear
@@ -77,7 +51,9 @@ function update_script() {
echo -e "${GN}Updating to Stable Version${CL}"
BR=""
fi
- if [[ "$PY" == "python3.11" ]]; then echo -e "⚠️ Home Assistant will soon require Python 3.12."; fi
+ if [[ "$PY" =~ ^python3\.(11|12)\.[0-9]+$ ]]; then
+ echo -e "⚠️ Home Assistant will soon require Python 3.13.x";
+ fi
msg_info "Stopping Home Assistant"
systemctl stop homeassistant
@@ -111,13 +87,13 @@ function update_script() {
read -r -p "Would you like to use No Authentication? " prompt
msg_info "Installing FileBrowser"
RELEASE=$(curl -fsSL https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g')
- curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/$RELEASE/linux-arm64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
+ curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/$RELEASE/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
filebrowser config init -a '0.0.0.0' &>/dev/null
filebrowser config set -a '0.0.0.0' &>/dev/null
filebrowser config set --auth.method=noauth &>/dev/null
- filebrowser users add ID 1 --perm.admin &>/dev/null
+ filebrowser users add ID 1 --perm.admin &>/dev/null
else
filebrowser config init -a '0.0.0.0' &>/dev/null
filebrowser config set -a '0.0.0.0' &>/dev/null
@@ -152,5 +128,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8123${CL}"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8123${CL}"
diff --git a/ct/homeassistant.sh b/ct/homeassistant.sh
index 0c3ccf1aa..3c6e74880 100644
--- a/ct/homeassistant.sh
+++ b/ct/homeassistant.sh
@@ -1,58 +1,33 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.home-assistant.io/
-function header_info {
- clear
- cat <<"EOF"
- __ __ ___ _ __ __
- / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_
- / /_/ / __ \/ __ __ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ / __ \/ __/
- / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_
-/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Home Assistant"
-var_disk="16"
+var_tags="automation;smarthome"
var_cpu="2"
var_ram="2048"
+var_disk="16"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
if [[ ! -d /var/lib/docker/volumes/hass_config/_data ]]; then
msg_error "No ${APP} Installation Found!"
exit
@@ -63,7 +38,7 @@ function update_script() {
"3" "Install HACS" OFF \
"4" "Install FileBrowser" OFF \
3>&1 1>&2 2>&3)
- header_info
+
if [ "$UPD" == "1" ]; then
msg_info "Updating All Containers"
CONTAINER_LIST="${1:-$(docker ps -q)}"
@@ -102,7 +77,7 @@ function update_script() {
IP=$(hostname -I | awk '{print $1}')
msg_info "Installing FileBrowser"
RELEASE=$(curl -fsSL https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g')
- curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-arm64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
+ curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
filebrowser config init -a '0.0.0.0' &>/dev/null
filebrowser config set -a '0.0.0.0' &>/dev/null
filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null
@@ -135,7 +110,7 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8123${CL}
-Portainer should be reachable by going to the following URL.
- ${BL}https://${IP}:9443${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}HA: http://${IP}:8123${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}Portainer: http://${IP}:9443${CL}"
\ No newline at end of file
diff --git a/ct/homebox.sh b/ct/homebox.sh
index 65dcffc35..14f52ee66 100644
--- a/ct/homebox.sh
+++ b/ct/homebox.sh
@@ -1,88 +1,62 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck | Co-Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://homebox.software/en/
-function header_info {
-clear
-cat <<"EOF"
- __ __ ____
- / / / /___ ____ ___ ___ / __ )____ _ __
- / /_/ / __ \/ __ `__ \/ _ \/ __ / __ \| |/_/
- / __ / /_/ / / / / / / __/ /_/ / /_/ /> <
-/_/ /_/\____/_/ /_/ /_/\___/_____/\____/_/|_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="HomeBox"
-var_disk="4"
+var_tags="inventory;household"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
function update_script() {
-header_info
-if [[ ! -f /opt/homebox ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-RELEASE=$(curl -s https://api.github.com/repos/sysadminsmedia/homebox/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop homebox
- msg_ok "${APP} Stopped"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /opt/homebox ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/sysadminsmedia/homebox/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop homebox
+ msg_ok "${APP} Stopped"
- msg_info "Updating ${APP} to ${RELEASE}"
- cd /opt
- rm -rf homebox_bak
- mv homebox homebox_bak
- wget -qO- https://github.com/sysadminsmedia/homebox/releases/download/${RELEASE}/homebox_Linux_x86_64.tar.gz | tar -xzf - -C /opt
- chmod +x /opt/homebox
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated Homebox"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cd /opt
+ rm -rf homebox_bak
+ rm -rf /tmp/homebox.tar.gz
+ mv homebox homebox_bak
+ wget -qO /tmp/homebox.tar.gz https://github.com/sysadminsmedia/homebox/releases/download/${RELEASE}/homebox_Linux_x86_64.tar.gz
+ tar -xzf /tmp/homebox.tar.gz -C /opt
+ chmod +x /opt/homebox
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated Homebox"
- msg_info "Starting ${APP}"
- systemctl start homebox
- msg_ok "Started ${APP}"
+ msg_info "Starting ${APP}"
+ systemctl start homebox
+ msg_ok "Started ${APP}"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -90,5 +64,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:7745${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7745${CL}"
\ No newline at end of file
diff --git a/ct/homebridge.sh b/ct/homebridge.sh
index 7c1593e22..b39fe820c 100644
--- a/ct/homebridge.sh
+++ b/ct/homebridge.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://homebridge.io/
-function header_info {
-clear
-cat <<"EOF"
- __ ______ __ _____________ ____ ________ ____________
- / / / / __ \/ |/ / ____/ __ )/ __ \/ _/ __ \/ ____/ ____/
- / /_/ / / / / /|_/ / __/ / __ / /_/ // // / / / / __/ __/
- / __ / /_/ / / / / /___/ /_/ / _, _// // /_/ / /_/ / /___
-/_/ /_/\____/_/ /_/_____/_____/_/ |_/___/_____/\____/_____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Homebridge"
-var_disk="4"
+var_tags="smarthome;homekit"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/homebridge.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get install -y homebridge &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/homebridge.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get install -y homebridge &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8581${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8581${CL}"
\ No newline at end of file
diff --git a/ct/homepage.sh b/ct/homepage.sh
index 8250d56d1..98a2c40d5 100644
--- a/ct/homepage.sh
+++ b/ct/homepage.sh
@@ -1,88 +1,67 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://gethomepage.dev/
-function header_info {
-clear
-cat <<"EOF"
- __ __
- / / / /___ ____ ___ ___ ____ ____ _____ ____
- / /_/ / __ \/ __ `__ \/ _ \/ __ \/ __ `/ __ `/ _ \
- / __ / /_/ / / / / / / __/ /_/ / /_/ / /_/ / __/
-/_/ /_/\____/_/ /_/ /_/\___/ .___/\__,_/\__, /\___/
- /_/ /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Homepage"
-var_disk="3"
+var_tags="dashboard"
var_cpu="2"
var_ram="1024"
+var_disk="3"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/homepage ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
- if ! command -v npm >/dev/null 2>&1; then
- echo "Installing NPM..."
- apt-get install -y npm >/dev/null 2>&1
- npm install -g pnpm >/dev/null 2>&1
- echo "Installed NPM..."
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/homepage ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
fi
-fi
-RELEASE=$(curl -s https://api.github.com/repos/gethomepage/homepage/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- msg_info "Updating Homepage to v${RELEASE} (Patience)"
- systemctl stop homepage
- wget -q https://github.com/gethomepage/homepage/archive/refs/tags/v${RELEASE}.tar.gz
- tar -xzf v${RELEASE}.tar.gz
- rm -rf v${RELEASE}.tar.gz
- cp -r homepage-${RELEASE}/* /opt/homepage/
- rm -rf homepage-${RELEASE}
- cd /opt/homepage
- npx update-browserslist-db@latest
- pnpm install
- pnpm build
- systemctl start homepage
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated Homepage to v${RELEASE}"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
+ if ! command -v npm >/dev/null 2>&1; then
+ echo "Installing NPM..."
+ apt-get install -y npm >/dev/null 2>&1
+ npm install -g pnpm >/dev/null 2>&1
+ echo "Installed NPM..."
+ fi
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/gethomepage/homepage/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Updating Homepage to v${RELEASE} (Patience)"
+ systemctl stop homepage
+ wget -q https://github.com/gethomepage/homepage/archive/refs/tags/v${RELEASE}.tar.gz
+ tar -xzf v${RELEASE}.tar.gz
+ rm -rf v${RELEASE}.tar.gz
+ cp -r homepage-${RELEASE}/* /opt/homepage/
+ rm -rf homepage-${RELEASE}
+ cd /opt/homepage
+ npx --yes update-browserslist-db@latest >/dev/null 2>&1
+ pnpm install >/dev/null 2>&1
+ export NEXT_PUBLIC_VERSION="v$RELEASE"
+ export NEXT_PUBLIC_REVISION="source"
+ pnpm build >/dev/null 2>&1
+ systemctl start homepage
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated Homepage to v${RELEASE}"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
+ fi
+ exit
}
start
@@ -90,5 +69,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
diff --git a/ct/homer.sh b/ct/homer.sh
index b2e7e767c..052071e49 100644
--- a/ct/homer.sh
+++ b/ct/homer.sh
@@ -1,91 +1,68 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/bastienwirtz/homer
-function header_info {
-clear
-cat <<"EOF"
- __ __
- / / / /___ ____ ___ ___ _____
- / /_/ / __ \/ __ `__ \/ _ \/ ___/
- / __ / /_/ / / / / / / __/ /
-/_/ /_/\____/_/ /_/ /_/\___/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Homer"
-var_disk="2"
+var_tags="dashboard"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/homer ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Stopping ${APP}"
-systemctl stop homer
-msg_ok "Stopped ${APP}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/homer ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop homer
+ msg_ok "Stopped ${APP}"
-msg_info "Backing up assets directory"
-cd ~
-mkdir -p assets-backup
-cp -R /opt/homer/assets/. assets-backup
-msg_ok "Backed up assets directory"
+ msg_info "Backing up assets directory"
+ cd ~
+ mkdir -p assets-backup
+ cp -R /opt/homer/assets/. assets-backup
+ msg_ok "Backed up assets directory"
-msg_info "Updating ${APP}"
-rm -rf /opt/homer/*
-cd /opt/homer
-wget -q https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip
-unzip homer.zip &>/dev/null
-msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP}"
+ rm -rf /opt/homer/*
+ cd /opt/homer
+ wget -q https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip
+ unzip homer.zip &>/dev/null
+ msg_ok "Updated ${APP}"
-msg_info "Restoring assets directory"
-cd ~
-cp -Rf assets-backup/. /opt/homer/assets/
-msg_ok "Restored assets directory"
+ msg_info "Restoring assets directory"
+ cd ~
+ cp -Rf assets-backup/. /opt/homer/assets/
+ msg_ok "Restored assets directory"
-msg_info "Cleaning"
-rm -rf assets-backup /opt/homer/homer.zip
-msg_ok "Cleaned"
+ msg_info "Cleaning"
+ rm -rf assets-backup /opt/homer/homer.zip
+ msg_ok "Cleaned"
-msg_info "Starting ${APP}"
-systemctl start homer
-msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ${APP}"
+ systemctl start homer
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -93,5 +70,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8010${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8010${CL}"
\ No newline at end of file
diff --git a/ct/hyperhdr.sh b/ct/hyperhdr.sh
index aff319d4d..e98a614bc 100644
--- a/ct/hyperhdr.sh
+++ b/ct/hyperhdr.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.hyperhdr.eu/
-function header_info {
-clear
-cat <<"EOF"
- __ __ __ ______ ____
- / / / /_ ______ ___ _____/ / / / __ \/ __ \
- / /_/ / / / / __ \/ _ \/ ___/ /_/ / / / / /_/ /
- / __ / /_/ / /_/ / __/ / / __ / /_/ / _, _/
-/_/ /_/\__, / .___/\___/_/ /_/ /_/_____/_/ |_|
- /____/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="HyperHDR"
-var_disk="4"
+var_tags="ambient-lightning"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8090${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8090${CL}"
\ No newline at end of file
diff --git a/ct/hyperion.sh b/ct/hyperion.sh
index 957e65c93..060f422d4 100644
--- a/ct/hyperion.sh
+++ b/ct/hyperion.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://hyperion-project.org/forum/
-function header_info {
-clear
-cat <<"EOF"
- __ __ _
- / / / /_ ______ ___ _____(_)___ ____
- / /_/ / / / / __ \/ _ \/ ___/ / __ \/ __ \
- / __ / /_/ / /_/ / __/ / / / /_/ / / / /
-/_/ /_/\__, / .___/\___/_/ /_/\____/_/ /_/
- /____/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Hyperion"
-var_disk="2"
+var_tags="ambient-lightning"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/hyperion.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get install -y hyperion &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/hyperion.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get install -y hyperion &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8090${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8090${CL}"
\ No newline at end of file
diff --git a/ct/influxdb.sh b/ct/influxdb.sh
index 59a09ddfb..3dfc07a2a 100644
--- a/ct/influxdb.sh
+++ b/ct/influxdb.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.influxdata.com/
-function header_info {
-clear
-cat <<"EOF"
- ____ ______ ____ ____
- / _/___ / __/ /_ ___ __/ __ \/ __ )
- / // __ \/ /_/ / / / / |/_/ / / / __ |
- _/ // / / / __/ / /_/ /> /_/ / /_/ /
-/___/_/ /_/_/ /_/\__,_/_/|_/_____/_____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="InfluxDB"
-var_disk="8"
+var_tags="database"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/influxdata.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/influxdata.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,3 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8086${CL}"
\ No newline at end of file
diff --git a/ct/inspircd.sh b/ct/inspircd.sh
new file mode 100644
index 000000000..5a5299ae4
--- /dev/null
+++ b/ct/inspircd.sh
@@ -0,0 +1,69 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: kristocopani
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.inspircd.org/
+
+# App Default Values
+APP="InspIRCd"
+var_tags="IRC"
+var_cpu="1"
+var_ram="512"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -f /lib/systemd/system/inspircd.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/inspircd/inspircd/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop inspircd
+ msg_ok "Stopped Service"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ wget -q https://github.com/inspircd/inspircd/releases/download/v${RELEASE}/inspircd_${RELEASE}.deb12u1_amd64.deb
+ apt-get install "./inspircd_${RELEASE}.deb12u1_amd64.deb" -y &>/dev/nul
+ echo "${RELEASE}" >"/opt/${APP}_version.txt"
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Service"
+ systemctl start inspircd
+ msg_ok "Started Service"
+
+ msg_info "Cleaning up"
+ rm -rf /opt/inspircd_${RELEASE}.deb12u1_amd64.deb
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Server-Acces it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}${IP}:6667${CL}"
\ No newline at end of file
diff --git a/ct/iobroker.sh b/ct/iobroker.sh
index cd207d842..94924e343 100644
--- a/ct/iobroker.sh
+++ b/ct/iobroker.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.iobroker.net/#en/intro
-function header_info {
-clear
-cat <<"EOF"
- _ ____ __
- (_)___ / __ )_________ / /_____ _____
- / / __ \/ __ / ___/ __ \/ //_/ _ \/ ___/
- / / /_/ / /_/ / / / /_/ / ,< / __/ /
-/_/\____/_____/_/ \____/_/|_|\___/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="ioBroker"
-var_disk="8"
+var_tags="automtation"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/iobroker ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/iobroker ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8081${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8081${CL}"
\ No newline at end of file
diff --git a/ct/iventoy.sh b/ct/iventoy.sh
index 85bb36424..c3e1a5868 100644
--- a/ct/iventoy.sh
+++ b/ct/iventoy.sh
@@ -1,61 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.iventoy.com/en/index.html
-function header_info {
-clear
-cat <<"EOF"
- _ _ __ __
- (_) | / /__ ____ / /_____ __ __
- / /| | / / _ \/ __ \/ __/ __ \/ / / /
- / / | |/ / __/ / / / /_/ /_/ / /_/ /
-/_/ |___/\___/_/ /_/\__/\____/\__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="iVentoy"
+var_tags="pxe-tool"
var_disk="2"
var_cpu="1"
var_ram="512"
var_os="debian"
var_version="12"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-if [[ ! -d /opt/iventoy ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/iventoy ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -63,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:26000/ ${CL} \n"
\ No newline at end of file
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:26000${CL}"
\ No newline at end of file
diff --git a/ct/jackett.sh b/ct/jackett.sh
index 0f4ffb853..728800cae 100644
--- a/ct/jackett.sh
+++ b/ct/jackett.sh
@@ -1,75 +1,52 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/Jackett/Jackett
-function header_info {
-clear
-cat <<"EOF"
- __ __ __ __
- / /___ ______/ /_____ / /_/ /_
- __ / / __ `/ ___/ //_/ _ \/ __/ __/
-/ /_/ / /_/ / /__/ ,< / __/ /_/ /_
-\____/\__,_/\___/_/|_|\___/\__/\__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Jackett"
-var_disk="2"
+var_tags="torrent"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/jackett.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(wget -q https://github.com/Jackett/Jackett/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Updating ${APP}"
- wget -q https://github.com/Jackett/Jackett/releases/download/$RELEASE/Jackett.Binaries.LinuxAMDx64.tar.gz
- systemctl stop jackett
- rm -rf /opt/Jackett
- tar -xzf Jackett.Binaries.LinuxAMDx64.tar.gz -C /opt
- rm -rf Jackett.Binaries.LinuxAMDx64.tar.gz
- systemctl start jackett
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/jackett.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(wget -q https://github.com/Jackett/Jackett/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating ${APP}"
+ wget -q https://github.com/Jackett/Jackett/releases/download/$RELEASE/Jackett.Binaries.LinuxAMDx64.tar.gz
+ systemctl stop jackett
+ rm -rf /opt/Jackett
+ tar -xzf Jackett.Binaries.LinuxAMDx64.tar.gz -C /opt
+ rm -rf Jackett.Binaries.LinuxAMDx64.tar.gz
+ systemctl start jackett
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -77,5 +54,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:9117${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9117${CL}"
diff --git a/ct/jellyfin.sh b/ct/jellyfin.sh
index dcc04c70a..e6eafe91c 100644
--- a/ct/jellyfin.sh
+++ b/ct/jellyfin.sh
@@ -1,66 +1,43 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://jellyfin.org/
-function header_info {
-clear
-cat <<"EOF"
- __ ____ _____
- / /__ / / /_ __/ __(_)___
- __ / / _ \/ / / / / / /_/ / __ \
-/ /_/ / __/ / / /_/ / __/ / / / /
-\____/\___/_/_/\__, /_/ /_/_/ /_/
- /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Jellyfin"
-var_disk="8"
+var_tags="media"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="ubuntu"
var_version="22.04"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /usr/lib/jellyfin ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated ${APP} LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /usr/lib/jellyfin ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ apt-get --with-new-pkgs upgrade jellyfin jellyfin-server &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
}
start
@@ -68,5 +45,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8096${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8096${CL}"
diff --git a/ct/jellyseerr.sh b/ct/jellyseerr.sh
index 5b751ed27..ff8d23ea3 100644
--- a/ct/jellyseerr.sh
+++ b/ct/jellyseerr.sh
@@ -1,85 +1,63 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://docs.jellyseerr.dev/
-function header_info {
-clear
-cat <<"EOF"
- __ ____
- / /__ / / /_ __________ ___ __________
- __ / / _ \/ / / / / / ___/ _ \/ _ \/ ___/ ___/
-/ /_/ / __/ / / /_/ (__ ) __/ __/ / / /
-\____/\___/_/_/\__, /____/\___/\___/_/ /_/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Jellyseerr"
-var_disk="8"
+var_tags="media"
var_cpu="4"
var_ram="4096"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/jellyseerr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your Jellyseerr LXC to 4vcpu and 4096RAM for the build process before continuing" 10 75
-if ! command -v pnpm &> /dev/null; then
- msg_error "pnpm not found. Installing..."
- npm install -g pnpm &>/dev/null
-else
- msg_ok "pnpm is already installed."
-fi
-msg_info "Updating $APP"
-cd /opt/jellyseerr
-output=$(git pull --no-rebase)
-if echo "$output" | grep -q "Already up to date."
-then
- msg_ok "$APP is already up to date."
- exit
-fi
-systemctl stop jellyseerr
-export CYPRESS_INSTALL_BINARY=0
-pnpm install --frozen-lockfile &>/dev/null
-export NODE_OPTIONS="--max-old-space-size=3072"
-pnpm build &>/dev/null
-cat </etc/systemd/system/jellyseerr.service
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -d /opt/jellyseerr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if ! command -v pnpm &> /dev/null; then
+ msg_error "pnpm not found. Installing..."
+ npm install -g pnpm &>/dev/null
+ else
+ msg_ok "pnpm is already installed."
+ fi
+
+ msg_info "Updating $APP"
+ cd /opt/jellyseerr
+ output=$(git pull --no-rebase)
+
+ if echo "$output" | grep -q "Already up to date."; then
+ msg_ok "$APP is already up to date."
+ exit
+ fi
+
+ systemctl stop jellyseerr
+ rm -rf dist .next node_modules
+ export CYPRESS_INSTALL_BINARY=0
+ pnpm install --frozen-lockfile &>/dev/null
+ export NODE_OPTIONS="--max-old-space-size=3072"
+ pnpm build &>/dev/null
+
+ cat </etc/systemd/system/jellyseerr.service
[Unit]
Description=jellyseerr Service
After=network.target
@@ -94,21 +72,18 @@ ExecStart=/usr/bin/node dist/index.js
[Install]
WantedBy=multi-user.target
EOF
-systemctl daemon-reload
-systemctl start jellyseerr
-msg_ok "Updated $APP"
-exit
+
+ systemctl daemon-reload
+ systemctl start jellyseerr
+ msg_ok "Updated $APP"
+ exit
}
start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 2048
-pct set $CTID -cores 2
-msg_ok "Set Container to Normal Resources"
-
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5055${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}"
\ No newline at end of file
diff --git a/ct/jenkins.sh b/ct/jenkins.sh
new file mode 100644
index 000000000..f3dcc2333
--- /dev/null
+++ b/ct/jenkins.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: kristocopani
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.jenkins.io/
+
+# App Default Values
+APP="Jenkins"
+var_tags="automation"
+var_cpu="2"
+var_ram="1024"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var/lib/jenkins ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
diff --git a/ct/kavita.sh b/ct/kavita.sh
index 94410c656..848ced527 100644
--- a/ct/kavita.sh
+++ b/ct/kavita.sh
@@ -1,70 +1,47 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.kavitareader.com/
-function header_info {
-clear
-cat <<"EOF"
- __ __ _ __
- / //_/___ __ __(_) /_____ _
- / ,< / __ `/ | / / / __/ __ `/
- / /| / /_/ /| |/ / / /_/ /_/ /
-/_/ |_\__,_/ |___/_/\__/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Kavita"
-var_disk="8"
+var_tags="reader"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/Kavita ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-systemctl stop kavita
-RELEASE=$(curl -s https://api.github.com/repos/Kareadita/Kavita/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-tar -xvzf <(curl -fsSL https://github.com/Kareadita/Kavita/releases/download/$RELEASE/kavita-linux-arm64.tar.gz) --no-same-owner &>/dev/null
-rm -rf Kavita/config
-cp -r Kavita/* /opt/Kavita
-rm -rf Kavita
-systemctl start kavita
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/Kavita ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ systemctl stop kavita
+ RELEASE=$(curl -s https://api.github.com/repos/Kareadita/Kavita/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ tar -xvzf <(curl -fsSL https://github.com/Kareadita/Kavita/releases/download/$RELEASE/kavita-linux-x64.tar.gz) --no-same-owner &>/dev/null
+ rm -rf Kavita/config
+ cp -r Kavita/* /opt/Kavita
+ rm -rf Kavita
+ systemctl start kavita
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -72,5 +49,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
\ No newline at end of file
diff --git a/ct/keycloak.sh b/ct/keycloak.sh
index fe590eb4a..6e7d5fbe3 100644
--- a/ct/keycloak.sh
+++ b/ct/keycloak.sh
@@ -1,90 +1,62 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.keycloak.org/
-function header_info {
-clear
-cat <<"EOF"
- __ __ __ __
- / //_/__ __ _______/ /___ ____ _/ /__
- / ,< / _ \/ / / / ___/ / __ \/ __ / //_/
- / /| / __/ /_/ / /__/ / /_/ / /_/ / ,<
-/_/ |_\___/\__, /\___/_/\____/\__,_/_/|_|
- /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Keycloak"
-var_disk="4"
+var_tags="access-management"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/keycloak.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/keycloak.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
-msg_info "Updating packages"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
+ msg_info "Updating packages"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
-RELEASE=$(curl -s https://api.github.com/repos/keycloak/keycloak/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-msg_info "Downloading Keycloak v$RELEASE"
-cd /opt
-wget -q https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz
-$STD tar -xvf keycloak-$RELEASE.tar.gz
+ RELEASE=$(curl -s https://api.github.com/repos/keycloak/keycloak/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ msg_info "Updating Keycloak to v$RELEASE"
+ cd /opt
+ wget -q https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz
+ mv keycloak keycloak.old
+ tar -xzf keycloak-$RELEASE.tar.gz
+ cp -r keycloak.old/conf keycloak-$RELEASE
+ cp -r keycloak.old/providers keycloak-$RELEASE
+ cp -r keycloak.old/themes keycloak-$RELEASE
+ mv keycloak-$RELEASE keycloak
-msg_info "Merging configuration files"
-cp -r keycloak/conf keycloak-$RELEASE
-cp -r keycloak/providers keycloak-$RELEASE
-cp -r keycloak/themes keycloak-$RELEASE
+ msg_info "Delete temporary installation files"
+ rm keycloak-$RELEASE.tar.gz
+ rm -rf keycloak.old
-msg_info "Updating Keycloak"
-mv keycloak keycloak.old
-mv keycloak-$RELEASE keycloak
-
-msg_info "Delete temporary installation files"
-rm keycloak-$RELEASE.tar.gz
-rm -rf keycloak.old
-
-msg_info "Restating Keycloak"
-systemctl restart keycloak
-msg_ok "Updated Successfully"
-exit
+ msg_info "Restating Keycloak"
+ systemctl restart keycloak
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -92,5 +64,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080/admin${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/admin${CL}"
diff --git a/ct/kimai.sh b/ct/kimai.sh
new file mode 100644
index 000000000..12a1a80e0
--- /dev/null
+++ b/ct/kimai.sh
@@ -0,0 +1,80 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.kimai.org/
+
+# App Default Values
+APP="Kimai"
+var_tags="time-tracking"
+var_cpu="2"
+var_ram="2048"
+var_disk="7"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/kimai ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/kimai/kimai/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Apache2"
+ systemctl stop apache2
+ msg_ok "Stopped Apache2"
+
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cp /opt/kimai/.env /opt/.env
+ rm -rf /opt/kimai
+ wget -q "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip"
+ unzip -q ${RELEASE}.zip
+ mv kimai-${RELEASE} /opt/kimai
+ mv /opt/.env /opt/kimai/.env
+ cd /opt/kimai
+ composer install --no-dev --optimize-autoloader &>/dev/null
+ bin/console kimai:update &>/dev/null
+ chown -R :www-data .
+ chmod -R g+r .
+ chmod -R g+rw var/
+ sudo chown -R www-data:www-data /opt/kimai
+ sudo chmod -R 755 /opt/kimai
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
+
+ msg_info "Starting Apache2"
+ systemctl start apache2
+ msg_ok "Started Apache2"
+
+ msg_info "Cleaning Up"
+ rm -rf ${RELEASE}.zip
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/komga.sh b/ct/komga.sh
new file mode 100644
index 000000000..aa66611ea
--- /dev/null
+++ b/ct/komga.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: madelyn (DysfunctionalProgramming)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://komga.org/
+
+# App Default Values
+APP="Komga"
+var_tags="media;eBook;comic"
+var_cpu="1"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /opt/komga/komga.jar ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ RELEASE=$(curl -s https://api.github.com/repos/gotson/komga/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop komga
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP} to ${RELEASE}"
+ wget -q "https://github.com/gotson/komga/releases/download/${RELEASE}/komga-${RELEASE}.jar"
+ rm -rf /opt/komga/komga.jar
+ mv -f komga-${RELEASE}.jar /opt/komga/komga.jar
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
+
+ msg_info "Starting ${APP}"
+ systemctl start komga
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:25600${CL}"
diff --git a/ct/komodo.sh b/ct/komodo.sh
new file mode 100644
index 000000000..fd84d5d98
--- /dev/null
+++ b/ct/komodo.sh
@@ -0,0 +1,73 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://komo.do
+
+# App Default Values
+APP="Komodo"
+var_tags="docker"
+var_cpu="2"
+var_ram="2048"
+var_disk="10"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/komodo ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ COMPOSE_FILE=""
+ for file in *.compose.yaml; do
+ if [[ "$file" != "compose.env" ]]; then
+ COMPOSE_FILE="$file"
+ break
+ fi
+ done
+
+ if [[ -z "$COMPOSE_FILE" ]]; then
+ msg_error "No valid compose file found in /opt/komodo!"
+ exit 1
+ fi
+
+ BACKUP_FILE="${COMPOSE_FILE}.bak_$(date +%Y%m%d_%H%M%S)"
+ mv "$COMPOSE_FILE" "$BACKUP_FILE" || {
+ msg_error "Failed to create backup of $COMPOSE_FILE!"
+ exit 1
+ }
+
+ GITHUB_URL="https://raw.githubusercontent.com/mbecker20/komodo/main/compose/$COMPOSE_FILE"
+ wget -q -O "$COMPOSE_FILE" "$GITHUB_URL" || {
+ msg_error "Failed to download $COMPOSE_FILE from GitHub!"
+ mv "$BACKUP_FILE" "$COMPOSE_FILE"
+ exit 1
+ }
+
+ docker compose -p komodo -f "/opt/komodo/$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d &>/dev/null
+ msg_ok "Updated ${APP}"
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9120${CL}"
diff --git a/ct/kubo.sh b/ct/kubo.sh
index 3eafbb54b..72d4bc2cf 100644
--- a/ct/kubo.sh
+++ b/ct/kubo.sh
@@ -1,74 +1,52 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: ulmentflam
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/ipfs/kubo
-function header_info {
-clear
-cat <<"EOF"
- __ __ __
- / //_/_ __/ /_ ____
- / ,< / / / / __ \/ __ \
- / /| / /_/ / /_/ / /_/ /
-/_/ |_\__,_/_.___/\____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Kubo"
-var_disk="4"
+var_tags="sharing"
var_cpu="2"
var_ram="4096"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /usr/local/kubo ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(wget -q https://github.com/ipfs/kubo/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
-if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- msg_info "Updating $APP LXC"
- apt-get update &>/dev/null
- apt-get -y upgrade &>/dev/null
- wget -q "https://github.com/ipfs/kubo/releases/download/${RELEASE}/kubo_${RELEASE}_linux-arm64.tar.gz"
- tar -xzf "kubo_${RELEASE}_linux-arm64.tar.gz" -C /usr/local
- systemctl restart ipfs.service
- echo "${RELEASE}" >/opt/${APP}_version.txt
- rm "kubo_${RELEASE}_linux-arm64.tar.gz"
- msg_ok "Updated $APP LXC"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /usr/local/kubo ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(wget -q https://github.com/ipfs/kubo/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ wget -q "https://github.com/ipfs/kubo/releases/download/${RELEASE}/kubo_${RELEASE}_linux-amd64.tar.gz"
+ tar -xzf "kubo_${RELEASE}_linux-amd64.tar.gz" -C /usr/local
+ systemctl restart ipfs.service
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ rm "kubo_${RELEASE}_linux-amd64.tar.gz"
+ msg_ok "Updated $APP LXC"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -76,5 +54,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5001/webui ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5001/webui${CL}"
\ No newline at end of file
diff --git a/ct/lazylibrarian.sh b/ct/lazylibrarian.sh
index c37e9d2fd..38d247434 100644
--- a/ct/lazylibrarian.sh
+++ b/ct/lazylibrarian.sh
@@ -1,75 +1,51 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MountyMapleSyrup (MountyMapleSyrup)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck | Co-Author: MountyMapleSyrup (MountyMapleSyrup)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://gitlab.com/LazyLibrarian/LazyLibrarian
-function header_info {
-clear
-cat <<"EOF"
- __ __ _ __ _
- / / ____ _____ __ __/ / (_) /_ _________ ______(_)___ _____
- / / / __ `/_ / / / / / / / / __ \/ ___/ __ `/ ___/ / __ `/ __ \
- / /___/ /_/ / / /_/ /_/ / /___/ / /_/ / / / /_/ / / / / /_/ / / / /
-/_____/\__,_/ /___/\__, /_____/_/_.___/_/ \__,_/_/ /_/\__,_/_/ /_/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="LazyLibrarian"
-var_disk="4"
+var_tags="eBook"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/LazyLibrarian/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Stopping LazyLibrarian"
-systemctl stop lazylibrarian
-msg_ok "LazyLibrarian Stopped"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/LazyLibrarian/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping LazyLibrarian"
+ systemctl stop lazylibrarian
+ msg_ok "LazyLibrarian Stopped"
-msg_info "Updating $APP LXC"
-git -C /opt/LazyLibrarian pull origin master &>/dev/null
-msg_ok "Updated $APP LXC"
+ msg_info "Updating $APP LXC"
+ git -C /opt/LazyLibrarian pull origin master &>/dev/null
+ msg_ok "Updated $APP LXC"
-msg_info "Starting LazyLibrarian"
-systemctl start lazylibrarian
-msg_ok "Started LazyLibrarian"
+ msg_info "Starting LazyLibrarian"
+ systemctl start lazylibrarian
+ msg_ok "Started LazyLibrarian"
-msg_ok "Updated Successfully"
-exit
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -77,5 +53,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5299${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5299${CL}"
\ No newline at end of file
diff --git a/ct/lidarr.sh b/ct/lidarr.sh
index cf6e6dafb..bdcde9b37 100644
--- a/ct/lidarr.sh
+++ b/ct/lidarr.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://lidarr.audio/
-function header_info {
-clear
-cat <<"EOF"
- __ _ __
- / / (_)___/ /___ __________
- / / / / __ / __ `/ ___/ ___/
- / /___/ / /_/ / /_/ / / / /
-/_____/_/\__,_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Lidarr"
-var_disk="4"
+var_tags="arr;torrent;usenet"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var/lib/lidarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var/lib/lidarr/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8686${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8686${CL}"
\ No newline at end of file
diff --git a/ct/linkwarden.sh b/ct/linkwarden.sh
index f6b5fc68d..e8f0c062e 100644
--- a/ct/linkwarden.sh
+++ b/ct/linkwarden.sh
@@ -1,87 +1,71 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://linkwarden.app/
-function header_info {
-clear
-cat <<"EOF"
- __ _ __ __
- / / (_)___ / /___ ______ __________/ /__ ____
- / / / / __ \/ //_/ | /| / / __ `/ ___/ __ / _ \/ __ \
- / /___/ / / / / ,< | |/ |/ / /_/ / / / /_/ / __/ / / /
-/_____/_/_/ /_/_/|_| |__/|__/\__,_/_/ \__,_/\___/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Linkwarden"
-var_disk="8"
+var_tags="bookmark"
var_cpu="2"
var_ram="2048"
+var_disk="12"
var_os="ubuntu"
var_version="22.04"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/linkwarden ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/linkwarden ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop linkwarden
+ msg_ok "Stopped ${APP}"
-RELEASE=$(curl -s https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop linkwarden
- msg_ok "Stopped ${APP}"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cd /opt
+ mv /opt/linkwarden/.env /opt/.env
+ RELEASE=$(curl -s https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ wget -q "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip"
+ unzip -q ${RELEASE}.zip
+ mv linkwarden-${RELEASE:1} /opt/linkwarden
+ cd /opt/linkwarden
+ yarn &>/dev/null
+ npx playwright install-deps &>/dev/null
+ yarn playwright install &>/dev/null
+ cp /opt/.env /opt/linkwarden/.env
+ yarn build &>/dev/null
+ yarn prisma migrate deploy &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
- msg_info "Updating ${APP} to ${RELEASE}"
- cd /opt/linkwarden
- git pull
- yarn
- npx playwright install-deps
- yarn playwright install
- yarn prisma generate
- yarn build
- yarn prisma migrate deploy
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
-
- msg_info "Starting ${APP}"
- systemctl start linkwarden
- msg_ok "Started ${APP}"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}."
-fi
-exit
+ msg_info "Starting ${APP}"
+ systemctl start linkwarden
+ msg_ok "Started ${APP}"
+ msg_info "Cleaning up"
+ rm -rf /opt/${RELEASE}.zip
+ rm -rf /opt/linkwarden_bak
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}."
+ fi
+ exit
}
start
@@ -89,5 +73,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP}${CL} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/listmonk.sh b/ct/listmonk.sh
new file mode 100644
index 000000000..004654bd6
--- /dev/null
+++ b/ct/listmonk.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: bvdberg01
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://listmonk.app/
+
+# App Default Values
+APP="listmonk"
+var_tags="newsletter"
+var_cpu="1"
+var_ram="512"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/listmonk.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ RELEASE=$(curl -s https://api.github.com/repos/knadh/listmonk/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop listmonk
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ mv /opt/listmonk/ /opt/listmonk-backup
+ mkdir /opt/listmonk/
+ wget -q "https://github.com/knadh/listmonk/releases/download/v${RELEASE}/listmonk_${RELEASE}_linux_amd64.tar.gz"
+ tar -xzf "listmonk_${RELEASE}_linux_amd64.tar.gz" -C /opt/listmonk
+ mv /opt/listmonk-backup/config.toml /opt/listmonk/config.toml
+ mv /opt/listmonk-backup/uploads /opt/listmonk/uploads
+ /opt/listmonk/listmonk --upgrade --yes --config /opt/listmonk/config.toml &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated $APP to v${RELEASE}"
+
+ msg_info "Starting ${APP}"
+ systemctl start listmonk
+ msg_ok "Started ${APP}"
+
+ msg_info "Cleaning up"
+ rm -rf "/opt/listmonk_${RELEASE}_linux_amd64.tar.gz"
+ rm -rf /opt/listmonk-backup/
+ msg_ok "Cleaned"
+
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}"
\ No newline at end of file
diff --git a/ct/lldap.sh b/ct/lldap.sh
index 03d72348c..ef06cce23 100644
--- a/ct/lldap.sh
+++ b/ct/lldap.sh
@@ -1,75 +1,49 @@
#!/usr/bin/env bash
-# source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# # Copyright (c) 2021-2024 tteck
-# # Author: tteck (tteckster)
-# # Co-Author: remz1337
-# # License: MIT
-# # https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: remz1337
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/lldap/lldap
-echo "Unsupported."
+# App Default Values
+APP="lldap"
+var_tags="ldap"
+var_cpu="1"
+var_ram="512"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
-# function header_info {
-# clear
-# cat <<"EOF"
-# ____ __
-# / / /___/ /___ _____
-# / / / __ / __ `/ __ \
-# / / / /_/ / /_/ / /_/ /
-# /_/_/\__,_/\__,_/ .___/
-# /_/
-
-# EOF
-# }
-# header_info
-# echo -e "Loading..."
-# APP="lldap"
-# var_disk="4"
-# var_cpu="1"
-# var_ram="512"
-# var_os="debian"
-# var_version="12"
-# variables
-# color
-# catch_errors
+# App Output & Base Settings
+header_info "$APP"
+base_settings
-# function default_settings() {
-# CT_TYPE="1"
-# PW=""
-# CT_ID=$NEXTID
-# HN=$NSAPP
-# DISK_SIZE="$var_disk"
-# CORE_COUNT="$var_cpu"
-# RAM_SIZE="$var_ram"
-# BRG="vmbr0"
-# NET="dhcp"
-# GATE=""
-# APT_CACHER=""
-# APT_CACHER_IP=""
-# DISABLEIP6="no"
-# MTU=""
-# SD=""
-# NS=""
-# MAC=""
-# VLAN=""
-# SSH="no"
-# VERB="no"
-# echo_default
-# }
+# Core
+variables
+color
+catch_errors
-# function update_script() {
-# header_info
-# if [[ ! -f /etc/systemd/system/lldap.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-# msg_info "Updating $APP"
-# apt update
-# apt upgrade -y lldap
-# msg_ok "Updated $APP"
-# exit
-# }
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/lldap.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ apt update
+ apt upgrade -y lldap
+ msg_ok "Updated $APP"
+ exit
+}
-# start
-# build_container
-# description
+start
+build_container
+description
-# msg_ok "Completed Successfully!\n"
-# echo -e "${APP} should be reachable by going to the following URL.
-# ${BL}http://${IP}:17170${CL} \n"
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:17170${CL}"
\ No newline at end of file
diff --git a/ct/lubelogger.sh b/ct/lubelogger.sh
new file mode 100644
index 000000000..9d883aac6
--- /dev/null
+++ b/ct/lubelogger.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: kristocopani
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://lubelogger.com/
+
+# App Default Values
+APP="LubeLogger"
+var_tags="verhicle;car"
+var_cpu="1"
+var_ram="512"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/lubelogger.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/hargata/lubelog/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ RELEASE_TRIMMED=$(echo "${RELEASE}" | tr -d ".")
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop lubelogger
+ msg_ok "Stopped Service"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ wget -q https://github.com/hargata/lubelog/releases/download/v${RELEASE}/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip
+ mkdir -p /tmp/lubeloggerData/wwwroot
+ cp /opt/lubelogger/appsettings.json /tmp/lubeloggerData/appsettings.json
+ cp -r /opt/lubelogger/config /tmp/lubeloggerData/
+ cp -r /opt/lubelogger/data /tmp/lubeloggerData/
+ [[ -e /opt/lubelogger/wwwroot/translations ]] && cp -r /opt/lubelogger/wwwroot/translations /tmp/lubeloggerData/wwwroot/
+ [[ -e /opt/lubelogger/wwwroot/documents ]] && cp -r /opt/lubelogger/wwwroot/documents /tmp/lubeloggerData/wwwroot/
+ [[ -e /opt/lubelogger/wwwroot/images ]] && cp -r /opt/lubelogger/wwwroot/images /tmp/lubeloggerData/wwwroot/
+ [[ -e /opt/lubelogger/wwwroot/temp ]] && cp -r /opt/lubelogger/wwwroot/temp /tmp/lubeloggerData/wwwroot/
+ [[ -e /opt/lubelogger/log ]] && cp -r /opt/lubelogger/log /tmp/lubeloggerData/
+ rm -rf /opt/lubelogger
+ unzip -qq LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip -d lubelogger
+ chmod 700 /opt/lubelogger/CarCareTracker
+ cp -rf /tmp/lubeloggerData/* /opt/lubelogger/
+ echo "${RELEASE}" >"/opt/${APP}_version.txt"
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Service"
+ systemctl start lubelogger
+ msg_ok "Started Service"
+
+ msg_info "Cleaning up"
+ rm -rf /opt/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip
+ rm -rf /tmp/lubeloggerData
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
diff --git a/ct/mafl.sh b/ct/mafl.sh
index 74d42f9a2..9abcf179d 100644
--- a/ct/mafl.sh
+++ b/ct/mafl.sh
@@ -1,61 +1,37 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://mafl.hywax.space/
-function header_info {
- clear
- cat <<"EOF"
- __ ___ ______
- / |/ /___ _/ __/ /
- / /|_/ / __ `/ /_/ /
- / / / / /_/ / __/ /
-/_/ /_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Mafl"
-var_disk="6"
+var_tags="dashboard"
var_cpu="2"
var_ram="2048"
+var_disk="6"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
header_info
- if [[ ! -d /opt/mafl ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
- whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/mafl ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
RELEASE=$(curl -s https://api.github.com/repos/hywax/mafl/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
msg_info "Updating Mafl to v${RELEASE} (Patience)"
systemctl stop mafl
@@ -75,11 +51,7 @@ start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 1024
-pct set $CTID -cores 1
-msg_ok "Set Container to Normal Resources"
-
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/magicmirror.sh b/ct/magicmirror.sh
index e3cb250c5..a76c85976 100644
--- a/ct/magicmirror.sh
+++ b/ct/magicmirror.sh
@@ -1,61 +1,37 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://magicmirror.builders/
-function header_info {
-clear
-cat <<"EOF"
- __ ___ _ __ ____
- / |/ /___ _____ _(_)____/ |/ (_)_____________ _____
- / /|_/ / __ / __ / / ___/ /|_/ / / ___/ ___/ __ \/ ___/
- / / / / /_/ / /_/ / / /__/ / / / / / / / / /_/ / /
-/_/ /_/\__,_/\__, /_/\___/_/ /_/_/_/ /_/ \____/_/
- /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="MagicMirror"
-var_disk="3"
+var_tags="smarthome"
var_cpu="1"
var_ram="512"
+var_disk="3"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/magicmirror ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/magicmirror ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
if ! command -v npm >/dev/null 2>&1; then
echo "Installing NPM..."
@@ -63,12 +39,12 @@ if [[ ! -d /opt/magicmirror ]]; then msg_error "No ${APP} Installation Found!";
echo "Installed NPM..."
fi
fi
-msg_info "Updating ${APP} LXC"
-cd /opt/magicmirror
-git pull &>/dev/null
-npm install --only=prod --omit=dev &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ msg_info "Updating ${APP} LXC"
+ cd /opt/magicmirror
+ git pull &>/dev/null
+ npm install --only=prod --omit=dev &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -76,5 +52,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
\ No newline at end of file
diff --git a/ct/mariadb.sh b/ct/mariadb.sh
index 4d34acc14..8bfbee8f4 100644
--- a/ct/mariadb.sh
+++ b/ct/mariadb.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://mariadb.org/
-function header_info {
-clear
-cat <<"EOF"
- __ ___ _ ____ ____
- / |/ /___ ______(_)___ _/ __ \/ __ )
- / /|_/ / __ / ___/ / __ / / / / __ |
- / / / / /_/ / / / / /_/ / /_/ / /_/ /
-/_/ /_/\__,_/_/ /_/\__,_/_____/_____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="MariaDB"
-var_disk="4"
+var_tags="database"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/mariadb.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/mysql/mariadb.conf.d ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,3 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following IP:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}${IP}:3306${CL}"
\ No newline at end of file
diff --git a/ct/matterbridge.sh b/ct/matterbridge.sh
index 53fe389c4..6e6375468 100644
--- a/ct/matterbridge.sh
+++ b/ct/matterbridge.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/Luligu/matterbridge
-function header_info {
-clear
-cat <<"EOF"
- __ ___ __ __ __ _ __
- / |/ /___ _/ /_/ /____ _____/ /_ _____(_)___/ /___ ____
- / /|_/ / __ `/ __/ __/ _ \/ ___/ __ \/ ___/ / __ / __ `/ _ \
- / / / / /_/ / /_/ /_/ __/ / / /_/ / / / / /_/ / /_/ / __/
-/_/ /_/\__,_/\__/\__/\___/_/ /_.___/_/ /_/\__,_/\__, /\___/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Matterbridge"
-var_disk="4"
+var_tags="matter;smarthome"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /root/Matterbridge ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "Update via the Matterbridge UI"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /root/Matterbridge ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "Update via the Matterbridge UI"
+ exit
}
start
@@ -64,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:8283${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8283${CL}"
\ No newline at end of file
diff --git a/ct/mediamtx.sh b/ct/mediamtx.sh
index fc1ef05b3..9c64fb7ee 100644
--- a/ct/mediamtx.sh
+++ b/ct/mediamtx.sh
@@ -1,64 +1,39 @@
#!/usr/bin/env bash
-
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/bluenviron/mediamtx
-function header_info {
-clear
-cat <<"EOF"
- __ ___ ___ __ __________ __
- / |/ /__ ____/ (_)___ _/ |/ /_ __/ |/ /
- / /|_/ / _ \/ __ / / __ `/ /|_/ / / / | /
- / / / / __/ /_/ / / /_/ / / / / / / / |
-/_/ /_/\___/\__,_/_/\__,_/_/ /_/ /_/ /_/|_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="MediaMTX"
-var_disk="4"
+var_tags="media"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/mediamtx/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/mediamtx/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -66,3 +41,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/medusa.sh b/ct/medusa.sh
index 06b42f7cf..09bd2f263 100644
--- a/ct/medusa.sh
+++ b/ct/medusa.sh
@@ -1,67 +1,54 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/pymedusa/Medusa.git
-function header_info {
-clear
-cat <<"EOF"
- __ ___ __
- / |/ /__ ____/ /_ ___________ _
- / /|_/ / _ \/ __ / / / / ___/ __ `/
- / / / / __/ /_/ / /_/ (__ ) /_/ /
-/_/ /_/\___/\__,_/\__,_/____/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Medusa"
-var_disk="6"
+var_tags="media"
var_cpu="2"
var_ram="1024"
+var_disk="6"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/medusa ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-systemctl stop medusa.service
-/opt/medusa
-git pull
-systemctl start medusa.service
-msg_ok "Successfully Updated ${APP}"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/medusa ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop medusa
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP}"
+ cd /opt/medusa
+ output=$(git pull --no-rebase)
+ if echo "$output" | grep -q "Already up to date."; then
+ msg_ok "$APP is already up to date."
+ exit
+ fi
+ msg_ok "Updated Successfully"
+
+ msg_info "Starting ${APP}"
+ systemctl start medusa
+ msg_ok "Started ${APP}"
+ exit
}
start
@@ -69,5 +56,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8081${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8081${CL}"
\ No newline at end of file
diff --git a/ct/memos.sh b/ct/memos.sh
index ceb1fd913..0fc50ec8e 100644
--- a/ct/memos.sh
+++ b/ct/memos.sh
@@ -1,88 +1,64 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.usememos.com/
-function header_info {
-clear
-cat <<"EOF"
- __ ___
- / |/ /__ ____ ___ ____ _____
- / /|_/ / _ \/ __ `__ \/ __ \/ ___/
- / / / / __/ / / / / / /_/ (__ )
-/_/ /_/\___/_/ /_/ /_/\____/____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Memos"
-var_disk="7"
+var_tags="notes"
var_cpu="2"
var_ram="2048"
+var_disk="7"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/memos ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP (Patience)"
-cd /opt/memos
-output=$(git pull --no-rebase)
-if echo "$output" | grep -q "Already up to date."
-then
- msg_ok "$APP is already up to date."
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/memos ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP (Patience)"
+ cd /opt/memos
+ git reset --hard HEAD
+ output=$(git pull --no-rebase)
+ if echo "$output" | grep -q "Already up to date."; then
+ msg_ok "$APP is already up to date."
+ exit
+ fi
+ systemctl stop memos
+ cd /opt/memos/web
+ pnpm i --frozen-lockfile &>/dev/null
+ pnpm build &>/dev/null
+ cd /opt/memos
+ mkdir -p /opt/memos/server/dist
+ cp -r web/dist/* /opt/memos/server/dist/
+ cp -r web/dist/* /opt/memos/server/router/frontend/dist/
+ go build -o /opt/memos/memos -tags=embed bin/memos/main.go &>/dev/null
+ systemctl start memos
+ msg_ok "Updated $APP"
exit
-fi
-systemctl stop memos
-cd /opt/memos/web
-pnpm i --frozen-lockfile &>/dev/null
-pnpm build &>/dev/null
-cd /opt/memos
-mkdir -p /opt/memos/server/dist
-cp -r web/dist/* /opt/memos/server/dist/
-cp -r web/dist/* /opt/memos/server/router/frontend/dist/
-go build -o /opt/memos/memos -tags=embed bin/memos/main.go &>/dev/null
-systemctl start memos
-msg_ok "Updated $APP"
-exit
}
-
start
build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:9030${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9030${CL}"
diff --git a/ct/meshcentral.sh b/ct/meshcentral.sh
index 100e4db40..c6ac56965 100644
--- a/ct/meshcentral.sh
+++ b/ct/meshcentral.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://meshcentral.com/
-function header_info {
-clear
-cat <<"EOF"
- __ ___ __ ______ __ __
- / |/ /__ _____/ /_ / ____/__ ____ / /__________ _/ /
- / /|_/ / _ \/ ___/ __ \/ / / _ \/ __ \/ __/ ___/ __ / /
- / / / / __(__ ) / / / /___/ __/ / / / /_/ / / /_/ / /
-/_/ /_/\___/____/_/ /_/\____/\___/_/ /_/\__/_/ \__,_/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="MeshCentral"
-var_disk="2"
+var_tags="remote-management"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/meshcentral ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/meshcentral ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/metube.sh b/ct/metube.sh
index 92a63e099..5d2e6bce4 100644
--- a/ct/metube.sh
+++ b/ct/metube.sh
@@ -1,94 +1,67 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/alexta69/metube
-function header_info {
-clear
-cat <<"EOF"
- __ ___ ______ __
- / |/ /__/_ __/_ __/ /_ ___
- / /|_/ / _ \/ / / / / / __ \/ _ \
- / / / / __/ / / /_/ / /_/ / __/
-/_/ /_/\___/_/ \__,_/_.___/\___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="MeTube"
-var_disk="10"
+var_tags="media;youtube"
var_cpu="1"
var_ram="1024"
+var_disk="10"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/metube ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-msg_info "Stopping ${APP} Service"
-systemctl stop metube
-msg_ok "Stopped ${APP} Service"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/metube ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP} Service"
+ systemctl stop metube
+ msg_ok "Stopped ${APP} Service"
-msg_info "Updating ${APP} to latest Git"
-cd /opt
-if [ -d metube_bak ]; then
- rm -rf metube_bak
-fi
-mv metube metube_bak
-git clone https://github.com/alexta69/metube /opt/metube >/dev/null 2>&1
-cd /opt/metube/ui
-npm install >/dev/null 2>&1
-node_modules/.bin/ng build >/dev/null 2>&1
-cd /opt/metube
-cp /opt/metube_bak/.env /opt/metube/
-pip3 install pipenv >/dev/null 2>&1
-pipenv install >/dev/null 2>&1
+ msg_info "Updating ${APP} to latest Git"
+ cd /opt
+ if [ -d metube_bak ]; then
+ rm -rf metube_bak
+ fi
+ mv metube metube_bak
+ git clone https://github.com/alexta69/metube /opt/metube >/dev/null 2>&1
+ cd /opt/metube/ui
+ npm install >/dev/null 2>&1
+ node_modules/.bin/ng build >/dev/null 2>&1
+ cd /opt/metube
+ cp /opt/metube_bak/.env /opt/metube/
+ pip3 install pipenv >/dev/null 2>&1
+ pipenv install >/dev/null 2>&1
-if [ -d "/opt/metube_bak" ]; then
-rm -rf /opt/metube_bak
-fi
-msg_ok "Updated ${APP} to latest Git"
+ if [ -d "/opt/metube_bak" ]; then
+ rm -rf /opt/metube_bak
+ fi
+ msg_ok "Updated ${APP} to latest Git"
-msg_info "Starting ${APP} Service"
-systemctl start metube
-sleep 1
-msg_ok "Started ${APP} Service"
-msg_ok "Updated Successfully!\n"
-exit
+ msg_info "Starting ${APP} Service"
+ systemctl start metube
+ sleep 1
+ msg_ok "Started ${APP} Service"
+ msg_ok "Updated Successfully!\n"
+ exit
}
start
@@ -96,5 +69,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:8081${CL} \n"
\ No newline at end of file
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8081${CL}"
\ No newline at end of file
diff --git a/ct/mongodb.sh b/ct/mongodb.sh
index a79c8c320..15297bed7 100644
--- a/ct/mongodb.sh
+++ b/ct/mongodb.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.mongodb.com/de-de
-function header_info {
-clear
-cat <<"EOF"
- __ ___ ____ ____
- / |/ /___ ____ ____ _____ / __ \/ __ )
- / /|_/ / __ \/ __ \/ __ `/ __ \/ / / / __ |
- / / / / /_/ / / / / /_/ / /_/ / /_/ / /_/ /
-/_/ /_/\____/_/ /_/\__, /\____/_____/_____/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="MongoDB"
-var_disk="4"
+var_tags="database"
var_cpu="1"
var_ram="512"
-var_os="ubuntu"
-var_version="22.04"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/mongodb-org-7.0.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/mongodb-org-7.0.list && ! -f /etc/apt/sources.list.d/mongodb-org-8.0.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,3 +44,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
diff --git a/ct/motioneye.sh b/ct/motioneye.sh
index e3ce709a9..24103a394 100644
--- a/ct/motioneye.sh
+++ b/ct/motioneye.sh
@@ -1,64 +1,41 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/motioneye-project/motioneye
-function header_info {
-clear
-cat <<"EOF"
- __ ___ __ _
- / |/ /___ / /_(_)___ ____ ___ __ _____
- / /|_/ / __ \/ __/ / __ \/ __ \/ _ \/ / / / _ \
- / / / / /_/ / /_/ / /_/ / / / / __/ /_/ / __/
-/_/ /_/\____/\__/_/\____/_/ /_/\___/\__, /\___/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Motioneye"
-var_disk="8"
+var_tags="nvr"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/motioneye.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-pip install motioneye --upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/motioneye.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ pip install motioneye --upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -66,5 +43,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8765${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8765${CL}"
\ No newline at end of file
diff --git a/ct/mqtt.sh b/ct/mqtt.sh
index 86aa3c871..d975e8305 100644
--- a/ct/mqtt.sh
+++ b/ct/mqtt.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://mosquitto.org/
-function header_info {
-clear
-cat <<"EOF"
- __ ___ ____ _ ____________
- / |/ /___ _____/ __ \__ __(_)_ __/_ __/___
- / /|_/ / __ \/ ___/ / / / / / / / / / / / / __ \
- / / / / /_/ (__ ) /_/ / /_/ / / / / / / / /_/ /
-/_/ /_/\____/____/\___\_\__,_/_/ /_/ /_/ \____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="MQTT"
-var_disk="2"
+var_tags="mqtt"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/mosquitto/conf.d/default.conf ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/mosquitto/conf.d/default.conf ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,3 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following IP:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}${IP}:1883${CL}"
\ No newline at end of file
diff --git a/ct/mylar3.sh b/ct/mylar3.sh
new file mode 100644
index 000000000..b860d45bb
--- /dev/null
+++ b/ct/mylar3.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: davalanche
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/mylar3/mylar3
+
+# App Default Values
+APP="Mylar3"
+var_tags="torrent;downloader;comic"
+var_cpu="1"
+var_ram="512"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ if [[ ! -d /opt/mylar3 ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/mylar3/mylar3/releases/latest | jq -r '.tag_name')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating ${APP} to ${RELEASE}"
+ rm -rf /opt/mylar3/* /opt/mylar3/.*
+ wget -qO- https://github.com/mylar3/mylar3/archive/refs/tags/${RELEASE}.tar.gz | tar -xz --strip-components=1 -C /opt/mylar3
+ systemctl restart mylar3
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8090${CL}"
\ No newline at end of file
diff --git a/ct/myspeed.sh b/ct/myspeed.sh
index eaf8d3b6a..97ccc898b 100644
--- a/ct/myspeed.sh
+++ b/ct/myspeed.sh
@@ -1,96 +1,68 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://myspeed.dev/
-function header_info {
-clear
-cat <<"EOF"
- __ ___ _____ __
- / |/ /_ __/ ___/____ ___ ___ ____/ /
- / /|_/ / / / /\__ \/ __ \/ _ \/ _ \/ __ /
- / / / / /_/ /___/ / /_/ / __/ __/ /_/ /
-/_/ /_/\__, //____/ .___/\___/\___/\__,_/
- /____/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="MySpeed"
-var_disk="4"
+var_tags="tracking"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/myspeed ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-RELEASE=$(wget -q https://github.com/gnmyt/myspeed/releases/latest -O - | grep "title>Release" | cut -d " " -f 5)
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/myspeed ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(wget -q https://github.com/gnmyt/myspeed/releases/latest -O - | grep "title>Release" | cut -d " " -f 5)
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping ${APP} Service"
- systemctl stop myspeed
- msg_ok "Stopped ${APP} Service"
+ msg_info "Stopping ${APP} Service"
+ systemctl stop myspeed
+ msg_ok "Stopped ${APP} Service"
- msg_info "Updating ${APP} to ${RELEASE}"
- cd /opt
- rm -rf myspeed_bak
- mv myspeed myspeed_bak
- wget -q https://github.com/gnmyt/myspeed/releases/download/v$RELEASE/MySpeed-$RELEASE.zip
- unzip -q MySpeed-$RELEASE.zip -d myspeed
- cd myspeed
- npm install >/dev/null 2>&1
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cd /opt
+ rm -rf myspeed_bak
+ mv myspeed myspeed_bak
+ wget -q https://github.com/gnmyt/myspeed/releases/download/v$RELEASE/MySpeed-$RELEASE.zip
+ unzip -q MySpeed-$RELEASE.zip -d myspeed
+ cd myspeed
+ npm install >/dev/null 2>&1
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
- msg_info "Starting ${APP} Service"
- systemctl start myspeed
- msg_ok "Started ${APP} Service"
+ msg_info "Starting ${APP} Service"
+ systemctl start myspeed
+ msg_ok "Started ${APP} Service"
- msg_info "Cleaning up"
- rm -rf MySpeed-$RELEASE.zip
- msg_ok "Cleaned"
+ msg_info "Cleaning up"
+ rm -rf MySpeed-$RELEASE.zip
+ msg_ok "Cleaned"
- msg_ok "Updated Successfully!\n"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_ok "Updated Successfully!\n"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -98,5 +70,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:5216${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5216${CL}"
\ No newline at end of file
diff --git a/ct/mysql.sh b/ct/mysql.sh
index 17fe996b2..82ad1da0c 100644
--- a/ct/mysql.sh
+++ b/ct/mysql.sh
@@ -1,72 +1,49 @@
#!/usr/bin/env bash
-# source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# # Copyright (c) 2021-2024 tteck
-# # Author: tteck
-# # Co-Author: MickLesk (Canbiz)
-# # License: MIT
-# # https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck | Co-Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.mysql.com/
-echo "Unsupported."
+# App Default Values
+APP="MySQL"
+var_tags="database"
+var_cpu="1"
+var_ram="1024"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
-# function header_info {
-# clear
-# cat <<"EOF"
-# __ ___ _____ ____ __
-# / |/ /_ __/ ___// __ \ / /
-# / /|_/ / / / /\__ \/ / / / / /
-# / / / / /_/ /___/ / /_/ / / /___
-# /_/ /_/\__, //____/\___\_\/_____/
-# /____/
-# EOF
-# }
-# header_info
-# echo -e "Loading..."
-# APP="MySQL"
-# var_disk="4"
-# var_cpu="1"
-# var_ram="1024"
-# var_os="debian"
-# var_version="12"
-# variables
-# color
-# catch_errors
+# App Output & Base Settings
+header_info "$APP"
+base_settings
-# function default_settings() {
-# CT_TYPE="1"
-# PW=""
-# CT_ID=$NEXTID
-# HN=$NSAPP
-# DISK_SIZE="$var_disk"
-# CORE_COUNT="$var_cpu"
-# RAM_SIZE="$var_ram"
-# BRG="vmbr0"
-# NET="dhcp"
-# GATE=""
-# APT_CACHER=""
-# APT_CACHER_IP=""
-# DISABLEIP6="no"
-# MTU=""
-# SD=""
-# NS=""
-# MAC=""
-# VLAN=""
-# SSH="no"
-# VERB="no"
-# echo_default
-# }
+# Core
+variables
+color
+catch_errors
-# function update_script() {
-# header_info
-# if [[ ! -f /usr/share/keyrings/mysql.gpg ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-# msg_info "Updating ${APP} LXC"
-# apt-get update &>/dev/null
-# apt-get -y upgrade &>/dev/null
-# msg_ok "Updated Successfully"
-# exit
-# }
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /usr/share/keyrings/mysql.gpg ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
+}
-# start
-# build_container
-# description
+start
+build_container
+description
-# msg_ok "Completed Successfully!\n"
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following IP:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}${IP}:3306${CL}"
diff --git a/ct/n8n.sh b/ct/n8n.sh
index a2fc922e0..2248cfd24 100644
--- a/ct/n8n.sh
+++ b/ct/n8n.sh
@@ -1,61 +1,37 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://n8n.io/
-function header_info {
-clear
-cat <<"EOF"
- ___
- / _ \
- _ __ | (_) |____
- | _ \ > _ <| _ \
- | | | | (_) | | | |
- |_| |_|\___/|_| |_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="n8n"
-var_disk="6"
+var_tags="automation"
var_cpu="2"
var_ram="2048"
+var_disk="6"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/n8n.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/n8n.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
if ! command -v npm >/dev/null 2>&1; then
echo "Installing NPM..."
@@ -63,11 +39,11 @@ if [[ ! -f /etc/systemd/system/n8n.service ]]; then msg_error "No ${APP} Install
echo "Installed NPM..."
fi
fi
-msg_info "Updating ${APP} LXC"
-npm update -g n8n &>/dev/null
-systemctl restart n8n
-msg_ok "Updated Successfully"
-exit
+ msg_info "Updating ${APP} LXC"
+ npm update -g n8n &>/dev/null
+ systemctl restart n8n
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -75,5 +51,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5678${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5678${CL}"
\ No newline at end of file
diff --git a/ct/navidrome.sh b/ct/navidrome.sh
index de84e241f..b2f0ed092 100644
--- a/ct/navidrome.sh
+++ b/ct/navidrome.sh
@@ -1,76 +1,55 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.navidrome.org/
-function header_info {
-clear
-cat <<"EOF"
- _ __ _ __
- / | / /___ __ __(_)___/ /________ ____ ___ ___
- / |/ / __ / | / / / __ / ___/ __ \/ __ __ \/ _ \
- / /| / /_/ /| |/ / / /_/ / / / /_/ / / / / / / __/
-/_/ |_/\__,_/ |___/_/\__,_/_/ \____/_/ /_/ /_/\___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Navidrome"
-var_disk="4"
+var_tags="music"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/navidrome ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -s https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-msg_info "Stopping ${APP}"
-systemctl stop navidrome.service
-msg_ok "Stopped Navidrome"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/navidrome ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ msg_info "Stopping ${APP}"
+ systemctl stop navidrome
+ msg_ok "Stopped Navidrome"
-msg_info "Updating to v${RELEASE}"
-wget https://github.com/navidrome/navidrome/releases/download/v${RELEASE}/navidrome_${RELEASE}_linux_arm64.tar.gz -O Navidrome.tar.gz &>/dev/null
-tar -xvzf Navidrome.tar.gz -C /opt/navidrome/ &>/dev/null
-msg_ok "Updated ${APP}"
-rm Navidrome.tar.gz
+ msg_info "Updating to v${RELEASE}"
+ cd /opt
+ wget -q https://github.com/navidrome/navidrome/releases/download/v${RELEASE}/navidrome_${RELEASE}_linux_amd64.tar.gz -O Navidrome.tar.gz
+ tar -xvzf Navidrome.tar.gz -C /opt/navidrome/ &>/dev/null
+ chmod +x /opt/navidrome/navidrome
+ msg_ok "Updated ${APP}"
+ rm -rf /opt/Navidrome.tar.gz
-msg_info "${GN} Starting ${APP}"
-systemctl start navidrome.service
-msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ${APP}"
+ systemctl start navidrome.service
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -78,5 +57,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:4533${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4533${CL}"
diff --git a/ct/neo4j.sh b/ct/neo4j.sh
index 39f9cc2d4..94f1847bd 100644
--- a/ct/neo4j.sh
+++ b/ct/neo4j.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: havardthom
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck | Co-Author: havardthom
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://neo4j.com/product/neo4j-graph-database/
-function header_info {
-clear
-cat <<"EOF"
- _ __ __ __ _
- / | / /__ ____ / // / (_)
- / |/ / _ \/ __ \/ // /_/ /
- / /| / __/ /_/ /__ __/ /
-/_/ |_/\___/\____/ /_/_/ /
- /___/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Neo4j"
-var_disk="4"
+var_tags="database"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /etc/neo4j ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/neo4j ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Browser should be reachable by going to the following URL.
- ${BL}http://${IP}:7474${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7474${CL}"
\ No newline at end of file
diff --git a/ct/netbox.sh b/ct/netbox.sh
new file mode 100644
index 000000000..e40f51796
--- /dev/null
+++ b/ct/netbox.sh
@@ -0,0 +1,90 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: bvdberg01
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://netboxlabs.com/
+
+# App Default Values
+APP="NetBox"
+var_tags="network"
+var_cpu="2"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/netbox.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ RELEASE=$(curl -s https://api.github.com/repos/netbox-community/netbox/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+
+ msg_info "Stopping ${APP}"
+ systemctl stop netbox netbox-rq
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating $APP to v${RELEASE}"
+ mv /opt/netbox/ /opt/netbox-backup
+ cd /opt
+ wget -q "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q "v${RELEASE}.zip"
+ mv /opt/netbox-${RELEASE}/ /opt/netbox/
+
+ cp -r /opt/netbox-backup/netbox/netbox/configuration.py /opt/netbox/netbox/netbox/
+ cp -r /opt/netbox-backup/netbox/media/ /opt/netbox/netbox/
+ cp -r /opt/netbox-backup/netbox/scripts /opt/netbox/netbox/
+ cp -r /opt/netbox-backup/netbox/reports /opt/netbox/netbox/
+ cp -r /opt/netbox-backup/gunicorn.py /opt/netbox/
+
+ if [ -f /opt/netbox-backup/local_requirements.txt ]; then
+ cp -r /opt/netbox-backup/local_requirements.txt /opt/netbox/
+ fi
+
+ if [ -f /opt/netbox-backup/netbox/netbox/ldap_config.py ]; then
+ cp -r /opt/netbox-backup/netbox/netbox/ldap_config.py /opt/netbox/netbox/netbox/
+ fi
+
+ /opt/netbox/upgrade.sh &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated $APP to v${RELEASE}"
+
+ msg_info "Starting ${APP}"
+ systemctl start netbox netbox-rq
+ msg_ok "Started ${APP}"
+
+ msg_info "Cleaning up"
+ rm -r "/opt/v${RELEASE}.zip"
+ rm -r /opt/netbox-backup
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}https://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/nextcloudpi.sh b/ct/nextcloudpi.sh
index 64844a20b..d4724861d 100644
--- a/ct/nextcloudpi.sh
+++ b/ct/nextcloudpi.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.turnkeylinux.org/nextcloud
-function header_info {
-clear
-cat <<"EOF"
- _ __ __ ________ ______ _
- / | / /__ _ __/ /_/ ____/ /___ __ ______/ / __ \(_)
- / |/ / _ \| |/_/ __/ / / / __ \/ / / / __ / /_/ / /
- / /| / __/> /_/ /___/ / /_/ / /_/ / /_/ / ____/ /
-/_/ |_/\___/_/|_|\__/\____/_/\____/\__,_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="NextCloudPi"
-var_disk="8"
+var_tags="cloud"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /lib/systemd/system/nextcloud-domain.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /lib/systemd/system/nextcloud-domain.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}https://${IP}/${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/nextpvr.sh b/ct/nextpvr.sh
new file mode 100644
index 000000000..28e6748c0
--- /dev/null
+++ b/ct/nextpvr.sh
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://nextpvr.com/
+
+# App Default Values
+APP="NextPVR"
+var_tags="pvr"
+var_cpu="1"
+var_ram="1024"
+var_disk="5"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/nextpvr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop nextpvr-server
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating LXC packages"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated LXC packages"
+
+ msg_info "Updating ${APP}"
+ cd /opt
+ wget -q https://nextpvr.com/nextpvr-helper.deb
+ dpkg -i nextpvr-helper.deb &>/dev/null
+ msg_ok "Updated ${APP}"
+
+ msg_info "Starting ${APP}"
+ systemctl start nextpvr-server
+ msg_ok "Started ${APP}"
+
+ msg_info "Cleaning Up"
+ rm -rf /opt/nextpvr-helper.deb
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8866${CL}"
\ No newline at end of file
diff --git a/ct/nginxproxymanager.sh b/ct/nginxproxymanager.sh
index 44121774b..1e0a46cdf 100644
--- a/ct/nginxproxymanager.sh
+++ b/ct/nginxproxymanager.sh
@@ -1,60 +1,33 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://nginxproxymanager.com/
-function header_info {
- clear
- cat <<"EOF"
- _ __ _ ____ __ ___
- / | / /___ _(_)___ _ __ / __ \_________ __ ____ __ / |/ /___ _____ ____ _____ ____ _____
- / |/ / __ / / __ \| |/_/ / /_/ / ___/ __ \| |/_/ / / / / /|_/ / __ / __ \/ __ / __ / _ \/ ___/
- / /| / /_/ / / / / /> < / ____/ / / /_/ /> /_/ / / / / / /_/ / / / / /_/ / /_/ / __/ /
-/_/ |_/\__, /_/_/ /_/_/|_| /_/ /_/ \____/_/|_|\__, / /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/
- /____/ /____/ /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Nginx Proxy Manager"
-var_disk="4"
+var_tags="proxy"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
header_info
+ check_container_storage
+ check_container_resources
if [[ ! -f /lib/systemd/system/npm.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
@@ -187,5 +160,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:81${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:81${CL}"
\ No newline at end of file
diff --git a/ct/nocodb.sh b/ct/nocodb.sh
index 193c59ce1..26f8362e7 100644
--- a/ct/nocodb.sh
+++ b/ct/nocodb.sh
@@ -1,69 +1,46 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.nocodb.com/
-function header_info {
-clear
-cat <<"EOF"
- _ __ ____ ____
- / | / /___ ____ ___ / __ \/ __ )
- / |/ / __ \/ ___/ __ \/ / / / __ |
- / /| / /_/ / /__/ /_/ / /_/ / /_/ /
-/_/ |_/\____/\___/\____/_____/_____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="NocoDB"
-var_disk="4"
+var_tags="noCode"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/nocodb.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-systemctl stop nocodb.service
-cd /opt/nocodb
-rm -rf nocodb
-curl -s http://get.nocodb.com/linux-arm64 -o nocodb -L
-chmod +x nocodb
-systemctl start nocodb.service
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/nocodb.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ systemctl stop nocodb.service
+ cd /opt/nocodb
+ rm -rf nocodb
+ curl -s http://get.nocodb.com/linux-x64 -o nocodb -L
+ chmod +x nocodb
+ systemctl start nocodb.service
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -71,5 +48,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080/dashboard${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/dashboard${CL}"
\ No newline at end of file
diff --git a/ct/node-red.sh b/ct/node-red.sh
index f2c73789b..4cdd1025f 100644
--- a/ct/node-red.sh
+++ b/ct/node-red.sh
@@ -1,123 +1,100 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://nodered.org/
-function header_info {
-clear
-cat <<"EOF"
- _ __ __ ____ __
- / | / /___ ____/ /__ / __ \___ ____/ /
- / |/ / __ \/ __ / _ \ / /_/ / _ \/ __ /
- / /| / /_/ / /_/ / __/ / _, _/ __/ /_/ /
-/_/ |_/\____/\__,_/\___/ /_/ |_|\___/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Node-Red"
-var_disk="4"
+var_tags="automation"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-if [[ ! -d /root/.node-red ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \
- "1" "Update ${APP}" ON \
- "2" "Install Themes" OFF \
- 3>&1 1>&2 2>&3)
-header_info
-if [ "$UPD" == "1" ]; then
- if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
- if ! command -v npm >/dev/null 2>&1; then
- msg_info "Installing NPM"
- apt-get install -y npm >/dev/null 2>&1
- msg_ok "Installed NPM"
- fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /root/.node-red ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
fi
-msg_info "Stopping ${APP}"
-systemctl stop nodered
-msg_ok "Stopped ${APP}"
-
-msg_info "Updating ${APP}"
-npm install -g --unsafe-perm node-red &>/dev/null
-msg_ok "Updated ${APP}"
-
-msg_info "Starting ${APP}"
-systemctl start nodered
-msg_ok "Started ${APP}"
-msg_ok "Update Successful"
-exit
-fi
-if [ "$UPD" == "2" ]; then
-THEME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NODE-RED THEMES" --radiolist --cancel-button Exit-Script "Choose Theme" 15 58 6 \
- "aurora" "" OFF \
- "cobalt2" "" OFF \
- "dark" "" OFF \
- "dracula" "" OFF \
- "espresso-libre" "" OFF \
- "github-dark" "" OFF \
- "github-dark-default" "" OFF \
- "github-dark-dimmed" "" OFF \
- "midnight-red" "" ON \
- "monoindustrial" "" OFF \
- "monokai" "" OFF \
- "monokai-dimmed" "" OFF \
- "noctis" "" OFF \
- "oceanic-next" "" OFF \
- "oled" "" OFF \
- "one-dark-pro" "" OFF \
- "one-dark-pro-darker" "" OFF \
- "solarized-dark" "" OFF \
- "solarized-light" "" OFF \
- "tokyo-night" "" OFF \
- "tokyo-night-light" "" OFF \
- "tokyo-night-storm" "" OFF \
- "totallyinformation" "" OFF \
- "zenburn" "" OFF \
+ UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \
+ "1" "Update ${APP}" ON \
+ "2" "Install Themes" OFF \
3>&1 1>&2 2>&3)
-header_info
-msg_info "Installing ${THEME} Theme"
-cd /root/.node-red
-sed -i 's|// theme: ".*",|theme: "",|g' /root/.node-red/settings.js
-npm install @node-red-contrib-themes/theme-collection &>/dev/null
-sed -i "{s/theme: ".*"/theme: '${THEME}',/g}" /root/.node-red/settings.js
-systemctl restart nodered
-msg_ok "Installed ${THEME} Theme"
-exit
-fi
+ if [ "$UPD" == "1" ]; then
+ if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
+ if ! command -v npm >/dev/null 2>&1; then
+ msg_info "Installing NPM"
+ apt-get install -y npm >/dev/null 2>&1
+ msg_ok "Installed NPM"
+ fi
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop nodered
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP}"
+ npm install -g --unsafe-perm node-red &>/dev/null
+ msg_ok "Updated ${APP}"
+
+ msg_info "Starting ${APP}"
+ systemctl start nodered
+ msg_ok "Started ${APP}"
+ msg_ok "Update Successful"
+ exit
+ fi
+ if [ "$UPD" == "2" ]; then
+ THEME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NODE-RED THEMES" --radiolist --cancel-button Exit-Script "Choose Theme" 15 58 6 \
+ "aurora" "" OFF \
+ "cobalt2" "" OFF \
+ "dark" "" OFF \
+ "dracula" "" OFF \
+ "espresso-libre" "" OFF \
+ "github-dark" "" OFF \
+ "github-dark-default" "" OFF \
+ "github-dark-dimmed" "" OFF \
+ "midnight-red" "" ON \
+ "monoindustrial" "" OFF \
+ "monokai" "" OFF \
+ "monokai-dimmed" "" OFF \
+ "noctis" "" OFF \
+ "oceanic-next" "" OFF \
+ "oled" "" OFF \
+ "one-dark-pro" "" OFF \
+ "one-dark-pro-darker" "" OFF \
+ "solarized-dark" "" OFF \
+ "solarized-light" "" OFF \
+ "tokyo-night" "" OFF \
+ "tokyo-night-light" "" OFF \
+ "tokyo-night-storm" "" OFF \
+ "totallyinformation" "" OFF \
+ "zenburn" "" OFF \
+ 3>&1 1>&2 2>&3)
+ header_info
+ msg_info "Installing ${THEME} Theme"
+ cd /root/.node-red
+ sed -i 's|// theme: ".*",|theme: "",|g' /root/.node-red/settings.js
+ npm install @node-red-contrib-themes/theme-collection &>/dev/null
+ sed -i "{s/theme: ".*"/theme: '${THEME}',/g}" /root/.node-red/settings.js
+ systemctl restart nodered
+ msg_ok "Installed ${THEME} Theme"
+ exit
+ fi
}
start
@@ -125,5 +102,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:1880${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:1880${CL}"
\ No newline at end of file
diff --git a/ct/notifiarr.sh b/ct/notifiarr.sh
index 587fc69d5..c4011da4d 100644
--- a/ct/notifiarr.sh
+++ b/ct/notifiarr.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://notifiarr.com/
-function header_info {
-clear
-cat <<"EOF"
- _ __ __ _ _____
- / | / /___ / /_(_) __(_)___ ___________
- / |/ / __ \/ __/ / /_/ / __ `/ ___/ ___/
- / /| / /_/ / /_/ / __/ / /_/ / / / /
-/_/ |_/\____/\__/_/_/ /_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Notifiarr"
-var_disk="2"
+var_tags="arr"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/golift.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/golift.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5454${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5454${CL}"
\ No newline at end of file
diff --git a/ct/ntfy.sh b/ct/ntfy.sh
index f319b483a..3bd5ab0dc 100644
--- a/ct/ntfy.sh
+++ b/ct/ntfy.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://ntfy.sh/
-function header_info {
-clear
-cat <<"EOF"
- __ ____
- ____ / /_/ __/_ __
- / __ \/ __/ /_/ / / /
- / / / / /_/ __/ /_/ /
-/_/ /_/\__/_/ \__, /
- /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="ntfy"
-var_disk="2"
+var_tags="notification"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/nzbget.sh b/ct/nzbget.sh
index d4caa8f60..d65a638c9 100644
--- a/ct/nzbget.sh
+++ b/ct/nzbget.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: havardthom
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck | Co-Author: havardthom
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://nzbget.com/
-function header_info {
-clear
-cat <<"EOF"
- _ _______ ____ ______ __
- / | / /__ / / __ )/ ____/__ / /_
- / |/ / / / / __ / / __/ _ \/ __/
- / /| / / /__/ /_/ / /_/ / __/ /_
-/_/ |_/ /____/_____/\____/\___/\__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="NZBGet"
-var_disk="4"
+var_tags="usenet;downloader"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /lib/systemd/system/nzbget.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /lib/systemd/system/nzbget.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:6789${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6789${CL}"
\ No newline at end of file
diff --git a/ct/octoprint.sh b/ct/octoprint.sh
index 5365acd30..d063bdb08 100644
--- a/ct/octoprint.sh
+++ b/ct/octoprint.sh
@@ -1,74 +1,51 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://octoprint.org/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ ____ _ __
- / __ \_____/ /_____ / __ \_____(_)___ / /_
- / / / / ___/ __/ __ \/ /_/ / ___/ / __ \/ __/
-/ /_/ / /__/ /_/ /_/ / ____/ / / / / / / /_
-\____/\___/\__/\____/_/ /_/ /_/_/ /_/\__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="OctoPrint"
-var_disk="4"
+var_tags="3d-printing"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/octoprint ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Stopping OctoPrint"
-systemctl stop octoprint
-msg_ok "Stopped OctoPrint"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/octoprint ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping OctoPrint"
+ systemctl stop octoprint
+ msg_ok "Stopped OctoPrint"
-msg_info "Updating OctoPrint"
-source /opt/octoprint/bin/activate
-pip3 install octoprint --upgrade &>/dev/null
-msg_ok "Updated OctoPrint"
+ msg_info "Updating OctoPrint"
+ source /opt/octoprint/bin/activate
+ pip3 install octoprint --upgrade &>/dev/null
+ msg_ok "Updated OctoPrint"
-msg_info "Starting OctoPrint"
-systemctl start octoprint
-msg_ok "Started OctoPrint"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting OctoPrint"
+ systemctl start octoprint
+ msg_ok "Started OctoPrint"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -76,5 +53,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
\ No newline at end of file
diff --git a/ct/ollama.sh b/ct/ollama.sh
index 1b275ab64..2ae167492 100644
--- a/ct/ollama.sh
+++ b/ct/ollama.sh
@@ -1,66 +1,41 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: havardthom
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck | Co-Author: havardthom
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://ollama.com/
-function header_info {
-clear
-cat <<"EOF"
- ____ ____
- / __ \/ / /___ _____ ___ ____ _
- / / / / / / __ `/ __ `__ \/ __ `/
-/ /_/ / / / /_/ / / / / / / /_/ /
-\____/_/_/\__,_/_/ /_/ /_/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Ollama"
-var_disk="24"
+var_tags="ai"
var_cpu="4"
var_ram="4096"
+var_disk="24"
var_os="ubuntu"
var_version="22.04"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/ollama ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/ollama ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -68,5 +43,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:11434${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:14434${CL}"
\ No newline at end of file
diff --git a/ct/omada.sh b/ct/omada.sh
index 4d1810b92..5b850b797 100644
--- a/ct/omada.sh
+++ b/ct/omada.sh
@@ -1,72 +1,49 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.tp-link.com/us/support/download/omada-software-controller/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \____ ___ ____ _____/ /___ _
- / / / / __ __ \/ __ / __ / __ /
-/ /_/ / / / / / / /_/ / /_/ / /_/ /
-\____/_/ /_/ /_/\__,_/\__,_/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Omada"
-var_disk="8"
+var_tags="tp-link;controller"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/tplink ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-latest_url=$(curl -fsSL "https://www.tp-link.com/en/support/download/omada-software-controller/" | grep -o 'https://.*x64.deb' | head -n1)
-latest_version=$(basename "${latest_url}")
-if [ -z "${latest_version}" ]; then
- msg_error "It seems that the server (tp-link.com) might be down. Please try again at a later time."
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/tplink ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ latest_url=$(curl -s "https://support.omadanetworks.com/en/product/omada-software-controller/?resourceType=download" | grep -o 'https://static\.tp-link\.com/upload/software/[^"]*linux_x64[^"]*\.deb' | head -n 1)
+ latest_version=$(basename "$latest_url")
+ if [ -z "${latest_version}" ]; then
+ msg_error "It seems that the server (tp-link.com) might be down. Please try again at a later time."
+ exit
+ fi
+ echo -e "Updating Omada Controller"
+ wget -qL ${latest_url}
+ dpkg -i ${latest_version}
+ rm -rf ${latest_version}
+ echo -e "Updated Omada Controller"
exit
-fi
-echo -e "Updating Omada Controller"
-wget -qL ${latest_url}
-dpkg -i --ignore-depends=jsvc,mongodb-server ${latest_version}
-rm -rf ${latest_version}
-echo -e "Updated Omada Controller"
-exit
}
start
@@ -74,5 +51,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}https://${IP}:8043${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8043${CL}"
diff --git a/ct/ombi.sh b/ct/ombi.sh
index 4b23c799c..23030cc29 100644
--- a/ct/ombi.sh
+++ b/ct/ombi.sh
@@ -1,81 +1,58 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://ombi.io/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ _
- / __ \____ ___ / /_ (_)
- / / / / __ `__ \/ __ \/ /
-/ /_/ / / / / / / /_/ / /
-\____/_/ /_/ /_/_.___/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Ombi"
-var_disk="4"
+var_tags="media"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/ombi ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -sL https://api.github.com/repos/Ombi-app/Ombi/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
-if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop ombi
- msg_ok "Stopped ${APP}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/ombi ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -sL https://api.github.com/repos/Ombi-app/Ombi/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop ombi
+ msg_ok "Stopped ${APP}"
- msg_info "Updating ${APP} to ${RELEASE}"
- wget -q https://github.com/Ombi-app/Ombi/releases/download/${RELEASE}/linux-arm64.tar.gz
- tar -xzf linux-arm64.tar.gz -C /opt/ombi
- rm -rf linux-arm64.tar.gz
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ wget -q https://github.com/Ombi-app/Ombi/releases/download/${RELEASE}/linux-x64.tar.gz
+ tar -xzf linux-x64.tar.gz -C /opt/ombi
+ rm -rf linux-x64.tar.gz
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
- msg_info "Starting ${APP}"
- systemctl start ombi
- msg_ok "Started ${APP}"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} ia already at ${RELEASE}."
-fi
-exit
+ msg_info "Starting ${APP}"
+ systemctl start ombi
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} ia already at ${RELEASE}."
+ fi
+ exit
}
start
@@ -83,5 +60,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
\ No newline at end of file
diff --git a/ct/omv.sh b/ct/omv.sh
index 565a7e349..43dd10dd0 100644
--- a/ct/omv.sh
+++ b/ct/omv.sh
@@ -1,71 +1,49 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.openmediavault.org/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ ___ ___ _ __ ____
- / __ \____ ___ ____ / |/ /__ ____/ (_)___ | | / /___ ___ __/ / /_
- / / / / __ \/ _ \/ __ \/ /|_/ / _ \/ __ / / __ `/ | / / __ `/ / / / / __/
-/ /_/ / /_/ / __/ / / / / / / __/ /_/ / / /_/ /| |/ / /_/ / /_/ / / /_
-\____/ .___/\___/_/ /_/_/ /_/\___/\__,_/_/\__,_/ |___/\__,_/\__,_/_/\__/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="OMV"
-var_disk="4"
+var_tags="media"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/openmediavault.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/openmediavault.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
build_container
description
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}${CL} \n"
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/onedev.sh b/ct/onedev.sh
new file mode 100644
index 000000000..1b8a34077
--- /dev/null
+++ b/ct/onedev.sh
@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: kristocopani
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://onedev.io/
+
+# App Default Values
+APP="OneDev"
+var_tags="git"
+var_cpu="2"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -f /etc/systemd/system/onedev.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ GITHUB_RELEASE=$(curl -s https://api.github.com/repos/theonedev/onedev/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${GITHUB_RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop onedev
+ msg_ok "Stopped Service"
+
+ msg_info "Updating ${APP} to v${GITHUB_RELEASE}"
+ cd /opt
+ wget -q https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz
+ tar -xzf onedev-latest.tar.gz
+ /opt/onedev-latest/bin/upgrade.sh /opt/onedev >/dev/null
+ RELEASE=$(cat /opt/onedev/release.properties | grep "version" | cut -d'=' -f2)
+ echo "${RELEASE}" >"/opt/${APP}_version.txt"
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Service"
+ systemctl start onedev
+ msg_ok "Started Service"
+
+ msg_info "Cleaning up"
+ rm -rf /opt/onedev-latest
+ rm -rf /opt/onedev-latest.tar.gz
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6610${CL}"
\ No newline at end of file
diff --git a/ct/openhab.sh b/ct/openhab.sh
index a5dd7f7b0..d98fab593 100644
--- a/ct/openhab.sh
+++ b/ct/openhab.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.openhab.org/
-function header_info {
-clear
-cat <<"EOF"
- __ _____ ____
- ____ ____ ___ ____ / / / / | / __ )
- / __ \/ __ \/ _ \/ __ \/ /_/ / /| | / __ |
-/ /_/ / /_/ / __/ / / / __ / ___ |/ /_/ /
-\____/ .___/\___/_/ /_/_/ /_/_/ |_/_____/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="openHAB"
-var_disk="8"
+var_tags="automation"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/openhab.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/openhab.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
\ No newline at end of file
diff --git a/ct/openobserve.sh b/ct/openobserve.sh
index c7e400813..4c8efd6cb 100644
--- a/ct/openobserve.sh
+++ b/ct/openobserve.sh
@@ -1,69 +1,44 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://openobserve.ai/
-function header_info {
-clear
-cat <<"EOF"
-
- ____ ____ __
- / __ \____ ___ ____ / __ \/ /_ ________ ______ _____
- / / / / __ \/ _ \/ __ \/ / / / __ \/ ___/ _ \/ ___/ | / / _ \
-/ /_/ / /_/ / __/ / / / /_/ / /_/ (__ ) __/ / | |/ / __/
-\____/ .___/\___/_/ /_/\____/_.___/____/\___/_/ |___/\___/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="OpenObserve"
-var_disk="3"
+var_tags="monitoring"
var_cpu="1"
var_ram="512"
+var_disk="3"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/openobserve/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-systemctl stop openobserve
-LATEST=$(curl -sL https://api.github.com/repos/openobserve/openobserve/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
-tar zxvf <(curl -fsSL https://github.com/openobserve/openobserve/releases/download/$LATEST/openobserve-${LATEST}-linux-arm64.tar.gz) -C /opt/openobserve
-systemctl start openobserve
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/openobserve/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ systemctl stop openobserve
+ LATEST=$(curl -sL https://api.github.com/repos/openobserve/openobserve/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
+ tar zxvf <(curl -fsSL https://github.com/openobserve/openobserve/releases/download/$LATEST/openobserve-${LATEST}-linux-amd64.tar.gz) -C /opt/openobserve
+ systemctl start openobserve
+ msg_ok "Updated $APP"
+ exit
}
start
@@ -71,5 +46,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5080${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5080${CL}"
\ No newline at end of file
diff --git a/ct/openwebui.sh b/ct/openwebui.sh
index daee783a0..a09617bda 100644
--- a/ct/openwebui.sh
+++ b/ct/openwebui.sh
@@ -1,79 +1,53 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: havardthom
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: havardthom
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://openwebui.com/
-function header_info {
-clear
-cat <<"EOF"
- ____ _ __ __ __ ______
- / __ \____ ___ ____ | | / /__ / /_ / / / / _/
- / / / / __ \/ _ \/ __ \ | | /| / / _ \/ __ \/ / / // /
-/ /_/ / /_/ / __/ / / / | |/ |/ / __/ /_/ / /_/ // /
-\____/ .___/\___/_/ /_/ |__/|__/\___/_.___/\____/___/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Open WebUI"
-var_disk="16"
+var_tags="ai;interface"
var_cpu="4"
var_ram="4096"
+var_disk="16"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/open-webui ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} (Patience)"
-cd /opt/open-webui
-output=$(git pull --no-rebase)
-if echo "$output" | grep -q "Already up to date."
-then
- msg_ok "$APP is already up to date."
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/open-webui ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} (Patience)"
+ cd /opt/open-webui
+ output=$(git pull --no-rebase)
+ if echo "$output" | grep -q "Already up to date."; then
+ msg_ok "$APP is already up to date."
+ exit
+ fi
+ systemctl stop open-webui.service
+ npm install &>/dev/null
+ export NODE_OPTIONS="--max-old-space-size=3584"
+ npm run build &>/dev/null
+ cd ./backend
+ pip install -r requirements.txt -U &>/dev/null
+ systemctl start open-webui.service
+ msg_ok "Updated Successfully"
exit
-fi
-systemctl stop open-webui.service
-npm install &>/dev/null
-export NODE_OPTIONS="--max-old-space-size=3584"
-npm run build &>/dev/null
-cd ./backend
-pip install -r requirements.txt -U &>/dev/null
-systemctl start open-webui.service
-msg_ok "Updated Successfully"
-exit
}
start
@@ -81,5 +55,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
\ No newline at end of file
diff --git a/ct/overseerr.sh b/ct/overseerr.sh
index 2660a2511..333849672 100644
--- a/ct/overseerr.sh
+++ b/ct/overseerr.sh
@@ -1,76 +1,52 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://overseerr.dev/
-function header_info {
-clear
-cat <<"EOF"
- ____
- / __ \_ _____ _____________ ___ __________
- / / / / | / / _ \/ ___/ ___/ _ \/ _ \/ ___/ ___/
-/ /_/ /| |/ / __/ / (__ ) __/ __/ / / /
-\____/ |___/\___/_/ /____/\___/\___/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Overseerr"
-var_disk="8"
+var_tags="media"
var_cpu="2"
-var_ram="3072"
+var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/overseerr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-systemctl stop overseerr
-cd /opt/overseerr
-output=$(git pull)
-git pull &>/dev/null
-if echo "$output" | grep -q "Already up to date."
-then
- msg_ok " $APP is already up to date."
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/overseerr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ systemctl stop overseerr
+ cd /opt/overseerr
+ output=$(git pull)
+ git pull &>/dev/null
+ if echo "$output" | grep -q "Already up to date."; then
+ msg_ok " $APP is already up to date."
+ systemctl start overseerr
+ exit
+ fi
+ yarn install &>/dev/null
+ yarn build &>/dev/null
systemctl start overseerr
+ msg_ok "Updated $APP"
exit
-fi
-yarn install &>/dev/null
-yarn build &>/dev/null
-systemctl start overseerr
-msg_ok "Updated $APP"
-exit
}
start
@@ -78,5 +54,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5055${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}"
\ No newline at end of file
diff --git a/ct/owncast.sh b/ct/owncast.sh
index 47eff116f..0800317d5 100644
--- a/ct/owncast.sh
+++ b/ct/owncast.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://owncast.online/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \_ ______ _________ ______/ /_
- / / / / | /| / / __ \/ ___/ __ `/ ___/ __/
-/ /_/ /| |/ |/ / / / / /__/ /_/ (__ ) /_
-\____/ |__/|__/_/ /_/\___/\__,_/____/\__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Owncast"
-var_disk="2"
+var_tags="broadcasting"
var_cpu="2"
var_ram="2048"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/owncast ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/owncast ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,6 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080${CL}
- ${BL}http://${IP}:8080/admin${CL} admin|abc123\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/admin${CL}"
\ No newline at end of file
diff --git a/ct/pairdrop.sh b/ct/pairdrop.sh
index 86c781d4a..777dcf6ba 100644
--- a/ct/pairdrop.sh
+++ b/ct/pairdrop.sh
@@ -1,68 +1,45 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://pairdrop.net/
-function header_info {
-clear
-cat <<"EOF"
- ____ _ ____
- / __ \____ _(_)____/ __ \_________ ____
- / /_/ / __ `/ / ___/ / / / ___/ __ \/ __ \
- / ____/ /_/ / / / / /_/ / / / /_/ / /_/ /
-/_/ \__,_/_/_/ /_____/_/ \____/ .___/
- /_/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="PairDrop"
-var_disk="4"
+var_tags="sharing"
var_cpu="1"
var_ram="512"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/pairdrop ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-systemctl stop pairdrop
-cd /opt/pairdrop
-git pull
-npm install
-systemctl start pairdrop
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/pairdrop ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ systemctl stop pairdrop
+ cd /opt/pairdrop
+ git pull
+ npm install
+ systemctl start pairdrop
+ msg_ok "Updated $APP"
+ exit
}
start
@@ -70,5 +47,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/paperless-ngx.sh b/ct/paperless-ngx.sh
index a810b545d..f462176bb 100644
--- a/ct/paperless-ngx.sh
+++ b/ct/paperless-ngx.sh
@@ -1,58 +1,29 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://docs.paperless-ngx.com/
-function header_info {
- clear
- cat <<"EOF"
- ____ __
- / __ \____ _____ ___ _____/ /__ __________ ____ ____ __ __
- / /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/___/ __ \/ __ `/ |/_/
- / ____/ /_/ / /_/ / __/ / / / __(__ |__ )___/ / / / /_/ /> <
-/_/ \__,_/ .___/\___/_/ /_/\___/____/____/ /_/ /_/\__, /_/|_|
- /_/ /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Paperless-ngx"
-var_disk="10"
+var_tags="document;management"
var_cpu="2"
var_ram="2048"
+var_disk="10"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
if [[ ! -d /opt/paperless ]]; then
msg_error "No ${APP} Installation Found!"
@@ -65,10 +36,12 @@ function update_script() {
"2" "Paperless-ngx Credentials" OFF \
3>&1 1>&2 2>&3)
header_info
+ check_container_storage
+ check_container_resources
if [ "$UPD" == "1" ]; then
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- if [[ "$(gs --version 2>/dev/null)" != "10.04.0" ]]; then
- msg_info "Updating Ghostscript"
+ if [[ "$(gs --version 2>/dev/null)" != "10.04.0" ]]; then
+ msg_info "Updating Ghostscript (Patience)"
cd /tmp
wget -q https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz
tar -xzf ghostscript-10.04.0.tar.gz
@@ -123,5 +96,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
\ No newline at end of file
diff --git a/ct/part-db.sh b/ct/part-db.sh
new file mode 100644
index 000000000..4447a4c64
--- /dev/null
+++ b/ct/part-db.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: bvdberg01
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://docs.part-db.de/
+
+# App Default Values
+APP="Part-DB"
+var_tags="inventory;parts"
+var_cpu="2"
+var_ram="1024"
+var_disk="8"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/partdb ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/Part-DB/Part-DB-server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop apache2
+ msg_ok "Stopped Service"
+
+ msg_info "Updating $APP to v${RELEASE}"
+ cd /opt
+ mv /opt/partdb/ /opt/partdb-backup
+ wget -q "https://github.com/Part-DB/Part-DB-server/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q "v${RELEASE}.zip"
+ mv /opt/Part-DB-server-${RELEASE}/ /opt/partdb
+
+ cd /opt/partdb/
+ cp -r "/opt/partdb-backup/.env.local" /opt/partdb/
+ cp -r "/opt/partdb-backup/public/media" /opt/partdb/public/
+ cp -r "/opt/partdb-backup/config/banner.md" /opt/partdb/config/
+
+ export COMPOSER_ALLOW_SUPERUSER=1
+ composer install --no-dev -o --no-interaction &>/dev/null
+ yarn install &>/dev/null
+ yarn build &>/dev/null
+ php bin/console cache:clear &>/dev/null
+ php bin/console doctrine:migrations:migrate -n &>/dev/null
+ chown -R www-data:www-data /opt/partdb
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated $APP to v${RELEASE}"
+
+ msg_info "Starting Service"
+ systemctl start apache2
+ msg_ok "Started Service"
+
+ msg_info "Cleaning up"
+ rm -r "/opt/v${RELEASE}.zip"
+ rm -r /opt/partdb-backup
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/pbs.sh b/ct/pbs.sh
index 1fab6a763..c515681f8 100644
--- a/ct/pbs.sh
+++ b/ct/pbs.sh
@@ -1,9 +1,8 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
function header_info {
clear
@@ -17,49 +16,33 @@ cat <<"EOF"
EOF
}
header_info
-echo -e "Loading..."
APP="PBS"
-var_disk="10"
+var_tags="backup"
var_cpu="2"
var_ram="2048"
+var_disk="10"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +50,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8007${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8007${CL}"
\ No newline at end of file
diff --git a/ct/peanut.sh b/ct/peanut.sh
index 67bc970cc..6c7350287 100644
--- a/ct/peanut.sh
+++ b/ct/peanut.sh
@@ -1,61 +1,37 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: remz1337
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/Brandawg93/PeaNUT/
-function header_info {
-clear
-cat <<"EOF"
- ____ _ ____ ________
- / __ \___ ____ _/ | / / / / /_ __/
- / /_/ / _ \/ __ `/ |/ / / / / / /
- / ____/ __/ /_/ / /| / /_/ / / /
-/_/ \___/\__,_/_/ |_/\____/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="PeaNUT"
-var_disk="4"
+var_tags="network;ups;"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
header_info
- if [[ ! -f /etc/systemd/system/peanut.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
- whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/peanut.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
RELEASE=$(curl -sL https://api.github.com/repos/Brandawg93/PeaNUT/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
msg_info "Updating $APP to ${RELEASE}"
@@ -82,10 +58,7 @@ start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 1024
-pct set $CTID -cores 1
-msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/petio.sh b/ct/petio.sh
index 6d4086108..51f1eefe4 100644
--- a/ct/petio.sh
+++ b/ct/petio.sh
@@ -1,67 +1,43 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://petio.tv/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ _
- / __ \___ / /_(_)___
- / /_/ / _ \/ __/ / __ \
- / ____/ __/ /_/ / /_/ /
-/_/ \___/\__/_/\____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Petio"
-var_disk="4"
+var_tags="media"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="ubuntu"
var_version="20.04"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/Petio ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-systemctl stop petio.service
-wget https://petio.tv/releases/latest -O petio-latest.zip
-unzip petio-latest.zip -d /opt/Petio
-systemctl start petio.service
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/Petio ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ systemctl stop petio.service
+ wget https://petio.tv/releases/latest -O petio-latest.zip
+ unzip petio-latest.zip -d /opt/Petio
+ systemctl start petio.service
+ msg_ok "Updated $APP"
+ exit
}
start
@@ -69,5 +45,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:7777${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7777${CL}"
\ No newline at end of file
diff --git a/ct/pf2etools.sh b/ct/pf2etools.sh
new file mode 100644
index 000000000..deb3f4d27
--- /dev/null
+++ b/ct/pf2etools.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: TheRealVira
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://pf2etools.com/
+
+# App Default Values
+APP="Pf2eTools"
+var_tags="wiki"
+var_cpu="1"
+var_ram="512"
+var_disk="6"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ # Check if installation is present | -f for file, -d for folder
+ if [[ ! -d "/opt/${APP}" ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ RELEASE=$(curl -s https://api.github.com/repos/Pf2eToolsOrg/Pf2eTools/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f "/opt/${APP}_version.txt" ]]; then
+ # Crawling the new version and checking whether an update is required
+ msg_info "Updating System"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated System"
+
+ # Execute Update
+ msg_info "Updating ${APP}"
+ cd /opt
+ wget -q "https://github.com/Pf2eToolsOrg/Pf2eTools/archive/refs/tags/${RELEASE}.zip"
+ unzip -q ${RELEASE}.zip
+ rm -rf "/opt/${APP}"
+ mv ${APP}-${RELEASE:1} /opt/${APP}
+ cd /opt/Pf2eTools
+ $STD npm install
+ $STD npm run build
+ echo "${RELEASE}" >"/opt/${APP}_version.txt"
+ msg_ok "Updated ${APP}"
+
+ chown -R www-data: "/opt/${APP}"
+ chmod -R 755 "/opt/${APP}"
+
+ # Cleaning up
+ msg_info "Cleaning Up"
+ rm -rf /opt/${RELEASE}.zip
+ $STD apt-get -y autoremove
+ $STD apt-get -y autoclean
+ msg_ok "Cleanup Completed"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/photoprism.sh b/ct/photoprism.sh
index 644959852..0ac84e4a8 100644
--- a/ct/photoprism.sh
+++ b/ct/photoprism.sh
@@ -1,71 +1,44 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.photoprism.app/
-function header_info {
- clear
- cat <<"EOF"
- ____ __ ______ __________ ____ ____ _________ __ ___
- / __ \/ / / / __ \/_ __/ __ \/ __ \/ __ \/ _/ ___// |/ /
- / /_/ / /_/ / / / / / / / / / / /_/ / /_/ // / \__ \/ /|_/ /
- / ____/ __ / /_/ / / / / /_/ / ____/ _, _// / ___/ / / / /
-/_/ /_/ /_/\____/ /_/ \____/_/ /_/ |_/___//____/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="PhotoPrism"
-var_disk="8"
+var_tags="media;photo"
var_cpu="2"
-var_ram="2048"
+var_ram="3072"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
header_info
+ check_container_storage
+ check_container_resources
if [[ ! -d /opt/photoprism ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
- echo -e "\n ⚠️ Ensure you set 2vCPU & 3072MiB RAM MIMIMUM!!! \n"
msg_info "Stopping PhotoPrism"
sudo systemctl stop photoprism
msg_ok "Stopped PhotoPrism"
msg_info "Updating PhotoPrism"
apt-get install -y libvips42 &>/dev/null
- wget -q -cO - https://dl.photoprism.app/pkg/linux/arm64.tar.gz | tar -xzf - -C /opt/photoprism --strip-components=1
+ wget -q -cO - https://dl.photoprism.app/pkg/linux/amd64.tar.gz | tar -xzf - -C /opt/photoprism --strip-components=1
msg_ok "Updated PhotoPrism"
msg_info "Starting PhotoPrism"
@@ -80,5 +53,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:2342${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:2342${CL}"
\ No newline at end of file
diff --git a/ct/pialert.sh b/ct/pialert.sh
index 261629cc7..88a91181b 100644
--- a/ct/pialert.sh
+++ b/ct/pialert.sh
@@ -1,63 +1,40 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/leiweibau/Pi.Alert/
-function header_info {
-clear
-cat <<"EOF"
- ____ _ ___ __ __
- / __ \(_) / | / /__ _____/ /_
- / /_/ / / / /| | / / _ \/ ___/ __/
- / ____/ / / ___ |/ / __/ / / /_
-/_/ /_(_)_/ |_/_/\___/_/ \__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="PiAlert"
-var_disk="3"
+var_tags="network"
var_cpu="1"
var_ram="512"
+var_disk="3"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/pialert ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-bash -c "$(wget -qLO - https://github.com/leiweibau/Pi.Alert/raw/main/install/pialert_update.sh)" -s --lxc
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/pialert ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ bash -c "$(wget -qLO - https://github.com/leiweibau/Pi.Alert/raw/main/install/pialert_update.sh)" -s --lxc
+ msg_ok "Updated $APP"
+ exit
}
start
@@ -65,5 +42,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}/pialert/${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/pialert${CL}"
\ No newline at end of file
diff --git a/ct/pihole.sh b/ct/pihole.sh
index 2e95c8e23..499ba3dbd 100644
--- a/ct/pihole.sh
+++ b/ct/pihole.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://pi-hole.net/
-function header_info {
-clear
-cat <<"EOF"
- ____ ____ __ ______ __ ______
- / __ \/ _/ / / / / __ \/ / / ____/
- / /_/ // /___/ /_/ / / / / / / __/
- / ____// /___/ __ / /_/ / /___/ /___
-/_/ /___/ /_/ /_/\____/_____/_____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Pihole"
-var_disk="2"
+var_tags="adblock"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /etc/pihole ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-set +e
-pihole -up
-msg_ok "Updated ${APP}"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/pihole ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ set +e
+ pihole -up
+ msg_ok "Updated ${APP}"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}/admin${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/admin${CL}"
\ No newline at end of file
diff --git a/ct/pingvin.sh b/ct/pingvin.sh
index 56f53c162..debca84ac 100644
--- a/ct/pingvin.sh
+++ b/ct/pingvin.sh
@@ -1,82 +1,59 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://stonith404.github.io/pingvin-share/introduction
-function header_info {
-clear
-cat <<"EOF"
- ____ _ _ _____ __
- / __ \(_)___ ____ __ __(_)___ / ___// /_ ____ _________
- / /_/ / / __ \/ __ `/ | / / / __ \ \__ \/ __ \/ __ `/ ___/ _ \
- / ____/ / / / / /_/ /| |/ / / / / / ___/ / / / / /_/ / / / __/
-/_/ /_/_/ /_/\__, / |___/_/_/ /_/ /____/_/ /_/\__,_/_/ \___/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Pingvin"
-var_disk="8"
+var_tags="sharing"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/pingvin-share ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Stopping Pingvin Share"
-systemctl stop pm2-root.service
-msg_ok "Stopped Pingvin Share"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/pingvin-share ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping Pingvin Share"
+ systemctl stop pm2-root.service
+ msg_ok "Stopped Pingvin Share"
-msg_info "Updating Pingvin Share"
-cd /opt/pingvin-share
-git fetch --tags
-git checkout $(git describe --tags `git rev-list --tags --max-count=1`) &>/dev/null
-cd backend
-npm install &>/dev/null
-npm run build &>/dev/null
-cd ../frontend
-npm install &>/dev/null
-npm run build &>/dev/null
-msg_ok "Updated Pingvin Share"
+ msg_info "Updating Pingvin Share"
+ cd /opt/pingvin-share
+ git fetch --tags
+ git checkout $(git describe --tags $(git rev-list --tags --max-count=1)) &>/dev/null
+ cd backend
+ npm install &>/dev/null
+ npm run build &>/dev/null
+ cd ../frontend
+ npm install &>/dev/null
+ npm run build &>/dev/null
+ msg_ok "Updated Pingvin Share"
-msg_info "Starting Pingvin Share"
-systemctl start pm2-root.service
-msg_ok "Started Pingvin Share"
+ msg_info "Starting Pingvin Share"
+ systemctl start pm2-root.service
+ msg_ok "Started Pingvin Share"
-msg_ok "Updated Successfully"
-exit
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -84,5 +61,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000 ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/plex.sh b/ct/plex.sh
index fb0bbd471..b4c95beaa 100644
--- a/ct/plex.sh
+++ b/ct/plex.sh
@@ -1,77 +1,53 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.plex.tv/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ __ ___ ___ _____
- / __ \/ /__ _ __ / |/ /__ ____/ (_)___ _ / ___/___ ______ _____ _____
- / /_/ / / _ \| |/_/ / /|_/ / _ \/ __ / / __ `/ \__ \/ _ \/ ___/ | / / _ \/ ___/
- / ____/ / __/> < / / / / __/ /_/ / / /_/ / ___/ / __/ / | |/ / __/ /
-/_/ /_/\___/_/|_| /_/ /_/\___/\__,_/_/\__,_/ /____/\___/_/ |___/\___/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Plex"
-var_disk="8"
+var_tags="media"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="ubuntu"
var_version="22.04"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-if [[ ! -f /etc/apt/sources.list.d/plexmediaserver.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select \nplexupdate info >> https://github.com/mrworf/plexupdate" 10 59 2 \
- "1" "Update LXC" ON \
- "2" "Install plexupdate" OFF \
- 3>&1 1>&2 2>&3)
-
-header_info
-if [ "$UPD" == "1" ]; then
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated ${APP} LXC"
-exit
-fi
-if [ "$UPD" == "2" ]; then
-set +e
-bash -c "$(wget -qO - https://raw.githubusercontent.com/mrworf/plexupdate/master/extras/installer.sh)"
-exit
-fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/plexmediaserver.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select \nplexupdate info >> https://github.com/mrworf/plexupdate" 10 59 2 \
+ "1" "Update LXC" ON \
+ "2" "Install plexupdate" OFF \
+ 3>&1 1>&2 2>&3)
+ if [ "$UPD" == "1" ]; then
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
+ fi
+ if [ "$UPD" == "2" ]; then
+ set +e
+ bash -c "$(wget -qO - https://raw.githubusercontent.com/mrworf/plexupdate/master/extras/installer.sh)"
+ exit
+ fi
}
start
@@ -79,5 +55,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:32400/web${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:32400/web${CL}"
diff --git a/ct/pocketbase.sh b/ct/pocketbase.sh
index 0ed0ed940..13ba21d4f 100644
--- a/ct/pocketbase.sh
+++ b/ct/pocketbase.sh
@@ -1,55 +1,50 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://pocketbase.io/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ __ __
- / __ \____ _____/ /_____ / /_/ /_ ____ _________
- / /_/ / __ \/ ___/ //_/ _ \/ __/ __ \/ __ `/ ___/ _ \
- / ____/ /_/ / /__/ ,< / __/ /_/ /_/ / /_/ (__ ) __/
-/_/ \____/\___/_/|_|\___/\__/_.___/\__,_/____/\___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Pocketbase"
-var_disk="8"
+var_tags="database"
var_cpu="1"
var_ram="512"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/pocketbase.service || ! -x /opt/pocketbase/pocketbase ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop pocketbase
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP}"
+ /opt/pocketbase/pocketbase update
+ msg_ok "Updated ${APP}"
+
+ msg_info "Starting ${APP}"
+ systemctl start pocketbase
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -57,5 +52,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080/_${CL}"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/_${CL}"
diff --git a/ct/podman-homeassistant.sh b/ct/podman-homeassistant.sh
index 134875ade..e796fb9c4 100644
--- a/ct/podman-homeassistant.sh
+++ b/ct/podman-homeassistant.sh
@@ -1,62 +1,32 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \____ ____/ /___ ___ ____ _____
- / /_/ / __ \/ __ / __ __ \/ __ / __ \
- / ____/ /_/ / /_/ / / / / / / /_/ / / / /
- __ __ /_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/__ __
- / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_
- / /_/ / __ \/ __ __ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ / __ \/ __/
- / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_
-/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Podman-Home Assistant"
-var_disk="16"
+var_tags="podman;smarthome"
var_cpu="2"
var_ram="2048"
+var_disk="16"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
+header_info
+check_container_storage
+check_container_resources
if [[ ! -f /etc/systemd/system/homeassistant.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
"1" "Update system and containers" ON \
@@ -64,7 +34,7 @@ function update_script() {
"3" "Install FileBrowser" OFF \
"4" "Remove ALL Unused Images" OFF \
3>&1 1>&2 2>&3)
-header_info
+
if [ "$UPD" == "1" ]; then
msg_info "Updating ${APP} LXC"
apt-get update &>/dev/null
@@ -139,5 +109,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8123${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8123${CL}"
\ No newline at end of file
diff --git a/ct/podman.sh b/ct/podman.sh
index ce2113456..28c946355 100644
--- a/ct/podman.sh
+++ b/ct/podman.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://podman.io/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \____ ____/ /___ ___ ____ _____
- / /_/ / __ \/ __ / __ `__ \/ __ `/ __ \
- / ____/ /_/ / /_/ / / / / / / /_/ / / / /
-/_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Podman"
-var_disk="4"
+var_tags="container;kubernetes"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/containers/registries.conf ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/containers/registries.conf ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,3 +44,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/postgresql.sh b/ct/postgresql.sh
index 61c0d580f..06cb0c498 100644
--- a/ct/postgresql.sh
+++ b/ct/postgresql.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.postgresql.org/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ _____ ____ __
- / __ \____ _____/ /_____ _________ / ___// __ \ / /
- / /_/ / __ \/ ___/ __/ __ / ___/ _ \\__ \/ / / / / /
- / ____/ /_/ (__ ) /_/ /_/ / / / __/__/ / /_/ / / /___
-/_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="PostgreSQL"
-var_disk="4"
+var_tags="database"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/pgdg.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/pgdg.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,3 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following IP:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}${IP}:5432${CL}"
\ No newline at end of file
diff --git a/ct/prometheus.sh b/ct/prometheus.sh
index 8c4e96711..ffd9adc09 100644
--- a/ct/prometheus.sh
+++ b/ct/prometheus.sh
@@ -1,84 +1,61 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://prometheus.io/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ __
- / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______
- / /_/ / ___/ __ \/ __ __ \/ _ \/ __/ __ \/ _ \/ / / / ___/
- / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ )
-/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Prometheus"
-var_disk="4"
+var_tags="monitoring"
var_cpu="1"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/prometheus.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop prometheus
- msg_ok "Stopped ${APP}"
-
- msg_info "Updating ${APP} to ${RELEASE}"
- wget -q https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
- tar -xf prometheus-${RELEASE}.linux-amd64.tar.gz
- cd prometheus-${RELEASE}.linux-amd64
- cp -rf prometheus promtool /usr/local/bin/
- cd ~
- rm -rf prometheus-${RELEASE}.linux-amd64 prometheus-${RELEASE}.linux-amd64.tar.gz
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/prometheus.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/prometheus/prometheus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop prometheus
+ msg_ok "Stopped ${APP}"
- msg_info "Starting ${APP}"
- systemctl start prometheus
- msg_ok "Started ${APP}"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Updating ${APP} to ${RELEASE}"
+ wget -q https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz
+ tar -xf prometheus-${RELEASE}.linux-amd64.tar.gz
+ cd prometheus-${RELEASE}.linux-amd64
+ cp -rf prometheus promtool /usr/local/bin/
+ cd ~
+ rm -rf prometheus-${RELEASE}.linux-amd64 prometheus-${RELEASE}.linux-amd64.tar.gz
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
+
+ msg_info "Starting ${APP}"
+ systemctl start prometheus
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -86,5 +63,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:9090${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9090${CL}"
\ No newline at end of file
diff --git a/ct/prowlarr.sh b/ct/prowlarr.sh
index df776f85c..7c79ae26c 100644
--- a/ct/prowlarr.sh
+++ b/ct/prowlarr.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://prowlarr.com/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \_________ _ __/ /___ __________
- / /_/ / ___/ __ \ | /| / / / __ `/ ___/ ___/
- / ____/ / / /_/ / |/ |/ / / /_/ / / / /
-/_/ /_/ \____/|__/|__/_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Prowlarr"
-var_disk="4"
+var_tags="arr"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var/lib/prowlarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var/lib/prowlarr/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -64,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:9696${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9696${CL}"
\ No newline at end of file
diff --git a/ct/proxmox-datacenter-manager.sh b/ct/proxmox-datacenter-manager.sh
new file mode 100644
index 000000000..883e5cd8d
--- /dev/null
+++ b/ct/proxmox-datacenter-manager.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: CrazyWolf13
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: Proxmox Server Solution GmbH
+
+# App Default Values
+APP="proxmox-datacenter-manager"
+var_tags="datacenter"
+var_cpu="2"
+var_ram="2048"
+var_disk="10"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -e /usr/sbin/proxmox-datacenter-manager-admin ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8443${CL}"
diff --git a/ct/qbittorrent.sh b/ct/qbittorrent.sh
index a80e88eb4..2b7d11197 100644
--- a/ct/qbittorrent.sh
+++ b/ct/qbittorrent.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.qbittorrent.org/
-function header_info {
-clear
-cat <<"EOF"
- ____ _ __ __ __
- ____ _/ __ )(_) /_/ /_____ _____________ ____ / /_
- / __ `/ __ / / __/ __/ __ \/ ___/ ___/ _ \/ __ \/ __/
-/ /_/ / /_/ / / /_/ /_/ /_/ / / / / / __/ / / / /_
-\__, /_____/_/\__/\__/\____/_/ /_/ \___/_/ /_/\__/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="qBittorrent"
-var_disk="8"
+var_tags="torrent"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/qbittorrent-nox.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated ${APP} LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/qbittorrent-nox.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8090${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8090${CL}"
\ No newline at end of file
diff --git a/ct/rabbitmq.sh b/ct/rabbitmq.sh
index 0be6a2adb..1c9335ff3 100644
--- a/ct/rabbitmq.sh
+++ b/ct/rabbitmq.sh
@@ -1,78 +1,50 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck | Co-Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.rabbitmq.com/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ __ _ __ __ _______
- / __ \____ _/ /_ / /_ (_) /_/ |/ / __ \
- / /_/ / __ `/ __ \/ __ \/ / __/ /|_/ / / / /
- / _, _/ /_/ / /_/ / /_/ / / /_/ / / / /_/ /
-/_/ |_|\__,_/_.___/_.___/_/\__/_/ /_/\___\_\
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="RabbitMQ"
-var_disk="4"
+var_tags="mqtt"
var_cpu="1"
var_ram="1024"
-var_os="ubuntu"
-var_version="22.04"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
-
function update_script() {
-header_info
-if [[ ! -d /etc/rabbitmq ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-msg_info "Stopping ${APP} Service"
-systemctl stop rabbitmq-server
-msg_ok "Stopped ${APP} Service"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/rabbitmq ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP} Service"
+ systemctl stop rabbitmq-server
+ msg_ok "Stopped ${APP} Service"
-msg_info "Updating..."
-apt install --only-upgrade rabbitmq-server &>/dev/null
-msg_ok "Update Successfully"
+ msg_info "Updating..."
+ apt install --only-upgrade rabbitmq-server &>/dev/null
+ msg_ok "Update Successfully"
-msg_info "Starting ${APP}"
-systemctl start rabbitmq-server
-msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ${APP}"
+ systemctl start rabbitmq-server
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -80,5 +52,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:15672${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:15672${CL}"
\ No newline at end of file
diff --git a/ct/radarr.sh b/ct/radarr.sh
index aaf94d44d..6d0dea85a 100644
--- a/ct/radarr.sh
+++ b/ct/radarr.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://radarr.video/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \____ _____/ /___ __________
- / /_/ / __ `/ __ / __ `/ ___/ ___/
- / _, _/ /_/ / /_/ / /_/ / / / /
-/_/ |_|\__,_/\__,_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Radarr"
-var_disk="4"
+var_tags="arr"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var/lib/radarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var/lib/radarr/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -64,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:7878${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7878${CL}"
\ No newline at end of file
diff --git a/ct/rdtclient.sh b/ct/rdtclient.sh
index 9627e4845..5d870beef 100755
--- a/ct/rdtclient.sh
+++ b/ct/rdtclient.sh
@@ -1,71 +1,62 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/rogerfar/rdt-client
-function header_info {
-clear
-cat <<"EOF"
- ____ __ ____ __ _ __ ______ __ _________ __
- / __ \___ ____ / / / __ \___ / /_ _____(_)___/ / /_ __/___ _____________ ____ / /_ / ____/ (_)__ ____ / /_
- / /_/ / _ \/ __ `/ /___/ / / / _ \/ __ \/ ___/ / __ / / / / __ \/ ___/ ___/ _ \/ __ \/ __/ / / / / / _ \/ __ \/ __/
- / _, _/ __/ /_/ / /___/ /_/ / __/ /_/ / / / / /_/ / / / / /_/ / / / / / __/ / / / /_ / /___/ / / __/ / / / /_
-/_/ |_|\___/\__,_/_/ /_____/\___/_.___/_/ /_/\__,_/ /_/ \____/_/ /_/ \___/_/ /_/\__/ \____/_/_/\___/_/ /_/\__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="RDTClient"
-var_disk="4"
+var_tags="torrent"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/rdtc/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-systemctl stop rdtc
-mkdir -p rdtc-backup
-cp -R /opt/rdtc/appsettings.json rdtc-backup/
-wget -q https://github.com/rogerfar/rdt-client/releases/latest/download/RealDebridClient.zip
-unzip -oqq RealDebridClient.zip -d /opt/rdtc
-cp -R rdtc-backup/appsettings.json /opt/rdtc/
-rm -rf rdtc-backup RealDebridClient.zip
-systemctl start rdtc
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/rdtc/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop rdtc
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP}"
+ if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then
+ apt-get remove --purge -y dotnet-sdk-8.0 &>/dev/null
+ apt-get install -y dotnet-sdk-9.0 &>/dev/null
+ fi
+ mkdir -p rdtc-backup
+ cp -R /opt/rdtc/appsettings.json rdtc-backup/
+ wget -q https://github.com/rogerfar/rdt-client/releases/latest/download/RealDebridClient.zip
+ unzip -oqq RealDebridClient.zip -d /opt/rdtc
+ cp -R rdtc-backup/appsettings.json /opt/rdtc/
+ msg_ok "Updated ${APP}"
+
+ msg_info "Starting ${APP}"
+ systemctl start rdtc
+ msg_ok "Started ${APP}"
+
+ msg_info "Cleaning Up"
+ rm -rf rdtc-backup RealDebridClient.zip
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -73,5 +64,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:6500${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6500${CL}"
\ No newline at end of file
diff --git a/ct/readarr.sh b/ct/readarr.sh
index 12ec110e8..4b743d806 100644
--- a/ct/readarr.sh
+++ b/ct/readarr.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://readarr.com/
-function header_info {
-clear
-cat <<"EOF"
- ____ __
- / __ \___ ____ _____/ /___ __________
- / /_/ / _ \/ __ `/ __ / __ `/ ___/ ___/
- / _, _/ __/ /_/ / /_/ / /_/ / / / /
-/_/ |_|\___/\__,_/\__,_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Readarr"
-var_disk="4"
+var_tags="media;comic;eBook"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var/lib/readarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var/lib/readarr/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8787${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8787${CL}"
\ No newline at end of file
diff --git a/ct/readeck.sh b/ct/readeck.sh
index adb04dff8..fe8f95338 100644
--- a/ct/readeck.sh
+++ b/ct/readeck.sh
@@ -1,70 +1,47 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://readeck.org/en/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ __
- / __ \___ ____ _____/ /__ _____/ /__
- / /_/ / _ \/ __ `/ __ / _ \/ ___/ //_/
- / _, _/ __/ /_/ / /_/ / __/ /__/ ,<
-/_/ |_|\___/\__,_/\__,_/\___/\___/_/|_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Readeck"
-var_disk="2"
+var_tags="bookmark"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/readeck ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-LATEST=$(curl -s https://codeberg.org/readeck/readeck/releases/ | grep -oP '(?<=Version )\d+\.\d+\.\d+' | head -1)
-systemctl stop readeck.service
-rm -rf /opt/readeck/readeck
-cd /opt/readeck
-wget -q -O readeck https://codeberg.org/readeck/readeck/releases/download/${LATEST}/readeck-${LATEST}-linux-arm64
-chmod a+x readeck
-systemctl start readeck.service
-msg_ok "Updated ${APP}"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/readeck ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ LATEST=$(curl -s https://codeberg.org/readeck/readeck/releases/ | grep -oP '(?<=Version )\d+\.\d+\.\d+' | head -1)
+ systemctl stop readeck.service
+ rm -rf /opt/readeck/readeck
+ cd /opt/readeck
+ wget -q -O readeck https://codeberg.org/readeck/readeck/releases/download/${LATEST}/readeck-${LATEST}-linux-amd64
+ chmod a+x readeck
+ systemctl start readeck.service
+ msg_ok "Updated ${APP}"
+ exit
}
start
@@ -72,5 +49,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8000${CL}\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
\ No newline at end of file
diff --git a/ct/recyclarr.sh b/ct/recyclarr.sh
new file mode 100644
index 000000000..d0688e49a
--- /dev/null
+++ b/ct/recyclarr.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MrYadro
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://recyclarr.dev/wiki/
+
+# App Default Values
+APP="Recyclarr"
+var_tags="arr"
+var_cpu="1"
+var_ram="512"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /root/.config/recyclarr/recyclarr.yml ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ msg_info "Updating ${APP}"
+ wget -q $(curl -s https://api.github.com/repos/recyclarr/recyclarr/releases/latest | grep download | grep linux-x64 | cut -d\" -f4)
+ tar -C /usr/local/bin -xJf recyclarr*.tar.xz
+ rm -rf recyclarr*.tar.xz
+ msg_ok "Updated ${APP}"
+
+ msg_ok "Updated Successfully"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following IP:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}${IP}${CL}"
\ No newline at end of file
diff --git a/ct/redis.sh b/ct/redis.sh
index a0731c023..b09d07aac 100644
--- a/ct/redis.sh
+++ b/ct/redis.sh
@@ -1,63 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://redis.io/
-function header_info {
-clear
-cat <<"EOF"
- ____ ___
- / __ \___ ____/ (_)____
- / /_/ / _ \/ __ / / ___/
- / _, _/ __/ /_/ / (__ )
-/_/ |_|\___/\__,_/_/____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Redis"
-var_disk="4"
+var_tags="database"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
-VERBOSE="yes"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /lib/systemd/system/redis-server.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /lib/systemd/system/redis-server.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
}
start
@@ -65,3 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following IP:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}${IP}:6379${CL}"
\ No newline at end of file
diff --git a/ct/rockylinux.sh b/ct/rockylinux.sh
deleted file mode 100644
index c3339c2a5..000000000
--- a/ct/rockylinux.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
-
-function header_info {
-clear
-cat <<"EOF"
- ____ __ __ _
- / __ \____ _____/ /____ __ / / (_)___ __ ___ __
- / /_/ / __ \/ ___/ //_/ / / / / / / / __ \/ / / / |/_/
- / _, _/ /_/ / /__/ ,< / /_/ / / /___/ / / / / /_/ /> <
-/_/ |_|\____/\___/_/|_|\__, / /_____/_/_/ /_/\__,_/_/|_|
- /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
-APP="Rocky Linux"
-var_disk="1"
-var_cpu="1"
-var_ram="512"
-var_os="rockylinux"
-var_version="9"
-variables
-color
-catch_errors
-
-function default_settings() {
- CT_TYPE="1"
- PW="-password rockylinux"
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
-function update_script() {
-header_info
-if [[ ! -d /etc/pacman.d ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-dnf -y update
-dnf -y upgrade
-msg_ok "Updated Successfully"
-exit
-}
-
-start
-build_container
-description
-
-msg_ok "Completed Successfully!\n"
diff --git a/ct/rtsptoweb.sh b/ct/rtsptoweb.sh
index 3cad0103c..5d70b9016 100644
--- a/ct/rtsptoweb.sh
+++ b/ct/rtsptoweb.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/deepch/RTSPtoWeb
-function header_info {
-clear
-cat <<"EOF"
- ____ ___________ ____ __ _ __ __
- / __ \/_ __/ ___// __ \/ /_____| | / /__ / /_
- / /_/ / / / \__ \/ /_/ / __/ __ \ | /| / / _ \/ __ \
- / _, _/ / / ___/ / ____/ /_/ /_/ / |/ |/ / __/ /_/ /
-/_/ |_| /_/ /____/_/ \__/\____/|__/|__/\___/_.___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="RTSPtoWeb"
-var_disk="4"
+var_tags="media"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:8083 ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8083${CL}"
\ No newline at end of file
diff --git a/ct/runtipi.sh b/ct/runtipi.sh
index e39d48e09..fe0800550 100644
--- a/ct/runtipi.sh
+++ b/ct/runtipi.sh
@@ -1,62 +1,39 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://runtipi.io/
-function header_info {
-clear
-cat <<"EOF"
- ____ __ _ _
- / __ \__ ______ / /_(_)___ (_)
- / /_/ / / / / __ \/ __/ / __ \/ /
- / _, _/ /_/ / / / / /_/ / /_/ / /
-/_/ |_|\__,_/_/ /_/\__/_/ .___/_/
- /_/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Runtipi"
-var_disk="8"
+var_tags="os"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/runtipi ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-cd /opt/runtipi && ./runtipi-cli update latest
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/runtipi ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ cd /opt/runtipi && ./runtipi-cli update latest
+ exit
}
start
@@ -64,5 +41,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP} ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/sabnzbd.sh b/ct/sabnzbd.sh
index 90c1cbfb8..a755e6caf 100644
--- a/ct/sabnzbd.sh
+++ b/ct/sabnzbd.sh
@@ -1,76 +1,53 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://sabnzbd.org/
-function header_info {
-clear
-cat <<"EOF"
- _____ ___ ____ __ __
- / ___// | / __ )____ ____ / /_ ____/ /
- \__ \/ /| | / __ / __ \/_ / / __ \/ __ /
- ___/ / ___ |/ /_/ / / / / / /_/ /_/ / /_/ /
-/____/_/ |_/_____/_/ /_/ /___/_.___/\__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="SABnzbd"
-var_disk="8"
+var_tags="downloader"
var_cpu="2"
-var_ram="2048"
+var_ram="4096"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/sabnzbd ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -s https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Updating $APP to ${RELEASE}"
- systemctl stop sabnzbd.service
- tar zxvf <(curl -fsSL https://github.com/sabnzbd/sabnzbd/releases/download/$RELEASE/SABnzbd-${RELEASE}-src.tar.gz) &>/dev/null
- \cp -r SABnzbd-${RELEASE}/* /opt/sabnzbd &>/dev/null
- rm -rf SABnzbd-${RELEASE}
- cd /opt/sabnzbd
- python3 -m pip install -r requirements.txt &>/dev/null
- echo "${RELEASE}" >/opt/${APP}_version.txt
- systemctl start sabnzbd.service
- msg_ok "Updated ${APP} to ${RELEASE}"
-else
- msg_info "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/sabnzbd ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating $APP to ${RELEASE}"
+ systemctl stop sabnzbd.service
+ tar zxvf <(curl -fsSL https://github.com/sabnzbd/sabnzbd/releases/download/$RELEASE/SABnzbd-${RELEASE}-src.tar.gz) &>/dev/null
+ \cp -r SABnzbd-${RELEASE}/* /opt/sabnzbd &>/dev/null
+ rm -rf SABnzbd-${RELEASE}
+ cd /opt/sabnzbd
+ python3 -m pip install -r requirements.txt &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ systemctl start sabnzbd.service
+ msg_ok "Updated ${APP} to ${RELEASE}"
+ else
+ msg_info "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -78,5 +55,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:7777${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7777${CL}"
diff --git a/ct/scrypted.sh b/ct/scrypted.sh
deleted file mode 100644
index d0cf24678..000000000
--- a/ct/scrypted.sh
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
-
-function header_info {
-clear
-cat <<"EOF"
- _____ __ __
- / ___/____________ ______ / /____ ____/ /
- \__ \/ ___/ ___/ / / / __ \/ __/ _ \/ __ /
- ___/ / /__/ / / /_/ / /_/ / /_/ __/ /_/ /
-/____/\___/_/ \__, / .___/\__/\___/\__,_/
- /____/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
-APP="Scrypted"
-var_disk="8"
-var_cpu="2"
-var_ram="2048"
-var_os="debian"
-var_version="12"
-variables
-color
-catch_errors
-
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
-function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/scrypted.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
-}
-
-start
-build_container
-description
-
-msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}https://${IP}:10443${CL} \n"
diff --git a/ct/semaphore.sh b/ct/semaphore.sh
new file mode 100644
index 000000000..52476d15d
--- /dev/null
+++ b/ct/semaphore.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: kristocopani
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://semaphoreui.com/
+
+# App Default Values
+APP="Semaphore"
+var_tags="dev_ops"
+var_cpu="2"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if [[ ! -f /etc/systemd/system/semaphore.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/semaphoreui/semaphore/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop semaphore
+ msg_ok "Stopped Service"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ wget -q https://github.com/semaphoreui/semaphore/releases/download/v${RELEASE}/semaphore_${RELEASE}_linux_amd64.deb
+ dpkg -i semaphore_${RELEASE}_linux_amd64.deb &>/dev/null
+ echo "${RELEASE}" >"/opt/${APP}_version.txt"
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Service"
+ systemctl start semaphore
+ msg_ok "Started Service"
+
+ msg_info "Cleaning up"
+ rm -rf /opt/semaphore_${RELEASE}_linux_amd64.deb
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/sftpgo.sh b/ct/sftpgo.sh
index 12f0d3324..9bfc0aabc 100644
--- a/ct/sftpgo.sh
+++ b/ct/sftpgo.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://sftpgo.com/
-function header_info {
-clear
-cat <<"EOF"
- _____ ________________ ______
- / ___// ____/_ __/ __ \/ ____/___
- \__ \/ /_ / / / /_/ / / __/ __ \
- ___/ / __/ / / / ____/ /_/ / /_/ /
-/____/_/ /_/ /_/ \____/\____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="SFTPGo"
-var_disk="4"
+var_tags="ftp;sftp"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080/web/admin ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/web/admin${CL}"
\ No newline at end of file
diff --git a/ct/shinobi.sh b/ct/shinobi.sh
index 49a15e17d..bfdb8edda 100644
--- a/ct/shinobi.sh
+++ b/ct/shinobi.sh
@@ -1,68 +1,45 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://shinobi.video/
-function header_info {
-clear
-cat <<"EOF"
- _____ __ _ __ _
- / ___// /_ (_)___ ____ / /_ (_)
- \__ \/ __ \/ / __ \/ __ \/ __ \/ /
- ___/ / / / / / / / / /_/ / /_/ / /
-/____/_/ /_/_/_/ /_/\____/_.___/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Shinobi"
-var_disk="8"
+var_tags="nvr"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="ubuntu"
var_version="22.04"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/Shinobi ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating Shinobi LXC"
-cd /opt/Shinobi
-sh UPDATE.sh
-pm2 flush
-pm2 restart camera
-pm2 restart cron
-msg_ok "Updated Shinobi LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/Shinobi ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating Shinobi LXC"
+ cd /opt/Shinobi
+ sh UPDATE.sh
+ pm2 flush
+ pm2 restart camera
+ pm2 restart cron
+ msg_ok "Updated Shinobi LXC"
+ exit
}
start
@@ -70,5 +47,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:8080/super${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/super${CL}"
\ No newline at end of file
diff --git a/ct/silverbullet.sh b/ct/silverbullet.sh
new file mode 100644
index 000000000..b4649279e
--- /dev/null
+++ b/ct/silverbullet.sh
@@ -0,0 +1,61 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Dominik Siebel (dsiebel)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://silverbullet.md
+
+# App default values
+APP="Silverbullet"
+var_tags="notes"
+var_cpu="1"
+var_disk="2"
+var_ram="512"
+var_os="debian"
+var_version="12"
+
+# App Output & Base Settings
+header_info "${APP}"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/silverbullet ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ RELEASE=$(curl -s https://api.github.com/repos/silverbulletmd/silverbullet/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ ! -f "/opt/${APP}_version.txt" || "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop silverbullet
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ wget -q https://github.com/silverbulletmd/silverbullet/releases/download/${RELEASE}/silverbullet-server-linux-x86_64.zip
+ unzip -q silverbullet-server-linux-x86_64.zip
+ mv silverbullet /opt/silverbullet/bin/
+ chmod +x /opt/silverbullet/bin/silverbullet
+ echo "${RELEASE}" >/opt/silverbullet/${APP}_version.txt
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting ${APP}"
+ systemctl start silverbullet
+ msg_ok "Started ${APP}"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
diff --git a/ct/smokeping.sh b/ct/smokeping.sh
index 9c669aea0..c15f2762f 100644
--- a/ct/smokeping.sh
+++ b/ct/smokeping.sh
@@ -1,67 +1,43 @@
#!/usr/bin/env bash
-
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://oss.oetiker.ch/smokeping/
-function header_info {
-clear
-cat <<"EOF"
- _____ __ ____ _
- / ___/____ ___ ____ / /_____ / __ \(_)___ ____ _
- \__ \/ __ `__ \/ __ \/ //_/ _ \/ /_/ / / __ \/ __ `/
- ___/ / / / / / / /_/ / ,< / __/ ____/ / / / / /_/ /
-/____/_/ /_/ /_/\____/_/|_|\___/_/ /_/_/ /_/\__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="SmokePing"
-var_disk="2"
+var_tags="network"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if ! command -v smokeping &> /dev/null; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if ! command -v smokeping &>/dev/null; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
-msg_info "Updating ${APP}"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ msg_info "Updating ${APP}"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -69,5 +45,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}/smokeping${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/smokeping${CL}"
\ No newline at end of file
diff --git a/ct/snipeit.sh b/ct/snipeit.sh
new file mode 100644
index 000000000..c6046533f
--- /dev/null
+++ b/ct/snipeit.sh
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Michel Roegl-Brunner (michelroegl-brunner)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://snipeitapp.com/
+
+# App Default Values
+APP="SnipeIT"
+var_tags="assat-management;foss"
+var_cpu="2"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/snipe-it ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating ${APP} to v${RELEASE}"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ mv /opt/snipe-it /opt/snipe-it-backup
+ cd /opt
+ wget -q "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip" &>/dev/null
+ unzip -q v${RELEASE}.zip
+ mv snipe-it-${RELEASE} /opt/snipe-it
+ cp /opt/snipe-it-backup/.env /opt/snipe-it/.env
+ cp -r /opt/snipe-it-backup/public/uploads/ /opt/snipe-it/public/uploads/
+ cp -r /opt/snipe-it-backup/storage/private_uploads /opt/snipe-it/storage/private_uploads
+ cd /opt/snipe-it/
+ export COMPOSER_ALLOW_SUPERUSER=1
+ composer install --no-dev --prefer-source &>/dev/null
+ composer dump-autoload &>/dev/null
+ php artisan migrate --force &>/dev/null
+ php artisan config:clear &>/dev/null
+ php artisan route:clear &>/dev/null
+ php artisan cache:clear &>/dev/null
+ php artisan view:clear &>/dev/null
+ chown -R www-data: /opt/snipe-it
+ chmod -R 755 /opt/snipe-it
+ rm -rf /opt/v${RELEASE}.zip
+ rm -rf /opt/snipe-it-backup
+ msg_ok "Updated ${APP} LXC"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/sonarr.sh b/ct/sonarr.sh
index 907666e5e..bd688bbeb 100644
--- a/ct/sonarr.sh
+++ b/ct/sonarr.sh
@@ -1,70 +1,47 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://sonarr.tv/
-function header_info {
-clear
-cat <<"EOF"
- _____
- / ___/____ ____ ____ __________
- \__ \/ __ \/ __ \/ __ `/ ___/ ___/
- ___/ / /_/ / / / / /_/ / / / /
-/____/\____/_/ /_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Sonarr"
-var_disk="4"
+var_tags="arr"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/Sonarr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP v4"
-systemctl stop sonarr.service
-wget -q -O SonarrV4.tar.gz 'https://services.sonarr.tv/v1/download/main/latest?version=4&os=linux&arch=arm64'
-tar -xzf SonarrV4.tar.gz
-rm -rf /opt/Sonarr
-mv Sonarr /opt
-rm -rf SonarrV4.tar.gz
-systemctl start sonarr.service
-msg_ok "Updated $APP v4"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var/lib/sonarr/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP v4"
+ systemctl stop sonarr.service
+ wget -q -O SonarrV4.tar.gz 'https://services.sonarr.tv/v1/download/main/latest?version=4&os=linux&arch=x64'
+ tar -xzf SonarrV4.tar.gz
+ rm -rf /opt/Sonarr
+ mv Sonarr /opt
+ rm -rf SonarrV4.tar.gz
+ systemctl start sonarr.service
+ msg_ok "Updated $APP v4"
+ exit
}
start
@@ -72,5 +49,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8989${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8989${CL}"
\ No newline at end of file
diff --git a/ct/spoolman.sh b/ct/spoolman.sh
index 20e479ffb..faa05977c 100644
--- a/ct/spoolman.sh
+++ b/ct/spoolman.sh
@@ -1,96 +1,69 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/Donkie/Spoolman
-function header_info {
-clear
-cat <<"EOF"
- _____ __
- / ___/____ ____ ____ / /___ ___ ____ _____
- \__ \/ __ \/ __ \/ __ \/ / __ `__ \/ __ `/ __ \
- ___/ / /_/ / /_/ / /_/ / / / / / / / /_/ / / / /
-/____/ .___/\____/\____/_/_/ /_/ /_/\__,_/_/ /_/
- /_/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Spoolman"
-var_disk="4"
+var_tags="3d-printing"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/spoolman ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-RELEASE=$(wget -q https://github.com/Donkie/Spoolman/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/spoolman ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(wget -q https://github.com/Donkie/Spoolman/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping ${APP} Service"
- systemctl stop spoolman
- msg_ok "Stopped ${APP} Service"
+ msg_info "Stopping ${APP} Service"
+ systemctl stop spoolman
+ msg_ok "Stopped ${APP} Service"
- msg_info "Updating ${APP} to ${RELEASE}"
- cd /opt
- rm -rf spoolman_bak
- mv spoolman spoolman_bak
- wget -q https://github.com/Donkie/Spoolman/releases/download/${RELEASE}/spoolman.zip
- unzip -q spoolman.zip -d spoolman
- cd spoolman
- pip3 install -r requirements.txt >/dev/null 2>&1
- wget -q https://raw.githubusercontent.com/Donkie/Spoolman/master/.env.example -O .env
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cd /opt
+ rm -rf spoolman_bak
+ mv spoolman spoolman_bak
+ wget -q https://github.com/Donkie/Spoolman/releases/download/${RELEASE}/spoolman.zip
+ unzip -q spoolman.zip -d spoolman
+ cd spoolman
+ pip3 install -r requirements.txt >/dev/null 2>&1
+ wget -q https://raw.githubusercontent.com/Donkie/Spoolman/master/.env.example -O .env
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
- msg_info "Starting ${APP} Service"
- systemctl start spoolman
- msg_ok "Started ${APP} Service"
+ msg_info "Starting ${APP} Service"
+ systemctl start spoolman
+ msg_ok "Started ${APP} Service"
- msg_info "Cleaning up"
- rm -rf /opt/spoolman.zip
- msg_ok "Cleaned"
+ msg_info "Cleaning up"
+ rm -rf /opt/spoolman.zip
+ msg_ok "Cleaned"
- msg_ok "Updated Successfully!\n"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_ok "Updated Successfully!\n"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -98,5 +71,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:7912${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7912${CL}"
\ No newline at end of file
diff --git a/ct/stirling-pdf.sh b/ct/stirling-pdf.sh
index 4aa4be265..ef83966a8 100644
--- a/ct/stirling-pdf.sh
+++ b/ct/stirling-pdf.sh
@@ -1,76 +1,57 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.stirlingpdf.com/
-function header_info {
-clear
-cat <<"EOF"
- _____ __ _ ___ ____ ____ ______
- / ___// /_(_)____/ (_)___ ____ _ / __ \/ __ \/ ____/
- \__ \/ __/ / ___/ / / __ \/ __ `/___/ /_/ / / / / /_
- ___/ / /_/ / / / / / / / / /_/ /___/ ____/ /_/ / __/
-/____/\__/_/_/ /_/_/_/ /_/\__, / /_/ /_____/_/
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Stirling-PDF"
-var_disk="8"
+var_tags="pdf-editor"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/Stirling-PDF ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-systemctl stop stirlingpdf
-RELEASE=$(curl -s https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-wget -q https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v$RELEASE.tar.gz
-tar -xzf v$RELEASE.tar.gz
-cd Stirling-PDF-$RELEASE
-chmod +x ./gradlew
-./gradlew build &>/dev/null
-cp -r ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/
-cp -r scripts /opt/Stirling-PDF/
-cd ~
-rm -rf Stirling-PDF-$RELEASE v$RELEASE.tar.gz
-ln -sf /opt/Stirling-PDF/Stirling-PDF-$RELEASE.jar /opt/Stirling-PDF/Stirling-PDF.jar
-systemctl start stirlingpdf
-msg_ok "Updated ${APP} to v$RELEASE"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/Stirling-PDF ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ systemctl stop stirlingpdf
+ if [[ -n $(dpkg -l | grep -w ocrmypdf) ]] && [[ -z $(dpkg -l | grep -w qpdf) ]]; then
+ apt-get remove -y ocrmypdf &>/dev/null
+ apt-get install -y qpdf &>/dev/null
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ wget -q https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v$RELEASE.tar.gz
+ tar -xzf v$RELEASE.tar.gz
+ cd Stirling-PDF-$RELEASE
+ chmod +x ./gradlew
+ ./gradlew build &>/dev/null
+ cp -r ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/
+ cp -r scripts /opt/Stirling-PDF/
+ cd ~
+ rm -rf Stirling-PDF-$RELEASE v$RELEASE.tar.gz
+ ln -sf /opt/Stirling-PDF/Stirling-PDF-$RELEASE.jar /opt/Stirling-PDF/Stirling-PDF.jar
+ systemctl start stirlingpdf
+ msg_ok "Updated ${APP} to v$RELEASE"
+ exit
}
start
@@ -78,5 +59,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080 ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
\ No newline at end of file
diff --git a/ct/syncthing.sh b/ct/syncthing.sh
index a8cb898be..4e790eb42 100644
--- a/ct/syncthing.sh
+++ b/ct/syncthing.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://syncthing.net/
-function header_info {
-clear
-cat <<"EOF"
- _____ __ __ _
- / ___/__ ______ _____/ /_/ /_ (_)___ ____ _
- \__ \/ / / / __ \/ ___/ __/ __ \/ / __ \/ __ `/
- ___/ / /_/ / / / / /__/ /_/ / / / / / / / /_/ /
-/____/\__, /_/ /_/\___/\__/_/ /_/_/_/ /_/\__, /
- /____/ /____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Syncthing"
-var_disk="8"
+var_tags="sync"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/sources.list.d/syncthing.list ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/sources.list.d/syncthing.list ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8384 ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8384${CL}"
\ No newline at end of file
diff --git a/ct/tandoor.sh b/ct/tandoor.sh
index 943b4c360..0cb36183d 100644
--- a/ct/tandoor.sh
+++ b/ct/tandoor.sh
@@ -1,61 +1,37 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://tandoor.dev/
-function header_info {
-clear
-cat <<"EOF"
- ______ __ ____ _
- /_ __/___ _____ ____/ /___ ____ _____ / __ \___ _____(_)___ ___ _____
- / / / __ `/ __ \/ __ / __ \/ __ \/ ___/ / /_/ / _ \/ ___/ / __ \/ _ \/ ___/
- / / / /_/ / / / / /_/ / /_/ / /_/ / / / _, _/ __/ /__/ / /_/ / __(__ )
-/_/ \__,_/_/ /_/\__,_/\____/\____/_/ /_/ |_|\___/\___/_/ .___/\___/____/
- /_/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Tandoor"
-var_disk="10"
+var_tags="recipes"
var_cpu="4"
var_ram="4096"
+var_disk="10"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
header_info
- if [[ ! -d /opt/tandoor ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/tandoor ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
if cd /opt/tandoor && git pull | grep -q 'Already up to date'; then
msg_ok "There is currently no update available."
else
@@ -79,11 +55,7 @@ start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 2048
-pct set $CTID -cores 2
-msg_ok "Set Container to Normal Resources"
-
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:8002${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8002${CL}"
\ No newline at end of file
diff --git a/ct/tasmoadmin.sh b/ct/tasmoadmin.sh
index ea0f691f6..a7d0d632f 100644
--- a/ct/tasmoadmin.sh
+++ b/ct/tasmoadmin.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/TasmoAdmin/TasmoAdmin
-function header_info {
-clear
-cat <<"EOF"
- ______ ___ __ _
- /_ __/___ __________ ___ ____ / | ____/ /___ ___ (_)___
- / / / __ `/ ___/ __ `__ \/ __ \/ /| |/ __ / __ `__ \/ / __ \
- / / / /_/ (__ ) / / / / / /_/ / ___ / /_/ / / / / / / / / / /
-/_/ \__,_/____/_/ /_/ /_/\____/_/ |_\__,_/_/ /_/ /_/_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="TasmoAdmin"
-var_disk="2"
+var_tags="tasmota;smarthome"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:9999${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9999${CL}"
\ No newline at end of file
diff --git a/ct/tautulli.sh b/ct/tautulli.sh
index 147df32b8..a6d19691f 100644
--- a/ct/tautulli.sh
+++ b/ct/tautulli.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://tautulli.com/
-function header_info {
-clear
-cat <<"EOF"
- ______ __ _____
- /_ __/___ ___ __/ /___ __/ / (_)
- / / / __ `/ / / / __/ / / / / / /
- / / / /_/ / /_/ / /_/ /_/ / / / /
-/_/ \__,_/\__,_/\__/\__,_/_/_/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Tautulli"
-var_disk="4"
+var_tags="media"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/Tautulli/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/Tautulli/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8181${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8181${CL}"
\ No newline at end of file
diff --git a/ct/tdarr.sh b/ct/tdarr.sh
index ab02db75e..2436bf12d 100644
--- a/ct/tdarr.sh
+++ b/ct/tdarr.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://home.tdarr.io/
-function header_info {
-clear
-cat <<"EOF"
- ______ __
- /_ __/___/ /___ __________
- / / / __ / __ `/ ___/ ___/
- / / / /_/ / /_/ / / / /
-/_/ \__,_/\__,_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Tdarr"
-var_disk="4"
+var_tags="arr"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/tdarr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/tdarr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8265${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8265${CL}"
\ No newline at end of file
diff --git a/ct/technitiumdns.sh b/ct/technitiumdns.sh
index f45f5964b..0d2932687 100644
--- a/ct/technitiumdns.sh
+++ b/ct/technitiumdns.sh
@@ -1,70 +1,56 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://technitium.com/dns/
-function header_info {
-clear
-cat <<"EOF"
- ______ __ _ __ _ ____ _ _______
- /_ __/__ _____/ /_ ____ (_) /_(_)_ ______ ___ / __ \/ | / / ___/
- / / / _ \/ ___/ __ \/ __ \/ / __/ / / / / __ __ \ / / / / |/ /\__ \
- / / / __/ /__/ / / / / / / / /_/ / /_/ / / / / / / / /_/ / /| /___/ /
-/_/ \___/\___/_/ /_/_/ /_/_/\__/_/\__,_/_/ /_/ /_/ /_____/_/ |_//____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Technitium DNS"
-var_disk="2"
+var_tags="dns"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /etc/dns ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-bash <(curl -fsSL https://download.technitium.com/dns/install.sh) &>/dev/null
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/dns ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+
+ if ! dpkg -s aspnetcore-runtime-8.0 >/dev/null 2>&1; then
+ wget -q https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb
+ dpkg -i packages-microsoft-prod.deb &>/dev/null
+ apt-get update &>/dev/null
+ apt-get install -y aspnetcore-runtime-8.0 &>/dev/null
+ rm packages-microsoft-prod.deb
+ fi
+ bash <(curl -fsSL https://download.technitium.com/dns/install.sh) &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
build_container
description
-msg_ok "Completed Successfully!\n"a
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5380${CL} \n"
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5380${CL}"
\ No newline at end of file
diff --git a/ct/teddycloud.sh b/ct/teddycloud.sh
new file mode 100644
index 000000000..9ea137daa
--- /dev/null
+++ b/ct/teddycloud.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Dominik Siebel (dsiebel)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/toniebox-reverse-engineering/teddycloud
+
+# App default values
+APP="TeddyCloud"
+var_tags="media"
+var_cpu="2"
+var_disk="8"
+var_ram="1024"
+var_os="debian"
+var_version="12"
+
+# App Output & Base Settings
+header_info "${APP}"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/teddycloud ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ RELEASE="$(curl -s https://api.github.com/repos/toniebox-reverse-engineering/teddycloud/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')"
+ VERSION="${RELEASE#tc_v}"
+ if [[ ! -f "/opt/${APP}_version.txt" || "${VERSION}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop teddycloud
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP} to v${VERSION}"
+ PREVIOUS_VERSION="$(readlink -f /opt/teddycloud)"
+ wget -q "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip"
+ unzip -q -d "/opt/teddycloud-${VERSION}" "teddycloud.amd64.release_v${VERSION}.zip"
+ ln -fns "/opt/teddycloud-${VERSION}" /opt/teddycloud
+ echo "${VERSION}" >"/opt/${APP}_version.txt"
+ cp -R "${PREVIOUS_VERSION}/certs" /opt/teddycloud
+ cp -R "${PREVIOUS_VERSION}/config" /opt/teddycloud
+ cp -R "${PREVIOUS_VERSION}/data" /opt/teddycloud
+ msg_ok "Updated ${APP} to v${VERSION}"
+
+ msg_info "Starting ${APP}"
+ systemctl start teddycloud
+ msg_ok "Started ${APP}"
+
+ msg_info "Cleaning up"
+ rm "teddycloud.amd64.release_v${VERSION}.zip"
+ rm -rf "${PREVIOUS_VERSION}"
+ msg_ok "Cleaned"
+ else
+ msg_ok "No update required. ${APP} is already at v${VERSION}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/the-lounge.sh b/ct/the-lounge.sh
new file mode 100644
index 000000000..d9b818316
--- /dev/null
+++ b/ct/the-lounge.sh
@@ -0,0 +1,69 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: kristocopani
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://thelounge.chat/
+
+# App Default Values
+APP="The-Lounge"
+var_tags="irc"
+var_cpu="2"
+var_ram="2048"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /usr/lib/systemd/system/thelounge.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/thelounge/thelounge-deb/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop thelounge
+ msg_ok "Stopped Service"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ apt-get install --only-upgrade nodejs &>/dev/null
+ cd /opt
+ wget -q https://github.com/thelounge/thelounge-deb/releases/download/v${RELEASE}/thelounge_${RELEASE}_all.deb
+ dpkg -i ./thelounge_${RELEASE}_all.deb
+ msg_ok "Updated ${APP} to v${RELEASE}"
+
+ msg_info "Starting Service"
+ systemctl start thelounge
+ msg_ok "Started Service"
+
+ msg_info "Cleaning up"
+ rm -rf "/opt/thelounge_${RELEASE}_all.deb"
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}"
\ No newline at end of file
diff --git a/ct/threadfin.sh b/ct/threadfin.sh
index 1778ba3c0..a47dc843c 100644
--- a/ct/threadfin.sh
+++ b/ct/threadfin.sh
@@ -1,67 +1,44 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/Threadfin/Threadfin
-function header_info {
-clear
-cat <<"EOF"
- ________ _______
- /_ __/ /_ ________ ____ _____/ / __(_)___
- / / / __ \/ ___/ _ \/ __ `/ __ / /_/ / __ \
- / / / / / / / / __/ /_/ / /_/ / __/ / / / /
-/_/ /_/ /_/_/ \___/\__,_/\__,_/_/ /_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Threadfin"
-var_disk="4"
+var_tags="media"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/threadfin ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-systemctl stop threadfin.service
-wget -q -O /opt/threadfin/threadfin 'https://github.com/Threadfin/Threadfin/releases/latest/download/Threadfin_linux_arm64'
-chmod +x /opt/threadfin/threadfin
-systemctl start threadfin.service
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/threadfin ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ systemctl stop threadfin.service
+ wget -q -O /opt/threadfin/threadfin 'https://github.com/Threadfin/Threadfin/releases/latest/download/Threadfin_linux_amd64'
+ chmod +x /opt/threadfin/threadfin
+ systemctl start threadfin.service
+ msg_ok "Updated $APP"
+ exit
}
start
@@ -69,5 +46,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:34400/web${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:34400/web${CL}"
\ No newline at end of file
diff --git a/ct/tianji.sh b/ct/tianji.sh
index 771781ad4..905bcc942 100644
--- a/ct/tianji.sh
+++ b/ct/tianji.sh
@@ -1,115 +1,82 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://tianji.msgbyte.com/
-function header_info {
-clear
-cat <<"EOF"
- _______ _ _
- /_ __(_)___ _____ (_|_)
- / / / / __ `/ __ \ / / /
- / / / / /_/ / / / / / / /
-/_/ /_/\__,_/_/ /_/_/ /_/
- /___/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Tianji"
-var_disk="12"
+var_tags="monitoring"
var_cpu="4"
var_ram="4096"
+var_disk="12"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
function update_script() {
-header_info
-if [[ ! -d /opt/tianji ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-RELEASE=$(curl -s https://api.github.com/repos/msgbyte/tianji/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
- msg_info "Stopping ${APP} Service"
- systemctl stop tianji
- msg_ok "Stopped ${APP} Service"
- msg_info "Updating ${APP} to ${RELEASE}"
- cd /opt
- cp /opt/tianji/src/server/.env /opt/.env
- mv /opt/tianji /opt/tianji_bak
- wget -q "https://github.com/msgbyte/tianji/archive/refs/tags/v${RELEASE}.zip"
- unzip -q v${RELEASE}.zip
- mv tianji-${RELEASE} /opt/tianji
- cd tianji
- pnpm install --filter @tianji/client... --config.dedupe-peer-dependents=false --frozen-lockfile >/dev/null 2>&1
- pnpm build:static >/dev/null 2>&1
- pnpm install --filter @tianji/server... --config.dedupe-peer-dependents=false >/dev/null 2>&1
- mkdir -p ./src/server/public >/dev/null 2>&1
- cp -r ./geo ./src/server/public >/dev/null 2>&1
- pnpm build:server >/dev/null 2>&1
- mv /opt/.env /opt/tianji/src/server/.env
- cd src/server
- pnpm db:migrate:apply >/dev/null 2>&1
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP} to ${RELEASE}"
- msg_info "Starting ${APP}"
- systemctl start tianji
- msg_ok "Started ${APP}"
- msg_info "Cleaning up"
- rm -R /opt/v${RELEASE}.zip
- rm -rf /opt/tianji_bak
- rm -rf /opt/tianji/src/client
- rm -rf /opt/tianji/website
- rm -rf /opt/tianji/reporter
- msg_ok "Cleaned"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}."
-fi
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/tianji ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/msgbyte/tianji/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP} Service"
+ systemctl stop tianji
+ msg_ok "Stopped ${APP} Service"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cd /opt
+ cp /opt/tianji/src/server/.env /opt/.env
+ mv /opt/tianji /opt/tianji_bak
+ wget -q "https://github.com/msgbyte/tianji/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q v${RELEASE}.zip
+ mv tianji-${RELEASE} /opt/tianji
+ cd tianji
+ pnpm install --filter @tianji/client... --config.dedupe-peer-dependents=false --frozen-lockfile >/dev/null 2>&1
+ pnpm build:static >/dev/null 2>&1
+ pnpm install --filter @tianji/server... --config.dedupe-peer-dependents=false >/dev/null 2>&1
+ mkdir -p ./src/server/public >/dev/null 2>&1
+ cp -r ./geo ./src/server/public >/dev/null 2>&1
+ pnpm build:server >/dev/null 2>&1
+ mv /opt/.env /opt/tianji/src/server/.env
+ cd src/server
+ pnpm db:migrate:apply >/dev/null 2>&1
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP} to ${RELEASE}"
+ msg_info "Starting ${APP}"
+ systemctl start tianji
+ msg_ok "Started ${APP}"
+ msg_info "Cleaning up"
+ rm -R /opt/v${RELEASE}.zip
+ rm -rf /opt/tianji_bak
+ rm -rf /opt/tianji/src/client
+ rm -rf /opt/tianji/website
+ rm -rf /opt/tianji/reporter
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}."
+ fi
+ exit
}
start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 1024
-pct set $CTID -cores 1
-msg_ok "Set Container to Normal Resources"
-
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:12345${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:12345${CL}"
\ No newline at end of file
diff --git a/ct/traccar.sh b/ct/traccar.sh
index fe57a944d..535f0a55f 100644
--- a/ct/traccar.sh
+++ b/ct/traccar.sh
@@ -1,63 +1,40 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.traccar.org/
-function header_info {
-clear
-cat <<"EOF"
- ______
- /_ __/________ _______________ ______
- / / / ___/ __ `/ ___/ ___/ __ `/ ___/
- / / / / / /_/ / /__/ /__/ /_/ / /
-/_/ /_/ \__,_/\___/\___/\__,_/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Traccar"
-var_disk="2"
+var_tags="gps;tracker"
var_cpu="1"
var_ram="1024"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/traccar ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_error "There is currently no update path available."
-exit
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/traccar ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_error "There is currently no update path available."
+ exit
+ exit
}
start
@@ -65,5 +42,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8082${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8082${CL}"
\ No newline at end of file
diff --git a/ct/traefik.sh b/ct/traefik.sh
index 469029d49..bff8bd0a7 100644
--- a/ct/traefik.sh
+++ b/ct/traefik.sh
@@ -1,73 +1,51 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://traefik.io/
-function header_info {
-clear
-cat <<"EOF"
- ______ _____ __
- /_ __/________ ____ / __(_) /__
- / / / ___/ __ `/ _ \/ /_/ / //_/
- / / / / / /_/ / __/ __/ / ,<
-/_/ /_/ \__,_/\___/_/ /_/_/|_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Traefik"
-var_disk="2"
+var_tags="proxy"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/traefik.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -s https://api.github.com/repos/traefik/traefik/releases | grep -oP '"tag_name":\s*"v\K[\d.]+?(?=")' | sort -V | tail -n 1)
-msg_info "Updating $APP LXC"
-if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
- wget -q https://github.com/traefik/traefik/releases/download/v${RELEASE}/traefik_v${RELEASE}_linux_arm64.tar.gz
- tar -C /tmp -xzf traefik*.tar.gz
- mv /tmp/traefik /usr/bin/
- rm -rf traefik*.tar.gz
- systemctl restart traefik.service
- msg_ok "Updated $APP LXC"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/traefik.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/traefik/traefik/releases | grep -oP '"tag_name":\s*"v\K[\d.]+?(?=")' | sort -V | tail -n 1)
+ msg_info "Updating $APP LXC"
+ if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
+ wget -q https://github.com/traefik/traefik/releases/download/v${RELEASE}/traefik_v${RELEASE}_linux_amd64.tar.gz
+ tar -C /tmp -xzf traefik*.tar.gz
+ mv /tmp/traefik /usr/bin/
+ rm -rf traefik*.tar.gz
+ systemctl restart traefik.service
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated $APP LXC"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -75,5 +53,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8080${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
\ No newline at end of file
diff --git a/ct/transmission.sh b/ct/transmission.sh
index 066a11963..35f7890dd 100644
--- a/ct/transmission.sh
+++ b/ct/transmission.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://transmissionbt.com/
-function header_info {
-clear
-cat <<"EOF"
- ______ _ _
- /_ __/________ _____ _________ ___ (_)_________(_)___ ____
- / / / ___/ __ `/ __ \/ ___/ __ `__ \/ / ___/ ___/ / __ \/ __ \
- / / / / / /_/ / / / (__ ) / / / / / (__ |__ ) / /_/ / / / /
-/_/ /_/ \__,_/_/ /_/____/_/ /_/ /_/_/____/____/_/\____/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Transmission"
-var_disk="8"
+var_tags="torrent"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/transmission-daemon/settings.json ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated ${APP} LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/transmission-daemon/settings.json ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:9091/transmission${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9091/transmission${CL}"
\ No newline at end of file
diff --git a/ct/trilium.sh b/ct/trilium.sh
index cc6490f31..c2734dce2 100644
--- a/ct/trilium.sh
+++ b/ct/trilium.sh
@@ -1,91 +1,67 @@
#!/usr/bin/env bash
-# source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
-# # Copyright (c) 2021-2024 tteck
-# # Author: tteck (tteckster)
-# # License: MIT
-# # https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://triliumnext.github.io/Docs/
-echo "Unsupported."
+# App Default Values
+APP="Trilium"
+var_tags="notes"
+var_cpu="1"
+var_ram="512"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
-# function header_info {
-# clear
-# cat <<"EOF"
-# ______ _ ___
-# /_ __/____(_) (_)_ ______ ___
-# / / / ___/ / / / / / / __ `__ \
-# / / / / / / / / /_/ / / / / / /
-# /_/ /_/ /_/_/_/\__,_/_/ /_/ /_/
-
-# EOF
-# }
-# header_info
-# echo -e "Loading..."
-# APP="Trilium"
-# var_disk="2"
-# var_cpu="1"
-# var_ram="512"
-# var_os="debian"
-# var_version="12"
-# variables
-# color
-# catch_errors
+# App Output & Base Settings
+header_info "$APP"
+base_settings
-# function default_settings() {
-# CT_TYPE="1"
-# PW=""
-# CT_ID=$NEXTID
-# HN=$NSAPP
-# DISK_SIZE="$var_disk"
-# CORE_COUNT="$var_cpu"
-# RAM_SIZE="$var_ram"
-# BRG="vmbr0"
-# NET="dhcp"
-# GATE=""
-# APT_CACHER=""
-# APT_CACHER_IP=""
-# DISABLEIP6="no"
-# MTU=""
-# SD=""
-# NS=""
-# MAC=""
-# VLAN=""
-# SSH="no"
-# VERB="no"
-# echo_default
-# }
+# Core
+variables
+color
+catch_errors
-# function update_script() {
-# header_info
-# if [[ ! -d /opt/trilium ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-# RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-
-# msg_info "Stopping ${APP}"
-# systemctl stop trilium.service
-# sleep 1
-# msg_ok "Stopped ${APP}"
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/trilium ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-# msg_info "Updating to ${RELEASE}"
-# wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz
-# tar -xf TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz
-# cp -r trilium-linux-x64-server/* /opt/trilium/
-# msg_ok "Updated to ${RELEASE}"
+ msg_info "Stopping ${APP}"
+ systemctl stop trilium.service
+ sleep 1
+ msg_ok "Stopped ${APP}"
-# msg_info "Cleaning up"
-# rm -rf TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz trilium-linux-x64-server
-# msg_ok "Cleaned"
+ msg_info "Updating to ${RELEASE}"
+ wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz
+ tar -xf TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz
+ cp -r trilium-linux-x64-server/* /opt/trilium/
+ msg_ok "Updated to ${RELEASE}"
-# msg_info "Starting ${APP}"
-# systemctl start trilium.service
-# sleep 1
-# msg_ok "Started ${APP}"
-# msg_ok "Updated Successfully"
-# exit
-# }
+ msg_info "Cleaning up"
+ rm -rf TriliumNextNotes-${RELEASE}-server-linux-x64.tar.xz trilium-linux-x64-server
+ msg_ok "Cleaned"
-# start
-# build_container
-# description
+ msg_info "Starting ${APP}"
+ systemctl start trilium.service
+ sleep 1
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
+}
-# msg_ok "Completed Successfully!\n"
-# echo -e "${APP} should be reachable by going to the following URL.
-# ${BL}http://${IP}:8080${CL} \n"
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
\ No newline at end of file
diff --git a/ct/typesense.sh b/ct/typesense.sh
new file mode 100644
index 000000000..317cc96eb
--- /dev/null
+++ b/ct/typesense.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: tlissak | Co-Author MickLesk
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://typesense.org/
+
+# App Default Values
+APP="TypeSense"
+var_tags="database"
+var_cpu="1"
+var_ram="1024"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/typesense/typesense-server.ini ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/typesense/typesense/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following IP:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}${IP}:8108${CL}"
diff --git a/ct/ubuntu.sh b/ct/ubuntu.sh
index 113c3ee60..9eb4e604a 100644
--- a/ct/ubuntu.sh
+++ b/ct/ubuntu.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://ubuntu.com/
-function header_info {
-clear
-cat <<"EOF"
- __ ____ __
- / / / / /_ __ ______ / /___ __
- / / / / __ \/ / / / __ \/ __/ / / /
-/ /_/ / /_/ / /_/ / / / / /_/ /_/ /
-\____/_.___/\__,_/_/ /_/\__/\__,_/
-
-EOF
-}
-header_info
+# App Default Values
echo -e "Loading..."
APP="Ubuntu"
-var_disk="2"
+var_tags="os"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="ubuntu"
-var_version="22.04"
+var_version="24.04"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated ${APP} LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
}
start
@@ -67,3 +44,4 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
\ No newline at end of file
diff --git a/ct/umami.sh b/ct/umami.sh
index 2fba79353..dd89fdf33 100644
--- a/ct/umami.sh
+++ b/ct/umami.sh
@@ -1,93 +1,62 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://umami.is/
-function header_info {
-clear
-cat <<"EOF"
- _
- __ ______ ___ ____ _____ ___ (_)
- / / / / __ `__ \/ __ `/ __ `__ \/ /
-/ /_/ / / / / / / /_/ / / / / / / /
-\__,_/_/ /_/ /_/\__,_/_/ /_/ /_/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Umami"
-var_disk="12"
+var_tags="analytics"
var_cpu="2"
var_ram="2048"
+var_disk="12"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/umami ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/umami ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
-msg_info "Stopping ${APP}"
-systemctl stop umami
-msg_ok "Stopped $APP"
+ msg_info "Stopping ${APP}"
+ systemctl stop umami
+ msg_ok "Stopped $APP"
-msg_info "Updating ${APP}"
-cd /opt/umami
-git pull
-yarn install
-yarn build
-msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP}"
+ cd /opt/umami
+ git pull
+ yarn install
+ yarn build
+ msg_ok "Updated ${APP}"
-msg_info "Starting ${APP}"
-systemctl start umami
-msg_ok "Started ${APP}"
+ msg_info "Starting ${APP}"
+ systemctl start umami
+ msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_ok "Updated Successfully"
+ exit
}
start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 1024
-pct set $CTID -cores 1
-msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/umbrel.sh b/ct/umbrel.sh
index cd7ee66b0..a9aeaa417 100644
--- a/ct/umbrel.sh
+++ b/ct/umbrel.sh
@@ -1,64 +1,38 @@
-a#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://umbrel.com/
-function header_info {
-clear
-cat <<"EOF"
- __ __ __ __
- / / / /___ ___ / /_ ________ / /
- / / / / __ `__ \/ __ \/ ___/ _ \/ /
-/ /_/ / / / / / / /_/ / / / __/ /
-\____/_/ /_/ /_/_.___/_/ \___/_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Umbrel"
-var_disk="8"
+var_tags="os"
var_cpu="2"
var_ram="2048"
+var_disk="8"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-msg_info "Updating ${APP} LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated ${APP} LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ msg_info "Updating ${APP} LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
}
start
@@ -66,5 +40,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL (reboot is required before apps install).
- ${BL}http://${IP} ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized! (manual reboot is required!)${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/unbound.sh b/ct/unbound.sh
new file mode 100644
index 000000000..e84dfb6f4
--- /dev/null
+++ b/ct/unbound.sh
@@ -0,0 +1,49 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: wimb0
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/NLnetLabs/unbound
+
+# App Default Values
+APP="Unbound"
+var_tags="dns"
+var_cpu="1"
+var_ram="512"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/unbound ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5335${CL}"
\ No newline at end of file
diff --git a/ct/unifi.sh b/ct/unifi.sh
index 53c543b3e..be538dae7 100644
--- a/ct/unifi.sh
+++ b/ct/unifi.sh
@@ -1,69 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://ui.com/download/unifi
-function header_info {
-clear
-cat <<"EOF"
- __ __ _ _____
- / / / /__ (_) __(_)
- / / / / __ \/ / /_/ /
-/ /_/ / / / / / __/ /
-\____/_/ /_/_/_/ /_/
-
-EOF
-}
-header_info
-if ! grep -q -m1 'avx[^ ]*' /proc/cpuinfo; then
- echo "AVX instruction set is not supported on this CPU."
- exit
-fi
-echo -e "Loading..."
+# App Default Values
APP="Unifi"
-var_disk="8"
+var_tags="network;controller;unifi"
var_cpu="2"
var_ram="2048"
-var_os="ubuntu"
-var_version="22.04"
+var_disk="8"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /usr/lib/unifi ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP}"
-apt-get update --allow-releaseinfo-change
-apt-get install -y unifi
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /usr/lib/unifi ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP}"
+ apt-get update --allow-releaseinfo-change &>/dev/null
+ apt-get install -y unifi &>/dev/null
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -71,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP}${CL} should be reachable by going to the following URL.
- ${BL}https://${IP}:8443${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8443${CL}"
diff --git a/ct/unmanic.sh b/ct/unmanic.sh
index a8249e8c5..54bd9d5bf 100644
--- a/ct/unmanic.sh
+++ b/ct/unmanic.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://docs.unmanic.app/
-function header_info {
-clear
-cat <<"EOF"
- __ __ _
- / / / /___ ____ ___ ____ _____ (_)____
- / / / / __ \/ __ `__ \/ __ `/ __ \/ / ___/
-/ /_/ / / / / / / / / / /_/ / / / / / /__
-\____/_/ /_/_/ /_/ /_/\__,_/_/ /_/_/\___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Unmanic"
-var_disk="4"
+var_tags="file;media"
var_cpu="2"
var_ram="2048"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/systemd/system/unmanic.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-pip3 install -U unmanic &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/systemd/system/unmanic.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ pip3 install -U unmanic &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8888${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8888${CL}"
\ No newline at end of file
diff --git a/ct/uptimekuma.sh b/ct/uptimekuma.sh
index be77d734b..e5917de13 100644
--- a/ct/uptimekuma.sh
+++ b/ct/uptimekuma.sh
@@ -1,61 +1,37 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://uptime.kuma.pet/
-function header_info {
-clear
-cat <<"EOF"
- __ __ __ _ __ __
- / / / /___ / /_(_)___ ___ ___ / //_/_ ______ ___ ____ _
- / / / / __ \/ __/ / __ __ \/ _ \ / ,< / / / / __ __ \/ __ /
-/ /_/ / /_/ / /_/ / / / / / / __/ / /| / /_/ / / / / / / /_/ /
-\____/ .___/\__/_/_/ /_/ /_/\___/ /_/ |_\__,_/_/ /_/ /_/\__,_/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Uptime Kuma"
-var_disk="4"
+var_tags="analytics;monitoring"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/uptime-kuma ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/uptime-kuma ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
if ! command -v npm >/dev/null 2>&1; then
echo "Installing NPM..."
@@ -63,28 +39,28 @@ if [[ ! -d /opt/uptime-kuma ]]; then msg_error "No ${APP} Installation Found!";
echo "Installed NPM..."
fi
fi
-LATEST=$(curl -sL https://api.github.com/repos/louislam/uptime-kuma/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
-msg_info "Stopping ${APP}"
-sudo systemctl stop uptime-kuma &>/dev/null
-msg_ok "Stopped ${APP}"
+ LATEST=$(curl -sL https://api.github.com/repos/louislam/uptime-kuma/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
+ msg_info "Stopping ${APP}"
+ sudo systemctl stop uptime-kuma &>/dev/null
+ msg_ok "Stopped ${APP}"
-cd /opt/uptime-kuma
+ cd /opt/uptime-kuma
-msg_info "Pulling ${APP} ${LATEST}"
-git fetch --all &>/dev/null
-git checkout $LATEST --force &>/dev/null
-msg_ok "Pulled ${APP} ${LATEST}"
+ msg_info "Pulling ${APP} ${LATEST}"
+ git fetch --all &>/dev/null
+ git checkout $LATEST --force &>/dev/null
+ msg_ok "Pulled ${APP} ${LATEST}"
-msg_info "Updating ${APP} to ${LATEST}"
-npm install --production &>/dev/null
-npm run download-dist &>/dev/null
-msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP} to ${LATEST}"
+ npm install --production &>/dev/null
+ npm run download-dist &>/dev/null
+ msg_ok "Updated ${APP}"
-msg_info "Starting ${APP}"
-sudo systemctl start uptime-kuma &>/dev/null
-msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ${APP}"
+ sudo systemctl start uptime-kuma &>/dev/null
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -92,5 +68,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3001${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3001${CL}"
diff --git a/ct/vaultwarden.sh b/ct/vaultwarden.sh
index 18fc02ff8..af27eda90 100644
--- a/ct/vaultwarden.sh
+++ b/ct/vaultwarden.sh
@@ -1,63 +1,38 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.vaultwarden.net/
-function header_info {
- clear
- cat <<"EOF"
- _ __ ____ _ __ __
-| | / /___ ___ __/ / /| | / /___ __________/ /__ ____
-| | / / __ `/ / / / / __/ | /| / / __ `/ ___/ __ / _ \/ __ \
-| |/ / /_/ / /_/ / / /_ | |/ |/ / /_/ / / / /_/ / __/ / / /
-|___/\__,_/\__,_/_/\__/ |__/|__/\__,_/_/ \__,_/\___/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Vaultwarden"
-var_disk="6"
+var_tags="password-manager"
var_cpu="4"
-var_ram="5120"
+var_ram="6144"
+var_disk="6"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
if [[ ! -f /etc/systemd/system/vaultwarden.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
-
+
VAULT=$(curl -s https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest |
grep "tag_name" |
awk '{print substr($2, 2, length($2)-3) }')
@@ -71,9 +46,7 @@ function update_script() {
"3" "Set Admin Token" OFF \
3>&1 1>&2 2>&3)
- header_info
if [ "$UPD" == "1" ]; then
- whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "SET RESOURCES" "Please set the resources in your ${APP} LXC to ${var_cpu}vCPU and ${var_ram}RAM for the build process before continuing" 10 75
msg_info "Stopping Vaultwarden"
systemctl stop vaultwarden.service
msg_ok "Stopped Vaultwarden"
@@ -100,7 +73,6 @@ function update_script() {
msg_ok "Started Vaultwarden"
msg_ok "$VAULT Update Successful"
- echo -e "\n ⚠️ Ensure you set resources back to normal settings \n"
exit
fi
if [ "$UPD" == "2" ]; then
@@ -142,10 +114,7 @@ start
build_container
description
-msg_info "Setting Container to Normal Resources"
-pct set $CTID -memory 512
-pct set $CTID -cores 1
-msg_ok "Set Container to Normal Resources"
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
diff --git a/ct/vikunja.sh b/ct/vikunja.sh
new file mode 100644
index 000000000..98675a036
--- /dev/null
+++ b/ct/vikunja.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://vikunja.io/
+
+# App Default Values
+APP="Vikunja"
+var_tags="todo-app"
+var_cpu="1"
+var_ram="1024"
+var_disk="4"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/vikunja ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://dl.vikunja.io/vikunja/ | grep -oP 'href="/vikunja/\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -n 1)
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop vikunja
+ msg_ok "Stopped ${APP}"
+
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cd /opt
+ rm -rf /opt/vikunja/vikunja
+ wget -q "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb"
+ DEBIAN_FRONTEND=noninteractive dpkg -i vikunja-$RELEASE-amd64.deb &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP}"
+
+ msg_info "Starting ${APP}"
+ systemctl start vikunja
+ msg_ok "Started ${APP}"
+
+ msg_info "Cleaning Up"
+ rm -rf /opt/vikunja-$RELEASE-amd64.deb
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3456${CL}"
diff --git a/ct/wallos.sh b/ct/wallos.sh
index 0bd4dc275..f4f92d3d8 100644
--- a/ct/wallos.sh
+++ b/ct/wallos.sh
@@ -1,93 +1,70 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/tteck/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://wallosapp.com/
-function header_info {
-clear
-cat <<"EOF"
- _ __ ____
-| | / /___ _/ / /___ _____
-| | /| / / __ `/ / / __ \/ ___/
-| |/ |/ / /_/ / / / /_/ (__ )
-|__/|__/\__,_/_/_/\____/____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Wallos"
-var_disk="5"
+var_tags="finance"
var_cpu="1"
var_ram="1024"
+var_disk="5"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/wallos ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-RELEASE=$(curl -s https://api.github.com/repos/ellite/Wallos/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Updating ${APP} to ${RELEASE}"
- cd /opt
- wget -q "https://github.com/ellite/Wallos/archive/refs/tags/v${RELEASE}.zip"
- mv /opt/wallos/db/wallos.db /opt/wallos.db
- unzip -q v${RELEASE}.zip
- mv Wallos-${RELEASE} /opt/wallos
- rm -rf /opt/wallos/db/wallos.empty.db
- mv /opt/wallos.db /opt/wallos/db/wallos.db
- chown -R www-data:www-data /opt/wallos
- chmod -R 755 /opt/wallos
- curl http://localhost/endpoints/db/migrate.php &>/dev/null
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/wallos ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/ellite/Wallos/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cd /opt
+ wget -q "https://github.com/ellite/Wallos/archive/refs/tags/v${RELEASE}.zip"
+ mkdir -p /opt/logos
+ mv /opt/wallos/db/wallos.db /opt/wallos.db
+ mv /opt/wallos/images/uploads/logos /opt/logos/
+ unzip -q v${RELEASE}.zip
+ rm -rf /opt/wallos
+ mv Wallos-${RELEASE} /opt/wallos
+ rm -rf /opt/wallos/db/wallos.empty.db
+ mv /opt/wallos.db /opt/wallos/db/wallos.db
+ mv /opt/logos/* /opt/wallos/images/uploads/logos
+ chown -R www-data:www-data /opt/wallos
+ chmod -R 755 /opt/wallos
+ mkdir -p /var/log/cron
+ curl http://localhost/endpoints/db/migrate.php &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP}"
- msg_info "Reload Apache2"
- systemctl reload apache2
- msg_ok "Apache2 Reloaded"
+ msg_info "Reload Apache2"
+ systemctl reload apache2
+ msg_ok "Apache2 Reloaded"
- msg_info "Cleaning Up"
- rm -R /opt/v${RELEASE}.zip
- msg_ok "Cleaned"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Cleaning Up"
+ rm -R /opt/v${RELEASE}.zip
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -95,5 +72,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP} ${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/wastebin.sh b/ct/wastebin.sh
index 57a09aa66..2fcf729bd 100644
--- a/ct/wastebin.sh
+++ b/ct/wastebin.sh
@@ -1,89 +1,63 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
# Source: https://github.com/matze/wastebin
-
-function header_info {
-clear
-cat <<"EOF"
- _ __ __ __ _
-| | / /___ ______/ /____ / /_ (_)___
-| | /| / / __ `/ ___/ __/ _ \/ __ \/ / __ \
-| |/ |/ / /_/ (__ ) /_/ __/ /_/ / / / / /
-|__/|__/\__,_/____/\__/\___/_.___/_/_/ /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Wastebin"
-var_disk="4"
+var_tags="file;code"
var_cpu="1"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/wastebin ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -s https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping Wastebin"
- systemctl stop wastebin
- msg_ok "Wastebin Stopped"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/wastebin ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Wastebin"
+ systemctl stop wastebin
+ msg_ok "Wastebin Stopped"
- msg_info "Updating Wastebin"
- wget -q https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
- tar -xf wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
- cp -f wastebin /opt/wastebin/
- chmod +x /opt/wastebin/wastebin
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated Wastebin"
+ msg_info "Updating Wastebin"
+ wget -q https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
+ tar -xf wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
+ cp -f wastebin /opt/wastebin/
+ chmod +x /opt/wastebin/wastebin
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated Wastebin"
- msg_info "Starting Wastebin"
- systemctl start wastebin
- msg_ok "Started Wastebin"
+ msg_info "Starting Wastebin"
+ systemctl start wastebin
+ msg_ok "Started Wastebin"
- msg_info "Cleaning Up"
- rm -rf wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
- msg_ok "Cleaned"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Cleaning Up"
+ rm -rf wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -91,5 +65,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:8088${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8088${CL}"
\ No newline at end of file
diff --git a/ct/watchyourlan.sh b/ct/watchyourlan.sh
index fef3a70c1..297dc74d6 100644
--- a/ct/watchyourlan.sh
+++ b/ct/watchyourlan.sh
@@ -1,72 +1,49 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/aceberg/WatchYourLAN
-function header_info {
-clear
-cat <<"EOF"
- _ __ __ ____ __ __ ___ _ __
-| | / /___ _/ /______/ /\ \/ /___ __ _______/ / / | / | / /
-| | /| / / __ `/ __/ ___/ __ \ / __ \/ / / / ___/ / / /| | / |/ /
-| |/ |/ / /_/ / /_/ /__/ / / / / /_/ / /_/ / / / /___/ ___ |/ /| /
-|__/|__/\__,_/\__/\___/_/ /_/_/\____/\__,_/_/ /_____/_/ |_/_/ |_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="WatchYourLAN"
-var_disk="2"
+var_tags="network"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /lib/systemd/system/watchyourlan.service ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP"
-systemctl stop watchyourlan.service
-cp -R /data/config.yaml config.yaml
-RELEASE=$(curl -s https://api.github.com/repos/aceberg/WatchYourLAN/releases/latest | grep -o '"tag_name": *"[^"]*"' | cut -d '"' -f 4)
-wget -q https://github.com/aceberg/WatchYourLAN/releases/download/$RELEASE/watchyourlan_${RELEASE}_linux_arm64.deb
-dpkg -i watchyourlan_${RELEASE}_linux_arm64.deb
-cp -R config.yaml /data/config.yaml
-sed -i 's|/etc/watchyourlan/config.yaml|/data/config.yaml|' /lib/systemd/system/watchyourlan.service
-rm watchyourlan_${RELEASE}_linux_arm64.deb config.yaml
-systemctl enable -q --now watchyourlan.service
-msg_ok "Updated $APP"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /lib/systemd/system/watchyourlan.service ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP"
+ systemctl stop watchyourlan.service
+ cp -R /data/config.yaml config.yaml
+ RELEASE=$(curl -s https://api.github.com/repos/aceberg/WatchYourLAN/releases/latest | grep -o '"tag_name": *"[^"]*"' | cut -d '"' -f 4)
+ wget -q https://github.com/aceberg/WatchYourLAN/releases/download/$RELEASE/watchyourlan_${RELEASE}_linux_amd64.deb
+ dpkg -i watchyourlan_${RELEASE}_linux_amd64.deb
+ cp -R config.yaml /data/config.yaml
+ sed -i 's|/etc/watchyourlan/config.yaml|/data/config.yaml|' /lib/systemd/system/watchyourlan.service
+ rm watchyourlan_${RELEASE}_linux_amd64.deb config.yaml
+ systemctl enable -q --now watchyourlan.service
+ msg_ok "Updated $APP"
+ exit
}
start
@@ -74,5 +51,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8840${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8840${CL}"
\ No newline at end of file
diff --git a/ct/wavelog.sh b/ct/wavelog.sh
new file mode 100644
index 000000000..05b91e9e4
--- /dev/null
+++ b/ct/wavelog.sh
@@ -0,0 +1,87 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Don Locke (DonLocke)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.wavelog.org/
+
+# App Default Values
+APP="Wavelog"
+var_tags="radio-logging"
+var_cpu="1"
+var_ram="512"
+var_disk="2"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/wavelog ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/wavelog/wavelog/releases/latest | grep "tag_name" | cut -d '"' -f 4)
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Services"
+ systemctl stop apache2
+ msg_ok "Services Stopped"
+
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cp /opt/wavelog/application/config/config.php /opt/config.php
+ cp /opt/wavelog/application/config/database.php /opt/database.php
+ cp -r /opt/wavelog/userdata /opt/userdata
+ if [[ -f /opt/wavelog/assets/js/sections/custom.js ]]; then
+ cp /opt/wavelog/assets/js/sections/custom.js /opt/custom.js
+ fi
+ wget -q "https://github.com/wavelog/wavelog/archive/refs/tags/${RELEASE}.zip"
+ unzip -q ${RELEASE}.zip
+ rm -rf /opt/wavelog
+ mv wavelog-${RELEASE}/ /opt/wavelog
+ rm -rf /opt/wavelog/install
+ mv /opt/config.php /opt/wavelog/application/config/config.php
+ mv /opt/database.php /opt/wavelog/application/config/database.php
+ cp -r /opt/userdata/* /opt/wavelog/userdata
+ rm -rf /opt/userdata
+ if [[ -f /opt/custom.js ]]; then
+ mv /opt/custom.js /opt/wavelog/assets/js/sections/custom.js
+ fi
+ chown -R www-data:www-data /opt/wavelog/
+ find /opt/wavelog/ -type d -exec chmod 755 {} \;
+ find /opt/wavelog/ -type f -exec chmod 664 {} \;
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP}"
+
+ msg_info "Starting Services"
+ systemctl start apache2
+ msg_ok "Started Services"
+
+ msg_info "Cleaning Up"
+ rm -rf ${RELEASE}.zip
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/whisparr.sh b/ct/whisparr.sh
index 9cf2ffad4..97fde92af 100644
--- a/ct/whisparr.sh
+++ b/ct/whisparr.sh
@@ -1,66 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/Whisparr/Whisparr
-function header_info {
-clear
-cat <<"EOF"
- _ ____ _
-| | / / /_ (_)________ ____ __________
-| | /| / / __ \/ / ___/ __ \/ __ `/ ___/ ___/
-| |/ |/ / / / / (__ ) /_/ / /_/ / / / /
-|__/|__/_/ /_/_/____/ .___/\__,_/_/ /_/
- /_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Whisparr"
-var_disk="4"
+var_tags="arr"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /var/lib/whisparr ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /var/lib/whisparr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -68,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:6969${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6969${CL}"
\ No newline at end of file
diff --git a/ct/whoogle.sh b/ct/whoogle.sh
index b56bb0f21..78dcca9e2 100644
--- a/ct/whoogle.sh
+++ b/ct/whoogle.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://github.com/benbusby/whoogle-search
-function header_info {
-clear
-cat <<"EOF"
- _ ____ ______ ____ ________ ______
-| | / / / / / __ \/ __ \/ ____/ / / ____/
-| | /| / / /_/ / / / / / / / / __/ / / __/
-| |/ |/ / __ / /_/ / /_/ / /_/ / /___/ /___
-|__/|__/_/ /_/\____/\____/\____/_____/_____/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Whoogle"
-var_disk="2"
+var_tags="network;seaching"
var_cpu="1"
var_ram="512"
+var_disk="2"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /usr/local/bin/whoogle-search ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating ${APP} LXC"
-pip3 install whoogle-search --upgrade &>/dev/null
-systemctl restart whoogle.service
-msg_ok "Updated Successfully"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /usr/local/bin/whoogle-search ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ${APP} LXC"
+ pip3 install whoogle-search --upgrade &>/dev/null
+ systemctl restart whoogle.service
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:5000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}"
\ No newline at end of file
diff --git a/ct/wikijs.sh b/ct/wikijs.sh
index fcd5c2ff2..f8213d88f 100644
--- a/ct/wikijs.sh
+++ b/ct/wikijs.sh
@@ -1,88 +1,64 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://js.wiki/
-function header_info {
-clear
-cat <<"EOF"
- _ ___ __ _ _
-| | / (_) /__(_) (_)____
-| | /| / / / //_/ / / / ___/
-| |/ |/ / / ,< / / / (__ )
-|__/|__/_/_/|_/_(_)_/ /____/
- /___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Wikijs"
-var_disk="3"
+var_tags="wiki"
var_cpu="1"
var_ram="512"
+var_disk="3"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/wikijs ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Stopping ${APP}"
-systemctl stop wikijs
-msg_ok "Stopped ${APP}"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/wikijs ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP}"
+ systemctl stop wikijs
+ msg_ok "Stopped ${APP}"
-msg_info "Backing up Data"
-mkdir -p ~/data-backup
-cp -R /opt/wikijs/{db.sqlite,config.yml,/data} ~/data-backup
-msg_ok "Backed up Data"
+ msg_info "Backing up Data"
+ mkdir -p ~/data-backup
+ cp -R /opt/wikijs/{db.sqlite,config.yml,/data} ~/data-backup
+ msg_ok "Backed up Data"
-msg_info "Updating ${APP}"
-rm -rf /opt/wikijs/*
-cd /opt/wikijs
-wget -q https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
-tar xzf wiki-js.tar.gz
-msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP}"
+ rm -rf /opt/wikijs/*
+ cd /opt/wikijs
+ wget -q https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
+ tar xzf wiki-js.tar.gz
+ msg_ok "Updated ${APP}"
-msg_info "Restoring Data"
-cp -R ~/data-backup/* /opt/wikijs
-rm -rf ~/data-backup
-npm rebuild sqlite3 &>/dev/null
-msg_ok "Restored Data"
+ msg_info "Restoring Data"
+ cp -R ~/data-backup/* /opt/wikijs
+ rm -rf ~/data-backup
+ npm rebuild sqlite3 &>/dev/null
+ msg_ok "Restored Data"
-msg_info "Starting ${APP}"
-systemctl start wikijs
-msg_ok "Started ${APP}"
-msg_ok "Updated Successfully"
-exit
+ msg_info "Starting ${APP}"
+ systemctl start wikijs
+ msg_ok "Started ${APP}"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -90,5 +66,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/wireguard.sh b/ct/wireguard.sh
index a7eed8e07..813a4b078 100644
--- a/ct/wireguard.sh
+++ b/ct/wireguard.sh
@@ -1,65 +1,43 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.wireguard.com/
-function header_info {
-clear
-cat <<"EOF"
- _ ___ ______ __
-| | / (_)_______ / ____/_ ______ __________/ /
-| | /| / / / ___/ _ \/ / __/ / / / __ `/ ___/ __ /
-| |/ |/ / / / / __/ /_/ / /_/ / /_/ / / / /_/ /
-|__/|__/_/_/ \___/\____/\__,_/\__,_/_/ \__,_/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Wireguard"
-var_disk="4"
+var_tags="network;vpn"
var_cpu="1"
var_ram="512"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-if [[ ! -d /etc/wireguard ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-apt-get update
-apt-get -y upgrade
-sleep 2
-cd /etc/wgdashboard/src
-./wgd.sh update
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /etc/wireguard ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ apt-get update
+ apt-get -y upgrade
+ sleep 2
+ cd /etc/wgdashboard/src
+ ./wgd.sh update
+ exit
}
start
@@ -67,5 +45,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "WGDashboard should be reachable by going to the following URL.
- ${BL}http://${IP}:10086${CL} admin|admin \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} WGDashboard Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:10086${CL}"
\ No newline at end of file
diff --git a/ct/yunohost.sh b/ct/yunohost.sh
index 824f2dd38..8c32999ed 100644
--- a/ct/yunohost.sh
+++ b/ct/yunohost.sh
@@ -1,65 +1,42 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://yunohost.org/
-function header_info {
-clear
-cat <<"EOF"
-__ __ __ __ __
-\ \/ /_ ______ ____ / / / /___ _____/ /_
- \ / / / / __ \/ __ \/ /_/ / __ \/ ___/ __/
- / / /_/ / / / / /_/ / __ / /_/ (__ ) /_
-/_/\__,_/_/ /_/\____/_/ /_/\____/____/\__/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="YunoHost"
-var_disk="20"
+var_tags="os"
var_cpu="2"
var_ram="2048"
+var_disk="20"
var_os="debian"
-var_version="11"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/apt/trusted.gpg.d/php.gpg ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/apt/trusted.gpg.d/php.gpg ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating $APP LXC"
+ apt-get update &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_ok "Updated $APP LXC"
+ exit
}
start
@@ -67,5 +44,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}/ ${CL}"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/zabbix.sh b/ct/zabbix.sh
index a38d6ea84..0be4bdf85 100644
--- a/ct/zabbix.sh
+++ b/ct/zabbix.sh
@@ -1,66 +1,64 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.zabbix.com/
-function header_info {
-clear
-cat <<"EOF"
- _____ __ __ _
-/__ / ____ _/ /_ / /_ (_) __
- / / / __ `/ __ \/ __ \/ / |/_/
- / /__/ /_/ / /_/ / /_/ / /> <
-/____/\__,_/_.___/_.___/_/_/|_|
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Zabbix"
-var_disk="6"
+var_tags="monitoring"
var_cpu="2"
var_ram="4096"
+var_disk="6"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -f /etc/zabbix/zabbix_server.conf ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-msg_info "Updating $APP LXC"
-apt-get update &>/dev/null
-apt-get -y upgrade &>/dev/null
-systemctl restart zabbix-server
-msg_ok "Updated $APP LXC"
-exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -f /etc/zabbix/zabbix_server.conf ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping ${APP} Services"
+ systemctl stop zabbix-server zabbix-agent2
+ msg_ok "Stopped ${APP} Services"
+
+ msg_info "Updating $APP LXC"
+ mkdir -p /opt/zabbix-backup/
+ cp /etc/zabbix/zabbix_server.conf /opt/zabbix-backup/
+ cp /etc/apache2/conf-enabled/zabbix.conf /opt/zabbix-backup/
+ cp -R /usr/share/zabbix/ /opt/zabbix-backup/
+ #cp -R /usr/share/zabbix-* /opt/zabbix-backup/ Remove temporary
+ rm -Rf /etc/apt/sources.list.d/zabbix.list
+ cd /tmp
+ wget -q https://repo.zabbix.com/zabbix/7.2/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb
+ dpkg -i zabbix-release_latest+debian12_all.deb &>/dev/null
+ apt-get update &>/dev/null
+ apt-get install --only-upgrade zabbix-server-pgsql zabbix-frontend-php zabbix-agent2 zabbix-agent2-plugin-* &>/dev/null
+
+ msg_info "Starting ${APP} Services"
+ systemctl start zabbix-server zabbix-agent2
+ systemctl restart apache2
+ msg_ok "Started ${APP} Services"
+
+ msg_info "Cleaning Up"
+ rm -rf /tmp/zabbix-release_latest+debian12_all.deb
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ exit
}
start
@@ -68,5 +66,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}/zabbix${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/zabbix${CL}"
diff --git a/ct/zammad.sh b/ct/zammad.sh
new file mode 100644
index 000000000..ce9c0e7ae
--- /dev/null
+++ b/ct/zammad.sh
@@ -0,0 +1,56 @@
+#!/usr/bin/env bash
+source ./misc/build.func
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Michel Roegl-Brunner (michelroegl-brunner)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://zammad.com
+
+#App Default Values
+APP="Zammad"
+TAGS="webserver;ticket-system"
+var_disk="8"
+var_cpu="2"
+var_ram="4096"
+var_os="debian"
+var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/zammad ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Stopping Service"
+ systemctl stop zammad &>/dev/null
+ msg_info "Updating ${APP}"
+ apt-get update &>/dev/null
+ apt-mark hold zammad &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ apt-mark unhold zammad &>/dev/null
+ apt-get -y upgrade &>/dev/null
+ msg_info "Starting Service"
+ systemctl start zammad &>/dev/null
+ msg_ok "Updated ${APP} LXC"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/zigbee2mqtt.sh b/ct/zigbee2mqtt.sh
index 76519b260..2f88c3556 100644
--- a/ct/zigbee2mqtt.sh
+++ b/ct/zigbee2mqtt.sh
@@ -1,149 +1,66 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://www.zigbee2mqtt.io/
-function header_info {
- clear
- cat <<"EOF"
- _____ _ __ ___ __ _______ ____________
-/__ / (_)___ _/ /_ ___ ___ |__ \ / |/ / __ \/_ __/_ __/
- / / / / __ / __ \/ _ \/ _ \__/ // /|_/ / / / / / / / /
- / /__/ / /_/ / /_/ / __/ __/ __// / / / /_/ / / / / /
-/____/_/\__, /_.___/\___/\___/____/_/ /_/\___\_\/_/ /_/
- /____/ 🐝
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Zigbee2MQTT"
-var_disk="4"
+var_tags="smarthome;zigbee;mqtt"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
header_info
+ check_container_storage
+ check_container_resources
if [[ ! -d /opt/zigbee2mqtt ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
- if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
- if ! command -v npm >/dev/null 2>&1; then
- echo "Installing NPM..."
- apt-get install -y npm >/dev/null 2>&1
- echo "Installed NPM..."
- fi
+ RELEASE=$(curl -s https://api.github.com/repos/Koenkk/zigbee2mqtt/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop zigbee2mqtt
+ msg_ok "Stopped Service"
+
+ msg_info "Creating Backup"
+ mkdir -p /opt/z2m_backup
+ tar -czf /opt/z2m_backup/${APP}_backup_$(date +%Y%m%d%H%M%S).tar.gz -C /opt zigbee2mqtt &>/dev/null
+ mv /opt/zigbee2mqtt/data /opt/z2m_backup
+ msg_ok "Backup Created"
+
+ msg_info "Updating ${APP} to v${RELEASE}"
+ cd /opt
+ wget -q "https://github.com/Koenkk/zigbee2mqtt/archive/refs/tags/${RELEASE}.zip"
+ unzip -q ${RELEASE}.zip
+ mv zigbee2mqtt-${RELEASE} /opt/zigbee2mqtt
+ rm -rf /opt/zigbee2mqtt/data
+ mv /opt/z2m_backup/data /opt/zigbee2mqtt
+ cd /opt/zigbee2mqtt
+ pnpm install --frozen-lockfile &>/dev/null
+ pnpm build &>/dev/null
+ msg_info "Starting Service"
+ systemctl start zigbee2mqtt
+ msg_ok "Started Service"
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ else
+ msg_ok "No update required. ${APP} is already at v${RELEASE}."
fi
- cd /opt/zigbee2mqtt
-
- stop_zigbee2mqtt() {
- if which systemctl 2>/dev/null >/dev/null; then
- echo "Shutting down Zigbee2MQTT..."
- sudo systemctl stop zigbee2mqtt
- else
- echo "Skipped stopping Zigbee2MQTT, no systemctl found"
- fi
- }
-
- start_zigbee2mqtt() {
- if which systemctl 2>/dev/null >/dev/null; then
- echo "Starting Zigbee2MQTT..."
- sudo systemctl start zigbee2mqtt
- else
- echo "Skipped starting Zigbee2MQTT, no systemctl found"
- fi
- }
-
- set -e
-
- if [ -d data-backup ]; then
- echo "ERROR: Backup directory exists. May be previous restoring was failed?"
- echo "1. Save 'data-backup' and 'data' dirs to safe location to make possibility to restore config later."
- echo "2. Manually delete 'data-backup' dir and try again."
- exit 1
- fi
-
- stop_zigbee2mqtt
-
- echo "Generating a backup of the configuration..."
- cp -R data data-backup || {
- echo "Failed to create backup."
- exit 1
- }
-
- echo "Checking if any changes were made to package-lock.json..."
- git checkout package-lock.json || {
- echo "Failed to check package-lock.json."
- exit 1
- }
-
- echo "Initiating update..."
- if ! git pull; then
- echo "Update failed, temporarily storing changes and trying again."
- git stash && git pull || (
- echo "Update failed even after storing changes. Aborting."
- exit 1
- )
- fi
-
- echo "Acquiring necessary components..."
- npm ci || {
- echo "Failed to install necessary components."
- exit 1
- }
-
- echo "Building..."
- npm run build || {
- echo "Failed to build new version."
- exit 1
- }
-
- echo "Restoring configuration..."
- cp -R data-backup/* data || {
- echo "Failed to restore configuration."
- exit 1
- }
-
- rm -rf data-backup || {
- echo "Failed to remove backup directory."
- exit 1
- }
-
- start_zigbee2mqtt
-
- echo "Done!"
exit
}
@@ -152,3 +69,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9442${CL}"
diff --git a/ct/zipline.sh b/ct/zipline.sh
index 308b94505..d3baa2233 100644
--- a/ct/zipline.sh
+++ b/ct/zipline.sh
@@ -1,95 +1,67 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
-# Author: tteck
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://zipline.diced.sh/
-function header_info {
-clear
-cat <<"EOF"
- _____ _ ___
-/__ / (_)___ / (_)___ ___
- / / / / __ \/ / / __ \/ _ \
- / /__/ / /_/ / / / / / / __/
-/____/_/ .___/_/_/_/ /_/\___/
- /_/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Zipline"
-var_disk="5"
+var_tags="file;sharing"
var_cpu="2"
var_ram="2048"
+var_disk="5"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
function update_script() {
-header_info
-if [[ ! -d /opt/zipline ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-if (( $(df /boot | awk 'NR==2{gsub("%","",$5); print $5}') > 80 )); then
- read -r -p "Warning: Storage is dangerously low, continue anyway? " prompt
- [[ ${prompt,,} =~ ^(y|yes)$ ]] || exit
-fi
-RELEASE=$(curl -s https://api.github.com/repos/diced/zipline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Stopping ${APP}"
- systemctl stop zipline
- msg_ok "${APP} Stopped"
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/zipline ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/diced/zipline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping ${APP}"
+ systemctl stop zipline
+ msg_ok "${APP} Stopped"
- msg_info "Updating ${APP} to ${RELEASE}"
- cp /opt/zipline/.env /opt/
- rm -R /opt/zipline
- wget -q "https://github.com/diced/zipline/archive/refs/tags/v${RELEASE}.zip"
- unzip -q v${RELEASE}.zip
- mv zipline-${RELEASE} /opt/zipline
- cd /opt/zipline
- mv /opt/.env /opt/zipline/.env
- yarn install &>/dev/null
- yarn build &>/dev/null
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP}"
+ msg_info "Updating ${APP} to ${RELEASE}"
+ cp /opt/zipline/.env /opt/
+ rm -R /opt/zipline
+ wget -q "https://github.com/diced/zipline/archive/refs/tags/v${RELEASE}.zip"
+ unzip -q v${RELEASE}.zip
+ mv zipline-${RELEASE} /opt/zipline
+ cd /opt/zipline
+ mv /opt/.env /opt/zipline/.env
+ yarn install &>/dev/null
+ yarn build &>/dev/null
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated ${APP}"
- msg_info "Starting ${APP}"
- systemctl start zipline
- msg_ok "Started ${APP}"
+ msg_info "Starting ${APP}"
+ systemctl start zipline
+ msg_ok "Started ${APP}"
- msg_info "Cleaning Up"
- rm -rf v${RELEASE}.zip
- msg_ok "Cleaned"
- msg_ok "Updated Successfully"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
-fi
-exit
+ msg_info "Cleaning Up"
+ rm -rf v${RELEASE}.zip
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -97,5 +69,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} Setup should be reachable by going to the following URL.
- ${BL}http://${IP}:3000${CL} \n"
\ No newline at end of file
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
\ No newline at end of file
diff --git a/ct/zoraxy.sh b/ct/zoraxy.sh
index 9eea07eb9..a68ee4f53 100644
--- a/ct/zoraxy.sh
+++ b/ct/zoraxy.sh
@@ -1,75 +1,52 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://zoraxy.aroz.org/
-function header_info {
-clear
-cat <<"EOF"
- _____
-/__ / ____ _________ __ ____ __
- / / / __ \/ ___/ __ `/ |/_/ / / /
- / /__/ /_/ / / / /_/ /> /_/ /
-/____/\____/_/ \__,_/_/|_|\__, /
- /____/
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Zoraxy"
-var_disk="6"
+var_tags="network"
var_cpu="2"
var_ram="2048"
+var_disk="6"
var_os="debian"
var_version="12"
+var_unprivileged="1"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="1"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
-header_info
-if [[ ! -d /opt/zoraxy/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
-RELEASE=$(curl -s https://api.github.com/repos/tobychui/zoraxy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
-if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
- msg_info "Updating $APP to ${RELEASE}"
- systemctl stop zoraxy
- wget -q "https://github.com/tobychui/zoraxy/releases/download/${RELEASE}/zoraxy_linux_amd64"
- rm /opt/zoraxy/zoraxy
- mv zoraxy_linux_amd64 /opt/zoraxy/zoraxy
- chmod +x /opt/zoraxy/zoraxy
- systemctl start zoraxy
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated $APP"
-else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
- fi
- exit
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/zoraxy/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ RELEASE=$(curl -s https://api.github.com/repos/tobychui/zoraxy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Updating $APP to ${RELEASE}"
+ systemctl stop zoraxy
+ wget -q "https://github.com/tobychui/zoraxy/releases/download/${RELEASE}/zoraxy_linux_amd64"
+ rm -rf /opt/zoraxy/zoraxy
+ mv zoraxy_linux_amd64 /opt/zoraxy/zoraxy
+ chmod +x /opt/zoraxy/zoraxy
+ systemctl start zoraxy
+ echo "${RELEASE}" >/opt/${APP}_version.txt
+ msg_ok "Updated $APP"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}"
+ fi
+ exit
}
start
@@ -77,5 +54,6 @@ build_container
description
msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8000${CL} \n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
\ No newline at end of file
diff --git a/ct/zwave-js-ui.sh b/ct/zwave-js-ui.sh
index 58f574b32..700b17979 100644
--- a/ct/zwave-js-ui.sh
+++ b/ct/zwave-js-ui.sh
@@ -1,93 +1,62 @@
#!/usr/bin/env bash
-source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func)
-# Copyright (c) 2021-2024 tteck
+source ./misc/build.func
+# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE
+# Source: https://zwave-js.github.io/zwave-js-ui/#/
-function header_info {
- clear
- cat <<"EOF"
- _____ _______ __ ______
-/__ /_ ______ __ _____ / / ___/ / / / / _/
- / /| | /| / / __ `/ | / / _ \ __ / /\__ \ / / / // /
- / /_| |/ |/ / /_/ /| |/ / __/ / /_/ /___/ / / /_/ // /
-/____/__/|__/\__,_/ |___/\___/ \____//____/ \____/___/
-
-EOF
-}
-header_info
-echo -e "Loading..."
+# App Default Values
APP="Zwave-JS-UI"
-var_disk="4"
+var_tags="smarthome;zwave"
var_cpu="2"
var_ram="1024"
+var_disk="4"
var_os="debian"
var_version="12"
+var_unprivileged="0"
+
+# App Output & Base Settings
+header_info "$APP"
+base_settings
+
+# Core
variables
color
catch_errors
-function default_settings() {
- CT_TYPE="0"
- PW=""
- CT_ID=$NEXTID
- HN=$NSAPP
- DISK_SIZE="$var_disk"
- CORE_COUNT="$var_cpu"
- RAM_SIZE="$var_ram"
- BRG="vmbr0"
- NET="dhcp"
- GATE=""
- APT_CACHER=""
- APT_CACHER_IP=""
- DISABLEIP6="no"
- MTU=""
- SD=""
- NS=""
- MAC=""
- VLAN=""
- SSH="no"
- VERB="no"
- echo_default
-}
-
function update_script() {
header_info
+ check_container_storage
+ check_container_resources
if [[ ! -d /opt/zwave-js-ui ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/zwave-js/zwave-js-ui/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
- msg_info "Stopping Z-wave JS UI"
- systemctl stop zwave-js-ui.service
- msg_ok "Stopped Z-wave JS UI"
+ if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
+ msg_info "Stopping Service"
+ systemctl stop zwave-js-ui
+ msg_ok "Stopped Service"
- msg_info "Updating Z-wave JS UI"
- wget https://github.com/zwave-js/zwave-js-ui/releases/download/${RELEASE}/zwave-js-ui-${RELEASE}-linux-arm64.zip &>/dev/null
- unzip zwave-js-ui-${RELEASE}-linux-arm64.zip &>/dev/null
- \cp -R zwave-js-ui-linux /opt/zwave-js-ui
- service_path="/etc/systemd/system/zwave-js-ui.service"
- echo "[Unit]
- Description=zwave-js-ui
- Wants=network-online.target
- After=network-online.target
- [Service]
- User=root
- WorkingDirectory=/opt/zwave-js-ui
- ExecStart=/opt/zwave-js-ui/zwave-js-ui-linux
- [Install]
- WantedBy=multi-user.target" >$service_path
- msg_ok "Updated Z-wave JS UI"
+ msg_info "Updating Z-Wave JS UI"
+ rm -rf /opt/zwave-js-ui/*
+ cd /opt/zwave-js-ui
+ wget -q https://github.com/zwave-js/zwave-js-ui/releases/download/${RELEASE}/zwave-js-ui-${RELEASE}-linux.zip
+ unzip -q zwave-js-ui-${RELEASE}-linux.zip
+ msg_ok "Updated Z-Wave JS UI"
- msg_info "Starting Z-wave JS UI"
- systemctl enable --now zwave-js-ui.service
- msg_ok "Started Z-wave JS UI"
+ msg_info "Starting Service"
+ systemctl start zwave-js-ui
+ msg_ok "Started Service"
- msg_info "Cleanup"
- rm -rf zwave-js-ui-${RELEASE}-linux-arm64.zip zwave-js-ui-linux store
- msg_ok "Cleaned"
- msg_ok "Updated Successfully!\n"
+ msg_info "Cleanup"
+ rm -rf /opt/zwave-js-ui/zwave-js-ui-${RELEASE}-linux.zip
+ rm -rf /opt/zwave-js-ui/store
+ msg_ok "Cleaned"
+ msg_ok "Updated Successfully!\n"
+ else
+ msg_ok "No update required. ${APP} is already at ${RELEASE}."
+ fi
exit
}
@@ -95,5 +64,7 @@ start
build_container
description
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://${IP}:8091${CL} \n"
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8091${CL}"
\ No newline at end of file
diff --git a/frontend/LICENSE b/frontend/LICENSE
new file mode 100644
index 000000000..83fb1d42f
--- /dev/null
+++ b/frontend/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Bram Suurd
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/frontend/components.json b/frontend/components.json
new file mode 100644
index 000000000..380285be3
--- /dev/null
+++ b/frontend/components.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "default",
+ "rsc": true,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.ts",
+ "css": "@/styles/globals.css",
+ "baseColor": "slate",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils"
+ }
+}
diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs
new file mode 100644
index 000000000..108da034e
--- /dev/null
+++ b/frontend/next.config.mjs
@@ -0,0 +1,25 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ webpack: (config) => {
+ config.resolve.alias.canvas = false;
+
+ return config;
+ },
+ images: {
+ remotePatterns: [
+ {
+ protocol: "https",
+ hostname: "**",
+ },
+ ],
+ },
+
+ env: {
+ BASE_PATH: "ProxmoxVE",
+ },
+
+ output: "export",
+ basePath: `/ProxmoxVE`,
+};
+
+export default nextConfig;
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
new file mode 100644
index 000000000..40e82fae3
--- /dev/null
+++ b/frontend/package-lock.json
@@ -0,0 +1,10090 @@
+{
+ "name": "proxmox-helper-scripts-website",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "proxmox-helper-scripts-website",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-accordion": "^1.1.2",
+ "@radix-ui/react-dialog": "^1.0.5",
+ "@radix-ui/react-dropdown-menu": "^2.0.6",
+ "@radix-ui/react-icons": "^1.3.1",
+ "@radix-ui/react-label": "^2.1.0",
+ "@radix-ui/react-navigation-menu": "^1.1.4",
+ "@radix-ui/react-popover": "^1.1.2",
+ "@radix-ui/react-select": "^2.1.2",
+ "@radix-ui/react-separator": "^1.1.0",
+ "@radix-ui/react-slot": "^1.1.0",
+ "@radix-ui/react-switch": "^1.1.1",
+ "@radix-ui/react-tabs": "^1.1.0",
+ "@radix-ui/react-tooltip": "^1.1.2",
+ "@vercel/analytics": "^1.2.2",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.1.1",
+ "cmdk": "^1.0.0",
+ "date-fns": "^4.1.0",
+ "framer-motion": "^11.11.11",
+ "fuse.js": "^7.0.0",
+ "lucide-react": "^0.453.0",
+ "mini-svg-data-uri": "^1.4.4",
+ "next": "15.1.3",
+ "next-themes": "^0.3.0",
+ "nuqs": "^2.1.1",
+ "pocketbase": "^0.21.4",
+ "prettier-plugin-organize-imports": "^4.1.0",
+ "react": "19.0.0-rc-02c0e824-20241028",
+ "react-code-blocks": "^0.1.6",
+ "react-day-picker": "8.10.1",
+ "react-dom": "19.0.0-rc-02c0e824-20241028",
+ "react-icons": "^5.1.0",
+ "react-simple-typewriter": "^5.0.1",
+ "sharp": "^0.33.5",
+ "simple-icons": "^13.5.0",
+ "sonner": "^1.5.0",
+ "tailwind-merge": "^2.3.0",
+ "zod": "^3.23.8"
+ },
+ "devDependencies": {
+ "@testing-library/dom": "^10.4.0",
+ "@testing-library/react": "^16.0.1",
+ "@types/node": "^22",
+ "@types/react": "npm:types-react@19.0.0-rc.1",
+ "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
+ "@typescript-eslint/eslint-plugin": "^8.8.1",
+ "@typescript-eslint/parser": "^8.8.1",
+ "@vitejs/plugin-react": "^4.3.4",
+ "eslint": "^9.13.0",
+ "eslint-config-next": "15.0.2",
+ "jsdom": "^25.0.1",
+ "postcss": "^8",
+ "prettier": "^3.2.5",
+ "prettier-plugin-tailwindcss": "^0.6.5",
+ "tailwindcss": "^3.4.9",
+ "tailwindcss-animate": "^1.0.7",
+ "tailwindcss-animated": "^1.1.2",
+ "typescript": "^5",
+ "vite-tsconfig-paths": "^5.1.3",
+ "vitest": "^2.1.6"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
+ "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
+ "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.0",
+ "@babel/generator": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.0",
+ "@babel/parser": "^7.26.0",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.26.0",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
+ "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.26.2",
+ "@babel/types": "^7.26.0",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
+ "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+ "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
+ "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
+ "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.26.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
+ "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
+ "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
+ "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
+ "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/generator": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.25.9",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
+ "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz",
+ "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
+ "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
+ "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+ "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+ "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+ "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+ "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+ "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+ "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+ "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+ "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+ "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+ "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+ "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+ "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+ "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+ "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+ "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+ "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+ "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+ "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+ "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+ "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+ "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+ "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
+ "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.4",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
+ "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+ "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz",
+ "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
+ "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz",
+ "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz",
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.12",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz",
+ "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
+ "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
+ "license": "MIT"
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
+ "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz",
+ "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz",
+ "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz",
+ "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz",
+ "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz",
+ "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
+ "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
+ "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz",
+ "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz",
+ "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz",
+ "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.0.5"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz",
+ "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
+ "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
+ "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz",
+ "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz",
+ "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.0.4"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz",
+ "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.2.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
+ "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz",
+ "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.3.tgz",
+ "integrity": "sha512-Q1tXwQCGWyA3ehMph3VO+E6xFPHDKdHFYosadt0F78EObYxPio0S09H9UGYznDe6Wc8eLKLG89GqcFJJDiK5xw=="
+ },
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "15.0.2",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.0.2.tgz",
+ "integrity": "sha512-R9Jc7T6Ge0txjmqpPwqD8vx6onQjynO9JT73ArCYiYPvSrwYXepH/UY/WdKDY8JPWJl72sAE4iGMHPeQ5xdEWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-glob": "3.3.1"
+ }
+ },
+ "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/@next/eslint-plugin-next/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.3.tgz",
+ "integrity": "sha512-aZtmIh8jU89DZahXQt1La0f2EMPt/i7W+rG1sLtYJERsP7GRnNFghsciFpQcKHcGh4dUiyTB5C1X3Dde/Gw8gg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.3.tgz",
+ "integrity": "sha512-aw8901rjkVBK5mbq5oV32IqkJg+CQa6aULNlN8zyCWSsePzEG3kpDkAFkkTOh3eJ0p95KbkLyWBzslQKamXsLA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.3.tgz",
+ "integrity": "sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.3.tgz",
+ "integrity": "sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.3.tgz",
+ "integrity": "sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.3.tgz",
+ "integrity": "sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.3.tgz",
+ "integrity": "sha512-6RxKjvnvVMM89giYGI1qye9ODsBQpHSHVo8vqA8xGhmRPZHDQUE4jcDbhBwK0GnFMqBnu+XMg3nYukNkmLOLWw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.3.tgz",
+ "integrity": "sha512-VId/f5blObG7IodwC5Grf+aYP0O8Saz1/aeU3YcWqNdIUAmFQY3VEPKPaIzfv32F/clvanOb2K2BR5DtDs6XyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nolyfill/is-core-module": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+ "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.4.0"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@radix-ui/number": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz",
+ "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz",
+ "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-accordion": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.1.tgz",
+ "integrity": "sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collapsible": "1.1.1",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-arrow": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz",
+ "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collapsible": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz",
+ "integrity": "sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz",
+ "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-context": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz",
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz",
+ "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz",
+ "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.6.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-direction": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
+ "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz",
+ "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-escape-keydown": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dropdown-menu": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz",
+ "integrity": "sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-menu": "2.1.2",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
+ "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz",
+ "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-icons": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.1.tgz",
+ "integrity": "sha512-QvYompk0X+8Yjlo/Fv4McrzxohDdM5GgLHyQcPpcsPvlOSXCGFjdbuyGL5dzRbg0GpknAjQJJZzdiRK7iWVuFQ==",
+ "peerDependencies": {
+ "react": "^16.x || ^17.x || ^18.x || ^19.x"
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz",
+ "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-label": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz",
+ "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-menu": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.2.tgz",
+ "integrity": "sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-popper": "1.2.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-roving-focus": "1.1.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.6.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-navigation-menu": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.1.tgz",
+ "integrity": "sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-use-previous": "1.1.0",
+ "@radix-ui/react-visually-hidden": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popover": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.2.tgz",
+ "integrity": "sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-popper": "1.2.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.6.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popper": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz",
+ "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-use-rect": "1.1.0",
+ "@radix-ui/react-use-size": "1.1.0",
+ "@radix-ui/rect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-context": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz",
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz",
+ "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz",
+ "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz",
+ "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz",
+ "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.0",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-context": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz",
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-select": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.2.tgz",
+ "integrity": "sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/number": "1.1.0",
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-popper": "1.2.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-use-previous": "1.1.0",
+ "@radix-ui/react-visually-hidden": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.6.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz",
+ "integrity": "sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz",
+ "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-switch": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.1.tgz",
+ "integrity": "sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-previous": "1.1.0",
+ "@radix-ui/react-use-size": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tabs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.1.tgz",
+ "integrity": "sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-roving-focus": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-tooltip": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.3.tgz",
+ "integrity": "sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-popper": "1.2.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-visually-hidden": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
+ "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
+ "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-previous": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz",
+ "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-rect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz",
+ "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/rect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-size": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz",
+ "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-visually-hidden": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz",
+ "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/rect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz",
+ "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==",
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz",
+ "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz",
+ "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz",
+ "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz",
+ "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz",
+ "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz",
+ "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz",
+ "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz",
+ "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz",
+ "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz",
+ "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz",
+ "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz",
+ "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz",
+ "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz",
+ "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz",
+ "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz",
+ "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz",
+ "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz",
+ "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz",
+ "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@testing-library/dom": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
+ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.3.0",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@testing-library/dom/node_modules/aria-query": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/@testing-library/react": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz",
+ "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": "^10.0.0",
+ "@types/react": "^18.0.0",
+ "@types/react-dom": "^18.0.0",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@types/aria-query": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz",
+ "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.8.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.6.tgz",
+ "integrity": "sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.19.8"
+ }
+ },
+ "node_modules/@types/react": {
+ "name": "types-react",
+ "version": "19.0.0-rc.1",
+ "resolved": "https://registry.npmjs.org/types-react/-/types-react-19.0.0-rc.1.tgz",
+ "integrity": "sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ==",
+ "devOptional": true,
+ "dependencies": {
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "name": "types-react-dom",
+ "version": "19.0.0-rc.1",
+ "resolved": "https://registry.npmjs.org/types-react-dom/-/types-react-dom-19.0.0-rc.1.tgz",
+ "integrity": "sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ==",
+ "devOptional": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/stylis": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
+ "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.12.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz",
+ "integrity": "sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.12.2",
+ "@typescript-eslint/type-utils": "8.12.2",
+ "@typescript-eslint/utils": "8.12.2",
+ "@typescript-eslint/visitor-keys": "8.12.2",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.12.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.12.2.tgz",
+ "integrity": "sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.12.2",
+ "@typescript-eslint/types": "8.12.2",
+ "@typescript-eslint/typescript-estree": "8.12.2",
+ "@typescript-eslint/visitor-keys": "8.12.2",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.12.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.12.2.tgz",
+ "integrity": "sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.12.2",
+ "@typescript-eslint/visitor-keys": "8.12.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.12.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.12.2.tgz",
+ "integrity": "sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.12.2",
+ "@typescript-eslint/utils": "8.12.2",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.12.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.12.2.tgz",
+ "integrity": "sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.12.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.12.2.tgz",
+ "integrity": "sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "8.12.2",
+ "@typescript-eslint/visitor-keys": "8.12.2",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.3.2",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.12.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.12.2.tgz",
+ "integrity": "sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.12.2",
+ "@typescript-eslint/types": "8.12.2",
+ "@typescript-eslint/typescript-estree": "8.12.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.12.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.12.2.tgz",
+ "integrity": "sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.12.2",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@vercel/analytics": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.3.2.tgz",
+ "integrity": "sha512-n/Ws7skBbW+fUBMeg+jrT30+GP00jTHvCcL4fuVrShuML0uveEV/4vVUdvqEVnDgXIGfLm0GXW5EID2mCcRXhg==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "server-only": "^0.0.1"
+ },
+ "peerDependencies": {
+ "next": ">= 13",
+ "react": "^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "next": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
+ "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.26.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.14.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.6.tgz",
+ "integrity": "sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "2.1.6",
+ "@vitest/utils": "2.1.6",
+ "chai": "^5.1.2",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.6.tgz",
+ "integrity": "sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "2.1.6",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.12"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.6.tgz",
+ "integrity": "sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.6.tgz",
+ "integrity": "sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "2.1.6",
+ "pathe": "^1.1.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.6.tgz",
+ "integrity": "sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "2.1.6",
+ "magic-string": "^0.30.12",
+ "pathe": "^1.1.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.6.tgz",
+ "integrity": "sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyspy": "^3.0.2"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.6.tgz",
+ "integrity": "sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "2.1.6",
+ "loupe": "^3.1.2",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
+ "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
+ "is-array-buffer": "^3.0.4",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
+ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
+ "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001669",
+ "electron-to-chromium": "^1.5.41",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/camelize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
+ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001676",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz",
+ "integrity": "sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chai": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
+ "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/class-variance-authority": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz",
+ "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "clsx": "2.0.0"
+ },
+ "funding": {
+ "url": "https://joebell.co.uk"
+ }
+ },
+ "node_modules/class-variance-authority/node_modules/clsx": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
+ "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cmdk": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.3.tgz",
+ "integrity": "sha512-2c3uTjwT4YeHj60q2k8S1B0WHSoGR6t5CPnec6PMFD2QF4gwid0t1VSPNeEmL02EwBwNky/A3gwPCOViKTtoPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-dialog": "^1.1.2",
+ "@radix-ui/react-id": "^1.1.0",
+ "@radix-ui/react-primitive": "^2.0.0",
+ "use-sync-external-store": "^1.2.2"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^18 || ^19 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-color-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
+ "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-to-react-native": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
+ "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "camelize": "^1.0.0",
+ "css-color-keywords": "^1.0.0",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssstyle": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz",
+ "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rrweb-cssom": "^0.7.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/data-urls": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
+ "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
+ "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/kossnocorp"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/deep-eql": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+ "license": "MIT"
+ },
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.65",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.65.tgz",
+ "integrity": "sha512-PWVzBjghx7/wop6n22vS2MLU8tKGd4Q91aCEGhG/TYmW6PP5OcSXcdnxTe1NNt0T66N8D6jxh4kC8UsdzOGaIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.17.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+ "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "data-view-buffer": "^1.0.1",
+ "data-view-byte-length": "^1.0.1",
+ "data-view-byte-offset": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.0.3",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.1",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.3",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.13",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.2",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.9",
+ "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.6",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz",
+ "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.4",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "iterator.prototype": "^1.1.3",
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
+ "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.24.0",
+ "@esbuild/android-arm": "0.24.0",
+ "@esbuild/android-arm64": "0.24.0",
+ "@esbuild/android-x64": "0.24.0",
+ "@esbuild/darwin-arm64": "0.24.0",
+ "@esbuild/darwin-x64": "0.24.0",
+ "@esbuild/freebsd-arm64": "0.24.0",
+ "@esbuild/freebsd-x64": "0.24.0",
+ "@esbuild/linux-arm": "0.24.0",
+ "@esbuild/linux-arm64": "0.24.0",
+ "@esbuild/linux-ia32": "0.24.0",
+ "@esbuild/linux-loong64": "0.24.0",
+ "@esbuild/linux-mips64el": "0.24.0",
+ "@esbuild/linux-ppc64": "0.24.0",
+ "@esbuild/linux-riscv64": "0.24.0",
+ "@esbuild/linux-s390x": "0.24.0",
+ "@esbuild/linux-x64": "0.24.0",
+ "@esbuild/netbsd-x64": "0.24.0",
+ "@esbuild/openbsd-arm64": "0.24.0",
+ "@esbuild/openbsd-x64": "0.24.0",
+ "@esbuild/sunos-x64": "0.24.0",
+ "@esbuild/win32-arm64": "0.24.0",
+ "@esbuild/win32-ia32": "0.24.0",
+ "@esbuild/win32-x64": "0.24.0"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
+ "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.11.0",
+ "@eslint/config-array": "^0.18.0",
+ "@eslint/core": "^0.7.0",
+ "@eslint/eslintrc": "^3.1.0",
+ "@eslint/js": "9.13.0",
+ "@eslint/plugin-kit": "^0.2.0",
+ "@humanfs/node": "^0.16.5",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.3.1",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.1.0",
+ "eslint-visitor-keys": "^4.1.0",
+ "espree": "^10.2.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-next": {
+ "version": "15.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.0.2.tgz",
+ "integrity": "sha512-N8o6cyUXzlMmQbdc2Kc83g1qomFi3ITqrAZfubipVKET2uR2mCStyGRcx/r8WiAIVMul2KfwRiCHBkTpBvGBmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "15.0.2",
+ "@rushstack/eslint-patch": "^1.10.3",
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-jsx-a11y": "^6.10.0",
+ "eslint-plugin-react": "^7.35.0",
+ "eslint-plugin-react-hooks": "^5.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-typescript": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz",
+ "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@nolyfill/is-core-module": "1.0.39",
+ "debug": "^4.3.5",
+ "enhanced-resolve": "^5.15.0",
+ "eslint-module-utils": "^2.8.1",
+ "fast-glob": "^3.3.2",
+ "get-tsconfig": "^4.7.5",
+ "is-bun-module": "^1.0.2",
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.31.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz",
+ "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.1.0",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.0",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.11",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz",
+ "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
+ "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz",
+ "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fault": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
+ "license": "MIT",
+ "dependencies": {
+ "format": "^0.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "11.11.11",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.11.11.tgz",
+ "integrity": "sha512-tuDH23ptJAKUHGydJQII9PhABNJBpB+z0P1bmgKK9QFIssHGlfPd6kxMq00LSKwE27WFsb2z0ovY0bpUyMvfRw==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/fuse.js": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz",
+ "integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-tsconfig": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz",
+ "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-pkg-maps": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+ "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+ "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "comma-separated-tokens": "^1.0.0",
+ "hast-util-parse-selector": "^2.0.0",
+ "property-information": "^5.0.0",
+ "space-separated-tokens": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/highlightjs-vue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz",
+ "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
+ "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-encoding": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bun-module": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz",
+ "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.6.3"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz",
+ "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.6",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
+ "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "25.0.1",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz",
+ "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssstyle": "^4.1.0",
+ "data-urls": "^5.0.0",
+ "decimal.js": "^10.4.3",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^4.0.0",
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.5",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.12",
+ "parse5": "^7.1.2",
+ "rrweb-cssom": "^0.7.1",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^5.0.0",
+ "w3c-xmlserializer": "^5.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^3.1.1",
+ "whatwg-mimetype": "^4.0.0",
+ "whatwg-url": "^14.0.0",
+ "ws": "^8.18.0",
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "canvas": "^2.11.2"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
+ "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lowlight": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
+ "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
+ "license": "MIT",
+ "dependencies": {
+ "fault": "^1.0.0",
+ "highlight.js": "~10.7.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/lucide-react": {
+ "version": "0.453.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.453.0.tgz",
+ "integrity": "sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.14",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz",
+ "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mini-svg-data-uri": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
+ "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
+ "license": "MIT",
+ "bin": {
+ "mini-svg-data-uri": "cli.js"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/next": {
+ "version": "15.1.3",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.1.3.tgz",
+ "integrity": "sha512-5igmb8N8AEhWDYzogcJvtcRDU6n4cMGtBklxKD4biYv4LXN8+awc/bbQ2IM2NQHdVPgJ6XumYXfo3hBtErg1DA==",
+ "dependencies": {
+ "@next/env": "15.1.3",
+ "@swc/counter": "0.1.3",
+ "@swc/helpers": "0.5.15",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "15.1.3",
+ "@next/swc-darwin-x64": "15.1.3",
+ "@next/swc-linux-arm64-gnu": "15.1.3",
+ "@next/swc-linux-arm64-musl": "15.1.3",
+ "@next/swc-linux-x64-gnu": "15.1.3",
+ "@next/swc-linux-x64-musl": "15.1.3",
+ "@next/swc-win32-arm64-msvc": "15.1.3",
+ "@next/swc-win32-x64-msvc": "15.1.3",
+ "sharp": "^0.33.5"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.41.2",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next-themes": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz",
+ "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8 || ^17 || ^18",
+ "react-dom": "^16.8 || ^17 || ^18"
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nuqs": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-2.1.1.tgz",
+ "integrity": "sha512-iM2H8lMmhvk9bxupUs2oRle9usRNEAqppOkTMXOxD/uK85gOKAubU7T2zmPo8fnYQS4n5e/XswTiq+gLYGpy3w==",
+ "license": "MIT",
+ "dependencies": {
+ "mitt": "^3.0.1"
+ },
+ "peerDependencies": {
+ "@remix-run/react": ">= 2",
+ "next": ">= 14.2.0",
+ "react": ">= 18.2.0",
+ "react-router-dom": ">= 6"
+ },
+ "peerDependenciesMeta": {
+ "@remix-run/react": {
+ "optional": true
+ },
+ "next": {
+ "optional": true
+ },
+ "react-router-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.13",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz",
+ "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
+ "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^4.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathval": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
+ "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pocketbase": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.21.5.tgz",
+ "integrity": "sha512-bnI/uinnQps+ElSlzxkc4yvwuSFfKcoszDtXH/4QT2FhGq2mJVUvDlxn+rjRXVntUjPfmMG5LEPZ1eGqV6ssog==",
+ "license": "MIT"
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.49",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+ "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.0.0",
+ "yaml": "^2.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-plugin-organize-imports": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz",
+ "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "prettier": ">=2.0",
+ "typescript": ">=2.9",
+ "vue-tsc": "^2.1.0"
+ },
+ "peerDependenciesMeta": {
+ "vue-tsc": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/prettier-plugin-tailwindcss": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.8.tgz",
+ "integrity": "sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "peerDependencies": {
+ "@ianvs/prettier-plugin-sort-imports": "*",
+ "@prettier/plugin-pug": "*",
+ "@shopify/prettier-plugin-liquid": "*",
+ "@trivago/prettier-plugin-sort-imports": "*",
+ "@zackad/prettier-plugin-twig-melody": "*",
+ "prettier": "^3.0",
+ "prettier-plugin-astro": "*",
+ "prettier-plugin-css-order": "*",
+ "prettier-plugin-import-sort": "*",
+ "prettier-plugin-jsdoc": "*",
+ "prettier-plugin-marko": "*",
+ "prettier-plugin-multiline-arrays": "*",
+ "prettier-plugin-organize-attributes": "*",
+ "prettier-plugin-organize-imports": "*",
+ "prettier-plugin-sort-imports": "*",
+ "prettier-plugin-style-order": "*",
+ "prettier-plugin-svelte": "*"
+ },
+ "peerDependenciesMeta": {
+ "@ianvs/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "@prettier/plugin-pug": {
+ "optional": true
+ },
+ "@shopify/prettier-plugin-liquid": {
+ "optional": true
+ },
+ "@trivago/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "@zackad/prettier-plugin-twig-melody": {
+ "optional": true
+ },
+ "prettier-plugin-astro": {
+ "optional": true
+ },
+ "prettier-plugin-css-order": {
+ "optional": true
+ },
+ "prettier-plugin-import-sort": {
+ "optional": true
+ },
+ "prettier-plugin-jsdoc": {
+ "optional": true
+ },
+ "prettier-plugin-marko": {
+ "optional": true
+ },
+ "prettier-plugin-multiline-arrays": {
+ "optional": true
+ },
+ "prettier-plugin-organize-attributes": {
+ "optional": true
+ },
+ "prettier-plugin-organize-imports": {
+ "optional": true
+ },
+ "prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "prettier-plugin-style-order": {
+ "optional": true
+ },
+ "prettier-plugin-svelte": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/pretty-format/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/prismjs": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
+ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/react": {
+ "version": "19.0.0-rc-02c0e824-20241028",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0-rc-02c0e824-20241028.tgz",
+ "integrity": "sha512-GbZ7hpPHQMiEu53BqEaPQVM/4GG4hARo+mqEEnx4rYporDvNvUjutiAFxYFSbu6sgHwcr7LeFv8htEOwALVA2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-code-blocks": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/react-code-blocks/-/react-code-blocks-0.1.6.tgz",
+ "integrity": "sha512-ENNuxG07yO+OuX1ChRje3ieefPRz6yrIpHmebQlaFQgzcAHbUfVeTINpOpoI9bSRSObeYo/OdHsporeToZ7fcg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.10.4",
+ "react-syntax-highlighter": "^15.5.0",
+ "styled-components": "^6.1.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "react": ">=16"
+ }
+ },
+ "node_modules/react-day-picker": {
+ "version": "8.10.1",
+ "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz",
+ "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==",
+ "license": "MIT",
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/sponsors/gpbl"
+ },
+ "peerDependencies": {
+ "date-fns": "^2.28.0 || ^3.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.0.0-rc-02c0e824-20241028",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0-rc-02c0e824-20241028.tgz",
+ "integrity": "sha512-LrZf3DfHL6Fs07wwlUCHrzFTCMM19yA99MvJpfLokN4I2nBAZvREGZjZAn8VPiSfN72+i9j1eL4wB8gC695F3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "0.25.0-rc-02c0e824-20241028"
+ },
+ "peerDependencies": {
+ "react": "19.0.0-rc-02c0e824-20241028"
+ }
+ },
+ "node_modules/react-icons": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.3.0.tgz",
+ "integrity": "sha512-DnUk8aFbTyQPSkCfF8dbX6kQjXA9DktMeJqfjrg6cK9vwQVMxmcA3BfP4QoiztVmEHtwlTgLFsPuH2NskKT6eg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz",
+ "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.6",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
+ "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-simple-typewriter": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/react-simple-typewriter/-/react-simple-typewriter-5.0.1.tgz",
+ "integrity": "sha512-vA5HkABwJKL/DJ4RshSlY/igdr+FiVY4MLsSQYJX6FZG/f1/VwN4y1i3mPXRyfaswrvI8xii1kOVe1dYtO2Row==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "license": "MIT",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-syntax-highlighter": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
+ "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.3.1",
+ "highlight.js": "^10.4.1",
+ "highlightjs-vue": "^1.0.0",
+ "lowlight": "^1.17.0",
+ "prismjs": "^1.27.0",
+ "refractor": "^3.6.0"
+ },
+ "peerDependencies": {
+ "react": ">= 0.14.0"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+ "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.1",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/refractor": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
+ "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+ "license": "MIT",
+ "dependencies": {
+ "hastscript": "^6.0.0",
+ "parse-entities": "^2.0.0",
+ "prismjs": "~1.27.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/prismjs": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
+ "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "license": "MIT"
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.27.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz",
+ "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.27.4",
+ "@rollup/rollup-android-arm64": "4.27.4",
+ "@rollup/rollup-darwin-arm64": "4.27.4",
+ "@rollup/rollup-darwin-x64": "4.27.4",
+ "@rollup/rollup-freebsd-arm64": "4.27.4",
+ "@rollup/rollup-freebsd-x64": "4.27.4",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.27.4",
+ "@rollup/rollup-linux-arm-musleabihf": "4.27.4",
+ "@rollup/rollup-linux-arm64-gnu": "4.27.4",
+ "@rollup/rollup-linux-arm64-musl": "4.27.4",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4",
+ "@rollup/rollup-linux-riscv64-gnu": "4.27.4",
+ "@rollup/rollup-linux-s390x-gnu": "4.27.4",
+ "@rollup/rollup-linux-x64-gnu": "4.27.4",
+ "@rollup/rollup-linux-x64-musl": "4.27.4",
+ "@rollup/rollup-win32-arm64-msvc": "4.27.4",
+ "@rollup/rollup-win32-ia32-msvc": "4.27.4",
+ "@rollup/rollup-win32-x64-msvc": "4.27.4",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rrweb-cssom": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
+ "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.25.0-rc-02c0e824-20241028",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0-rc-02c0e824-20241028.tgz",
+ "integrity": "sha512-GysnKjmMSaWcwsKTLzeJO0IhU3EyIiC0ivJKE6yDNLqt3IMxDByx8b6lSNXRNdN+ULUY0WLLjSPaZ0LuU/GnTg==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/server-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz",
+ "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==",
+ "license": "MIT"
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
+ "license": "MIT"
+ },
+ "node_modules/sharp": {
+ "version": "0.33.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
+ "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.3",
+ "semver": "^7.6.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.33.5",
+ "@img/sharp-darwin-x64": "0.33.5",
+ "@img/sharp-libvips-darwin-arm64": "1.0.4",
+ "@img/sharp-libvips-darwin-x64": "1.0.4",
+ "@img/sharp-libvips-linux-arm": "1.0.5",
+ "@img/sharp-libvips-linux-arm64": "1.0.4",
+ "@img/sharp-libvips-linux-s390x": "1.0.4",
+ "@img/sharp-libvips-linux-x64": "1.0.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.0.4",
+ "@img/sharp-linux-arm": "0.33.5",
+ "@img/sharp-linux-arm64": "0.33.5",
+ "@img/sharp-linux-s390x": "0.33.5",
+ "@img/sharp-linux-x64": "0.33.5",
+ "@img/sharp-linuxmusl-arm64": "0.33.5",
+ "@img/sharp-linuxmusl-x64": "0.33.5",
+ "@img/sharp-wasm32": "0.33.5",
+ "@img/sharp-win32-ia32": "0.33.5",
+ "@img/sharp-win32-x64": "0.33.5"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-icons": {
+ "version": "13.15.0",
+ "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-13.15.0.tgz",
+ "integrity": "sha512-8SzFj9CvPlDnjDLISsAWTvpCs7om2zbSJZ1hNLRo6quWKLqFwjCD9opS24Q/yD0bdsnVHPpF0N3hitpHrY5u9w==",
+ "license": "CC0-1.0",
+ "engines": {
+ "node": ">=0.12.18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/simple-icons"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/sonner": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz",
+ "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/std-env": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
+ "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+ "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "regexp.prototype.flags": "^1.5.2",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/styled-components": {
+ "version": "6.1.13",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz",
+ "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/is-prop-valid": "1.2.2",
+ "@emotion/unitless": "0.8.1",
+ "@types/stylis": "4.2.5",
+ "css-to-react-native": "3.2.0",
+ "csstype": "3.1.3",
+ "postcss": "8.4.38",
+ "shallowequal": "1.1.0",
+ "stylis": "4.3.2",
+ "tslib": "2.6.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/styled-components"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0",
+ "react-dom": ">= 16.8.0"
+ }
+ },
+ "node_modules/styled-components/node_modules/postcss": {
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/styled-components/node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "license": "0BSD"
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
+ "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==",
+ "license": "MIT"
+ },
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tailwind-merge": {
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz",
+ "integrity": "sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.14",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz",
+ "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.0",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.0",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss-animate": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
+ "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || insiders"
+ }
+ },
+ "node_modules/tailwindcss-animated": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss-animated/-/tailwindcss-animated-1.1.2.tgz",
+ "integrity": "sha512-SI4owS5ojserhgEYIZA/uFVdNjU2GMB2P3sjtjmFA52VxoUi+Hht6oR5+RdT+CxrX9cNNYEa+vbTWHvN9zbj3w==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "tailwindcss": ">=3.1.0"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz",
+ "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinypool": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
+ "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
+ "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
+ "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tldts": {
+ "version": "6.1.64",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.64.tgz",
+ "integrity": "sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^6.1.64"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "6.1.64",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.64.tgz",
+ "integrity": "sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz",
+ "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tldts": "^6.1.32"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
+ "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz",
+ "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/tsconfck": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.4.tgz",
+ "integrity": "sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "tsconfck": "bin/tsconfck.js"
+ },
+ "engines": {
+ "node": "^18 || >=20"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz",
+ "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz",
+ "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vite": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.1.tgz",
+ "integrity": "sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.24.0",
+ "postcss": "^8.4.49",
+ "rollup": "^4.23.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.6.tgz",
+ "integrity": "sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.3.7",
+ "es-module-lexer": "^1.5.4",
+ "pathe": "^1.1.2",
+ "vite": "^5.0.0 || ^6.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/vite-tsconfig-paths": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.3.tgz",
+ "integrity": "sha512-0bz+PDlLpGfP2CigeSKL9NFTF1KtXkeHGZSSaGQSuPZH77GhoiQaA8IjYgOaynSuwlDTolSUEU0ErVvju3NURg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "globrex": "^0.1.2",
+ "tsconfck": "^3.0.3"
+ },
+ "peerDependencies": {
+ "vite": "*"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.6.tgz",
+ "integrity": "sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "2.1.6",
+ "@vitest/mocker": "2.1.6",
+ "@vitest/pretty-format": "^2.1.6",
+ "@vitest/runner": "2.1.6",
+ "@vitest/snapshot": "2.1.6",
+ "@vitest/spy": "2.1.6",
+ "@vitest/utils": "2.1.6",
+ "chai": "^5.1.2",
+ "debug": "^4.3.7",
+ "expect-type": "^1.1.0",
+ "magic-string": "^0.30.12",
+ "pathe": "^1.1.2",
+ "std-env": "^3.8.0",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^0.3.1",
+ "tinypool": "^1.0.1",
+ "tinyrainbow": "^1.2.0",
+ "vite": "^5.0.0 || ^6.0.0",
+ "vite-node": "2.1.6",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "@vitest/browser": "2.1.6",
+ "@vitest/ui": "2.1.6",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
+ "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xml-name-validator": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz",
+ "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^5.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz",
+ "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.0.5",
+ "is-finalizationregistry": "^1.0.2",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.1.4",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
+ "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
+ "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.23.8",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 000000000..2309f43c5
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,88 @@
+{
+ "name": "proxmox-helper-scripts-website",
+ "version": "1.0.0",
+ "license": "MIT",
+ "private": true,
+ "author": {
+ "name": "Bram Suurd",
+ "url": "https://github.com/community-scripts"
+ },
+ "type": "module",
+ "scripts": {
+ "dev": "next dev --turbopack",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "test": "vitest",
+ "deploy": "next build && touch out/.nojekyll && git add out/ && git commit -m \"Deploy\" && git subtree push --prefix out origin gh-pages",
+ "format:write": "prettier --write \"**/*.{ts,tsx,mdx}\" --cache",
+ "format:check": "prettier --check \"**/*.{ts,tsx,mdx}\" --cache",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@radix-ui/react-accordion": "^1.1.2",
+ "@radix-ui/react-dialog": "^1.0.5",
+ "@radix-ui/react-dropdown-menu": "^2.0.6",
+ "@radix-ui/react-icons": "^1.3.1",
+ "@radix-ui/react-label": "^2.1.0",
+ "@radix-ui/react-navigation-menu": "^1.1.4",
+ "@radix-ui/react-popover": "^1.1.2",
+ "@radix-ui/react-select": "^2.1.2",
+ "@radix-ui/react-separator": "^1.1.0",
+ "@radix-ui/react-slot": "^1.1.0",
+ "@radix-ui/react-switch": "^1.1.1",
+ "@radix-ui/react-tabs": "^1.1.0",
+ "@radix-ui/react-tooltip": "^1.1.2",
+ "@vercel/analytics": "^1.2.2",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.1.1",
+ "cmdk": "^1.0.0",
+ "date-fns": "^4.1.0",
+ "framer-motion": "^11.11.11",
+ "fuse.js": "^7.0.0",
+ "lucide-react": "^0.453.0",
+ "mini-svg-data-uri": "^1.4.4",
+ "next": "15.1.3",
+ "next-themes": "^0.3.0",
+ "nuqs": "^2.1.1",
+ "pocketbase": "^0.21.4",
+ "prettier-plugin-organize-imports": "^4.1.0",
+ "react": "19.0.0-rc-02c0e824-20241028",
+ "react-code-blocks": "^0.1.6",
+ "react-day-picker": "8.10.1",
+ "react-dom": "19.0.0-rc-02c0e824-20241028",
+ "react-icons": "^5.1.0",
+ "react-simple-typewriter": "^5.0.1",
+ "sharp": "^0.33.5",
+ "simple-icons": "^13.5.0",
+ "sonner": "^1.5.0",
+ "tailwind-merge": "^2.3.0",
+ "zod": "^3.23.8"
+ },
+ "devDependencies": {
+ "@testing-library/dom": "^10.4.0",
+ "@testing-library/react": "^16.0.1",
+ "@types/node": "^22",
+ "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
+ "@types/react": "npm:types-react@19.0.0-rc.1",
+ "@typescript-eslint/eslint-plugin": "^8.8.1",
+ "@typescript-eslint/parser": "^8.8.1",
+ "@vitejs/plugin-react": "^4.3.4",
+ "eslint-config-next": "15.0.2",
+ "eslint": "^9.13.0",
+ "jsdom": "^25.0.1",
+ "postcss": "^8",
+ "prettier-plugin-tailwindcss": "^0.6.5",
+ "prettier": "^3.2.5",
+ "tailwindcss-animate": "^1.0.7",
+ "tailwindcss-animated": "^1.1.2",
+ "tailwindcss": "^3.4.9",
+ "typescript": "^5",
+ "vite-tsconfig-paths": "^5.1.3",
+ "vitest": "^2.1.6"
+ },
+ "overrides": {
+ "@types/react": "npm:types-react@19.0.0-rc.1",
+ "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1"
+ }
+}
diff --git a/frontend/postcss.config.mjs b/frontend/postcss.config.mjs
new file mode 100644
index 000000000..1a69fd2a4
--- /dev/null
+++ b/frontend/postcss.config.mjs
@@ -0,0 +1,8 @@
+/** @type {import('postcss-load-config').Config} */
+const config = {
+ plugins: {
+ tailwindcss: {},
+ },
+};
+
+export default config;
diff --git a/frontend/public/defaultimg.png b/frontend/public/defaultimg.png
new file mode 100644
index 000000000..4aac77d5c
Binary files /dev/null and b/frontend/public/defaultimg.png differ
diff --git a/frontend/public/json b/frontend/public/json
new file mode 120000
index 000000000..cd8045684
--- /dev/null
+++ b/frontend/public/json
@@ -0,0 +1 @@
+../../json
\ No newline at end of file
diff --git a/frontend/public/logo.png b/frontend/public/logo.png
new file mode 100644
index 000000000..1d2186daa
Binary files /dev/null and b/frontend/public/logo.png differ
diff --git a/frontend/src/__tests__/app/page.test.tsx b/frontend/src/__tests__/app/page.test.tsx
new file mode 100644
index 000000000..4b1dc40eb
--- /dev/null
+++ b/frontend/src/__tests__/app/page.test.tsx
@@ -0,0 +1,11 @@
+import { screen } from "@testing-library/dom";
+import { render } from "@testing-library/react";
+import { describe, expect, it } from "vitest";
+import Page from "@/app/page";
+
+describe("Page", () => {
+ it("should show button to view scripts", () => {
+ render( );
+ expect(screen.getByRole("button", { name: "View Scripts" })).toBeDefined();
+ });
+});
diff --git a/frontend/src/__tests__/public/validate-json.test.ts b/frontend/src/__tests__/public/validate-json.test.ts
new file mode 100644
index 000000000..562ebe9c1
--- /dev/null
+++ b/frontend/src/__tests__/public/validate-json.test.ts
@@ -0,0 +1,53 @@
+import { describe, it, assert, beforeAll } from "vitest";
+import { promises as fs } from "fs";
+import path from "path";
+import { ScriptSchema, type Script } from "@/app/json-editor/_schemas/schemas";
+import { Metadata } from "@/lib/types";
+
+const jsonDir = "public/json";
+const metadataFileName = "metadata.json";
+const encoding = "utf-8";
+
+const fileNames = (await fs.readdir(jsonDir))
+ .filter((fileName) => fileName !== metadataFileName)
+
+describe.each(fileNames)("%s", async (fileName) => {
+ let script: Script;
+
+ beforeAll(async () => {
+ const filePath = path.resolve(jsonDir, fileName);
+ const fileContent = await fs.readFile(filePath, encoding)
+ script = JSON.parse(fileContent);
+ })
+
+ it("should have valid json according to script schema", () => {
+ ScriptSchema.parse(script);
+ });
+
+ it("should have a corresponding script file", () => {
+ script.install_methods.forEach((method) => {
+ const scriptPath = path.resolve("..", method.script)
+ assert(fs.stat(scriptPath), `Script file not found: ${scriptPath}`)
+ })
+ });
+})
+
+describe(`${metadataFileName}`, async () => {
+ let metadata: Metadata;
+
+ beforeAll(async () => {
+ const filePath = path.resolve(jsonDir, metadataFileName);
+ const fileContent = await fs.readFile(filePath, encoding)
+ metadata = JSON.parse(fileContent);
+ })
+
+ it("should have valid json according to metadata schema", () => {
+ // TODO: create zod schema for metadata. Move zod schemas to /lib/types.ts
+ assert(metadata.categories.length > 0);
+ metadata.categories.forEach((category) => {
+ assert.isString(category.name)
+ assert.isNumber(category.id)
+ assert.isNumber(category.sort_order)
+ });
+ });
+})
diff --git a/frontend/src/__tests__/setupTests.ts b/frontend/src/__tests__/setupTests.ts
new file mode 100644
index 000000000..063af62eb
--- /dev/null
+++ b/frontend/src/__tests__/setupTests.ts
@@ -0,0 +1,4 @@
+import { vi } from "vitest";
+
+// Mock canvas getContext
+HTMLCanvasElement.prototype.getContext = vi.fn();
\ No newline at end of file
diff --git a/frontend/src/app/api/categories/route.ts b/frontend/src/app/api/categories/route.ts
new file mode 100644
index 000000000..2d33a3ab0
--- /dev/null
+++ b/frontend/src/app/api/categories/route.ts
@@ -0,0 +1,56 @@
+import { Metadata, Script } from "@/lib/types";
+import { promises as fs } from "fs";
+import { NextResponse } from "next/server";
+import path from "path";
+
+export const dynamic = "force-static";
+
+const jsonDir = "public/json";
+const metadataFileName = "metadata.json";
+const encoding = "utf-8";
+
+const getMetadata = async () => {
+ const filePath = path.resolve(jsonDir, metadataFileName);
+ const fileContent = await fs.readFile(filePath, encoding);
+ const metadata: Metadata = JSON.parse(fileContent);
+ return metadata;
+};
+
+const getScripts = async () => {
+ const filePaths = (await fs.readdir(jsonDir))
+ .filter((fileName) => fileName !== metadataFileName)
+ .map((fileName) => path.resolve(jsonDir, fileName));
+
+ const scripts = await Promise.all(
+ filePaths.map(async (filePath) => {
+ const fileContent = await fs.readFile(filePath, encoding);
+ const script: Script = JSON.parse(fileContent);
+ return script;
+ }),
+ );
+ return scripts;
+};
+
+export async function GET() {
+ try {
+ const metadata = await getMetadata();
+ const scripts = await getScripts();
+
+ const categories = metadata.categories
+ .map((category) => {
+ category.scripts = scripts.filter((script) =>
+ script.categories.includes(category.id),
+ );
+ return category;
+ })
+ .sort((a, b) => a.sort_order - b.sort_order);
+
+ return NextResponse.json(categories);
+ } catch (error) {
+ console.error(error as Error);
+ return NextResponse.json(
+ { error: "Failed to fetch categories" },
+ { status: 500 },
+ );
+ }
+}
diff --git a/frontend/src/app/favicon.ico b/frontend/src/app/favicon.ico
new file mode 100644
index 000000000..2ef326ee6
Binary files /dev/null and b/frontend/src/app/favicon.ico differ
diff --git a/frontend/src/app/json-editor/_components/Categories.tsx b/frontend/src/app/json-editor/_components/Categories.tsx
new file mode 100644
index 000000000..d6b990694
--- /dev/null
+++ b/frontend/src/app/json-editor/_components/Categories.tsx
@@ -0,0 +1,117 @@
+import { Label } from "@/components/ui/label";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Category } from "@/lib/types";
+import { cn } from "@/lib/utils";
+import { z } from "zod";
+import { type Script } from "../_schemas/schemas";
+import { memo } from "react";
+
+type CategoryProps = {
+ script: Script;
+ setScript: (script: Script) => void;
+ setIsValid: (isValid: boolean) => void;
+ setZodErrors: (zodErrors: z.ZodError | null) => void;
+ categories: Category[];
+};
+
+const CategoryTag = memo(({
+ category,
+ onRemove
+}: {
+ category: Category;
+ onRemove: () => void;
+}) => (
+
+ {category.name}
+
+ Remove
+
+
+
+
+
+));
+
+CategoryTag.displayName = 'CategoryTag';
+
+function Categories({
+ script,
+ setScript,
+ categories,
+}: Omit) {
+ const addCategory = (categoryId: number) => {
+ setScript({
+ ...script,
+ categories: [...new Set([...script.categories, categoryId])],
+ });
+ };
+
+ const removeCategory = (categoryId: number) => {
+ setScript({
+ ...script,
+ categories: script.categories.filter((id: number) => id !== categoryId),
+ });
+ };
+
+ const categoryMap = new Map(categories.map(c => [c.id, c]));
+
+ return (
+
+
+ Category *
+
+
addCategory(Number(value))}>
+
+
+
+
+ {categories.map((category) => (
+
+ {category.name}
+
+ ))}
+
+
+
+ {script.categories.map((categoryId) => {
+ const category = categoryMap.get(categoryId);
+ return category ? (
+ removeCategory(categoryId)}
+ />
+ ) : null;
+ })}
+
+
+ );
+}
+
+export default memo(Categories);
diff --git a/frontend/src/app/json-editor/_components/InstallMethod.tsx b/frontend/src/app/json-editor/_components/InstallMethod.tsx
new file mode 100644
index 000000000..792ec403a
--- /dev/null
+++ b/frontend/src/app/json-editor/_components/InstallMethod.tsx
@@ -0,0 +1,240 @@
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { OperatingSystems } from "@/config/siteConfig";
+import { PlusCircle, Trash2 } from "lucide-react";
+import { memo, useCallback, useRef } from "react";
+import { z } from "zod";
+import { InstallMethodSchema, ScriptSchema, type Script } from "../_schemas/schemas";
+
+type InstallMethodProps = {
+ script: Script;
+ setScript: (value: Script | ((prevState: Script) => Script)) => void;
+ setIsValid: (isValid: boolean) => void;
+ setZodErrors: (zodErrors: z.ZodError | null) => void;
+};
+
+function InstallMethod({
+ script,
+ setScript,
+ setIsValid,
+ setZodErrors,
+}: InstallMethodProps) {
+ const cpuRefs = useRef<(HTMLInputElement | null)[]>([]);
+ const ramRefs = useRef<(HTMLInputElement | null)[]>([]);
+ const hddRefs = useRef<(HTMLInputElement | null)[]>([]);
+
+ const addInstallMethod = useCallback(() => {
+ setScript((prev) => {
+ const method = InstallMethodSchema.parse({
+ type: "default",
+ script: `${prev.type}/${prev.slug}.sh`,
+ resources: {
+ cpu: null,
+ ram: null,
+ hdd: null,
+ os: null,
+ version: null,
+ },
+ });
+ return {
+ ...prev,
+ install_methods: [...prev.install_methods, method],
+ };
+ });
+ }, [setScript]);
+
+ const updateInstallMethod = useCallback(
+ (
+ index: number,
+ key: keyof Script["install_methods"][number],
+ value: Script["install_methods"][number][keyof Script["install_methods"][number]],
+ ) => {
+ setScript((prev) => {
+ const updatedMethods = prev.install_methods.map((method, i) => {
+ if (i === index) {
+ const updatedMethod = { ...method, [key]: value };
+
+ if (key === "type") {
+ updatedMethod.script =
+ value === "alpine"
+ ? `/${prev.type}/alpine-${prev.slug}.sh`
+ : `/${prev.type}/${prev.slug}.sh`;
+
+ // Set OS to Alpine and reset version if type is alpine
+ if (value === "alpine") {
+ updatedMethod.resources.os = "Alpine";
+ updatedMethod.resources.version = null;
+ }
+ }
+
+ return updatedMethod;
+ }
+ return method;
+ });
+
+ const updated = {
+ ...prev,
+ install_methods: updatedMethods,
+ };
+
+ const result = ScriptSchema.safeParse(updated);
+ setIsValid(result.success);
+ if (!result.success) {
+ setZodErrors(result.error);
+ } else {
+ setZodErrors(null);
+ }
+ return updated;
+ });
+ },
+ [setScript, setIsValid, setZodErrors],
+ );
+
+ const removeInstallMethod = useCallback(
+ (index: number) => {
+ setScript((prev) => ({
+ ...prev,
+ install_methods: prev.install_methods.filter((_, i) => i !== index),
+ }));
+ },
+ [setScript],
+ );
+
+ return (
+ <>
+ Install Methods
+ {script.install_methods.map((method, index) => (
+
+
updateInstallMethod(index, "type", value)}
+ >
+
+
+
+
+ Default
+ Alpine
+
+
+
+ {
+ cpuRefs.current[index] = el;
+ }}
+ placeholder="CPU in Cores"
+ type="number"
+ value={method.resources.cpu || ""}
+ onChange={(e) =>
+ updateInstallMethod(index, "resources", {
+ ...method.resources,
+ cpu: e.target.value ? Number(e.target.value) : null,
+ })
+ }
+ />
+ {
+ ramRefs.current[index] = el;
+ }}
+ placeholder="RAM in MB"
+ type="number"
+ value={method.resources.ram || ""}
+ onChange={(e) =>
+ updateInstallMethod(index, "resources", {
+ ...method.resources,
+ ram: e.target.value ? Number(e.target.value) : null,
+ })
+ }
+ />
+ {
+ hddRefs.current[index] = el;
+ }}
+ placeholder="HDD in GB"
+ type="number"
+ value={method.resources.hdd || ""}
+ onChange={(e) =>
+ updateInstallMethod(index, "resources", {
+ ...method.resources,
+ hdd: e.target.value ? Number(e.target.value) : null,
+ })
+ }
+ />
+
+
+
+ updateInstallMethod(index, "resources", {
+ ...method.resources,
+ os: value || null,
+ version: null, // Reset version when OS changes
+ })
+ }
+ disabled={method.type === "alpine"}
+ >
+
+
+
+
+ {OperatingSystems.map((os) => (
+
+ {os.name}
+
+ ))}
+
+
+
+ updateInstallMethod(index, "resources", {
+ ...method.resources,
+ version: value || null,
+ })
+ }
+ disabled={method.type === "alpine"}
+ >
+
+
+
+
+ {OperatingSystems.find(
+ (os) => os.name === method.resources.os,
+ )?.versions.map((version) => (
+
+ {version.name}
+
+ ))}
+
+
+
+
removeInstallMethod(index)}
+ >
+ Remove Install Method
+
+
+ ))}
+ = 2}
+ onClick={addInstallMethod}
+ >
+ Add Install Method
+
+ >
+ );
+}
+
+export default memo(InstallMethod);
diff --git a/frontend/src/app/json-editor/_components/Note.tsx b/frontend/src/app/json-editor/_components/Note.tsx
new file mode 100644
index 000000000..3242b5141
--- /dev/null
+++ b/frontend/src/app/json-editor/_components/Note.tsx
@@ -0,0 +1,130 @@
+import { Button } from "@/components/ui/button";
+import { Input } from "@/components/ui/input";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { AlertColors } from "@/config/siteConfig";
+import { cn } from "@/lib/utils";
+import { PlusCircle, Trash2 } from "lucide-react";
+import { z } from "zod";
+import { ScriptSchema, type Script } from "../_schemas/schemas";
+import { memo, useCallback, useRef } from "react";
+
+type NoteProps = {
+ script: Script;
+ setScript: (script: Script) => void;
+ setIsValid: (isValid: boolean) => void;
+ setZodErrors: (zodErrors: z.ZodError | null) => void;
+};
+
+function Note({
+ script,
+ setScript,
+ setIsValid,
+ setZodErrors,
+}: NoteProps) {
+ const inputRefs = useRef<(HTMLInputElement | null)[]>([]);
+
+ const addNote = useCallback(() => {
+ setScript({
+ ...script,
+ notes: [...script.notes, { text: "", type: "" }],
+ });
+ }, [script, setScript]);
+
+ const updateNote = useCallback((
+ index: number,
+ key: keyof Script["notes"][number],
+ value: string,
+ ) => {
+ const updated: Script = {
+ ...script,
+ notes: script.notes.map((note, i) =>
+ i === index ? { ...note, [key]: value } : note,
+ ),
+ };
+ const result = ScriptSchema.safeParse(updated);
+ setIsValid(result.success);
+ setZodErrors(result.success ? null : result.error);
+ setScript(updated);
+ // Restore focus after state update
+ if (key === "text") {
+ setTimeout(() => {
+ inputRefs.current[index]?.focus();
+ }, 0);
+ }
+ }, [script, setScript, setIsValid, setZodErrors]);
+
+ const removeNote = useCallback((index: number) => {
+ setScript({
+ ...script,
+ notes: script.notes.filter((_, i) => i !== index),
+ });
+ }, [script, setScript]);
+
+ const NoteItem = memo(
+ ({ note, index }: { note: Script["notes"][number]; index: number }) => (
+
+
updateNote(index, "text", e.target.value)}
+ ref={(el) => {
+ inputRefs.current[index] = el;
+ }}
+ />
+
updateNote(index, "type", value)}
+ >
+
+
+
+
+ {Object.keys(AlertColors).map((type) => (
+
+
+ {type.charAt(0).toUpperCase() + type.slice(1)}{" "}
+
+
+
+ ))}
+
+
+
removeNote(index)}
+ >
+ Remove Note
+
+
+ ),
+ );
+
+ NoteItem.displayName = 'NoteItem';
+
+ return (
+ <>
+ Notes
+ {script.notes.map((note, index) => (
+
+ ))}
+
+ Add Note
+
+ >
+ );
+}
+
+export default memo(Note);
diff --git a/frontend/src/app/json-editor/_schemas/schemas.ts b/frontend/src/app/json-editor/_schemas/schemas.ts
new file mode 100644
index 000000000..ad9d16bae
--- /dev/null
+++ b/frontend/src/app/json-editor/_schemas/schemas.ts
@@ -0,0 +1,45 @@
+import { z } from "zod";
+
+export const InstallMethodSchema = z.object({
+ type: z.enum(["default", "alpine"], {
+ errorMap: () => ({ message: "Type must be either 'default' or 'alpine'" })
+ }),
+ script: z.string().min(1, "Script content cannot be empty"),
+ resources: z.object({
+ cpu: z.number().nullable(),
+ ram: z.number().nullable(),
+ hdd: z.number().nullable(),
+ os: z.string().nullable(),
+ version: z.string().nullable(),
+ }),
+});
+
+const NoteSchema = z.object({
+ text: z.string().min(1, "Note text cannot be empty"),
+ type: z.string().min(1, "Note type cannot be empty"),
+});
+
+export const ScriptSchema = z.object({
+ name: z.string().min(1, "Name is required"),
+ slug: z.string().min(1, "Slug is required"),
+ categories: z.array(z.number()),
+ date_created: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in YYYY-MM-DD format").min(1, "Date is required"),
+ type: z.enum(["vm", "ct", "misc", "turnkey"], {
+ errorMap: () => ({ message: "Type must be either 'vm', 'ct', 'misc' or 'turnkey'" })
+ }),
+ updateable: z.boolean(),
+ privileged: z.boolean(),
+ interface_port: z.number().nullable(),
+ documentation: z.string().nullable(),
+ website: z.string().url().nullable(),
+ logo: z.string().url().nullable(),
+ description: z.string().min(1, "Description is required"),
+ install_methods: z.array(InstallMethodSchema).min(1, "At least one install method is required"),
+ default_credentials: z.object({
+ username: z.string().nullable(),
+ password: z.string().nullable(),
+ }),
+ notes: z.array(NoteSchema),
+});
+
+export type Script = z.infer;
diff --git a/frontend/src/app/json-editor/page.tsx b/frontend/src/app/json-editor/page.tsx
new file mode 100644
index 000000000..4986378ef
--- /dev/null
+++ b/frontend/src/app/json-editor/page.tsx
@@ -0,0 +1,335 @@
+"use client";
+
+import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
+import { Button } from "@/components/ui/button";
+import { Calendar } from "@/components/ui/calendar";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/components/ui/popover";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { Switch } from "@/components/ui/switch";
+import { Textarea } from "@/components/ui/textarea";
+import { fetchCategories } from "@/lib/data";
+import { Category } from "@/lib/types";
+import { cn } from "@/lib/utils";
+import { format } from "date-fns";
+import { CalendarIcon, Check, Clipboard } from "lucide-react";
+import { useCallback, useEffect, useMemo, useState } from "react";
+import { toast } from "sonner";
+import { z } from "zod";
+import Categories from "./_components/Categories";
+import InstallMethod from "./_components/InstallMethod";
+import Note from "./_components/Note";
+import { ScriptSchema, type Script } from "./_schemas/schemas";
+
+const initialScript: Script = {
+ name: "",
+ slug: "",
+ categories: [],
+ date_created: "",
+ type: "ct",
+ updateable: false,
+ privileged: false,
+ interface_port: null,
+ documentation: null,
+ website: null,
+ logo: null,
+ description: "",
+ install_methods: [],
+ default_credentials: {
+ username: null,
+ password: null,
+ },
+ notes: [],
+};
+
+export default function JSONGenerator() {
+ const [script, setScript] = useState
+
+
+
+
+
+
+
+
+
+