diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fbc60b3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5123 @@ +
+ + + +
+

Changelog

+ +

All notable changes to this project will be documented in this file.

+ +> [!CAUTION] +Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes. + +> [!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. + + +## 2025-04-08 + +### 🆕 New Scripts + + - Alpine-PostgreSQL [@MickLesk](https://github.com/MickLesk) ([#3751](https://github.com/community-scripts/ProxmoxVE/pull/3751)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Alpine-Wireguard: Fix for sysctl and ip_forward [@juronja](https://github.com/juronja) ([#3744](https://github.com/community-scripts/ProxmoxVE/pull/3744)) + - TriliumNext: fix dump-db [@MickLesk](https://github.com/MickLesk) ([#3741](https://github.com/community-scripts/ProxmoxVE/pull/3741)) + - Actual: Reduce RAM to 4GB and old space to 3072MB [@dannyellis](https://github.com/dannyellis) ([#3730](https://github.com/community-scripts/ProxmoxVE/pull/3730)) + + - #### ✨ New Features + + - Alpine-MariaDB: better handling of adminer installation [@MickLesk](https://github.com/MickLesk) ([#3739](https://github.com/community-scripts/ProxmoxVE/pull/3739)) + - Paperless-GPT: Add logging to service file [@tremor021](https://github.com/tremor021) ([#3738](https://github.com/community-scripts/ProxmoxVE/pull/3738)) + +### 🌐 Website + + - #### 📝 Script Information + + - Meilisearch: Fix Typo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3749](https://github.com/community-scripts/ProxmoxVE/pull/3749)) + +## 2025-04-07 + +### 🆕 New Scripts + + - Breaking: Hoarder > Karakeep [@MickLesk](https://github.com/MickLesk) ([#3699](https://github.com/community-scripts/ProxmoxVE/pull/3699)) + +### 🚀 Updated Scripts + + - Actual: Increase RAM and add heap-space var for nodejs [@MickLesk](https://github.com/MickLesk) ([#3713](https://github.com/community-scripts/ProxmoxVE/pull/3713)) + + - #### 🐞 Bug Fixes + + - Alpine-MariaDB: Fix Install Service startup [@MickLesk](https://github.com/MickLesk) ([#3701](https://github.com/community-scripts/ProxmoxVE/pull/3701)) + - Zitadel: Fix release tarball crawling [@tremor021](https://github.com/tremor021) ([#3716](https://github.com/community-scripts/ProxmoxVE/pull/3716)) + + - #### ✨ New Features + + - Kimai: bump php to 8.4 [@MickLesk](https://github.com/MickLesk) ([#3724](https://github.com/community-scripts/ProxmoxVE/pull/3724)) + + - #### 🔧 Refactor + + - Refactor: Zabbix, get always latest version [@MickLesk](https://github.com/MickLesk) ([#3720](https://github.com/community-scripts/ProxmoxVE/pull/3720)) + +### 🌐 Website + + - #### 📝 Script Information + + - Changed the category of Channels DVR and NextPVR [@johnsturgeon](https://github.com/johnsturgeon) ([#3729](https://github.com/community-scripts/ProxmoxVE/pull/3729)) + +## 2025-04-06 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Actual: Add git dependency & change yarn commands [@MickLesk](https://github.com/MickLesk) ([#3703](https://github.com/community-scripts/ProxmoxVE/pull/3703)) + - Pelican-Panel: Fix PHP 8.4 Repository [@MickLesk](https://github.com/MickLesk) ([#3700](https://github.com/community-scripts/ProxmoxVE/pull/3700)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - Implement FAQ component and integrate it into the main page [@BramSuurdje](https://github.com/BramSuurdje) ([#3709](https://github.com/community-scripts/ProxmoxVE/pull/3709)) + +## 2025-04-05 + +### 🌐 Website + + - Bump vite from 6.2.4 to 6.2.5 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3668](https://github.com/community-scripts/ProxmoxVE/pull/3668)) + +## 2025-04-04 + +### 🆕 New Scripts + + - meilisearch [@MickLesk](https://github.com/MickLesk) ([#3638](https://github.com/community-scripts/ProxmoxVE/pull/3638)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Pelican Panel: Bump php to 8.4 [@bvdberg01](https://github.com/bvdberg01) ([#3669](https://github.com/community-scripts/ProxmoxVE/pull/3669)) + - Pterodactyl: Bump php to 8.4 [@MickLesk](https://github.com/MickLesk) ([#3655](https://github.com/community-scripts/ProxmoxVE/pull/3655)) + + - #### ✨ New Features + + - Caddy: add git for xcaddy [@MickLesk](https://github.com/MickLesk) ([#3657](https://github.com/community-scripts/ProxmoxVE/pull/3657)) + +### 🧰 Maintenance + + - #### 💾 Core + + - core: fix raw path [@MickLesk](https://github.com/MickLesk) ([#3656](https://github.com/community-scripts/ProxmoxVE/pull/3656)) + +## 2025-04-03 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Prowlarr: Fix Typo in URL (update_function) [@ribera96](https://github.com/ribera96) ([#3640](https://github.com/community-scripts/ProxmoxVE/pull/3640)) + - Prowlarr: Fix typo in release URL [@tremor021](https://github.com/tremor021) ([#3636](https://github.com/community-scripts/ProxmoxVE/pull/3636)) + - GoMFT: Fix the node_modules deletion command [@tremor021](https://github.com/tremor021) ([#3624](https://github.com/community-scripts/ProxmoxVE/pull/3624)) + - BookStack: Fix path to downloaded release file [@tremor021](https://github.com/tremor021) ([#3627](https://github.com/community-scripts/ProxmoxVE/pull/3627)) + + - #### ✨ New Features + + - VM: show progress bar while downloading [@MickLesk](https://github.com/MickLesk) ([#3634](https://github.com/community-scripts/ProxmoxVE/pull/3634)) + - *Arr: Move Arr apps to github release crawling and provide update functionality [@tremor021](https://github.com/tremor021) ([#3625](https://github.com/community-scripts/ProxmoxVE/pull/3625)) + +### 🧰 Maintenance + + - #### 📂 Github + + - Correct URL in contributing docs [@verbumfeit](https://github.com/verbumfeit) ([#3648](https://github.com/community-scripts/ProxmoxVE/pull/3648)) + +### 🌐 Website + + - Bump next from 15.2.3 to 15.2.4 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3628](https://github.com/community-scripts/ProxmoxVE/pull/3628)) + + - #### 📝 Script Information + + - slskd: fix typo for config note [@MickLesk](https://github.com/MickLesk) ([#3633](https://github.com/community-scripts/ProxmoxVE/pull/3633)) + +## 2025-04-02 + +### 🆕 New Scripts + + - openziti-tunnel [@emoscardini](https://github.com/emoscardini) ([#3610](https://github.com/community-scripts/ProxmoxVE/pull/3610)) +- Alpine-Wireguard [@MickLesk](https://github.com/MickLesk) ([#3611](https://github.com/community-scripts/ProxmoxVE/pull/3611)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Authelia: fix incorrect rights for email.txt [@MickLesk](https://github.com/MickLesk) ([#3612](https://github.com/community-scripts/ProxmoxVE/pull/3612)) + - Photoprism: harmonize curl [@MickLesk](https://github.com/MickLesk) ([#3601](https://github.com/community-scripts/ProxmoxVE/pull/3601)) + - Fix link in clean-lxcs.sh [@thalatamsainath](https://github.com/thalatamsainath) ([#3593](https://github.com/community-scripts/ProxmoxVE/pull/3593)) + - Fileflows: Add ImageMagick dependecy [@tremor021](https://github.com/tremor021) ([#3589](https://github.com/community-scripts/ProxmoxVE/pull/3589)) + - General fixes for several scripts [@tremor021](https://github.com/tremor021) ([#3587](https://github.com/community-scripts/ProxmoxVE/pull/3587)) + +### 🧰 Maintenance + + - #### 💾 Core + + - UI-Fix: verbose without useless space in header [@MickLesk](https://github.com/MickLesk) ([#3598](https://github.com/community-scripts/ProxmoxVE/pull/3598)) + +## 2025-04-01 + +### 🆕 New Scripts + + - Alpine Prometheus [@MickLesk](https://github.com/MickLesk) ([#3547](https://github.com/community-scripts/ProxmoxVE/pull/3547)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Flaresolverr: Fix curl command [@tremor021](https://github.com/tremor021) ([#3583](https://github.com/community-scripts/ProxmoxVE/pull/3583)) + - Authentik - Fix YQ_LATEST regex [@ceres-c](https://github.com/ceres-c) ([#3565](https://github.com/community-scripts/ProxmoxVE/pull/3565)) + - Fileflows: Fix update dependencies [@tremor021](https://github.com/tremor021) ([#3577](https://github.com/community-scripts/ProxmoxVE/pull/3577)) + - CheckMK: Increase Disk size [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3559](https://github.com/community-scripts/ProxmoxVE/pull/3559)) + - switch arr lxc's (lidarr,-prowlarr,-radarr,-readarr,-whisparr) to curl -fsSL [@MickLesk](https://github.com/MickLesk) ([#3554](https://github.com/community-scripts/ProxmoxVE/pull/3554)) + + - #### 💥 Breaking Changes + + - Replace wget with curl -fsSL, normalize downloads, and prep for IPv6 [@MickLesk](https://github.com/MickLesk) ([#3455](https://github.com/community-scripts/ProxmoxVE/pull/3455)) + + - #### 🔧 Refactor + + - Fixes and standard enforcement [@tremor021](https://github.com/tremor021) ([#3564](https://github.com/community-scripts/ProxmoxVE/pull/3564)) + +### 🌐 Website + + - Update metadata inside layout.tsx for better SEO [@BramSuurdje](https://github.com/BramSuurdje) ([#3570](https://github.com/community-scripts/ProxmoxVE/pull/3570)) +- Bump vite from 5.4.14 to 5.4.16 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3549](https://github.com/community-scripts/ProxmoxVE/pull/3549)) + + - #### ✨ New Features + + - Refactor ScriptItem and Buttons components to enhance layout and integrate dropdown for links. Update InterFaces component for improved styling and structure. [@BramSuurdje](https://github.com/BramSuurdje) ([#3567](https://github.com/community-scripts/ProxmoxVE/pull/3567)) + +## 2025-03-31 + +### 🆕 New Scripts + + - slskd [@vhsdream](https://github.com/vhsdream) ([#3516](https://github.com/community-scripts/ProxmoxVE/pull/3516)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - The Lounge: Fix sqlite3 failing to build [@tremor021](https://github.com/tremor021) ([#3542](https://github.com/community-scripts/ProxmoxVE/pull/3542)) + - 2FAuth: Update PHP to 8.3 [@BrockHumblet](https://github.com/BrockHumblet) ([#3510](https://github.com/community-scripts/ProxmoxVE/pull/3510)) + - GoMFT: Update Curl Path [@MickLesk](https://github.com/MickLesk) ([#3537](https://github.com/community-scripts/ProxmoxVE/pull/3537)) + - slskd: fix broken curl for soularr [@MickLesk](https://github.com/MickLesk) ([#3533](https://github.com/community-scripts/ProxmoxVE/pull/3533)) + - Docmost: Bump NodeJS to 22 & fixed pnpm [@MickLesk](https://github.com/MickLesk) ([#3521](https://github.com/community-scripts/ProxmoxVE/pull/3521)) + - Tianji: Bump NodeJS to V22 [@MickLesk](https://github.com/MickLesk) ([#3519](https://github.com/community-scripts/ProxmoxVE/pull/3519)) + + - #### ✨ New Features + + - NPMPlus: update function & better create handling (user/password) [@MickLesk](https://github.com/MickLesk) ([#3520](https://github.com/community-scripts/ProxmoxVE/pull/3520)) + + - #### 🔧 Refactor + + - Remove old `.jar` versions of Stirling-PDF [@JcMinarro](https://github.com/JcMinarro) ([#3512](https://github.com/community-scripts/ProxmoxVE/pull/3512)) + +### 🧰 Maintenance + + - #### 💾 Core + + - core: fix empty header if header in repo exist [@MickLesk](https://github.com/MickLesk) ([#3536](https://github.com/community-scripts/ProxmoxVE/pull/3536)) + +### 🌐 Website + + - #### ✨ New Features + + - Change Frontend Version Info [@MickLesk](https://github.com/MickLesk) ([#3527](https://github.com/community-scripts/ProxmoxVE/pull/3527)) + + - #### 📝 Script Information + + - HomeAssistant (Container): Better Portainer explanation [@MickLesk](https://github.com/MickLesk) ([#3518](https://github.com/community-scripts/ProxmoxVE/pull/3518)) + +## 2025-03-30 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Open WebUI: Fix Ollama update logic [@tremor021](https://github.com/tremor021) ([#3506](https://github.com/community-scripts/ProxmoxVE/pull/3506)) + - GoMFT: Add frontend build procedure [@tremor021](https://github.com/tremor021) ([#3499](https://github.com/community-scripts/ProxmoxVE/pull/3499)) + + - #### ✨ New Features + + - Open WebUI: Add Ollama update check [@tremor021](https://github.com/tremor021) ([#3478](https://github.com/community-scripts/ProxmoxVE/pull/3478)) + +## 2025-03-29 + +### 🆕 New Scripts + + - Alpine MariaDB [@MickLesk](https://github.com/MickLesk) ([#3456](https://github.com/community-scripts/ProxmoxVE/pull/3456)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Komodo: Fix wrong sed text [@tremor021](https://github.com/tremor021) ([#3491](https://github.com/community-scripts/ProxmoxVE/pull/3491)) + - GoMFT: Fix release archive naming [@tremor021](https://github.com/tremor021) ([#3483](https://github.com/community-scripts/ProxmoxVE/pull/3483)) + - Homepage: Fix release parsing [@tremor021](https://github.com/tremor021) ([#3484](https://github.com/community-scripts/ProxmoxVE/pull/3484)) + - Netdata: Fix debian-keyring dependency missing [@tremor021](https://github.com/tremor021) ([#3477](https://github.com/community-scripts/ProxmoxVE/pull/3477)) + - ErsatzTV: Fix temp file reference [@tremor021](https://github.com/tremor021) ([#3476](https://github.com/community-scripts/ProxmoxVE/pull/3476)) + - Komodo: Fix compose.env [@tremor021](https://github.com/tremor021) ([#3466](https://github.com/community-scripts/ProxmoxVE/pull/3466)) + +## 2025-03-28 + +### 🆕 New Scripts + + - Alpine Node-RED [@MickLesk](https://github.com/MickLesk) ([#3457](https://github.com/community-scripts/ProxmoxVE/pull/3457)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - GoMFT: Fix release grep [@tremor021](https://github.com/tremor021) ([#3462](https://github.com/community-scripts/ProxmoxVE/pull/3462)) + - ErsatzTV: Fix path in update function [@tremor021](https://github.com/tremor021) ([#3463](https://github.com/community-scripts/ProxmoxVE/pull/3463)) + +## 2025-03-27 + +### 🚀 Updated Scripts + + - [core]: add functions for Alpine (update / core deps) [@MickLesk](https://github.com/MickLesk) ([#3437](https://github.com/community-scripts/ProxmoxVE/pull/3437)) + +### 🧰 Maintenance + + - #### 💾 Core + + - [core]: Refactor Spinner/MSG Function (support now alpine / performance / handling) [@MickLesk](https://github.com/MickLesk) ([#3436](https://github.com/community-scripts/ProxmoxVE/pull/3436)) + +## 2025-03-26 + +### 🆕 New Scripts + + - Alpine: Gitea [@MickLesk](https://github.com/MickLesk) ([#3424](https://github.com/community-scripts/ProxmoxVE/pull/3424)) + +### 🚀 Updated Scripts + + - FlowiseAI: Fix dependencies [@tremor021](https://github.com/tremor021) ([#3427](https://github.com/community-scripts/ProxmoxVE/pull/3427)) + + - #### 🐞 Bug Fixes + + - fluid-calendar: Fix failed build during updates [@vhsdream](https://github.com/vhsdream) ([#3417](https://github.com/community-scripts/ProxmoxVE/pull/3417)) + +### 🧰 Maintenance + + - #### 📂 Github + + - Remove coredeps in CONTRIBUTOR_AND_GUIDES [@bvdberg01](https://github.com/bvdberg01) ([#3420](https://github.com/community-scripts/ProxmoxVE/pull/3420)) + +## 2025-03-25 + +### 🧰 Maintenance + + - #### 📂 Github + + - Discord invite link updated [@MickLesk](https://github.com/MickLesk) ([#3412](https://github.com/community-scripts/ProxmoxVE/pull/3412)) + +## 2025-03-24 + +### 🆕 New Scripts + + - fileflows [@kkroboth](https://github.com/kkroboth) ([#3392](https://github.com/community-scripts/ProxmoxVE/pull/3392)) +- wazuh [@omiinaya](https://github.com/omiinaya) ([#3381](https://github.com/community-scripts/ProxmoxVE/pull/3381)) +- yt-dlp-webui [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3364](https://github.com/community-scripts/ProxmoxVE/pull/3364)) +- Extension/New Script: Redis Alpine Installation [@MickLesk](https://github.com/MickLesk) ([#3367](https://github.com/community-scripts/ProxmoxVE/pull/3367)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Extend HOME Env for Kubo [@MickLesk](https://github.com/MickLesk) ([#3397](https://github.com/community-scripts/ProxmoxVE/pull/3397)) + + - #### ✨ New Features + + - [core] Rebase Scripts (formatting, highlighting & remove old deps) [@MickLesk](https://github.com/MickLesk) ([#3378](https://github.com/community-scripts/ProxmoxVE/pull/3378)) + + - #### 🔧 Refactor + + - qBittorrent: Switch to static builds for faster updating/upgrading [@tremor021](https://github.com/tremor021) ([#3405](https://github.com/community-scripts/ProxmoxVE/pull/3405)) + - Refactor: ErsatzTV Script [@MickLesk](https://github.com/MickLesk) ([#3365](https://github.com/community-scripts/ProxmoxVE/pull/3365)) + +### 🧰 Maintenance + + - #### ✨ New Features + + - [core] install core deps (debian / ubuntu) [@MickLesk](https://github.com/MickLesk) ([#3366](https://github.com/community-scripts/ProxmoxVE/pull/3366)) + + - #### 💾 Core + + - [core] extend hardware transcoding for fileflows #3392 [@MickLesk](https://github.com/MickLesk) ([#3396](https://github.com/community-scripts/ProxmoxVE/pull/3396)) + + - #### 📂 Github + + - Refactor Changelog Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3371](https://github.com/community-scripts/ProxmoxVE/pull/3371)) + +### 🌐 Website + + - Update siteConfig.tsx to use new analytics code [@BramSuurdje](https://github.com/BramSuurdje) ([#3389](https://github.com/community-scripts/ProxmoxVE/pull/3389)) + + - #### 🐞 Bug Fixes + + - Better Text for Version Date [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3388](https://github.com/community-scripts/ProxmoxVE/pull/3388)) + +## 2025-03-23 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - GoMFT: Check if build-essential is present before updating, if not then install it [@tremor021](https://github.com/tremor021) ([#3358](https://github.com/community-scripts/ProxmoxVE/pull/3358)) + +## 2025-03-22 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - revealjs: Fix update process [@tremor021](https://github.com/tremor021) ([#3341](https://github.com/community-scripts/ProxmoxVE/pull/3341)) + - Cronicle: add missing gnupg package [@MickLesk](https://github.com/MickLesk) ([#3323](https://github.com/community-scripts/ProxmoxVE/pull/3323)) + + - #### ✨ New Features + + - Update nextcloud-vm.sh to 18.1 ISO [@0xN0BADC0FF33](https://github.com/0xN0BADC0FF33) ([#3333](https://github.com/community-scripts/ProxmoxVE/pull/3333)) + +## 2025-03-21 + +### 🚀 Updated Scripts + + - Omada jdk to jre [@bvdberg01](https://github.com/bvdberg01) ([#3319](https://github.com/community-scripts/ProxmoxVE/pull/3319)) + + - #### 🐞 Bug Fixes + + - Omada zulu 8 to 21 [@bvdberg01](https://github.com/bvdberg01) ([#3318](https://github.com/community-scripts/ProxmoxVE/pull/3318)) + - MySQL: Correctly add repo to mysql.list [@tremor021](https://github.com/tremor021) ([#3315](https://github.com/community-scripts/ProxmoxVE/pull/3315)) + - GoMFT: Fix build dependencies [@tremor021](https://github.com/tremor021) ([#3313](https://github.com/community-scripts/ProxmoxVE/pull/3313)) + - GoMFT: Don't rely on binaries from github [@tremor021](https://github.com/tremor021) ([#3303](https://github.com/community-scripts/ProxmoxVE/pull/3303)) + +### 🧰 Maintenance + + - #### 💾 Core + + - Clarify MTU in advanced Settings. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3296](https://github.com/community-scripts/ProxmoxVE/pull/3296)) + +### 🌐 Website + + - Bump next from 15.1.3 to 15.2.3 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3316](https://github.com/community-scripts/ProxmoxVE/pull/3316)) + + - #### 📝 Script Information + + - Proxmox, rather than Promox [@gringocl](https://github.com/gringocl) ([#3293](https://github.com/community-scripts/ProxmoxVE/pull/3293)) + - Audiobookshelf: Fix category on website [@jaykup26](https://github.com/jaykup26) ([#3304](https://github.com/community-scripts/ProxmoxVE/pull/3304)) + - Threadfin: add port for website [@MickLesk](https://github.com/MickLesk) ([#3295](https://github.com/community-scripts/ProxmoxVE/pull/3295)) + +## 2025-03-20 + +### 🚀 Updated Scripts + + - #### ✨ New Features + + - Netdata: Update to newer deb File [@MickLesk](https://github.com/MickLesk) ([#3276](https://github.com/community-scripts/ProxmoxVE/pull/3276)) + +### 🧰 Maintenance + + - #### ✨ New Features + + - [core] add gitignore to prevent big pulls [@MickLesk](https://github.com/MickLesk) ([#3278](https://github.com/community-scripts/ProxmoxVE/pull/3278)) + +## 2025-03-19 + +### 🚀 Updated Scripts + + - License url VED to VE [@bvdberg01](https://github.com/bvdberg01) ([#3258](https://github.com/community-scripts/ProxmoxVE/pull/3258)) + + - #### 🐞 Bug Fixes + + - Snipe-IT: Remove composer update & add no interaction for install [@MickLesk](https://github.com/MickLesk) ([#3256](https://github.com/community-scripts/ProxmoxVE/pull/3256)) + - Fluid-Calendar: Remove unneeded $STD in update [@MickLesk](https://github.com/MickLesk) ([#3250](https://github.com/community-scripts/ProxmoxVE/pull/3250)) + + - #### 💥 Breaking Changes + + - FluidCalendar: Switch to safer DB operations [@vhsdream](https://github.com/vhsdream) ([#3270](https://github.com/community-scripts/ProxmoxVE/pull/3270)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - JSON editor note fix [@bvdberg01](https://github.com/bvdberg01) ([#3260](https://github.com/community-scripts/ProxmoxVE/pull/3260)) + +## 2025-03-18 + +### 🆕 New Scripts + + - CryptPad [@MickLesk](https://github.com/MickLesk) ([#3205](https://github.com/community-scripts/ProxmoxVE/pull/3205)) +- GoMFT [@tremor021](https://github.com/tremor021) ([#3157](https://github.com/community-scripts/ProxmoxVE/pull/3157)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Update omada download url [@bvdberg01](https://github.com/bvdberg01) ([#3245](https://github.com/community-scripts/ProxmoxVE/pull/3245)) + - Wikijs: Remove Dev Message & Performance-Boost [@bvdberg01](https://github.com/bvdberg01) ([#3232](https://github.com/community-scripts/ProxmoxVE/pull/3232)) + - Fix openwebui update script when backup directory already exists [@chrisdoc](https://github.com/chrisdoc) ([#3213](https://github.com/community-scripts/ProxmoxVE/pull/3213)) + + - #### 💥 Breaking Changes + + - Tandoor: Extend needed dependencies (Read for Update-Functionality) [@MickLesk](https://github.com/MickLesk) ([#3207](https://github.com/community-scripts/ProxmoxVE/pull/3207)) + +### 🧰 Maintenance + + - #### 📂 Github + + - [core] cleanup - remove old backups of workflow files [@MickLesk](https://github.com/MickLesk) ([#3247](https://github.com/community-scripts/ProxmoxVE/pull/3247)) + - Add worflow to crawl APP verisons [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3192](https://github.com/community-scripts/ProxmoxVE/pull/3192)) + - Update pr template and WF [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3200](https://github.com/community-scripts/ProxmoxVE/pull/3200)) + - Update Workflow Context [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3171](https://github.com/community-scripts/ProxmoxVE/pull/3171)) + - Change json path CONTRIBUTING.md [@bvdberg01](https://github.com/bvdberg01) ([#3187](https://github.com/community-scripts/ProxmoxVE/pull/3187)) + - Relocate the Json Files [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3184](https://github.com/community-scripts/ProxmoxVE/pull/3184)) + - Update Workflow to Close Discussion [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3185](https://github.com/community-scripts/ProxmoxVE/pull/3185)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - Move cryptpad files to right folders [@bvdberg01](https://github.com/bvdberg01) ([#3242](https://github.com/community-scripts/ProxmoxVE/pull/3242)) + - Update Frontend Version Logic [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3223](https://github.com/community-scripts/ProxmoxVE/pull/3223)) + + - #### ✨ New Features + + - Add Latest Change Date to Frontend [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3231](https://github.com/community-scripts/ProxmoxVE/pull/3231)) + - Show Version Information on Frontend [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3216](https://github.com/community-scripts/ProxmoxVE/pull/3216)) + + - #### 📝 Script Information + + - CrowdSec: Add debian only warning to website [@tremor021](https://github.com/tremor021) ([#3210](https://github.com/community-scripts/ProxmoxVE/pull/3210)) + - Debian VM: Update webpage with login info [@tremor021](https://github.com/tremor021) ([#3215](https://github.com/community-scripts/ProxmoxVE/pull/3215)) + - Heimdall Dashboard: Fix missing logo on website [@tremor021](https://github.com/tremor021) ([#3227](https://github.com/community-scripts/ProxmoxVE/pull/3227)) + - Seafile: lowercase slug for Install/Update-Source [@MickLesk](https://github.com/MickLesk) ([#3209](https://github.com/community-scripts/ProxmoxVE/pull/3209)) + - Website: Lowercase Zitadel-Slug [@MickLesk](https://github.com/MickLesk) ([#3222](https://github.com/community-scripts/ProxmoxVE/pull/3222)) + - VictoriaMetrics: Fix Wrong Slug [@MickLesk](https://github.com/MickLesk) ([#3225](https://github.com/community-scripts/ProxmoxVE/pull/3225)) + - Update Pimox Logo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3233](https://github.com/community-scripts/ProxmoxVE/pull/3233)) + - [AUTOMATIC PR]Update versions.json [@community-scripts-pr-app[bot]](https://github.com/community-scripts-pr-app[bot]) ([#3201](https://github.com/community-scripts/ProxmoxVE/pull/3201)) + - GoMFT: Update Logo [@MickLesk](https://github.com/MickLesk) ([#3188](https://github.com/community-scripts/ProxmoxVE/pull/3188)) + +## 2025-03-17 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - TriliumNotes: Fix release handling [@tremor021](https://github.com/tremor021) ([#3160](https://github.com/community-scripts/ProxmoxVE/pull/3160)) + - TriliumNext: Fix release file name/path, preventing install and update [@tremor021](https://github.com/tremor021) ([#3152](https://github.com/community-scripts/ProxmoxVE/pull/3152)) + - qBittorrent: Accept legal notice in config file [@tremor021](https://github.com/tremor021) ([#3150](https://github.com/community-scripts/ProxmoxVE/pull/3150)) + - Tandoor: Switch Repo to new Link [@MickLesk](https://github.com/MickLesk) ([#3140](https://github.com/community-scripts/ProxmoxVE/pull/3140)) + - Fixed wrong PHP values to match default part-db size (100M) [@dMopp](https://github.com/dMopp) ([#3143](https://github.com/community-scripts/ProxmoxVE/pull/3143)) + - Kimai: Fix Permission Issue on new Timerecords [@MickLesk](https://github.com/MickLesk) ([#3136](https://github.com/community-scripts/ProxmoxVE/pull/3136)) + + - #### ✨ New Features + + - InfluxDB: Add Ports as Info / Script-End [@MickLesk](https://github.com/MickLesk) ([#3141](https://github.com/community-scripts/ProxmoxVE/pull/3141)) + - ByteStash: Add option for multiple accounts and generate JWT secret [@tremor021](https://github.com/tremor021) ([#3132](https://github.com/community-scripts/ProxmoxVE/pull/3132)) + +### 🌐 Website + + - #### 📝 Script Information + + - Paperless-ngx: Fix example on website [@tremor021](https://github.com/tremor021) ([#3155](https://github.com/community-scripts/ProxmoxVE/pull/3155)) + +## 2025-03-16 + +### 🚀 Updated Scripts + + - Typo Enviroment > Environment [@MathijsG](https://github.com/MathijsG) ([#3115](https://github.com/community-scripts/ProxmoxVE/pull/3115)) +- Paperless-ngx: Add additional information to website on how to install OCR languages [@tremor021](https://github.com/tremor021) ([#3111](https://github.com/community-scripts/ProxmoxVE/pull/3111)) +- Prometheus PVE Exporter: Rightsizing RAM and Disk [@andygrunwald](https://github.com/andygrunwald) ([#3098](https://github.com/community-scripts/ProxmoxVE/pull/3098)) + + - #### 🐞 Bug Fixes + + - Jellyseerr: Fix dependencies [@tremor021](https://github.com/tremor021) ([#3125](https://github.com/community-scripts/ProxmoxVE/pull/3125)) + - wger: Fix build.func path [@tremor021](https://github.com/tremor021) ([#3121](https://github.com/community-scripts/ProxmoxVE/pull/3121)) + - Filebrowser: Fix hardcoded port in Debian service file [@Xerovoxx98](https://github.com/Xerovoxx98) ([#3105](https://github.com/community-scripts/ProxmoxVE/pull/3105)) + +### 🌐 Website + + - #### 📝 Script Information + + - Website: Fix alpine-it-tools "undefined" Link [@CrazyWolf13](https://github.com/CrazyWolf13) ([#3110](https://github.com/community-scripts/ProxmoxVE/pull/3110)) + +## 2025-03-15 + +### 🚀 Updated Scripts + + - #### 💥 Breaking Changes + + - Homepage: Bugfix for v1.0.0 [@vhsdream](https://github.com/vhsdream) ([#3092](https://github.com/community-scripts/ProxmoxVE/pull/3092)) + +## 2025-03-14 + +### 🚀 Updated Scripts + + - Memos: Increase RAM Usage and max space [@MickLesk](https://github.com/MickLesk) ([#3072](https://github.com/community-scripts/ProxmoxVE/pull/3072)) +- Seafile - Minor bug fix: domain.sh script fix [@dave-yap](https://github.com/dave-yap) ([#3046](https://github.com/community-scripts/ProxmoxVE/pull/3046)) + + - #### 🐞 Bug Fixes + + - openwrt: fix typo netmask [@qzydustin](https://github.com/qzydustin) ([#3084](https://github.com/community-scripts/ProxmoxVE/pull/3084)) + +### 🌐 Website + + - #### 📝 Script Information + + - NPMplus: Add info about docker use. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3085](https://github.com/community-scripts/ProxmoxVE/pull/3085)) + +## 2025-03-13 + +### 🆕 New Scripts + + - NPMplus [@MickLesk](https://github.com/MickLesk) ([#3051](https://github.com/community-scripts/ProxmoxVE/pull/3051)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - OpenWebUI check if there are stashed changes before poping [@tremor021](https://github.com/tremor021) ([#3064](https://github.com/community-scripts/ProxmoxVE/pull/3064)) + - Update Fluid Calendar for v1.2.0 [@vhsdream](https://github.com/vhsdream) ([#3053](https://github.com/community-scripts/ProxmoxVE/pull/3053)) + +### 🧰 Maintenance + + - #### 💾 Core + + - alpine-Install (core) add timezone (tz) check [@MickLesk](https://github.com/MickLesk) ([#3057](https://github.com/community-scripts/ProxmoxVE/pull/3057)) + + - #### 📂 Github + + - New Workflow: Close Issues in DEV Repo when new Script is merged [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#3042](https://github.com/community-scripts/ProxmoxVE/pull/3042)) + +### 🌐 Website + + - Bump @babel/runtime from 7.26.0 to 7.26.10 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#3044](https://github.com/community-scripts/ProxmoxVE/pull/3044)) + + - #### 📝 Script Information + + - Update Vaultwarden Source [@MickLesk](https://github.com/MickLesk) ([#3036](https://github.com/community-scripts/ProxmoxVE/pull/3036)) + - Website: Fix Alpine "undefined" Link [@MickLesk](https://github.com/MickLesk) ([#3048](https://github.com/community-scripts/ProxmoxVE/pull/3048)) + +## 2025-03-12 + +### 🆕 New Scripts + + - Fluid Calendar [@vhsdream](https://github.com/vhsdream) ([#2869](https://github.com/community-scripts/ProxmoxVE/pull/2869)) + +### 🚀 Updated Scripts + + - #### ✨ New Features + + - Feature: Filebrowser: support now alpine [@MickLesk](https://github.com/MickLesk) ([#2997](https://github.com/community-scripts/ProxmoxVE/pull/2997)) + +## 2025-03-11 + +### 🆕 New Scripts + + - Plant-it [@MickLesk](https://github.com/MickLesk) ([#3000](https://github.com/community-scripts/ProxmoxVE/pull/3000)) +- Seafile [@dave-yap](https://github.com/dave-yap) ([#2987](https://github.com/community-scripts/ProxmoxVE/pull/2987)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Headscale: Re-enable Service after Update [@Cerothen](https://github.com/Cerothen) ([#3012](https://github.com/community-scripts/ProxmoxVE/pull/3012)) + - SnipeIT: Harmonize composer install to Project-Dockerfile [@MickLesk](https://github.com/MickLesk) ([#3009](https://github.com/community-scripts/ProxmoxVE/pull/3009)) + - Teddycloud: fix update function [@tremor021](https://github.com/tremor021) ([#2996](https://github.com/community-scripts/ProxmoxVE/pull/2996)) + +### 🧰 Maintenance + + - #### 📂 Github + + - Cleanup Old Project Files (figlet, app-header, images) [@MickLesk](https://github.com/MickLesk) ([#3004](https://github.com/community-scripts/ProxmoxVE/pull/3004)) + - Additions and amends to the CONTIRBUTOR docs [@tremor021](https://github.com/tremor021) ([#2983](https://github.com/community-scripts/ProxmoxVE/pull/2983)) + +### 🌐 Website + + - #### 📝 Script Information + + - Jellyseer not labeled as updateable even though update function exists [@tremor021](https://github.com/tremor021) ([#2991](https://github.com/community-scripts/ProxmoxVE/pull/2991)) + - Fix Website - Show correct wget path for alpine [@MickLesk](https://github.com/MickLesk) ([#2998](https://github.com/community-scripts/ProxmoxVE/pull/2998)) + +## 2025-03-10 + +### 🆕 New Scripts + + - Paperless-GPT [@MickLesk](https://github.com/MickLesk) ([#2965](https://github.com/community-scripts/ProxmoxVE/pull/2965)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Rework SnipeIT: Tarball & Tempfile [@MickLesk](https://github.com/MickLesk) ([#2963](https://github.com/community-scripts/ProxmoxVE/pull/2963)) + - pihole: fix path when accessing pihole using `pct enter` [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2964](https://github.com/community-scripts/ProxmoxVE/pull/2964)) + - Hoarder: v0.23.0 dependency update [@vhsdream](https://github.com/vhsdream) ([#2958](https://github.com/community-scripts/ProxmoxVE/pull/2958)) + +### 🧰 Maintenance + + - #### 📂 Github + + - Update autolabeler.yml: Set Labels correctly [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2968](https://github.com/community-scripts/ProxmoxVE/pull/2968)) + +### 🌐 Website + + - Add warnings about externaly sourced scripts [@tremor021](https://github.com/tremor021) ([#2975](https://github.com/community-scripts/ProxmoxVE/pull/2975)) + +## 2025-03-09 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Fix wikijs update issue while backing up data [@AdelRefaat](https://github.com/AdelRefaat) ([#2950](https://github.com/community-scripts/ProxmoxVE/pull/2950)) + +### 🧰 Maintenance + + - #### 🐞 Bug Fixes + + - Improve Release-Action (awk function) [@MickLesk](https://github.com/MickLesk) ([#2934](https://github.com/community-scripts/ProxmoxVE/pull/2934)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - Pi-hole interface port in documentation [@la7eralus](https://github.com/la7eralus) ([#2953](https://github.com/community-scripts/ProxmoxVE/pull/2953)) + +## 2025-03-08 + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - Update slug to lowercase in pf2etools.json [@PhoenixEmik](https://github.com/PhoenixEmik) ([#2942](https://github.com/community-scripts/ProxmoxVE/pull/2942)) + +## 2025-03-07 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - JupyterNotebook: Fix APP Variable [@MickLesk](https://github.com/MickLesk) ([#2924](https://github.com/community-scripts/ProxmoxVE/pull/2924)) + + - #### ✨ New Features + + - Beszel: restarting service after update [@C0pywriting](https://github.com/C0pywriting) ([#2915](https://github.com/community-scripts/ProxmoxVE/pull/2915)) + + - #### 💥 Breaking Changes + + - ActualBudget: Update Script with new Repo [@MickLesk](https://github.com/MickLesk) ([#2907](https://github.com/community-scripts/ProxmoxVE/pull/2907)) + +### 🌐 Website + + - #### 📝 Script Information + + - Improve Nextcloud(pi) docu and Name to NextcloudPi [@MickLesk](https://github.com/MickLesk) ([#2930](https://github.com/community-scripts/ProxmoxVE/pull/2930)) + - fix jupyternotebook slug [@MickLesk](https://github.com/MickLesk) ([#2922](https://github.com/community-scripts/ProxmoxVE/pull/2922)) + - Improve Trilium Description and Name to TriliumNext [@MickLesk](https://github.com/MickLesk) ([#2929](https://github.com/community-scripts/ProxmoxVE/pull/2929)) + - Prowlarr icon [@bannert1337](https://github.com/bannert1337) ([#2906](https://github.com/community-scripts/ProxmoxVE/pull/2906)) + - Update Apache Tika icon to SVG [@bannert1337](https://github.com/bannert1337) ([#2904](https://github.com/community-scripts/ProxmoxVE/pull/2904)) + - Update Prometheus Alertmanager Icon [@bannert1337](https://github.com/bannert1337) ([#2905](https://github.com/community-scripts/ProxmoxVE/pull/2905)) + +## 2025-03-06 + +### 🆕 New Scripts + + - InvenTree [@tremor021](https://github.com/tremor021) ([#2890](https://github.com/community-scripts/ProxmoxVE/pull/2890)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Homarr: Optional Reboot after update [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2876](https://github.com/community-scripts/ProxmoxVE/pull/2876)) + - Fix Tag "community-scripts" for ArchLinux / OPNSense [@MickLesk](https://github.com/MickLesk) ([#2875](https://github.com/community-scripts/ProxmoxVE/pull/2875)) + + - #### ✨ New Features + + - Wastebin: Update Script for Version 3.0.0 [@MickLesk](https://github.com/MickLesk) ([#2885](https://github.com/community-scripts/ProxmoxVE/pull/2885)) + +## 2025-03-05 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Kimai: Better Handling of Updates (backup var / env / yaml) [@MickLesk](https://github.com/MickLesk) ([#2862](https://github.com/community-scripts/ProxmoxVE/pull/2862)) + - Fix NextcloudPi-Installation [@MickLesk](https://github.com/MickLesk) ([#2853](https://github.com/community-scripts/ProxmoxVE/pull/2853)) + +## 2025-03-04 + +### 🆕 New Scripts + + - Reveal.js [@tremor021](https://github.com/tremor021) ([#2806](https://github.com/community-scripts/ProxmoxVE/pull/2806)) +- Apache Tomcat [@MickLesk](https://github.com/MickLesk) ([#2797](https://github.com/community-scripts/ProxmoxVE/pull/2797)) +- Pterodactyl Wings [@bvdberg01](https://github.com/bvdberg01) ([#2800](https://github.com/community-scripts/ProxmoxVE/pull/2800)) +- Pterodactyl Panel [@bvdberg01](https://github.com/bvdberg01) ([#2801](https://github.com/community-scripts/ProxmoxVE/pull/2801)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - reveal.js: Update function now backs up index and config [@tremor021](https://github.com/tremor021) ([#2845](https://github.com/community-scripts/ProxmoxVE/pull/2845)) + - Changedetection: Increase RAM & Disk-Space [@MickLesk](https://github.com/MickLesk) ([#2838](https://github.com/community-scripts/ProxmoxVE/pull/2838)) + - Linkwarden: Optimze RUST Installation [@MickLesk](https://github.com/MickLesk) ([#2817](https://github.com/community-scripts/ProxmoxVE/pull/2817)) + - Nginx: Fix $STD for tar [@MickLesk](https://github.com/MickLesk) ([#2813](https://github.com/community-scripts/ProxmoxVE/pull/2813)) + + - #### ✨ New Features + + - Add source to install scripts and make license one line [@bvdberg01](https://github.com/bvdberg01) ([#2842](https://github.com/community-scripts/ProxmoxVE/pull/2842)) + +### 🧰 Maintenance + + - #### 🐞 Bug Fixes + + - Better handling of create release [@MickLesk](https://github.com/MickLesk) ([#2818](https://github.com/community-scripts/ProxmoxVE/pull/2818)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - Json file update [@bvdberg01](https://github.com/bvdberg01) ([#2824](https://github.com/community-scripts/ProxmoxVE/pull/2824)) + - Prometheus-paperless-ngx-exporter: Fix wrong Interface Port [@schneider-de-com](https://github.com/schneider-de-com) ([#2812](https://github.com/community-scripts/ProxmoxVE/pull/2812)) + + - #### ✨ New Features + + - Feature: Update Icons (selfhst repo) [@bannert1337](https://github.com/bannert1337) ([#2834](https://github.com/community-scripts/ProxmoxVE/pull/2834)) + - Website: Add Mikrotik to Network too, OPNSense & OpenWRT to OS [@MickLesk](https://github.com/MickLesk) ([#2823](https://github.com/community-scripts/ProxmoxVE/pull/2823)) + +## 2025-03-03 + +### 🆕 New Scripts + + - Habitica [@tremor021](https://github.com/tremor021) ([#2779](https://github.com/community-scripts/ProxmoxVE/pull/2779)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Zigbee2Mqtt Use fixed pnpm Version 10.4.1 [@MickLesk](https://github.com/MickLesk) ([#2805](https://github.com/community-scripts/ProxmoxVE/pull/2805)) + - Linkwarden: Fix & Update Monolith-Installation [@MickLesk](https://github.com/MickLesk) ([#2787](https://github.com/community-scripts/ProxmoxVE/pull/2787)) + + - #### ✨ New Features + + - Feature: MinIO use now static port 9001 [@MickLesk](https://github.com/MickLesk) ([#2786](https://github.com/community-scripts/ProxmoxVE/pull/2786)) + - Feature Template Path for Mountings [@MickLesk](https://github.com/MickLesk) ([#2785](https://github.com/community-scripts/ProxmoxVE/pull/2785)) + +### 🌐 Website + + - #### ✨ New Features + + - Feature: Website - show default OS [@MickLesk](https://github.com/MickLesk) ([#2790](https://github.com/community-scripts/ProxmoxVE/pull/2790)) + + - #### 📝 Script Information + + - Update zigbee2mqtt.json - make sure link is clickable [@gurtjun](https://github.com/gurtjun) ([#2802](https://github.com/community-scripts/ProxmoxVE/pull/2802)) + +## 2025-03-02 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Fix gpg Repo for nzbget [@flatlinebb](https://github.com/flatlinebb) ([#2774](https://github.com/community-scripts/ProxmoxVE/pull/2774)) + +## 2025-03-01 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Firefly III: FIx Ownership for OAuth Key [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2759](https://github.com/community-scripts/ProxmoxVE/pull/2759)) + - homarr: double restart to fix homarr migration [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2757](https://github.com/community-scripts/ProxmoxVE/pull/2757)) + + - #### ✨ New Features + + - ActualBudget: New Installation Script with new Repo [@MickLesk](https://github.com/MickLesk) ([#2770](https://github.com/community-scripts/ProxmoxVE/pull/2770)) + + - #### 💥 Breaking Changes + + - Breaking: Remove Update Function for Actual Budget until it fixed [@MickLesk](https://github.com/MickLesk) ([#2768](https://github.com/community-scripts/ProxmoxVE/pull/2768)) + +### 🧰 Maintenance + + - #### 🐞 Bug Fixes + + - Remove Note on Changelog [@MickLesk](https://github.com/MickLesk) ([#2758](https://github.com/community-scripts/ProxmoxVE/pull/2758)) + - Fix Release Creation if Changelog.md to long [@MickLesk](https://github.com/MickLesk) ([#2752](https://github.com/community-scripts/ProxmoxVE/pull/2752)) + +## 2025-02-28 + +### 🧰 Maintenance + + - #### ✨ New Features + + - Shell Format Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2400](https://github.com/community-scripts/ProxmoxVE/pull/2400)) + + - #### 📂 Github + + - Update all Action to new selfhosted Runner Cluster [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2739](https://github.com/community-scripts/ProxmoxVE/pull/2739)) + - Update Script Test Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2741](https://github.com/community-scripts/ProxmoxVE/pull/2741)) + +## 2025-02-27 + +### 🆕 New Scripts + + - web-check [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2662](https://github.com/community-scripts/ProxmoxVE/pull/2662)) +- Pelican Panel [@bvdberg01](https://github.com/bvdberg01) ([#2678](https://github.com/community-scripts/ProxmoxVE/pull/2678)) +- Pelican Wings [@bvdberg01](https://github.com/bvdberg01) ([#2677](https://github.com/community-scripts/ProxmoxVE/pull/2677)) +- ByteStash [@tremor021](https://github.com/tremor021) ([#2680](https://github.com/community-scripts/ProxmoxVE/pull/2680)) + +### 🚀 Updated Scripts + + - ByteStash: Removed sed, app supports Node v22 now [@tremor021](https://github.com/tremor021) ([#2728](https://github.com/community-scripts/ProxmoxVE/pull/2728)) +- Keycloak: Update installation script [@tremor021](https://github.com/tremor021) ([#2714](https://github.com/community-scripts/ProxmoxVE/pull/2714)) +- ByteStash: Fix Node 22 compatibility (thanks t2lc) [@tremor021](https://github.com/tremor021) ([#2705](https://github.com/community-scripts/ProxmoxVE/pull/2705)) + + - #### 🐞 Bug Fixes + + - EOF not detected [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2726](https://github.com/community-scripts/ProxmoxVE/pull/2726)) + - Zitadel-install.sh: Remove one version file and update to our standard [@bvdberg01](https://github.com/bvdberg01) ([#2710](https://github.com/community-scripts/ProxmoxVE/pull/2710)) + - Outline: Change key to hex32 [@tremor021](https://github.com/tremor021) ([#2709](https://github.com/community-scripts/ProxmoxVE/pull/2709)) + - Typo in update scripts [@bvdberg01](https://github.com/bvdberg01) ([#2707](https://github.com/community-scripts/ProxmoxVE/pull/2707)) + - SFTPGo Remove unneeded RELEASE variable [@MickLesk](https://github.com/MickLesk) ([#2683](https://github.com/community-scripts/ProxmoxVE/pull/2683)) + +### 🧰 Maintenance + + - #### 🐞 Bug Fixes + + - Update install.func: Change Line Number for Error message. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2690](https://github.com/community-scripts/ProxmoxVE/pull/2690)) + + - #### 📂 Github + + - New Workflow to close Script Request Discussions on PR merge [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2688](https://github.com/community-scripts/ProxmoxVE/pull/2688)) + - Improve Script-Test Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2712](https://github.com/community-scripts/ProxmoxVE/pull/2712)) + - Switch all actions to self-hosted Runners [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2711](https://github.com/community-scripts/ProxmoxVE/pull/2711)) + +### 🌐 Website + + - #### ✨ New Features + + - Use HTML button element for copying to clipboard [@scallaway](https://github.com/scallaway) ([#2720](https://github.com/community-scripts/ProxmoxVE/pull/2720)) + - Add basic pagination to Data Viewer [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2715](https://github.com/community-scripts/ProxmoxVE/pull/2715)) + + - #### 📝 Script Information + + - wger - Add HTTPS instructions to the website [@tremor021](https://github.com/tremor021) ([#2695](https://github.com/community-scripts/ProxmoxVE/pull/2695)) + +## 2025-02-26 + +### 🆕 New Scripts + + - New Script: Outline [@tremor021](https://github.com/tremor021) ([#2653](https://github.com/community-scripts/ProxmoxVE/pull/2653)) + +### 🚀 Updated Scripts + + - Fix: SABnzbd - Removed few artefacts in the code preventing the update [@tremor021](https://github.com/tremor021) ([#2670](https://github.com/community-scripts/ProxmoxVE/pull/2670)) + + - #### 🐞 Bug Fixes + + - Fix: Homarr - Manually correct db-migration wrong-folder [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2676](https://github.com/community-scripts/ProxmoxVE/pull/2676)) + - Kimai: add local.yaml & fix path permissions [@MickLesk](https://github.com/MickLesk) ([#2646](https://github.com/community-scripts/ProxmoxVE/pull/2646)) + - PiHole: Fix Unbound sed for DNS [@MickLesk](https://github.com/MickLesk) ([#2647](https://github.com/community-scripts/ProxmoxVE/pull/2647)) + - Alpine IT-Tools fix typo "unexpected EOF while looking for matching `"' [@MickLesk](https://github.com/MickLesk) ([#2644](https://github.com/community-scripts/ProxmoxVE/pull/2644)) + +### 🧰 Maintenance + + - #### 📂 Github + + - [gh] Furhter Impove Changelog Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2655](https://github.com/community-scripts/ProxmoxVE/pull/2655)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - Website: PocketID Change of website and documentation links [@schneider-de-com](https://github.com/schneider-de-com) ([#2643](https://github.com/community-scripts/ProxmoxVE/pull/2643)) + + - #### 📝 Script Information + + - Fix: Graylog - Improve application description for website [@tremor021](https://github.com/tremor021) ([#2658](https://github.com/community-scripts/ProxmoxVE/pull/2658)) + +## 2025-02-25 + +### Changes + +### ✨ New Features + +- Update Tailscale: Add Tag when installation is finished [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2633](https://github.com/community-scripts/ProxmoxVE/pull/2633)) + +### 🚀 Updated Scripts + + #### 🐞 Bug Fixes + + - Fix Omada installer [@JcMinarro](https://github.com/JcMinarro) ([#2625](https://github.com/community-scripts/ProxmoxVE/pull/2625)) + +### 🌐 Website + +- Update Tailscale-lxc Json: Add message for Supported OS [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2629](https://github.com/community-scripts/ProxmoxVE/pull/2629)) + +### 🧰 Maintenance + +- [gh] Updated Changelog Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2632](https://github.com/community-scripts/ProxmoxVE/pull/2632)) + +## 2025-02-24 + +### Changes + +### 🆕 New Scripts + +- New Script: wger [@tremor021](https://github.com/tremor021) ([#2574](https://github.com/community-scripts/ProxmoxVE/pull/2574)) +- New Script: VictoriaMetrics [@tremor021](https://github.com/tremor021) ([#2565](https://github.com/community-scripts/ProxmoxVE/pull/2565)) +- New Script: Authelia [@thost96](https://github.com/thost96) ([#2060](https://github.com/community-scripts/ProxmoxVE/pull/2060)) +- New Script: Jupyter Notebook [@Dave-code-creater](https://github.com/Dave-code-creater) ([#2561](https://github.com/community-scripts/ProxmoxVE/pull/2561)) + +### 🐞 Bug Fixes + +- Fix Docmost: default upload size and saving data when updating [@bvdberg01](https://github.com/bvdberg01) ([#2598](https://github.com/community-scripts/ProxmoxVE/pull/2598)) +- Fix: homarr db migration [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2575](https://github.com/community-scripts/ProxmoxVE/pull/2575)) +- Fix: Wireguard - Restart wgdashboard automatically after update [@LostALice](https://github.com/LostALice) ([#2587](https://github.com/community-scripts/ProxmoxVE/pull/2587)) +- Fix: Authelia Unbound Variable Argon2id [@MickLesk](https://github.com/MickLesk) ([#2604](https://github.com/community-scripts/ProxmoxVE/pull/2604)) +- Fix: Omada check for AVX Support and use the correct MongoDB Version [@MickLesk](https://github.com/MickLesk) ([#2600](https://github.com/community-scripts/ProxmoxVE/pull/2600)) +- Fix: Update-Script Firefly III based on their docs [@MickLesk](https://github.com/MickLesk) ([#2534](https://github.com/community-scripts/ProxmoxVE/pull/2534)) + +### ✨ New Features + +- Feature: Template-Check, Better Handling of Downloads, Better Network… [@MickLesk](https://github.com/MickLesk) ([#2592](https://github.com/community-scripts/ProxmoxVE/pull/2592)) +- Feature: Possibility to perform updates in silent / verbose (+ logging) [@MickLesk](https://github.com/MickLesk) ([#2583](https://github.com/community-scripts/ProxmoxVE/pull/2583)) +- Feature: Use Verbose Mode for all Scripts (removed &>/dev/null) [@MickLesk](https://github.com/MickLesk) ([#2596](https://github.com/community-scripts/ProxmoxVE/pull/2596)) + +### 🌐 Website + +- Fix: Authelia - Make user enter their domain manually [@tremor021](https://github.com/tremor021) ([#2618](https://github.com/community-scripts/ProxmoxVE/pull/2618)) +- Website: Change Info for PiHole Password [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2602](https://github.com/community-scripts/ProxmoxVE/pull/2602)) +- Fix: Jupyter Json (missing logo & improve name on website) [@MickLesk](https://github.com/MickLesk) ([#2584](https://github.com/community-scripts/ProxmoxVE/pull/2584)) + +### 🧰 Maintenance + +- [gh] Update Script Test Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2599](https://github.com/community-scripts/ProxmoxVE/pull/2599)) +- [gh] Contributor-Guide: Update AppName.md & AppName.sh [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2603](https://github.com/community-scripts/ProxmoxVE/pull/2603)) + +## 2025-02-23 + +### Changes + +### 🆕 New Scripts + +- New Script: Hev socks5 server [@miviro](https://github.com/miviro) ([#2454](https://github.com/community-scripts/ProxmoxVE/pull/2454)) +- New Script: bolt.diy [@tremor021](https://github.com/tremor021) ([#2528](https://github.com/community-scripts/ProxmoxVE/pull/2528)) + +### 🚀 Updated Scripts + +- Fix: Wireguard - Remove setting NAT as its already in PostUp/Down [@tremor021](https://github.com/tremor021) ([#2510](https://github.com/community-scripts/ProxmoxVE/pull/2510)) + +### 🌐 Website + +- Fix: Home Assistant Core - fixed wrong text in application description on website [@TMigue](https://github.com/TMigue) ([#2576](https://github.com/community-scripts/ProxmoxVE/pull/2576)) + +## 2025-02-22 + +### Changes + +### 🌐 Website + +- Fix a few broken icon links [@Snarkenfaugister](https://github.com/Snarkenfaugister) ([#2548](https://github.com/community-scripts/ProxmoxVE/pull/2548)) + +### 🧰 Maintenance + +- Fix: URL's in CONTRIBUTING.md [@bvdberg01](https://github.com/bvdberg01) ([#2552](https://github.com/community-scripts/ProxmoxVE/pull/2552)) + +## 2025-02-21 + +### Changes + +### 🚀 Updated Scripts + +- Add ZFS to Podman. Now it works on ZFS! [@jaminmc](https://github.com/jaminmc) ([#2526](https://github.com/community-scripts/ProxmoxVE/pull/2526)) +- Fix: Tianji - Downgrade Node [@MickLesk](https://github.com/MickLesk) ([#2530](https://github.com/community-scripts/ProxmoxVE/pull/2530)) + +### 🧰 Maintenance + +- [gh] General Cleanup & Moving Files / Folders [@MickLesk](https://github.com/MickLesk) ([#2532](https://github.com/community-scripts/ProxmoxVE/pull/2532)) + +## 2025-02-20 + +### Changes + +### 💥 Breaking Changes + +- Breaking: Actual Budget Script (HTTPS / DB Migration / New Structure) - Read Description [@MickLesk](https://github.com/MickLesk) ([#2496](https://github.com/community-scripts/ProxmoxVE/pull/2496)) +- Pihole & Unbound: Installation for Pihole V6 (read description) [@MickLesk](https://github.com/MickLesk) ([#2505](https://github.com/community-scripts/ProxmoxVE/pull/2505)) + +### ✨ New Scripts + +- New Script: Dolibarr [@tremor021](https://github.com/tremor021) ([#2502](https://github.com/community-scripts/ProxmoxVE/pull/2502)) + +### 🚀 Updated Scripts + +- Fix: Pingvin Share - Update not copying to correct directory [@tremor021](https://github.com/tremor021) ([#2521](https://github.com/community-scripts/ProxmoxVE/pull/2521)) +- WikiJS: Prepare for Using PostgreSQL [@MickLesk](https://github.com/MickLesk) ([#2516](https://github.com/community-scripts/ProxmoxVE/pull/2516)) + +### 🧰 Maintenance + +- [gh] better handling of labels [@MickLesk](https://github.com/MickLesk) ([#2517](https://github.com/community-scripts/ProxmoxVE/pull/2517)) + +## 2025-02-19 + +### Changes + +### 🚀 Updated Scripts + +- Fix: file replacement in Watcharr Update Script [@Clusters](https://github.com/Clusters) ([#2498](https://github.com/community-scripts/ProxmoxVE/pull/2498)) +- Fix: Kometa - fixed successful setup message and added info to json [@tremor021](https://github.com/tremor021) ([#2495](https://github.com/community-scripts/ProxmoxVE/pull/2495)) +- Fix: Actual Budget, add missing .env when updating [@MickLesk](https://github.com/MickLesk) ([#2494](https://github.com/community-scripts/ProxmoxVE/pull/2494)) + +## 2025-02-18 + +### Changes + +### ✨ New Scripts + +- New Script: Docmost [@MickLesk](https://github.com/MickLesk) ([#2472](https://github.com/community-scripts/ProxmoxVE/pull/2472)) + +### 🚀 Updated Scripts + +- Fix: SQL Server 2022 | GPG & Install [@MickLesk](https://github.com/MickLesk) ([#2476](https://github.com/community-scripts/ProxmoxVE/pull/2476)) +- Feature: PBS Bare Metal Installation - Allow Microcode [@MickLesk](https://github.com/MickLesk) ([#2477](https://github.com/community-scripts/ProxmoxVE/pull/2477)) +- Fix: MagicMirror force Node version and fix backups [@tremor021](https://github.com/tremor021) ([#2468](https://github.com/community-scripts/ProxmoxVE/pull/2468)) +- Update BunkerWeb scripts to latest NGINX and specs [@TheophileDiot](https://github.com/TheophileDiot) ([#2466](https://github.com/community-scripts/ProxmoxVE/pull/2466)) + +## 2025-02-17 + +### Changes + +### 💥 Breaking Changes + +- Zipline: Prepare for Version 4.0.0 [@MickLesk](https://github.com/MickLesk) ([#2455](https://github.com/community-scripts/ProxmoxVE/pull/2455)) + +### 🚀 Updated Scripts + +- Fix: Zipline increase SECRET to 42 chars [@V1d1o7](https://github.com/V1d1o7) ([#2444](https://github.com/community-scripts/ProxmoxVE/pull/2444)) + +## 2025-02-16 + +### Changes + +### 🚀 Updated Scripts + +- Fix: Typo in Ubuntu 24.10 VM Script [@PhoenixEmik](https://github.com/PhoenixEmik) ([#2430](https://github.com/community-scripts/ProxmoxVE/pull/2430)) +- Fix: Grist update no longer removes previous user data [@cfurrow](https://github.com/cfurrow) ([#2428](https://github.com/community-scripts/ProxmoxVE/pull/2428)) + +### 🌐 Website + +- Debian icon update [@bannert1337](https://github.com/bannert1337) ([#2433](https://github.com/community-scripts/ProxmoxVE/pull/2433)) +- Update Graylog icon [@bannert1337](https://github.com/bannert1337) ([#2434](https://github.com/community-scripts/ProxmoxVE/pull/2434)) + +## 2025-02-15 + +### Changes + +### 🚀 Updated Scripts + +- Setup cron in install/freshrss-install.sh [@zimmra](https://github.com/zimmra) ([#2412](https://github.com/community-scripts/ProxmoxVE/pull/2412)) +- Fix: Homarr update service files [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2416](https://github.com/community-scripts/ProxmoxVE/pull/2416)) +- Update MagicMirror install and update scripts [@tremor021](https://github.com/tremor021) ([#2409](https://github.com/community-scripts/ProxmoxVE/pull/2409)) + +### 🌐 Website + +- Fix RustDesk slug in json [@tremor021](https://github.com/tremor021) ([#2411](https://github.com/community-scripts/ProxmoxVE/pull/2411)) + +### 🧰 Maintenance + +- [GH] Update script-test Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2415](https://github.com/community-scripts/ProxmoxVE/pull/2415)) + +## 2025-02-14 + +### Changes + +### 🚀 Updated Scripts + +- Fix homarr [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2369](https://github.com/community-scripts/ProxmoxVE/pull/2369)) + +### 🌐 Website + +- RustDesk Server - Added configuration guide to json [@tremor021](https://github.com/tremor021) ([#2389](https://github.com/community-scripts/ProxmoxVE/pull/2389)) + +### 🧰 Maintenance + +- [gh] Update script-test.yml [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2399](https://github.com/community-scripts/ProxmoxVE/pull/2399)) +- [gh] Introducing new Issue Github Template Feature (Bug, Feature, Task) [@MickLesk](https://github.com/MickLesk) ([#2394](https://github.com/community-scripts/ProxmoxVE/pull/2394)) + +### 📡 API + +- [API]Add more enpoints to API [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2390](https://github.com/community-scripts/ProxmoxVE/pull/2390)) +- [API] Update api.func: Remove unwanted file creation [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2378](https://github.com/community-scripts/ProxmoxVE/pull/2378)) + +## 2025-02-13 + +### Changes + +### ✨ New Scripts + +- Re-Add: Pf2eTools [@MickLesk](https://github.com/MickLesk) ([#2336](https://github.com/community-scripts/ProxmoxVE/pull/2336)) +- New Script: Nx Witness [@MickLesk](https://github.com/MickLesk) ([#2350](https://github.com/community-scripts/ProxmoxVE/pull/2350)) +- New Script: RustDesk Server [@tremor021](https://github.com/tremor021) ([#2326](https://github.com/community-scripts/ProxmoxVE/pull/2326)) +- New Script: MinIO [@MickLesk](https://github.com/MickLesk) ([#2333](https://github.com/community-scripts/ProxmoxVE/pull/2333)) + +### 🚀 Updated Scripts + +- Missing ";" in ct/trilium.sh [@Scorpoon](https://github.com/Scorpoon) ([#2380](https://github.com/community-scripts/ProxmoxVE/pull/2380)) +- Fix: Element Synapse - Fixed server listening on both localhost and 0.0.0.0 [@tremor021](https://github.com/tremor021) ([#2376](https://github.com/community-scripts/ProxmoxVE/pull/2376)) +- [core] cleanup (remove # App Default Values) [@MickLesk](https://github.com/MickLesk) ([#2356](https://github.com/community-scripts/ProxmoxVE/pull/2356)) +- Fix: Kometa - Increase RAM and HDD resources [@tremor021](https://github.com/tremor021) ([#2367](https://github.com/community-scripts/ProxmoxVE/pull/2367)) +- [core] cleanup (remove base_settings & unneeded comments) [@MickLesk](https://github.com/MickLesk) ([#2351](https://github.com/community-scripts/ProxmoxVE/pull/2351)) +- Fix: Authentik Embedded Outpost Upgrade [@vidonnus](https://github.com/vidonnus) ([#2327](https://github.com/community-scripts/ProxmoxVE/pull/2327)) +- Fix HomeAsisstant LXC: Use the latest versions of runlike with --use-volume-id [@genehand](https://github.com/genehand) ([#2325](https://github.com/community-scripts/ProxmoxVE/pull/2325)) + +### 🌐 Website + +- Fix: Zoraxy - now shows application as updateable on the website [@tremor021](https://github.com/tremor021) ([#2352](https://github.com/community-scripts/ProxmoxVE/pull/2352)) +- Fix script category name text alignment in ScriptAccordion [@BramSuurdje](https://github.com/BramSuurdje) ([#2342](https://github.com/community-scripts/ProxmoxVE/pull/2342)) + +### 🧰 Maintenance + +- [gh] Remove unwanted output from script test workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2337](https://github.com/community-scripts/ProxmoxVE/pull/2337)) +- [gh] Workflow to change date on new json files [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2319](https://github.com/community-scripts/ProxmoxVE/pull/2319)) + +## 2025-02-12 + +### Changes + +### 💥 Breaking Changes + +- Frigate: Use Fixed Version 14 [@MickLesk](https://github.com/MickLesk) ([#2288](https://github.com/community-scripts/ProxmoxVE/pull/2288)) + +### ✨ New Scripts + +- New Script: Kometa [@tremor021](https://github.com/tremor021) ([#2281](https://github.com/community-scripts/ProxmoxVE/pull/2281)) +- New Script: Excalidraw [@tremor021](https://github.com/tremor021) ([#2285](https://github.com/community-scripts/ProxmoxVE/pull/2285)) +- New Script: Graylog [@tremor021](https://github.com/tremor021) ([#2270](https://github.com/community-scripts/ProxmoxVE/pull/2270)) +- New Script: TasmoCompiler [@tremor021](https://github.com/tremor021) ([#2235](https://github.com/community-scripts/ProxmoxVE/pull/2235)) +- New script: cross-seed [@jmatraszek](https://github.com/jmatraszek) ([#2186](https://github.com/community-scripts/ProxmoxVE/pull/2186)) + +### 🚀 Updated Scripts + +- FIX: Frigate - remove bad variable [@tremor021](https://github.com/tremor021) ([#2323](https://github.com/community-scripts/ProxmoxVE/pull/2323)) +- Fix: Kometa - Fix wrong web site address [@tremor021](https://github.com/tremor021) ([#2318](https://github.com/community-scripts/ProxmoxVE/pull/2318)) +- Fix: var_tags instead of TAGS in some CT's [@MickLesk](https://github.com/MickLesk) ([#2310](https://github.com/community-scripts/ProxmoxVE/pull/2310)) +- Update ubuntu2410-vm.sh: Fix typo in API call. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2305](https://github.com/community-scripts/ProxmoxVE/pull/2305)) +- Fix: Myspeed Installation (g++) [@MickLesk](https://github.com/MickLesk) ([#2308](https://github.com/community-scripts/ProxmoxVE/pull/2308)) +- Fix: Pingvin wrong variable used for version tracking [@alberanid](https://github.com/alberanid) ([#2302](https://github.com/community-scripts/ProxmoxVE/pull/2302)) +- Fix: SQL Server 2022 - remove unnecessary sudo [@tremor021](https://github.com/tremor021) ([#2282](https://github.com/community-scripts/ProxmoxVE/pull/2282)) +- fix: frigate pin version [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2296](https://github.com/community-scripts/ProxmoxVE/pull/2296)) +- Fix changedetection: Correct Browser install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2277](https://github.com/community-scripts/ProxmoxVE/pull/2277)) +- Paperless-AI: add dependency "make" [@MickLesk](https://github.com/MickLesk) ([#2289](https://github.com/community-scripts/ProxmoxVE/pull/2289)) +- Fix: Typo OPNsense VM [@chpego](https://github.com/chpego) ([#2291](https://github.com/community-scripts/ProxmoxVE/pull/2291)) +- Fix: CraftyControler fix java default [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2286](https://github.com/community-scripts/ProxmoxVE/pull/2286)) + +### 🌐 Website + +- Fix: some jsons (debian instead Debian in OS) [@MickLesk](https://github.com/MickLesk) ([#2311](https://github.com/community-scripts/ProxmoxVE/pull/2311)) +- Website: Add After-Install Note for Ubuntu VM 22.04/24.04/24.10 and Debian VM [@MickLesk](https://github.com/MickLesk) ([#2307](https://github.com/community-scripts/ProxmoxVE/pull/2307)) +- Fix: duplicate 'VM' name in opnsense-vm.json [@nayzm](https://github.com/nayzm) ([#2293](https://github.com/community-scripts/ProxmoxVE/pull/2293)) + +## 2025-02-11 + +### Changes + +### ✨ New Scripts + +- New Script: Opnsense VM [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2097](https://github.com/community-scripts/ProxmoxVE/pull/2097)) +- New Script: Watcharr [@tremor021](https://github.com/tremor021) ([#2243](https://github.com/community-scripts/ProxmoxVE/pull/2243)) +- New Script: Suwayomi-Server [@tremor021](https://github.com/tremor021) ([#2139](https://github.com/community-scripts/ProxmoxVE/pull/2139)) + +### 🚀 Updated Scripts + +- Fix Photoprism: Add defaults.yml for CLI Tool [@MickLesk](https://github.com/MickLesk) ([#2261](https://github.com/community-scripts/ProxmoxVE/pull/2261)) +- Update Checkmk: include Patch versions in Release grepping [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2264](https://github.com/community-scripts/ProxmoxVE/pull/2264)) +- Fix: Apache Guacamole Version Crawling - only latest Version [@MickLesk](https://github.com/MickLesk) ([#2258](https://github.com/community-scripts/ProxmoxVE/pull/2258)) + +### 🌐 Website + +- Update Komodo icon [@bannert1337](https://github.com/bannert1337) ([#2263](https://github.com/community-scripts/ProxmoxVE/pull/2263)) + +### 🧰 Maintenance + +- Add Workflow to test Scripts [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2269](https://github.com/community-scripts/ProxmoxVE/pull/2269)) + +## 2025-02-10 + +### Changes + +### 💥 Breaking Changes + +- [Fix] Filebrowser - Add Static Path for DB [@MickLesk](https://github.com/MickLesk) ([#2207](https://github.com/community-scripts/ProxmoxVE/pull/2207)) + +### ✨ New Scripts + +- New Script: Prometheus Paperless-NGX Exporter [@andygrunwald](https://github.com/andygrunwald) ([#2153](https://github.com/community-scripts/ProxmoxVE/pull/2153)) +- New Script: Proxmox Mail Gateway [@thost96](https://github.com/thost96) ([#1906](https://github.com/community-scripts/ProxmoxVE/pull/1906)) +- New Script: FreshRSS [@bvdberg01](https://github.com/bvdberg01) ([#2226](https://github.com/community-scripts/ProxmoxVE/pull/2226)) +- New Script: Zitadel [@dave-yap](https://github.com/dave-yap) ([#2141](https://github.com/community-scripts/ProxmoxVE/pull/2141)) + +### 🚀 Updated Scripts + +- Feature: Automatic Deletion of choosen LXC's (lxc-delete.sh) [@MickLesk](https://github.com/MickLesk) ([#2228](https://github.com/community-scripts/ProxmoxVE/pull/2228)) +- Quickfix: Crafty-Controller remove unnecessary \ [@MickLesk](https://github.com/MickLesk) ([#2233](https://github.com/community-scripts/ProxmoxVE/pull/2233)) +- Fix: Crafty-Controller java versions and set default [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2199](https://github.com/community-scripts/ProxmoxVE/pull/2199)) +- Feature: Add optional Port for Filebrowser [@MickLesk](https://github.com/MickLesk) ([#2224](https://github.com/community-scripts/ProxmoxVE/pull/2224)) +- [core] Prevent double spinner [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2203](https://github.com/community-scripts/ProxmoxVE/pull/2203)) + +### 🌐 Website + +- Website: Fix Zitadel Logo & Created-Date [@MickLesk](https://github.com/MickLesk) ([#2217](https://github.com/community-scripts/ProxmoxVE/pull/2217)) +- Fixed URL typo zerotier-one.json [@Divaksh](https://github.com/Divaksh) ([#2206](https://github.com/community-scripts/ProxmoxVE/pull/2206)) +- evcc.json Clarify the config file location [@mvdw](https://github.com/mvdw) ([#2193](https://github.com/community-scripts/ProxmoxVE/pull/2193)) + +### 🧰 Maintenance + +- [gh]: Improve Workflows, Templates, Handling [@MickLesk](https://github.com/MickLesk) ([#2214](https://github.com/community-scripts/ProxmoxVE/pull/2214)) +- [core] Fix app-header workflow and add API [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2204](https://github.com/community-scripts/ProxmoxVE/pull/2204)) +- Fix: "read -p" does not support color formatting [@PhoenixEmik](https://github.com/PhoenixEmik) ([#2191](https://github.com/community-scripts/ProxmoxVE/pull/2191)) +- [API] Add API to vms [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2021](https://github.com/community-scripts/ProxmoxVE/pull/2021)) + +## 2025-02-09 + +### Changed + +### ✨ New Scripts + +- New Script: pbs_microcode.sh [@DonPablo1010](https://github.com/DonPablo1010) ([#2166](https://github.com/community-scripts/ProxmoxVE/pull/2166)) + +### 🚀 Updated Scripts + +- Keep the same hass_config volume for Home Assistant [@genehand](https://github.com/genehand) ([#2160](https://github.com/community-scripts/ProxmoxVE/pull/2160)) + +### 🌐 Website + +- Website: Set new Logo for Paperless-AI [@MickLesk](https://github.com/MickLesk) ([#2194](https://github.com/community-scripts/ProxmoxVE/pull/2194)) +- Fix: Barcode Buddy Logo & Title [@MickLesk](https://github.com/MickLesk) ([#2183](https://github.com/community-scripts/ProxmoxVE/pull/2183)) + +## 2025-02-08 + +### Changed + +### ✨ New Scripts + +- New script: Barcode Buddy [@bvdberg01](https://github.com/bvdberg01) ([#2167](https://github.com/community-scripts/ProxmoxVE/pull/2167)) + +### 🚀 Updated Scripts + +- Fix: Actualbudget - salvage the `.migrate` file when upgrading [@bourquep](https://github.com/bourquep) ([#2173](https://github.com/community-scripts/ProxmoxVE/pull/2173)) + +### 🌐 Website + +- Update cosmos.json description [@BramSuurdje](https://github.com/BramSuurdje) ([#2162](https://github.com/community-scripts/ProxmoxVE/pull/2162)) + +### 🧰 Maintenance + +- fix typos in CONTRIBUTOR_GUIDE [@thomashondema](https://github.com/thomashondema) ([#2174](https://github.com/community-scripts/ProxmoxVE/pull/2174)) + +## 2025-02-07 - 10.000 ⭐ + +### Changed + +### 💥 Breaking Changes + +- [core]: Enhance LXC template handling and improve error recovery [@MickLesk](https://github.com/MickLesk) ([#2128](https://github.com/community-scripts/ProxmoxVE/pull/2128)) + +### ✨ New Scripts + +- New Script: Cosmos [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2120](https://github.com/community-scripts/ProxmoxVE/pull/2120)) +- New Script: SearXNG [@MickLesk](https://github.com/MickLesk) ([#2123](https://github.com/community-scripts/ProxmoxVE/pull/2123)) + +### 🚀 Updated Scripts + +- Fix: Trillium Update Function & Harmonize Installation [@MickLesk](https://github.com/MickLesk) ([#2148](https://github.com/community-scripts/ProxmoxVE/pull/2148)) +- Fix: Zerotier-One fixed missing dependency [@tremor021](https://github.com/tremor021) ([#2147](https://github.com/community-scripts/ProxmoxVE/pull/2147)) +- Fix: Openwrt Version checking [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2137](https://github.com/community-scripts/ProxmoxVE/pull/2137)) +- Fix: PeaNUT Increase HDD & RAM Size [@MickLesk](https://github.com/MickLesk) ([#2127](https://github.com/community-scripts/ProxmoxVE/pull/2127)) + +### 🌐 Website + +- Fix: Zerotier json had a bad script path [@tremor021](https://github.com/tremor021) ([#2144](https://github.com/community-scripts/ProxmoxVE/pull/2144)) +- Fix: Cosmos logo doesnt display on website [@MickLesk](https://github.com/MickLesk) ([#2132](https://github.com/community-scripts/ProxmoxVE/pull/2132)) +- Fix JSON-Editor [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2121](https://github.com/community-scripts/ProxmoxVE/pull/2121)) + +### 🧰 Maintenance + +- [gh]: Following the trend - add star-history in readme [@MickLesk](https://github.com/MickLesk) ([#2135](https://github.com/community-scripts/ProxmoxVE/pull/2135)) + +## 2025-02-06 + +### Changed + +### ✨ New Scripts + +- New Script: Duplicati [@tremor021](https://github.com/tremor021) ([#2052](https://github.com/community-scripts/ProxmoxVE/pull/2052)) +- New Script: Paperless-AI [@MickLesk](https://github.com/MickLesk) ([#2093](https://github.com/community-scripts/ProxmoxVE/pull/2093)) +- New Script: Apache Tika [@andygrunwald](https://github.com/andygrunwald) ([#2079](https://github.com/community-scripts/ProxmoxVE/pull/2079)) + +### 🚀 Updated Scripts + +- Fix: Alpine IT-Tools Update [@MickLesk](https://github.com/MickLesk) ([#2067](https://github.com/community-scripts/ProxmoxVE/pull/2067)) +- Fix: Pocket-ID Change link to GH Repo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2082](https://github.com/community-scripts/ProxmoxVE/pull/2082)) + +### 🌐 Website + +- Refactor JSON generator buttons layout for better alignment and consistency [@BramSuurdje](https://github.com/BramSuurdje) ([#2106](https://github.com/community-scripts/ProxmoxVE/pull/2106)) +- Website: Refactor Footer for improved layout and styling consistency [@BramSuurdje](https://github.com/BramSuurdje) ([#2107](https://github.com/community-scripts/ProxmoxVE/pull/2107)) +- Website: Update Footer for Json-Editor & Api [@MickLesk](https://github.com/MickLesk) ([#2100](https://github.com/community-scripts/ProxmoxVE/pull/2100)) +- Website: Add Download for json-editor [@MickLesk](https://github.com/MickLesk) ([#2099](https://github.com/community-scripts/ProxmoxVE/pull/2099)) +- Radicale: Provide additional information about configuration [@tremor021](https://github.com/tremor021) ([#2072](https://github.com/community-scripts/ProxmoxVE/pull/2072)) + +## 2025-02-05 + +### Changed + +### ✨ New Scripts + +- New Script: Zerotier Controller [@tremor021](https://github.com/tremor021) ([#1928](https://github.com/community-scripts/ProxmoxVE/pull/1928)) +- New Script: Radicale [@tremor021](https://github.com/tremor021) ([#1941](https://github.com/community-scripts/ProxmoxVE/pull/1941)) +- New Script: seelf [@tremor021](https://github.com/tremor021) ([#2023](https://github.com/community-scripts/ProxmoxVE/pull/2023)) +- New Script: Crafty-Controller [@CrazyWolf13](https://github.com/CrazyWolf13) ([#1926](https://github.com/community-scripts/ProxmoxVE/pull/1926)) +- New script: Koillection [@bvdberg01](https://github.com/bvdberg01) ([#2031](https://github.com/community-scripts/ProxmoxVE/pull/2031)) + +### 🚀 Updated Scripts + +- Bugfix: Jellyseerr pnpm Version [@vidonnus](https://github.com/vidonnus) ([#2033](https://github.com/community-scripts/ProxmoxVE/pull/2033)) +- Radicale: Fixed missing htpasswd flag [@tremor021](https://github.com/tremor021) ([#2065](https://github.com/community-scripts/ProxmoxVE/pull/2065)) +- [API] Update build.func / Improve error messages #2 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2050](https://github.com/community-scripts/ProxmoxVE/pull/2050)) +- [API] Update create-lxc.sh / Improve error messages #1 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2049](https://github.com/community-scripts/ProxmoxVE/pull/2049)) +- Feature: Element Synapse: add option to enter server name during LXC installation [@tremor021](https://github.com/tremor021) ([#2038](https://github.com/community-scripts/ProxmoxVE/pull/2038)) + +### 🌐 Website + +- Paperless NGX: Mark it as updateable [@andygrunwald](https://github.com/andygrunwald) ([#2070](https://github.com/community-scripts/ProxmoxVE/pull/2070)) +- Bump vitest from 2.1.6 to 2.1.9 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#2042](https://github.com/community-scripts/ProxmoxVE/pull/2042)) + +### 🧰 Maintenance + +- [API] Add API backend code [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2040](https://github.com/community-scripts/ProxmoxVE/pull/2040)) +- Update auto-update-app-headers.yml: Enable auto approval [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2057](https://github.com/community-scripts/ProxmoxVE/pull/2057)) + +## 2025-02-04 + +### Changed + +### 💥 Breaking Changes + +- Rename & Optimize: Proxmox Backup Server (Renaming & Update fix) [@thost96](https://github.com/thost96) ([#2012](https://github.com/community-scripts/ProxmoxVE/pull/2012)) + +### 🚀 Updated Scripts + +- Fix: Authentik - Remove deprecated GO-Remove in Footer [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2020](https://github.com/community-scripts/ProxmoxVE/pull/2020)) +- Fix: Authentik Fix wrong HDD Size [@thost96](https://github.com/thost96) ([#2001](https://github.com/community-scripts/ProxmoxVE/pull/2001)) +- Fix: Tandoor - node Version [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2010](https://github.com/community-scripts/ProxmoxVE/pull/2010)) +- Fix actual update - missing hidden files, downloaded release cleanup [@maciejmatczak](https://github.com/maciejmatczak) ([#2027](https://github.com/community-scripts/ProxmoxVE/pull/2027)) +- Fix Script: post-pmg-install.sh [@thost96](https://github.com/thost96) ([#2022](https://github.com/community-scripts/ProxmoxVE/pull/2022)) +- Fix Tianji: Add heap-space value for nodejs [@MickLesk](https://github.com/MickLesk) ([#2011](https://github.com/community-scripts/ProxmoxVE/pull/2011)) +- Fix: Ghost LXC - Use Node20 [@MickLesk](https://github.com/MickLesk) ([#2006](https://github.com/community-scripts/ProxmoxVE/pull/2006)) + +### 🌐 Website + +- [API] Massive update to api (remove many, optimize website for users) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1990](https://github.com/community-scripts/ProxmoxVE/pull/1990)) + +### 🧰 Maintenance + +- Fix header comments on contributor templates [@tremor021](https://github.com/tremor021) ([#2029](https://github.com/community-scripts/ProxmoxVE/pull/2029)) +- [Fix]: Headername of Proxmox-Datacenter-Manager not in CamelCase [@MickLesk](https://github.com/MickLesk) ([#2017](https://github.com/community-scripts/ProxmoxVE/pull/2017)) +- [Fix] Header breaks at long title - add width for figlet github action [@MickLesk](https://github.com/MickLesk) ([#2015](https://github.com/community-scripts/ProxmoxVE/pull/2015)) + +## 2025-02-03 + +### Changed + +### ✨ New Scripts + +- New Script: Element Synapse [@tremor021](https://github.com/tremor021) ([#1955](https://github.com/community-scripts/ProxmoxVE/pull/1955)) +- New Script: Privatebin [@opastorello](https://github.com/opastorello) ([#1925](https://github.com/community-scripts/ProxmoxVE/pull/1925)) + +### 🚀 Updated Scripts + +- Fix: Monica Install with nodejs [@MickLesk](https://github.com/MickLesk) ([#1996](https://github.com/community-scripts/ProxmoxVE/pull/1996)) +- Element Synapse sed fix [@tremor021](https://github.com/tremor021) ([#1994](https://github.com/community-scripts/ProxmoxVE/pull/1994)) +- Fix Hoarder corepack install/update error [@vhsdream](https://github.com/vhsdream) ([#1957](https://github.com/community-scripts/ProxmoxVE/pull/1957)) +- [Security & Maintenance] Update NodeJS Repo to 22 for new Installs [@MickLesk](https://github.com/MickLesk) ([#1984](https://github.com/community-scripts/ProxmoxVE/pull/1984)) +- [Standardization]: Same Setup for GoLang on all LXC's & Clear Tarball [@MickLesk](https://github.com/MickLesk) ([#1977](https://github.com/community-scripts/ProxmoxVE/pull/1977)) +- Feature: urbackupserver Include fuse&nesting features during install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1968](https://github.com/community-scripts/ProxmoxVE/pull/1968)) +- Fix: MSSQL-Server: Better gpg handling [@MickLesk](https://github.com/MickLesk) ([#1962](https://github.com/community-scripts/ProxmoxVE/pull/1962)) +- Fix: Grist ran into a heap space during the update [@MickLesk](https://github.com/MickLesk) ([#1964](https://github.com/community-scripts/ProxmoxVE/pull/1964)) +- Fix: FS-Trim Cancel / Error-Button [@MickLesk](https://github.com/MickLesk) ([#1965](https://github.com/community-scripts/ProxmoxVE/pull/1965)) +- Fix: Increase HDD Space for Hoarder [@MickLesk](https://github.com/MickLesk) ([#1970](https://github.com/community-scripts/ProxmoxVE/pull/1970)) +- Feature: Clean Orphan LVM without CEPH [@MickLesk](https://github.com/MickLesk) ([#1974](https://github.com/community-scripts/ProxmoxVE/pull/1974)) +- [Standardization] Fix Spelling for "Setup Python3" [@MickLesk](https://github.com/MickLesk) ([#1975](https://github.com/community-scripts/ProxmoxVE/pull/1975)) + +### 🌐 Website + +- [Website] update data/page.tsx [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1969](https://github.com/community-scripts/ProxmoxVE/pull/1969)) +- Prometheus Proxmox VE Exporter: Set correct website slug [@andygrunwald](https://github.com/andygrunwald) ([#1961](https://github.com/community-scripts/ProxmoxVE/pull/1961)) + +### 🧰 Maintenance + +- [API] Remove Hostname, Verbose, SSH and TAGS [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1967](https://github.com/community-scripts/ProxmoxVE/pull/1967)) + +## 2025-02-02 + +### Changed + +### 🚀 Updated Scripts + +- Prometheus PVE Exporter: Add `--default-timeout=300` to pip install commands [@andygrunwald](https://github.com/andygrunwald) ([#1950](https://github.com/community-scripts/ProxmoxVE/pull/1950)) +- fix z2m update function to 2.1.0 [@MickLesk](https://github.com/MickLesk) ([#1938](https://github.com/community-scripts/ProxmoxVE/pull/1938)) + +### 🧰 Maintenance + +- VSCode: Add Shellscript Syntax highlighting for *.func files [@andygrunwald](https://github.com/andygrunwald) ([#1948](https://github.com/community-scripts/ProxmoxVE/pull/1948)) + +## 2025-02-01 + +### Changed + +### 💥 Breaking Changes + +- [DCMA] Delete scripts 5etools and pf2etools - Copyright abuse [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1922](https://github.com/community-scripts/ProxmoxVE/pull/1922)) + +### ✨ New Scripts + +- New script: Baïkal [@bvdberg01](https://github.com/bvdberg01) ([#1913](https://github.com/community-scripts/ProxmoxVE/pull/1913)) + +### 🚀 Updated Scripts + +- Bug fix: Paymenter [@opastorello](https://github.com/opastorello) ([#1917](https://github.com/community-scripts/ProxmoxVE/pull/1917)) + +## 2025-01-31 + +### Changed + +### ✨ New Scripts + +- New Script: Paymenter [@opastorello](https://github.com/opastorello) ([#1827](https://github.com/community-scripts/ProxmoxVE/pull/1827)) + +### 🚀 Updated Scripts + +- [Fix] Alpine-IT-Tools, add missing ssh package for root ssh access [@CrazyWolf13](https://github.com/CrazyWolf13) ([#1891](https://github.com/community-scripts/ProxmoxVE/pull/1891)) +- [Fix] Change Download of Trilium after there change the tag/release logic [@MickLesk](https://github.com/MickLesk) ([#1892](https://github.com/community-scripts/ProxmoxVE/pull/1892)) + +### 🌐 Website + +- [Website] Enhance DataFetcher with better UI components and add reactive data fetching intervals [@BramSuurdje](https://github.com/BramSuurdje) ([#1902](https://github.com/community-scripts/ProxmoxVE/pull/1902)) +- [Website] Update /data/page.tsx [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1900](https://github.com/community-scripts/ProxmoxVE/pull/1900)) + +## 2025-01-30 + +### Changed + +### ✨ New Scripts + +- New Script: IT-Tools [@nicedevil007](https://github.com/nicedevil007) ([#1862](https://github.com/community-scripts/ProxmoxVE/pull/1862)) +- New Script: Mattermost [@Dracentis](https://github.com/Dracentis) ([#1856](https://github.com/community-scripts/ProxmoxVE/pull/1856)) + +### 🚀 Updated Scripts + +- Optimize PVE Manager Version-Check [@MickLesk](https://github.com/MickLesk) ([#1866](https://github.com/community-scripts/ProxmoxVE/pull/1866)) + +### 🌐 Website + +- [API] Update build.func to set the status message correct [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1878](https://github.com/community-scripts/ProxmoxVE/pull/1878)) +- [Website] Update /data/page.tsx [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1876](https://github.com/community-scripts/ProxmoxVE/pull/1876)) +- Fix IT-Tools Website Entry (Default | Alpine) [@MickLesk](https://github.com/MickLesk) ([#1869](https://github.com/community-scripts/ProxmoxVE/pull/1869)) +- fix: remove rounded styles from command primitive [@steveiliop56](https://github.com/steveiliop56) ([#1840](https://github.com/community-scripts/ProxmoxVE/pull/1840)) + +### 🧰 Maintenance + +- [API] Update build.func: add function to see if a script failed or not [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1874](https://github.com/community-scripts/ProxmoxVE/pull/1874)) + +## 2025-01-29 + +### Changed + +### ✨ New Scripts + +- New Script: Prometheus Proxmox VE Exporter [@andygrunwald](https://github.com/andygrunwald) ([#1805](https://github.com/community-scripts/ProxmoxVE/pull/1805)) +- New Script: Clean Orphaned LVM [@MickLesk](https://github.com/MickLesk) ([#1838](https://github.com/community-scripts/ProxmoxVE/pull/1838)) + +### 🌐 Website + +- Patch http Url to https in build.func and /data/page.tsx [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1849](https://github.com/community-scripts/ProxmoxVE/pull/1849)) +- [Frontend] Add /data to show API results [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1841](https://github.com/community-scripts/ProxmoxVE/pull/1841)) +- Update clean-orphaned-lvm.json [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1843](https://github.com/community-scripts/ProxmoxVE/pull/1843)) + +### 🧰 Maintenance + +- Update build.func [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1851](https://github.com/community-scripts/ProxmoxVE/pull/1851)) +- [Diagnostic] Introduced optional lxc install diagnostics via API call [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1801](https://github.com/community-scripts/ProxmoxVE/pull/1801)) + +## 2025-01-28 + +### Changed + +### 💥 Breaking Changes + +- Breaking Change: Homarr v1 (Read Guide) [@MickLesk](https://github.com/MickLesk) ([#1825](https://github.com/community-scripts/ProxmoxVE/pull/1825)) +- Update PingVin: Fix problem with update und switch to new method of getting files. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1819](https://github.com/community-scripts/ProxmoxVE/pull/1819)) + +### ✨ New Scripts + +- New script: Monica LXC [@bvdberg01](https://github.com/bvdberg01) ([#1813](https://github.com/community-scripts/ProxmoxVE/pull/1813)) +- New Script: NodeBB [@MickLesk](https://github.com/MickLesk) ([#1811](https://github.com/community-scripts/ProxmoxVE/pull/1811)) +- New Script: Pocket ID [@Snarkenfaugister](https://github.com/Snarkenfaugister) ([#1779](https://github.com/community-scripts/ProxmoxVE/pull/1779)) + +### 🚀 Updated Scripts + +- Update all Alpine LXC's to 3.21 (Docker, Grafana, Nextcloud, Vaultwarden, Zigbee2Mqtt, Alpine) [@MickLesk](https://github.com/MickLesk) ([#1803](https://github.com/community-scripts/ProxmoxVE/pull/1803)) +- [Standardization] Fix Spelling for "Setup Python3" [@MickLesk](https://github.com/MickLesk) ([#1810](https://github.com/community-scripts/ProxmoxVE/pull/1810)) + +### 🌐 Website + +- Filter out duplicate scripts in LatestScripts component and sort by creation date [@BramSuurdje](https://github.com/BramSuurdje) ([#1828](https://github.com/community-scripts/ProxmoxVE/pull/1828)) + +### 🧰 Maintenance + +- [core]: Remove Figlet | Get Headers by Repo & Store Local [@MickLesk](https://github.com/MickLesk) ([#1802](https://github.com/community-scripts/ProxmoxVE/pull/1802)) +- [docs] Update AppName.md: Make it clear where to change the URLs [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1809](https://github.com/community-scripts/ProxmoxVE/pull/1809)) + +## 2025-01-27 + +### Changed + +### ✨ New Scripts + +- New Script: Arch Linux VM [@MickLesk](https://github.com/MickLesk) ([#1780](https://github.com/community-scripts/ProxmoxVE/pull/1780)) + +### 🚀 Updated Scripts + +- Increase alpine-vaultwarden default var_disk size [@nayzm](https://github.com/nayzm) ([#1788](https://github.com/community-scripts/ProxmoxVE/pull/1788)) +- Added change of the mobile GUI to disable nag request [@GarryG](https://github.com/GarryG) ([#1785](https://github.com/community-scripts/ProxmoxVE/pull/1785)) + +### 🌐 Website + +- Update frontend alpine-vaultwarden hdd size and OS version [@nayzm](https://github.com/nayzm) ([#1789](https://github.com/community-scripts/ProxmoxVE/pull/1789)) +- Website: Add Description for Metadata Categories [@MickLesk](https://github.com/MickLesk) ([#1783](https://github.com/community-scripts/ProxmoxVE/pull/1783)) +- [Fix] Double "VM" on website (Arch Linux) [@lasharor](https://github.com/lasharor) ([#1782](https://github.com/community-scripts/ProxmoxVE/pull/1782)) + +## 2025-01-26 + +### Changed + +### 🚀 Updated Scripts + +- Fix jellyfin update command [@jcisio](https://github.com/jcisio) ([#1771](https://github.com/community-scripts/ProxmoxVE/pull/1771)) +- openHAB - Use https and include doc url [@moodyblue](https://github.com/moodyblue) ([#1766](https://github.com/community-scripts/ProxmoxVE/pull/1766)) +- Jellyfin: Fix default logging level [@tremor021](https://github.com/tremor021) ([#1768](https://github.com/community-scripts/ProxmoxVE/pull/1768)) +- Calibre-Web: added installation of calibre binaries [@tremor021](https://github.com/tremor021) ([#1763](https://github.com/community-scripts/ProxmoxVE/pull/1763)) +- Added environment variable to accept EULA for SQLServer2022 [@tremor021](https://github.com/tremor021) ([#1755](https://github.com/community-scripts/ProxmoxVE/pull/1755)) + +### 🌐 Website + +- The Lounge: Fix the command to create new users [@tremor021](https://github.com/tremor021) ([#1762](https://github.com/community-scripts/ProxmoxVE/pull/1762)) + +## 2025-01-24 + +### Changed + +### ✨ New Scripts + +- New Script: Ubuntu 24.10 VM [@MickLesk](https://github.com/MickLesk) ([#1711](https://github.com/community-scripts/ProxmoxVE/pull/1711)) + +### 🚀 Updated Scripts + +- openHAB - Update to Zulu21 [@moodyblue](https://github.com/moodyblue) ([#1734](https://github.com/community-scripts/ProxmoxVE/pull/1734)) +- Feature: Filebrowser Script > Redesign | Update Logic | Remove Logic [@MickLesk](https://github.com/MickLesk) ([#1716](https://github.com/community-scripts/ProxmoxVE/pull/1716)) +- Feature: Ubuntu 22.04 VM > Redesign | Optional HDD-Size Prompt [@MickLesk](https://github.com/MickLesk) ([#1712](https://github.com/community-scripts/ProxmoxVE/pull/1712)) +- Feature: Ubuntu 24.04 VM > Redesign | Optional HDD-Size Prompt | cifs support [@MickLesk](https://github.com/MickLesk) ([#1714](https://github.com/community-scripts/ProxmoxVE/pull/1714)) + +### 🧰 Maintenance + +- [Core] Better Creation of App Headers for next feature [@MickLesk](https://github.com/MickLesk) ([#1719](https://github.com/community-scripts/ProxmoxVE/pull/1719)) + +## 2025-01-23 + +### Changed + +### 🚀 Updated Scripts + +- Feature: Add Debian Disk Size / Redesign / Increase Disk [@MickLesk](https://github.com/MickLesk) ([#1695](https://github.com/community-scripts/ProxmoxVE/pull/1695)) +- Fix: Paperless Service Timings & Optimization: Ghostscript Installation [@MickLesk](https://github.com/MickLesk) ([#1688](https://github.com/community-scripts/ProxmoxVE/pull/1688)) + +### 🌐 Website + +- Refactor ScriptInfoBlocks and siteConfig to properly show the most populair scripts [@BramSuurdje](https://github.com/BramSuurdje) ([#1697](https://github.com/community-scripts/ProxmoxVE/pull/1697)) + +### 🧰 Maintenance + +- Update build.func: Ubuntu advanced settings version [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1701](https://github.com/community-scripts/ProxmoxVE/pull/1701)) + +## 2025-01-22 + +### Changed + +### 🚀 Updated Scripts + +- Tweak: LubeLogger Script Upcoming Changes 1.4.3 [@JcMinarro](https://github.com/JcMinarro) ([#1656](https://github.com/community-scripts/ProxmoxVE/pull/1656)) +- Fix: SQL Server 2022 Install [@MickLesk](https://github.com/MickLesk) ([#1669](https://github.com/community-scripts/ProxmoxVE/pull/1669)) + +### 🌐 Website + +- Refactor Sidebar component to display unique scripts count [@BramSuurdje](https://github.com/BramSuurdje) ([#1681](https://github.com/community-scripts/ProxmoxVE/pull/1681)) +- Refactor various components and configuration for mobile responsiveness. [@BramSuurdje](https://github.com/BramSuurdje) ([#1679](https://github.com/community-scripts/ProxmoxVE/pull/1679)) +- Add Docker-VM to Containers & Docker Category [@thost96](https://github.com/thost96) ([#1667](https://github.com/community-scripts/ProxmoxVE/pull/1667)) +- Moving SQL Server 2022 to database category [@CamronBorealis](https://github.com/CamronBorealis) ([#1659](https://github.com/community-scripts/ProxmoxVE/pull/1659)) + +## 2025-01-21 + +### Changed + +### ✨ New Scripts + +- Add new Script: LXC Delete (Proxmox) [@MickLesk](https://github.com/MickLesk) ([#1636](https://github.com/community-scripts/ProxmoxVE/pull/1636)) +- New script: ProjectSend [@bvdberg01](https://github.com/bvdberg01) ([#1616](https://github.com/community-scripts/ProxmoxVE/pull/1616)) +- New Script: Beszel [@Sinofage](https://github.com/Sinofage) ([#1619](https://github.com/community-scripts/ProxmoxVE/pull/1619)) +- New Script: Docker VM [@thost96](https://github.com/thost96) ([#1608](https://github.com/community-scripts/ProxmoxVE/pull/1608)) +- New script: SQL Server 2022 [@kris701](https://github.com/kris701) ([#1482](https://github.com/community-scripts/ProxmoxVE/pull/1482)) + +### 🚀 Updated Scripts + +- Fix: Teddycloud Script (install, clean up & update) [@MickLesk](https://github.com/MickLesk) ([#1652](https://github.com/community-scripts/ProxmoxVE/pull/1652)) +- Fix: Docker VM deprecated gpg [@MickLesk](https://github.com/MickLesk) ([#1649](https://github.com/community-scripts/ProxmoxVE/pull/1649)) +- ActualBudget: Fix Update-Function, Fix Wget Crawling, Add Versionscheck [@MickLesk](https://github.com/MickLesk) ([#1643](https://github.com/community-scripts/ProxmoxVE/pull/1643)) +- Fix Photoprism missing folder & environments [@MickLesk](https://github.com/MickLesk) ([#1639](https://github.com/community-scripts/ProxmoxVE/pull/1639)) +- Update MOTD: Add Dynamic IP with profile.d by @JcMinarro [@MickLesk](https://github.com/MickLesk) ([#1633](https://github.com/community-scripts/ProxmoxVE/pull/1633)) +- PBS.sh: Fix wrong URL after Setup [@thost96](https://github.com/thost96) ([#1629](https://github.com/community-scripts/ProxmoxVE/pull/1629)) + +### 🌐 Website + +- Bump vite from 6.0.1 to 6.0.11 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#1653](https://github.com/community-scripts/ProxmoxVE/pull/1653)) +- Update glpi.json [@opastorello](https://github.com/opastorello) ([#1641](https://github.com/community-scripts/ProxmoxVE/pull/1641)) +- Fix Docker-VM name on website [@Sinofage](https://github.com/Sinofage) ([#1630](https://github.com/community-scripts/ProxmoxVE/pull/1630)) + +## 2025-01-20 + +### Changed + +### ✨ New Scripts + +- New Script: UrBackup Server [@kris701](https://github.com/kris701) ([#1569](https://github.com/community-scripts/ProxmoxVE/pull/1569)) +- New Script: Proxmox Mail Gateway Post Installer [@thost96](https://github.com/thost96) ([#1559](https://github.com/community-scripts/ProxmoxVE/pull/1559)) + +### 🚀 Updated Scripts + +- Update Kimai Dependency: Use PHP 8.3 [@MickLesk](https://github.com/MickLesk) ([#1609](https://github.com/community-scripts/ProxmoxVE/pull/1609)) +- Feature: Add xCaddy for external Modules on Caddy-LXC [@MickLesk](https://github.com/MickLesk) ([#1613](https://github.com/community-scripts/ProxmoxVE/pull/1613)) +- Fix Pocketbase URL after install [@MickLesk](https://github.com/MickLesk) ([#1597](https://github.com/community-scripts/ProxmoxVE/pull/1597)) +- Unifi.sh fix wrong URL after Install [@thost96](https://github.com/thost96) ([#1601](https://github.com/community-scripts/ProxmoxVE/pull/1601)) + +### 🌐 Website + +- Update Website | Add new Categories [@MickLesk](https://github.com/MickLesk) ([#1606](https://github.com/community-scripts/ProxmoxVE/pull/1606)) +- Grafana: Mark container as updateable [@andygrunwald](https://github.com/andygrunwald) ([#1603](https://github.com/community-scripts/ProxmoxVE/pull/1603)) + +### 🧰 Maintenance + +- [core] Update build.func: Add defaults to Advanced mode [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1548](https://github.com/community-scripts/ProxmoxVE/pull/1548)) +- Update build.func: Fix Advanced Tags (Remove all if empty / overwrite if default cleared) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1612](https://github.com/community-scripts/ProxmoxVE/pull/1612)) +- Add new Check for LXC MaxKeys by @cricalix [@MickLesk](https://github.com/MickLesk) ([#1602](https://github.com/community-scripts/ProxmoxVE/pull/1602)) + +## 2025-01-19 + +### Changed + +### 🚀 Updated Scripts + +- Update Opengist.sh: Fix broken backup function [@bvdberg01](https://github.com/bvdberg01) ([#1572](https://github.com/community-scripts/ProxmoxVE/pull/1572)) + +## 2025-01-18 + +### Changed + +### 💥 Breaking Changes + +- **READ GUIDE FIRST** breaking change: Homeassistant-Core upgrade os and python3 [@MickLesk](https://github.com/MickLesk) ([#1550](https://github.com/community-scripts/ProxmoxVE/pull/1550)) +- Update Openwrt: Delete lines that do WAN input and forward accept [@chackl1990](https://github.com/chackl1990) ([#1540](https://github.com/community-scripts/ProxmoxVE/pull/1540)) + +### 🚀 Updated Scripts + +- added cifs support in ubuntu2404-vm.sh [@plonxyz](https://github.com/plonxyz) ([#1461](https://github.com/community-scripts/ProxmoxVE/pull/1461)) +- Fix linkwarden update [@burgerga](https://github.com/burgerga) ([#1565](https://github.com/community-scripts/ProxmoxVE/pull/1565)) +- [jellyseerr] Update nodejs if not up-to-date [@makstech](https://github.com/makstech) ([#1563](https://github.com/community-scripts/ProxmoxVE/pull/1563)) +- Update VM Tags [@oOStroudyOo](https://github.com/oOStroudyOo) ([#1562](https://github.com/community-scripts/ProxmoxVE/pull/1562)) +- Update apt-cacher-ng.sh: Typo/Missing $ [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1545](https://github.com/community-scripts/ProxmoxVE/pull/1545)) + +## 2025-01-16 + +### Changed + +### 💥 Breaking Changes + +- Update jellyseerr-install.sh to use Node 22 as required by latest Jellyseerr version [@pedrovieira](https://github.com/pedrovieira) ([#1535](https://github.com/community-scripts/ProxmoxVE/pull/1535)) + +### ✨ New Scripts + +- New script: Dotnet ASP.NET Web Server [@kris701](https://github.com/kris701) ([#1501](https://github.com/community-scripts/ProxmoxVE/pull/1501)) +- New script: phpIPAM [@bvdberg01](https://github.com/bvdberg01) ([#1503](https://github.com/community-scripts/ProxmoxVE/pull/1503)) + +### 🌐 Website + +- Add Mobile check for empty icon-url on website [@MickLesk](https://github.com/MickLesk) ([#1532](https://github.com/community-scripts/ProxmoxVE/pull/1532)) + +### 🧰 Maintenance + +- [Workflow]Update autolabeler-config.json [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1525](https://github.com/community-scripts/ProxmoxVE/pull/1525)) +- [core]Update update_json_date.yml [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1526](https://github.com/community-scripts/ProxmoxVE/pull/1526)) +- [core] Recreate Update JSON Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1523](https://github.com/community-scripts/ProxmoxVE/pull/1523)) + +## 2025-01-15 + +### Changed + +### 🚀 Updated Scripts + +- Fix: Add FFMPEG for OpenWebUI [@MickLesk](https://github.com/MickLesk) ([#1497](https://github.com/community-scripts/ProxmoxVE/pull/1497)) + +### 🧰 Maintenance + +- [core] build.func&install.func: Fix ssh keynot added error [@dsiebel](https://github.com/dsiebel) ([#1502](https://github.com/community-scripts/ProxmoxVE/pull/1502)) + +## 2025-01-14 + +### Changed + +### 💥 Breaking Changes + +- Update tianji-install.sh: Add OPENAI_API_KEY to .env [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1480](https://github.com/community-scripts/ProxmoxVE/pull/1480)) + +### ✨ New Scripts + +- New Script: Wordpress [@MickLesk](https://github.com/MickLesk) ([#1485](https://github.com/community-scripts/ProxmoxVE/pull/1485)) +- New Script: Opengist [@jd-apprentice](https://github.com/jd-apprentice) ([#1429](https://github.com/community-scripts/ProxmoxVE/pull/1429)) + +### 🚀 Updated Scripts + +- Update lazylibrarian-install.sh: Add pypdf libary [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1467](https://github.com/community-scripts/ProxmoxVE/pull/1467)) +- Update opengist-install.sh: Add git as dependencie [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1471](https://github.com/community-scripts/ProxmoxVE/pull/1471)) + +### 🌐 Website + +- [website] Update footer text [@rajatdiptabiswas](https://github.com/rajatdiptabiswas) ([#1466](https://github.com/community-scripts/ProxmoxVE/pull/1466)) + +### 🧰 Maintenance + +- Hotfix build.func: Error when tags are empty [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1492](https://github.com/community-scripts/ProxmoxVE/pull/1492)) +- [core] Update build.func: Fix bug with advanced tags [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1473](https://github.com/community-scripts/ProxmoxVE/pull/1473)) + +## 2025-01-13 + +### Changed + +### 💥 Breaking Changes + +- Update Hoarder: Improvement .env location (see PR comment for little migration) [@MahrWe](https://github.com/MahrWe) ([#1325](https://github.com/community-scripts/ProxmoxVE/pull/1325)) + +### 🚀 Updated Scripts + +- Fix: tandoor.sh: Call version.py to write current version [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1454](https://github.com/community-scripts/ProxmoxVE/pull/1454)) +- Fix inexistent folder on actualbudget update script [@dosten](https://github.com/dosten) ([#1444](https://github.com/community-scripts/ProxmoxVE/pull/1444)) + +### 🌐 Website + +- Update kavita.json: Add info on how to enable folder adding. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1447](https://github.com/community-scripts/ProxmoxVE/pull/1447)) + +### 🧰 Maintenance + +- GitHub Actions: Fix Shellsheck workflow to only run on changes `*.sh` files [@andygrunwald](https://github.com/andygrunwald) ([#1423](https://github.com/community-scripts/ProxmoxVE/pull/1423)) + +### ❔ Unlabelled + +- feat: allow adding SSH authorized key for root (advanced settings) by @dsiebel [@MickLesk](https://github.com/MickLesk) ([#1456](https://github.com/community-scripts/ProxmoxVE/pull/1456)) + +## 2025-01-11 + +### Changed + +### 🚀 Updated Scripts + +- Prometheus: Fix installation via creating the service file [@andygrunwald](https://github.com/andygrunwald) ([#1416](https://github.com/community-scripts/ProxmoxVE/pull/1416)) +- Update prometheus-install.sh: Service creation fix [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1417](https://github.com/community-scripts/ProxmoxVE/pull/1417)) +- Update prometheus-alertmanager-install.sh: Service Creation Fix [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1418](https://github.com/community-scripts/ProxmoxVE/pull/1418)) +- Fix: LubeLogger CT vehicle tag typo [@kkroboth](https://github.com/kkroboth) ([#1413](https://github.com/community-scripts/ProxmoxVE/pull/1413)) + +## 2025-01-10 + +### Changed + +### ✨ New Scripts + +- New script : Ghost [@fabrice1236](https://github.com/fabrice1236) ([#1361](https://github.com/community-scripts/ProxmoxVE/pull/1361)) + +### 🚀 Updated Scripts + +- Fix user in ghost-cli install command [@fabrice1236](https://github.com/fabrice1236) ([#1408](https://github.com/community-scripts/ProxmoxVE/pull/1408)) +- Update Prometheus + Alertmanager: Unify scripts for easier maintenance [@andygrunwald](https://github.com/andygrunwald) ([#1402](https://github.com/community-scripts/ProxmoxVE/pull/1402)) +- Update komodo.sh: Fix broken paths in update_script(). [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1403](https://github.com/community-scripts/ProxmoxVE/pull/1403)) +- Fix: ActualBudget Update-Function [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1376](https://github.com/community-scripts/ProxmoxVE/pull/1376)) +- Fix: bookstack.sh - Ignore empty folder [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1388](https://github.com/community-scripts/ProxmoxVE/pull/1388)) +- Fix: checkmk-install.sh: Version crawling. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1385](https://github.com/community-scripts/ProxmoxVE/pull/1385)) + +### 🌐 Website + +- Change Website-Category of nzbget [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1379](https://github.com/community-scripts/ProxmoxVE/pull/1379)) + +### 🧰 Maintenance + +- Update check_and_update_json_date.yml: Change path to /json [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1399](https://github.com/community-scripts/ProxmoxVE/pull/1399)) +- Visual Studio Code: Set Workspace recommended extensions [@andygrunwald](https://github.com/andygrunwald) ([#1398](https://github.com/community-scripts/ProxmoxVE/pull/1398)) +- [core]: add support for custom tags [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1384](https://github.com/community-scripts/ProxmoxVE/pull/1384)) +- [core]: check json date of new prs & update it [@MickLesk](https://github.com/MickLesk) ([#1395](https://github.com/community-scripts/ProxmoxVE/pull/1395)) +- Add initial PR for Contributing & Coding Standard [@MickLesk](https://github.com/MickLesk) ([#920](https://github.com/community-scripts/ProxmoxVE/pull/920)) +- [Core] add Github Action for Generate AppHeaders (figlet remove part 1) [@MickLesk](https://github.com/MickLesk) ([#1382](https://github.com/community-scripts/ProxmoxVE/pull/1382)) + +## 2025-01-09 + +### Changed + +### 💥 Breaking Changes + +- Removal calibre-server (no Headless Support) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1362](https://github.com/community-scripts/ProxmoxVE/pull/1362)) + +### ✨ New Scripts + +- New Script: Prometheus Alertmanager [@andygrunwald](https://github.com/andygrunwald) ([#1272](https://github.com/community-scripts/ProxmoxVE/pull/1272)) +- New script: ps5-mqtt [@liecno](https://github.com/liecno) ([#1198](https://github.com/community-scripts/ProxmoxVE/pull/1198)) + +### 🚀 Updated Scripts + +- Fix: AdventureLog: unzip to /opt/ [@JesperDramsch](https://github.com/JesperDramsch) ([#1370](https://github.com/community-scripts/ProxmoxVE/pull/1370)) +- Fix: Stirling-PDF > LibreOffice/unoconv Integration Issues [@m6urns](https://github.com/m6urns) ([#1322](https://github.com/community-scripts/ProxmoxVE/pull/1322)) +- Fix: AdventureLog - update script bug [@JesperDramsch](https://github.com/JesperDramsch) ([#1334](https://github.com/community-scripts/ProxmoxVE/pull/1334)) +- Install/update ActualBudget based on releases, not latest master [@SpyrosRoum](https://github.com/SpyrosRoum) ([#1254](https://github.com/community-scripts/ProxmoxVE/pull/1254)) +- Fix Checkmk: Version grep broken [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1341](https://github.com/community-scripts/ProxmoxVE/pull/1341)) + +### 🧰 Maintenance + +- fix: only validate scripts in validate-scripts workflow [@se-bastiaan](https://github.com/se-bastiaan) ([#1344](https://github.com/community-scripts/ProxmoxVE/pull/1344)) + +## 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 "$(curl -fsSL 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/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/community-scripts/ProxmoxVE/blob/main/install/adventurelog-install.sh) + - NEW Script + +## 2024-10-25 + +### Changed + +- **Zoraxy LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/468a5d367ded4cf453a1507452e112ac3e234e2a) + - Switch built from source to a pre-compiled binary version. + - Breaking Change + +## 2024-10-23 + +### Changed + +- **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/community-scripts/ProxmoxVE/blob/main/install/openwebui-install.sh) + - NEW Script + +## 2024-10-19 + +### Changed + +- **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/community-scripts/ProxmoxVE/blob/main/install/neo4j-install.sh) + - NEW Script + +## 2024-10-18 + +### Changed + +- **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/community-scripts/ProxmoxVE/blob/main/install/evcc-install.sh) + - NEW Script + +## 2024-10-10 + +### Changed + +- **MySQL LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/mysql-install.sh) + - NEW Script +- **Tianji LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/4c83a790ac9b040da1f11ad2cbe13d3fc5f480e9) + - Breaking Change + - Switch from `pm2` process management to `systemd` + +## 2024-10-03 + +### Changed + +- **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. + +## 2024-09-16 + +### Changed + +- **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/community-scripts/ProxmoxVE/blob/main/install/zipline-install.sh) + - NEW Script + +## 2024-09-13 + +### Changed + +- **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/community-scripts/ProxmoxVE/commit/723365a79df7cc0fd29b1af8f7ef200a7e0921b1) + - Refactor Code + - Breaking Change + +## 2024-08-19 + +### Changed + +- **CommaFeed LXC** [(Commit)](https://github.com/community-scripts/ProxmoxVE/commit/0a33d1739ec3a49011411929bd46a260e92e99f9) + - Refactor Code + - Breaking Change + +## 2024-08-06 + +### Changed + +- **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/community-scripts/ProxmoxVE/blob/main/install/gitea-install.sh) + - NEW Script + +## 2024-06-30 + +### Changed + +- **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/community-scripts/ProxmoxVE/blob/main/install/kubo-install.sh) + - NEW Script +- **RabbitMQ LXC** [(View Source)](https://github.com/community-scripts/ProxmoxVE/blob/main/install/rabbitmq-install.sh) + - NEW Script +- **Scrutiny LXC** + - Removed from website, broken. + +## 2024-06-26 + +### Changed + +- **Scrutiny LXC** + - NEW Script + +## 2024-06-14 + +### Changed + +- **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/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/community-scripts/ProxmoxVE/blob/main/install/spoolman-install.sh) + - NEW Script + +## 2024-06-12 + +### Changed + +- **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/community-scripts/ProxmoxVE/blob/main/install/matterbridge-install.sh) + - NEW Script +- **Website** + - Reopen the gh-pages site (https://tteck.github.io/Proxmox/) + +## 2024-06-11 + +### Changed + +- **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/community-scripts/ProxmoxVE/blob/main/install/petio-install.sh) + - NEW Script +- **Website** + - Important notices will now be displayed on the landing page. + +## 2024-06-04 + +### Changed + +- **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/community-scripts/ProxmoxVE/commit/fc9dff220b4ea426d3a75178ad8accacae4683ca) + - Passwords are now masked + +## 2024-05-30 + +### Changed + +- **Forgejo LXC** + - NEW Script + +## 2024-05-28 + +### Changed + +- **Notifiarr LXC** + - NEW Script + +## 2024-05-25 + +### Changed + +- **Threadfin LXC** + - NEW Script + +## 2024-05-23 + +### Changed + +- **BunkerWeb LXC** + - NEW Script + +## 2024-05-20 + +### Changed + +- **Traefik LXC** + - NEW Script + +## 2024-05-19 + +### Changed + +- **NetBird** + - NEW Script +- **Tailscale** + - Refactor Code + +## 2024-05-18 + +### Changed + +- **MongoDB LXC** + - NEW Script + +## 2024-05-17 + +### Changed + +- **New Website** + - We have officially moved to [Helper-Scripts.com](https://helper-scripts.com) + +## 2024-05-16 + +### Changed + +- **iVentoy LXC** + - NEW Script + +## 2024-05-13 + +### Changed + +- **Headscale LXC** + - NEW Script + +## 2024-05-11 + +### Changed + +- **Caddy LXC** + - NEW Script + +## 2024-05-09 + +### Changed + +- **Umami LXC** + - NEW Script + +## 2024-05-08 + +### Changed + +- **Kernel Pin** + - NEW Script +- **Home Assistant Core LXC** + - Ubuntu 24.04 ONLY + +## 2024-05-07 + +### Changed + +- **Pocketbase LXC** + - NEW Script + +## 2024-05-05 + +### Changed + +- **Fenrus LXC** + - NEW Script + +## 2024-05-02 + +### Changed + +- **OpenMediaVault LXC** + - Set Debian 12 as default + - OpenMediaVault 7 (sandworm) + +## 2024-04-30 + +### Changed + +- **Tdarr LXC** + - Default settings are now **Unprivileged** + - Unprivileged Hardware Acceleration + +## 2024-04-29 + +### Changed + +- **ErsatzTV LXC** + - NEW Script + +## 2024-04-28 + +### Changed + +- **Scrypted LXC** + - Unprivileged Hardware Acceleration +- **Emby LXC** + - Unprivileged Hardware Acceleration + +## 2024-04-27 + +### Changed + +- **Frigate LXC** + - Unprivileged Hardware Acceleration https://github.com/tteck/Proxmox/discussions/2711#discussioncomment-9244629 +- **Ubuntu 24.04 VM** + - NEW Script + +## 2024-04-26 + +### Changed + +- **Glances** + - NEW Script + +## 2024-04-25 + +### Changed + +- **Jellyfin LXC** + - Default settings are now **Unprivileged** + - Unprivileged Hardware Acceleration + - Groups are set automatically + - Checks for the existence of `/dev/dri/card0` if not found, use `/dev/dri/card1`. Set the GID to `44` + - Set the GID for `/dev/dri/renderD128` to `104` + - Not tested <8.1.11 +- **Plex LXC** + - Default settings are now **Unprivileged** + - Unprivileged Hardware Acceleration + - Groups are set automatically + - Checks for the existence of `/dev/dri/card0` if not found, use `/dev/dri/card1`. Set the GID to `44` + - Set the GID for `/dev/dri/renderD128` to `104` + - Not tested <8.1.11 + +## 2024-04-24 + +### Changed + +- **Traccar LXC** + - NEW Script +- **Calibre-Web LXC** + - NEW Script + +## 2024-04-21 + +### Changed + +- **Aria2 LXC** + - NEW Script + +## 2024-04-15 + +### Changed + +- **Homarr LXC** + - Add back to website +- **Umbrel LXC** + - Add back to website +- **OpenMediaVault LXC** + - Add back to website + +## 2024-04-12 + +### Changed + +- **OpenMediaVault LXC** + - Removed from website + +## 2024-04-09 + +### Changed + +- **PairDrop LXC** + - Add back to website + +## 2024-04-05 + +### Changed + +- **Medusa LXC** + - NEW Script +- **WatchYourLAN LXC** + - NEW Script + +## 2024-04-04 + +### Changed + +- **Actual Budget LXC** + - NEW Script + +## 2024-04-03 + +### Changed + +- **LazyLibrarian LXC** + - NEW Script + +## 2024-04-01 + +### Changed + +- **Frigate LXC** + - NEW Script + +## 2024-03-26 + +### Changed + +- **MediaMTX LXC** + - NEW Script + +## 2024-03-25 + +### Changed + +- **Proxmox VE Post Install** + - ~Requires Proxmox Virtual Environment Version 8.1.1 or later.~ + - Requires Proxmox Virtual Environment Version 8.0 or later. +- **Proxmox Backup Server LXC** + - NEW Script + +## 2024-03-24 + +### Changed + +- **SmokePing LXC** + - NEW Script + +## 2024-03-13 + +### Changed + +- **FlowiseAI LXC** + - NEW Script + +## 2024-03-11 + +### Changed + +- **Wastebin LXC** + - NEW Script + +## 2024-03-08 + +### Changed + +- **Proxmox VE Post Install** + - Requires Proxmox Virtual Environment Version 8.1.1 or later. + +## 2024-02-26 + +### Changed + +- **Mafl LXC** + - NEW Script + +## 2024-02-23 + +### Changed + +- **Tandoor Recipes LXC** + - NEW Script (Thanks @MickLesk) + +## 2024-02-21 + +### Changed + +- **All scripts** + - As of today, the scripts require the Bash shell specifically. ([more info](https://github.com/tteck/Proxmox/discussions/2536)) + +## 2024-02-19 + +### Changed + +- **PairDrop LXC** + - Removed from the website ([more info](https://github.com/tteck/Proxmox/discussions/2516)) + +## 2024-02-16 + +### Changed + +- **Proxmox VE LXC Filesystem Trim** + - NEW Script ([more info](https://github.com/tteck/Proxmox/discussions/2505#discussion-6226037)) + +## 2024-02-11 + +### Changed + +- **HiveMQ CE LXC** + - NEW Script +- **Apache-CouchDB LXC** + - NEW Script + +## 2024-02-06 + +### Changed + +- **All Scripts** + - The scripts will only work with PVE7 Version 7.4-13 or later, or PVE8 Version 8.1.1 or later. + +## 2024-02-05 + +### Changed + +- **Gokapi LXC** + - NEW Script +- **Nginx Proxy Manager LXC** + - Option to install v2.10.4 + +## 2024-02-04 + +### Changed + +- **Pi-hole LXC** + - Option to add Unbound + +## 2024-02-02 + +### Changed + +- **Readeck LXC** + - NEW Script + +## 2024-01-25 + +### Changed + +- **PairDrop LXC** + - NEW Script + +## 2024-01-20 + +### Changed + +- **Apache-Cassandra LXC** + - NEW Script +- **Redis LXC** + - NEW Script + +## 2024-01-17 + +### Changed + +- **ntfy LXC** + - NEW Script +- **HyperHDR LXC** + - NEW Script + +## 2024-01-16 + +### Changed + +- **Website Improvements** + - Refine and correct pointers. + - Change hover colors to intuitively indicate categories/items. + - Implement opening links in new tabs for better navigation. + - Enhance the Copy button to better indicate that the command has been successfully copied. + - Introduce a Clear Search button. + - While not directly related to the website, it's worth mentioning that the logo in newly created LXC notes now serves as a link to the website, conveniently opening in a new tab. + +## 2024-01-12 + +### Changed + +- **Apt-Cacher-NG LXC** + - NEW Script +- **New Feature** + - The option to utilize Apt-Cacher-NG (Advanced settings) when creating LXCs. The added functionality is expected to decrease bandwidth usage and expedite package installation and updates. https://github.com/tteck/Proxmox/discussions/2332 + +## 2024-01-09 + +### Changed + +- **Verbose mode** + - Only entries with `$STD` will be shown + +## 2024-01-07 + +### Changed + +- **Stirling-PDF LXC** + - NEW Script +- **SFTPGo LXC** + - NEW Script + +## 2024-01-04 + +### Changed + +- **CommaFeed LXC** + - NEW Script + +## 2024-01-03 + +### Changed + +- **Sonarr LXC** + - Breaking Change + - Complete recode + - https://github.com/tteck/Proxmox/discussions/1738#discussioncomment-8005107 + +## 2024-01-01 + +### Changed + +- **Gotify LXC** + - NEW Script + +## 2023-12-19 + +### Changed + +- **Proxmox VE Netdata** + - NEW Script + +## 2023-12-10 + +### Changed + +- **Homarr LXC** + - Removed, again. + +## 2023-12-02 + +### Changed + +- **Runtipi LXC** + - NEW Script + +## 2023-12-01 + +### Changed + +- **Mikrotik RouterOS VM** + - Now Mikrotik RouterOS CHR VM + - code refactoring + - update to CHR + - thanks to @NiccyB +- **Channels DVR Server LXC** + - NEW Script + +## 2023-11-19 + +### Changed + +- **Dockge LXC** + - NEW Script + +## 2023-11-18 + +### Changed + +- **Ubuntu 22.04 VM** + - NEW Script + +## 2023-11-14 + +### Changed + +- **TurnKey Nextcloud VM** + - NEW Script +- **TurnKey ownCloud VM** + - NEW Script + +## 2023-11-11 + +### Changed + +- **Homarr LXC** + - Returns with v0.14.0 (The authentication update). + +## 2023-11-9 + +### Changed + +- **AgentDVR LXC** + - NEW Script + +## 2023-11-8 + +### Changed + +- **Linkwarden LXC** + - NEW Script + +## 2023-11-2 + +### Changed + +- **PhotoPrism LXC** + - Transitioned to PhotoPrism's latest installation package, featuring Linux binaries. + +## 2023-11-1 + +### Changed + +- **Owncast LXC** + - NEW Script + +## 2023-10-31 + +### Changed + +- **Debian 12 VM** + - NEW Script + +## 2023-10-29 + +### Changed + +- **Unmanic LXC** + - NEW Script + +## 2023-10-27 + +### Changed + +- **Webmin** + - A full code overhaul. + +## 2023-10-15 + +### Changed + +- **TasmoAdmin LXC** + - NEW Script + +## 2023-10-14 + +### Changed + +- **Sonarr LXC** + - Include an option to install v4 (experimental) + +## 2023-10-11 + +### Changed + +- **Proxmox VE CPU Scaling Governor** + - A full code overhaul. + - Include an option to configure a crontab for ensuring that the CPU Scaling Governor configuration persists across reboots. + +## 2023-10-08 + +### Changed + +- **Proxmox VE LXC Updater** + - Now displays which containers require a reboot. +- **File Browser** + - Uninstall by re-executing the script + - Option to use No Authentication + +## 2023-10-05 + +### Changed + +- **Pingvin Share LXC** + - NEW Script + +## 2023-09-30 + +### Changed + +- **All Templates** + - NEW Script + +## 2023-09-28 + +### Changed + +- **Alpine Nextcloud Hub LXC** + - NEW Script (Thanks to @nicedevil007) + +## 2023-09-14 + +### Changed + +- **Proxmox VE Processor Microcode** + - Allow users to select available microcode packages. + +## 2023-09-13 + +### Changed + +- **Pi.Alert LXC** + - NEW Script +- **Proxmox VE Kernel Clean** + - Code overhaul with a fresh start. This script offers the flexibility to select specific kernels for removal, unlike the previous version, which was an all-or-nothing approach. + +## 2023-09-11 + +### Changed + +- **Paperless-ngx LXC** + - Modify the script to incorporate Redis and PostgreSQL, while also introducing an option to include Adminer during installation. + +## 2023-09-10 + +### Changed + +- **TurnKey Game Server LXC** + - NEW Script + +## 2023-09-09 + +### Changed + +- **Proxmox VE Host Backup** + - Users are now able to specify both the backup path and the directory in which they wish to work. + +## 2023-09-07 + +### Changed + +- **Proxmox VE Host Backup** + - NEW Script + +## 2023-09-06 + +### Changed + +- **Proxmox VE LXC Cleaner** + - Added a new menu that allows you to choose which containers you want to exclude from the clean process. +- **Tailscale** + - Added a menu that enables you to choose the specific container where you want to install Tailscale. + +## 2023-09-05 + +### Changed + +- **Proxmox VE LXC Updater** + - Added a new menu that allows you to choose which containers you want to exclude from the update process. + +## 2023-09-01 + +### Changed + +- **TurnKey Media Server LXC** + - NEW Script + +## 2023-08-31 + +### Changed + +- **TurnKey ZoneMinder LXC** + - NEW Script +- **TurnKey OpenVPN LXC** + - NEW Script + +## 2023-08-30 + +### Changed + +- **TurnKey** + - Introducing a **NEW** Category on the Site. + - My intention is to maintain the TurnKey scripts in their simplest form, contained within a single file, and with minimal options, if any. +- **TurnKey Core LXC** + - NEW Script +- **TurnKey File Server LXC** + - NEW Script +- **TurnKey Gitea LXC** + - NEW Script +- **TurnKey GitLab LXC** + - NEW Script +- **TurnKey Nextcloud LXC** + - NEW Script +- **TurnKey Observium LXC** + - NEW Script +- **TurnKey ownCloud LXC** + - NEW Script +- **TurnKey Torrent Server LXC** + - NEW Script +- **TurnKey Wordpress LXC** + - NEW Script + +## 2023-08-24 + +### Changed + +- **qBittorrent LXC** + - Added back to repository with UPnP disabled and password changed. + +## 2023-08-24 + +### Changed + +- **qBittorrent LXC** + - Removed from this repository for potential malicious hidden code https://github.com/tteck/Proxmox/discussions/1725 + +## 2023-08-16 + +### Changed + +- **Homarr LXC** + - NEW Script + +## 2023-08-10 + +### Changed + +- **Proxmox VE Processor Microcode** + - AMD microcode-20230808 Release + +## 2023-08-09 + +### Changed + +- **Omada Controller LXC** + - Update via script +- **Proxmox VE Processor Microcode** + - [Intel microcode-20230808 Release](https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/releases/tag/microcode-20230808) + +## 2023-08-01 + +### Changed + +- **Overseerr LXC** + - NEW Script +- **Jellyseerr LXC** + - NEW Script + +## 2023-07-24 + +### Changed + +- **Ombi LXC** + - NEW Script + +## 2023-07-23 + +### Changed + +- **Zoraxy LXC** + - NEW Script + +## 2023-07-18 + +### Changed + +- **Proxmox VE Cron LXC Updater** + - NEW Script + +## 2023-07-11 + +### Changed + +- **Scrypted LXC** + - Add VAAPI hardware transcoding + +## 2023-07-07 + +### Changed + +- **Real-Debrid Torrent Client LXC** + - NEW Script + +## 2023-07-05 + +### Changed + +- There have been more than 110 commits since June 18th, although not all of them are significant, with a majority focused on ensuring compatibility with Proxmox VE 8 and Debian 12. + +## 2023-06-18 + +### Changed + +- **OpenObserve LXC** + - NEW Script + +## 2023-06-17 + +### Changed + +- **UniFi Network Application LXC** + - Now distribution agnostic. +- **Omada Controller LXC** + - Now distribution agnostic. +## 2023-06-16 + +### Changed + +- **Proxmox VE Monitor-All** + - Skip instances based on onboot and templates. [8c2a3cc](https://github.com/community-scripts/ProxmoxVE/commit/8c2a3cc4d774fa13d17f695d6bdf9a4deedb1372). + +## 2023-06-12 + +### Changed + +- **Proxmox VE Edge Kernel** + - Removed, with the Proxmox opt-in kernels and the upcoming Proxmox Virtual Environment 8, edge kernels are no longer needed. +- **Proxmox VE Kernel Clean** + - Now compatible with PVE8. + +## 2023-06-11 + +### Changed + +- **Proxmox VE Post Install** + - Now compatible with both Proxmox Virtual Environment 7 (PVE7) and Proxmox Virtual Environment 8 (PVE8). + +## 2023-06-02 + +### Changed + +- **Proxmox VE 7 Post Install** + - In a non-clustered environment, you can choose to disable high availability, which helps save system resources. + +## 2023-05-27 + +### Changed + +- **Proxmox VE 7 Post Install** + - If an Intel N-series processor is detected, ~the script provides options to install both the Proxmox 6.2 kernel and the Intel microcode.~ and using PVE7, recommend using PVE8 + +## 2023-05-23 + +### Changed + +- **OpenWrt VM** + - NEW Script + +## 2023-05-17 + +### Changed + +- **Alpine-AdGuard Home LXC** + - Removed, it wasn't installed through the Alpine package manager. +- **Alpine-Whoogle LXC** + - Removed, it wasn't installed through the Alpine package manager. + +## 2023-05-16 + +### Changed + +- **Proxmox VE LXC Updater** + - Add information about the boot disk, which provides an easy way to determine if you need to expand the disk. +- **Proxmox VE Processor Microcode** + - [Intel microcode-20230512 Release](https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/releases/tag/microcode-20230512) + +## 2023-05-13 + +### Changed + +- **Tautulli LXC** + - NEW Script + +## 2023-05-12 + +### Changed + +- **Bazarr LXC** + - NEW Script + +## 2023-05-08 + +### Changed + +- **Proxmox VE Intel Processor Microcode** + - Renamed to **Proxmox VE Processor Microcode** + - Automatically identifies the processor vendor (Intel/AMD) and installs the appropriate microcode. + +## 2023-05-07 + +### Changed + +- **FHEM LXC** + - NEW Script + +## 2023-05-01 + +### Changed + +- **OctoPrint LXC** + - NEW Script +- **Proxmox VE Intel Processor Microcode** + - NEW Script + +## 2023-04-30 + +### Changed + +- **Proxmox VE Monitor-All** + - NEW Script + - Replaces Proxmox VE LXC Monitor + +## 2023-04-28 + +### Changed + +- **Proxmox VE LXC Monitor** + - NEW Script + +## 2023-04-26 + +### Changed + +- **The site can now be accessed through a more memorable URL, which is [helper-scripts.com](http://helper-scripts.com).** + +## 2023-04-23 + +### Changed + +- **Non-Alpine LXC's** + - Advanced settings provide the option for users to switch between Debian and Ubuntu distributions. However, some applications or services, such as Deconz, grocy or Omada, may not be compatible with the selected distribution due to dependencies. + +## 2023-04-16 + +### Changed + +- **Home Assistant Core LXC** + - Python 3.11.2 + +## 2023-04-15 + +### Changed + +- **InfluxDB LXC** + - Choosing InfluxDB v1 will result in Chronograf being installed automatically. +- **[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 + +### Changed + +- **Cloudflared LXC** + - NEW Script + +## 2023-04-05 + +### Changed + +- **Jellyfin LXC** + - Set Ubuntu 22.04 as default + - Use the Deb822 format jellyfin.sources configuration (jellyfin.list configuration has been obsoleted) + +## 2023-04-02 + +### Changed + +- **Home Assistant OS VM** + - Include a choice within the "Advanced" settings to configure the CPU model between kvm64 (default) or host. + +## 2023-03-31 + +### Changed + +- **Home Assistant OS VM** + - Include a choice within the "Advanced" settings to configure the disk cache between none (default) or Write Through. + +## 2023-03-27 + +### Changed + +- **Removed Alpine-ESPHome LXC** + - Nonoperational +- **All Scripts** + - Incorporate code that examines whether SSH is being used and, if yes, offers a suggestion against it without restricting or blocking its usage. + +## 2023-03-25 + +### Changed + +- **Alpine-ESPHome LXC** + - NEW Script +- **Alpine-Whoogle LXC** + - NEW Script + +## 2023-03-22 + +### Changed + +- **The latest iteration of the scripts** + - Going forward, versioning will no longer be utilized in order to avoid breaking web-links in blogs and YouTube videos. + - The scripts have been made more legible as the repetitive code has been moved to function files, making it simpler to share among the scripts and hopefully easier to maintain. This also makes it simpler to contribute to the project. + - When a container is created with privileged mode enabled, the USB passthrough feature is automatically activated. + +## 2023-03-18 + +### Changed + +- **Alpine-AdGuard Home LXC** (Thanks @nicedevil007) + - NEW Script +- **Alpine-Docker LXC** + - NEW Script +- **Alpine-Zigbee2MQTT LXC** + - NEW Script + +## 2023-03-15 + +### Changed + +- **Alpine-Grafana LXC** (Thanks @nicedevil007) + - NEW Script + +## 2023-03-10 + +### Changed + +- **Proxmox LXC Updater** + - You can use the command line to exclude multiple containers simultaneously. + +## 2023-03-08 + +### Changed + +- **Proxmox CPU Scaling Governor** + - Menu options dynamically based on the available scaling governors. + +## 2023-03-07 + +### Changed + +- **Alpine-Vaultwarden LXC** + - NEW Script +- **All LXC Scripts** + - Retrieve the time zone from Proxmox and configure the container to use the same time zone + +## 2023-02-24 + +### Changed + +- **qBittorrent LXC** (Thanks @romka777) + - NEW Script +- **Jackett LXC** (Thanks @romka777) + - NEW Script + +## 2023-02-23 + +### Changed + +- **Proxmox LXC Updater** + - Skip all templates, allowing for the starting, updating, and shutting down of containers to be resumed automatically. + - Exclude an additional container by adding the CTID at the end of the shell command ( -s 103). + +## 2023-02-16 + +### Changed + +- **RSTPtoWEB LXC** + - NEW Script +- **go2rtc LXC** + - NEW Script + +## 2023-02-12 + +### Changed + +- **OliveTin** + - NEW Script + +## 2023-02-10 + +### Changed + +- **Home Assistant OS VM** + - Code Refactoring + +## 2023-02-05 + +### Changed + +- **Devuan LXC** + - NEW Script + +## 2023-02-02 + +### Changed + +- **Audiobookshelf LXC** + - NEW Script +- **Rocky Linux LXC** + - NEW Script + +## 2023-01-28 + +### Changed + +- **LXC Cleaner** + - Code refactoring to give the user the option to choose whether cache or logs will be deleted for each app/service. + - Leaves directory structure intact + +## 2023-01-27 + +### Changed + +- **LXC Cleaner** + - NEW Script + +## 2023-01-26 + +### Changed + +- **ALL LXC's** + - Add an option to disable IPv6 (Advanced) + +## 2023-01-25 + +### Changed + +- **Home Assistant OS VM** + - switch to v5 + - add an option to set MTU size (Advanced) + - add arch check (no ARM64) (issue from community.home-assistant.io) + - add check to insure VMID isn't already used before VM creation (Advanced) (issue from forum.proxmox.com) + - code refactoring +- **PiMox Home Assistant OS VM** + - switch to v5 + - add an option to set MTU size (Advanced) + - add arch check (no AMD64) + - add pve check (=>7.2) + - add check to insure VMID isn't already used before VM creation (Advanced) + - code refactoring +- **All LXC's** + - add arch check (no ARM64) (issue from forum.proxmox.com) + +## 2023-01-24 + +### Changed + +- **Transmission LXC** + - NEW Script + +## 2023-01-23 + +### Changed + +- **ALL LXC's** + - Add [Midnight Commander (mc)](https://www.linuxcommand.org/lc3_adv_mc.php) + +## 2023-01-22 + +### Changed + +- **Autobrr LXC** + - NEW Script + +## 2023-01-21 + +### Changed + +- **Kavita LXC** + - NEW Script + +## 2023-01-19 + +### Changed + +- **SABnzbd LXC** + - NEW Script + +## 2023-01-17 + +### Changed + +- **Homer LXC** + - NEW Script + +## 2023-01-14 + +### Changed + +- **Tdarr LXC** + - NEW Script +- **Deluge LXC** + - NEW Script + +## 2023-01-13 + +### Changed + +- **Lidarr LXC** + - NEW Script +- **Prowlarr LXC** + - NEW Script +- **Radarr LXC** + - NEW Script +- **Readarr LXC** + - NEW Script +- **Sonarr LXC** + - NEW Script +- **Whisparr LXC** + - NEW Script + +## 2023-01-12 + +### Changed + +- **ALL LXC's** + - Add an option to set MTU size (Advanced) + +## 2023-01-11 + +### Changed + +- **Home Assistant Core LXC** + - Auto Initialize +- **Cronicle Primary/Worker LXC** + - NEW Script + +## 2023-01-09 + +### Changed + +- **ALL LXC's** + - v5 +- **k0s Kubernetes LXC** + - NEW Script +- **Podman LXC** + - NEW Script + +## 2023-01-04 + +### Changed + +- **YunoHost LXC** + - NEW Script + +## 2022-12-31 + +### Changed + +- **v5 Scripts** (Testing before moving forward https://github.com/tteck/Proxmox/discussions/881) + - Adguard Home LXC + - Docker LXC + - Home Assistant Core LXC + - PhotoPrism LXC + - Shinobi NVR LXC + - Vaultwarden LXC + +## 2022-12-27 + +### Changed + +- **Home Assistant Container LXC** + - Add an option to use Fuse Overlayfs (ZFS) (Advanced) + +- **Docker LXC** + - Add an option to use Fuse Overlayfs (ZFS) (Advanced) + - If the LXC is created Privileged, the script will automatically set up USB passthrough. + +## 2022-12-22 + +### Changed + +- **All LXC's** + - Add an option to run the script in Verbose Mode (Advanced) + +## 2022-12-20 + +### Changed + +- **Hyperion LXC** + - NEW Script + +## 2022-12-17 + +### Changed + +- **Home Assistant Core LXC** + - Linux D-Bus Message Broker + - Mariadb & PostgreSQL Ready + - Bluetooth Ready + - Fix for Inconsistent Dependency Versions (dbus-fast & bleak) + +## 2022-12-16 + +### Changed + +- **Home Assistant Core LXC** + - Python 3.10.8 + +## 2022-12-09 + +### Changed + +- **Change Detection LXC** + - NEW Script + +## 2022-12-03 + +### Changed + +- **All LXC's** + - Add options to set DNS Server IP Address and DNS Search Domain (Advanced) + +## 2022-11-27 + +### Changed + +- **Shinobi LXC** + - NEW Script + +## 2022-11-24 + +### Changed + +- **Home Assistant OS VM** + - Add option to set machine type during VM creation (Advanced) + +## 2022-11-23 + +### Changed + +- **All LXC's** + - Add option to enable root ssh access during LXC creation (Advanced) + +## 2022-11-21 + +### Changed + +- **Proxmox LXC Updater** + - 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 + +### Changed + +- **All LXC's** + - Add option to continue upon Internet NOT Connected + +## 2022-11-11 + +### Changed + +- **HA Bluetooth Integration Preparation** + - [NEW Script](https://github.com/tteck/Proxmox/discussions/719) + +## 2022-11-04 + +### Changed + +- **Scrypted LXC** + - NEW Script + +## 2022-11-01 + +### Changed + +- **Alpine LXC** + - NEW Script +- **Arch LXC** + - NEW Script + +## 2022-10-27 + +### Changed + +- **Container & Core Restore from Backup** + - [NEW Scripts](https://github.com/tteck/Proxmox/discussions/674) + +## 2022-10-07 + +### Changed + +- **Home Assistant OS VM** + - Add "Latest" Image + +## 2022-10-05 + +### Changed + +- **Umbrel LXC** + - NEW Script (Docker) +- **Blocky LXC** + - NEW Script (Adblocker - DNS) + +## 2022-09-29 + +### Changed + +- **Home Assistant Container LXC** + - If the LXC is created Privileged, the script will automatically set up USB passthrough. +- **Home Assistant Core LXC** + - NEW Script +- **PiMox HAOS VM** + - NEW Script + +## 2022-09-23 + +### Changed + +- **EMQX LXC** + - NEW Script + +## 2022-09-22 + +### Changed + +- **NextCloudPi LXC** + - NEW Script + +## 2022-09-21 + +### Changed + +- **Proxmox Backup Server Post Install** + - NEW Script +- **Z-wave JS UI LXC** + - NEW Script (and all sub scripts 🤞) +- **Zwave2MQTT LXC** + - Bye Bye Script + +## 2022-09-20 + +### Changed + +- **OpenMediaVault LXC** + - NEW Script + +## 2022-09-16 + +### Changed + +- **Paperless-ngx LXC** + - NEW Script (Thanks @Donkeykong307) + +## 2022-09-11 + +### Changed + +- **Trilium LXC** + - NEW Script + +## 2022-09-10 + +### Changed + +- **Syncthing LXC** + - NEW Script + +## 2022-09-09 + +### Changed + +- **CasaOS LXC** + - NEW Script +- **Proxmox Kernel Clean** + - Now works with Proxmox Backup Server + +## 2022-09-08 + +### Changed + +- **Navidrome LXC** + - NEW Script +- **Homepage LXC** + - NEW Script + +## 2022-08-31 + +### Changed + +- **All LXC's** + - Add Internet & DNS Check + +## 2022-08-22 + +### Changed + +- **Wiki.js LXC** + - NEW Script +- **Emby Media Server LXC** + - NEW Script + +## 2022-08-20 + +### Changed + +- **Mikrotik RouterOS VM** + - NEW Script + +## 2022-08-19 + +### Changed + +- **PhotoPrism LXC** + - Fixed .env bug (Thanks @cklam2) + +## 2022-08-13 + +### Changed + +- **Home Assistant OS VM** + - Option to create VM using Stable, Beta or Dev Image + +## 2022-08-11 + +### Changed + +- **Home Assistant OS VM** + - Validate Storage + +## 2022-08-04 + +### Changed + +- **VS Code Server** + - NEW Script + +## 2022-08-02 + +### Changed + +- **All LXC/VM** + - v4 Script - Whiptail menu's + +## 2022-07-26 + +### Changed + +- **Home Assistant OS VM** + - Set the real time clock (RTC) to local time. + - Disable the USB tablet device (save resources / not needed). + +## 2022-07-24 + +### Changed + +- **Home Assistant OS VM** + - Present the drive to the guest as a solid-state drive rather than a rotational hard disk. There is no requirement that the underlying storage actually be backed by SSD's. + - When the VM’s filesystem marks blocks as unused after deleting files, the SCSI controller will relay this information to the storage, which will then shrink the disk image accordingly. + - 👉 [more info](https://github.com/tteck/Proxmox/discussions/378) + +## 2022-07-22 + +### Changed + +- **n8n LXC** (thanks to @cyakimov) + - NEW Script + +## 2022-07-21 + +### Changed + +- **grocy LXC** + - NEW Script + +## 2022-07-17 + +### Changed + +- **Vaultwarden LXC** + - NEW Vaultwarden Update (post 2022-05-29 installs only) Script + - NEW Web-vault Update (any) Script + +## 2022-07-14 + +### Changed + +- **MagicMirror Server LXC** + - NEW Script + +## 2022-07-13 + +### Changed + +- **Proxmox Edge Kernel Tool** + - NEW Script + +## 2022-07-11 + +### Changed + +- **Home Assistant OS VM** + - Supports lvmthin, zfspool, nfs, dir and btrfs storage types. + +## 2022-07-08 + +### Changed + +- **openHAB LXC** + - NEW Script + +## 2022-07-03 + +### Changed + +- **Tailscale** + - NEW Script + +## 2022-07-01 + +### Changed + +- **Home Assistant OS VM** + - Allow different storage types (lvmthin, nfs, dir). + +## 2022-06-30 + +### Changed + +- **Prometheus LXC** + - NEW Script + +## 2022-06-06 + +### Changed + +- **Whoogle LXC** + - NEW Script + +## 2022-05-29 + +### Changed + +- **Vaultwarden LXC** + - Code refactoring +- **CrowdSec** + - NEW Script + +## 2022-05-21 + +### Changed + +- **Home Assistant OS VM** + - Code refactoring + +## 2022-05-19 + +### Changed + +- **Keycloak LXC** + - NEW Script + +## 2022-05-18 + +### Changed + +- **File Browser** + - NEW Script + +## 2022-05-13 + +### Changed + +- **PostgreSQL LXC** + - NEW Script + +## 2022-05-10 + +### Changed + +- **deCONZ LXC** + - NEW Script + +## 2022-05-07 + +### Changed + +- **NocoDB LXC** + - ADD update script + +## 2022-05-06 + +### Changed + +- **PhotoPrism LXC** + - ADD GO Dependencies for full functionality + +## 2022-05-05 + +### Changed + +- **Ubuntu LXC** + - ADD option to define version (18.04 20.04 21.10 22.04) + +## 2022-04-28 + +### Changed + +- **v3 Script** + - Remove Internet Check + +## 2022-04-27 + +### Changed + +- **Home Assistant OS VM** + - ADD Option to set Bridge, VLAN and MAC Address +- **v3 Script** + - Improve Internet Check (prevent ‼ ERROR 4@57) + +## 2022-04-26 + +### Changed + +- **Home Assistant OS VM** + - Fixed bad path + - ADD Option to create VM using Latest or Stable image +- **UniFi Network Application LXC** + - ADD Local Controller Option + +## 2022-04-25 + +### Changed + +- **v3 Script** + - Improve Error Handling + +## 2022-04-23 + +### Changed + +- **v3 Script** + - ADD Internet Connection Check +- **Proxmox VE 7 Post Install** + - NEW v3 Script +- **Proxmox Kernel Clean** + - NEW v3 Script + +## 2022-04-22 + +### Changed + +- **Omada Controller LXC** + - Update script to install version 5.1.7 +- **Uptime Kuma LXC** + - ADD Update script + +## 2022-04-20 + +### Changed + +- **Ubuntu LXC** + - ADD option to install version 20.04 or 21.10 +- **v3 Script** + - ADD option to set Bridge + +## 2022-04-19 + +### Changed + +- **ALL LXC's** + - New [V3 Install Script](https://github.com/tteck/Proxmox/issues/162) +- **ioBroker LXC** + - New Script V3 + +## 2022-04-13 + +### Changed + +- **Uptime Kuma LXC** + - New Script V2 + +## 2022-04-11 + +### Changed + +- **Proxmox LXC Updater** + - ADD option to skip stopped containers +- **Proxmox VE 7 Post Install** + - ADD PVE 7 check + +## 2022-04-10 + +### Changed + +- **Debian 11 LXC** + - ADD An early look at the v3 install script + +## 2022-04-09 + +### Changed + +- **NocoDB LXC** + - New Script V2 + +## 2022-04-05 + +### Changed + +- **MeshCentral LXC** + - New Script V2 + +## 2022-04-01 + +### Changed + +- **Scripts** (V2) + - FIX Pressing enter without making a selection first would cause an Error + +## 2022-03-28 + +### Changed + +- **Docker LXC** + - Add Docker Compose Option (@wovalle) + +## 2022-03-27 + +### Changed + +- **Heimdall Dashboard LXC** + - New Update Script + +## 2022-03-26 + +### Changed + +- **UniFi Network Application LXC** + - New Script V2 +- **Omada Controller LXC** + - New Script V2 + +## 2022-03-25 + +### Changed + +- **Proxmox CPU Scaling Governor** + - New Script + + +## 2022-03-24 + +### Changed + +- **Plex Media Server LXC** + - Switch to Ubuntu 20.04 to support HDR tone mapping +- **Docker LXC** + - Add Portainer Option + +## 2022-03-23 + +### Changed + +- **Heimdall Dashboard LXC** + - New Script V2 + +## 2022-03-20 + +### Changed + +- **Scripts** (V2) + - ADD choose between Automatic or Manual DHCP + +## 2022-03-18 + +### Changed + +- **Technitium DNS LXC** + - New Script V2 +- **WireGuard LXC** + - Add WGDashboard + +## 2022-03-17 + +### Changed + +- **Docker LXC** + - New Script V2 + +## 2022-03-16 + +### Changed + +- **PhotoPrism LXC** + - New Update/Branch Script + +## 2022-03-15 + +### Changed + +- **Dashy LXC** + - New Update Script + +## 2022-03-14 + +### Changed + +- **Zwavejs2MQTT LXC** + - New Update Script + +## 2022-03-12 + +### Changed + +- **PhotoPrism LXC** + - New Script V2 + +## 2022-03-11 + +### Changed + +- **Vaultwarden LXC** + - New V2 Install Script + +## 2022-03-08 + +### Changed + +- **Scripts** (V2) + - Choose between Privileged or Unprivileged CT and Automatic or Password Login +- **ESPHome LXC** + - New V2 Install Script +- **Zwavejs2MQTT LXC** + - New V2 Install Script +- **Motioneye LXC** + - New V2 Install Script +- **Pihole LXC** + - New V2 Install Script +- **GamUntu LXC** + - New V2 Install Script + +## 2022-03-06 + +### Changed + +- **Zwavejs2MQTT LXC** + - New GUI script to copy data from one Zwavejs2MQTT LXC to another Zwavejs2MQTT LXC + +## 2022-03-05 + +### Changed + +- **Homebridge LXC** + - New Script V2 + +## 2022-03-04 + +### Changed + +- **Proxmox Kernel Clean** + - New Script + +## 2022-03-03 + +### Changed + +- **WireGuard LXC** + - New Script V2 + +## 2022-03-02 + +### Changed + +- **Proxmox LXC Updater** + - New Script +- **Dashy LXC** + - New Script V2 +- **Grafana LXC** + - New Script V2 +- **InfluxDB/Telegraf LXC** + - New Script V2 + +## 2022-03-01 + +### Changed + +- **Daemon Sync Server LXC** + - New Script V2 + +## 2022-02-28 + +### Changed + +- **Vaultwarden LXC** + - Add Update Script + +## 2022-02-24 + +### Changed + +- **Nginx Proxy Manager LXC** + - New V2 Install Script + +## 2022-02-23 + +### Changed + +- **Adguard Home LXC** + - New V2 Install Script +- **Zigbee2MQTT LXC** + - New V2 Install Script +- **Home Assistant Container LXC** + - Update Menu usability improvements + +## 2022-02-22 + +### Changed + +- **Home Assistant Container LXC** + - New V2 Install Script +- **Node-Red LXC** + - New V2 Install Script +- **Mariadb LXC** + - New V2 Install Script +- **MQTT LXC** + - New V2 Install Script +- **Debian 11 LXC** + - New V2 Install Script +- **Ubuntu 21.10 LXC** + - New V2 Install Script + +## 2022-02-20 + +### Changed + +- **Home Assistant Container LXC** + - New Script to migrate to the latest Update Menu + +## 2022-02-19 + +### Changed + +- **Nginx Proxy Manager LXC** + - Add Update Script +- **Vaultwarden LXC** + - Make unattended install & Cleanup Script + +## 2022-02-18 + +### Changed + +- **Node-Red LXC** + - Add Install Themes Script + +## 2022-02-16 + +### Changed + +- **Home Assistant Container LXC** + - Add Options to Update Menu + +## 2022-02-14 + +### Changed + +- **Home Assistant Container LXC** + - Add Update Menu + +## 2022-02-13 + +### Changed + +- **Mariadb LXC** + - Add Adminer (formerly phpMinAdmin), a full-featured database management tool + +## 2022-02-12 + +### Changed + +- **Home Assistant Container LXC (Podman)** + - Add Yacht web interface for managing Podman containers + - new GUI script to copy data from a **Home Assistant LXC** to a **Podman Home Assistant LXC** + - Improve documentation for several LXC's + +## 2022-02-10 + +### Changed + +- **GamUntu LXC** + - New Script +- **Jellyfin Media Server LXC** + - new script to fix [start issue](https://github.com/tteck/Proxmox/issues/29#issue-1127457380) +- **MotionEye NVR LXC** + - New script + +## 2022-02-09 + +### Changed + +- **Zigbee2MQTT LXC** + - added USB passthrough during installation (no extra script) + - Improve documentation +- **Zwavejs2MQTT LXC** + - added USB passthrough during installation (no extra script) +- **Jellyfin Media Server LXC** + - Moved to testing due to issues. + - Changed install method. +- **Home Assistant Container LXC (Podman)** + - add script for easy Home Assistant update + +## 2022-02-06 + +### Changed + +- **Debian 11 LXC** + - Add Docker Support +- **Ubuntu 21.10 LXC** + - Add Docker Support + +## 2022-02-05 + +### Changed + +- **Vaultwarden LXC** + - New script + +## 2022-02-01 + +### Changed + +- **All Scripts** + - Fix issue where some networks were slow to assign a IP address to the container causing scripts to fail. + +## 2022-01-30 + +### Changed + +- **Zigbee2MQTT LXC** + - Clean up / Improve script + - Improve documentation + +## 2022-01-29 + +### Changed + +- **Node-Red LXC** + - Clean up / Improve script + - Improve documentation + +## 2022-01-25 + +### Changed + +- **Jellyfin Media Server LXC** + - new script + +## 2022-01-24 + +### Changed + +- **Plex Media Server LXC** + - better Hardware Acceleration Support + - `va-driver-all` is preinstalled + - now using Ubuntu 21.10 +- **misc** + - new GUI script to copy data from one Plex Media Server LXC to another Plex Media Server LXC + + +## Initial Catch up - 2022-01-23 + +### Changed + +- **Plex Media Server LXC** + - add Hardware Acceleration Support + - add script to install Intel Drivers +- **Zwavejs2MQTT LXC** + - new script to solve no auto start at boot +- **Nginx Proxy Manager LXC** + - new script to use Debian 11 +- **Ubuntu 21.10 LXC** + - new script +- **Mariadb LXC** + - add MariaDB Package Repository +- **MQTT LXC** + - add Eclipse Mosquitto Package Repository +- **Home Assistant Container LXC** + - change if ZFS filesystem is detected, execute automatic installation of static fuse-overlayfs + - add script for easy Home Assistant update +- **Home Assistant Container LXC (Podman)** + - change if ZFS filesystem is detected, execute automatic installation of static fuse-overlayfs +- **Home Assistant OS VM** + - change disk type from SATA to SCSI to follow Proxmox official recommendations of choosing VirtIO-SCSI with SCSI disk + - clean up +- **Proxmox VE 7 Post Install** + - new *No-Nag* method +- **misc** + - new GUI script to copy data from one Home Assistant LXC to another Home Assistant LXC + - new GUI script to copy data from one Zigbee2MQTT LXC to another Zigbee2MQTT LXC diff --git a/LICENSE b/LICENSE index 2f06395..3dfc60d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,9 +1,21 @@ MIT License -Copyright (c) 2025 jjripaper +Copyright (c) 2021-2025 tteck | community-scripts ORG -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: +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 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. +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/README.md b/README.md index 03f177f..a57205c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,114 @@ -# ProxmoxVE +
+

+ + + +

+
+ +
+

Proxmox VE Helper-Scripts

+

A Community Legacy in Memory of @tteck

+

+ + Website + + + Discord + + + Donate + + + Contribute + + + Guides + + + Changelog + +

+
+ +--- + +## 🚀 Project Overview + +**Proxmox VE Helper-Scripts** is a collection of tools to simplify the setup and management of Proxmox Virtual Environment (VE). Originally created by [tteck](https://github.com/tteck), these scripts are now continued by the community. Our goal is to preserve and expand upon tteck's work, providing an ongoing resource for Proxmox users worldwide. + +--- + +## 📦 Features + +- **Interactive Setup**: Choose between simple and advanced options for configuring VMs and LXC containers. +- **Customizable Configurations**: Advanced setup for fine-tuning your environment. +- **Seamless Integration**: Works seamlessly with Proxmox VE for a smooth experience. +- **Community-driven**: Actively maintained and improved by the Proxmox community. + +--- +## ✅ Requirements + +Ensure your system meets the following prerequisites: + +- **Proxmox VE version**: 8.x or higher +- **Linux**: Compatible with most distributions +- **Dependencies**: bash and curl should be installed. + +--- + +## 🚀 Installation + +To install the Proxmox Helper Scripts, follow these steps: + +1. Visit the [Website](https://helper-scripts.com/). +2. Search for the desired script, e.g., **"Home Assistant OS VM"**. +3. Copy the provided **Bash command** from the **"How To Install"** section. +4. Open the Proxmox shell on your **main node** and paste the command. +5. Press enter to start the installation! 🚀 + +--- + +## ❤️ Community and Contributions + +We appreciate any contributions to the project—whether it's bug reports, feature requests, documentation improvements, or spreading the word. Your involvement helps keep the project alive and sustainable. + +## 💖 Donate to Support the Project +- **Ko-Fi for Community Edition**: [Donate to support this project](https://ko-fi.com/community_scripts) – Donations go towards maintaining the project, testing infrastructure, and charity (cancer research, hospice care). 30% of the funds will be donated to charity. + +--- + +## 💬 Get Help + +Join our community for support: + +- **Discord**: Join our [Proxmox Helper Scripts Discord server](https://discord.gg/jsYVk5JBxq) for real-time support. +- **GitHub Discussions**: [Ask questions or report issues](https://github.com/community-scripts/ProxmoxVE/discussions). + +## 🤝 Report a Bug or Feature Request + +If you encounter any issues or have suggestions for improvement, file a new issue on our [GitHub issues page](https://github.com/community-scripts/ProxmoxVE/issues). You can also submit pull requests with solutions or enhancements! + +--- + +## ⭐ Star History + + + + + + Star History Chart + + + +## 📜 License + +This project is licensed under the [MIT License](LICENSE). + +
+
+

+ Proxmox® is a registered trademark of Proxmox Server Solutions GmbH. +

+ -Scripts de Proxmox \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..cf5e732 --- /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/jsYVk5JBxq) 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/api/.env.example b/api/.env.example new file mode 100644 index 0000000..fc7bdbb --- /dev/null +++ b/api/.env.example @@ -0,0 +1,5 @@ +MONGO_USER= +MONGO_PASSWORD= +MONGO_IP= +MONGO_PORT= +MONGO_DATABASE= \ No newline at end of file diff --git a/api/go.mod b/api/go.mod new file mode 100644 index 0000000..0297b1a --- /dev/null +++ b/api/go.mod @@ -0,0 +1,32 @@ +module proxmox-api + +go 1.23.2 + +require go.mongodb.org/mongo-driver v1.17.2 + +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.7.2 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/text v0.21.0 // indirect + gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.5.11 // indirect + gorm.io/gorm v1.25.12 // indirect +) diff --git a/api/go.sum b/api/go.sum new file mode 100644 index 0000000..ea649ff --- /dev/null +++ b/api/go.sum @@ -0,0 +1,83 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= +github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM= +go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= +gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= diff --git a/api/main.go b/api/main.go new file mode 100644 index 0000000..0227bf1 --- /dev/null +++ b/api/main.go @@ -0,0 +1,450 @@ +// Copyright (c) 2021-2025 community-scripts ORG +// Author: Michel Roegl-Brunner (michelroegl-brunner) +// License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "strconv" + "time" + + "github.com/gorilla/mux" + "github.com/joho/godotenv" + "github.com/rs/cors" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var client *mongo.Client +var collection *mongo.Collection + +func loadEnv() { + if err := godotenv.Load(); err != nil { + log.Fatal("Error loading .env file") + } +} + +// DataModel represents a single document in MongoDB +type DataModel struct { + ID primitive.ObjectID `json:"id" bson:"_id,omitempty"` + CT_TYPE uint `json:"ct_type" bson:"ct_type"` + DISK_SIZE float32 `json:"disk_size" bson:"disk_size"` + CORE_COUNT uint `json:"core_count" bson:"core_count"` + RAM_SIZE uint `json:"ram_size" bson:"ram_size"` + OS_TYPE string `json:"os_type" bson:"os_type"` + OS_VERSION string `json:"os_version" bson:"os_version"` + DISABLEIP6 string `json:"disableip6" bson:"disableip6"` + NSAPP string `json:"nsapp" bson:"nsapp"` + METHOD string `json:"method" bson:"method"` + CreatedAt time.Time `json:"created_at" bson:"created_at"` + PVEVERSION string `json:"pve_version" bson:"pve_version"` + STATUS string `json:"status" bson:"status"` + RANDOM_ID string `json:"random_id" bson:"random_id"` + TYPE string `json:"type" bson:"type"` + ERROR string `json:"error" bson:"error"` +} + +type StatusModel struct { + RANDOM_ID string `json:"random_id" bson:"random_id"` + ERROR string `json:"error" bson:"error"` + STATUS string `json:"status" bson:"status"` +} + +type CountResponse struct { + TotalEntries int64 `json:"total_entries"` + StatusCount map[string]int64 `json:"status_count"` + NSAPPCount map[string]int64 `json:"nsapp_count"` +} + +// ConnectDatabase initializes the MongoDB connection +func ConnectDatabase() { + loadEnv() + + mongoURI := fmt.Sprintf("mongodb://%s:%s@%s:%s", + os.Getenv("MONGO_USER"), + os.Getenv("MONGO_PASSWORD"), + os.Getenv("MONGO_IP"), + os.Getenv("MONGO_PORT")) + + database := os.Getenv("MONGO_DATABASE") + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + var err error + client, err = mongo.Connect(ctx, options.Client().ApplyURI(mongoURI)) + if err != nil { + log.Fatal("Failed to connect to MongoDB!", err) + } + collection = client.Database(database).Collection("data_models") + fmt.Println("Connected to MongoDB on 10.10.10.18") +} + +// UploadJSON handles API requests and stores data as a document in MongoDB +func UploadJSON(w http.ResponseWriter, r *http.Request) { + var input DataModel + + if err := json.NewDecoder(r.Body).Decode(&input); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + input.CreatedAt = time.Now() + + _, err := collection.InsertOne(context.Background(), input) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + log.Println("Received data:", input) + w.WriteHeader(http.StatusCreated) + json.NewEncoder(w).Encode(map[string]string{"message": "Data saved successfully"}) +} + +// UpdateStatus updates the status of a record based on RANDOM_ID +func UpdateStatus(w http.ResponseWriter, r *http.Request) { + var input StatusModel + + if err := json.NewDecoder(r.Body).Decode(&input); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + filter := bson.M{"random_id": input.RANDOM_ID} + update := bson.M{"$set": bson.M{"status": input.STATUS, "error": input.ERROR}} + + _, err := collection.UpdateOne(context.Background(), filter, update) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + log.Println("Updated data:", input) + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(map[string]string{"message": "Record updated successfully"}) +} + +// GetDataJSON fetches all data from MongoDB +func GetDataJSON(w http.ResponseWriter, r *http.Request) { + var records []DataModel + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + cursor, err := collection.Find(ctx, bson.M{}) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var record DataModel + if err := cursor.Decode(&record); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + records = append(records, record) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(records) +} +func GetPaginatedData(w http.ResponseWriter, r *http.Request) { + page, _ := strconv.Atoi(r.URL.Query().Get("page")) + limit, _ := strconv.Atoi(r.URL.Query().Get("limit")) + if page < 1 { + page = 1 + } + if limit < 1 { + limit = 10 + } + skip := (page - 1) * limit + var records []DataModel + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + options := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit)) + cursor, err := collection.Find(ctx, bson.M{}, options) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var record DataModel + if err := cursor.Decode(&record); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + records = append(records, record) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(records) +} + +func GetSummary(w http.ResponseWriter, r *http.Request) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + totalCount, err := collection.CountDocuments(ctx, bson.M{}) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + statusCount := make(map[string]int64) + nsappCount := make(map[string]int64) + + pipeline := []bson.M{ + {"$group": bson.M{"_id": "$status", "count": bson.M{"$sum": 1}}}, + } + cursor, err := collection.Aggregate(ctx, pipeline) + if err == nil { + for cursor.Next(ctx) { + var result struct { + ID string `bson:"_id"` + Count int64 `bson:"count"` + } + if err := cursor.Decode(&result); err == nil { + statusCount[result.ID] = result.Count + } + } + } + + pipeline = []bson.M{ + {"$group": bson.M{"_id": "$nsapp", "count": bson.M{"$sum": 1}}}, + } + cursor, err = collection.Aggregate(ctx, pipeline) + if err == nil { + for cursor.Next(ctx) { + var result struct { + ID string `bson:"_id"` + Count int64 `bson:"count"` + } + if err := cursor.Decode(&result); err == nil { + nsappCount[result.ID] = result.Count + } + } + } + + response := CountResponse{ + TotalEntries: totalCount, + StatusCount: statusCount, + NSAPPCount: nsappCount, + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(response) +} + +func GetByNsapp(w http.ResponseWriter, r *http.Request) { + nsapp := r.URL.Query().Get("nsapp") + var records []DataModel + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + cursor, err := collection.Find(ctx, bson.M{"nsapp": nsapp}) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var record DataModel + if err := cursor.Decode(&record); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + records = append(records, record) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(records) +} + +func GetByDateRange(w http.ResponseWriter, r *http.Request) { + + startDate := r.URL.Query().Get("start_date") + endDate := r.URL.Query().Get("end_date") + + if startDate == "" || endDate == "" { + http.Error(w, "Both start_date and end_date are required", http.StatusBadRequest) + return + } + + start, err := time.Parse("2006-01-02T15:04:05.999999+00:00", startDate+"T00:00:00+00:00") + if err != nil { + http.Error(w, "Invalid start_date format", http.StatusBadRequest) + return + } + + end, err := time.Parse("2006-01-02T15:04:05.999999+00:00", endDate+"T23:59:59+00:00") + if err != nil { + http.Error(w, "Invalid end_date format", http.StatusBadRequest) + return + } + + var records []DataModel + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + cursor, err := collection.Find(ctx, bson.M{ + "created_at": bson.M{ + "$gte": start, + "$lte": end, + }, + }) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var record DataModel + if err := cursor.Decode(&record); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + records = append(records, record) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(records) +} +func GetByStatus(w http.ResponseWriter, r *http.Request) { + status := r.URL.Query().Get("status") + var records []DataModel + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + cursor, err := collection.Find(ctx, bson.M{"status": status}) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var record DataModel + if err := cursor.Decode(&record); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + records = append(records, record) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(records) +} + +func GetByOS(w http.ResponseWriter, r *http.Request) { + osType := r.URL.Query().Get("os_type") + osVersion := r.URL.Query().Get("os_version") + var records []DataModel + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + cursor, err := collection.Find(ctx, bson.M{"os_type": osType, "os_version": osVersion}) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var record DataModel + if err := cursor.Decode(&record); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + records = append(records, record) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(records) +} + +func GetErrors(w http.ResponseWriter, r *http.Request) { + errorCount := make(map[string]int) + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + cursor, err := collection.Find(ctx, bson.M{"error": bson.M{"$ne": ""}}) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var record DataModel + if err := cursor.Decode(&record); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if record.ERROR != "" { + errorCount[record.ERROR]++ + } + } + + type ErrorCountResponse struct { + Error string `json:"error"` + Count int `json:"count"` + } + + var errorCounts []ErrorCountResponse + for err, count := range errorCount { + errorCounts = append(errorCounts, ErrorCountResponse{ + Error: err, + Count: count, + }) + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(struct { + ErrorCounts []ErrorCountResponse `json:"error_counts"` + }{ + ErrorCounts: errorCounts, + }) +} + +func main() { + ConnectDatabase() + + router := mux.NewRouter() + router.HandleFunc("/upload", UploadJSON).Methods("POST") + router.HandleFunc("/upload/updatestatus", UpdateStatus).Methods("POST") + router.HandleFunc("/data/json", GetDataJSON).Methods("GET") + router.HandleFunc("/data/paginated", GetPaginatedData).Methods("GET") + router.HandleFunc("/data/summary", GetSummary).Methods("GET") + router.HandleFunc("/data/nsapp", GetByNsapp).Methods("GET") + router.HandleFunc("/data/date", GetByDateRange).Methods("GET") + router.HandleFunc("/data/status", GetByStatus).Methods("GET") + router.HandleFunc("/data/os", GetByOS).Methods("GET") + router.HandleFunc("/data/errors", GetErrors).Methods("GET") + + c := cors.New(cors.Options{ + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{"GET", "POST"}, + AllowedHeaders: []string{"Content-Type", "Authorization"}, + AllowCredentials: true, + }) + + handler := c.Handler(router) + + fmt.Println("Server running on port 8080") + log.Fatal(http.ListenAndServe(":8080", handler)) +} diff --git a/ct/2fauth.sh b/ct/2fauth.sh new file mode 100644 index 0000000..4c9aab3 --- /dev/null +++ b/ct/2fauth.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: jkrgr0 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://docs.2fauth.app/ + +APP="2FAuth" +var_tags="2fa;authenticator" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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}" + + $STD apt-get update + $STD apt-get -y upgrade + + # Creating Backup + msg_info "Creating Backup" + mv "/opt/2fauth" "/opt/2fauth-backup" + if ! dpkg -l | grep -q 'php8.3'; then + cp /etc/nginx/conf.d/2fauth.conf /etc/nginx/conf.d/2fauth.conf.bak + fi + msg_ok "Backup Created" + + # Upgrade PHP + if ! dpkg -l | grep -q 'php8.3'; then + $STD apt-get install -y \ + lsb-release \ + gpg + curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/deb.sury.org-php.gpg + echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list + $STD apt-get update + $STD apt-get install -y php8.3-{bcmath,common,ctype,curl,fileinfo,fpm,gd,mbstring,mysql,xml,cli,intl} + sed -i 's/php8.2/php8.3/g' /etc/nginx/conf.d/2fauth.conf + fi + + # Execute Update + curl -fsSL -o "${RELEASE}.zip" "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 + $STD composer install --no-dev --prefer-source + + php artisan 2fauth:install + + $STD systemctl restart nginx + + # Cleaning up + msg_info "Cleaning Up" + rm -rf "v${RELEASE}.zip" + if dpkg -l | grep -q 'php8.2'; then + $STD apt-get remove --purge -y php8.2* + fi + $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/actualbudget.sh b/ct/actualbudget.sh new file mode 100644 index 0000000..10df637 --- /dev/null +++ b/ct/actualbudget.sh @@ -0,0 +1,136 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://actualbudget.org/ + +APP="Actual Budget" +var_tags="finance" +var_cpu="2" +var_ram="4096" +var_disk="7" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/actualbudget ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then + msg_info "Stopping ${APP}" + systemctl stop actualbudget + msg_ok "${APP} Stopped" + + if ! command -v git &>/dev/null; then + msg_info "Installing git" + $STD apt-get update + $STD apt-get install -y git + msg_ok "Installed git" + fi + + msg_info "Updating ${APP} to ${RELEASE}" + cd /tmp || exit + curl -fsSL "https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz" -o "v${RELEASE}.tar.gz" + + mv /opt/actualbudget /opt/actualbudget_bak + tar -xzf "v${RELEASE}.tar.gz" + mv "actual-${RELEASE}" /opt/actualbudget + + mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config} + for dir in server-files .migrate user-files migrations; do + if [[ -d /opt/actualbudget_bak/$dir ]]; then + mv /opt/actualbudget_bak/$dir/* /opt/actualbudget-data/$dir/ || true + fi + done + if [[ -f /opt/actualbudget-data/migrate/.migrations ]]; then + sed -i 's/null/1732656575219/g' /opt/actualbudget-data/migrate/.migrations + sed -i 's/null/1732656575220/g' /opt/actualbudget-data/migrate/.migrations + fi + if [[ -f /opt/actualbudget/server-files/account.sqlite ]] && [[ ! -f /opt/actualbudget-data/server-files/account.sqlite ]]; then + mv /opt/actualbudget/server-files/account.sqlite /opt/actualbudget-data/server-files/account.sqlite + fi + + if [[ -f /opt/actualbudget_bak/selfhost.key ]]; then + mv /opt/actualbudget_bak/selfhost.key /opt/actualbudget/selfhost.key + mv /opt/actualbudget_bak/selfhost.crt /opt/actualbudget/selfhost.crt + fi + + if [[ -f /opt/actualbudget_bak/.env ]]; then + mv /opt/actualbudget_bak/.env /opt/actualbudget-data/.env + else + cat </opt/actualbudget-data/.env +ACTUAL_UPLOAD_DIR=/opt/actualbudget-data/upload +ACTUAL_DATA_DIR=/opt/actualbudget-data +ACTUAL_SERVER_FILES_DIR=/opt/actualbudget-data/server-files +ACTUAL_USER_FILES=/opt/actualbudget-data/user-files +PORT=5006 +ACTUAL_TRUSTED_PROXIES="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.1/32,::1/128,fc00::/7" +ACTUAL_HTTPS_KEY=/opt/actualbudget/selfhost.key +ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt +EOF + fi + cd /opt/actualbudget || exit + export NODE_OPTIONS="--max_old_space_size=3072" + $STD yarn install + $STD yarn run build:server + #$STD yarn workspaces focus @actual-app/sync-server --production + echo "${RELEASE}" >/opt/actualbudget_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting ${APP}" + cat </etc/systemd/system/actualbudget.service +[Unit] +Description=Actual Budget Service +After=network.target + +[Service] +Type=simple +User=root +Group=root +WorkingDirectory=/opt/actualbudget +EnvironmentFile=/opt/actualbudget-data/.env +ExecStart=/usr/bin/yarn start:server +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload + systemctl start actualbudget + msg_ok "Started ${APP}" + + msg_info "Cleaning Up" + rm -rf /opt/actualbudget_bak + rm -rf "/tmp/v${RELEASE}.tar.gz" + 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}https://${IP}:5006${CL}" diff --git a/ct/adguard.sh b/ct/adguard.sh new file mode 100644 index 0000000..4143652 --- /dev/null +++ b/ct/adguard.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://adguard.com/ + +APP="Adguard" +var_tags="adblock" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +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/adventurelog.sh b/ct/adventurelog.sh new file mode 100644 index 0000000..5df1057 --- /dev/null +++ b/ct/adventurelog.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://adventurelog.app/ + +APP="AdventureLog" +var_tags="traveling" +var_disk="7" +var_cpu="2" +var_ram="2048" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/adventurelog ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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}" + mv /opt/adventurelog/ /opt/adventurelog-backup/ + curl -fsSL -o /opt/v${RELEASE}.zip "https://github.com/seanmorley15/AdventureLog/archive/refs/tags/v${RELEASE}.zip" + unzip -q /opt/v${RELEASE}.zip -d /opt/ + mv /opt/AdventureLog-${RELEASE} /opt/adventurelog + + mv /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env + mv /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media + cd /opt/adventurelog/backend/server + $STD pip install --upgrade pip + $STD pip install -r requirements.txt + $STD python3 manage.py collectstatic --noinput + $STD python3 manage.py migrate + + mv /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env + cd /opt/adventurelog/frontend + $STD pnpm install + $STD pnpm run build + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting Services" + systemctl start adventurelog-backend + systemctl start adventurelog-frontend + msg_ok "Started Services" + + msg_info "Cleaning Up" + rm -rf /opt/v${RELEASE}.zip + rm -rf /opt/adventurelog-backup + 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/agentdvr.sh b/ct/agentdvr.sh new file mode 100644 index 0000000..e398db3 --- /dev/null +++ b/ct/agentdvr.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.ispyconnect.com/ + +APP="AgentDVR" +var_tags="dvr" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="ubuntu" +var_version="22.04" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/agentdvr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${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}:8090${CL}" \ No newline at end of file diff --git a/ct/alpine-docker.sh b/ct/alpine-docker.sh new file mode 100644 index 0000000..2c3c16e --- /dev/null +++ b/ct/alpine-docker.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.docker.com/ + +APP="Alpine-Docker" +var_tags="docker;alpine" +var_cpu="1" +var_ram="1024" +var_disk="2" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + if ! apk -e info newt >/dev/null 2>&1; then + apk add -q newt + fi + while true; do + CHOICE=$( + whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 1 \ + "1" "Check for Docker Updates" 3>&2 2>&1 1>&3 + ) + exit_status=$? + if [ $exit_status == 1 ]; then + clear + exit-script + fi + header_info + case $CHOICE in + 1) + apk update && apk upgrade + exit + ;; + esac + done +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" \ No newline at end of file diff --git a/ct/alpine-gitea.sh b/ct/alpine-gitea.sh new file mode 100644 index 0000000..e15541a --- /dev/null +++ b/ct/alpine-gitea.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://gitea.io + +APP="Alpine-Gitea" +var_tags="alpine;git" +var_cpu="1" +var_ram="256" +var_disk="1" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + msg_info "Updating Alpine Packages" + apk update + apk upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Updating Gitea" + apk upgrade gitea + msg_ok "Updated Gitea" + + msg_info "Restarting Gitea" + rc-service gitea restart + msg_ok "Restarted Gitea" +} + +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/alpine-grafana.sh b/ct/alpine-grafana.sh new file mode 100644 index 0000000..dc60d0d --- /dev/null +++ b/ct/alpine-grafana.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://grafana.com/ + +APP="Alpine-Grafana" +var_tags="alpine;monitoring" +var_cpu="1" +var_ram="256" +var_disk="1" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + if ! apk -e info newt >/dev/null 2>&1; then + apk add -q newt + fi + LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) + while true; do + CHOICE=$( + whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 3 \ + "1" "Check for Grafana Updates" \ + "2" "Allow 0.0.0.0 for listening" \ + "3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3 + ) + exit_status=$? + if [ $exit_status == 1 ]; then + clear + exit-script + fi + header_info + case $CHOICE in + 1) + apk update && apk upgrade + exit + ;; + 2) + sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/grafana + service grafana restart + exit + ;; + 3) + sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/grafana + service grafana restart + exit + ;; + esac + done +} + +start +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" \ No newline at end of file diff --git a/ct/alpine-it-tools.sh b/ct/alpine-it-tools.sh new file mode 100644 index 0000000..e107c2d --- /dev/null +++ b/ct/alpine-it-tools.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: nicedevil007 (NiceDevil) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://it-tools.tech/ + +APP="Alpine-IT-Tools" +var_tags="alpine;development" +var_cpu="1" +var_ram="256" +var_disk="0.2" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [ ! -d /usr/share/nginx/html ]; then + msg_error "No ${APP} Installation Found!" + exit 1 + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/CorentinTh/it-tools/releases/latest | grep '"tag_name":' | cut -d '"' -f4) + if [ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ] || [ ! -f /opt/${APP}_version.txt ]; then + DOWNLOAD_URL="https://github.com/CorentinTh/it-tools/releases/download/${RELEASE}/it-tools-${RELEASE#v}.zip" + msg_info "Updating ${APP} LXC" + curl -fsSL -o it-tools.zip "$DOWNLOAD_URL" + mkdir -p /usr/share/nginx/html + rm -rf /usr/share/nginx/html/* + unzip -q it-tools.zip -d /tmp/it-tools + cp -r /tmp/it-tools/dist/* /usr/share/nginx/html + rm -rf /tmp/it-tools + rm -f it-tools.zip + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + + exit 0 +} + +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}http://${IP}${CL}" \ No newline at end of file diff --git a/ct/alpine-mariadb.sh b/ct/alpine-mariadb.sh new file mode 100644 index 0000000..aa63372 --- /dev/null +++ b/ct/alpine-mariadb.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://mariadb.org + +APP="Alpine-MariaDB" +var_tags="${var_tags:-alpine;database}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-1}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.21}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + msg_info "Updating Alpine Packages" + $STD apk update + $STD apk upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Updating MariaDB" + $STD apk upgrade mariadb mariadb-client + msg_ok "Updated MariaDB" + + msg_info "Restarting MariaDB" + $STD rc-service mariadb restart + msg_ok "Restarted MariaDB" + + exit 0 +} + +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}:3306${CL}" diff --git a/ct/alpine-nextcloud.sh b/ct/alpine-nextcloud.sh new file mode 100644 index 0000000..899214d --- /dev/null +++ b/ct/alpine-nextcloud.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://nextcloud.com/ + +APP="Alpine-Nextcloud" +var_tags="alpine;cloud" +var_cpu="2" +var_ram="1024" +var_disk="2" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + if [[ ! -d /usr/share/webapps/nextcloud ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if ! apk -e info newt >/dev/null 2>&1; then + apk add -q newt + fi + while true; do + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \ + "1" "Nextcloud Login Credentials" ON \ + "2" "Renew Self-signed Certificate" OFF \ + 3>&1 1>&2 2>&3) + exit_status=$? + if [ $exit_status == 1 ]; then + clear + exit-script + fi + header_info + case $CHOICE in + 1) + cat nextcloud.creds + exit + ;; + 2) + openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/nextcloud-selfsigned.key -out /etc/ssl/certs/nextcloud-selfsigned.crt -subj "/C=US/O=Nextcloud/OU=Domain Control Validated/CN=nextcloud.local" >/dev/null 2>&1 + rc-service nginx restart + exit + ;; + esac + done +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${APP} should be reachable by going to the following URL. + ${BL}https://${IP}${CL} \n" \ No newline at end of file diff --git a/ct/alpine-node-red.sh b/ct/alpine-node-red.sh new file mode 100644 index 0000000..c9afc68 --- /dev/null +++ b/ct/alpine-node-red.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://nodered.org + +APP="Alpine-Node-RED" +var_tags="${var_tags:-alpine;automation}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-1}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.21}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + msg_info "Updating Alpine Packages" + $STD apk update + $STD apk upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Updating Node.js and npm" + $STD apk upgrade nodejs npm + msg_ok "Updated Node.js and npm" + + msg_info "Updating Node-RED" + $STD npm install -g --unsafe-perm node-red + msg_ok "Updated Node-RED" + + msg_info "Restarting Node-RED" + $STD rc-service nodered restart + msg_ok "Restarted Node-RED" + + exit 0 +} + +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}:1880${CL}" diff --git a/ct/alpine-postgresql.sh b/ct/alpine-postgresql.sh new file mode 100644 index 0000000..c8afad0 --- /dev/null +++ b/ct/alpine-postgresql.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://postgresql.org/ + +APP="Alpine-PostgreSQL" +var_tags="${var_tags:-alpine;database}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-1}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.21}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + msg_info "Updating Alpine Packages" + $STD apk update + $STD apk upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Updating PostgreSQL" + $STD apk upgrade postgresql postgresql-contrib + msg_ok "Updated PostgreSQL" + + msg_info "Restarting PostgreSQL" + $STD rc-service postgresql restart + msg_ok "Restarted PostgreSQL" + + exit 0 +} + +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}:5432${CL}" diff --git a/ct/alpine-prometheus.sh b/ct/alpine-prometheus.sh new file mode 100644 index 0000000..bb3066e --- /dev/null +++ b/ct/alpine-prometheus.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://prometheus.io/ + +APP="Alpine-Prometheus" +var_tags="${var_tags:-alpine;monitoring}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-1}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.21}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + msg_info "Updating Alpine Packages" + $STD apk update + $STD apk upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Updating Prometheus" + $STD apk upgrade prometheus + msg_ok "Updated Prometheus" + + msg_info "Restarting Prometheus" + $STD rc-service prometheus restart + msg_ok "Restarted Prometheus" + + exit 0 +} + +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}:9090${CL}" diff --git a/ct/alpine-redis.sh b/ct/alpine-redis.sh new file mode 100644 index 0000000..256e022 --- /dev/null +++ b/ct/alpine-redis.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://redis.io/ + +APP="Alpine-Redis" +var_tags="alpine;database" +var_cpu="1" +var_ram="256" +var_disk="1" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + if ! apk -e info newt >/dev/null 2>&1; then + apk add -q newt + fi + LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) + while true; do + CHOICE=$( + whiptail --backtitle "Proxmox VE Helper Scripts" --title "Redis Management" --menu "Select option" 11 58 3 \ + "1" "Update Redis" \ + "2" "Allow 0.0.0.0 for listening" \ + "3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3 + ) + exit_status=$? + if [ $exit_status == 1 ]; then + clear + exit-script + fi + header_info + case $CHOICE in + 1) + msg_info "Updating Redis" + apk update && apk upgrade redis + rc-service redis restart + msg_ok "Redis updated successfully!" + exit + ;; + 2) + msg_info "Setting Redis to listen on all interfaces" + sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf + rc-service redis restart + msg_ok "Redis now listens on all interfaces!" + exit + ;; + 3) + msg_info "Setting Redis to listen only on ${LXCIP}" + sed -i "s/^bind .*/bind ${LXCIP}/" /etc/redis.conf + rc-service redis restart + msg_ok "Redis now listens only on ${LXCIP}!" + exit + ;; + esac + done +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${APP} should be reachable on port 6379. + ${BL}redis-cli -h ${IP} -p 6379${CL} \n" \ No newline at end of file diff --git a/ct/alpine-vaultwarden.sh b/ct/alpine-vaultwarden.sh new file mode 100644 index 0000000..7df7586 --- /dev/null +++ b/ct/alpine-vaultwarden.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/dani-garcia/vaultwarden + +APP="Alpine-Vaultwarden" +var_tags="alpine;vault" +var_cpu="1" +var_ram="256" +var_disk="0.5" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + if ! apk -e info newt >/dev/null 2>&1; then + apk add -q newt + fi + while true; do + CHOICE=$( + whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 2 \ + "1" "Update Vaultwarden" \ + "2" "Reset ADMIN_TOKEN" 3>&2 2>&1 1>&3 + ) + exit_status=$? + if [ $exit_status == 1 ]; then + clear + exit-script + fi + header_info + case $CHOICE in + 1) + apk update && apk upgrade && rc-service vaultwarden restart -q + exit + ;; + 2) + if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Setup your ADMIN_TOKEN (make it strong)" 10 58 3>&1 1>&2 2>&3); then + if [[ -z "$NEWTOKEN" ]]; then exit-script; fi + if ! command -v argon2 >/dev/null 2>&1; then apk add argon2 &>/dev/null; fi + TOKEN=$(echo -n ${NEWTOKEN} | argon2 "$(openssl rand -base64 32)" -e -id -k 19456 -t 2 -p 1) + if [[ ! -f /var/lib/vaultwarden/config.json ]]; then + sed -i "s|export ADMIN_TOKEN=.*|export ADMIN_TOKEN='${TOKEN}'|" /etc/conf.d/vaultwarden + else + sed -i "s|\"admin_token\": .*|\"admin_token\": \"${TOKEN}\",|" /var/lib/vaultwarden/config.json + fi + rc-service vaultwarden restart -q + fi + clear + exit + ;; + esac + done +} + +start +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" \ No newline at end of file diff --git a/ct/alpine-wireguard.sh b/ct/alpine-wireguard.sh new file mode 100644 index 0000000..48277ed --- /dev/null +++ b/ct/alpine-wireguard.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.wireguard.com/ + +APP="Alpine-Wireguard" +var_tags="${var_tags:-alpine;vpn}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-1}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.21}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + msg_info "Updating Alpine Packages" + $STD apk update + $STD apk upgrade + msg_ok "Updated Alpine Packages" + + msg_info "update wireguard-tools" + $STD apk add --no-cache --upgrade wireguard-tools + msg_ok "wireguard-tools updated" + + if [[ -d /etc/wgdashboard/src ]]; then + msg_info "update WGDashboard" + cd /etc/wgdashboard/src || exit + $STD echo "y" | ./wgd.sh update + $STD ./wgd.sh start + msg_ok "WGDashboard updated" + fi + + exit 0 +} + +start +build_container +description + +msg_ok "Completed Successfully!\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}" diff --git a/ct/alpine-zigbee2mqtt.sh b/ct/alpine-zigbee2mqtt.sh new file mode 100644 index 0000000..d6497da --- /dev/null +++ b/ct/alpine-zigbee2mqtt.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.zigbee2mqtt.io/ + +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.21" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + if ! apk -e info newt >/dev/null 2>&1; then + apk add -q newt + fi + while true; do + CHOICE=$( + whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 1 \ + "1" "Check for Zigbee2MQTT Updates" 3>&2 2>&1 1>&3 + ) + exit_status=$? + if [ $exit_status == 1 ]; then + clear + exit-script + fi + header_info + case $CHOICE in + 1) + apk update && apk upgrade + exit + ;; + esac + done +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" \ No newline at end of file diff --git a/ct/alpine.sh b/ct/alpine.sh new file mode 100644 index 0000000..0d0932a --- /dev/null +++ b/ct/alpine.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://alpinelinux.org/ + +APP="Alpine" +var_tags="os;alpine" +var_cpu="1" +var_ram="512" +var_disk="0.1" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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) + + header_info + if [ "$UPD" == "1" ]; then + apk update && apk upgrade + exit + fi +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" \ No newline at end of file diff --git a/ct/apache-cassandra.sh b/ct/apache-cassandra.sh new file mode 100644 index 0000000..c83e2f2 --- /dev/null +++ b/ct/apache-cassandra.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://cassandra.apache.org/_/index.html + +APP="Apache-Cassandra" +var_tags="database;NoSQL" +var_cpu="1" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 "Currently we don't provide an update function for this ${APP}." + exit +} + +start +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 new file mode 100644 index 0000000..b182dbe --- /dev/null +++ b/ct/apache-couchdb.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://couchdb.apache.org/ + +APP="Apache-CouchDB" +var_tags="database" +var_cpu="2" +var_ram="4096" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 "Currently we don't provide an update function for this ${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}:5984/_utils/${CL}" \ No newline at end of file diff --git a/ct/apache-guacamole.sh b/ct/apache-guacamole.sh new file mode 100644 index 0000000..b6d22fd --- /dev/null +++ b/ct/apache-guacamole.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Michel Roegl-Brunner (michelroegl-brunner) +# License: | MIT https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://guacamole.apache.org/ + +APP="Apache-Guacamole" +var_tags="webserver;remote" +var_disk="4" +var_cpu="1" +var_ram="2048" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 "Currently we don't provide an update function for this ${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}" \ No newline at end of file diff --git a/ct/apache-tika.sh b/ct/apache-tika.sh new file mode 100755 index 0000000..d9a9022 --- /dev/null +++ b/ct/apache-tika.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Andy Grunwald (andygrunwald) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/apache/tika/ + +APP="Apache-Tika" +var_tags="document" +var_cpu="1" +var_ram="2048" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/apache-tika.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE="$(curl -fsSL https://dlcdn.apache.org/tika/ | grep -oP '(?<=href=")[0-9]+\.[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1)" + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping ${APP}" + systemctl stop apache-tika + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt/apache-tika + curl -fsSL -o tika-server-standard-${RELEASE}.jar "https://dlcdn.apache.org/tika/${RELEASE}/tika-server-standard-${RELEASE}.jar" + mv --force tika-server-standard.jar tika-server-standard-prev-version.jar + mv tika-server-standard-${RELEASE}.jar tika-server-standard.jar + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to v${RELEASE}" + + msg_info "Starting ${APP}" + systemctl start apache-tika + msg_ok "Started ${APP}" + msg_info "Cleaning Up" + rm -rf /opt/apache-tika/tika-server-standard-prev-version.jar + msg_ok "Cleanup Completed" + 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}:9998${CL}" \ No newline at end of file diff --git a/ct/apache-tomcat.sh b/ct/apache-tomcat.sh new file mode 100644 index 0000000..eea276e --- /dev/null +++ b/ct/apache-tomcat.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://tomcat.apache.org/ + +APP="Apache-Tomcat" +var_tags="webserver" +var_disk="5" +var_cpu="1" +var_ram="1024" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if ! ls -d /opt/tomcat-* >/dev/null 2>&1; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${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${CL}" \ No newline at end of file diff --git a/ct/apt-cacher-ng.sh b/ct/apt-cacher-ng.sh new file mode 100644 index 0000000..4eb71a4 --- /dev/null +++ b/ct/apt-cacher-ng.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://wiki.debian.org/AptCacherNg + +APP="Apt-Cacher-NG" +var_tags="caching" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:3142/acng-report.html${CL}" \ No newline at end of file diff --git a/ct/archivebox.sh b/ct/archivebox.sh new file mode 100644 index 0000000..8f216aa --- /dev/null +++ b/ct/archivebox.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://archivebox.io/ + +APP="ArchiveBox" +var_tags="archive;bookmark" +var_cpu="2" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 "Starting ${APP}" + systemctl start archivebox + msg_ok "Started ${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 URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000/admin/login${CL}" \ No newline at end of file diff --git a/ct/aria2.sh b/ct/aria2.sh new file mode 100644 index 0000000..78c3049 --- /dev/null +++ b/ct/aria2.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://aria2.github.io/ + +APP="Aria2" +var_tags="download-utility" +var_cpu="2" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:6880${CL}" \ No newline at end of file diff --git a/ct/audiobookshelf.sh b/ct/audiobookshelf.sh new file mode 100644 index 0000000..4085d50 --- /dev/null +++ b/ct/audiobookshelf.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.audiobookshelf.org/ + +APP="audiobookshelf" +var_tags="podcast;audiobook" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +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}:13378${CL}" \ No newline at end of file diff --git a/ct/authelia.sh b/ct/authelia.sh new file mode 100644 index 0000000..11d3acb --- /dev/null +++ b/ct/authelia.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: thost96 (thost96) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.authelia.com/ + +APP="Authelia" +TAGS="" +var_cpu="1" +var_ram="512" +var_disk="2" +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 [[ ! -d "/etc/authelia/" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/authelia/authelia/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ "${RELEASE}" != "$(/usr/bin/authelia -v | awk '{print substr($3, 2, length($2)) }')" ]]; then + msg_info "Updating $APP to ${RELEASE}" + $STD apt-get update + $STD apt-get -y upgrade + curl -fsSL "https://github.com/authelia/authelia/releases/download/${RELEASE}/authelia_${RELEASE}_amd64.deb" -o $(basename "https://github.com/authelia/authelia/releases/download/${RELEASE}/authelia_${RELEASE}_amd64.deb") + $STD dpkg -i "authelia_${RELEASE}_amd64.deb" + msg_info "Cleaning Up" + rm -f "authelia_${RELEASE}_amd64.deb" + $STD apt-get -y autoremove + $STD apt-get -y autoclean + msg_ok "Cleanup Completed" + 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}:9091${CL}" diff --git a/ct/authentik.sh b/ct/authentik.sh new file mode 100644 index 0000000..4dcf99e --- /dev/null +++ b/ct/authentik.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: remz1337 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://goauthentik.io/ + +APP="Authentik" +var_tags="identity-provider" +var_disk="12" +var_cpu="6" +var_ram="8192" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "${RELEASE}" -o "authentik.tar.gz" + tar -xzf authentik.tar.gz -C /opt/authentik --strip-components 1 --overwrite + rm -rf authentik.tar.gz + cd /opt/authentik/website + $STD npm install + $STD npm run build-bundled + cd /opt/authentik/web + $STD npm install + $STD npm run build + msg_ok "Built ${APP} website" + + msg_info "Building ${APP} server" + cd /opt/authentik + go mod download + go build -o /go/authentik ./cmd/server + go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/ + msg_ok "Built ${APP} server" + + msg_info "Installing Python Dependencies" + cd /opt/authentik + $STD poetry install --only=main --no-ansi --no-interaction --no-root + $STD poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt + $STD pip install --no-cache-dir -r requirements.txt + $STD pip install . + msg_ok "Installed Python Dependencies" + + msg_info "Updating ${APP} to v${RELEASE} (Patience)" + cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints + $STD bash /opt/authentik/lifecycle/ak migrate + 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 new file mode 100644 index 0000000..7da6af3 --- /dev/null +++ b/ct/autobrr.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://autobrr.com/ + +APP="Autobrr" +var_tags="arr;" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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/* + curl -fsSL "$(curl -fsSL https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4)" -o $(basename "$(curl -fsSL 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 +} + +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}:7474${CL}" diff --git a/ct/baikal.sh b/ct/baikal.sh new file mode 100644 index 0000000..92fed58 --- /dev/null +++ b/ct/baikal.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://sabre.io/baikal/ + +APP="Baikal" +var_tags="Dav" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/baikal ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/sabre-io/Baikal/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 apache2 + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt + curl -fsSL "https://github.com/sabre-io/baikal/releases/download/${RELEASE}/baikal-${RELEASE}.zip" -o $(basename "https://github.com/sabre-io/baikal/releases/download/${RELEASE}/baikal-${RELEASE}.zip") + mv /opt/baikal /opt/baikal-backup + unzip -o -q "baikal-${RELEASE}.zip" + cp -r /opt/baikal-backup/config/baikal.yaml /opt/baikal/config/ + cp -r /opt/baikal-backup/Specific/ /opt/baikal/ + chown -R www-data:www-data /opt/baikal/ + chmod -R 755 /opt/baikal/ + 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 -rf "/opt/baikal-${RELEASE}.zip" + rm -rf /opt/baikal-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/barcode-buddy.sh b/ct/barcode-buddy.sh new file mode 100644 index 0000000..306610d --- /dev/null +++ b/ct/barcode-buddy.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Forceu/barcodebuddy + +APP="Barcode-Buddy" +var_tags="grocery;household" +var_cpu="1" +var_ram="512" +var_disk="3" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/barcodebuddy ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/Forceu/barcodebuddy/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 + systemctl stop barcodebuddy + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt + mv /opt/barcodebuddy/ /opt/barcodebuddy-backup + curl -fsSL "https://github.com/Forceu/barcodebuddy/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/Forceu/barcodebuddy/archive/refs/tags/v${RELEASE}.zip") + unzip -q "v${RELEASE}.zip" + mv "/opt/barcodebuddy-${RELEASE}" /opt/barcodebuddy + cp -r /opt/barcodebuddy-backup/data/. /opt/barcodebuddy/data + chown -R www-data:www-data /opt/barcodebuddy/data + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting Service" + systemctl start apache2 + systemctl start barcodebuddy + msg_ok "Started Service" + + msg_info "Cleaning up" + rm -r "/opt/v${RELEASE}.zip" + rm -r /opt/barcodebuddy-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/bazarr.sh b/ct/bazarr.sh new file mode 100755 index 0000000..9866a6d --- /dev/null +++ b/ct/bazarr.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.bazarr.media/ + +APP="Bazarr" +var_tags="arr" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:6767${CL}" \ No newline at end of file diff --git a/ct/beszel.sh b/ct/beszel.sh new file mode 100644 index 0000000..1ffb375 --- /dev/null +++ b/ct/beszel.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) community-scripts ORG +# Author: Michelle Zitzerman (Sinofage) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://beszel.dev/ + +APP="Beszel" +var_tags="monitoring" +var_cpu="1" +var_ram="512" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/beszel ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Stopping $APP" + systemctl stop beszel-hub + msg_ok "Stopped $APP" + + msg_info "Updating $APP" + $STD /opt/beszel/beszel update + msg_ok "Updated $APP" + + msg_info "Starting $APP" + systemctl start beszel-hub + msg_ok "Successfully started $APP" + msg_ok "Update Successful" + 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}http://${IP}:8090${CL}" \ No newline at end of file diff --git a/ct/blocky.sh b/ct/blocky.sh new file mode 100644 index 0000000..9a1a9ca --- /dev/null +++ b/ct/blocky.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://0xerr0r.github.io/blocky/latest/ + +APP="Blocky" +var_tags="adblock" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:4000${CL}" \ No newline at end of file diff --git a/ct/boltdiy.sh b/ct/boltdiy.sh new file mode 100644 index 0000000..12e383b --- /dev/null +++ b/ct/boltdiy.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/stackblitz-labs/bolt.diy/ + +APP="boltdiy" +TAGS="code;ai" +var_cpu="2" +var_ram="3072" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/bolt.diy ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/stackblitz-labs/bolt.diy/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/boltdiy_version.txt)" ]] || [[ ! -f /opt/boltdiy_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop boltdiy + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + temp_dir=$(mktemp -d) + temp_file=$(mktemp) + cd $temp_dir +curl -fsSL "https://github.com/stackblitz-labs/bolt.diy/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar xzf $temp_file + cp -rf bolt.diy-${RELEASE}/* /opt/bolt.diy + cd /opt/bolt.diy + $STD pnpm install + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start boltdiy + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf $temp_file + rm -rf $temp_dir + msg_ok "Cleanup Completed" + + echo "${RELEASE}" >/opt/boltdiy_version.txt + msg_ok "Update Successful" + 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}:5173${CL}" \ No newline at end of file diff --git a/ct/bookstack.sh b/ct/bookstack.sh new file mode 100644 index 0000000..7e0afd8 --- /dev/null +++ b/ct/bookstack.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/BookStackApp/BookStack + +APP="Bookstack" +var_tags="organizer" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/BookStackApp/BookStack/archive/refs/tags/v${RELEASE}.zip" -o "/opt/BookStack-${RELEASE}.zip" + unzip -q "/opt/BookStack-${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/ || true + cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ || true + cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ || true + cd /opt/bookstack || exit + export COMPOSER_ALLOW_SUPERUSER=1 + $STD composer install --no-dev + $STD php artisan migrate --force + 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/BookStack-${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 new file mode 100644 index 0000000..8562290 --- /dev/null +++ b/ct/bunkerweb.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.bunkerweb.io/ + +APP="BunkerWeb" +var_tags="webserver" +var_cpu="2" +var_ram="4096" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /etc/bunkerweb ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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 +Package: bunkerweb +Pin: version ${RELEASE} +Pin-Priority: 1001 +EOF + apt-get update + apt-get install -y nginx=1.26.3* + apt-get install -y bunkerweb=${RELEASE} + 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}/setup${CL}" \ No newline at end of file diff --git a/ct/bytestash.sh b/ct/bytestash.sh new file mode 100644 index 0000000..c68bcf2 --- /dev/null +++ b/ct/bytestash.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/jordan-dalby/ByteStash + +APP="ByteStash" +var_tags="code" +var_disk="4" +var_cpu="1" +var_ram="1024" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/bytestash ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/jordan-dalby/ByteStash/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 bytestash-backend + systemctl stop bytestash-frontend + msg_ok "Services Stopped" + + msg_info "Updating ${APP} to ${RELEASE}" + temp_file=$(mktemp) +curl -fsSL "https://github.com/jordan-dalby/ByteStash/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar zxf $temp_file + rm -rf /opt/bytestash/server/node_modules + rm -rf /opt/bytestash/client/node_modules + cp -rf ByteStash-${RELEASE}/* /opt/bytestash + cd /opt/bytestash/server + $STD npm install + cd /opt/bytestash/client + $STD npm install + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting Services" + systemctl start bytestash-backend + systemctl start bytestash-frontend + msg_ok "Started Services" + + msg_info "Cleaning Up" + rm -f $temp_file + 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/caddy.sh b/ct/caddy.sh new file mode 100644 index 0000000..7a8781c --- /dev/null +++ b/ct/caddy.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://caddyserver.com/ + +APP="Caddy" +var_tags="webserver" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:80${CL}" \ No newline at end of file diff --git a/ct/calibre-web.sh b/ct/calibre-web.sh new file mode 100644 index 0000000..aedf07c --- /dev/null +++ b/ct/calibre-web.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: remz1337 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/janeczku/calibre-web + +APP="Calibre-Web" +var_tags="eBook" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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 + msg_info "Stopping ${APP}" + systemctl stop cps + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP}" + cd /opt/kepubify + 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 + "4" "Enables login via LDAP server" OFF + "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) + if [ -f "/opt/calibre-web/options.txt" ]; then + cps_options="$(cat /opt/calibre-web/options.txt)" + 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)) + menu_array[$array_index]=ON + done + 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=$! + options=() + if [ ! -z "$CHOICES" ]; then + for CHOICE in $CHOICES; do + case "$CHOICE" in + "1") + options+=(gdrive) + ;; + "2") + options+=(gmail) + ;; + "3") + options+=(goodreads) + ;; + "4") + options+=(ldap) + apt-get install -qqy libldap2-dev libsasl2-dev + ;; + "5") + options+=(oauth) + ;; + "6") + options+=(metadata) + ;; + "7") + options+=(comics) + ;; + "8") + options+=(kobo) + ;; + *) + echo "Unsupported item $CHOICE!" >&2 + exit 1 + ;; + esac + done + fi + if [ ${#options[@]} -gt 0 ]; then + cps_options=$( + IFS=, + echo "${options[*]}" + ) + echo $cps_options >/opt/calibre-web/options.txt + $STD pip install --upgrade calibreweb[$cps_options] + else + rm -rf /opt/calibre-web/options.txt + $STD pip install --upgrade calibreweb + fi + + msg_info "Starting ${APP}" + systemctl start cps + msg_ok "Started ${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 URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8083${CL}" \ No newline at end of file diff --git a/ct/casaos.sh b/ct/casaos.sh new file mode 100644 index 0000000..c4c1e9a --- /dev/null +++ b/ct/casaos.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://casaos.io/ + +APP="CasaOS" +var_tags="cloud" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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/changedetection.sh b/ct/changedetection.sh new file mode 100644 index 0000000..8f95148 --- /dev/null +++ b/ct/changedetection.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://changedetection.io/ + +APP="Change Detection" +var_tags="monitoring;crawler" +var_cpu="2" +var_ram="2048" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get install -y libjpeg-dev + msg_ok "Updated Dependencies" + fi + + msg_info "Updating ${APP}" + $STD pip3 install changedetection.io --upgrade + msg_ok "Updated ${APP}" + + msg_info "Updating Playwright" + $STD pip3 install playwright --upgrade + msg_ok "Updated Playwright" + + if [[ -f /etc/systemd/system/browserless.service ]]; then + msg_info "Updating Browserless (Patience)" + $STD git -C /opt/browserless/ fetch --all + $STD git -C /opt/browserless/ reset --hard origin/main + $STD npm update --prefix /opt/browserless + $STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps + # 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. + $STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome + $STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit + $STD npm run build --prefix /opt/browserless + $STD npm run build:function --prefix /opt/browserless + $STD npm prune production --prefix /opt/browserless + systemctl restart browserless + msg_ok "Updated Browserless" + else + msg_error "No Browserless Installation Found!" + fi + + systemctl restart changedetection + 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}:5000${CL}" \ No newline at end of file diff --git a/ct/channels.sh b/ct/channels.sh new file mode 100644 index 0000000..e62fd22 --- /dev/null +++ b/ct/channels.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://getchannels.com/dvr-server/ + +APP="Channels" +var_tags="dvr" +var_cpu="2" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/channels-dvr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${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}:8089${CL}" \ No newline at end of file diff --git a/ct/checkmk.sh b/ct/checkmk.sh new file mode 100644 index 0000000..c55c4e0 --- /dev/null +++ b/ct/checkmk.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Michel Roegl-Brunner (michelroegl-brunner) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://checkmk.com/ + +APP="checkmk" +var_tags="monitoring" +var_cpu="2" +var_ram="2048" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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) }' | tr ' ' '\n' | grep -v '\-rc' | sort -V | tail -n 1) + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Updating ${APP} to v${RELEASE}" + $STD omd stop monitoring + $STD omd cp monitoring monitoringbackup +curl -fsSL "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb" -o "/opt/checkmk.deb" + $STD apt-get install -y /opt/checkmk.deb + $STD omd --force -V ${RELEASE}.cre update --conflict=install monitoring + $STD omd start monitoring + $STD omd -f rm monitoringbackup + $STD omd cleanup + 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 new file mode 100644 index 0000000..6d9e46d --- /dev/null +++ b/ct/cloudflared.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.cloudflare.com/ + +APP="Cloudflared" +var_tags="network;cloudflare" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/cockpit.sh b/ct/cockpit.sh new file mode 100644 index 0000000..1d31618 --- /dev/null +++ b/ct/cockpit.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck | Co-Author: havardthom +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://cockpit-project.org/ + +APP="Cockpit" +var_tags="monitoring;network" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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) + + if [ "$UPD" == "1" ]; then + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated ${APP} LXC" + exit + fi + if [ "$UPD" == "2" ]; then + msg_info "Installing dependencies (patience)" + $STD apt-get install -y attr + $STD apt-get install -y nfs-kernel-server + $STD apt-get install -y samba + $STD apt-get install -y samba-common-bin + $STD apt-get install -y winbind + $STD apt-get install -y gawk + msg_ok "Installed dependencies" + msg_info "Installing Cockpit file sharing" + curl -fsSL "$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)" -o $(basename "$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)") + $STD dpkg -i cockpit-file-sharing_*focal_all.deb + rm cockpit-file-sharing_*focal_all.deb + msg_ok "Installed Cockpit file sharing" + exit + fi + if [ "$UPD" == "3" ]; then + msg_info "Installing dependencies (patience)" + $STD apt-get install -y psmisc + $STD apt-get install -y samba + $STD apt-get install -y samba-common-bin + msg_ok "Installed dependencies" + msg_info "Installing Cockpit identities" + curl -fsSL "$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)" -o $(basename "$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)") + $STD dpkg -i cockpit-identities_*focal_all.deb + rm cockpit-identities_*focal_all.deb + msg_ok "Installed Cockpit identities" + exit + fi + if [ "$UPD" == "4" ]; then + msg_info "Installing dependencies" + $STD apt-get install -y rsync + $STD apt-get install -y zip + msg_ok "Installed dependencies" + msg_info "Installing Cockpit navigator" + curl -fsSL "$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)" -o $(basename "$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)") + $STD dpkg -i cockpit-navigator_*focal_all.deb + rm cockpit-navigator_*focal_all.deb + msg_ok "Installed Cockpit navigator" + exit + 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}:9090${CL}" diff --git a/ct/commafeed.sh b/ct/commafeed.sh new file mode 100644 index 0000000..88fd9ba --- /dev/null +++ b/ct/commafeed.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.commafeed.com/#/welcome + +APP="CommaFeed" +var_tags="rss-reader" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/commafeed ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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}" + curl -fsSL "https://github.com/Athou/commafeed/releases/download/${RELEASE}/commafeed-${RELEASE}-h2-jvm.zip" -o $(basename "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 +} + +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}:8082${CL}" diff --git a/ct/cosmos.sh b/ct/cosmos.sh new file mode 100644 index 0000000..5ef5028 --- /dev/null +++ b/ct/cosmos.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Michel Roegl-Brunner (michelroegl-brunner) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://https://cosmos-cloud.io/ + +APP="cosmos" +var_tags="os,docker" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/cosmos ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_ok "${APP} updates itself automatically!" +} + +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/crafty-controller.sh b/ct/crafty-controller.sh new file mode 100644 index 0000000..ce40586 --- /dev/null +++ b/ct/crafty-controller.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://gitlab.com/crafty-controller/crafty-4 + +APP="Crafty-Controller" +var_tags="gaming" +var_cpu="2" +var_ram="4096" +var_disk="16" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/crafty-controller ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL "https://gitlab.com/api/v4/projects/20430749/releases" | grep -o '"tag_name":"v[^"]*"' | head -n 1 | sed 's/"tag_name":"v//;s/"//') + if [[ ! -f /opt/crafty-controller_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/crafty-controller_version.txt)" ]]; then + + msg_info "Stopping Crafty-Controller" + systemctl stop crafty-controller + msg_ok "Stopped Crafty-Controller" + + msg_info "Creating Backup of config" + cp -a /opt/crafty-controller/crafty/crafty-4/app/config/. /opt/crafty-controller/backup + rm /opt/crafty-controller/backup/version.json + rm /opt/crafty-controller/backup/credits.json + rm /opt/crafty-controller/backup/logging.json + rm /opt/crafty-controller/backup/default.json.example + rm /opt/crafty-controller/backup/motd_format.json + msg_ok "Backup Created" + + msg_info "Updating Crafty-Controller to v${RELEASE}" + curl -fsSL "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip" -o $(basename "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip") + unzip -q crafty-4-v${RELEASE}.zip + cp -a crafty-4-v${RELEASE}/. /opt/crafty-controller/crafty/crafty-4/ + rm -rf crafty-4-v${RELEASE} + cd /opt/crafty-controller/crafty/crafty-4 + sudo -u crafty bash -c ' + source /opt/crafty-controller/crafty/.venv/bin/activate + pip3 install --no-cache-dir -r requirements.txt + ' &>/dev/null + echo "${RELEASE}" >"/opt/crafty-controller_version.txt" + msg_ok "Updated Crafty-Controller to v${RELEASE}" + + msg_info "Restoring Backup of config" + cp -a /opt/crafty-controller/backup/. /opt/crafty-controller/crafty/crafty-4/app/config + rm -rf /opt/crafty-controller/backup + chown -R crafty:crafty /opt/crafty-controller/ + msg_ok "Backup Restored" + + msg_info "Starting Crafty-Controller" + systemctl start crafty-controller + msg_ok "Started Crafty-Controller" + + msg_ok "Updated Successfully" + exit + else + msg_ok "No update required. Crafty-Controller is already at v${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}https://${IP}:8443${CL}" diff --git a/ct/create_lxc.sh b/ct/create_lxc.sh new file mode 100644 index 0000000..53ae7a2 --- /dev/null +++ b/ct/create_lxc.sh @@ -0,0 +1,282 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# Co-Author: MickLesk +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/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") +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 +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR + +# This function handles errors +function error_handler() { + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi + printf "\e[?25h" + local exit_code="$?" + local line_number="$1" + local command="$2" + local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}" + echo -e "\n$error_message\n" + exit 200 +} + +# This function displays a spinner. +function spinner() { + 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 "${TAB}${YW}${HOLD}${msg}${HOLD}" + spinner & + SPINNER_PID=$! +} + +function msg_warn() { + 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}${INFO}${YWB}${msg}${CL}" +} + +# This function displays a success message with a green color. +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}" +} + +# This function displays a error message with a red color. +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}" +} + +# This checks for the presence of valid Container Storage and Template Storage locations +msg_info "Validating Storage" +VALIDCT=$(pvesm status -content rootdir | awk 'NR>1') +if [ -z "$VALIDCT" ]; then + msg_error "Unable to detect a valid Container Storage location." + exit 1 +fi +VALIDTMP=$(pvesm status -content vztmpl | awk 'NR>1') +if [ -z "$VALIDTMP" ]; then + msg_error "Unable to detect a valid Template Storage location." + exit 1 +fi + +# This function is used to select the storage class and determine the corresponding storage content type and label. +function select_storage() { + local CLASS=$1 + local CONTENT + local CONTENT_LABEL + case $CLASS in + container) + CONTENT='rootdir' + CONTENT_LABEL='Container' + ;; + template) + CONTENT='vztmpl' + CONTENT_LABEL='Container template' + ;; + *) false || { + msg_error "Invalid storage class." + exit 201 + } ;; + esac + + # This Queries all storage locations + local -a MENU + while read -r line; do + 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 OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + local MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + MENU+=("$TAG" "$ITEM" "OFF") + done < <(pvesm status -content $CONTENT | awk 'NR>1') + + # Select storage location + if [ $((${#MENU[@]} / 3)) -eq 1 ]; then + printf ${MENU[0]} + else + local STORAGE + while [ -z "${STORAGE:+x}" ]; do + STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ + "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) || { + msg_error "Menu aborted." + exit 202 + } + if [ $? -ne 0 ]; then + echo -e "${CROSS}${RD} Menu aborted by user.${CL}" + exit 0 + fi + done + printf "%s" "$STORAGE" + fi +} +# Test if required variables are set +[[ "${CTID:-}" ]] || { + msg_error "You need to set 'CTID' variable." + exit 203 +} +[[ "${PCT_OSTYPE:-}" ]] || { + msg_error "You need to set 'PCT_OSTYPE' variable." + exit 204 +} + +# Test if ID is valid +[ "$CTID" -ge "100" ] || { + msg_error "ID cannot be less than 100." + exit 205 +} + +# Check for network connectivity (IPv4 & IPv6) +#function check_network() { +# local CHECK_URLS=("8.8.8.8" "1.1.1.1" "9.9.9.9" "2606:4700:4700::1111" "2001:4860:4860::8888" "2620:fe::fe") +# +# for url in "${CHECK_URLS[@]}"; do +# if ping -c 1 -W 2 "$url" &>/dev/null; then +# return 0 # Success: At least one connection works +# fi +# done +# +# msg_error "No network connection detected. Check your internet connection." +# exit 101 +#} + +# Test if ID is in use +if qm status "$CTID" &>/dev/null || pct status "$CTID" &>/dev/null; then + echo -e "ID '$CTID' is already in use." + unset CTID + msg_error "Cannot use ID that is already in use." + exit 206 +fi + +# Get template storage +TEMPLATE_STORAGE=$(select_storage template) || exit +msg_ok "Using ${BL}$TEMPLATE_STORAGE${CL} ${GN}for Template Storage." + +# Get container storage +CONTAINER_STORAGE=$(select_storage container) || exit +msg_ok "Using ${BL}$CONTAINER_STORAGE${CL} ${GN}for Container Storage." + +# Update LXC template list +msg_info "Updating LXC Template List" +#check_network +pveam update >/dev/null +msg_ok "Updated LXC Template List" + +# Get LXC template string +TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-} +mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V) +[ ${#TEMPLATES[@]} -gt 0 ] || { + msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'." + exit 207 +} +TEMPLATE="${TEMPLATES[-1]}" +TEMPLATE_PATH="$(pvesm path $TEMPLATE_STORAGE:vztmpl/$TEMPLATE)" +# Without NAS/Mount: TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE" +# Check if template exists, if corrupt remove and redownload +if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE" || ! zstdcat "$TEMPLATE_PATH" | tar -tf - >/dev/null 2>&1; then + msg_warn "Template $TEMPLATE not found in storage or seems to be corrupted. Redownloading." + [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH" + + # Download with 3 attempts + for attempt in {1..3}; do + msg_info "Attempt $attempt: Downloading LXC template..." + + if timeout 120 pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null; then + msg_ok "Template download successful." + break + fi + + if [ $attempt -eq 3 ]; then + msg_error "Three failed attempts. Aborting." + exit 208 + fi + + sleep $((attempt * 5)) + done +fi +msg_ok "LXC Template is ready to use." + +# Check and fix subuid/subgid +grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid +grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >>/etc/subgid + +# Combine all options +PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}}) +[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}") + +msg_info "Creating LXC Container" +if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then + msg_error "Container creation failed. Checking if template is corrupted." + + if ! zstdcat "$TEMPLATE_PATH" | tar -tf - >/dev/null 2>&1; then + msg_error "Template appears to be corrupted. Removing and re-downloading." + rm -f "$TEMPLATE_PATH" + + if ! timeout 120 pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null; then + msg_error "Failed to re-download template." + exit 208 + fi + + msg_ok "Re-downloaded LXC Template" + + if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then + msg_error "Container creation failed after re-downloading template." + exit 200 + fi + else + msg_error "Container creation failed, but template is not corrupted." + exit 209 + fi +fi +msg_ok "LXC Container ${BL}$CTID${CL} ${GN}was successfully created." \ No newline at end of file diff --git a/ct/cronicle.sh b/ct/cronicle.sh new file mode 100644 index 0000000..8499b7e --- /dev/null +++ b/ct/cronicle.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://cronicle.net/ + +APP="Cronicle" +var_tags="task-scheduler" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + 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..." + $STD apt-get install -y npm + echo "Installed NPM..." + fi + fi + msg_info "Updating ${APP}" + $STD /opt/cronicle/bin/control.sh upgrade + 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..." + $STD apt-get install -y npm + echo "Installed NPM..." + fi + fi + LATEST=$(curl -fsSL 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" + + $STD apt-get install -y git + $STD apt-get install -y make + $STD apt-get install -y g++ + $STD apt-get install -y gcc + $STD apt-get install -y ca-certificates + $STD apt-get install -y gnupg + 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_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list + msg_ok "Set up Node.js Repository" + + msg_info "Installing Node.js" + $STD apt-get update + $STD apt-get install -y nodejs + msg_ok "Installed Node.js" + + msg_info "Installing Cronicle Worker" + mkdir -p /opt/cronicle + cd /opt/cronicle + $STD tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1 + $STD npm install + $STD node bin/build.js dist + sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json + $STD /opt/cronicle/bin/control.sh start + $STD cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled + chmod 775 /etc/init.d/cronicled + $STD update-rc.d cronicled defaults + msg_ok "Installed Cronicle Worker" + echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n" + exit + 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}:3012${CL}" diff --git a/ct/cross-seed.sh b/ct/cross-seed.sh new file mode 100644 index 0000000..f6be7c1 --- /dev/null +++ b/ct/cross-seed.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Jakub Matraszek (jmatraszek) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.cross-seed.org + +APP="cross-seed" +var_tags="arr" +var_cpu="1" +var_ram="1024" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if command -v cross-seed &>/dev/null; then + current_version=$(cross-seed --version) + latest_version=$(npm show cross-seed version) + if [ "$current_version" != "$latest_version" ]; then + msg_info "Updating ${APP} from version v${current_version} to v${latest_version}" + $STD npm install -g cross-seed@latest + systemctl restart cross-seed + msg_ok "Updated Successfully" + else + msg_ok "${APP} is already at v${current_version}" + fi + else + msg_error "No ${APP} Installation Found!" + exit + 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 cross-seed API using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:2468${CL}" \ No newline at end of file diff --git a/ct/cryptpad.sh b/ct/cryptpad.sh new file mode 100644 index 0000000..7b7173a --- /dev/null +++ b/ct/cryptpad.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/cryptpad/cryptpad + +APP="CryptPad" +var_tags="docs;office" +var_cpu="1" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/cryptpad" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/cryptpad/cryptpad/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 cryptpad + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + temp_dir=$(mktemp -d) + cp -f /opt/cryptpad/config/config.js /opt/config.js + curl -fsSL "https://github.com/cryptpad/cryptpad/archive/refs/tags/${RELEASE}.tar.gz" -o "$temp_dir/cryptpad-${RELEASE}.tar.gz" + cd "$temp_dir" + tar zxf "cryptpad-${RELEASE}.tar.gz" + cp -rf "cryptpad-${RELEASE}"/* /opt/cryptpad + cd /opt/cryptpad + $STD npm ci + $STD npm run install:components + $STD npm run build + cp -f /opt/config.js /opt/cryptpad/config/config.js + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Cleaning Up" + rm -rf $temp_dir + msg_ok "Cleanup Completed" + + msg_info "Starting $APP" + systemctl start cryptpad + msg_ok "Started $APP" + + msg_ok "Update Successful" + 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}" diff --git a/ct/daemonsync.sh b/ct/daemonsync.sh new file mode 100644 index 0000000..73b36d1 --- /dev/null +++ b/ct/daemonsync.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://daemonsync.me/ + +APP="Daemon Sync" +var_tags="sync" +var_cpu="1" +var_ram="512" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8084${CL}" \ No newline at end of file diff --git a/ct/dashy.sh b/ct/dashy.sh new file mode 100644 index 0000000..9b1bae5 --- /dev/null +++ b/ct/dashy.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://dashy.to/ + +APP="Dashy" +var_tags="dashboard" +var_cpu="2" +var_ram="2048" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/dashy/public/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL 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 + fi + msg_ok "Backed up conf.yml" + + msg_info "Updating ${APP} to ${RELEASE}" + rm -rf /opt/dashy + mkdir -p /opt/dashy + curl -fsSL "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 "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 +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}" diff --git a/ct/debian.sh b/ct/debian.sh new file mode 100644 index 0000000..6551ff5 --- /dev/null +++ b/ct/debian.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.debian.org/ + +APP="Debian" +var_tags="os" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/deconz.sh b/ct/deconz.sh new file mode 100644 index 0000000..468e587 --- /dev/null +++ b/ct/deconz.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.phoscon.de/en/conbee2/software#deconz + +APP="deCONZ" +var_tags="zigbee" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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/deluge.sh b/ct/deluge.sh new file mode 100644 index 0000000..d9aba00 --- /dev/null +++ b/ct/deluge.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.deluge-torrent.org/ + +APP="Deluge" +var_tags="torrent" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + pip3 install deluge[all] --upgrade + 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}:8112${CL}" \ No newline at end of file diff --git a/ct/docker.sh b/ct/docker.sh new file mode 100644 index 0000000..99f3aef --- /dev/null +++ b/ct/docker.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.docker.com/ + +APP="Docker" +var_tags="docker" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/dockge.sh b/ct/dockge.sh new file mode 100644 index 0000000..e5e9890 --- /dev/null +++ b/ct/dockge.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://dockge.kuma.pet/ + +APP="Dockge" +var_tags="docker" +var_cpu="2" +var_ram="2048" +var_disk="18" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +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}:5001${CL}" \ No newline at end of file diff --git a/ct/docmost.sh b/ct/docmost.sh new file mode 100644 index 0000000..47b96f6 --- /dev/null +++ b/ct/docmost.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://docmost.com/ + +APP="Docmost" +var_tags="documents" +var_cpu="3" +var_ram="3072" +var_disk="7" +var_os="debian" +var_version="12" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/docmost ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if command -v node >/dev/null; then + NODE_MAJOR=$(/usr/bin/env node -v | grep -oP '^v\K[0-9]+') + if [[ "$NODE_MAJOR" != "22" ]]; then + $STD apt-get purge -y nodejs + rm -f /etc/apt/sources.list.d/nodesource.list + rm -f /etc/apt/keyrings/nodesource.gpg + else + return + fi + fi + 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_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list + $STD apt-get update + $STD apt-get install -y nodejs + $STD npm install -g pnpm@10.4.0 + export NODE_OPTIONS="--max_old_space_size=4096" + RELEASE=$(curl -fsSL https://api.github.com/repos/docmost/docmost/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 docmost + msg_ok "${APP} Stopped" + + msg_info "Updating ${APP} to v${RELEASE}" + cp /opt/docmost/.env /opt/ + cp -r /opt/docmost/data /opt/ + rm -rf /opt/docmost + temp_file=$(mktemp) + curl -fsSL "https://github.com/docmost/docmost/archive/refs/tags/v${RELEASE}.tar.gz" -o ""$temp_file"" + tar -xzf "$temp_file" + mv docmost-${RELEASE} /opt/docmost + cd /opt/docmost + mv /opt/.env /opt/docmost/.env + mv /opt/data /opt/docmost/data + $STD pnpm install --force + $STD pnpm build + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting ${APP}" + systemctl start docmost + msg_ok "Started ${APP}" + + msg_info "Cleaning Up" + rm -f ${temp_file} + 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}" diff --git a/ct/dolibarr.sh b/ct/dolibarr.sh new file mode 100644 index 0000000..0fdf860 --- /dev/null +++ b/ct/dolibarr.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Dolibarr/dolibarr/ + +APP="Dolibarr" +var_tags="erp;accounting" +var_cpu="1" +var_ram="2048" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /usr/share/dolibarr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "To update ${APP}, use the applications web interface." + 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}/dolibarr/install${CL}" \ No newline at end of file diff --git a/ct/dotnetaspwebapi.sh b/ct/dotnetaspwebapi.sh new file mode 100644 index 0000000..2fd2fe4 --- /dev/null +++ b/ct/dotnetaspwebapi.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Kristian Skov +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-9.0&tabs=linux-ubuntu + +APP="Dotnet ASP Web API" +var_tags="web" +var_cpu="1" +var_ram="1024" +var_disk="8" +var_os="ubuntu" +var_version="24.04" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /var/www ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + 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}:80${CL}" \ No newline at end of file diff --git a/ct/duplicati.sh b/ct/duplicati.sh new file mode 100644 index 0000000..0596c9c --- /dev/null +++ b/ct/duplicati.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/duplicati/duplicati/ + +APP="Duplicati" +var_tags="backup" +var_cpu="1" +var_ram="1024" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /usr/bin/duplicati-server ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/duplicati/duplicati/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 duplicati + msg_ok "Stopped $APP" + msg_info "Updating $APP to v${RELEASE}" + curl -fsSL "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb" -o $(basename "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb") + $STD dpkg -i duplicati-${RELEASE}-linux-x64-gui.deb + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start duplicati + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf ~/duplicati-${RELEASE}-linux-x64-gui.deb + msg_ok "Cleanup Completed" + + msg_ok "Update Successful" + 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}:8200${CL}" diff --git a/ct/elementsynapse.sh b/ct/elementsynapse.sh new file mode 100644 index 0000000..d021db5 --- /dev/null +++ b/ct/elementsynapse.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/element-hq/synapse + +APP="Element Synapse" +var_tags="server" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /etc/matrix-synapse ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating $APP LXC" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8008${CL}" \ No newline at end of file diff --git a/ct/emby.sh b/ct/emby.sh new file mode 100644 index 0000000..502db5c --- /dev/null +++ b/ct/emby.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://emby.media/ + +APP="Emby" +var_tags="media" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="ubuntu" +var_version="22.04" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/emby-server ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + LATEST=$(curl -fsSL 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}" + $STD curl -fsSL "https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_amd64.deb" -o "emby-server-deb_${LATEST}_amd64.deb" + $STD dpkg -i "emby-server-deb_${LATEST}_amd64.deb" + 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 +} + +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}:8096${CL}" diff --git a/ct/emqx.sh b/ct/emqx.sh new file mode 100644 index 0000000..e4ab164 --- /dev/null +++ b/ct/emqx.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.emqx.com/en + +APP="EMQX" +var_tags="mqtt" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:18083${CL}" \ No newline at end of file diff --git a/ct/ersatztv.sh b/ct/ersatztv.sh new file mode 100644 index 0000000..2ccfdc2 --- /dev/null +++ b/ct/ersatztv.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://ersatztv.org/ + +APP="ErsatzTV" +var_tags="iptv" +var_cpu="1" +var_ram="1024" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/ErsatzTV ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/ErsatzTV/ErsatzTV/releases | grep -oP '"tag_name": "\K[^"]+' | head -n 1) + if [[ ! -f /opt/${APP}_version.txt && $(echo "x.x.x" >/opt/${APP}_version.txt) || "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping ErsatzTV" + systemctl stop ersatzTV + msg_ok "Stopped ErsatzTV" + + msg_info "Updating ErsatzTV" + cp -R /opt/ErsatzTV/ ErsatzTV-backup + rm ErsatzTV-backup/ErsatzTV + rm -rf /opt/ErsatzTV + temp_file=$(mktemp) + curl -fsSL "https://github.com/ErsatzTV/ErsatzTV/releases/download/${RELEASE}/ErsatzTV-${RELEASE}-linux-x64.tar.gz" -o "$temp_file" + tar -xzf "$temp_file" + mv ErsatzTV-${RELEASE}-linux-x64 /opt/ErsatzTV + cp -R ErsatzTV-backup/* /opt/ErsatzTV/ + rm -rf ErsatzTV-backup + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ErsatzTV" + + msg_info "Starting ErsatzTV" + systemctl start ersatzTV + msg_ok "Started ErsatzTV" + + msg_info "Cleaning Up" + rm -f ${temp_file} + 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}:8409${CL}" diff --git a/ct/esphome.sh b/ct/esphome.sh new file mode 100644 index 0000000..e7911cb --- /dev/null +++ b/ct/esphome.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://esphome.io/ + +APP="ESPHome" +var_tags="automation" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + $STD source /srv/esphome/bin/activate + fi + $STD pip3 install -U esphome + msg_ok "Updated ESPHome" + + msg_info "Starting ESPHome" + systemctl start esphomeDashboard + msg_ok "Started ESPHome" + 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}:6052${CL}" \ No newline at end of file diff --git a/ct/evcc.sh b/ct/evcc.sh new file mode 100644 index 0000000..7bf8193 --- /dev/null +++ b/ct/evcc.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://evcc.io/en/ + +APP="evcc" +var_tags="solar;ev;automation" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt update + $STD apt --only-upgrade install -y evcc + 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}:7070${CL}" \ No newline at end of file diff --git a/ct/excalidraw.sh b/ct/excalidraw.sh new file mode 100644 index 0000000..8bb7d19 --- /dev/null +++ b/ct/excalidraw.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/excalidraw/excalidraw + +APP="Excalidraw" +TAGS="diagrams" +var_cpu="2" +var_ram="3072" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/excalidraw ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/excalidraw/excalidraw/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/excalidraw_version.txt)" ]] || [[ ! -f /opt/excalidraw_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop excalidraw + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + cd /tmp + temp_file=$(mktemp) +curl -fsSL "https://github.com/excalidraw/excalidraw/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar xzf $temp_file + rm -rf /opt/excalidraw + mv excalidraw-${RELEASE} /opt/excalidraw + cd /opt/excalidraw + $STD yarn + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start excalidraw + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf $temp_file + msg_ok "Cleanup Completed" + + echo "${RELEASE}" >/opt/excalidraw_version.txt + msg_ok "Update Successful" + 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/fenrus.sh b/ct/fenrus.sh new file mode 100644 index 0000000..7af1a19 --- /dev/null +++ b/ct/fenrus.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: Scorpoon +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/revenz/Fenrus + +APP="Fenrus" +var_tags="dashboard" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/${APP} ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${APP}." + 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/ + + systemctl start ${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}:5000${CL}" \ No newline at end of file diff --git a/ct/fhem.sh b/ct/fhem.sh new file mode 100644 index 0000000..c3810ae --- /dev/null +++ b/ct/fhem.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://fhem.de/ + +APP="FHEM" +var_tags="automation" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8083${CL}" \ No newline at end of file diff --git a/ct/fileflows.sh b/ct/fileflows.sh new file mode 100644 index 0000000..a58207f --- /dev/null +++ b/ct/fileflows.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kkroboth +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://fileflows.com/ + +APP="FileFlows" +var_tags="media;automation" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/fileflows ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if ! [[ $(dpkg -s jq 2>/dev/null) ]]; then + $STD apt-get update + $STD apt-get install -y jq + fi + + update_available=$(curl -fsSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' | jq .UpdateAvailable) + if [[ "${update_available}" == "true" ]]; then + msg_info "Stopping $APP" + systemctl stop fileflows + msg_ok "Stopped $APP" + + msg_info "Creating Backup" + backup_filename="/opt/${APP}_backup_$(date +%F).tar.gz" + tar -czf "$backup_filename" -C /opt/fileflows Data + msg_ok "Backup Created" + + msg_info "Updating $APP to latest version" + temp_file=$(mktemp) + curl -fsSL https://fileflows.com/downloads/zip -o "$temp_file" + unzip -oq -d /opt/fileflows "$temp_file" + msg_ok "Updated $APP to latest version" + + msg_info "Starting $APP" + systemctl start fileflows + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf "$temp_file" + rm -rf "$backup_filename" + msg_ok "Cleanup Completed" + + msg_ok "Update Successful" + else + msg_ok "No update required. ${APP} is already at latest 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}:19200${CL}" diff --git a/ct/firefly.sh b/ct/firefly.sh new file mode 100644 index 0000000..9ea67fc --- /dev/null +++ b/ct/firefly.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: quantumryuu +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://firefly-iii.org/ + +APP="Firefly" +var_tags="finance" +var_cpu="1" +var_ram="1024" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + cd /opt + curl -fsSL "https://github.com/firefly-iii/firefly-iii/releases/download/v${RELEASE}/FireflyIII-v${RELEASE}.tar.gz" -o $(basename "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' + cp /opt/.env /opt/firefly/.env + cp -r /opt/storage /opt/firefly/storage + cd /opt/firefly + chown -R www-data:www-data /opt/firefly + chmod -R 775 /opt/firefly/storage + $STD php artisan migrate --seed --force + $STD php artisan cache:clear + $STD php artisan view:clear + $STD php artisan firefly-iii:upgrade-database + $STD php artisan firefly-iii:laravel-passport-keys + 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}" diff --git a/ct/flaresolverr.sh b/ct/flaresolverr.sh new file mode 100644 index 0000000..2e871f0 --- /dev/null +++ b/ct/flaresolverr.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: remz1337 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/FlareSolverr/FlareSolverr + +APP="FlareSolverr" +var_tags="proxy" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/flaresolverr.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://github.com/FlareSolverr/FlareSolverr/releases/latest | 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" + systemctl stop flaresolverr + curl -fsSL "https://github.com/FlareSolverr/FlareSolverr/releases/download/$RELEASE/flaresolverr_linux_x64.tar.gz" -o $(basename "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 +} + +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}:8191${CL}" diff --git a/ct/flowiseai.sh b/ct/flowiseai.sh new file mode 100644 index 0000000..f985e4d --- /dev/null +++ b/ct/flowiseai.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://flowiseai.com/ + +APP="FlowiseAI" +var_tags="low-code" +var_disk="10" +var_cpu="4" +var_ram="4096" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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_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/fluid-calendar.sh b/ct/fluid-calendar.sh new file mode 100644 index 0000000..bea903d --- /dev/null +++ b/ct/fluid-calendar.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://fluidcalendar.com + +APP="fluid-calendar" +var_tags="calendar,tasks" +var_cpu="3" +var_ram="4096" +var_disk="7" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/fluid-calendar ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/dotnetfactory/fluid-calendar/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 fluid-calendar.service + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + cp /opt/fluid-calendar/.env /opt/fluid.env + rm -rf /opt/fluid-calendar + tmp_file=$(mktemp) +curl -fsSL "https://github.com/dotnetfactory/fluid-calendar/archive/refs/tags/v${RELEASE}.zip" -o "$tmp_file" + unzip -q $tmp_file + mv ${APP}-${RELEASE}/ /opt/fluid-calendar + mv /opt/fluid.env /opt/fluid-calendar/.env + cd /opt/fluid-calendar + export NEXT_TELEMETRY_DISABLED=1 + $STD npm install --legacy-peer-deps + $STD npm run prisma:generate + $STD npx prisma migrate deploy + $STD npm run build:os + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start fluid-calendar.service + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf $tmp_file + msg_ok "Cleanup Completed" + + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Update Successful" + 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/forgejo.sh b/ct/forgejo.sh new file mode 100644 index 0000000..da3db73 --- /dev/null +++ b/ct/forgejo.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://forgejo.org/ + +APP="Forgejo" +var_tags="git" +var_cpu="2" +var_ram="2048" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSL https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest | grep -oP '"tag_name":\s*"\K[^"]+' | sed 's/^v//') +curl -fsSL "https://codeberg.org/forgejo/forgejo/releases/download/v${RELEASE}/forgejo-${RELEASE}-linux-amd64" -o "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-amd64 + msg_ok "Cleaned" + + msg_info "Starting ${APP}" + systemctl start forgejo + msg_ok "Started ${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 URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" \ No newline at end of file diff --git a/ct/freshrss.sh b/ct/freshrss.sh new file mode 100644 index 0000000..c9057df --- /dev/null +++ b/ct/freshrss.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/FreshRSS/FreshRSS + +APP="FreshRSS" +var_tags="RSS" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/freshrss ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "FreshRSS should be updated via the user interface." + 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/frigate.sh b/ct/frigate.sh new file mode 100644 index 0000000..7a16b4c --- /dev/null +++ b/ct/frigate.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Authors: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://frigate.video/ + +APP="Frigate" +var_tags="nvr" +var_cpu="4" +var_ram="4096" +var_disk="20" +var_os="debian" +var_version="11" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +} + +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}" \ No newline at end of file diff --git a/ct/ghost.sh b/ct/ghost.sh new file mode 100644 index 0000000..5ae1d33 --- /dev/null +++ b/ct/ghost.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: fabrice1236 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://ghost.org/ + +APP="Ghost" +var_tags="cms;blog" +var_cpu="2" +var_ram="1024" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + msg_info "Updating ${APP} LXC" + + if command -v ghost &>/dev/null; then + current_version=$(ghost version | grep 'Ghost-CLI version' | awk '{print $3}') + latest_version=$(npm show ghost-cli version) + if [ "$current_version" != "$latest_version" ]; then + msg_info "Updating ${APP} from version v${current_version} to v${latest_version}" + $STD npm install -g ghost-cli@latest + msg_ok "Updated Successfully" + else + msg_ok "${APP} is already at v${current_version}" + fi + else + msg_error "No ${APP} Installation Found!" + exit + 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}:2368${CL}" \ No newline at end of file diff --git a/ct/gitea.sh b/ct/gitea.sh new file mode 100644 index 0000000..955fbfa --- /dev/null +++ b/ct/gitea.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: Rogue-King +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://about.gitea.com/ + +APP="Gitea" +var_tags="git" +var_cpu="1" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /usr/local/bin/gitea ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://github.com/go-gitea/gitea/releases/latest | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//') + msg_info "Updating $APP to ${RELEASE}" + curl -fsSL "https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-amd64" -o $(basename "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 +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/glance.sh b/ct/glance.sh new file mode 100644 index 0000000..216c178 --- /dev/null +++ b/ct/glance.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kristocopani +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/glanceapp/glance + +APP="Glance" +var_tags="dashboard" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/glanceapp/glance/releases/download/v${RELEASE}/glance-linux-amd64.tar.gz" -o $(basename "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}" diff --git a/ct/glpi.sh b/ct/glpi.sh new file mode 100644 index 0000000..565078e --- /dev/null +++ b/ct/glpi.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Nícolas Pastorello (opastorello) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.glpi-project.org/ + +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" + +header_info "$APP" +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 -fsSL 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 "Currently we don't provide an update function for this ${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}" \ No newline at end of file diff --git a/ct/go2rtc.sh b/ct/go2rtc.sh new file mode 100644 index 0000000..cdad074 --- /dev/null +++ b/ct/go2rtc.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/AlexxIT/go2rtc + +APP="go2rtc" +var_tags="recorder;video" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + curl -fsSL "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64" -o $(basename "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 +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}:1984${CL}" diff --git a/ct/gokapi.sh b/ct/gokapi.sh new file mode 100644 index 0000000..3367113 --- /dev/null +++ b/ct/gokapi.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Forceu/Gokapi + +APP="Gokapi" +var_tags="file;sharing" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/gokapi ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${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}:53842/setup${CL}" \ No newline at end of file diff --git a/ct/gomft.sh b/ct/gomft.sh new file mode 100644 index 0000000..7535571 --- /dev/null +++ b/ct/gomft.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/StarFleetCPTN/GoMFT + +APP="GoMFT" +var_tags="backup" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/gomft" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if ! dpkg -l | grep -q "^ii.*build-essential"; then + $STD apt-get install -y build-essential + fi + if [[ ! -f "/usr/bin/node" ]]; then + 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_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list + $STD apt-get update + $STD apt-get install -y nodejs + fi + RELEASE=$(curl -fsSL "https://api.github.com/repos/StarFleetCPTN/GoMFT/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 gomft + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + rm -f /opt/gomft/gomft + temp_file=$(mktemp) + curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar -xzf "$temp_file" + cp -rf "GoMFT-${RELEASE}"/* /opt/gomft/ + cd /opt/gomft || exit + rm -rf /opt/gomft/node_modules + $STD npm ci + $STD node build.js + $STD go mod download + $STD go get -u github.com/a-h/templ + $STD "$HOME"/go/bin/templ generate + export CGO_ENABLED=1 + export GOOS=linux + $STD go build -o gomft + chmod +x /opt/gomft/gomft + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Cleaning Up" + rm -f "$temp_file" + rm -rf "$HOME/GoMFT-v.${RELEASE}/" + msg_ok "Cleanup Complete" + + msg_info "Starting $APP" + systemctl start gomft + msg_ok "Started $APP" + + msg_ok "Update Successful" + 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}:8080${CL}" diff --git a/ct/gotify.sh b/ct/gotify.sh new file mode 100644 index 0000000..aeb2a80 --- /dev/null +++ b/ct/gotify.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://gotify.net/ + +APP="Gotify" +var_tags="notification" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/gotify ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL 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 + curl -fsSL "https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip" -o $(basename "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 +} + +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/grafana.sh b/ct/grafana.sh new file mode 100644 index 0000000..3009522 --- /dev/null +++ b/ct/grafana.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://grafana.com/ + +APP="Grafana" +var_tags="monitoring;visualization" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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}" + $STD apt-get update + $STD apt-get -y upgrade + 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}:3000${CL}" \ No newline at end of file diff --git a/ct/graylog.sh b/ct/graylog.sh new file mode 100644 index 0000000..35743a0 --- /dev/null +++ b/ct/graylog.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://graylog.org/ + +APP="Graylog" +TAGS="logging" +var_cpu="2" +var_ram="8192" +var_disk="30" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /etc/graylog ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Stopping $APP" + systemctl stop graylog-datanode + systemctl stop graylog-server + msg_ok "Stopped $APP" + + msg_info "Updating $APP" + $STD apt-get update + $STD apt-get upgrade -y + msg_ok "Updated $APP" + + msg_info "Starting $APP" + systemctl start graylog-datanode + systemctl start graylog-server + msg_ok "Started $APP" + + msg_ok "Update Successful" + 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/grist.sh b/ct/grist.sh new file mode 100644 index 0000000..95e0dc9 --- /dev/null +++ b/ct/grist.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Source: https://github.com/gristlabs/grist-core + +APP="Grist" +var_tags="database;spreadsheet" +var_cpu="2" +var_ram="3072" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/gristlabs/grist-core/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/gristlabs/grist-core/archive/refs/tags/v${RELEASE}.zip") + unzip -q v$RELEASE.zip + mv grist-core-${RELEASE} grist + + mkdir -p grist/docs + + cp -n grist_bak/.env grist/.env || true + cp -r grist_bak/docs/* grist/docs/ || true + cp grist_bak/grist-sessions.db grist/grist-sessions.db || true + cp grist_bak/landing.db grist/landing.db || true + + cd grist + msg_info "Installing Dependencies" + $STD yarn install + msg_ok "Installed Dependencies" + + msg_info "Building" + $STD yarn run build:prod + msg_ok "Done building" + + msg_info "Installing Python" + $STD yarn run install:python + msg_ok "Installed Python" + + 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 new file mode 100644 index 0000000..0df597a --- /dev/null +++ b/ct/grocy.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://grocy.info/ + +APP="grocy" +var_tags="grocery;household" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSLo /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 +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/habitica.sh b/ct/habitica.sh new file mode 100644 index 0000000..195876f --- /dev/null +++ b/ct/habitica.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/HabitRPG/habitica + +APP="Habitica" +var_tags="gaming" +var_cpu="2" +var_ram="4096" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/habitica" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/HabitRPG/habitica/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 habitica-mongodb + systemctl stop habitica + systemctl stop habitica-client + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + temp_file=$(mktemp) +curl -fsSL "https://github.com/HabitRPG/habitica/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar zxf $temp_file + cp -rf habitica-${RELEASE}/* /opt/habitica + cd /opt/habitica + $STD npm i + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Starting $APP" + systemctl start habitica-mongodb + systemctl start habitica + systemctl start habitica-client + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -f $temp_file + rm -rf ~/habitica-${RELEASE} + msg_ok "Cleanup Completed" + + msg_ok "Update Successful" + 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}:8080${CL}" \ No newline at end of file diff --git a/ct/headers/2fauth b/ct/headers/2fauth new file mode 100644 index 0000000..b642171 --- /dev/null +++ b/ct/headers/2fauth @@ -0,0 +1,6 @@ + ___ _________ __ __ + |__ \ / ____/ | __ __/ /_/ /_ + __/ // /_ / /| |/ / / / __/ __ \ + / __// __/ / ___ / /_/ / /_/ / / / +/____/_/ /_/ |_\__,_/\__/_/ /_/ + diff --git a/ct/headers/actualbudget b/ct/headers/actualbudget new file mode 100644 index 0000000..db7f309 --- /dev/null +++ b/ct/headers/actualbudget @@ -0,0 +1,6 @@ + ___ __ __ ____ __ __ + / | _____/ /___ ______ _/ / / __ )__ ______/ /___ ____ / /_ + / /| |/ ___/ __/ / / / __ `/ / / __ / / / / __ / __ `/ _ \/ __/ + / ___ / /__/ /_/ /_/ / /_/ / / / /_/ / /_/ / /_/ / /_/ / __/ /_ +/_/ |_\___/\__/\__,_/\__,_/_/ /_____/\__,_/\__,_/\__, /\___/\__/ + /____/ diff --git a/ct/headers/adguard b/ct/headers/adguard new file mode 100644 index 0000000..2332df1 --- /dev/null +++ b/ct/headers/adguard @@ -0,0 +1,6 @@ + ___ __ __ + / | ____/ /___ ___ ______ __________/ / + / /| |/ __ / __ `/ / / / __ `/ ___/ __ / + / ___ / /_/ / /_/ / /_/ / /_/ / / / /_/ / +/_/ |_\__,_/\__, /\__,_/\__,_/_/ \__,_/ + /____/ diff --git a/ct/headers/adventurelog b/ct/headers/adventurelog new file mode 100644 index 0000000..8e3c88d --- /dev/null +++ b/ct/headers/adventurelog @@ -0,0 +1,6 @@ + ___ __ __ __ + / | ____/ / _____ ____ / /___ __________ / / ____ ____ _ + / /| |/ __ / | / / _ \/ __ \/ __/ / / / ___/ _ \/ / / __ \/ __ `/ + / ___ / /_/ /| |/ / __/ / / / /_/ /_/ / / / __/ /___/ /_/ / /_/ / +/_/ |_\__,_/ |___/\___/_/ /_/\__/\__,_/_/ \___/_____/\____/\__, / + /____/ diff --git a/ct/headers/agentdvr b/ct/headers/agentdvr new file mode 100644 index 0000000..dfe6779 --- /dev/null +++ b/ct/headers/agentdvr @@ -0,0 +1,6 @@ + ___ __ ____ _ ______ + / | ____ ____ ____ / /_/ __ \ | / / __ \ + / /| |/ __ `/ _ \/ __ \/ __/ / / / | / / /_/ / + / ___ / /_/ / __/ / / / /_/ /_/ /| |/ / _, _/ +/_/ |_\__, /\___/_/ /_/\__/_____/ |___/_/ |_| + /____/ diff --git a/ct/headers/alpine b/ct/headers/alpine new file mode 100644 index 0000000..ecf1e05 --- /dev/null +++ b/ct/headers/alpine @@ -0,0 +1,6 @@ + ___ __ _ + / | / /___ (_)___ ___ + / /| | / / __ \/ / __ \/ _ \ + / ___ |/ / /_/ / / / / / __/ +/_/ |_/_/ .___/_/_/ /_/\___/ + /_/ diff --git a/ct/headers/alpine-docker b/ct/headers/alpine-docker new file mode 100644 index 0000000..7fd1b26 --- /dev/null +++ b/ct/headers/alpine-docker @@ -0,0 +1,6 @@ + ___ __ _ ____ __ + / | / /___ (_)___ ___ / __ \____ _____/ /_____ _____ + / /| | / / __ \/ / __ \/ _ \______/ / / / __ \/ ___/ //_/ _ \/ ___/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / /_/ / /__/ ,< / __/ / +/_/ |_/_/ .___/_/_/ /_/\___/ /_____/\____/\___/_/|_|\___/_/ + /_/ diff --git a/ct/headers/alpine-gitea b/ct/headers/alpine-gitea new file mode 100644 index 0000000..085b375 --- /dev/null +++ b/ct/headers/alpine-gitea @@ -0,0 +1,6 @@ + ___ __ _ _______ __ + / | / /___ (_)___ ___ / ____(_) /____ ____ _ + / /| | / / __ \/ / __ \/ _ \______/ / __/ / __/ _ \/ __ `/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / / /_/ __/ /_/ / +/_/ |_/_/ .___/_/_/ /_/\___/ \____/_/\__/\___/\__,_/ + /_/ diff --git a/ct/headers/alpine-grafana b/ct/headers/alpine-grafana new file mode 100644 index 0000000..3fe493c --- /dev/null +++ b/ct/headers/alpine-grafana @@ -0,0 +1,6 @@ + ___ __ _ ______ ____ + / | / /___ (_)___ ___ / ____/________ _/ __/___ _____ ____ _ + / /| | / / __ \/ / __ \/ _ \______/ / __/ ___/ __ `/ /_/ __ `/ __ \/ __ `/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / / / /_/ / __/ /_/ / / / / /_/ / +/_/ |_/_/ .___/_/_/ /_/\___/ \____/_/ \__,_/_/ \__,_/_/ /_/\__,_/ + /_/ diff --git a/ct/headers/alpine-it-tools b/ct/headers/alpine-it-tools new file mode 100644 index 0000000..8db2239 --- /dev/null +++ b/ct/headers/alpine-it-tools @@ -0,0 +1,6 @@ + ___ __ _ __________ ______ __ + / | / /___ (_)___ ___ / _/_ __/ /_ __/___ ____ / /____ + / /| | / / __ \/ / __ \/ _ \______ / / / /_____/ / / __ \/ __ \/ / ___/ + / ___ |/ / /_/ / / / / / __/_____// / / /_____/ / / /_/ / /_/ / (__ ) +/_/ |_/_/ .___/_/_/ /_/\___/ /___/ /_/ /_/ \____/\____/_/____/ + /_/ diff --git a/ct/headers/alpine-mariadb b/ct/headers/alpine-mariadb new file mode 100644 index 0000000..1279f83 --- /dev/null +++ b/ct/headers/alpine-mariadb @@ -0,0 +1,6 @@ + ___ __ _ __ ___ _ ____ ____ + / | / /___ (_)___ ___ / |/ /___ ______(_)___ _/ __ \/ __ ) + / /| | / / __ \/ / __ \/ _ \______/ /|_/ / __ `/ ___/ / __ `/ / / / __ | + / ___ |/ / /_/ / / / / / __/_____/ / / / /_/ / / / / /_/ / /_/ / /_/ / +/_/ |_/_/ .___/_/_/ /_/\___/ /_/ /_/\__,_/_/ /_/\__,_/_____/_____/ + /_/ diff --git a/ct/headers/alpine-nextcloud b/ct/headers/alpine-nextcloud new file mode 100644 index 0000000..908459b --- /dev/null +++ b/ct/headers/alpine-nextcloud @@ -0,0 +1,6 @@ + ___ __ _ _ __ __ __ __ + / | / /___ (_)___ ___ / | / /__ _ __/ /______/ /___ __ ______/ / + / /| | / / __ \/ / __ \/ _ \______/ |/ / _ \| |/_/ __/ ___/ / __ \/ / / / __ / + / ___ |/ / /_/ / / / / / __/_____/ /| / __/> < +/_/ |_/_/ \___/_/ /_/_/ |___/\___/_____/\____/_/|_| + diff --git a/ct/headers/aria2 b/ct/headers/aria2 new file mode 100644 index 0000000..3080e17 --- /dev/null +++ b/ct/headers/aria2 @@ -0,0 +1,6 @@ + ___ _ ___ + / | _____(_)___ |__ \ + / /| | / ___/ / __ `/_/ / + / ___ |/ / / / /_/ / __/ +/_/ |_/_/ /_/\__,_/____/ + diff --git a/ct/headers/audiobookshelf b/ct/headers/audiobookshelf new file mode 100644 index 0000000..5e249a8 --- /dev/null +++ b/ct/headers/audiobookshelf @@ -0,0 +1,6 @@ + ___ __ __ __ ______ + ____ ___ ______/ (_)___ / /_ ____ ____ / /_______/ /_ ___ / / __/ + / __ `/ / / / __ / / __ \/ __ \/ __ \/ __ \/ //_/ ___/ __ \/ _ \/ / /_ +/ /_/ / /_/ / /_/ / / /_/ / /_/ / /_/ / /_/ / ,< (__ ) / / / __/ / __/ +\__,_/\__,_/\__,_/_/\____/_.___/\____/\____/_/|_/____/_/ /_/\___/_/_/ + diff --git a/ct/headers/authelia b/ct/headers/authelia new file mode 100644 index 0000000..ed9aa67 --- /dev/null +++ b/ct/headers/authelia @@ -0,0 +1,6 @@ + ___ __ __ ___ + / | __ __/ /_/ /_ ___ / (_)___ _ + / /| |/ / / / __/ __ \/ _ \/ / / __ `/ + / ___ / /_/ / /_/ / / / __/ / / /_/ / +/_/ |_\__,_/\__/_/ /_/\___/_/_/\__,_/ + diff --git a/ct/headers/authentik b/ct/headers/authentik new file mode 100644 index 0000000..f609964 --- /dev/null +++ b/ct/headers/authentik @@ -0,0 +1,6 @@ + ___ __ __ __ _ __ + / | __ __/ /_/ /_ ___ ____ / /_(_) /__ + / /| |/ / / / __/ __ \/ _ \/ __ \/ __/ / //_/ + / ___ / /_/ / /_/ / / / __/ / / / /_/ / ,< +/_/ |_\__,_/\__/_/ /_/\___/_/ /_/\__/_/_/|_| + diff --git a/ct/headers/autobrr b/ct/headers/autobrr new file mode 100644 index 0000000..56322d5 --- /dev/null +++ b/ct/headers/autobrr @@ -0,0 +1,6 @@ + ___ __ __ + / | __ __/ /_____ / /_ __________ + / /| |/ / / / __/ __ \/ __ \/ ___/ ___/ + / ___ / /_/ / /_/ /_/ / /_/ / / / / +/_/ |_\__,_/\__/\____/_.___/_/ /_/ + diff --git a/ct/headers/baikal b/ct/headers/baikal new file mode 100644 index 0000000..247d387 --- /dev/null +++ b/ct/headers/baikal @@ -0,0 +1,6 @@ + ____ _ __ __ + / __ )____ _(_) /______ _/ / + / __ / __ `/ / //_/ __ `/ / + / /_/ / /_/ / / ,< / /_/ / / +/_____/\__,_/_/_/|_|\__,_/_/ + diff --git a/ct/headers/barcode-buddy b/ct/headers/barcode-buddy new file mode 100644 index 0000000..81ec8c0 --- /dev/null +++ b/ct/headers/barcode-buddy @@ -0,0 +1,6 @@ + ____ __ ____ __ __ + / __ )____ _______________ ____/ /__ / __ )__ ______/ /___/ /_ __ + / __ / __ `/ ___/ ___/ __ \/ __ / _ \______/ __ / / / / __ / __ / / / / + / /_/ / /_/ / / / /__/ /_/ / /_/ / __/_____/ /_/ / /_/ / /_/ / /_/ / /_/ / +/_____/\__,_/_/ \___/\____/\__,_/\___/ /_____/\__,_/\__,_/\__,_/\__, / + /____/ diff --git a/ct/headers/bazarr b/ct/headers/bazarr new file mode 100644 index 0000000..e487a77 --- /dev/null +++ b/ct/headers/bazarr @@ -0,0 +1,6 @@ + ____ + / __ )____ _____ ____ ___________ + / __ / __ `/_ / / __ `/ ___/ ___/ + / /_/ / /_/ / / /_/ /_/ / / / / +/_____/\__,_/ /___/\__,_/_/ /_/ + diff --git a/ct/headers/beszel b/ct/headers/beszel new file mode 100644 index 0000000..dcb0d38 --- /dev/null +++ b/ct/headers/beszel @@ -0,0 +1,6 @@ + ____ __ + / __ )___ _________ ___ / / + / __ / _ \/ ___/_ / / _ \/ / + / /_/ / __(__ ) / /_/ __/ / +/_____/\___/____/ /___/\___/_/ + diff --git a/ct/headers/blocky b/ct/headers/blocky new file mode 100644 index 0000000..3bd089b --- /dev/null +++ b/ct/headers/blocky @@ -0,0 +1,6 @@ + ____ __ __ + / __ )/ /___ _____/ /____ __ + / __ / / __ \/ ___/ //_/ / / / + / /_/ / / /_/ / /__/ ,< / /_/ / +/_____/_/\____/\___/_/|_|\__, / + /____/ diff --git a/ct/headers/boltdiy b/ct/headers/boltdiy new file mode 100644 index 0000000..be687dd --- /dev/null +++ b/ct/headers/boltdiy @@ -0,0 +1,6 @@ + __ ____ ___ + / /_ ____ / / /_____/ (_)_ __ + / __ \/ __ \/ / __/ __ / / / / / + / /_/ / /_/ / / /_/ /_/ / / /_/ / +/_.___/\____/_/\__/\__,_/_/\__, / + /____/ diff --git a/ct/headers/bookstack b/ct/headers/bookstack new file mode 100644 index 0000000..f686466 --- /dev/null +++ b/ct/headers/bookstack @@ -0,0 +1,6 @@ + ____ __ __ __ + / __ )____ ____ / /_______/ /_____ ______/ /__ + / __ / __ \/ __ \/ //_/ ___/ __/ __ `/ ___/ //_/ + / /_/ / /_/ / /_/ / ,< (__ ) /_/ /_/ / /__/ ,< +/_____/\____/\____/_/|_/____/\__/\__,_/\___/_/|_| + diff --git a/ct/headers/bunkerweb b/ct/headers/bunkerweb new file mode 100644 index 0000000..188677c --- /dev/null +++ b/ct/headers/bunkerweb @@ -0,0 +1,6 @@ + ____ __ _ __ __ + / __ )__ ______ / /_____ ____| | / /__ / /_ + / __ / / / / __ \/ //_/ _ \/ ___/ | /| / / _ \/ __ \ + / /_/ / /_/ / / / / ,< / __/ / | |/ |/ / __/ /_/ / +/_____/\__,_/_/ /_/_/|_|\___/_/ |__/|__/\___/_.___/ + diff --git a/ct/headers/bytestash b/ct/headers/bytestash new file mode 100644 index 0000000..73089fe --- /dev/null +++ b/ct/headers/bytestash @@ -0,0 +1,6 @@ + ____ __ _____ __ __ + / __ )__ __/ /____ / ___// /_____ ______/ /_ + / __ / / / / __/ _ \\__ \/ __/ __ `/ ___/ __ \ + / /_/ / /_/ / /_/ __/__/ / /_/ /_/ (__ ) / / / +/_____/\__, /\__/\___/____/\__/\__,_/____/_/ /_/ + /____/ diff --git a/ct/headers/caddy b/ct/headers/caddy new file mode 100644 index 0000000..6f47f96 --- /dev/null +++ b/ct/headers/caddy @@ -0,0 +1,6 @@ + ______ __ __ + / ____/___ _____/ /___/ /_ __ + / / / __ `/ __ / __ / / / / +/ /___/ /_/ / /_/ / /_/ / /_/ / +\____/\__,_/\__,_/\__,_/\__, / + /____/ diff --git a/ct/headers/calibre-web b/ct/headers/calibre-web new file mode 100644 index 0000000..ae9dc03 --- /dev/null +++ b/ct/headers/calibre-web @@ -0,0 +1,6 @@ + ______ ___ __ _ __ __ + / ____/___ _/ (_) /_ ________ | | / /__ / /_ + / / / __ `/ / / __ \/ ___/ _ \_____| | /| / / _ \/ __ \ +/ /___/ /_/ / / / /_/ / / / __/_____/ |/ |/ / __/ /_/ / +\____/\__,_/_/_/_.___/_/ \___/ |__/|__/\___/_.___/ + diff --git a/ct/headers/casaos b/ct/headers/casaos new file mode 100644 index 0000000..4af563a --- /dev/null +++ b/ct/headers/casaos @@ -0,0 +1,6 @@ + ______ ____ _____ + / ____/___ __________ _/ __ \/ ___/ + / / / __ `/ ___/ __ `/ / / /\__ \ +/ /___/ /_/ (__ ) /_/ / /_/ /___/ / +\____/\__,_/____/\__,_/\____//____/ + diff --git a/ct/headers/changedetection b/ct/headers/changedetection new file mode 100644 index 0000000..f84a79e --- /dev/null +++ b/ct/headers/changedetection @@ -0,0 +1,6 @@ + ________ ____ __ __ _ + / ____/ /_ ____ _____ ____ ____ / __ \___ / /____ _____/ /_(_)___ ____ + / / / __ \/ __ `/ __ \/ __ `/ _ \ / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \ +/ /___/ / / / /_/ / / / / /_/ / __/ / /_/ / __/ /_/ __/ /__/ /_/ / /_/ / / / / +\____/_/ /_/\__,_/_/ /_/\__, /\___/ /_____/\___/\__/\___/\___/\__/_/\____/_/ /_/ + /____/ diff --git a/ct/headers/channels b/ct/headers/channels new file mode 100644 index 0000000..7600b6e --- /dev/null +++ b/ct/headers/channels @@ -0,0 +1,6 @@ + ________ __ + / ____/ /_ ____ _____ ____ ___ / /____ + / / / __ \/ __ `/ __ \/ __ \/ _ \/ / ___/ +/ /___/ / / / /_/ / / / / / / / __/ (__ ) +\____/_/ /_/\__,_/_/ /_/_/ /_/\___/_/____/ + diff --git a/ct/headers/checkmk b/ct/headers/checkmk new file mode 100644 index 0000000..ff80000 --- /dev/null +++ b/ct/headers/checkmk @@ -0,0 +1,6 @@ + __ __ __ + _____/ /_ ___ _____/ /______ ___ / /__ + / ___/ __ \/ _ \/ ___/ //_/ __ `__ \/ //_/ +/ /__/ / / / __/ /__/ ,< / / / / / / ,< +\___/_/ /_/\___/\___/_/|_/_/ /_/ /_/_/|_| + diff --git a/ct/headers/cloudflared b/ct/headers/cloudflared new file mode 100644 index 0000000..8011c2c --- /dev/null +++ b/ct/headers/cloudflared @@ -0,0 +1,6 @@ + ________ ________ __ + / ____/ /___ __ ______/ / __/ /___ _________ ____/ / + / / / / __ \/ / / / __ / /_/ / __ `/ ___/ _ \/ __ / +/ /___/ / /_/ / /_/ / /_/ / __/ / /_/ / / / __/ /_/ / +\____/_/\____/\__,_/\__,_/_/ /_/\__,_/_/ \___/\__,_/ + diff --git a/ct/headers/cockpit b/ct/headers/cockpit new file mode 100644 index 0000000..8eb04a2 --- /dev/null +++ b/ct/headers/cockpit @@ -0,0 +1,6 @@ + ______ __ _ __ + / ____/___ _____/ /______ (_) /_ + / / / __ \/ ___/ //_/ __ \/ / __/ +/ /___/ /_/ / /__/ ,< / /_/ / / /_ +\____/\____/\___/_/|_/ .___/_/\__/ + /_/ diff --git a/ct/headers/commafeed b/ct/headers/commafeed new file mode 100644 index 0000000..06beb9a --- /dev/null +++ b/ct/headers/commafeed @@ -0,0 +1,6 @@ + ______ ______ __ + / ____/___ ____ ___ ____ ___ ____ _/ ____/__ ___ ____/ / + / / / __ \/ __ `__ \/ __ `__ \/ __ `/ /_ / _ \/ _ \/ __ / +/ /___/ /_/ / / / / / / / / / / / /_/ / __/ / __/ __/ /_/ / +\____/\____/_/ /_/ /_/_/ /_/ /_/\__,_/_/ \___/\___/\__,_/ + diff --git a/ct/headers/cosmos b/ct/headers/cosmos new file mode 100644 index 0000000..bda5132 --- /dev/null +++ b/ct/headers/cosmos @@ -0,0 +1,6 @@ + + _________ _________ ___ ____ _____ + / ___/ __ \/ ___/ __ `__ \/ __ \/ ___/ +/ /__/ /_/ (__ ) / / / / / /_/ (__ ) +\___/\____/____/_/ /_/ /_/\____/____/ + diff --git a/ct/headers/crafty-controller b/ct/headers/crafty-controller new file mode 100644 index 0000000..a37b783 --- /dev/null +++ b/ct/headers/crafty-controller @@ -0,0 +1,6 @@ + ______ ______ ______ __ ____ + / ____/________ _/ __/ /___ __ / ____/___ ____ / /__________ / / /__ _____ + / / / ___/ __ `/ /_/ __/ / / /_____/ / / __ \/ __ \/ __/ ___/ __ \/ / / _ \/ ___/ +/ /___/ / / /_/ / __/ /_/ /_/ /_____/ /___/ /_/ / / / / /_/ / / /_/ / / / __/ / +\____/_/ \__,_/_/ \__/\__, / \____/\____/_/ /_/\__/_/ \____/_/_/\___/_/ + /____/ diff --git a/ct/headers/cronicle b/ct/headers/cronicle new file mode 100644 index 0000000..6d6f7cf --- /dev/null +++ b/ct/headers/cronicle @@ -0,0 +1,6 @@ + ______ _ __ + / ____/________ ____ (_)____/ /__ + / / / ___/ __ \/ __ \/ / ___/ / _ \ +/ /___/ / / /_/ / / / / / /__/ / __/ +\____/_/ \____/_/ /_/_/\___/_/\___/ + diff --git a/ct/headers/cross-seed b/ct/headers/cross-seed new file mode 100644 index 0000000..2047cd2 --- /dev/null +++ b/ct/headers/cross-seed @@ -0,0 +1,6 @@ + __ + ______________ __________ ________ ___ ____/ / + / ___/ ___/ __ \/ ___/ ___/_____/ ___/ _ \/ _ \/ __ / +/ /__/ / / /_/ (__ |__ )_____(__ ) __/ __/ /_/ / +\___/_/ \____/____/____/ /____/\___/\___/\__,_/ + diff --git a/ct/headers/cryptpad b/ct/headers/cryptpad new file mode 100644 index 0000000..c4d6ebe --- /dev/null +++ b/ct/headers/cryptpad @@ -0,0 +1,6 @@ + ______ __ ____ __ + / ____/______ ______ / /_/ __ \____ _____/ / + / / / ___/ / / / __ \/ __/ /_/ / __ `/ __ / +/ /___/ / / /_/ / /_/ / /_/ ____/ /_/ / /_/ / +\____/_/ \__, / .___/\__/_/ \__,_/\__,_/ + /____/_/ diff --git a/ct/headers/daemonsync b/ct/headers/daemonsync new file mode 100644 index 0000000..5320723 --- /dev/null +++ b/ct/headers/daemonsync @@ -0,0 +1,6 @@ + ____ _____ + / __ \____ ____ ____ ___ ____ ____ / ___/__ ______ _____ + / / / / __ `/ _ \/ __ `__ \/ __ \/ __ \ \__ \/ / / / __ \/ ___/ + / /_/ / /_/ / __/ / / / / / /_/ / / / / ___/ / /_/ / / / / /__ +/_____/\__,_/\___/_/ /_/ /_/\____/_/ /_/ /____/\__, /_/ /_/\___/ + /____/ diff --git a/ct/headers/dashy b/ct/headers/dashy new file mode 100644 index 0000000..330f9e3 --- /dev/null +++ b/ct/headers/dashy @@ -0,0 +1,6 @@ + ____ __ + / __ \____ ______/ /_ __ __ + / / / / __ `/ ___/ __ \/ / / / + / /_/ / /_/ (__ ) / / / /_/ / +/_____/\__,_/____/_/ /_/\__, / + /____/ diff --git a/ct/headers/debian b/ct/headers/debian new file mode 100644 index 0000000..a6f474d --- /dev/null +++ b/ct/headers/debian @@ -0,0 +1,6 @@ + ____ __ _ + / __ \___ / /_ (_)___ _____ + / / / / _ \/ __ \/ / __ `/ __ \ + / /_/ / __/ /_/ / / /_/ / / / / +/_____/\___/_.___/_/\__,_/_/ /_/ + diff --git a/ct/headers/deconz b/ct/headers/deconz new file mode 100644 index 0000000..fcfceb2 --- /dev/null +++ b/ct/headers/deconz @@ -0,0 +1,6 @@ + __ __________ _ _______ + ____/ /__ / ____/ __ \/ | / /__ / + / __ / _ \/ / / / / / |/ / / / +/ /_/ / __/ /___/ /_/ / /| / / /__ +\__,_/\___/\____/\____/_/ |_/ /____/ + diff --git a/ct/headers/deluge b/ct/headers/deluge new file mode 100644 index 0000000..6dc49d0 --- /dev/null +++ b/ct/headers/deluge @@ -0,0 +1,6 @@ + ____ __ + / __ \___ / /_ ______ ____ + / / / / _ \/ / / / / __ `/ _ \ + / /_/ / __/ / /_/ / /_/ / __/ +/_____/\___/_/\__,_/\__, /\___/ + /____/ diff --git a/ct/headers/docker b/ct/headers/docker new file mode 100644 index 0000000..907ffba --- /dev/null +++ b/ct/headers/docker @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /_____ _____ + / / / / __ \/ ___/ //_/ _ \/ ___/ + / /_/ / /_/ / /__/ ,< / __/ / +/_____/\____/\___/_/|_|\___/_/ + diff --git a/ct/headers/dockge b/ct/headers/dockge new file mode 100644 index 0000000..040b66a --- /dev/null +++ b/ct/headers/dockge @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /______ ____ + / / / / __ \/ ___/ //_/ __ `/ _ \ + / /_/ / /_/ / /__/ ,< / /_/ / __/ +/_____/\____/\___/_/|_|\__, /\___/ + /____/ diff --git a/ct/headers/docmost b/ct/headers/docmost new file mode 100644 index 0000000..9163390 --- /dev/null +++ b/ct/headers/docmost @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _________ ___ ____ _____/ /_ + / / / / __ \/ ___/ __ `__ \/ __ \/ ___/ __/ + / /_/ / /_/ / /__/ / / / / / /_/ (__ ) /_ +/_____/\____/\___/_/ /_/ /_/\____/____/\__/ + diff --git a/ct/headers/dolibarr b/ct/headers/dolibarr new file mode 100644 index 0000000..f3055a3 --- /dev/null +++ b/ct/headers/dolibarr @@ -0,0 +1,6 @@ + ____ ___ __ + / __ \____ / (_) /_ ____ ___________ + / / / / __ \/ / / __ \/ __ `/ ___/ ___/ + / /_/ / /_/ / / / /_/ / /_/ / / / / +/_____/\____/_/_/_.___/\__,_/_/ /_/ + diff --git a/ct/headers/dotnetaspwebapi b/ct/headers/dotnetaspwebapi new file mode 100644 index 0000000..9cd1b15 --- /dev/null +++ b/ct/headers/dotnetaspwebapi @@ -0,0 +1,6 @@ + ____ __ __ ___ _____ ____ _ __ __ ___ ____ ____ + / __ \____ / /_____ ___ / /_ / | / ___// __ \ | | / /__ / /_ / | / __ \/ _/ + / / / / __ \/ __/ __ \/ _ \/ __/ / /| | \__ \/ /_/ / | | /| / / _ \/ __ \ / /| | / /_/ // / + / /_/ / /_/ / /_/ / / / __/ /_ / ___ |___/ / ____/ | |/ |/ / __/ /_/ / / ___ |/ ____// / +/_____/\____/\__/_/ /_/\___/\__/ /_/ |_/____/_/ |__/|__/\___/_.___/ /_/ |_/_/ /___/ + diff --git a/ct/headers/duplicati b/ct/headers/duplicati new file mode 100644 index 0000000..38a18f3 --- /dev/null +++ b/ct/headers/duplicati @@ -0,0 +1,6 @@ + ____ ___ __ _ + / __ \__ ______ / (_)________ _/ /_(_) + / / / / / / / __ \/ / / ___/ __ `/ __/ / + / /_/ / /_/ / /_/ / / / /__/ /_/ / /_/ / +/_____/\__,_/ .___/_/_/\___/\__,_/\__/_/ + /_/ diff --git a/ct/headers/elementsynapse b/ct/headers/elementsynapse new file mode 100644 index 0000000..a147020 --- /dev/null +++ b/ct/headers/elementsynapse @@ -0,0 +1,6 @@ + ________ __ _____ + / ____/ /__ ____ ___ ___ ____ / /_ / ___/__ ______ ____ _____ ________ + / __/ / / _ \/ __ `__ \/ _ \/ __ \/ __/ \__ \/ / / / __ \/ __ `/ __ \/ ___/ _ \ + / /___/ / __/ / / / / / __/ / / / /_ ___/ / /_/ / / / / /_/ / /_/ (__ ) __/ +/_____/_/\___/_/ /_/ /_/\___/_/ /_/\__/ /____/\__, /_/ /_/\__,_/ .___/____/\___/ + /____/ /_/ diff --git a/ct/headers/emby b/ct/headers/emby new file mode 100644 index 0000000..84afb1d --- /dev/null +++ b/ct/headers/emby @@ -0,0 +1,6 @@ + ______ __ + / ____/___ ___ / /_ __ __ + / __/ / __ `__ \/ __ \/ / / / + / /___/ / / / / / /_/ / /_/ / +/_____/_/ /_/ /_/_.___/\__, / + /____/ diff --git a/ct/headers/emqx b/ct/headers/emqx new file mode 100644 index 0000000..f6cb503 --- /dev/null +++ b/ct/headers/emqx @@ -0,0 +1,6 @@ + ________ _______ _ __ + / ____/ |/ / __ \ | |/ / + / __/ / /|_/ / / / / | / + / /___/ / / / /_/ / / | +/_____/_/ /_/\___\_\/_/|_| + diff --git a/ct/headers/ersatztv b/ct/headers/ersatztv new file mode 100644 index 0000000..f47317c --- /dev/null +++ b/ct/headers/ersatztv @@ -0,0 +1,6 @@ + ______ __ _______ __ + / ____/_____________ _/ /_____/_ __/ | / / + / __/ / ___/ ___/ __ `/ __/_ / / / | | / / + / /___/ / (__ ) /_/ / /_ / /_/ / | |/ / +/_____/_/ /____/\__,_/\__/ /___/_/ |___/ + diff --git a/ct/headers/esphome b/ct/headers/esphome new file mode 100644 index 0000000..5c9e86c --- /dev/null +++ b/ct/headers/esphome @@ -0,0 +1,6 @@ + ___________ ____ __ __ + / ____/ ___// __ \/ / / /___ ____ ___ ___ + / __/ \__ \/ /_/ / /_/ / __ \/ __ `__ \/ _ \ + / /___ ___/ / ____/ __ / /_/ / / / / / / __/ +/_____//____/_/ /_/ /_/\____/_/ /_/ /_/\___/ + diff --git a/ct/headers/evcc b/ct/headers/evcc new file mode 100644 index 0000000..9317a54 --- /dev/null +++ b/ct/headers/evcc @@ -0,0 +1,6 @@ + + ___ _ ____________ + / _ \ | / / ___/ ___/ +/ __/ |/ / /__/ /__ +\___/|___/\___/\___/ + diff --git a/ct/headers/excalidraw b/ct/headers/excalidraw new file mode 100644 index 0000000..4cda874 --- /dev/null +++ b/ct/headers/excalidraw @@ -0,0 +1,6 @@ + ______ ___ __ + / ____/ ___________ _/ (_)___/ /________ __ __ + / __/ | |/_/ ___/ __ `/ / / __ / ___/ __ `/ | /| / / + / /____> < +/_/ /_/\____/_/ /_/ /_/\___/_____/\____/_/|_| + diff --git a/ct/headers/homebridge b/ct/headers/homebridge new file mode 100644 index 0000000..a3da024 --- /dev/null +++ b/ct/headers/homebridge @@ -0,0 +1,6 @@ + __ __ __ _ __ + / / / /___ ____ ___ ___ / /_ _____(_)___/ /___ ____ + / /_/ / __ \/ __ `__ \/ _ \/ __ \/ ___/ / __ / __ `/ _ \ + / __ / /_/ / / / / / / __/ /_/ / / / / /_/ / /_/ / __/ +/_/ /_/\____/_/ /_/ /_/\___/_.___/_/ /_/\__,_/\__, /\___/ + /____/ diff --git a/ct/headers/homepage b/ct/headers/homepage new file mode 100644 index 0000000..4ff42a1 --- /dev/null +++ b/ct/headers/homepage @@ -0,0 +1,6 @@ + __ __ + / / / /___ ____ ___ ___ ____ ____ _____ ____ + / /_/ / __ \/ __ `__ \/ _ \/ __ \/ __ `/ __ `/ _ \ + / __ / /_/ / / / / / / __/ /_/ / /_/ / /_/ / __/ +/_/ /_/\____/_/ /_/ /_/\___/ .___/\__,_/\__, /\___/ + /_/ /____/ diff --git a/ct/headers/homer b/ct/headers/homer new file mode 100644 index 0000000..80e4281 --- /dev/null +++ b/ct/headers/homer @@ -0,0 +1,6 @@ + __ __ + / / / /___ ____ ___ ___ _____ + / /_/ / __ \/ __ `__ \/ _ \/ ___/ + / __ / /_/ / / / / / / __/ / +/_/ /_/\____/_/ /_/ /_/\___/_/ + diff --git a/ct/headers/hyperhdr b/ct/headers/hyperhdr new file mode 100644 index 0000000..cbbcfc5 --- /dev/null +++ b/ct/headers/hyperhdr @@ -0,0 +1,6 @@ + __ __ __ ______ ____ + / / / /_ ______ ___ _____/ / / / __ \/ __ \ + / /_/ / / / / __ \/ _ \/ ___/ /_/ / / / / /_/ / + / __ / /_/ / /_/ / __/ / / __ / /_/ / _, _/ +/_/ /_/\__, / .___/\___/_/ /_/ /_/_____/_/ |_| + /____/_/ diff --git a/ct/headers/hyperion b/ct/headers/hyperion new file mode 100644 index 0000000..2c0f797 --- /dev/null +++ b/ct/headers/hyperion @@ -0,0 +1,6 @@ + __ __ _ + / / / /_ ______ ___ _____(_)___ ____ + / /_/ / / / / __ \/ _ \/ ___/ / __ \/ __ \ + / __ / /_/ / /_/ / __/ / / / /_/ / / / / +/_/ /_/\__, / .___/\___/_/ /_/\____/_/ /_/ + /____/_/ diff --git a/ct/headers/influxdb b/ct/headers/influxdb new file mode 100644 index 0000000..b8efea5 --- /dev/null +++ b/ct/headers/influxdb @@ -0,0 +1,6 @@ + ____ ______ ____ ____ + / _/___ / __/ /_ ___ __/ __ \/ __ ) + / // __ \/ /_/ / / / / |/_/ / / / __ | + _/ // / / / __/ / /_/ /> < +/_/ |_/\___/\__/_____/\____/_/|_| + diff --git a/ct/headers/nextcloudpi b/ct/headers/nextcloudpi new file mode 100644 index 0000000..9aa8b59 --- /dev/null +++ b/ct/headers/nextcloudpi @@ -0,0 +1,6 @@ + _ __ __ ________ ______ _ + / | / /__ _ __/ /_/ ____/ /___ __ ______/ / __ \(_) + / |/ / _ \| |/_/ __/ / / / __ \/ / / / __ / /_/ / / + / /| / __/> < / ____/ / / /_/ /> < | |/ |/ / / /_/ / / / __(__ |__ ) +/_/ |_/_/|_| |__/|__/_/\__/_/ /_/\___/____/____/ + diff --git a/ct/headers/nzbget b/ct/headers/nzbget new file mode 100644 index 0000000..3271545 --- /dev/null +++ b/ct/headers/nzbget @@ -0,0 +1,6 @@ + _ _______ ____ ______ __ + / | / /__ / / __ )/ ____/__ / /_ + / |/ / / / / __ / / __/ _ \/ __/ + / /| / / /__/ /_/ / /_/ / __/ /_ +/_/ |_/ /____/_____/\____/\___/\__/ + diff --git a/ct/headers/octoprint b/ct/headers/octoprint new file mode 100644 index 0000000..0ca8b7d --- /dev/null +++ b/ct/headers/octoprint @@ -0,0 +1,6 @@ + ____ __ ____ _ __ + / __ \_____/ /_____ / __ \_____(_)___ / /_ + / / / / ___/ __/ __ \/ /_/ / ___/ / __ \/ __/ +/ /_/ / /__/ /_/ /_/ / ____/ / / / / / / /_ +\____/\___/\__/\____/_/ /_/ /_/_/ /_/\__/ + diff --git a/ct/headers/ollama b/ct/headers/ollama new file mode 100644 index 0000000..4247d5b --- /dev/null +++ b/ct/headers/ollama @@ -0,0 +1,6 @@ + ____ ____ + / __ \/ / /___ _____ ___ ____ _ + / / / / / / __ `/ __ `__ \/ __ `/ +/ /_/ / / / /_/ / / / / / / /_/ / +\____/_/_/\__,_/_/ /_/ /_/\__,_/ + diff --git a/ct/headers/omada b/ct/headers/omada new file mode 100644 index 0000000..3629b79 --- /dev/null +++ b/ct/headers/omada @@ -0,0 +1,6 @@ + ____ __ + / __ \____ ___ ____ _____/ /___ _ + / / / / __ `__ \/ __ `/ __ / __ `/ +/ /_/ / / / / / / /_/ / /_/ / /_/ / +\____/_/ /_/ /_/\__,_/\__,_/\__,_/ + diff --git a/ct/headers/ombi b/ct/headers/ombi new file mode 100644 index 0000000..48c5743 --- /dev/null +++ b/ct/headers/ombi @@ -0,0 +1,6 @@ + ____ __ _ + / __ \____ ___ / /_ (_) + / / / / __ `__ \/ __ \/ / +/ /_/ / / / / / / /_/ / / +\____/_/ /_/ /_/_.___/_/ + diff --git a/ct/headers/omv b/ct/headers/omv new file mode 100644 index 0000000..067b336 --- /dev/null +++ b/ct/headers/omv @@ -0,0 +1,6 @@ + ____ __ ____ __ + / __ \/ |/ / | / / + / / / / /|_/ /| | / / +/ /_/ / / / / | |/ / +\____/_/ /_/ |___/ + diff --git a/ct/headers/onedev b/ct/headers/onedev new file mode 100644 index 0000000..5743e51 --- /dev/null +++ b/ct/headers/onedev @@ -0,0 +1,6 @@ + ____ ____ + / __ \____ ___ / __ \___ _ __ + / / / / __ \/ _ \/ / / / _ \ | / / +/ /_/ / / / / __/ /_/ / __/ |/ / +\____/_/ /_/\___/_____/\___/|___/ + diff --git a/ct/headers/opengist b/ct/headers/opengist new file mode 100644 index 0000000..618b72d --- /dev/null +++ b/ct/headers/opengist @@ -0,0 +1,6 @@ + ____ _ __ + / __ \____ ___ ____ ____ _(_)____/ /_ + / / / / __ \/ _ \/ __ \/ __ `/ / ___/ __/ +/ /_/ / /_/ / __/ / / / /_/ / (__ ) /_ +\____/ .___/\___/_/ /_/\__, /_/____/\__/ + /_/ /____/ diff --git a/ct/headers/openhab b/ct/headers/openhab new file mode 100644 index 0000000..8f31654 --- /dev/null +++ b/ct/headers/openhab @@ -0,0 +1,6 @@ + __ _____ ____ + ____ ____ ___ ____ / / / / | / __ ) + / __ \/ __ \/ _ \/ __ \/ /_/ / /| | / __ | +/ /_/ / /_/ / __/ / / / __ / ___ |/ /_/ / +\____/ .___/\___/_/ /_/_/ /_/_/ |_/_____/ + /_/ diff --git a/ct/headers/openobserve b/ct/headers/openobserve new file mode 100644 index 0000000..08933fd --- /dev/null +++ b/ct/headers/openobserve @@ -0,0 +1,6 @@ + ____ ____ __ + / __ \____ ___ ____ / __ \/ /_ ________ ______ _____ + / / / / __ \/ _ \/ __ \/ / / / __ \/ ___/ _ \/ ___/ | / / _ \ +/ /_/ / /_/ / __/ / / / /_/ / /_/ (__ ) __/ / | |/ / __/ +\____/ .___/\___/_/ /_/\____/_.___/____/\___/_/ |___/\___/ + /_/ diff --git a/ct/headers/openwebui b/ct/headers/openwebui new file mode 100644 index 0000000..0097a27 --- /dev/null +++ b/ct/headers/openwebui @@ -0,0 +1,6 @@ + ____ _ __ __ __ ______ + / __ \____ ___ ____ | | / /__ / /_ / / / / _/ + / / / / __ \/ _ \/ __ \ | | /| / / _ \/ __ \/ / / // / +/ /_/ / /_/ / __/ / / / | |/ |/ / __/ /_/ / /_/ // / +\____/ .___/\___/_/ /_/ |__/|__/\___/_.___/\____/___/ + /_/ diff --git a/ct/headers/openziti-tunnel b/ct/headers/openziti-tunnel new file mode 100644 index 0000000..a908abd --- /dev/null +++ b/ct/headers/openziti-tunnel @@ -0,0 +1,6 @@ + _ __ _ __ __ + ____ ____ ___ ____ ____ (_) /_(_) / /___ ______ ____ ___ / / + / __ \/ __ \/ _ \/ __ \/_ / / / __/ /_____/ __/ / / / __ \/ __ \/ _ \/ / +/ /_/ / /_/ / __/ / / / / /_/ / /_/ /_____/ /_/ /_/ / / / / / / / __/ / +\____/ .___/\___/_/ /_/ /___/_/\__/_/ \__/\__,_/_/ /_/_/ /_/\___/_/ + /_/ diff --git a/ct/headers/outline b/ct/headers/outline new file mode 100644 index 0000000..66e98f4 --- /dev/null +++ b/ct/headers/outline @@ -0,0 +1,6 @@ + ____ __ ___ + / __ \__ __/ /_/ (_)___ ___ + / / / / / / / __/ / / __ \/ _ \ +/ /_/ / /_/ / /_/ / / / / / __/ +\____/\__,_/\__/_/_/_/ /_/\___/ + diff --git a/ct/headers/overseerr b/ct/headers/overseerr new file mode 100644 index 0000000..880884a --- /dev/null +++ b/ct/headers/overseerr @@ -0,0 +1,6 @@ + ____ + / __ \_ _____ _____________ ___ __________ + / / / / | / / _ \/ ___/ ___/ _ \/ _ \/ ___/ ___/ +/ /_/ /| |/ / __/ / (__ ) __/ __/ / / / +\____/ |___/\___/_/ /____/\___/\___/_/ /_/ + diff --git a/ct/headers/owncast b/ct/headers/owncast new file mode 100644 index 0000000..065e86c --- /dev/null +++ b/ct/headers/owncast @@ -0,0 +1,6 @@ + ____ __ + / __ \_ ______ _________ ______/ /_ + / / / / | /| / / __ \/ ___/ __ `/ ___/ __/ +/ /_/ /| |/ |/ / / / / /__/ /_/ (__ ) /_ +\____/ |__/|__/_/ /_/\___/\__,_/____/\__/ + diff --git a/ct/headers/pairdrop b/ct/headers/pairdrop new file mode 100644 index 0000000..248b4b1 --- /dev/null +++ b/ct/headers/pairdrop @@ -0,0 +1,6 @@ + ____ _ ____ + / __ \____ _(_)____/ __ \_________ ____ + / /_/ / __ `/ / ___/ / / / ___/ __ \/ __ \ + / ____/ /_/ / / / / /_/ / / / /_/ / /_/ / +/_/ \__,_/_/_/ /_____/_/ \____/ .___/ + /_/ diff --git a/ct/headers/paperless-ai b/ct/headers/paperless-ai new file mode 100644 index 0000000..ff10489 --- /dev/null +++ b/ct/headers/paperless-ai @@ -0,0 +1,6 @@ + ____ __ ___ ____ + / __ \____ _____ ___ _____/ /__ __________ / | / _/ + / /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/ /| | / / + / ____/ /_/ / /_/ / __/ / / / __(__ |__ )_____/ ___ |_/ / +/_/ \__,_/ .___/\___/_/ /_/\___/____/____/ /_/ |_/___/ + /_/ diff --git a/ct/headers/paperless-gpt b/ct/headers/paperless-gpt new file mode 100644 index 0000000..187e713 --- /dev/null +++ b/ct/headers/paperless-gpt @@ -0,0 +1,6 @@ + ____ __ __________ ______ + / __ \____ _____ ___ _____/ /__ __________ / ____/ __ \/_ __/ + / /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/ / __/ /_/ / / / + / ____/ /_/ / /_/ / __/ / / / __(__ |__ )_____/ /_/ / ____/ / / +/_/ \__,_/ .___/\___/_/ /_/\___/____/____/ \____/_/ /_/ + /_/ diff --git a/ct/headers/paperless-ngx b/ct/headers/paperless-ngx new file mode 100644 index 0000000..177cf57 --- /dev/null +++ b/ct/headers/paperless-ngx @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____ ___ _____/ /__ __________ ____ ____ __ __ + / /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/ __ \/ __ `/ |/_/ + / ____/ /_/ / /_/ / __/ / / / __(__ |__ )_____/ / / / /_/ /> < +/_/ \__,_/ .___/\___/_/ /_/\___/____/____/ /_/ /_/\__, /_/|_| + /_/ /____/ diff --git a/ct/headers/part-db b/ct/headers/part-db new file mode 100644 index 0000000..fe32555 --- /dev/null +++ b/ct/headers/part-db @@ -0,0 +1,6 @@ + ____ __ ____ ____ + / __ \____ ______/ /_ / __ \/ __ ) + / /_/ / __ `/ ___/ __/_____/ / / / __ | + / ____/ /_/ / / / /_/_____/ /_/ / /_/ / +/_/ \__,_/_/ \__/ /_____/_____/ + diff --git a/ct/headers/paymenter b/ct/headers/paymenter new file mode 100644 index 0000000..50749ac --- /dev/null +++ b/ct/headers/paymenter @@ -0,0 +1,6 @@ + ____ __ + / __ \____ ___ ______ ___ ___ ____ / /____ _____ + / /_/ / __ `/ / / / __ `__ \/ _ \/ __ \/ __/ _ \/ ___/ + / ____/ /_/ / /_/ / / / / / / __/ / / / /_/ __/ / +/_/ \__,_/\__, /_/ /_/ /_/\___/_/ /_/\__/\___/_/ + /____/ diff --git a/ct/headers/peanut b/ct/headers/peanut new file mode 100644 index 0000000..11a2cd5 --- /dev/null +++ b/ct/headers/peanut @@ -0,0 +1,6 @@ + ____ _ ____ ________ + / __ \___ ____ _/ | / / / / /_ __/ + / /_/ / _ \/ __ `/ |/ / / / / / / + / ____/ __/ /_/ / /| / /_/ / / / +/_/ \___/\__,_/_/ |_/\____/ /_/ + diff --git a/ct/headers/pelican-panel b/ct/headers/pelican-panel new file mode 100644 index 0000000..e38095d --- /dev/null +++ b/ct/headers/pelican-panel @@ -0,0 +1,6 @@ + ____ ___ ____ __ + / __ \___ / (_)________ _____ / __ \____ _____ ___ / / + / /_/ / _ \/ / / ___/ __ `/ __ \______/ /_/ / __ `/ __ \/ _ \/ / + / ____/ __/ / / /__/ /_/ / / / /_____/ ____/ /_/ / / / / __/ / +/_/ \___/_/_/\___/\__,_/_/ /_/ /_/ \__,_/_/ /_/\___/_/ + diff --git a/ct/headers/pelican-wings b/ct/headers/pelican-wings new file mode 100644 index 0000000..888c4d3 --- /dev/null +++ b/ct/headers/pelican-wings @@ -0,0 +1,6 @@ + ____ ___ _ ___ + / __ \___ / (_)________ _____ | | / (_)___ ____ ______ + / /_/ / _ \/ / / ___/ __ `/ __ \_____| | /| / / / __ \/ __ `/ ___/ + / ____/ __/ / / /__/ /_/ / / / /_____/ |/ |/ / / / / / /_/ (__ ) +/_/ \___/_/_/\___/\__,_/_/ /_/ |__/|__/_/_/ /_/\__, /____/ + /____/ diff --git a/ct/headers/petio b/ct/headers/petio new file mode 100644 index 0000000..d8deb74 --- /dev/null +++ b/ct/headers/petio @@ -0,0 +1,6 @@ + ____ __ _ + / __ \___ / /_(_)___ + / /_/ / _ \/ __/ / __ \ + / ____/ __/ /_/ / /_/ / +/_/ \___/\__/_/\____/ + diff --git a/ct/headers/pf2etools b/ct/headers/pf2etools new file mode 100644 index 0000000..b6f7cb1 --- /dev/null +++ b/ct/headers/pf2etools @@ -0,0 +1,6 @@ + ____ _______ ______ __ + / __ \/ __/__ \ ___/_ __/___ ____ / /____ + / /_/ / /_ __/ // _ \/ / / __ \/ __ \/ / ___/ + / ____/ __// __// __/ / / /_/ / /_/ / (__ ) +/_/ /_/ /____/\___/_/ \____/\____/_/____/ + diff --git a/ct/headers/photoprism b/ct/headers/photoprism new file mode 100644 index 0000000..a8a9cab --- /dev/null +++ b/ct/headers/photoprism @@ -0,0 +1,6 @@ + ____ __ __ ____ _ + / __ \/ /_ ____ / /_____ / __ \_____(_)________ ___ + / /_/ / __ \/ __ \/ __/ __ \/ /_/ / ___/ / ___/ __ `__ \ + / ____/ / / / /_/ / /_/ /_/ / ____/ / / (__ ) / / / / / +/_/ /_/ /_/\____/\__/\____/_/ /_/ /_/____/_/ /_/ /_/ + diff --git a/ct/headers/phpipam b/ct/headers/phpipam new file mode 100644 index 0000000..51ba79d --- /dev/null +++ b/ct/headers/phpipam @@ -0,0 +1,6 @@ + __ ________ ___ __ ___ + ____ / /_ ____ / _/ __ \/ | / |/ / + / __ \/ __ \/ __ \ / // /_/ / /| | / /|_/ / + / /_/ / / / / /_/ // // ____/ ___ |/ / / / + / .___/_/ /_/ .___/___/_/ /_/ |_/_/ /_/ +/_/ /_/ diff --git a/ct/headers/pialert b/ct/headers/pialert new file mode 100644 index 0000000..07f2474 --- /dev/null +++ b/ct/headers/pialert @@ -0,0 +1,6 @@ + ____ _ ___ __ __ + / __ \(_) | / /__ _____/ /_ + / /_/ / / /| | / / _ \/ ___/ __/ + / ____/ / ___ |/ / __/ / / /_ +/_/ /_/_/ |_/_/\___/_/ \__/ + diff --git a/ct/headers/pihole b/ct/headers/pihole new file mode 100644 index 0000000..9a727b2 --- /dev/null +++ b/ct/headers/pihole @@ -0,0 +1,6 @@ + ____ _ __ __ + / __ \(_) /_ ____ / /__ + / /_/ / / __ \/ __ \/ / _ \ + / ____/ / / / / /_/ / / __/ +/_/ /_/_/ /_/\____/_/\___/ + diff --git a/ct/headers/pingvin b/ct/headers/pingvin new file mode 100644 index 0000000..8177f81 --- /dev/null +++ b/ct/headers/pingvin @@ -0,0 +1,6 @@ + ____ _ _ + / __ \(_)___ ____ __ __(_)___ + / /_/ / / __ \/ __ `/ | / / / __ \ + / ____/ / / / / /_/ /| |/ / / / / / +/_/ /_/_/ /_/\__, / |___/_/_/ /_/ + /____/ diff --git a/ct/headers/plant-it b/ct/headers/plant-it new file mode 100644 index 0000000..b1008b5 --- /dev/null +++ b/ct/headers/plant-it @@ -0,0 +1,6 @@ + ____ __ __ _ __ + / __ \/ /___ _____ / /_ (_) /_ + / /_/ / / __ `/ __ \/ __/_____/ / __/ + / ____/ / /_/ / / / / /_/_____/ / /_ +/_/ /_/\__,_/_/ /_/\__/ /_/\__/ + diff --git a/ct/headers/plex b/ct/headers/plex new file mode 100644 index 0000000..2e27d0b --- /dev/null +++ b/ct/headers/plex @@ -0,0 +1,6 @@ + ____ __ + / __ \/ /__ _ __ + / /_/ / / _ \| |/_/ + / ____/ / __/> < +/_/ /_/\___/_/|_| + diff --git a/ct/headers/pocketbase b/ct/headers/pocketbase new file mode 100644 index 0000000..5eea862 --- /dev/null +++ b/ct/headers/pocketbase @@ -0,0 +1,6 @@ + ____ __ __ __ + / __ \____ _____/ /_____ / /_/ /_ ____ _________ + / /_/ / __ \/ ___/ //_/ _ \/ __/ __ \/ __ `/ ___/ _ \ + / ____/ /_/ / /__/ ,< / __/ /_/ /_/ / /_/ (__ ) __/ +/_/ \____/\___/_/|_|\___/\__/_.___/\__,_/____/\___/ + diff --git a/ct/headers/pocketid b/ct/headers/pocketid new file mode 100644 index 0000000..a1540ef --- /dev/null +++ b/ct/headers/pocketid @@ -0,0 +1,6 @@ + ____ __ __ ________ + / __ \____ _____/ /_____ / /_/ _/ __ \ + / /_/ / __ \/ ___/ //_/ _ \/ __// // / / / + / ____/ /_/ / /__/ ,< / __/ /__/ // /_/ / +/_/ \____/\___/_/|_|\___/\__/___/_____/ + diff --git a/ct/headers/podman b/ct/headers/podman new file mode 100644 index 0000000..2f81f14 --- /dev/null +++ b/ct/headers/podman @@ -0,0 +1,6 @@ + ____ __ + / __ \____ ____/ /___ ___ ____ _____ + / /_/ / __ \/ __ / __ `__ \/ __ `/ __ \ + / ____/ /_/ / /_/ / / / / / / /_/ / / / / +/_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/ + diff --git a/ct/headers/podman-homeassistant b/ct/headers/podman-homeassistant new file mode 100644 index 0000000..5d749f5 --- /dev/null +++ b/ct/headers/podman-homeassistant @@ -0,0 +1,6 @@ + ____ __ __ __ ___ _ __ __ + / __ \____ ____/ /___ ___ ____ _____ / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ + / /_/ / __ \/ __ / __ `__ \/ __ `/ __ \______/ /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ + / ____/ /_/ / /_/ / / / / / / /_/ / / / /_____/ __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ +/_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/ /_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ + diff --git a/ct/headers/postgresql b/ct/headers/postgresql new file mode 100644 index 0000000..8297b0a --- /dev/null +++ b/ct/headers/postgresql @@ -0,0 +1,6 @@ + ____ __ _____ ____ __ + / __ \____ _____/ /_____ _________ / ___// __ \ / / + / /_/ / __ \/ ___/ __/ __ `/ ___/ _ \\__ \/ / / / / / + / ____/ /_/ (__ ) /_/ /_/ / / / __/__/ / /_/ / / /___ +/_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/ + /____/ diff --git a/ct/headers/privatebin b/ct/headers/privatebin new file mode 100644 index 0000000..3aa5b5e --- /dev/null +++ b/ct/headers/privatebin @@ -0,0 +1,6 @@ + ____ _ __ ____ _ + / __ \_____(_) ______ _/ /____ / __ )(_)___ + / /_/ / ___/ / | / / __ `/ __/ _ \/ __ / / __ \ + / ____/ / / /| |/ / /_/ / /_/ __/ /_/ / / / / / +/_/ /_/ /_/ |___/\__,_/\__/\___/_____/_/_/ /_/ + diff --git a/ct/headers/projectsend b/ct/headers/projectsend new file mode 100644 index 0000000..c388eb7 --- /dev/null +++ b/ct/headers/projectsend @@ -0,0 +1,6 @@ + ____ _ __ _____ __ + / __ \_________ (_)__ _____/ /_/ ___/___ ____ ____/ / + / /_/ / ___/ __ \ / / _ \/ ___/ __/\__ \/ _ \/ __ \/ __ / + / ____/ / / /_/ / / / __/ /__/ /_ ___/ / __/ / / / /_/ / +/_/ /_/ \____/_/ /\___/\___/\__//____/\___/_/ /_/\__,_/ + /___/ diff --git a/ct/headers/prometheus b/ct/headers/prometheus new file mode 100644 index 0000000..f5a9ccc --- /dev/null +++ b/ct/headers/prometheus @@ -0,0 +1,6 @@ + ____ __ __ + / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______ + / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/ + / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ ) +/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/ + diff --git a/ct/headers/prometheus-alertmanager b/ct/headers/prometheus-alertmanager new file mode 100644 index 0000000..41b1bd7 --- /dev/null +++ b/ct/headers/prometheus-alertmanager @@ -0,0 +1,6 @@ + ____ __ __ ___ __ __ + / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______ / | / /__ _____/ /_____ ___ ____ _____ ____ _____ ____ _____ + / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /| | / / _ \/ ___/ __/ __ `__ \/ __ `/ __ \/ __ `/ __ `/ _ \/ ___/ + / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ )_____/ ___ |/ / __/ / / /_/ / / / / / /_/ / / / / /_/ / /_/ / __/ / +/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/ /_/ |_/_/\___/_/ \__/_/ /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/ + /____/ diff --git a/ct/headers/prometheus-paperless-ngx-exporter b/ct/headers/prometheus-paperless-ngx-exporter new file mode 100644 index 0000000..b0f56e6 --- /dev/null +++ b/ct/headers/prometheus-paperless-ngx-exporter @@ -0,0 +1,6 @@ + ____ __ __ ____ __ _ _________ __ ______ __ + / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______ / __ \____ _____ ___ _____/ /__ __________ / | / / ____/ |/ / / ____/ ______ ____ _____/ /____ _____ + / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/ |/ / / __ | /_____/ __/ | |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/ + / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ )_____/ ____/ /_/ / /_/ / __/ / / / __(__ |__ )_____/ /| / /_/ // /_____/ /____> < +/____/\__,_/_.___/_.___/_/_/|_| + diff --git a/ct/headers/zammad b/ct/headers/zammad new file mode 100644 index 0000000..eb9999d --- /dev/null +++ b/ct/headers/zammad @@ -0,0 +1,6 @@ + _____ __ +/__ / ____ _____ ___ ____ ___ ____ _____/ / + / / / __ `/ __ `__ \/ __ `__ \/ __ `/ __ / + / /__/ /_/ / / / / / / / / / / / /_/ / /_/ / +/____/\__,_/_/ /_/ /_/_/ /_/ /_/\__,_/\__,_/ + diff --git a/ct/headers/zerotier-one b/ct/headers/zerotier-one new file mode 100644 index 0000000..195eeb5 --- /dev/null +++ b/ct/headers/zerotier-one @@ -0,0 +1,6 @@ + _____ __ _ ____ +/__ / ___ _________ / /_(_)__ _____ / __ \____ ___ + / / / _ \/ ___/ __ \/ __/ / _ \/ ___/_____/ / / / __ \/ _ \ + / /__/ __/ / / /_/ / /_/ / __/ / /_____/ /_/ / / / / __/ +/____/\___/_/ \____/\__/_/\___/_/ \____/_/ /_/\___/ + diff --git a/ct/headers/zigbee2mqtt b/ct/headers/zigbee2mqtt new file mode 100644 index 0000000..f6925a0 --- /dev/null +++ b/ct/headers/zigbee2mqtt @@ -0,0 +1,6 @@ + _____ _ __ ___ __ _______ ____________ +/__ / (_)___ _/ /_ ___ ___ |__ \ / |/ / __ \/_ __/_ __/ + / / / / __ `/ __ \/ _ \/ _ \__/ // /|_/ / / / / / / / / + / /__/ / /_/ / /_/ / __/ __/ __// / / / /_/ / / / / / +/____/_/\__, /_.___/\___/\___/____/_/ /_/\___\_\/_/ /_/ + /____/ diff --git a/ct/headers/zipline b/ct/headers/zipline new file mode 100644 index 0000000..ce2b4b9 --- /dev/null +++ b/ct/headers/zipline @@ -0,0 +1,6 @@ + _____ _ ___ +/__ / (_)___ / (_)___ ___ + / / / / __ \/ / / __ \/ _ \ + / /__/ / /_/ / / / / / / __/ +/____/_/ .___/_/_/_/ /_/\___/ + /_/ diff --git a/ct/headers/zitadel b/ct/headers/zitadel new file mode 100644 index 0000000..eebdc09 --- /dev/null +++ b/ct/headers/zitadel @@ -0,0 +1,6 @@ + _____ _ __ __ __ +/__ / (_) /_____ _____/ /__ / / + / / / / __/ __ `/ __ / _ \/ / + / /__/ / /_/ /_/ / /_/ / __/ / +/____/_/\__/\__,_/\__,_/\___/_/ + diff --git a/ct/headers/zoraxy b/ct/headers/zoraxy new file mode 100644 index 0000000..f93198a --- /dev/null +++ b/ct/headers/zoraxy @@ -0,0 +1,6 @@ + _____ +/__ / ____ _________ __ ____ __ + / / / __ \/ ___/ __ `/ |/_/ / / / + / /__/ /_/ / / / /_/ /> /opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Starting ${APP}" + # Temporary fix until headscale project resolves service getting disabled on updates. + systemctl enable -q --now headscale + 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}" diff --git a/ct/heimdall-dashboard.sh b/ct/heimdall-dashboard.sh new file mode 100644 index 0000000..f65b896 --- /dev/null +++ b/ct/heimdall-dashboard.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://heimdall.site/ + +APP="Heimdall-Dashboard" +var_tags="dashboard" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/Heimdall ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL "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}" + curl -fsSL "https://github.com/linuxserver/Heimdall/archive/${RELEASE}.tar.gz" -o $(basename "https://github.com/linuxserver/Heimdall/archive/${RELEASE}.tar.gz") + tar xzf "${RELEASE}".tar.gz + VER=$(curl -fsSL 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 || exit + $STD apt-get install -y composer + export COMPOSER_ALLOW_SUPERUSER=1 + $STD composer dump-autoload + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated Heimdall Dashboard to ${RELEASE}" + msg_info "Restoring Data" + cd ~ || exit + 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 +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}:7990${CL}" diff --git a/ct/hev-socks5-server.sh b/ct/hev-socks5-server.sh new file mode 100644 index 0000000..1b5da66 --- /dev/null +++ b/ct/hev-socks5-server.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: miviro +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/heiher/hev-socks5-server + +APP="hev-socks5-server" +TAGS="proxy,socks5" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /opt/${APP} ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/heiher/${APP}/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 $APP + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + curl -L -o "${APP}" "https://github.com/heiher/${APP}/releases/download/${RELEASE}/hev-socks5-server-linux-x86_64" + mv ${APP} /opt/${APP} + chmod +x /opt/${APP} + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start $APP + msg_ok "Started $APP" + + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Update Successful" + 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 with a SOCKS5 client using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}${IP}:1080${CL}" +echo -e "${INFO}${YW} and the credentials stored at /root/hev.creds${CL}" \ No newline at end of file diff --git a/ct/hivemq.sh b/ct/hivemq.sh new file mode 100644 index 0000000..7c959a8 --- /dev/null +++ b/ct/hivemq.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.hivemq.com/ + +APP="HiveMQ" +var_tags="mqtt" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /var ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${APP}." + exit +} + +start +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 0000000..65065e9 --- /dev/null +++ b/ct/hoarder.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) & vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://hoarder.app/ + +APP="Hoarder" +var_tags="bookmark" +var_cpu="2" +var_ram="4096" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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}" + if [[ $(corepack -v) < "0.31.0" ]]; then + $STD npm install -g corepack@0.31.0 + fi + if [[ "${PREV_RELEASE}" < 0.23.0 ]]; then + $STD apt-get install -y graphicsmagick ghostscript + fi + cd /opt || exit + if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then + mkdir -p /etc/hoarder + mv /opt/hoarder/.env /etc/hoarder/hoarder.env + fi + rm -rf /opt/hoarder + curl -fsSL "https://github.com/hoarder-app/hoarder/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip" + unzip -q v"${RELEASE}".zip + mv karakeep-"${RELEASE}" /opt/hoarder + cd /opt/hoarder/apps/web || exit + $STD pnpm install --frozen-lockfile + $STD pnpm exec next build --experimental-build-mode compile + cp -r /opt/hoarder/apps/web/.next/standalone/apps/web/server.js /opt/hoarder/apps/web + cd /opt/hoarder/apps/workers || exit + $STD pnpm install --frozen-lockfile + export DATA_DIR=/opt/hoarder_data + cd /opt/hoarder/packages/db || exit + $STD pnpm migrate + sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/hoarder/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}" diff --git a/ct/homarr.sh b/ct/homarr.sh new file mode 100644 index 0000000..c5a4c8b --- /dev/null +++ b/ct/homarr.sh @@ -0,0 +1,170 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: MickLesk (Canbiz) | Co-Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://homarr.dev/ + +APP="Homarr" +var_tags="arr;dashboard" +var_cpu="2" +var_ram="4096" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" + +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/homarr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if [[ -f /opt/homarr/database/db.sqlite ]]; then + msg_error "Old Homarr detected due to existing database file (/opt/homarr/database/db.sqlite)." + msg_error "Update not supported. Refer to:" + msg_error " - https://github.com/community-scripts/ProxmoxVE/discussions/1551" + msg_error " - https://homarr.dev/docs/getting-started/after-the-installation/#importing-a-zip-from-version-before-100" + exit 1 + fi + if [[ ! -f /opt/run_homarr.sh ]]; then + msg_info "Detected outdated and missing service files" + msg_error "Warning - The port of homarr changed from 3000 to 7575" + $STD apt-get install -y nginx gettext openssl gpg + sed -i '/^NODE_ENV=/d' /opt/homarr/.env && echo "NODE_ENV='production'" >>/opt/homarr/.env + sed -i '/^DB_DIALECT=/d' /opt/homarr/.env && echo "DB_DIALECT='sqlite'" >>/opt/homarr/.env + cat <<'EOF' >/opt/run_homarr.sh +#!/bin/bash +set -a +source /opt/homarr/.env +set +a +export DB_DIALECT='sqlite' +export AUTH_SECRET=$(openssl rand -base64 32) +node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT +for dir in $(find /opt/homarr_db/migrations/migrations -mindepth 1 -maxdepth 1 -type d); do + dirname=$(basename "$dir") + mkdir -p "/opt/homarr_db/migrations/$dirname" + cp -r "$dir"/* "/opt/homarr_db/migrations/$dirname/" 2>/dev/null || true +done +export HOSTNAME=$(ip route get 1.1.1.1 | grep -oP 'src \K[^ ]+') +envsubst '${HOSTNAME}' < /etc/nginx/templates/nginx.conf > /etc/nginx/nginx.conf +nginx -g 'daemon off;' & +redis-server /opt/homarr/packages/redis/redis.conf & +node apps/tasks/tasks.cjs & +node apps/websocket/wssServer.cjs & +node apps/nextjs/server.js & PID=$! +wait $PID +EOF + chmod +x /opt/run_homarr.sh + rm /etc/systemd/system/homarr.service + cat </etc/systemd/system/homarr.service +[Unit] +Description=Homarr Service +After=network.target +[Service] +Type=exec +WorkingDirectory=/opt/homarr +EnvironmentFile=-/opt/homarr/.env +ExecStart=/opt/run_homarr.sh +[Install] +WantedBy=multi-user.target +EOF + msg_ok "Updated Services" + systemctl daemon-reload + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/homarr-labs/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 (Patience)" + systemctl stop homarr + msg_ok "Services Stopped" + + msg_info "Backup Data" + mkdir -p /opt/homarr-data-backup + cp /opt/homarr/.env /opt/homarr-data-backup/.env + msg_ok "Backup Data" + + msg_info "Updating and rebuilding ${APP} to v${RELEASE} (Patience)" + rm /opt/run_homarr.sh + cat <<'EOF' >/opt/run_homarr.sh +#!/bin/bash +set -a +source /opt/homarr/.env +set +a +export DB_DIALECT='sqlite' +export AUTH_SECRET=$(openssl rand -base64 32) +node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT +for dir in $(find /opt/homarr_db/migrations/migrations -mindepth 1 -maxdepth 1 -type d); do + dirname=$(basename "$dir") + mkdir -p "/opt/homarr_db/migrations/$dirname" + cp -r "$dir"/* "/opt/homarr_db/migrations/$dirname/" 2>/dev/null || true +done +export HOSTNAME=$(ip route get 1.1.1.1 | grep -oP 'src \K[^ ]+') +envsubst '${HOSTNAME}' < /etc/nginx/templates/nginx.conf > /etc/nginx/nginx.conf +nginx -g 'daemon off;' & +redis-server /opt/homarr/packages/redis/redis.conf & +node apps/tasks/tasks.cjs & +node apps/websocket/wssServer.cjs & +node apps/nextjs/server.js & PID=$! +wait $PID +EOF + chmod +x /opt/run_homarr.sh +curl -fsSL "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/homarr-labs/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 + $STD pnpm install + $STD pnpm build + cp /opt/homarr/apps/nextjs/next.config.ts . + cp /opt/homarr/apps/nextjs/package.json . + cp -r /opt/homarr/packages/db/migrations /opt/homarr_db/migrations + cp -r /opt/homarr/apps/nextjs/.next/standalone/* /opt/homarr + mkdir -p /appdata/redis + cp /opt/homarr/packages/redis/redis.conf /opt/homarr/redis.conf + rm /etc/nginx/nginx.conf + mkdir -p /etc/nginx/templates + cp /opt/homarr/nginx.conf /etc/nginx/templates/nginx.conf + + mkdir -p /opt/homarr/apps/cli + cp /opt/homarr/packages/cli/cli.cjs /opt/homarr/apps/cli/cli.cjs + echo $'#!/bin/bash\ncd /opt/homarr/apps/cli && node ./cli.cjs "$@"' >/usr/bin/homarr + chmod +x /usr/bin/homarr + + mkdir /opt/homarr/build + cp ./node_modules/better-sqlite3/build/Release/better_sqlite3.node ./build/better_sqlite3.node + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting Services" + systemctl start homarr + msg_ok "Started Services" + msg_ok "Updated Successfully" + read -p "It's recommended to reboot the LXC after an update, would you like to reboot the LXC now ? (y/n): " choice + if [[ "$choice" =~ ^[Yy]$ ]]; then + reboot + fi + 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}:7575${CL}" \ No newline at end of file diff --git a/ct/homeassistant-core.sh b/ct/homeassistant-core.sh new file mode 100644 index 0000000..041f3d8 --- /dev/null +++ b/ct/homeassistant-core.sh @@ -0,0 +1,134 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tteck (tteckster) | Co-Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.home-assistant.io/ + +APP="Home Assistant-Core" +var_tags="automation;smarthome" +var_cpu="2" +var_ram="2048" +var_disk="10" +var_os="ubuntu" +var_version="24.10" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + + # OS Check + if ! lsb_release -d | grep -q "Ubuntu 24.10"; then + msg_error "Wrong OS detected. This script only supports Ubuntu 24.10." + msg_error "Read Guide: https://github.com/community-scripts/ProxmoxVE/discussions/1549" + exit 1 + fi + check_container_storage + check_container_resources + if [[ ! -d /srv/homeassistant ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + PY=$(ls /srv/homeassistant/lib/) + IP=$(hostname -I | awk '{print $1}') + UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \ + "1" "Update Core" ON \ + "2" "Install HACS" OFF \ + "3" "Install FileBrowser" OFF \ + 3>&1 1>&2 2>&3) + if [ "$UPD" == "1" ]; then + if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SELECT BRANCH" --yesno "Use Beta Branch?" 10 58); then + clear + header_info + echo -e "${GN}Updating to Beta Version${CL}" + BR="--pre " + else + clear + header_info + echo -e "${GN}Updating to Stable Version${CL}" + BR="" + fi + msg_info "Stopping Home Assistant" + systemctl stop homeassistant + msg_ok "Stopped Home Assistant" + + msg_info "Updating Home Assistant" + source /srv/homeassistant/bin/activate + $STD pip install ${BR}--upgrade homeassistant + msg_ok "Updated Home Assistant" + + msg_info "Starting Home Assistant" + systemctl start homeassistant + sleep 2 + msg_ok "Started Home Assistant" + msg_ok "Update Successful" + echo -e "\n Go to http://${IP}:8123 \n" + exit + fi + if [ "$UPD" == "2" ]; then + msg_info "Installing Home Assistant Community Store (HACS)" + $STD apt update + $STD apt install -y unzip + cd .homeassistant + $STD bash <(curl -fsSL https://get.hacs.xyz) + msg_ok "Installed Home Assistant Community Store (HACS)" + echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n" + exit + fi + if [ "$UPD" == "3" ]; then + set +Eeuo pipefail + 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') + $STD curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/$RELEASE/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin + + if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then + $STD filebrowser config init -a '0.0.0.0' + $STD filebrowser config set -a '0.0.0.0' + $STD filebrowser config set --auth.method=noauth + $STD filebrowser users add ID 1 --perm.admin + else + $STD filebrowser config init -a '0.0.0.0' + $STD filebrowser config set -a '0.0.0.0' + $STD filebrowser users add admin helper-scripts.com --perm.admin + fi + msg_ok "Installed FileBrowser" + + msg_info "Creating Service" + cat </etc/systemd/system/filebrowser.service +[Unit] +Description=Filebrowser +After=network-online.target + +[Service] +User=root +WorkingDirectory=/root/ +ExecStart=/usr/local/bin/filebrowser -r /root/.homeassistant + +[Install] +WantedBy=default.target +EOF + + systemctl enable --now -q filebrowser.service + msg_ok "Created Service" + + msg_ok "Completed Successfully!\n" + echo -e "FileBrowser should be reachable by going to the following URL. + ${BL}http://$IP:8080${CL} admin|helper-scripts.com\n" + exit + 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}:8123${CL}" \ No newline at end of file diff --git a/ct/homeassistant.sh b/ct/homeassistant.sh new file mode 100644 index 0000000..9024d2f --- /dev/null +++ b/ct/homeassistant.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.home-assistant.io/ + +APP="Home Assistant" +var_tags="automation;smarthome" +var_cpu="2" +var_ram="2048" +var_disk="16" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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 + fi + UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \ + "1" "Update ALL Containers" ON \ + "2" "Remove ALL Unused Images" OFF \ + "3" "Install HACS" OFF \ + "4" "Install FileBrowser" OFF \ + 3>&1 1>&2 2>&3) + + if [ "$UPD" == "1" ]; then + msg_info "Updating All Containers" + CONTAINER_LIST="${1:-$(docker ps -q)}" + for container in ${CONTAINER_LIST}; do + CONTAINER_IMAGE="$(docker inspect --format "{{.Config.Image}}" --type container ${container})" + RUNNING_IMAGE="$(docker inspect --format "{{.Image}}" --type container "${container}")" + docker pull "${CONTAINER_IMAGE}" + LATEST_IMAGE="$(docker inspect --format "{{.Id}}" --type image "${CONTAINER_IMAGE}")" + if [[ "${RUNNING_IMAGE}" != "${LATEST_IMAGE}" ]]; then + pip install -U runlike + echo "Updating ${container} image ${CONTAINER_IMAGE}" + DOCKER_COMMAND="$(runlike --use-volume-id "${container}")" + docker rm --force "${container}" + eval ${DOCKER_COMMAND} + fi + done + msg_ok "Updated All Containers" + exit + fi + if [ "$UPD" == "2" ]; then + msg_info "Removing ALL Unused Images" + docker image prune -af + msg_ok "Removed ALL Unused Images" + exit + fi + if [ "$UPD" == "3" ]; then + msg_info "Installing Home Assistant Community Store (HACS)" + $STD apt update + $STD apt install unzip + cd /var/lib/docker/volumes/hass_config/_data + $STD bash <(curl -fsSL https://get.hacs.xyz) + msg_ok "Installed Home Assistant Community Store (HACS)" + echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n" + exit + fi + if [ "$UPD" == "4" ]; then + 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') + $STD curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin + $STD filebrowser config init -a '0.0.0.0' + $STD filebrowser config set -a '0.0.0.0' + $STD filebrowser users add admin helper-scripts.com --perm.admin + msg_ok "Installed FileBrowser" + + msg_info "Creating Service" + service_path="/etc/systemd/system/filebrowser.service" + echo "[Unit] +Description=Filebrowser +After=network-online.target +[Service] +User=root +WorkingDirectory=/root/ +ExecStart=/usr/local/bin/filebrowser -r / +[Install] +WantedBy=default.target" >$service_path + + $STD systemctl enable --now filebrowser + msg_ok "Created Service" + + msg_ok "Completed Successfully!\n" + echo -e "FileBrowser should be reachable by going to the following URL. + ${BL}http://$IP:8080${CL} admin|helper-scripts.com\n" + exit + 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}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 new file mode 100644 index 0000000..5efc70a --- /dev/null +++ b/ct/homebox.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck | Co-Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://homebox.software/en/ + +APP="HomeBox" +var_tags="inventory;household" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /opt/homebox ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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 + rm -rf /tmp/homebox.tar.gz + mv homebox homebox_bak +curl -fsSL "https://github.com/sysadminsmedia/homebox/releases/download/${RELEASE}/homebox_Linux_x86_64.tar.gz" -o "/tmp/homebox.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_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}:7745${CL}" \ No newline at end of file diff --git a/ct/homebridge.sh b/ct/homebridge.sh new file mode 100644 index 0000000..35825d0 --- /dev/null +++ b/ct/homebridge.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://homebridge.io/ + +APP="Homebridge" +var_tags="smarthome;homekit" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get install -y homebridge + 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}:8581${CL}" \ No newline at end of file diff --git a/ct/homepage.sh b/ct/homepage.sh new file mode 100644 index 0000000..7675d32 --- /dev/null +++ b/ct/homepage.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://gethomepage.dev/ + +APP="Homepage" +var_tags="dashboard" +var_cpu="2" +var_ram="4096" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + 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..." + $STD apt-get install -y npm + $STD npm install -g pnpm + echo "Installed NPM..." + fi + fi + LOCAL_IP=$(hostname -I | awk '{print $1}') + RELEASE=$(curl -fsSL 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 + curl -fsSL "https://github.com/gethomepage/homepage/archive/refs/tags/v${RELEASE}.tar.gz" -o $(basename "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 + $STD pnpm install + $STD npx --yes update-browserslist-db@latest + export NEXT_PUBLIC_VERSION="v$RELEASE" + export NEXT_PUBLIC_REVISION="source" + export NEXT_TELEMETRY_DISABLED=1 + $STD pnpm build + if [[ ! -f /opt/homepage/.env ]]; then + echo "HOMEPAGE_ALLOWED_HOSTS=localhost:3000,${LOCAL_IP}:3000" >/opt/homepage/.env + fi + 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 +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/homer.sh b/ct/homer.sh new file mode 100644 index 0000000..69ba259 --- /dev/null +++ b/ct/homer.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/bastienwirtz/homer + +APP="Homer" +var_tags="dashboard" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 "Updating ${APP}" + rm -rf /opt/homer/* + cd /opt/homer + curl -fsSL "https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip" -o $(basename "https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip") + $STD unzip homer.zip + msg_ok "Updated ${APP}" + + 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 "Starting ${APP}" + systemctl start homer + msg_ok "Started ${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 URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8010${CL}" diff --git a/ct/hyperhdr.sh b/ct/hyperhdr.sh new file mode 100644 index 0000000..54a0a27 --- /dev/null +++ b/ct/hyperhdr.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.hyperhdr.eu/ + +APP="HyperHDR" +var_tags="ambient-lightning" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8090${CL}" \ No newline at end of file diff --git a/ct/hyperion.sh b/ct/hyperion.sh new file mode 100644 index 0000000..2e86e58 --- /dev/null +++ b/ct/hyperion.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://hyperion-project.org/forum/ + +APP="Hyperion" +var_tags="ambient-lightning" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get install -y hyperion + 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}:8090${CL}" \ No newline at end of file diff --git a/ct/influxdb.sh b/ct/influxdb.sh new file mode 100644 index 0000000..c887777 --- /dev/null +++ b/ct/influxdb.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.influxdata.com/ + +APP="InfluxDB" +var_tags="database" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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}" + $STD apt-get update + $STD apt-get -y upgrade + 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} and Port 8888 for v1 or Port 8086 (v2)${CL}" \ No newline at end of file diff --git a/ct/inspircd.sh b/ct/inspircd.sh new file mode 100644 index 0000000..9f99287 --- /dev/null +++ b/ct/inspircd.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kristocopani +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.inspircd.org/ + +APP="InspIRCd" +var_tags="IRC" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/inspircd/inspircd/releases/download/v${RELEASE}/inspircd_${RELEASE}.deb12u1_amd64.deb" -o $(basename "https://github.com/inspircd/inspircd/releases/download/v${RELEASE}/inspircd_${RELEASE}.deb12u1_amd64.deb") + $STD apt-get install "./inspircd_${RELEASE}.deb12u1_amd64.deb" -y + 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}" diff --git a/ct/inventree.sh b/ct/inventree.sh new file mode 100644 index 0000000..f300b10 --- /dev/null +++ b/ct/inventree.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/inventree/InvenTree + +APP="InvenTree" +var_tags="inventory" +var_cpu="2" +var_ram="2048" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/inventree" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating $APP" + $STD apt-get update + $STD apt-get install --only-upgrade inventree -y + msg_ok "Updated $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}${CL}" \ No newline at end of file diff --git a/ct/iobroker.sh b/ct/iobroker.sh new file mode 100644 index 0000000..fc8f68c --- /dev/null +++ b/ct/iobroker.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.iobroker.net/#en/intro + +APP="ioBroker" +var_tags="automtation" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8081${CL}" \ No newline at end of file diff --git a/ct/iventoy.sh b/ct/iventoy.sh new file mode 100644 index 0000000..7ee842a --- /dev/null +++ b/ct/iventoy.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.iventoy.com/en/index.html + +APP="iVentoy" +var_tags="pxe-tool" +var_disk="2" +var_cpu="1" +var_ram="512" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/iventoy ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${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}:26000${CL}" \ No newline at end of file diff --git a/ct/jackett.sh b/ct/jackett.sh new file mode 100644 index 0000000..e75fbbd --- /dev/null +++ b/ct/jackett.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Jackett/Jackett + +APP="Jackett" +var_tags="torrent" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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=$(curl -fsSL https://github.com/Jackett/Jackett/releases/latest | grep "title>Release" | cut -d " " -f 4) + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Updating ${APP}" + curl -fsSL "https://github.com/Jackett/Jackett/releases/download/$RELEASE/Jackett.Binaries.LinuxAMDx64.tar.gz" -o $(basename "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 +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}:9117${CL}" diff --git a/ct/jellyfin.sh b/ct/jellyfin.sh new file mode 100644 index 0000000..1c2bbb0 --- /dev/null +++ b/ct/jellyfin.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://jellyfin.org/ + +APP="Jellyfin" +var_tags="media" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="ubuntu" +var_version="22.04" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + $STD apt-get -y --with-new-pkgs upgrade jellyfin jellyfin-server + 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}:8096${CL}" \ No newline at end of file diff --git a/ct/jellyseerr.sh b/ct/jellyseerr.sh new file mode 100644 index 0000000..3d14eee --- /dev/null +++ b/ct/jellyseerr.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://docs.jellyseerr.dev/ + +APP="Jellyseerr" +var_tags="media" +var_cpu="4" +var_ram="4096" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/jellyseerr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if [ "$(node -v | cut -c2-3)" -ne 22 ]; then + msg_info "Updating Node.js Repository" + echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list + msg_ok "Updating Node.js Repository" + + msg_info "Updating Packages" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updating Packages" + + msg_info "Cleaning up" + apt-get -y autoremove + apt-get -y autoclean + msg_ok "Cleaning up" + fi + + cd /opt/jellyseerr + output=$(git pull --no-rebase) + + pnpm_current=$(pnpm --version 2>/dev/null) + pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json) + + if [ -z "$pnpm_current" ]; then + msg_error "pnpm not found. Installing version $pnpm_desired..." + $STD npm install -g pnpm@"$pnpm_desired" + elif ! node -e "const semver = require('semver'); process.exit(semver.satisfies('$pnpm_current', '$pnpm_desired') ? 0 : 1)"; then + msg_error "Updating pnpm from version $pnpm_current to $pnpm_desired..." + $STD npm install -g pnpm@"$pnpm_desired" + else + msg_ok "pnpm is already installed and satisfies version $pnpm_desired." + fi + + msg_info "Updating $APP" + 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 + $STD pnpm install --frozen-lockfile + export NODE_OPTIONS="--max-old-space-size=3072" + $STD pnpm build + + cat </etc/systemd/system/jellyseerr.service +[Unit] +Description=jellyseerr Service +After=network.target + +[Service] +EnvironmentFile=/etc/jellyseerr/jellyseerr.conf +Environment=NODE_ENV=production +Type=exec +WorkingDirectory=/opt/jellyseerr +ExecStart=/usr/bin/node dist/index.js + +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload + systemctl start jellyseerr + msg_ok "Updated $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}:5055${CL}" \ No newline at end of file diff --git a/ct/jenkins.sh b/ct/jenkins.sh new file mode 100644 index 0000000..627117c --- /dev/null +++ b/ct/jenkins.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kristocopani +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.jenkins.io/ + +APP="Jenkins" +var_tags="automation" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/jupyternotebook.sh b/ct/jupyternotebook.sh new file mode 100644 index 0000000..6a8a415 --- /dev/null +++ b/ct/jupyternotebook.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Dave-code-creater (Tan Dat, Ta) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://jupyter.org/ + +APP="JupyterNotebook" +var_tags="ai;dev-tools" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="ubuntu" +var_version="24.04" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get install -y upgrade + $STD pip3 install jupyter --upgrade + 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}:8888${CL}" \ No newline at end of file diff --git a/ct/karakeep.sh b/ct/karakeep.sh new file mode 100644 index 0000000..ff35b94 --- /dev/null +++ b/ct/karakeep.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) & vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://karakeep.app/ + +APP="karakeep" +var_tags="bookmark" +var_cpu="2" +var_ram="4096" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/karakeep ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/karakeep-app/karakeep/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 karakeep-web karakeep-workers karakeep-browser + msg_ok "Stopped Services" + msg_info "Updating ${APP} to v${RELEASE}" + if [[ $(corepack -v) < "0.31.0" ]]; then + $STD npm install -g corepack@0.31.0 + fi + if [[ "${PREV_RELEASE}" < 0.23.0 ]]; then + $STD apt-get install -y graphicsmagick ghostscript + fi + cd /opt || exit + if [[ -f /opt/karakeep/.env ]] && [[ ! -f /etc/karakeep/karakeep.env ]]; then + mkdir -p /etc/karakeep + mv /opt/karakeep/.env /etc/karakeep/karakeep.env + fi + rm -rf /opt/karakeep + curl -fsSL "https://github.com/karakeep-app/karakeep/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip" + unzip -q "v${RELEASE}.zip" + mv karakeep-"${RELEASE}" /opt/karakeep + cd /opt/karakeep/apps/web || exit + $STD pnpm install --frozen-lockfile + $STD pnpm exec next build --experimental-build-mode compile + cp -r /opt/karakeep/apps/web/.next/standalone/apps/web/server.js /opt/karakeep/apps/web + cd /opt/karakeep/apps/workers || exit + $STD pnpm install --frozen-lockfile + export DATA_DIR=/opt/karakeep_data + cd /opt/karakeep/packages/db || exit + $STD pnpm migrate + sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/karakeep/karakeep.env + msg_ok "Updated ${APP} to v${RELEASE}" + + msg_info "Starting Services" + systemctl start karakeep-browser karakeep-workers karakeep-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}" diff --git a/ct/kavita.sh b/ct/kavita.sh new file mode 100644 index 0000000..77c2257 --- /dev/null +++ b/ct/kavita.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.kavitareader.com/ + +APP="Kavita" +var_tags="reader" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSL https://api.github.com/repos/Kareadita/Kavita/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + $STD tar -xvzf <(curl -fsSL https://github.com/Kareadita/Kavita/releases/download/$RELEASE/kavita-linux-x64.tar.gz) --no-same-owner + rm -rf Kavita/config + cp -r Kavita/* /opt/Kavita + rm -rf Kavita + systemctl start kavita + 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}:5000${CL}" \ No newline at end of file diff --git a/ct/keycloak.sh b/ct/keycloak.sh new file mode 100644 index 0000000..4d9880b --- /dev/null +++ b/ct/keycloak.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.keycloak.org/ + +APP="Keycloak" +var_tags="access-management" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + + RELEASE=$(curl -fsSL 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 + curl -fsSL "https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz" -o $(basename "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 "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 +} + +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/admin${CL}" diff --git a/ct/kimai.sh b/ct/kimai.sh new file mode 100644 index 0000000..e360a83 --- /dev/null +++ b/ct/kimai.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.kimai.org/ + +APP="Kimai" +var_tags="time-tracking" +var_cpu="2" +var_ram="2048" +var_disk="7" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 + CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) + if [[ "$CURRENT_PHP" != "8.4" ]]; then + msg_info "Migrating PHP $CURRENT_PHP to 8.4" + $STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb + $STD dpkg -i /tmp/debsuryorg-archive-keyring.deb + $STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' + $STD apt-get update + $STD apt-get remove -y php"${CURRENT_PHP//./}"* + $STD apt-get install -y \ + php8.4 \ + php8.4-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl} \ + libapache2-mod-php8.4 + msg_ok "Migrated PHP $CURRENT_PHP to 8.4" + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/kimai/kimai/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + BACKUP_DIR="/opt/kimai_backup" + + 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 "Backing up Kimai configuration and var directory" + mkdir -p "$BACKUP_DIR" + [ -d /opt/kimai/var ] && cp -r /opt/kimai/var "$BACKUP_DIR/" + [ -f /opt/kimai/.env ] && cp /opt/kimai/.env "$BACKUP_DIR/" + [ -f /opt/kimai/config/packages/local.yaml ] && cp /opt/kimai/config/packages/local.yaml "$BACKUP_DIR/" + msg_ok "Backup completed" + + msg_info "Updating ${APP} to ${RELEASE}" + rm -rf /opt/kimai + curl -fsSL "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip") + unzip -q "${RELEASE}".zip + mv kimai-"${RELEASE}" /opt/kimai + [ -d "$BACKUP_DIR/var" ] && cp -r "$BACKUP_DIR/var" /opt/kimai/ + [ -f "$BACKUP_DIR/.env" ] && cp "$BACKUP_DIR/.env" /opt/kimai/ + [ -f "$BACKUP_DIR/local.yaml" ] && cp "$BACKUP_DIR/local.yaml" /opt/kimai/config/packages/ + rm -rf "$BACKUP_DIR" + cd /opt/kimai || exit + $STD composer install --no-dev --optimize-autoloader + $STD bin/console kimai:update + 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 "Setup Permissions" + chown -R :www-data /opt/* + chmod -R g+r /opt/* + chmod -R g+rw /opt/* + chown -R www-data:www-data /opt/* + chmod -R 777 /opt/* + msg_ok "Setup Permissions" + + msg_info "Cleaning Up" + rm -rf "${RELEASE}".zip + rm -rf "$BACKUP_DIR" + 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}" diff --git a/ct/koillection.sh b/ct/koillection.sh new file mode 100644 index 0000000..c257309 --- /dev/null +++ b/ct/koillection.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://koillection.github.io/ + +APP="Koillection" +var_tags="network" +var_cpu="2" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/koillection ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/benjaminjonard/koillection/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 apache2 + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt + mv /opt/koillection/ /opt/koillection-backup + curl -fsSL "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip") + unzip -q "${RELEASE}.zip" + mv "/opt/koillection-${RELEASE}" /opt/koillection + cd /opt/koillection + cp -r /opt/koillection-backup/.env.local /opt/koillection + cp -r /opt/koillection-backup/public/uploads/. /opt/koillection/public/uploads/ + export COMPOSER_ALLOW_SUPERUSER=1 + $STD composer install --no-dev -o --no-interaction --classmap-authoritative + $STD php bin/console doctrine:migrations:migrate --no-interaction + $STD php bin/console app:translations:dump + cd assets/ + $STD yarn install + $STD yarn build + chown -R www-data:www-data /opt/koillection/public/uploads + 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/${RELEASE}.zip" + rm -r /opt/koillection-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/kometa.sh b/ct/kometa.sh new file mode 100644 index 0000000..a77e6a7 --- /dev/null +++ b/ct/kometa.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Kometa-Team/Kometa + +APP="Kometa" +TAGS="media;streaming" +var_cpu="2" +var_ram="4096" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f "/opt/kometa/kometa.py" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/Kometa-Team/Kometa/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/kometa_version.txt)" ]] || [[ ! -f /opt/kometa_version.txt ]]; then + msg_info "Updating $APP" + msg_info "Stopping $APP" + systemctl stop kometa + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + cd /tmp + temp_file=$(mktemp) + RELEASE=$(curl -fsSL https://api.github.com/repos/Kometa-Team/Kometa/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +curl -fsSL "https://github.com/Kometa-Team/Kometa/archive/refs/tags/v${RELEASE}.tar.gz" -o ""$temp_file"" + tar -xzf "$temp_file" + cp /opt/kometa/config/config.yml /opt + rm -rf /opt/kometa + mv Kometa-${RELEASE} /opt/kometa + cd /opt/kometa + rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED + $STD pip install -r requirements.txt --ignore-installed + mkdir -p config/assets + cp /opt/config.yml config/config.yml + echo "${RELEASE}" >/opt/kometa_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Starting $APP" + systemctl start kometa + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -f $temp_file + msg_ok "Cleanup Completed" + + msg_ok "Update Successful" + 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 the LXC at following IP address:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}${IP}${CL}" \ No newline at end of file diff --git a/ct/komga.sh b/ct/komga.sh new file mode 100644 index 0000000..79a1662 --- /dev/null +++ b/ct/komga.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: madelyn (DysfunctionalProgramming) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://komga.org/ + +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" + +header_info "$APP" +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 -fsSL 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}" + curl -fsSL "https://github.com/gotson/komga/releases/download/${RELEASE}/komga-${RELEASE}.jar" -o $(basename "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 0000000..2f6e8e3 --- /dev/null +++ b/ct/komodo.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://komo.do + +APP="Komodo" +var_tags="docker" +var_cpu="2" +var_ram="2048" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 /opt/komodo/*.compose.yaml; do + if [[ "$file" != "compose.env" ]]; then + COMPOSE_FILE="${file#/opt/komodo/}" + 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 "/opt/komodo/$COMPOSE_FILE" "/opt/komodo/$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}" + if ! curl -fsSL "$GITHUB_URL" -o "/opt/komodo/${COMPOSE_FILE}"; then + msg_error "Failed to download ${COMPOSE_FILE} from GitHub!" + mv "/opt/komodo/${BACKUP_FILE}" "/opt/komodo/${COMPOSE_FILE}" + exit 1 + fi + + $STD docker compose -p komodo -f "/opt/komodo/$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d + 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 new file mode 100644 index 0000000..4de0510 --- /dev/null +++ b/ct/kubo.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: ulmentflam +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/ipfs/kubo + +APP="Kubo" +var_tags="sharing" +var_cpu="2" +var_ram="4096" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /usr/local/kubo ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://github.com/ipfs/kubo/releases/latest | 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" + $STD apt-get update + $STD apt-get -y upgrade + curl -fsSL "https://github.com/ipfs/kubo/releases/download/${RELEASE}/kubo_${RELEASE}_linux-amd64.tar.gz" -o $(basename "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 +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}:5001/webui${CL}" diff --git a/ct/lazylibrarian.sh b/ct/lazylibrarian.sh new file mode 100644 index 0000000..7214740 --- /dev/null +++ b/ct/lazylibrarian.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck | Co-Author: MountyMapleSyrup (MountyMapleSyrup) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://gitlab.com/LazyLibrarian/LazyLibrarian + +APP="LazyLibrarian" +var_tags="eBook" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD git -C /opt/LazyLibrarian pull origin master + msg_ok "Updated $APP LXC" + + msg_info "Starting LazyLibrarian" + systemctl start lazylibrarian + msg_ok "Started LazyLibrarian" + + 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}:5299${CL}" \ No newline at end of file diff --git a/ct/lidarr.sh b/ct/lidarr.sh new file mode 100644 index 0000000..9907f4f --- /dev/null +++ b/ct/lidarr.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://lidarr.audio/ + +APP="Lidarr" +var_tags="arr;torrent;usenet" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + temp_file="$(mktemp)" + rm -rf /opt/Lidarr + RELEASE=$(curl -fsSL https://api.github.com/repos/Lidarr/Lidarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + curl -fsSL "https://github.com/Lidarr/Lidarr/releases/download/v${RELEASE}/Lidarr.master.${RELEASE}.linux-core-x64.tar.gz" -o "$temp_file" + $STD tar -xvzf "$temp_file" + mv Lidarr /opt + chmod 775 /opt/Lidarr + msg_ok "Updated $APP LXC" + + msg_info "Cleaning up" + rm -rf "$temp_file" + msg_ok "Cleaned up" + 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}:8686${CL}" diff --git a/ct/linkwarden.sh b/ct/linkwarden.sh new file mode 100644 index 0000000..7850bec --- /dev/null +++ b/ct/linkwarden.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://linkwarden.app/ + +APP="Linkwarden" +var_tags="bookmark" +var_cpu="2" +var_ram="2048" +var_disk="12" +var_os="ubuntu" +var_version="22.04" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/linkwarden ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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 Rust" + $STD apt-get install -y build-essential + $STD curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + source $HOME/.cargo/env + echo 'export PATH=/usr/local/cargo/bin:$PATH' >>/etc/profile + source /etc/profile + $STD cargo install monolith + msg_ok "Updated Rust" + + msg_info "Updating ${APP} to ${RELEASE}" + cd /opt + mv /opt/linkwarden/.env /opt/.env + rm -rf /opt/linkwarden + RELEASE=$(curl -fsSL https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + curl -fsSL "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip") + unzip -q ${RELEASE}.zip + mv linkwarden-${RELEASE:1} /opt/linkwarden + cd /opt/linkwarden + $STD yarn + $STD npx playwright install-deps + $STD yarn playwright install + cp /opt/.env /opt/linkwarden/.env + $STD yarn build + $STD 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_info "Cleaning up" + rm -rf /opt/${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}:3000${CL}" diff --git a/ct/listmonk.sh b/ct/listmonk.sh new file mode 100644 index 0000000..2e6589a --- /dev/null +++ b/ct/listmonk.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://listmonk.app/ + +APP="listmonk" +var_tags="newsletter" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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/ + curl -fsSL "https://github.com/knadh/listmonk/releases/download/v${RELEASE}/listmonk_${RELEASE}_linux_amd64.tar.gz" -o $(basename "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 + $STD /opt/listmonk/listmonk --upgrade --yes --config /opt/listmonk/config.toml + 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}" diff --git a/ct/lldap.sh b/ct/lldap.sh new file mode 100644 index 0000000..8bc8596 --- /dev/null +++ b/ct/lldap.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: remz1337 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/lldap/lldap + +APP="lldap" +var_tags="ldap" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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 + +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 0000000..d00c246 --- /dev/null +++ b/ct/lubelogger.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kristocopani +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://lubelogger.com/ + +APP="LubeLogger" +var_tags="vehicle;car" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/hargata/lubelog/releases/download/v${RELEASE}/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip" -o $(basename "https://github.com/hargata/lubelog/releases/download/v${RELEASE}/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip") + mkdir -p /tmp/lubeloggerData/data + cp /opt/lubelogger/appsettings.json /tmp/lubeloggerData/appsettings.json + cp -r /opt/lubelogger/data/ /tmp/lubeloggerData/ + + # Lubelogger has moved multiples folders to the 'data' folder, and we need to move them before the update to keep the user data + # Github Discussion: https://github.com/hargata/lubelog/discussions/787 + [[ -e /opt/lubelogger/config ]] && cp -r /opt/lubelogger/config /tmp/lubeloggerData/data/ + [[ -e /opt/lubelogger/wwwroot/translations ]] && cp -r /opt/lubelogger/wwwroot/translations /tmp/lubeloggerData/data/ + [[ -e /opt/lubelogger/wwwroot/documents ]] && cp -r /opt/lubelogger/wwwroot/documents /tmp/lubeloggerData/data/ + [[ -e /opt/lubelogger/wwwroot/images ]] && cp -r /opt/lubelogger/wwwroot/images /tmp/lubeloggerData/data/ + [[ -e /opt/lubelogger/wwwroot/temp ]] && cp -r /opt/lubelogger/wwwroot/temp /tmp/lubeloggerData/data/ + [[ -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 new file mode 100644 index 0000000..9c92c23 --- /dev/null +++ b/ct/mafl.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://mafl.hywax.space/ + +APP="Mafl" +var_tags="dashboard" +var_cpu="2" +var_ram="2048" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/mafl ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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 + curl -fsSL "https://github.com/hywax/mafl/archive/refs/tags/v${RELEASE}.tar.gz" -o $(basename "https://github.com/hywax/mafl/archive/refs/tags/v${RELEASE}.tar.gz") + tar -xzf v${RELEASE}.tar.gz + cp -r mafl-${RELEASE}/* /opt/mafl/ + rm -rf mafl-${RELEASE} + cd /opt/mafl + yarn install + yarn build + systemctl start mafl + msg_ok "Updated Mafl to v${RELEASE}" + 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/magicmirror.sh b/ct/magicmirror.sh new file mode 100644 index 0000000..109962c --- /dev/null +++ b/ct/magicmirror.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://magicmirror.builders/ + +APP="MagicMirror" +var_tags="smarthome" +var_cpu="1" +var_ram="512" +var_disk="3" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/magicmirror ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/MagicMirrorOrg/MagicMirror/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt; fi + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping Service" + systemctl stop magicmirror + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + $STD apt-get update + $STD apt-get upgrade -y + rm -rf /opt/magicmirror-backup + mkdir /opt/magicmirror-backup + cp /opt/magicmirror/config/config.js /opt/magicmirror-backup + if [[ -f /opt/magicmirror/css/custom.css ]]; then + cp /opt/magicmirror/css/custom.css /opt/magicmirror-backup + fi + cp -r /opt/magicmirror/modules /opt/magicmirror-backup + temp_file=$(mktemp) +curl -fsSL "https://github.com/MagicMirrorOrg/MagicMirror/archive/refs/tags/v${RELEASE}.tar.gz" -o ""$temp_file"" + tar -xzf "$temp_file" + rm -rf /opt/magicmirror + mv MagicMirror-${RELEASE} /opt/magicmirror + cd /opt/magicmirror + $STD npm run install-mm + cp /opt/magicmirror-backup/config.js /opt/magicmirror/config/ + if [[ -f /opt/magicmirror-backup/custom.css ]]; then + cp /opt/magicmirror-backup/custom.css /opt/magicmirror/css/ + fi + echo "${RELEASE}" >"/opt/${APP}_version.txt" + msg_ok "Updated ${APP} to v${RELEASE}" + + msg_info "Starting Service" + systemctl start magicmirror + msg_ok "Started Service" + + msg_info "Cleaning up" + rm -f $temp_file + 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/mariadb.sh b/ct/mariadb.sh new file mode 100644 index 0000000..e13b93a --- /dev/null +++ b/ct/mariadb.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://mariadb.org/ + +APP="MariaDB" +var_tags="database" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:3306${CL}" \ No newline at end of file diff --git a/ct/matterbridge.sh b/ct/matterbridge.sh new file mode 100644 index 0000000..ebb47ee --- /dev/null +++ b/ct/matterbridge.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Luligu/matterbridge + +APP="Matterbridge" +var_tags="matter;smarthome" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +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}:8283${CL}" \ No newline at end of file diff --git a/ct/mattermost.sh b/ct/mattermost.sh new file mode 100644 index 0000000..8ca535d --- /dev/null +++ b/ct/mattermost.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Kaedon Cleland-Host (dracentis) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://mattermost.com/ + +APP="Mattermost" +var_tags="collaboration" +var_cpu="1" +var_ram="2048" +var_disk="8" +var_os="ubuntu" +var_version="24.04" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/apt/sources.list.d/mattermost.list ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8065${CL}" \ No newline at end of file diff --git a/ct/mediamtx.sh b/ct/mediamtx.sh new file mode 100644 index 0000000..96a854a --- /dev/null +++ b/ct/mediamtx.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/bluenviron/mediamtx + +APP="MediaMTX" +var_tags="media" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/mediamtx/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${APP}." + exit +} + +start +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 new file mode 100644 index 0000000..57da15c --- /dev/null +++ b/ct/medusa.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/pymedusa/Medusa.git + +APP="Medusa" +var_tags="media" +var_cpu="2" +var_ram="1024" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +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}:8081${CL}" \ No newline at end of file diff --git a/ct/meilisearch.sh b/ct/meilisearch.sh new file mode 100644 index 0000000..3cc5b2c --- /dev/null +++ b/ct/meilisearch.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.meilisearch.com/ + +APP="Meilisearch" +var_tags="${var_tags:-full-text-search}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-4096}" +var_disk="${var_disk:-7}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /opt/Meilisearch_version.txt ]]; then + msg_error "No Meilisearch Installation Found!" + exit + fi + UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Meilisearch Update" --radiolist --cancel-button Exit-Script "Spacebar = Select" 10 58 2 \ + "1" "Update Meilisearch" ON \ + "2" "Update Meilisearch-UI" OFF \ + 3>&1 1>&2 2>&3) + + if [ "$UPD" == "1" ]; then + msg_info "Stopping Meilisearch" + systemctl stop meilisearch + msg_ok "Stopped Meilisearch" + + msg_info "Updating Meilisearch" + tmp_file=$(mktemp) + RELEASE=$(curl -s https://api.github.com/repos/meilisearch/meilisearch/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + curl -fsSL https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch.deb -o $tmp_file + $STD dpkg -i $tmp_file + echo "$RELEASE" >/opt/meilisearch_version.txt + msg_ok "Updated Meilisearch" + + msg_info "Starting Meilisearch" + systemctl start meilisearch + msg_ok "Started Meilisearch" + exit + fi + + if [ "$UPD" == "2" ]; then + if [[ ! -f /opt/Meilisearch-ui_version.txt ]]; then + msg_error "No Meilisearch-UI Installation Found!" + exit + fi + msg_info "Stopping Meilisearch-UI" + systemctl stop meilisearch-ui + msg_ok "Stopped Meilisearch-UI" + + msg_info "Updating Meilisearch-UI" + tmp_file=$(mktemp) + tmp_dir=$(mktemp -d) + RELEASE_UI=$(curl -s https://api.github.com/repos/riccox/meilisearch-ui/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + cp /opt/meilisearch-ui/.env.local /tmp/.env.local.bak + rm -rf /opt/meilisearch-ui + mkdir -p /opt/meilisearch-ui + curl -fsSL "https://github.com/riccox/meilisearch-ui/archive/refs/tags/${RELEASE_UI}.zip" -o $tmp_file + unzip -q "$tmp_file" -d "$tmp_dir" + mv "$tmp_dir"/*/* /opt/meilisearch-ui/ + cd /opt/meilisearch-ui + sed -i 's|const hash = execSync("git rev-parse HEAD").toString().trim();|const hash = "unknown";|' /opt/meilisearch-ui/vite.config.ts + mv /tmp/.env.local.bak /opt/meilisearch-ui/.env.local + $STD pnpm install + echo "$RELEASE_UI" >/opt/meilisearch-ui_version.txt + msg_ok "Updated Meilisearch-UI" + + msg_info "Starting Meilisearch-UI" + systemctl start meilisearch-ui + msg_ok "Started Meilisearch-UI" + exit + 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}meilisearch: http://${IP}:7700$ | meilisearch-ui: http://${IP}:24900${CL}" diff --git a/ct/memos.sh b/ct/memos.sh new file mode 100644 index 0000000..2ce3f46 --- /dev/null +++ b/ct/memos.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.usememos.com/ + +APP="Memos" +var_tags="notes" +var_cpu="2" +var_ram="3072" +var_disk="7" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + export NODE_OPTIONS="--max-old-space-size=2048" + cd /opt/memos/web + $STD pnpm i --frozen-lockfile + $STD pnpm build + 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/ + $STD go build -o /opt/memos/memos -tags=embed bin/memos/main.go + systemctl start memos + msg_ok "Updated $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}:9030${CL}" \ No newline at end of file diff --git a/ct/meshcentral.sh b/ct/meshcentral.sh new file mode 100644 index 0000000..f1b95cc --- /dev/null +++ b/ct/meshcentral.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://meshcentral.com/ + +APP="MeshCentral" +var_tags="remote-management" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}${CL}" \ No newline at end of file diff --git a/ct/metube.sh b/ct/metube.sh new file mode 100644 index 0000000..048fc93 --- /dev/null +++ b/ct/metube.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/alexta69/metube + +APP="MeTube" +var_tags="media;youtube" +var_cpu="1" +var_ram="1024" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + $STD git clone https://github.com/alexta69/metube /opt/metube + cd /opt/metube/ui + $STD npm install + $STD node_modules/.bin/ng build + cd /opt/metube + cp /opt/metube_bak/.env /opt/metube/ + $STD pip3 install pipenv + $STD pipenv install + + 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 +} + +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}:8081${CL}" \ No newline at end of file diff --git a/ct/minio.sh b/ct/minio.sh new file mode 100644 index 0000000..08a5fbe --- /dev/null +++ b/ct/minio.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/minio/minio + +APP="MinIO" +var_tags="object-storage" +var_cpu="1" +var_ram="1024" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /usr/local/bin/minio ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}') + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping ${APP}" + systemctl stop minio + msg_ok "${APP} Stopped" + + msg_info "Updating ${APP} to ${RELEASE}" + mv /usr/local/bin/minio /usr/local/bin/minio_bak + curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/minio" -o $(basename "https://dl.min.io/server/minio/release/linux-amd64/minio") + mv minio /usr/local/bin/ + chmod +x /usr/local/bin/minio + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting ${APP}" + systemctl start minio + msg_ok "Started ${APP}" + + msg_info "Cleaning up" + rm -f /usr/local/bin/minio_bak + 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}:9000${CL}" diff --git a/ct/mongodb.sh b/ct/mongodb.sh new file mode 100644 index 0000000..e6080cf --- /dev/null +++ b/ct/mongodb.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.mongodb.com/de-de + +APP="MongoDB" +var_tags="database" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/monica.sh b/ct/monica.sh new file mode 100644 index 0000000..17d8616 --- /dev/null +++ b/ct/monica.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.monicahq.com/ + +APP="Monica" +var_tags="network" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/monica ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/monicahq/monica/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/monica/ /opt/monica-backup + curl -fsSL "https://github.com/monicahq/monica/releases/download/v${RELEASE}/monica-v${RELEASE}.tar.bz2" -o $(basename "https://github.com/monicahq/monica/releases/download/v${RELEASE}/monica-v${RELEASE}.tar.bz2") + tar -xjf "monica-v${RELEASE}.tar.bz2" + mv "/opt/monica-v${RELEASE}" /opt/monica + cd /opt/monica/ + cp -r /opt/monica-backup/.env /opt/monica + cp -r /opt/monica-backup/storage/* /opt/monica/storage/ + $STD composer install --no-interaction --no-dev + $STD yarn install + $STD yarn run production + $STD php artisan monica:update --force + chown -R www-data:www-data /opt/monica + chmod -R 775 /opt/monica/storage + 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/monica-v${RELEASE}.tar.bz2" + rm -r /opt/monica-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/motioneye.sh b/ct/motioneye.sh new file mode 100644 index 0000000..9d6d67e --- /dev/null +++ b/ct/motioneye.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/motioneye-project/motioneye + +APP="Motioneye" +var_tags="nvr" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD pip install motioneye --upgrade + 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}:8765${CL}" \ No newline at end of file diff --git a/ct/mqtt.sh b/ct/mqtt.sh new file mode 100644 index 0000000..43077c8 --- /dev/null +++ b/ct/mqtt.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://mosquitto.org/ + +APP="MQTT" +var_tags="mqtt" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:1883${CL}" \ No newline at end of file diff --git a/ct/mylar3.sh b/ct/mylar3.sh new file mode 100644 index 0000000..17801f4 --- /dev/null +++ b/ct/mylar3.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: davalanche +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/mylar3/mylar3 + +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" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + if [[ ! -d /opt/mylar3 ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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/.* +curl -fsSL "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 new file mode 100644 index 0000000..8a7487c --- /dev/null +++ b/ct/myspeed.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://myspeed.dev/ + +APP="MySpeed" +var_tags="tracking" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/myspeed ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://github.com/gnmyt/myspeed/releases/latest | 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 "Updating ${APP} to ${RELEASE}" + cd /opt + rm -rf myspeed_bak + mv myspeed myspeed_bak + curl -fsSL "https://github.com/gnmyt/myspeed/releases/download/v$RELEASE/MySpeed-$RELEASE.zip" -o $(basename "https://github.com/gnmyt/myspeed/releases/download/v$RELEASE/MySpeed-$RELEASE.zip") + unzip -q MySpeed-$RELEASE.zip -d myspeed + cd myspeed + $STD npm install + 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 "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 +} + +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}:5216${CL}" diff --git a/ct/mysql.sh b/ct/mysql.sh new file mode 100644 index 0000000..99cec08 --- /dev/null +++ b/ct/mysql.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck | Co-Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.mysql.com/ + +APP="MySQL" +var_tags="database" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:3306${CL}" \ No newline at end of file diff --git a/ct/n8n.sh b/ct/n8n.sh new file mode 100644 index 0000000..671e0c3 --- /dev/null +++ b/ct/n8n.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://n8n.io/ + +APP="n8n" +var_tags="automation" +var_cpu="2" +var_ram="2048" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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..." + $STD apt-get install -y npm + echo "Installed NPM..." + fi + fi + msg_info "Updating ${APP} LXC" + $STD npm update -g n8n + systemctl restart n8n + 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}:5678${CL}" \ No newline at end of file diff --git a/ct/navidrome.sh b/ct/navidrome.sh new file mode 100644 index 0000000..98f868f --- /dev/null +++ b/ct/navidrome.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.navidrome.org/ + +APP="Navidrome" +var_tags="music" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/navidrome ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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}" + cd /opt +curl -fsSL "https://github.com/navidrome/navidrome/releases/download/v${RELEASE}/navidrome_${RELEASE}_linux_amd64.tar.gz" -o "Navidrome.tar.gz" + $STD tar -xvzf Navidrome.tar.gz -C /opt/navidrome/ + chmod +x /opt/navidrome/navidrome + msg_ok "Updated ${APP}" + rm -rf /opt/Navidrome.tar.gz + + msg_info "Starting ${APP}" + systemctl start navidrome.service + msg_ok "Started ${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 URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4533${CL}" \ No newline at end of file diff --git a/ct/neo4j.sh b/ct/neo4j.sh new file mode 100644 index 0000000..8f933ca --- /dev/null +++ b/ct/neo4j.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck | Co-Author: havardthom +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://neo4j.com/product/neo4j-graph-database/ + +APP="Neo4j" +var_tags="database" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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}" + $STD apt-get update + $STD apt-get -y upgrade + 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}:7474${CL}" \ No newline at end of file diff --git a/ct/netbox.sh b/ct/netbox.sh new file mode 100644 index 0000000..3f9b85f --- /dev/null +++ b/ct/netbox.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://netboxlabs.com/ + +APP="NetBox" +var_tags="network" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip" -o $(basename "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 + + $STD /opt/netbox/upgrade.sh + 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}" diff --git a/ct/nextcloudpi.sh b/ct/nextcloudpi.sh new file mode 100644 index 0000000..ab778c0 --- /dev/null +++ b/ct/nextcloudpi.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.turnkeylinux.org/nextcloud + +APP="NextCloudPi" +var_tags="cloud" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}${CL}" \ No newline at end of file diff --git a/ct/nextpvr.sh b/ct/nextpvr.sh new file mode 100644 index 0000000..271ca9f --- /dev/null +++ b/ct/nextpvr.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (Canbiz) +# License: MIT +# https://github.com/tteck/Proxmox/raw/main/LICENSE +# Source: https://nextpvr.com/ + +APP="NextPVR" +var_tags="pvr" +var_cpu="1" +var_ram="1024" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated LXC packages" + + msg_info "Updating ${APP}" + cd /opt + curl -fsSL "https://nextpvr.com/nextpvr-helper.deb" -o $(basename "https://nextpvr.com/nextpvr-helper.deb") + $STD dpkg -i nextpvr-helper.deb + 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}" diff --git a/ct/nginxproxymanager.sh b/ct/nginxproxymanager.sh new file mode 100644 index 0000000..e6d1391 --- /dev/null +++ b/ct/nginxproxymanager.sh @@ -0,0 +1,158 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://nginxproxymanager.com/ + +APP="Nginx Proxy Manager" +var_tags="proxy" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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 + fi + if ! command -v pnpm &>/dev/null; then + msg_info "Installing pnpm" + #export NODE_OPTIONS=--openssl-legacy-provider + $STD npm install -g pnpm@8.15 + msg_ok "Installed pnpm" + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/NginxProxyManager/nginx-proxy-manager/releases/latest | + grep "tag_name" | + awk '{print substr($2, 3, length($2)-4) }') + msg_info "Stopping Services" + systemctl stop openresty + systemctl stop npm + msg_ok "Stopped Services" + + msg_info "Cleaning Old Files" + rm -rf /app \ + /var/www/html \ + /etc/nginx \ + /var/log/nginx \ + /var/lib/nginx \ + "$STD" /var/cache/nginx + msg_ok "Cleaned Old Files" + + msg_info "Downloading NPM v${RELEASE}" + curl -fsSL "https://codeload.github.com/NginxProxyManager/nginx-proxy-manager/tar.gz/v${RELEASE}" | tar -xz + cd nginx-proxy-manager-"${RELEASE}" || exit + msg_ok "Downloaded NPM v${RELEASE}" + + msg_info "Setting up Enviroment" + ln -sf /usr/bin/python3 /usr/bin/python + ln -sf /usr/bin/certbot /opt/certbot/bin/certbot + ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx + ln -sf /usr/local/openresty/nginx/ /etc/nginx + sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json + sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json + sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf + NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf") + for NGINX_CONF in $NGINX_CONFS; do + sed -i 's+include conf.d+include /etc/nginx/conf.d+g' "$NGINX_CONF" + done + mkdir -p /var/www/html /etc/nginx/logs + cp -r docker/rootfs/var/www/html/* /var/www/html/ + cp -r docker/rootfs/etc/nginx/* /etc/nginx/ + cp docker/rootfs/etc/letsencrypt.ini /etc/letsencrypt.ini + cp docker/rootfs/etc/logrotate.d/nginx-proxy-manager /etc/logrotate.d/nginx-proxy-manager + ln -sf /etc/nginx/nginx.conf /etc/nginx/conf/nginx.conf + rm -f /etc/nginx/conf.d/dev.conf + mkdir -p /tmp/nginx/body \ + /run/nginx \ + /data/nginx \ + /data/custom_ssl \ + /data/logs \ + /data/access \ + /data/nginx/default_host \ + /data/nginx/default_www \ + /data/nginx/proxy_host \ + /data/nginx/redirection_host \ + /data/nginx/stream \ + /data/nginx/dead_host \ + /data/nginx/temp \ + /var/lib/nginx/cache/public \ + /var/lib/nginx/cache/private \ + /var/cache/nginx/proxy_temp + chmod -R 777 /var/cache/nginx + chown root /tmp/nginx + echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" {print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf);" >/etc/nginx/conf.d/include/resolvers.conf + if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ]; then + $STD openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/O=Nginx Proxy Manager/OU=Dummy Certificate/CN=localhost" -keyout /data/nginx/dummykey.pem -out /data/nginx/dummycert.pem + fi + mkdir -p /app/global /app/frontend/images + cp -r backend/* /app + cp -r global/* /app/global + $STD python3 -m pip install --no-cache-dir certbot-dns-cloudflare + msg_ok "Setup Enviroment" + + msg_info "Building Frontend" + cd ./frontend || exit + $STD pnpm install + $STD pnpm upgrade + $STD pnpm run build + cp -r dist/* /app/frontend + cp -r app-images/* /app/frontend/images + msg_ok "Built Frontend" + + msg_info "Initializing Backend" + $STD rm -rf /app/config/default.json + if [ ! -f /app/config/production.json ]; then + cat <<'EOF' >/app/config/production.json +{ + "database": { + "engine": "knex-native", + "knex": { + "client": "sqlite3", + "connection": { + "filename": "/data/database.sqlite" + } + } + } +} +EOF + fi + cd /app || exit + $STD pnpm install + msg_ok "Initialized Backend" + + msg_info "Starting Services" + sed -i 's/user npm/user root/g; s/^pid/#pid/g' /usr/local/openresty/nginx/conf/nginx.conf + sed -i 's/su npm npm/su root root/g' /etc/logrotate.d/nginx-proxy-manager + sed -i 's/include-system-site-packages = false/include-system-site-packages = true/g' /opt/certbot/pyvenv.cfg + systemctl enable -q --now openresty + systemctl enable -q --now npm + msg_ok "Started Services" + + msg_info "Cleaning up" + rm -rf ~/nginx-proxy-manager-* + 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}:81${CL}" diff --git a/ct/nocodb.sh b/ct/nocodb.sh new file mode 100644 index 0000000..a1fbed9 --- /dev/null +++ b/ct/nocodb.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.nocodb.com/ + +APP="NocoDB" +var_tags="noCode" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSL http://get.nocodb.com/linux-x64 -o nocodb -L + chmod +x nocodb + systemctl start nocodb.service + 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}:8080/dashboard${CL}" \ No newline at end of file diff --git a/ct/node-red.sh b/ct/node-red.sh new file mode 100644 index 0000000..918ddd5 --- /dev/null +++ b/ct/node-red.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://nodered.org/ + +APP="Node-Red" +var_tags="automation" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + 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) + 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" + $STD apt-get install -y npm + msg_ok "Installed NPM" + fi + fi + msg_info "Stopping ${APP}" + systemctl stop nodered + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP}" + $STD npm install -g --unsafe-perm node-red + 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 + $STD npm install @node-red-contrib-themes/theme-collection + sed -i "{s/theme: ".*"/theme: '${THEME}',/g}" /root/.node-red/settings.js + systemctl restart nodered + msg_ok "Installed ${THEME} Theme" + exit + 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}:1880${CL}" \ No newline at end of file diff --git a/ct/nodebb.sh b/ct/nodebb.sh new file mode 100644 index 0000000..48cbec4 --- /dev/null +++ b/ct/nodebb.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://nodebb.org/ + +APP="NodeBB" +var_tags="forum" +var_disk="10" +var_cpu="4" +var_ram="2048" +var_os="ubuntu" +var_version="24.04" +var_unprivileged="1" + +# App Output & Base Settings +header_info "$APP" + +# Core +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/nodebb ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/NodeBB/NodeBB/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 nodebb + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt/nodebb + $STD ./nodebb upgrade + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to v${RELEASE}" + + msg_info "Starting ${APP}" + systemctl start nodebb + msg_ok "Started ${APP}" + 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}:4567${CL}" \ No newline at end of file diff --git a/ct/notifiarr.sh b/ct/notifiarr.sh new file mode 100644 index 0000000..b632d8e --- /dev/null +++ b/ct/notifiarr.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://notifiarr.com/ + +APP="Notifiarr" +var_tags="arr" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated $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}:5454${CL}" \ No newline at end of file diff --git a/ct/npmplus.sh b/ct/npmplus.sh new file mode 100644 index 0000000..2da9a49 --- /dev/null +++ b/ct/npmplus.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/ZoeyVid/NPMplus + +APP="NPMplus" +var_tags="proxy;nginx" +var_cpu="1" +var_ram="512" +var_disk="3" +var_os="alpine" +var_version="3.21" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE MODE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 14 60 2 \ + "1" "Check for Alpine Updates" OFF \ + "2" "Update NPMplus Docker Container" ON \ + 3>&1 1>&2 2>&3) + + header_info "$APP" + + case "$UPD" in + "1") + msg_info "Updating Alpine OS" + apk update && apk upgrade + msg_ok "System updated" + exit + ;; + "2") + msg_info "Updating NPMplus Container" + cd /opt || exit 1 + msg_info "Pulling latest container image" + $STD docker compose pull + msg_info "Recreating container" + $STD docker compose up -d + msg_ok "NPMplus container updated" + exit + ;; + esac + exit 0 +} + + +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}:81${CL}" \ No newline at end of file diff --git a/ct/ntfy.sh b/ct/ntfy.sh new file mode 100644 index 0000000..f290906 --- /dev/null +++ b/ct/ntfy.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://ntfy.sh/ + +APP="ntfy" +var_tags="notification" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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/nxwitness.sh b/ct/nxwitness.sh new file mode 100644 index 0000000..9477bad --- /dev/null +++ b/ct/nxwitness.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://nxvms.com/download/releases/linux + +APP="NxWitness" +var_tags="nvr" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="ubuntu" +var_version="24.04" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/networkoptix-mediaserver.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + BASE_URL="https://updates.networkoptix.com/default/index.html" + RELEASE=$(curl -fsSL "$BASE_URL" | grep -oP '(?<=)[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(?=)' | head -n 1) + DETAIL_PAGE=$(curl -fsSL "$BASE_URL#note_$RELEASE") + DOWNLOAD_URL=$(echo "$DETAIL_PAGE" | grep -oP "https://updates.networkoptix.com/default/$RELEASE/linux/nxwitness-server-[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-linux_x64\.deb" | head -n 1) + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping ${APP}" + systemctl stop networkoptix-root-tool networkoptix-mediaserver + msg_ok "${APP} Stopped" + + msg_info "Updating ${APP} to ${RELEASE}" + cd /tmp +curl -fsSL "$DOWNLOAD_URL" -o ""nxwitness-server-$RELEASE-linux_x64.deb"" + export DEBIAN_FRONTEND=noninteractive + export DEBCONF_NOWARNINGS=yes + $STD dpkg -i nxwitness-server-$RELEASE-linux_x64.deb + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting ${APP}" + systemctl start networkoptix-root-tool networkoptix-mediaserver + msg_ok "Started ${APP}" + + msg_info "Cleaning up" + rm -f /tmp/nxwitness-server-$RELEASE-linux_x64.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}:7001/${CL}" \ No newline at end of file diff --git a/ct/nzbget.sh b/ct/nzbget.sh new file mode 100644 index 0000000..c49e510 --- /dev/null +++ b/ct/nzbget.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck | Co-Author: havardthom +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://nzbget.com/ + +APP="NZBGet" +var_tags="usenet;downloader" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:6789${CL}" \ No newline at end of file diff --git a/ct/octoprint.sh b/ct/octoprint.sh new file mode 100644 index 0000000..3af677c --- /dev/null +++ b/ct/octoprint.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://octoprint.org/ + +APP="OctoPrint" +var_tags="3d-printing" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + $STD pip3 install octoprint --upgrade + msg_ok "Updated OctoPrint" + + msg_info "Starting OctoPrint" + systemctl start octoprint + msg_ok "Started OctoPrint" + 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}:5000${CL}" \ No newline at end of file diff --git a/ct/ollama.sh b/ct/ollama.sh new file mode 100644 index 0000000..5c3a0a2 --- /dev/null +++ b/ct/ollama.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck | Co-Author: havardthom +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://ollama.com/ + +APP="Ollama" +var_tags="ai" +var_cpu="4" +var_ram="4096" +var_disk="24" +var_os="ubuntu" +var_version="22.04" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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}" + $STD apt-get update + $STD apt-get -y upgrade + 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}:14434${CL}" \ No newline at end of file diff --git a/ct/omada.sh b/ct/omada.sh new file mode 100644 index 0000000..2d96be2 --- /dev/null +++ b/ct/omada.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.tp-link.com/us/support/download/omada-software-controller/ + +APP="Omada" +var_tags="tp-link;controller" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/tplink ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + msg_info "Updating MongoDB" + MONGODB_VERSION="7.0" + if ! lscpu | grep -q 'avx'; then + MONGODB_VERSION="4.4" + msg_error "No AVX detected: TP-Link Canceled Support for Old MongoDB for Debian 12\n https://www.tp-link.com/baltic/support/faq/4160/" + exit 1 + fi + + curl -fsSL "https://www.mongodb.org/static/pgp/server-${MONGODB_VERSION}.asc" | gpg --dearmor >/usr/share/keyrings/mongodb-server-${MONGODB_VERSION}.gpg + echo "deb [signed-by=/usr/share/keyrings/mongodb-server-${MONGODB_VERSION}.gpg] http://repo.mongodb.org/apt/debian $(grep '^VERSION_CODENAME=' /etc/os-release | cut -d'=' -f2)/mongodb-org/${MONGODB_VERSION} main" >/etc/apt/sources.list.d/mongodb-org-${MONGODB_VERSION}.list + $STD apt-get update + $STD apt-get install -y --only-upgrade mongodb-org + msg_ok "Updated MongoDB to $MONGODB_VERSION" + + msg_info "Checking if right Azul Zulu Java is installed" + java_version=$(java -version 2>&1 | awk -F[\"_] '/version/ {print $2}') + if [[ "$java_version" =~ ^1\.8\.* ]]; then + $STD apt-get remove --purge -y zulu8-jdk + $STD apt-get -y install zulu21-jre-headless + msg_ok "Updated Azul Zulu Java to 21" + else + msg_ok "Azul Zulu Java 21 already installed" + fi + + msg_info "Updating Omada Controller" + latest_url=$(curl -fsSL "https://support.omadanetworks.com/en/download/software/omada-controller/" | 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 + + curl -fsSL "${latest_url}" -O + export DEBIAN_FRONTEND=noninteractive + $STD dpkg -i ${latest_version} + rm -rf ${latest_version} + msg_ok "Updated Omada Controller" +} + +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}:8043${CL}" diff --git a/ct/ombi.sh b/ct/ombi.sh new file mode 100644 index 0000000..210e06a --- /dev/null +++ b/ct/ombi.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://ombi.io/ + +APP="Ombi" +var_tags="media" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/ombi ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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}" + curl -fsSL "https://github.com/Ombi-app/Ombi/releases/download/${RELEASE}/linux-x64.tar.gz" -o $(basename "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 +} + +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/omv.sh b/ct/omv.sh new file mode 100644 index 0000000..e64fbfc --- /dev/null +++ b/ct/omv.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.openmediavault.org/ + +APP="OMV" +var_tags="media" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}${CL}" \ No newline at end of file diff --git a/ct/onedev.sh b/ct/onedev.sh new file mode 100644 index 0000000..d34bfca --- /dev/null +++ b/ct/onedev.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kristocopani +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://onedev.io/ + +APP="OneDev" +var_tags="git" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz" -o $(basename "https://code.onedev.io/onedev/server/~site/onedev-latest.tar.gz") + tar -xzf onedev-latest.tar.gz + $STD /opt/onedev-latest/bin/upgrade.sh /opt/onedev + 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}" diff --git a/ct/opengist.sh b/ct/opengist.sh new file mode 100644 index 0000000..d1b57c3 --- /dev/null +++ b/ct/opengist.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Jonathan (jd-apprentice) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://opengist.io/ + +APP="Opengist" +var_tags="development" +var_cpu="1" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/opengist ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/thomiceli/opengist/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 opengist.service + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + $STD apt-get update + $STD apt-get -y upgrade + cd /opt + mv /opt/opengist /opt/opengist-backup + curl -fsSL "https://github.com/thomiceli/opengist/releases/download/v${RELEASE}/opengist${RELEASE}-linux-amd64.tar.gz" -o $(basename "https://github.com/thomiceli/opengist/releases/download/v${RELEASE}/opengist${RELEASE}-linux-amd64.tar.gz") + tar -xzf opengist${RELEASE}-linux-amd64.tar.gz + mv /opt/opengist-backup/config.yml /opt/opengist/config.yml + chmod +x /opt/opengist/opengist + echo "${RELEASE}" >"/opt/${APP}_version.txt" + msg_ok "Updated ${APP} LXC" + + msg_info "Starting Service" + systemctl start opengist.service + msg_ok "Started Service" + + msg_info "Cleaning up" + rm -rf /opt/opengist${RELEASE}-linux-amd64.tar.gz + rm -rf /opt/opengist-backup + $STD apt-get -y autoremove + $STD apt-get -y autoclean + 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}:6157${CL}" diff --git a/ct/openhab.sh b/ct/openhab.sh new file mode 100644 index 0000000..56567ad --- /dev/null +++ b/ct/openhab.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.openhab.org/ + +APP="openHAB" +var_tags="automation" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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 one of the following URLs:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8443${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 new file mode 100644 index 0000000..4b8739d --- /dev/null +++ b/ct/openobserve.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://openobserve.ai/ + +APP="OpenObserve" +var_tags="monitoring" +var_cpu="1" +var_ram="512" +var_disk="3" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSL 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 +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}:5080${CL}" diff --git a/ct/openwebui.sh b/ct/openwebui.sh new file mode 100644 index 0000000..63cd239 --- /dev/null +++ b/ct/openwebui.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: havardthom +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://openwebui.com/ + +APP="Open WebUI" +var_tags="ai;interface" +var_cpu="4" +var_ram="4096" +var_disk="16" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/open-webui ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if [ -x "/usr/bin/ollama" ]; then + msg_info "Updating Ollama" + OLLAMA_VERSION=$(ollama -v | awk '{print $NF}') + RELEASE=$(curl -s https://api.github.com/repos/ollama/ollama/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') + if [ "$OLLAMA_VERSION" != "$RELEASE" ]; then + curl -fsSLO https://ollama.com/download/ollama-linux-amd64.tgz + tar -C /usr -xzf ollama-linux-amd64.tgz + rm -rf ollama-linux-amd64.tgz + msg_ok "Ollama updated to version $RELEASE" + else + msg_ok "Ollama is already up to date." + fi + fi + + msg_info "Updating ${APP} (Patience)" + cd /opt/open-webui + mkdir -p /opt/open-webui-backup + cp -rf /opt/open-webui/backend/data /opt/open-webui-backup + git add -A + $STD git stash + $STD git reset --hard + 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 + $STD npm install + export NODE_OPTIONS="--max-old-space-size=3584" + $STD npm run build + cd ./backend + $STD pip install -r requirements.txt -U + cp -rf /opt/open-webui-backup/* /opt/open-webui/backend + if git stash list | grep -q 'stash@{'; then + $STD git stash pop + fi + systemctl start open-webui.service + 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}:8080${CL}" \ No newline at end of file diff --git a/ct/openziti-tunnel.sh b/ct/openziti-tunnel.sh new file mode 100644 index 0000000..bc36cde --- /dev/null +++ b/ct/openziti-tunnel.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: emoscardini +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/openziti/ziti + +APP="openziti-tunnel" +var_tags="${var_tags:-network;openziti-tunnel}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-2}" +var_os="${var_os:-ubuntu}" +var_version="${var_version:-24.04}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/openziti ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating $APP LXC" + $STD apt-get update + $STD apt-get -y upgrade + 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} Application was assigned the following IP:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}Address: ${IP}${CL}" \ No newline at end of file diff --git a/ct/outline.sh b/ct/outline.sh new file mode 100644 index 0000000..7d4817f --- /dev/null +++ b/ct/outline.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/outline/outline + +APP="Outline" +var_tags="documentation" +var_disk="8" +var_cpu="2" +var_ram="4096" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/outline ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/outline/outline/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 outline + msg_ok "Services Stopped" + + msg_info "Updating ${APP} to ${RELEASE}" + temp_file=$(mktemp) + rm -rf /opt/outline/node_modules +curl -fsSL "https://github.com/outline/outline/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar zxf $temp_file + cp -rf outline-${RELEASE}/* /opt/outline + cd /opt/outline + export NODE_OPTIONS="--max-old-space-size=3584" + $STD yarn install --frozen-lockfile + $STD yarn build + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting Services" + systemctl start outline + msg_ok "Started Services" + + msg_info "Cleaning Up" + rm -rf $temp_file + rm -rf $HOME/outline-${RELEASE} + 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/overseerr.sh b/ct/overseerr.sh new file mode 100644 index 0000000..4938c19 --- /dev/null +++ b/ct/overseerr.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://overseerr.dev/ + +APP="Overseerr" +var_tags="media" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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) + $STD git pull + if echo "$output" | grep -q "Already up to date."; then + msg_ok " $APP is already up to date." + systemctl start overseerr + exit + fi + $STD yarn install + $STD yarn build + systemctl start overseerr + msg_ok "Updated $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}:5055${CL}" \ No newline at end of file diff --git a/ct/owncast.sh b/ct/owncast.sh new file mode 100644 index 0000000..f636081 --- /dev/null +++ b/ct/owncast.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://owncast.online/ + +APP="Owncast" +var_tags="broadcasting" +var_cpu="2" +var_ram="2048" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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/admin${CL}" \ No newline at end of file diff --git a/ct/pairdrop.sh b/ct/pairdrop.sh new file mode 100644 index 0000000..e5c7eae --- /dev/null +++ b/ct/pairdrop.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://pairdrop.net/ + +APP="PairDrop" +var_tags="sharing" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +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/paperless-ai.sh b/ct/paperless-ai.sh new file mode 100644 index 0000000..2f1ebda --- /dev/null +++ b/ct/paperless-ai.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/clusterzx/paperless-ai + +APP="Paperless-AI" +var_tags="ai;document" +var_cpu="2" +var_ram="2048" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/paperless-ai ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/clusterzx/paperless-ai/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 paperless-ai + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + cd /opt + mv /opt/paperless-ai /opt/paperless-ai_bak + curl -fsSL "https://github.com/clusterzx/paperless-ai/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/clusterzx/paperless-ai/archive/refs/tags/v${RELEASE}.zip") + unzip -q v${RELEASE}.zip + mv paperless-ai-${RELEASE} /opt/paperless-ai + mkdir -p /opt/paperless-ai/data + cp -a /opt/paperless-ai_bak/data/. /opt/paperless-ai/data/ + cd /opt/paperless-ai + $STD npm install + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start paperless-ai + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf /opt/v${RELEASE}.zip + rm -rf /opt/paperless-ai_bak + msg_ok "Cleanup Completed" + msg_ok "Update Successful" + 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/paperless-gpt.sh b/ct/paperless-gpt.sh new file mode 100644 index 0000000..7fe5928 --- /dev/null +++ b/ct/paperless-gpt.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/icereed/paperless-gpt + +APP="Paperless-GPT" +var_tags="os" +var_cpu="3" +var_ram="2048" +var_disk="7" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/paperless-gpt ]]; then + msg_error "No Paperless-GPT installation found!" + exit 1 + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/icereed/paperless-gpt/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 paperless-gpt + msg_ok "Service Stopped" + + msg_info "Updating Paperless-GPT to ${RELEASE}" + temp_file=$(mktemp) +curl -fsSL "https://github.com/icereed/paperless-gpt/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar zxf $temp_file + rm -rf /opt/paperless-gpt + mv paperless-gpt-${RELEASE} /opt/paperless-gpt + cd /opt/paperless-gpt/web-app + $STD npm install + $STD npm run build + cd /opt/paperless-gpt + go mod download + export CC=musl-gcc + CGO_ENABLED=1 go build -tags musl -o /dev/null github.com/mattn/go-sqlite3 + CGO_ENABLED=1 go build -tags musl -o paperless-gpt . + echo "${RELEASE}" >"/opt/paperless-gpt_version.txt" + msg_ok "Updated Paperless-GPT to ${RELEASE}" + + msg_info "Starting Service" + systemctl start paperless-gpt + msg_ok "Started Service" + + msg_info "Cleaning Up" + rm -f $temp_file + msg_ok "Cleanup Completed" + 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}:8080${CL}" \ No newline at end of file diff --git a/ct/paperless-ngx.sh b/ct/paperless-ngx.sh new file mode 100644 index 0000000..7566dfb --- /dev/null +++ b/ct/paperless-ngx.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://docs.paperless-ngx.com/ + +APP="Paperless-ngx" +var_tags="document;management" +var_cpu="2" +var_ram="2048" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + if [[ ! -d /opt/paperless ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + + UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \ + "1" "Update Paperless-ngx to $RELEASE" ON \ + "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 (Patience)" + cd /tmp + curl -fsSL "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz" -o $(basename "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz") + tar -xzf ghostscript-10.04.0.tar.gz + cd ghostscript-10.04.0 + $STD ./configure + $STD make + $STD sudo make install + rm -rf /tmp/ghostscript* + msg_ok "Ghostscript updated to 10.04.0" + fi + msg_info "Stopping all Paperless-ngx Services" + systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service + msg_ok "Stopped all Paperless-ngx Services" + + msg_info "Updating to ${RELEASE}" + cd ~ + curl -fsSL "https://github.com/paperless-ngx/paperless-ngx/releases/download/$RELEASE/paperless-ngx-$RELEASE.tar.xz" -o $(basename "https://github.com/paperless-ngx/paperless-ngx/releases/download/$RELEASE/paperless-ngx-$RELEASE.tar.xz") + tar -xf paperless-ngx-$RELEASE.tar.xz + cp -r /opt/paperless/paperless.conf paperless-ngx/ + cp -r paperless-ngx/* /opt/paperless/ + cd /opt/paperless + $STD pip install -r requirements.txt + cd /opt/paperless/src + $STD /usr/bin/python3 manage.py migrate + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated to ${RELEASE}" + + msg_info "Cleaning up" + cd ~ + rm paperless-ngx-$RELEASE.tar.xz + rm -rf paperless-ngx + msg_ok "Cleaned" + + msg_info "Starting all Paperless-ngx Services" + systemctl start paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service + sleep 1 + msg_ok "Started all Paperless-ngx Services" + msg_ok "Updated Successfully!\n" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit + fi + if [ "$UPD" == "2" ]; then + cat paperless.creds + exit + 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}:8000${CL}" diff --git a/ct/part-db.sh b/ct/part-db.sh new file mode 100644 index 0000000..b9d8425 --- /dev/null +++ b/ct/part-db.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://docs.part-db.de/ + +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" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/Part-DB/Part-DB-server/archive/refs/tags/v${RELEASE}.zip" -o $(basename "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 + $STD composer install --no-dev -o --no-interaction + $STD yarn install + $STD yarn build + $STD php bin/console cache:clear + $STD php bin/console doctrine:migrations:migrate -n + 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/paymenter.sh b/ct/paymenter.sh new file mode 100644 index 0000000..5fda4a9 --- /dev/null +++ b/ct/paymenter.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Nícolas Pastorello (opastorello) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.paymenter.org + +APP="Paymenter" +var_tags="hosting;ecommerce;marketplace;" +var_cpu="2" +var_ram="1024" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/paymenter ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/paymenter/paymenter/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_info "Updating ${APP} to ${RELEASE}" + echo "${RELEASE}" >/opt/${APP}_version.txt + cd /opt/paymenter + $STD php artisan p:upgrade --no-interaction + 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}:80${CL}" \ No newline at end of file diff --git a/ct/peanut.sh b/ct/peanut.sh new file mode 100644 index 0000000..567c1d0 --- /dev/null +++ b/ct/peanut.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: remz1337 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Brandawg93/PeaNUT/ + +APP="PeaNUT" +var_tags="network;ups;" +var_cpu="2" +var_ram="3072" +var_disk="7" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/peanut.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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}" + systemctl stop peanut + curl -fsSL "https://api.github.com/repos/Brandawg93/PeaNUT/tarball/${RELEASE}" -o "peanut.tar.gz" + tar -xzf peanut.tar.gz -C /opt/peanut --strip-components 1 + rm peanut.tar.gz + cd /opt/peanut + $STD pnpm i + $STD pnpm run build + cp -r .next/static .next/standalone/.next/ + mkdir -p /opt/peanut/.next/standalone/config + ln -sf /etc/peanut/settings.yml /opt/peanut/.next/standalone/config/settings.yml + systemctl start peanut + 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}:3000${CL}" diff --git a/ct/pelican-panel.sh b/ct/pelican-panel.sh new file mode 100644 index 0000000..15a3908 --- /dev/null +++ b/ct/pelican-panel.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/pelican-dev/panel + +APP="Pelican-Panel" +var_tags="Gaming" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/pelican-panel ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) + + if [[ "$CURRENT_PHP" != "8.4" ]]; then + msg_info "Migrating PHP $CURRENT_PHP to 8.4" + $STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb + $STD dpkg -i /tmp/debsuryorg-archive-keyring.deb + $STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' + $STD apt-get update + $STD apt-get remove -y php"${CURRENT_PHP//./}"* + $STD apt-get install -y \ + php8.4 \ + php8.4-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl,fpm} \ + libapache2-mod-php8.4 + + msg_ok "Migrated PHP $CURRENT_PHP to 8.4" + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/pelican-dev/panel/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" + cd /opt/pelican-panel || exit + $STD php artisan down + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + cp -r /opt/pelican-panel/.env /opt/ + rm -rf * .* + curl -fsSL "https://github.com/pelican-dev/panel/releases/download/v${RELEASE}/panel.tar.gz" -o $(basename "https://github.com/pelican-dev/panel/releases/download/v${RELEASE}/panel.tar.gz") + tar -xzf "panel.tar.gz" + mv /opt/.env /opt/pelican-panel/ + $STD composer install --no-dev --optimize-autoloader --no-interaction + $STD php artisan p:environment:setup + $STD php artisan view:clear + $STD php artisan config:clear + $STD php artisan filament:optimize + $STD php artisan migrate --seed --force + chown -R www-data:www-data /opt/pelican-panel + chmod -R 755 /opt/pelican-panel/storage /opt/pelican-panel/bootstrap/cache/ + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting Service" + $STD php artisan queue:restart + $STD php artisan up + msg_ok "Started Service" + + msg_info "Cleaning up" + rm -rf "/opt/pelican-panel/panel.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}/installer${CL}" diff --git a/ct/pelican-wings.sh b/ct/pelican-wings.sh new file mode 100644 index 0000000..35b0f46 --- /dev/null +++ b/ct/pelican-wings.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/pelican-dev/wings + +APP="Pelican-Wings" +var_tags="Gaming" +var_cpu="2" +var_ram="4096" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /usr/local/bin/wings ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/pelican-dev/wings/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 wings + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + rm /usr/local/bin/wings +curl -fsSL "https://github.com/pelican-dev/wings/releases/download/v${RELEASE}/wings_linux_amd64" -o "/usr/local/bin/wings" + chmod u+x /usr/local/bin/wings + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting Service" + systemctl start wings + msg_ok "Started Service" + 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}" \ No newline at end of file diff --git a/ct/petio.sh b/ct/petio.sh new file mode 100644 index 0000000..55539dd --- /dev/null +++ b/ct/petio.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://petio.tv/ + +APP="Petio" +var_tags="media" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="ubuntu" +var_version="20.04" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + curl -fsSL 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 +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}:7777${CL}" diff --git a/ct/pf2etools.sh b/ct/pf2etools.sh new file mode 100644 index 0000000..0fc8b11 --- /dev/null +++ b/ct/pf2etools.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: TheRealVira +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://pf2etools.com/ + +APP="Pf2eTools" +var_tags="wiki" +var_cpu="1" +var_ram="512" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/${APP}" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL 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 + msg_info "Updating System" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated System" + + msg_info "Updating ${APP}" + cd /opt + curl -fsSL "https://github.com/Pf2eToolsOrg/Pf2eTools/archive/refs/tags/${RELEASE}.zip" -o $(basename "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 + chown -R www-data: "/opt/${APP}" + chmod -R 755 "/opt/${APP}" + echo "${RELEASE}" >"/opt/${APP}_version.txt" + msg_ok "Updated ${APP}" + + msg_info "Cleaning Up" + rm -rf /opt/${RELEASE}.zip + 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 new file mode 100644 index 0000000..5cff0c1 --- /dev/null +++ b/ct/photoprism.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.photoprism.app/ + +APP="PhotoPrism" +var_tags="media;photo" +var_cpu="2" +var_ram="3072" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/photoprism ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Stopping PhotoPrism" + sudo systemctl stop photoprism + msg_ok "Stopped PhotoPrism" + + msg_info "Updating PhotoPrism" + $STD apt-get install -y libvips42 + curl -fsSL 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" + sudo systemctl start photoprism + msg_ok "Started PhotoPrism" + msg_ok "Update Successful" + 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}:2342${CL}" diff --git a/ct/phpipam.sh b/ct/phpipam.sh new file mode 100644 index 0000000..51894f8 --- /dev/null +++ b/ct/phpipam.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://phpipam.net/ + +APP="phpIPAM" +var_tags="network" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/phpipam ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/phpipam/phpipam/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/phpipam/ /opt/phpipam-backup + curl -fsSL "https://github.com/phpipam/phpipam/releases/download/v${RELEASE}/phpipam-v${RELEASE}.zip" -o $(basename "https://github.com/phpipam/phpipam/releases/download/v${RELEASE}/phpipam-v${RELEASE}.zip") + unzip -q "phpipam-v${RELEASE}.zip" + cp /opt/phpipam-backup/config.php /opt/phpipam + 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/phpipam-v${RELEASE}.zip" + rm -r /opt/phpipam-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/pialert.sh b/ct/pialert.sh new file mode 100644 index 0000000..81cd4ed --- /dev/null +++ b/ct/pialert.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/leiweibau/Pi.Alert/ + +APP="PiAlert" +var_tags="network" +var_cpu="1" +var_ram="512" +var_disk="3" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/pialert ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + bash -c "$(curl -fsSL https://github.com/leiweibau/Pi.Alert/raw/main/install/pialert_update.sh)" -s --lxc + msg_ok "Updated $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}/pialert${CL}" diff --git a/ct/pihole.sh b/ct/pihole.sh new file mode 100644 index 0000000..ce99bd3 --- /dev/null +++ b/ct/pihole.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://pi-hole.net/ + +APP="Pihole" +var_tags="adblock" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + /usr/local/bin/pihole -up + msg_ok "Updated ${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}/admin${CL}" \ No newline at end of file diff --git a/ct/pingvin.sh b/ct/pingvin.sh new file mode 100644 index 0000000..0a699bd --- /dev/null +++ b/ct/pingvin.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://stonith404.github.io/pingvin-share/introduction + +APP="Pingvin" +var_tags="sharing" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/pingvin-share ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/stonith404/pingvin-share/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ ! -f /opt/pingvin_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/pingvin_version.txt)" ]]; then + + msg_info "Stopping Pingvin Share" + systemctl stop pm2-root.service + msg_ok "Stopped Pingvin Share" + + msg_info "Updating Pingvin Share to v${RELEASE}" + cd /opt + curl -fsSL "https://github.com/stonith404/pingvin-share/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/stonith404/pingvin-share/archive/refs/tags/v${RELEASE}.zip") + unzip -q v${RELEASE}.zip + cp -rf pingvin-share-${RELEASE}/* /opt/pingvin-share + cd /opt/pingvin-share + cd backend + $STD npm install + $STD npm run build + cd ../frontend + $STD npm install + $STD npm run build + echo "${RELEASE}" >"/opt/pingvin_version.txt" + rm -rf /opt/v${RELEASE}.zip + rm -rf /opt/pingvin-share-${RELEASE} + msg_ok "Updated Pingvin Share to v${RELEASE}" + + msg_info "Starting Pingvin Share" + systemctl start pm2-root.service + msg_ok "Started Pingvin Share" + + msg_ok "Updated Successfully" + exit + else + msg_ok "No update required. Pingvin Share is already at v${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}:3000${CL}" diff --git a/ct/plant-it.sh b/ct/plant-it.sh new file mode 100644 index 0000000..4e2ebdd --- /dev/null +++ b/ct/plant-it.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://plant-it.org/ + +APP="Plant-it" +var_tags="plants;garden" +var_cpu="2" +var_ram="2048" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/plant-it ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/MDeLuise/plant-it/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 plant-it + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + curl -fsSL "https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/server.jar" -o "/opt/plant-it/server.jar" + cd /opt/plant-it/frontend + curl -fsSL "https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/client.tar.gz" -o $(basename "https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/client.tar.gz") + tar -xzf client.tar.gz + rm -f client.tar.gz + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start plant-it + msg_ok "Started $APP" + msg_ok "Update Successful" + 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/plex.sh b/ct/plex.sh new file mode 100644 index 0000000..d321797 --- /dev/null +++ b/ct/plex.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.plex.tv/ + +APP="Plex" +var_tags="media" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="ubuntu" +var_version="22.04" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated ${APP} LXC" + exit + fi + if [ "$UPD" == "2" ]; then + set +e + bash -c "$(curl -fsSL https://raw.githubusercontent.com/mrworf/plexupdate/master/extras/installer.sh)" + exit + 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}:32400/web${CL}" diff --git a/ct/pocketbase.sh b/ct/pocketbase.sh new file mode 100644 index 0000000..84b36ab --- /dev/null +++ b/ct/pocketbase.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://pocketbase.io/ + +APP="Pocketbase" +var_tags="database" +var_cpu="1" +var_ram="512" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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 +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/pocketid.sh b/ct/pocketid.sh new file mode 100755 index 0000000..11a106b --- /dev/null +++ b/ct/pocketid.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Snarkenfaugister +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/pocket-id/pocket-id + +APP="PocketID" +var_tags="identity-provider" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/pocket-id ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/pocket-id/pocket-id/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 $APP" + + msg_info "Stopping $APP" + systemctl stop pocketid-backend.service + systemctl stop pocketid-frontend.service + systemctl stop caddy.service + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + cd /opt + cp -r /opt/pocket-id/backend/data /opt/data + cp /opt/pocket-id/backend/.env /opt/backend.env + cp /opt/pocket-id/frontend/.env /opt/frontend.env + rm -r /opt/pocket-id + curl -fsSL "https://github.com/pocket-id/pocket-id/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/pocket-id/pocket-id/archive/refs/tags/v${RELEASE}.zip") + unzip -q v${RELEASE}.zip + mv pocket-id-${RELEASE} /opt/pocket-id + mv /opt/data /opt/pocket-id/backend/data + mv /opt/backend.env /opt/pocket-id/backend/.env + mv /opt/frontend.env /opt/pocket-id/frontend/.env + + cd /opt/pocket-id/backend/cmd + go build -o ../pocket-id-backend + cd ../../frontend + npm install + npm run build + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Starting $APP" + systemctl start pocketid-backend.service + systemctl start pocketid-frontend.service + systemctl start caddy.service + sleep 2 + msg_ok "Started $APP" + + # Cleaning up + msg_info "Cleaning Up" + rm -f /opt/v${RELEASE}.zip + msg_ok "Cleanup Completed" + + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Update Successful" + 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} Configure your reverse proxy to point to:${BGN} ${IP}:80${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}https://{PUBLIC_URL}/login/setup${CL}" diff --git a/ct/podman-homeassistant.sh b/ct/podman-homeassistant.sh new file mode 100644 index 0000000..6c0e38d --- /dev/null +++ b/ct/podman-homeassistant.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.home-assistant.io/ + +APP="Podman-Home Assistant" +var_tags="podman;smarthome" +var_cpu="2" +var_ram="2048" +var_disk="16" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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 \ + "2" "Install HACS" OFF \ + "3" "Install FileBrowser" OFF \ + "4" "Remove ALL Unused Images" OFF \ + 3>&1 1>&2 2>&3) + + if [ "$UPD" == "1" ]; then + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated Successfully" + + msg_info "Updating All Containers\n" + CONTAINER_LIST="${1:-$(podman ps -q)}" + for container in ${CONTAINER_LIST}; do + CONTAINER_IMAGE="$(podman inspect --format "{{.Config.Image}}" --type container ${container})" + RUNNING_IMAGE="$(podman inspect --format "{{.Image}}" --type container "${container}")" + podman pull "${CONTAINER_IMAGE}" + LATEST_IMAGE="$(podman inspect --format "{{.Id}}" --type image "${CONTAINER_IMAGE}")" + if [[ "${RUNNING_IMAGE}" != "${LATEST_IMAGE}" ]]; then + echo "Updating ${container} image ${CONTAINER_IMAGE}" + systemctl restart homeassistant + fi + done + msg_ok "All containers updated." + exit + fi + if [ "$UPD" == "2" ]; then + msg_info "Installing Home Assistant Community Store (HACS)" + $STD apt update + $STD apt install unzip + cd /var/lib/containers/storage/volumes/hass_config/_data + $STD bash <(curl -fsSL https://get.hacs.xyz) + msg_ok "Installed Home Assistant Community Store (HACS)" + echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n" + exit + fi + if [ "$UPD" == "3" ]; then + IP=$(hostname -I | awk '{print $1}') + msg_info "Installing FileBrowser" + $STD curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash + $STD filebrowser config init -a '0.0.0.0' + $STD filebrowser config set -a '0.0.0.0' + $STD filebrowser users add admin helper-scripts.com --perm.admin + msg_ok "Installed FileBrowser" + + msg_info "Creating Service" + service_path="/etc/systemd/system/filebrowser.service" + echo "[Unit] + Description=Filebrowser + After=network-online.target + [Service] + User=root + WorkingDirectory=/root/ + ExecStart=/usr/local/bin/filebrowser -r / + [Install] + WantedBy=default.target" >$service_path + + $STD systemctl enable --now filebrowser + msg_ok "Created Service" + + msg_ok "Completed Successfully!\n" + echo -e "FileBrowser should be reachable by going to the following URL. + ${BL}http://$IP:8080${CL} admin|helper-scripts.com\n" + exit + fi + if [ "$UPD" == "4" ]; then + msg_info "Removing ALL Unused Images" + podman image prune -a -f + msg_ok "Removed ALL Unused Images" + exit + 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}:8123${CL}" \ No newline at end of file diff --git a/ct/podman.sh b/ct/podman.sh new file mode 100644 index 0000000..6ae648a --- /dev/null +++ b/ct/podman.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://podman.io/ + +APP="Podman" +var_tags="container;kubernetes" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/postgresql.sh b/ct/postgresql.sh new file mode 100644 index 0000000..9f7fdde --- /dev/null +++ b/ct/postgresql.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.postgresql.org/ + +APP="PostgreSQL" +var_tags="database" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:5432${CL}" \ No newline at end of file diff --git a/ct/privatebin.sh b/ct/privatebin.sh new file mode 100644 index 0000000..81eefab --- /dev/null +++ b/ct/privatebin.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Nícolas Pastorello (opastorello) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://privatebin.info/ + +APP="PrivateBin" +var_tags="paste;secure" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/privatebin ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/PrivateBin/PrivateBin/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 v${RELEASE}" + echo "${RELEASE}" >/opt/${APP}_version.txt + cp -f /opt/privatebin/cfg/conf.php /tmp/privatebin_conf.bak + curl -fsSL "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${RELEASE}.zip") + unzip -q ${RELEASE}.zip + rm -rf /opt/privatebin/* + mv PrivateBin-${RELEASE}/* /opt/privatebin/ + mv /tmp/privatebin_conf.bak /opt/privatebin/cfg/conf.php + chown -R www-data:www-data /opt/privatebin + chmod -R 0755 /opt/privatebin/data + echo "${RELEASE}" >/opt/${APP}_version.txt + rm -rf ${RELEASE}.zip PrivateBin-${RELEASE} + systemctl reload nginx php8.2-fpm + 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}https://${IP}${CL}" diff --git a/ct/projectsend.sh b/ct/projectsend.sh new file mode 100644 index 0000000..b40465d --- /dev/null +++ b/ct/projectsend.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.projectsend.org/ + +APP="ProjectSend" +var_tags="media" +var_cpu="1" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/projectsend ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/projectsend/projectsend/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 + curl -fsSL "https://github.com/projectsend/projectsend/releases/download/r${RELEASE}/projectsend-r${RELEASE}.zip" -o $(basename "https://github.com/projectsend/projectsend/releases/download/r${RELEASE}/projectsend-r${RELEASE}.zip") + unzip -o -q "projectsend-r${RELEASE}.zip" -d projectsend + chown -R www-data:www-data /opt/projectsend + chmod -R 775 /opt/projectsend + 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 -rf "/opt/projectsend-r${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/prometheus-alertmanager.sh b/ct/prometheus-alertmanager.sh new file mode 100755 index 0000000..51885e5 --- /dev/null +++ b/ct/prometheus-alertmanager.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Andy Grunwald (andygrunwald) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://prometheus.io/ + +APP="Prometheus-Alertmanager" +var_tags="monitoring;alerting" +var_cpu="1" +var_ram="1024" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/prometheus-alertmanager.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/prometheus/alertmanager/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-alertmanager + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt + curl -fsSL "https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz" -o $(basename "https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz") + tar -xf alertmanager-${RELEASE}.linux-amd64.tar.gz + cp -rf alertmanager-${RELEASE}.linux-amd64/alertmanager alertmanager-${RELEASE}.linux-amd64/amtool /usr/local/bin/ + rm -rf alertmanager-${RELEASE}.linux-amd64 alertmanager-${RELEASE}.linux-amd64.tar.gz + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to v${RELEASE}" + + msg_info "Starting ${APP}" + systemctl start prometheus-alertmanager + msg_ok "Started ${APP}" + 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}:9093${CL}" diff --git a/ct/prometheus-paperless-ngx-exporter.sh b/ct/prometheus-paperless-ngx-exporter.sh new file mode 100755 index 0000000..96b4dc0 --- /dev/null +++ b/ct/prometheus-paperless-ngx-exporter.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Andy Grunwald (andygrunwald) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/hansmi/prometheus-paperless-exporter + +APP="Prometheus-Paperless-NGX-Exporter" +var_tags="monitoring;alerting" +var_cpu="1" +var_ram="256" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/prometheus-paperless-ngx-exporter.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/hansmi/prometheus-paperless-exporter/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-paperless-ngx-exporter + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt + curl -fsSL "https://github.com/hansmi/prometheus-paperless-exporter/releases/download/v${RELEASE}/prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz" -o $(basename "https://github.com/hansmi/prometheus-paperless-exporter/releases/download/v${RELEASE}/prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz") + tar -xf prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz + cp -rf prometheus-paperless-exporter_${RELEASE}_linux_amd64/prometheus-paperless-exporter /usr/local/bin/ + rm -rf prometheus-paperless-exporter_${RELEASE}_linux_amd64/ prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to v${RELEASE}" + + msg_info "Starting ${APP}" + systemctl start prometheus-paperless-ngx-exporter + msg_ok "Started ${APP}" + 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}:8081/metrics${CL}" diff --git a/ct/prometheus-pve-exporter.sh b/ct/prometheus-pve-exporter.sh new file mode 100644 index 0000000..c21a08a --- /dev/null +++ b/ct/prometheus-pve-exporter.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Andy Grunwald (andygrunwald) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/prometheus-pve/prometheus-pve-exporter + +APP="Prometheus-PVE-Exporter" +var_tags="monitoring" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/prometheus-pve-exporter.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Stopping ${APP}" + systemctl stop prometheus-pve-exporter + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP}" + $STD pip install prometheus-pve-exporter --default-timeout=300 --upgrade --root-user-action=ignore + msg_ok "Updated ${APP}" + + msg_info "Starting ${APP}" + systemctl start prometheus-pve-exporter + msg_ok "Started ${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 URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9221${CL}" \ No newline at end of file diff --git a/ct/prometheus.sh b/ct/prometheus.sh new file mode 100644 index 0000000..50be5ea --- /dev/null +++ b/ct/prometheus.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://prometheus.io/ + +APP="Prometheus" +var_tags="monitoring" +var_cpu="1" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSL 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 v${RELEASE}" + cd /opt + curl -fsSL "https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz" -o $(basename "https://github.com/prometheus/prometheus/releases/download/v${RELEASE}/prometheus-${RELEASE}.linux-amd64.tar.gz") + tar -xf prometheus-${RELEASE}.linux-amd64.tar.gz + cp -rf prometheus-${RELEASE}.linux-amd64/prometheus prometheus-${RELEASE}.linux-amd64/promtool /usr/local/bin/ + rm -rf prometheus-${RELEASE}.linux-amd64 prometheus-${RELEASE}.linux-amd64.tar.gz + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to v${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 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}:9090${CL}" diff --git a/ct/prowlarr.sh b/ct/prowlarr.sh new file mode 100644 index 0000000..c18ba36 --- /dev/null +++ b/ct/prowlarr.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://prowlarr.com/ + +APP="Prowlarr" +var_tags="arr" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /var/lib/prowlarr/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + msg_info "Updating $APP LXC" + temp_file="$(mktemp)" + rm -rf /opt/Prowlarr + RELEASE=$(curl -fsSL https://api.github.com/repos/Prowlarr/Prowlarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + curl -fsSL "https://github.com/Prowlarr/Prowlarr/releases/download/v${RELEASE}/Prowlarr.master.${RELEASE}.linux-core-x64.tar.gz" -o "$temp_file" + $STD tar -xvzf "$temp_file" + mv Prowlarr /opt + chmod 775 /opt/Prowlarr + msg_ok "Updated $APP LXC" + + msg_info "Cleaning up" + rm -f "$temp_file" + msg_ok "Cleaned up" + 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}:9696${CL}" diff --git a/ct/proxmox-backup-server.sh b/ct/proxmox-backup-server.sh new file mode 100644 index 0000000..cd51b8c --- /dev/null +++ b/ct/proxmox-backup-server.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.proxmox.com/en/proxmox-backup-server + +APP="Proxmox-Backup-Server" +var_tags="backup" +var_cpu="2" +var_ram="2048" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -e /usr/sbin/proxmox-backup-manager ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating $APP LXC" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8007${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 0000000..c8adda7 --- /dev/null +++ b/ct/proxmox-datacenter-manager.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: Proxmox Server Solution GmbH + +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" + +header_info "$APP" +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/proxmox-mail-gateway.sh b/ct/proxmox-mail-gateway.sh new file mode 100644 index 0000000..07f66ba --- /dev/null +++ b/ct/proxmox-mail-gateway.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: thost96 (thost96) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.proxmox.com/en/products/proxmox-mail-gateway + +APP="Proxmox-Mail-Gateway" +var_tags="mail" +var_cpu="2" +var_ram="4096" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -e /usr/bin/pmgproxy ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP}" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated ${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}https://${IP}:8006/${CL}" \ No newline at end of file diff --git a/ct/ps5-mqtt.sh b/ct/ps5-mqtt.sh new file mode 100644 index 0000000..f91cb2b --- /dev/null +++ b/ct/ps5-mqtt.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: liecno +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/FunkeyFlo/ps5-mqtt/ + +APP="PS5-MQTT" +var_tags="smarthome;automation" +var_cpu="1" +var_ram="512" +var_disk="3" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/ps5-mqtt ]]; then + msg_error "No ${APP} installation found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/FunkeyFlo/ps5-mqtt/releases/latest | jq -r '.tag_name') + + if [[ "${RELEASE}" != "$(cat /opt/ps5-mqtt_version.txt)" ]]; then + msg_info "Stopping service" + systemctl stop ps5-mqtt + msg_ok "Stopped service" + + msg_info "Updating PS5-MQTT to ${RELEASE}" + curl -fsSL https://github.com/FunkeyFlo/ps5-mqtt/archive/refs/tags/${RELEASE}.tar.gz -o /tmp/${RELEASE}.tar.gz + rm -rf /opt/ps5-mqtt + tar zxf /tmp/${RELEASE}.tar.gz -C /opt + mv /opt/ps5-mqtt-* /opt/ps5-mqtt + rm /tmp/${RELEASE}.tar.gz + echo ${RELEASE} >/opt/ps5-mqtt_version.txt + msg_ok "Updated PS5-MQTT" + + msg_info "Building new PS5-MQTT version" + cd /opt/ps5-mqtt/ps5-mqtt/ + $STD npm install + $STD npm run build + msg_ok "Built new PS5-MQTT version" + + msg_info "Starting service" + systemctl start ps5-mqtt + msg_ok "Started service" + 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}:8645${CL}" diff --git a/ct/pterodactyl-panel.sh b/ct/pterodactyl-panel.sh new file mode 100644 index 0000000..322d060 --- /dev/null +++ b/ct/pterodactyl-panel.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/pterodactyl/panel + +APP="Pterodactyl-Panel" +var_tags="gaming" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/pterodactyl-panel ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) + + if [[ "$CURRENT_PHP" != "8.4" ]]; then + msg_info "Migrating PHP $CURRENT_PHP to 8.4" + $STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb + $STD dpkg -i /tmp/debsuryorg-archive-keyring.deb + $STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' + $STD apt-get update + $STD apt-get remove -y php"${CURRENT_PHP//./}"* + $STD apt-get install -y \ + php8.4 \ + php8.4-{gd,mysql,mbstring,bcmath,xml,curl,zip,intl,fpm} \ + libapache2-mod-php8.4 + + msg_ok "Migrated PHP $CURRENT_PHP to 8.4" + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/pterodactyl/panel/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" + cd /opt/pterodactyl-panel || exit + $STD php artisan down + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + cp -r /opt/pterodactyl-panel/.env /opt/ + rm -rf * .* + curl -fsSL "https://github.com/pterodactyl/panel/releases/download/v${RELEASE}/panel.tar.gz" -o $(basename "https://github.com/pterodactyl/panel/releases/download/v${RELEASE}/panel.tar.gz") + tar -xzf "panel.tar.gz" + mv /opt/.env /opt/pterodactyl-panel/ + $STD composer install --no-dev --optimize-autoloader --no-interaction + $STD php artisan view:clear + $STD php artisan config:clear + $STD php artisan migrate --seed --force --no-interaction + chown -R www-data:www-data /opt/pterodactyl-panel/* + chmod -R 755 /opt/pterodactyl-panel/storage /opt/pterodactyl-panel/bootstrap/cache/ + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting Service" + $STD php artisan queue:restart + $STD php artisan up + msg_ok "Started Service" + + msg_info "Cleaning up" + rm -rf "/opt/pterodactyl-panel/panel.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}" diff --git a/ct/pterodactyl-wings.sh b/ct/pterodactyl-wings.sh new file mode 100644 index 0000000..7214282 --- /dev/null +++ b/ct/pterodactyl-wings.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/pterodactyl/wings + +APP="Pterodactyl-Wings" +var_tags="gaming" +var_cpu="2" +var_ram="4096" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /usr/local/bin/wings ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/pterodactyl/wings/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 wings + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + rm /usr/local/bin/wings + curl -fsSL "https://github.com/pterodactyl/wings/releases/download/v${RELEASE}/wings_linux_amd64" -o "/usr/local/bin/wings" + chmod u+x /usr/local/bin/wings + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting Service" + systemctl start wings + msg_ok "Started Service" + 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}" diff --git a/ct/qbittorrent.sh b/ct/qbittorrent.sh new file mode 100644 index 0000000..cbf333b --- /dev/null +++ b/ct/qbittorrent.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tteck (tteckster) | Co-Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.qbittorrent.org/ + +APP="qBittorrent" +var_tags="torrent" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + if [[ ! -f /opt/${APP}_version.txt ]]; then + touch /opt/${APP}_version.txt + mkdir -p $HOME/.config/qBittorrent/ + mkdir -p /opt/qbittorrent/ + mv /.config/qBittorrent $HOME/.config/ + $STD apt-get remove --purge -y qbittorrent-nox + sed -i 's@ExecStart=/usr/bin/qbittorrent-nox@ExecStart=/opt/qbittorrent/qbittorrent-nox@g' /etc/systemd/system/qbittorrent-nox.service + systemctl daemon-reload + fi + FULLRELEASE=$(curl -fsSL https://api.github.com/repos/userdocs/qbittorrent-nox-static/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + RELEASE=$(echo $FULLRELEASE | cut -c 9-13) + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping Service" + systemctl stop qbittorrent-nox + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${RELEASE}" + rm -f /opt/qbittorrent/qbittorrent-nox + curl -fsSL "https://github.com/userdocs/qbittorrent-nox-static/releases/download/${FULLRELEASE}/x86_64-qbittorrent-nox" -o /opt/qbittorrent/qbittorrent-nox + chmod +x /opt/qbittorrent/qbittorrent-nox + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting Service" + systemctl start qbittorrent-nox + msg_ok "Started Service" + 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}:8090${CL}" \ No newline at end of file diff --git a/ct/rabbitmq.sh b/ct/rabbitmq.sh new file mode 100644 index 0000000..164a3eb --- /dev/null +++ b/ct/rabbitmq.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck | Co-Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.rabbitmq.com/ + +APP="RabbitMQ" +var_tags="mqtt" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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..." + $STD apt install --only-upgrade rabbitmq-server + msg_ok "Update Successfully" + + msg_info "Starting ${APP}" + systemctl start rabbitmq-server + msg_ok "Started ${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 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 new file mode 100644 index 0000000..d414c6f --- /dev/null +++ b/ct/radarr.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://radarr.video/ + +APP="Radarr" +var_tags="arr" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /var/lib/radarr/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + msg_info "Updating $APP LXC" + temp_file="$(mktemp)" + rm -rf /opt/Radarr + RELEASE=$(curl -fsSL https://api.github.com/repos/Radarr/Radarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + curl -fsSL "https://github.com/Radarr/Radarr/releases/download/v${RELEASE}/Radarr.master.${RELEASE}.linux-core-x64.tar.gz" -o "$temp_file" + $STD tar -xvzf "$temp_file" + mv Radarr /opt + chmod 775 /opt/Radarr + msg_ok "Updated $APP LXC" + + msg_info "Cleaning up" + rm -rf "$temp_file" + msg_ok "Cleaned up" + 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}:7878${CL}" diff --git a/ct/radicale.sh b/ct/radicale.sh new file mode 100644 index 0000000..d34b8dd --- /dev/null +++ b/ct/radicale.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://radicale.org/ + +APP="Radicale" +var_tags="calendar" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/radicale ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + msg_info "Updating ${APP}" + python3 -m venv /opt/radicale + source /opt/radicale/bin/activate + python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz + msg_ok "Updated ${APP}" + + msg_info "Starting Service" + systemctl enable -q --now radicale + msg_ok "Started Service" + + 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}:5232${CL}" \ No newline at end of file diff --git a/ct/rdtclient.sh b/ct/rdtclient.sh new file mode 100755 index 0000000..cea9692 --- /dev/null +++ b/ct/rdtclient.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/rogerfar/rdt-client + +APP="RDTClient" +var_tags="torrent" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + $STD apt-get remove --purge -y dotnet-sdk-8.0 + $STD apt-get install -y dotnet-sdk-9.0 + fi + mkdir -p rdtc-backup + cp -R /opt/rdtc/appsettings.json rdtc-backup/ + curl -fsSL "https://github.com/rogerfar/rdt-client/releases/latest/download/RealDebridClient.zip" -o $(basename "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 +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}:6500${CL}" diff --git a/ct/readarr.sh b/ct/readarr.sh new file mode 100644 index 0000000..45683b7 --- /dev/null +++ b/ct/readarr.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://readarr.com/ + +APP="Readarr" +var_tags="media;comic;eBook" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8787${CL}" \ No newline at end of file diff --git a/ct/readeck.sh b/ct/readeck.sh new file mode 100644 index 0000000..918356e --- /dev/null +++ b/ct/readeck.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://readeck.org/en/ + +APP="Readeck" +var_tags="bookmark" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSL 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 +curl -fsSL "https://codeberg.org/readeck/readeck/releases/download/${LATEST}/readeck-${LATEST}-linux-amd64" -o "readeck" + chmod a+x readeck + systemctl start readeck.service + msg_ok "Updated ${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}:8000${CL}" \ No newline at end of file diff --git a/ct/recyclarr.sh b/ct/recyclarr.sh new file mode 100644 index 0000000..062cf7f --- /dev/null +++ b/ct/recyclarr.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MrYadro +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://recyclarr.dev/wiki/ + +APP="Recyclarr" +var_tags="arr" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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}" + curl -fsSL "$(curl -fsSL https://api.github.com/repos/recyclarr/recyclarr/releases/latest | grep download | grep linux-x64 | cut -d\" -f4)" -o $(basename "$(curl -fsSL 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}" diff --git a/ct/redis.sh b/ct/redis.sh new file mode 100644 index 0000000..f2165d8 --- /dev/null +++ b/ct/redis.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://redis.io/ + +APP="Redis" +var_tags="database" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 "Currently we don't provide an update function for this ${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 IP:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}${IP}:6379${CL}" \ No newline at end of file diff --git a/ct/revealjs.sh b/ct/revealjs.sh new file mode 100644 index 0000000..ac72472 --- /dev/null +++ b/ct/revealjs.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/hakimel/reveal.js + +APP="RevealJS" +var_tags="presentation" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/revealjs" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/hakimel/reveal.js/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 revealjs + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + temp_file=$(mktemp) +curl -fsSL "https://github.com/hakimel/reveal.js/archive/refs/tags/${RELEASE}.tar.gz" -o "$temp_file" + tar zxf $temp_file + rm -rf /opt/revealjs/node_modules/* + cp /opt/revealjs/index.html /opt + cp -rf reveal.js-${RELEASE}/* /opt/revealjs + cd /opt/revealjs + $STD npm install + cp -f /opt/index.html /opt/revealjs + sed -i '25s/localhost/0.0.0.0/g' /opt/revealjs/gulpfile.js + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Starting $APP" + systemctl start revealjs + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -f $temp_file + rm -rf ~/reveal.js-${RELEASE} + msg_ok "Cleanup Completed" + + msg_ok "Update Successful" + 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}:8000${CL}" \ No newline at end of file diff --git a/ct/rtsptoweb.sh b/ct/rtsptoweb.sh new file mode 100644 index 0000000..6aaf09b --- /dev/null +++ b/ct/rtsptoweb.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/deepch/RTSPtoWeb + +APP="RTSPtoWeb" +var_tags="media" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8083${CL}" \ No newline at end of file diff --git a/ct/runtipi.sh b/ct/runtipi.sh new file mode 100644 index 0000000..65baf5a --- /dev/null +++ b/ct/runtipi.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://runtipi.io/ + +APP="Runtipi" +var_tags="os" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +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/rustdeskserver.sh b/ct/rustdeskserver.sh new file mode 100644 index 0000000..ffe26a4 --- /dev/null +++ b/ct/rustdeskserver.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/rustdesk/rustdesk-server + +APP="RustDesk Server" +TAGS="remote-desktop" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -x /usr/bin/hbbr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/rustdesk/rustdesk-server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ "${RELEASE}" != "$(cat /opt/rustdesk_version.txt)" ]] || [[ ! -f /opt/rustdesk_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop rustdesk-hbbr + systemctl stop rustdesk-hbbs + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + TEMPDIR=$(mktemp -d) + curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-hbbr_${RELEASE}_amd64.deb" \ + -o "${TEMPDIR}/rustdesk-server-hbbr_${RELEASE}_amd64.deb" + curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-hbbs_${RELEASE}_amd64.deb" \ + -o "${TEMPDIR}/rustdesk-server-hbbs_${RELEASE}_amd64.deb" + curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-utils_${RELEASE}_amd64.deb" \ + -o "${TEMPDIR}/rustdesk-server-utils_${RELEASE}_amd64.deb" + $STD dpkg -i $TEMPDIR/*.deb + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Cleaning Up" + rm -rf $TEMPDIR + msg_ok "Cleanup Completed" + + echo "${RELEASE}" >/opt/rustdesk_version.txt + msg_ok "Update Successful" + 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}${IP}${CL}" diff --git a/ct/sabnzbd.sh b/ct/sabnzbd.sh new file mode 100644 index 0000000..6676354 --- /dev/null +++ b/ct/sabnzbd.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://sabnzbd.org/ + +APP="SABnzbd" +var_tags="downloader" +var_cpu="2" +var_ram="4096" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/sabnzbd ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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) + cp -rf SABnzbd-${RELEASE}/* /opt/sabnzbd + rm -rf SABnzbd-${RELEASE} + cd /opt/sabnzbd + $STD python3 -m pip install -r requirements.txt + echo "${RELEASE}" >/opt/${APP}_version.txt + systemctl start sabnzbd.service + 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}:7777${CL}" \ No newline at end of file diff --git a/ct/seafile.sh b/ct/seafile.sh new file mode 100644 index 0000000..e3faf1c --- /dev/null +++ b/ct/seafile.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: dave-yap (dave-yap) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://seafile.com/ + +APP="Seafile" +var_tags="documents" +var_cpu="2" +var_ram="2048" +var_disk="20" +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 /etc/systemd/system/seafile.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_ok "No upgrade path available now." + 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}:8000${CL}" \ No newline at end of file diff --git a/ct/searxng.sh b/ct/searxng.sh new file mode 100644 index 0000000..4596f67 --- /dev/null +++ b/ct/searxng.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/searxng/searxng + +APP="SearXNG" +var_tags="search" +var_cpu="2" +var_ram="2048" +var_disk="7" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /usr/local/searxng/searxng-src ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if cd /usr/local/searxng/searxng-src && git pull | grep -q 'Already up to date'; then + msg_ok "There is currently no update available." + 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}:8888${CL}" \ No newline at end of file diff --git a/ct/seelf.sh b/ct/seelf.sh new file mode 100644 index 0000000..a27f57e --- /dev/null +++ b/ct/seelf.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/YuukanOO/seelf + +APP="seelf" +var_tags="server;docker" +var_cpu="2" +var_ram="4096" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/seelf ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/YuukanOO/seelf/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 $APP" + + msg_info "Stopping $APP" + systemctl stop seelf + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}. Patience" + export PATH=$PATH:/usr/local/go/bin + source ~/.bashrc + curl -fsSL "https://github.com/YuukanOO/seelf/archive/refs/tags/v${RELEASE}.tar.gz" -o $(basename "https://github.com/YuukanOO/seelf/archive/refs/tags/v${RELEASE}.tar.gz") + tar -xzf v${RELEASE}.tar.gz + cp -r seelf-${RELEASE}/ /opt/seelf + cd /opt/seelf + $STD make build + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start seelf + msg_ok "Started $APP" + + # Cleaning up + msg_info "Cleaning Up" + rm -f ~/*.tar.gz + rm -rf ~/seelf-${RELEASE} + msg_ok "Cleanup Completed" + + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Update Successful" + 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}" diff --git a/ct/semaphore.sh b/ct/semaphore.sh new file mode 100644 index 0000000..b35c239 --- /dev/null +++ b/ct/semaphore.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kristocopani +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://semaphoreui.com/ + +APP="Semaphore" +var_tags="dev_ops" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/semaphoreui/semaphore/releases/download/v${RELEASE}/semaphore_${RELEASE}_linux_amd64.deb" -o $(basename "https://github.com/semaphoreui/semaphore/releases/download/v${RELEASE}/semaphore_${RELEASE}_linux_amd64.deb") + $STD dpkg -i semaphore_${RELEASE}_linux_amd64.deb + 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}" diff --git a/ct/sftpgo.sh b/ct/sftpgo.sh new file mode 100644 index 0000000..54866fd --- /dev/null +++ b/ct/sftpgo.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://sftpgo.com/ + +APP="SFTPGo" +var_tags="ftp;sftp" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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/web/admin${CL}" \ No newline at end of file diff --git a/ct/shinobi.sh b/ct/shinobi.sh new file mode 100644 index 0000000..a2f29f3 --- /dev/null +++ b/ct/shinobi.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://shinobi.video/ + +APP="Shinobi" +var_tags="nvr" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="ubuntu" +var_version="22.04" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 +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/super${CL}" \ No newline at end of file diff --git a/ct/silverbullet.sh b/ct/silverbullet.sh new file mode 100644 index 0000000..61c9a3d --- /dev/null +++ b/ct/silverbullet.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Dominik Siebel (dsiebel) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://silverbullet.md + +APP="Silverbullet" +var_tags="notes" +var_cpu="1" +var_disk="2" +var_ram="512" +var_os="debian" +var_version="12" + +header_info "${APP}" +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 -fsSL 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}" + curl -fsSL "https://github.com/silverbulletmd/silverbullet/releases/download/${RELEASE}/silverbullet-server-linux-x86_64.zip" -o $(basename "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/slskd.sh b/ct/slskd.sh new file mode 100644 index 0000000..5b1f322 --- /dev/null +++ b/ct/slskd.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/slskd/slskd, https://soularr.net + +APP="slskd" +var_tags="${var_tags:-arr;p2p}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/slskd ]] || [[ ! -d /opt/soularr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -s https://api.github.com/repos/slskd/slskd/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 and Soularr" + systemctl stop slskd soularr.timer soularr.service + msg_ok "Stopped $APP and Soularr" + + msg_info "Updating $APP to v${RELEASE}" + tmp_file=$(mktemp) + curl -fsSL "https://github.com/slskd/slskd/releases/download/${RELEASE}/slskd-${RELEASE}-linux-x64.zip" -o $tmp_file + unzip -q -oj $tmp_file slskd -d /opt/${APP} + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Updating Soularr" + cp /opt/soularr/config.ini /opt/config.ini.bak + cp /opt/soularr/run.sh /opt/run.sh.bak + cd /tmp + rm -rf /opt/soularr + curl -fsSL https://github.com/mrusse/soularr/archive/refs/heads/main.zip + unzip -q main.zip + mv soularr-main /opt/soularr + cd /opt/soularr + $STD pip install -r requirements.txt + mv /opt/config.ini.bak /opt/soularr/config.ini + mv /opt/run.sh.bak /opt/soularr/run.sh + msg_ok "Soularr updated" + msg_info "Starting $APP and Soularr" + systemctl start slskd soularr.timer + msg_ok "Started $APP and Soularr" + + msg_info "Cleaning Up" + rm -rf $tmp_file + rm -rf /tmp/main.zip + msg_ok "Cleanup Completed" + + 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}:5030${CL}" diff --git a/ct/smokeping.sh b/ct/smokeping.sh new file mode 100644 index 0000000..c9ddb12 --- /dev/null +++ b/ct/smokeping.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://oss.oetiker.ch/smokeping/ + +APP="SmokePing" +var_tags="network" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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}" + $STD apt-get update + $STD apt-get -y upgrade + 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}/smokeping${CL}" \ No newline at end of file diff --git a/ct/snipeit.sh b/ct/snipeit.sh new file mode 100644 index 0000000..133a459 --- /dev/null +++ b/ct/snipeit.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Michel Roegl-Brunner (michelroegl-brunner) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://snipeitapp.com/ + +APP="SnipeIT" +var_tags="asset-management;foss" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL https://api.github.com/repos/snipe/snipe-it/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "v([^"]+).*/\1/') + if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + msg_info "Stopping Services" + systemctl stop nginx + msg_ok "Services Stopped" + + msg_info "Updating ${APP} to v${RELEASE}" + $STD apt-get update + $STD apt-get -y upgrade + mv /opt/snipe-it /opt/snipe-it-backup + temp_file=$(mktemp) + curl -fsSL "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar zxf "$temp_file" + 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/ || exit + export COMPOSER_ALLOW_SUPERUSER=1 + $STD composer install --no-dev --optimize-autoloader --no-interaction + $STD composer dump-autoload + $STD php artisan migrate --force + $STD php artisan config:clear + $STD php artisan route:clear + $STD php artisan cache:clear + $STD php artisan view:clear + chown -R www-data: /opt/snipe-it + chmod -R 755 /opt/snipe-it + rm -rf "$temp_file" + rm -rf /opt/snipe-it-backup + msg_ok "Updated ${APP}" + + msg_info "Starting Service" + systemctl start nginx + msg_ok "Started Service" + 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/sonarr.sh b/ct/sonarr.sh new file mode 100644 index 0000000..8920221 --- /dev/null +++ b/ct/sonarr.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://sonarr.tv/ + +APP="Sonarr" +var_tags="arr" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + curl -fsSL "https://services.sonarr.tv/v1/download/main/latest?version=4&os=linux&arch=x64" -o "SonarrV4.tar.gz" + 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 +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}:8989${CL}" diff --git a/ct/spoolman.sh b/ct/spoolman.sh new file mode 100644 index 0000000..78e55ff --- /dev/null +++ b/ct/spoolman.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Donkie/Spoolman + +APP="Spoolman" +var_tags="3d-printing" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/spoolman ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://github.com/Donkie/Spoolman/releases/latest | 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 "Updating ${APP} to ${RELEASE}" + cd /opt + rm -rf spoolman_bak + mv spoolman spoolman_bak + curl -fsSL "https://github.com/Donkie/Spoolman/releases/download/${RELEASE}/spoolman.zip" -o $(basename "https://github.com/Donkie/Spoolman/releases/download/${RELEASE}/spoolman.zip") + unzip -q spoolman.zip -d spoolman + cd spoolman + $STD pip3 install -r requirements.txt + curl -fsSL "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 "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 +} + +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}:7912${CL}" diff --git a/ct/sqlserver2022.sh b/ct/sqlserver2022.sh new file mode 100644 index 0000000..7b76c70 --- /dev/null +++ b/ct/sqlserver2022.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Kristian Skov +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.microsoft.com/en-us/sql-server/sql-server-2022 + +APP="SQL Server 2022" +var_tags="sql" +var_cpu="1" +var_ram="2048" +var_disk="10" +var_os="ubuntu" +var_version="22.04" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/mssql ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + 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}:1433${CL}" \ No newline at end of file diff --git a/ct/stirling-pdf.sh b/ct/stirling-pdf.sh new file mode 100644 index 0000000..f91e932 --- /dev/null +++ b/ct/stirling-pdf.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.stirlingpdf.com/ + +APP="Stirling-PDF" +var_tags="pdf-editor" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + $STD apt-get remove -y ocrmypdf + $STD apt-get install -y qpdf + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/Stirling-Tools/Stirling-PDF/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + curl -fsSL "https://github.com/Stirling-Tools/Stirling-PDF/archive/refs/tags/v$RELEASE.tar.gz" -o $(basename "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 + $STD ./gradlew build + rm -rf /opt/Stirling-PDF/Stirling-PDF-*.jar + 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 +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/suwayomiserver.sh b/ct/suwayomiserver.sh new file mode 100644 index 0000000..271f2af --- /dev/null +++ b/ct/suwayomiserver.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Suwayomi/Suwayomi-Server + +APP="SuwayomiServer" +var_tags="media;manga" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /usr/bin/suwayomi-server ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ "${RELEASE}" != "$(cat /opt/suwayomi-server_version.txt)" ]] || [[ ! -f /opt/suwayomi-server_version.txt ]]; then + msg_info "Updating $APP" + msg_info "Stopping $APP" + systemctl stop suwayomi-server + msg_ok "Stopped $APP" + msg_info "Updating $APP to v${RELEASE}" + cd /tmp + URL=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' | tail -n+2 | head -n 1) + curl -fsSL "$URL" -o $(basename "$URL") + $STD dpkg -i /tmp/*.deb + msg_ok "Updated $APP to v${RELEASE}" + msg_info "Starting $APP" + systemctl start suwayomi-server + msg_ok "Started $APP" + msg_info "Cleaning Up" + rm -f *.deb + msg_ok "Cleanup Completed" + echo "${RELEASE}" >/opt/suwayomi-server_version.txt.txt + msg_ok "Update Successful" + 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}:4567${CL}" diff --git a/ct/syncthing.sh b/ct/syncthing.sh new file mode 100644 index 0000000..ef8b0d7 --- /dev/null +++ b/ct/syncthing.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://syncthing.net/ + +APP="Syncthing" +var_tags="sync" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8384${CL}" \ No newline at end of file diff --git a/ct/tandoor.sh b/ct/tandoor.sh new file mode 100644 index 0000000..83cc6c1 --- /dev/null +++ b/ct/tandoor.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://tandoor.dev/ + +APP="Tandoor" +var_tags="recipes" +var_cpu="4" +var_ram="4096" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + 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 + msg_info "Updating ${APP} (Patience)" + export $(cat /opt/tandoor/.env | grep "^[^#]" | xargs) + cd /opt/tandoor/ + $STD pip3 install -r requirements.txt + $STD /usr/bin/python3 /opt/tandoor/manage.py migrate + $STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic --no-input + $STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic_js_reverse + cd /opt/tandoor/vue + $STD yarn install + $STD yarn build + cd /opt/tandoor + $STD python3 version.py + systemctl restart gunicorn_tandoor + msg_ok "Updated ${APP}" + 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}:8002${CL}" \ No newline at end of file diff --git a/ct/tasmoadmin.sh b/ct/tasmoadmin.sh new file mode 100644 index 0000000..a17749d --- /dev/null +++ b/ct/tasmoadmin.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/TasmoAdmin/TasmoAdmin + +APP="TasmoAdmin" +var_tags="tasmota;smarthome" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:9999${CL}" \ No newline at end of file diff --git a/ct/tasmocompiler.sh b/ct/tasmocompiler.sh new file mode 100644 index 0000000..066d4f0 --- /dev/null +++ b/ct/tasmocompiler.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/benzino77/tasmocompiler + +APP="TasmoCompiler" +var_tags="compiler" +var_cpu="2" +var_ram="2048" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/tasmocompiler ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/benzino77/tasmocompiler/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 tasmocompiler + msg_ok "Stopped $APP" + msg_info "Updating $APP to v${RELEASE}" + cd /opt + rm -rf /opt/tasmocompiler + RELEASE=$(curl -fsSL https://api.github.com/repos/benzino77/tasmocompiler/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + curl -fsSL "https://github.com/benzino77/tasmocompiler/archive/refs/tags/v${RELEASE}.tar.gz" -o $(basename "https://github.com/benzino77/tasmocompiler/archive/refs/tags/v${RELEASE}.tar.gz") + tar xzf v${RELEASE}.tar.gz + mv tasmocompiler-${RELEASE}/ /opt/tasmocompiler/ + cd /opt/tasmocompiler + $STD yarn install + export NODE_OPTIONS=--openssl-legacy-provider + $STD npm i + $STD yarn build + msg_ok "Updated $APP to v${RELEASE}" + msg_info "Starting $APP" + systemctl start tasmocompiler + msg_ok "Started $APP" + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_info "Cleaning up" + rm -r "/opt/v${RELEASE}.tar.gz" + msg_ok "Cleaned" + msg_ok "Update Successful" + 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/tautulli.sh b/ct/tautulli.sh new file mode 100644 index 0000000..30ae896 --- /dev/null +++ b/ct/tautulli.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://tautulli.com/ + +APP="Tautulli" +var_tags="media" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8181${CL}" \ No newline at end of file diff --git a/ct/tdarr.sh b/ct/tdarr.sh new file mode 100644 index 0000000..4fc9b29 --- /dev/null +++ b/ct/tdarr.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://home.tdarr.io/ + +APP="Tdarr" +var_tags="arr" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:8265${CL}" \ No newline at end of file diff --git a/ct/technitiumdns.sh b/ct/technitiumdns.sh new file mode 100644 index 0000000..2266d13 --- /dev/null +++ b/ct/technitiumdns.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://technitium.com/dns/ + +APP="Technitium DNS" +var_tags="dns" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + curl -fsSL "https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb" -o $(basename "https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb") + $STD dpkg -i packages-microsoft-prod.deb + $STD apt-get update + $STD apt-get install -y aspnetcore-runtime-8.0 + rm packages-microsoft-prod.deb + fi + $STD bash <(curl -fsSL https://download.technitium.com/dns/install.sh) + 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}:5380${CL}" diff --git a/ct/teddycloud.sh b/ct/teddycloud.sh new file mode 100644 index 0000000..3789e98 --- /dev/null +++ b/ct/teddycloud.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Dominik Siebel (dsiebel) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/toniebox-reverse-engineering/teddycloud + +APP="TeddyCloud" +var_tags="media" +var_cpu="2" +var_disk="8" +var_ram="1024" +var_os="debian" +var_version="12" + +header_info "${APP}" +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 -fsSL 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}" + cd /opt + mv /opt/teddycloud /opt/teddycloud_bak + curl -fsSL "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip" -o $(basename "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip") + unzip -q -d /opt/teddycloud teddycloud.amd64.release_v${VERSION}.zip + cp -R /opt/teddycloud_bak/certs /opt/teddycloud_bak/config /opt/teddycloud_bak/data /opt/teddycloud + echo "${VERSION}" >"/opt/${APP}_version.txt" + msg_ok "Updated ${APP} to v${VERSION}" + + msg_info "Starting ${APP}" + systemctl start teddycloud + msg_ok "Started ${APP}" + + msg_info "Cleaning up" + rm -rf /opt/teddycloud.amd64.release_v${VERSION}.zip + rm -rf /opt/teddycloud_bak + 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 0000000..8d7f8d3 --- /dev/null +++ b/ct/the-lounge.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: kristocopani +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://thelounge.chat/ + +APP="The-Lounge" +var_tags="irc" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 + if ! dpkg -l build-essential >/dev/null 2>&1; then + $STD apt-get update + $STD apt-get install -y build-essential + fi + if ! npm list -g node-gyp >/dev/null 2>&1; then + $STD npm install -g node-gyp + fi + RELEASE=$(curl -fsSL 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}" + $STD apt-get install --only-upgrade nodejs + cd /opt + curl -fsSL "https://github.com/thelounge/thelounge-deb/releases/download/v${RELEASE}/thelounge_${RELEASE}_all.deb" -o $(basename "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}" diff --git a/ct/threadfin.sh b/ct/threadfin.sh new file mode 100644 index 0000000..fcde4cc --- /dev/null +++ b/ct/threadfin.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Threadfin/Threadfin + +APP="Threadfin" +var_tags="media" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + curl -fsSL "https://github.com/Threadfin/Threadfin/releases/latest/download/Threadfin_linux_amd64" -o "/opt/threadfin/threadfin" + chmod +x /opt/threadfin/threadfin + systemctl start threadfin.service + msg_ok "Updated $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}:34400/web${CL}" diff --git a/ct/tianji.sh b/ct/tianji.sh new file mode 100644 index 0000000..1e88b8c --- /dev/null +++ b/ct/tianji.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://tianji.msgbyte.com/ + +APP="Tianji" +var_tags="monitoring" +var_cpu="4" +var_ram="4096" +var_disk="12" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/tianji ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if command -v node >/dev/null; then + NODE_MAJOR=$(/usr/bin/env node -v | grep -oP '^v\K[0-9]+') + if [[ "$NODE_MAJOR" != "22" ]]; then + $STD apt-get purge -y nodejs + rm -f /etc/apt/sources.list.d/nodesource.list + rm -f /etc/apt/keyrings/nodesource.gpg + else + return + fi + fi + 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_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list + $STD apt-get update + $STD apt-get install -y nodejs + $STD npm install -g pnpm@9.7.1 + RELEASE=$(curl -fsSL 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 v${RELEASE}" + cd /opt + cp /opt/tianji/src/server/.env /opt/.env + mv /opt/tianji /opt/tianji_bak + curl -fsSL "https://github.com/msgbyte/tianji/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/msgbyte/tianji/archive/refs/tags/v${RELEASE}.zip") + unzip -q v${RELEASE}.zip + mv tianji-${RELEASE} /opt/tianji + cd tianji + export NODE_OPTIONS="--max_old_space_size=4096" + $STD pnpm install --filter @tianji/client... --config.dedupe-peer-dependents=false --frozen-lockfile + $STD pnpm build:static + $STD pnpm install --filter @tianji/server... --config.dedupe-peer-dependents=false + mkdir -p ./src/server/public + cp -r ./geo ./src/server/public + $STD pnpm build:server + mv /opt/.env /opt/tianji/src/server/.env + cd src/server + $STD pnpm db:migrate:apply + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to v${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 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}:12345${CL}" diff --git a/ct/traccar.sh b/ct/traccar.sh new file mode 100644 index 0000000..ef09e90 --- /dev/null +++ b/ct/traccar.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.traccar.org/ + +APP="Traccar" +var_tags="gps;tracker" +var_cpu="1" +var_ram="1024" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/traccar ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${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}:8082${CL}" \ No newline at end of file diff --git a/ct/traefik.sh b/ct/traefik.sh new file mode 100644 index 0000000..2f60c26 --- /dev/null +++ b/ct/traefik.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://traefik.io/ + +APP="Traefik" +var_tags="proxy" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSL 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 + curl -fsSL "https://github.com/traefik/traefik/releases/download/v${RELEASE}/traefik_v${RELEASE}_linux_amd64.tar.gz" -o $(basename "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 +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/transmission.sh b/ct/transmission.sh new file mode 100644 index 0000000..51ae893 --- /dev/null +++ b/ct/transmission.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://transmissionbt.com/ + +APP="Transmission" +var_tags="torrent" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:9091/transmission${CL}" \ No newline at end of file diff --git a/ct/trilium.sh b/ct/trilium.sh new file mode 100644 index 0000000..e3fe138 --- /dev/null +++ b/ct/trilium.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://triliumnext.github.io/Docs/ + +APP="Trilium" +var_tags="notes" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/trilium ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt; fi + RELEASE=$(curl -fsSL https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "v${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Stopping ${APP}" + systemctl stop trilium + sleep 1 + msg_ok "Stopped ${APP}" + + msg_info "Updating to ${RELEASE}" + mkdir -p /opt/trilium_backup + mv /opt/trilium/db /opt/trilium_backup/ + rm -rf /opt/trilium + cd /tmp + curl -fsSL "https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz" -o $(basename "https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz") + tar -xf TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz + mv TriliumNextNotes-Server-$RELEASE-linux-x64 /opt/trilium + cp -r /opt/trilium_backup/db /opt/trilium/ + echo "v${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated to ${RELEASE}" + + msg_info "Cleaning up" + rm -rf /tmp/TriliumNextNotes-Server-${RELEASE}-linux-x64.tar.xz + rm -rf /opt/trilium_backup + msg_ok "Cleaned" + + msg_info "Starting ${APP}" + systemctl start trilium + sleep 1 + 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}:8080${CL}" diff --git a/ct/typesense.sh b/ct/typesense.sh new file mode 100644 index 0000000..4bd695d --- /dev/null +++ b/ct/typesense.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tlissak | Co-Author MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://typesense.org/ + +APP="TypeSense" +var_tags="database" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/ubuntu.sh b/ct/ubuntu.sh new file mode 100644 index 0000000..9958d0d --- /dev/null +++ b/ct/ubuntu.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://ubuntu.com/ + +echo -e "Loading..." +APP="Ubuntu" +var_tags="os" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="ubuntu" +var_version="24.04" + +header_info "$APP" +variables +color +catch_errors + +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" + $STD apt-get update + $STD apt-get -y upgrade + 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}" \ No newline at end of file diff --git a/ct/umami.sh b/ct/umami.sh new file mode 100644 index 0000000..d333f05 --- /dev/null +++ b/ct/umami.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://umami.is/ + +APP="Umami" +var_tags="analytics" +var_cpu="2" +var_ram="2048" +var_disk="12" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 "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_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}:3000${CL}" \ No newline at end of file diff --git a/ct/umbrel.sh b/ct/umbrel.sh new file mode 100644 index 0000000..2ddb797 --- /dev/null +++ b/ct/umbrel.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://umbrel.com/ + +APP="Umbrel" +var_tags="os" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + 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! (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 0000000..f1c0632 --- /dev/null +++ b/ct/unbound.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: wimb0 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/NLnetLabs/unbound + +APP="Unbound" +var_tags="dns" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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" + $STD apt-get update + $STD apt-get -y upgrade + 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 new file mode 100644 index 0000000..861f33a --- /dev/null +++ b/ct/unifi.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://ui.com/download/unifi + +APP="Unifi" +var_tags="network;controller;unifi" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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}" + $STD apt-get update --allow-releaseinfo-change + $STD apt-get install -y unifi + 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}https://${IP}:8443${CL}" \ No newline at end of file diff --git a/ct/unmanic.sh b/ct/unmanic.sh new file mode 100644 index 0000000..929c3e5 --- /dev/null +++ b/ct/unmanic.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://docs.unmanic.app/ + +APP="Unmanic" +var_tags="file;media" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD pip3 install -U unmanic + $STD apt-get -y upgrade + 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}:8888${CL}" \ No newline at end of file diff --git a/ct/uptimekuma.sh b/ct/uptimekuma.sh new file mode 100644 index 0000000..93d5569 --- /dev/null +++ b/ct/uptimekuma.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://uptime.kuma.pet/ + +APP="Uptime Kuma" +var_tags="analytics;monitoring" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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..." + $STD apt-get install -y npm + echo "Installed NPM..." + fi + fi + LATEST=$(curl -fsSL https://api.github.com/repos/louislam/uptime-kuma/releases/latest | grep '"tag_name":' | cut -d'"' -f4) + msg_info "Stopping ${APP}" + $STD sudo systemctl stop uptime-kuma + msg_ok "Stopped ${APP}" + + cd /opt/uptime-kuma + + msg_info "Pulling ${APP} ${LATEST}" + $STD git fetch --all + $STD git checkout $LATEST --force + msg_ok "Pulled ${APP} ${LATEST}" + + msg_info "Updating ${APP} to ${LATEST}" + $STD npm install --production + $STD npm run download-dist + msg_ok "Updated ${APP}" + + msg_info "Starting ${APP}" + $STD sudo systemctl start uptime-kuma + msg_ok "Started ${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 URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3001${CL}" diff --git a/ct/urbackupserver.sh b/ct/urbackupserver.sh new file mode 100644 index 0000000..798b38c --- /dev/null +++ b/ct/urbackupserver.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Kristian Skov +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.urbackup.org/ + +APP="UrBackup Server" +var_tags="web" +var_cpu="1" +var_ram="1024" +var_disk="16" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /var/urbackup ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated Successfully" + exit +} + +start +build_container +description + +pct set $CTID -features fuse=1,nesting=1 +pct reboot $CTID + +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}:55414${CL}" \ No newline at end of file diff --git a/ct/vaultwarden.sh b/ct/vaultwarden.sh new file mode 100644 index 0000000..27b0a4a --- /dev/null +++ b/ct/vaultwarden.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/dani-garcia/vaultwarden + +APP="Vaultwarden" +var_tags="password-manager" +var_cpu="4" +var_ram="6144" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +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 -fsSL https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest | + grep "tag_name" | + awk '{print substr($2, 2, length($2)-3) }') + WVRELEASE=$(curl -fsSL https://api.github.com/repos/dani-garcia/bw_web_builds/releases/latest | + grep "tag_name" | + awk '{print substr($2, 2, length($2)-3) }') + + UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \ + "1" "VaultWarden $VAULT" ON \ + "2" "Web-Vault $WVRELEASE" OFF \ + "3" "Set Admin Token" OFF \ + 3>&1 1>&2 2>&3) + + if [ "$UPD" == "1" ]; then + msg_info "Stopping Vaultwarden" + systemctl stop vaultwarden.service + msg_ok "Stopped Vaultwarden" + + msg_info "Updating VaultWarden to $VAULT (Patience)" + cd ~ && rm -rf vaultwarden + $STD git clone https://github.com/dani-garcia/vaultwarden + cd vaultwarden + $STD cargo build --features "sqlite,mysql,postgresql" --release + DIR=/usr/bin/vaultwarden + if [ -d "$DIR" ]; then + cp target/release/vaultwarden /usr/bin/ + else + cp target/release/vaultwarden /opt/vaultwarden/bin/ + fi + msg_ok "Updated VaultWarden" + + msg_info "Cleaning up" + cd ~ && rm -rf vaultwarden + msg_ok "Cleaned" + + msg_info "Starting Vaultwarden" + systemctl start vaultwarden.service + msg_ok "Started Vaultwarden" + + msg_ok "$VAULT Update Successful" + exit + fi + if [ "$UPD" == "2" ]; then + msg_info "Stopping Vaultwarden" + systemctl stop vaultwarden.service + msg_ok "Stopped Vaultwarden" + + msg_info "Updating Web-Vault to $WVRELEASE" + $STD curl -fsSLO https://github.com/dani-garcia/bw_web_builds/releases/download/$WVRELEASE/bw_web_$WVRELEASE.tar.gz + $STD tar -zxf bw_web_$WVRELEASE.tar.gz -C /opt/vaultwarden/ + msg_ok "Updated Web-Vault" + + msg_info "Cleaning up" + rm bw_web_$WVRELEASE.tar.gz + msg_ok "Cleaned" + + msg_info "Starting Vaultwarden" + systemctl start vaultwarden.service + msg_ok "Started Vaultwarden" + msg_ok "$WVRELEASE Update Successful" + exit + fi + if [ "$UPD" == "3" ]; then + if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Set the ADMIN_TOKEN" 10 58 3>&1 1>&2 2>&3); then + if [[ -z "$NEWTOKEN" ]]; then exit; fi + if ! command -v argon2 >/dev/null 2>&1; then $STD apt-get install -y argon2; fi + TOKEN=$(echo -n ${NEWTOKEN} | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e) + sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env + if [[ -f /opt/vaultwarden/data/config.json ]]; then + sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json + fi + systemctl restart vaultwarden + fi + exit + 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}:8000${CL}" \ No newline at end of file diff --git a/ct/victoriametrics.sh b/ct/victoriametrics.sh new file mode 100644 index 0000000..1939b25 --- /dev/null +++ b/ct/victoriametrics.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/VictoriaMetrics/VictoriaMetrics + +APP="VictoriaMetrics" +var_tags="database" +var_cpu="2" +var_ram="2048" +var_disk="16" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/victoriametrics ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/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 victoriametrics + msg_ok "Stopped $APP" + + msg_info "Updating ${APP} to v${RELEASE}" + temp_dir=$(mktemp -d) + cd $temp_dir + curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/victoria-metrics-linux-amd64-v${RELEASE}.tar.gz" -o $(basename "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/victoria-metrics-linux-amd64-v${RELEASE}.tar.gz") + curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/vmutils-linux-amd64-v${RELEASE}.tar.gz" -o $(basename "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/vmutils-linux-amd64-v${RELEASE}.tar.gz") + find /opt/victoriametrics -maxdepth 1 -type f -executable -delete + tar -xf victoria-metrics-linux-amd64-v${RELEASE}.tar.gz -C /opt/victoriametrics + tar -xf vmutils-linux-amd64-v${RELEASE}.tar.gz -C /opt/victoriametrics + chmod +x /opt/victoriametrics/* + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start victoriametrics + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf $temp_dir + 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}:8428/vmui${CL}" diff --git a/ct/vikunja.sh b/ct/vikunja.sh new file mode 100644 index 0000000..1ccfbc4 --- /dev/null +++ b/ct/vikunja.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://vikunja.io/ + +APP="Vikunja" +var_tags="todo-app" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb" -o $(basename "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb") + export DEBIAN_FRONTEND=noninteractive + $STD dpkg -i vikunja-$RELEASE-amd64.deb + 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 new file mode 100644 index 0000000..4827a48 --- /dev/null +++ b/ct/wallos.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://wallosapp.com/ + +APP="Wallos" +var_tags="finance" +var_cpu="1" +var_ram="1024" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/wallos ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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 + curl -fsSL "https://github.com/ellite/Wallos/archive/refs/tags/v${RELEASE}.zip" -o $(basename "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 + $STD curl http://localhost/endpoints/db/migrate.php + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${APP}" + + 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 +} + +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/wastebin.sh b/ct/wastebin.sh new file mode 100644 index 0000000..cfe41ec --- /dev/null +++ b/ct/wastebin.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/matze/wastebin + +APP="Wastebin" +var_tags="file;code" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/wastebin ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + # Dirty-Fix 03/2025 for missing APP_version.txt on old installations, set to pre-latest release + msg_info "Running Migration" + if [[ ! -f /opt/${APP}_version.txt ]]; then + echo "2.7.1" >/opt/${APP}_version.txt + mkdir -p /opt/wastebin-data + cat </opt/wastebin-data/.env +WASTEBIN_DATABASE_PATH=/opt/wastebin-data/wastebin.db +WASTEBIN_CACHE_SIZE=1024 +WASTEBIN_HTTP_TIMEOUT=30 +WASTEBIN_SIGNING_KEY=$(openssl rand -hex 32) +WASTEBIN_PASTE_EXPIRATIONS=0,600,3600=d,86400,604800,2419200,29030400 +EOF + systemctl stop wastebin + cat </etc/systemd/system/wastebin.service +[Unit] +Description=Wastebin Service +After=network.target + +[Service] +WorkingDirectory=/opt/wastebin +ExecStart=/opt/wastebin/wastebin +EnvironmentFile=/opt/wastebin-data/.env + +[Install] +WantedBy=multi-user.target +EOF + systemctl daemon-reload + fi + msg_ok "Migration Done" + 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" + temp_file=$(mktemp) +curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.zip" -o "$temp_file" + unzip -o -q $temp_file + 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 "Cleaning Up" + rm -f $temp_file + msg_ok "Cleanup Completed" + 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}:8088${CL}" \ No newline at end of file diff --git a/ct/watcharr.sh b/ct/watcharr.sh new file mode 100644 index 0000000..973f577 --- /dev/null +++ b/ct/watcharr.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/sbondCo/Watcharr + +APP="Watcharr" +var_tags="media" +var_cpu="1" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/watcharr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/sbondCo/Watcharr/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 $APP" + + msg_info "Stopping $APP" + systemctl stop watcharr + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + temp_file=$(mktemp) + temp_folder=$(mktemp -d) + curl -fsSL "https://github.com/sbondCo/Watcharr/archive/refs/tags/v${RELEASE}.tar.gz" -o ""$temp_file"" + tar -xzf "$temp_file" -C "$temp_folder" + rm -f /opt/watcharr/server/watcharr + rm -rf /opt/watcharr/server/ui + cp -rf ${temp_folder}/Watcharr-${RELEASE}/* /opt/watcharr + cd /opt/watcharr + export GOOS=linux + $STD npm i + $STD npm run build + mv ./build ./server/ui + cd server + go mod download + go build -o ./watcharr + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start watcharr + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -f ${temp_file} + rm -rf ${temp_folder} + msg_ok "Cleanup Completed" + + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Update Successful" + 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}:3080${CL}" diff --git a/ct/watchyourlan.sh b/ct/watchyourlan.sh new file mode 100644 index 0000000..96fc580 --- /dev/null +++ b/ct/watchyourlan.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/aceberg/WatchYourLAN + +APP="WatchYourLAN" +var_tags="network" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 -fsSL https://api.github.com/repos/aceberg/WatchYourLAN/releases/latest | grep -o '"tag_name": *"[^"]*"' | cut -d '"' -f 4) + curl -fsSL "https://github.com/aceberg/WatchYourLAN/releases/download/$RELEASE/watchyourlan_${RELEASE}_linux_amd64.deb" -o $(basename "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 + msg_ok "Updated $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}:8840${CL}" diff --git a/ct/wavelog.sh b/ct/wavelog.sh new file mode 100644 index 0000000..cee59f2 --- /dev/null +++ b/ct/wavelog.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Don Locke (DonLocke) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.wavelog.org/ + +APP="Wavelog" +var_tags="radio-logging" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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 -fsSL 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 + curl -fsSL "https://github.com/wavelog/wavelog/archive/refs/tags/${RELEASE}.zip" -o $(basename "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}" diff --git a/ct/wazuh.sh b/ct/wazuh.sh new file mode 100644 index 0000000..18c34ea --- /dev/null +++ b/ct/wazuh.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2025 community-scripts ORG +# Author: Omar Minaya +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://wazuh.com/ + +APP="Wazuh" +var_tags="security;monitoring" +var_cpu="4" +var_ram="4096" +var_disk="18" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /lib/systemd/system/wazuh-manager.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + 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}:443${CL}" \ No newline at end of file diff --git a/ct/web-check.sh b/ct/web-check.sh new file mode 100644 index 0000000..f9a8391 --- /dev/null +++ b/ct/web-check.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Lissy93/web-check + +APP="web-check" +TAGS="network;analysis" +var_cpu="2" +var_ram="2048" +var_disk="12" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/web-check ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Currently we don't provide an update function for this ${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}:3000${CL}" \ No newline at end of file diff --git a/ct/wger.sh b/ct/wger.sh new file mode 100644 index 0000000..bcf8850 --- /dev/null +++ b/ct/wger.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/wger-project/wger + +APP="wger" +var_tags="management;fitness" +var_cpu="1" +var_ram="1024" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /home/wger ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/wger-project/wger/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 wger + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + temp_file=$(mktemp) + cd $temp_file +curl -fsSL "https://github.com/wger-project/wger/archive/refs/tags/$RELEASE.tar.gz" -o "$temp_file" + tar xzf $temp_file + cp -rf wger-$RELEASE/* /home/wger/src + cd /home/wger/src + python3 manage.py migrate &>/dev/null + yarn install &>/dev/null + yarn build:css:sass &>/dev/null + python3 manage.py collectstatic --noinput &>/dev/null + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start wger + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf $temp_file + msg_ok "Cleanup Completed" + + msg_ok "Update Successful" + 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/whisparr.sh b/ct/whisparr.sh new file mode 100644 index 0000000..ee19a45 --- /dev/null +++ b/ct/whisparr.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Whisparr/Whisparr + +APP="Whisparr" +var_tags="arr" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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}:6969${CL}" \ No newline at end of file diff --git a/ct/whoogle.sh b/ct/whoogle.sh new file mode 100644 index 0000000..cf0de94 --- /dev/null +++ b/ct/whoogle.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/benbusby/whoogle-search + +APP="Whoogle" +var_tags="network;seaching" +var_cpu="1" +var_ram="512" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD pip3 install whoogle-search --upgrade + systemctl restart whoogle.service + 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}:5000${CL}" \ No newline at end of file diff --git a/ct/wikijs.sh b/ct/wikijs.sh new file mode 100644 index 0000000..3f0bd72 --- /dev/null +++ b/ct/wikijs.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://js.wiki/ + +APP="Wikijs" +var_tags="wiki" +var_cpu="2" +var_ram="2048" +var_disk="10" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/wikijs ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/Requarks/wiki/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 "Verifying whether ${APP}' new release is v3.x+ and current install uses SQLite." + SQLITE_INSTALL=$([ -f /opt/wikijs/db.sqlite ] && echo "true" || echo "false") + if [[ "${SQLITE_INSTALL}" == "true" && "${RELEASE}" =~ ^3.* ]]; then + echo "SQLite is not supported in v3.x+, currently there is no update path availble." + exit + fi + msg_ok "There is an update path available for ${APP} to v${RELEASE}" + + msg_info "Stopping ${APP}" + systemctl stop wikijs + msg_ok "Stopped ${APP}" + + msg_info "Backing up Data" + mkdir /opt/wikijs-backup + $SQLITE_INSTALL && cp /opt/wikijs/db.sqlite /opt/wikijs-backup + cp -R /opt/wikijs/{config.yml,/data} /opt/wikijs-backup + msg_ok "Backed up Data" + + msg_info "Updating ${APP}" + rm -rf /opt/wikijs/* + cd /opt/wikijs + curl -fsSL "https://github.com/requarks/wiki/releases/download/v${RELEASE}/wiki-js.tar.gz" -o $(basename "https://github.com/requarks/wiki/releases/download/v${RELEASE}/wiki-js.tar.gz") + tar -xzf wiki-js.tar.gz + msg_ok "Updated ${APP}" + + msg_info "Restoring Data" + cp -R /opt/wikijs-backup/* /opt/wikijs + $SQLITE_INSTALL && $STD npm rebuild sqlite3 + msg_ok "Restored Data" + + msg_info "Starting ${APP}" + systemctl start wikijs + msg_ok "Started ${APP}" + + msg_info "Cleaning Up" + rm -rf /opt/wikijs/wiki-js.tar.gz + rm -rf /opt/wikijs-backup + msg_ok "Cleanup Completed" + 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}" diff --git a/ct/wireguard.sh b/ct/wireguard.sh new file mode 100644 index 0000000..0d1cc79 --- /dev/null +++ b/ct/wireguard.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.wireguard.com/ + +APP="Wireguard" +var_tags="network;vpn" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 + ./wgd.sh start + 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} 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/wordpress.sh b/ct/wordpress.sh new file mode 100644 index 0000000..8903524 --- /dev/null +++ b/ct/wordpress.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 communtiy-scripts ORG +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://wordpress.org/ + +## App Default Values +APP="Wordpress" +var_tags="blog;cms" +var_disk="5" +var_cpu="2" +var_ram="2048" +var_os="debian" +var_version="12" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /var/www/html/wordpress ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_error "Wordpress should be updated via the user interface." + 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/yt-dlp-webui.sh b/ct/yt-dlp-webui.sh new file mode 100644 index 0000000..e0a1db7 --- /dev/null +++ b/ct/yt-dlp-webui.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/marcopiovanello/yt-dlp-web-ui + +APP="yt-dlp-webui" +var_tags="downloads;yt-dlp" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /usr/local/bin/yt-dlp-webui ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + msg_info "Updating yt-dlp" + $STD yt-dlp -U + msg_ok "Updated yt-dlp" + RELEASE=$(curl -fsSL https://api.github.com/repos/marcopiovanello/yt-dlp-web-ui/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/yt-dlp-webui_version.txt)" ]] || [[ ! -f /opt/yt-dlp-webui_version.txt ]]; then + + msg_info "Stopping $APP" + systemctl stop yt-dlp-webui + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + rm -rf /usr/local/bin/yt-dlp-webui +curl -fsSL "https://github.com/marcopiovanello/yt-dlp-web-ui/releases/download/v${RELEASE}/yt-dlp-webui_linux-amd64" -o "/usr/local/bin/yt-dlp-webui" + chmod +x /usr/local/bin/yt-dlp-webui + msg_ok "Updated $APP LXC" + + msg_info "Starting $APP" + systemctl start yt-dlp-webui + 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}:3033${CL}" \ No newline at end of file diff --git a/ct/yunohost.sh b/ct/yunohost.sh new file mode 100644 index 0000000..54a6209 --- /dev/null +++ b/ct/yunohost.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://yunohost.org/ + +APP="YunoHost" +var_tags="os" +var_cpu="2" +var_ram="2048" +var_disk="20" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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" + $STD apt-get update + $STD apt-get -y upgrade + 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/zabbix.sh b/ct/zabbix.sh new file mode 100644 index 0000000..79b19e7 --- /dev/null +++ b/ct/zabbix.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.zabbix.com/ + +APP="Zabbix" +var_tags="monitoring" +var_cpu="2" +var_ram="4096" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + 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 || exit + curl -fsSL "$(curl -fsSL https://repo.zabbix.com/zabbix/ | + grep -oP '(?<=href=")[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1 | + xargs -I{} echo "https://repo.zabbix.com/zabbix/{}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian12_all.deb")" \ + -o /tmp/zabbix-release_latest+debian12_all.deb + $STD dpkg -i zabbix-release_latest+debian12_all.deb + $STD apt-get update + $STD apt-get install --only-upgrade zabbix-server-pgsql zabbix-frontend-php zabbix-agent2 zabbix-agent2-plugin-* + + 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 +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}/zabbix${CL}" diff --git a/ct/zammad.sh b/ct/zammad.sh new file mode 100644 index 0000000..a39b637 --- /dev/null +++ b/ct/zammad.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Michel Roegl-Brunner (michelroegl-brunner) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://zammad.com + +APP="Zammad" +var_tags="webserver;ticket-system" +var_disk="8" +var_cpu="2" +var_ram="4096" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +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" + $STD systemctl stop zammad + msg_info "Updating ${APP}" + $STD apt-get update + $STD apt-mark hold zammad + $STD apt-get -y upgrade + $STD apt-mark unhold zammad + $STD apt-get -y upgrade + msg_info "Starting Service" + $STD systemctl start zammad + 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/zerotier-one.sh b/ct/zerotier-one.sh new file mode 100644 index 0000000..d9f104e --- /dev/null +++ b/ct/zerotier-one.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.zerotier.com/ + +APP="Zerotier-One" +var_tags="networking" +var_cpu="1" +var_ram="512" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /usr/sbin/zerotier-one ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Stopping Service" + systemctl stop zerotier-one + msg_ok "Stopping Service" + msg_info "Updating ${APP}" + $STD apt-get update + apt-get -y upgrade + msg_ok "Updated ${APP}" + + msg_info "Starting Service" + systemctl start zerotier-one + msg_ok "Started Service" + 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}https://${IP}:3443${CL}" \ No newline at end of file diff --git a/ct/zigbee2mqtt.sh b/ct/zigbee2mqtt.sh new file mode 100644 index 0000000..1bdca54 --- /dev/null +++ b/ct/zigbee2mqtt.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.zigbee2mqtt.io/ + +APP="Zigbee2MQTT" +var_tags="smarthome;zigbee;mqtt" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/zigbee2mqtt ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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 "Updating pnpm" + $STD npm install -g pnpm@10.4.1 + msg_ok "Updated pnpm" + + msg_info "Creating Backup" + rm -rf /opt/${APP}_backup*.tar.gz + mkdir -p /opt/z2m_backup + $STD tar -czf /opt/z2m_backup/${APP}_backup_$(date +%Y%m%d%H%M%S).tar.gz -C /opt zigbee2mqtt + mv /opt/zigbee2mqtt/data /opt/z2m_backup + msg_ok "Backup Created" + + msg_info "Updating ${APP} to v${RELEASE}" + cd /opt + curl -fsSL "https://github.com/Koenkk/zigbee2mqtt/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/Koenkk/zigbee2mqtt/archive/refs/tags/${RELEASE}.zip") + unzip -q ${RELEASE}.zip + rm -rf /opt/zigbee2mqtt + mv zigbee2mqtt-${RELEASE} /opt/zigbee2mqtt + rm -rf /opt/zigbee2mqtt/data + mv /opt/z2m_backup/data /opt/zigbee2mqtt + cd /opt/zigbee2mqtt + $STD pnpm install --frozen-lockfile + $STD pnpm build + msg_ok "Updated Zigbee2MQTT" + + msg_info "Starting Service" + systemctl start zigbee2mqtt + msg_ok "Started Service" + + msg_info "Cleaning up" + rm -rf /opt/z2m_backup + rm -rf /opt/${RELEASE}.zip + msg_ok "Cleaned up" + echo "${RELEASE}" >/opt/${APP}_version.txt + 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}:9442${CL}" diff --git a/ct/zipline.sh b/ct/zipline.sh new file mode 100644 index 0000000..a453b98 --- /dev/null +++ b/ct/zipline.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://zipline.diced.sh/ + +APP="Zipline" +var_tags="file;sharing" +var_cpu="2" +var_ram="2048" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/zipline ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if ! command -v pnpm &>/dev/null; then + msg_info "Installing pnpm" + #export NODE_OPTIONS=--openssl-legacy-provider + $STD npm install -g pnpm@latest + msg_ok "Installed pnpm" + fi + RELEASE=$(curl -fsSL 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 + curl -fsSL "https://github.com/diced/zipline/archive/refs/tags/v${RELEASE}.zip" -o $(basename "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 + $STD pnpm install + $STD pnpm build + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated ${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 +} + +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/zitadel.sh b/ct/zitadel.sh new file mode 100644 index 0000000..2b0b2ef --- /dev/null +++ b/ct/zitadel.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: dave-yap (dave-yap) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://zitadel.com/ + +APP="Zitadel" +var_tags="identity-provider" +var_cpu="1" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/zitadel.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/zitadel/zitadel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt | grep -oP '\d+\.\d+\.\d+')" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Stopping $APP" + systemctl stop zitadel + msg_ok "Stopped $APP" + + msg_info "Updating $APP to ${RELEASE}" + cd /tmp || exit + curl -fsSL "https://github.com/zitadel/zitadel/releases/download/v$RELEASE/zitadel-linux-amd64.tar.gz" | tar -xz + mv zitadel-linux-amd64/zitadel /usr/local/bin + $STD zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml --init-projections=true + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Starting $APP" + systemctl start zitadel + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -rf /tmp/zitadel-linux-amd64 + msg_ok "Cleanup Completed" + msg_ok "Update Successful" + 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}:8080/ui/console${CL}" diff --git a/ct/zoraxy.sh b/ct/zoraxy.sh new file mode 100644 index 0000000..abd4395 --- /dev/null +++ b/ct/zoraxy.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://zoraxy.aroz.org/ + +APP="Zoraxy" +var_tags="network" +var_cpu="2" +var_ram="2048" +var_disk="6" +var_os="debian" +var_version="12" +var_unprivileged="1" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/zoraxy/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL 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 + curl -fsSL "https://github.com/tobychui/zoraxy/releases/download/${RELEASE}/zoraxy_linux_amd64" -o $(basename "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 +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}:8000${CL}" diff --git a/ct/zwave-js-ui.sh b/ct/zwave-js-ui.sh new file mode 100644 index 0000000..f7ea123 --- /dev/null +++ b/ct/zwave-js-ui.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://zwave-js.github.io/zwave-js-ui/#/ + +APP="Zwave-JS-UI" +var_tags="smarthome;zwave" +var_cpu="2" +var_ram="1024" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="0" + +header_info "$APP" +variables +color +catch_errors + +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 -fsSL https://api.github.com/repos/zwave-js/zwave-js-ui/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 zwave-js-ui + msg_ok "Stopped Service" + + msg_info "Updating Z-Wave JS UI" + rm -rf /opt/zwave-js-ui/* + cd /opt/zwave-js-ui + curl -fsSL "https://github.com/zwave-js/zwave-js-ui/releases/download/${RELEASE}/zwave-js-ui-${RELEASE}-linux.zip" -o $(basename "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 Service" + systemctl start zwave-js-ui + msg_ok "Started Service" + + 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 +} + +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}:8091${CL}" diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json new file mode 100644 index 0000000..32ef36a --- /dev/null +++ b/frontend/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "extends": ["next/core-web-vitals"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"] +} diff --git a/frontend/.prettierignore b/frontend/.prettierignore new file mode 100644 index 0000000..3aea320 --- /dev/null +++ b/frontend/.prettierignore @@ -0,0 +1,5 @@ +dist +node_modules +.next +build +.contentlayer \ No newline at end of file diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 0000000..490e839 --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1,3 @@ +{ + "plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-organize-imports"] +} diff --git a/frontend/LICENSE b/frontend/LICENSE new file mode 100644 index 0000000..83fb1d4 --- /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 0000000..380285b --- /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 0000000..108da03 --- /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 0000000..cedcbd1 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,10226 @@ +{ + "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.2.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-tooltip": "^1.1.8", + "@tanstack/react-query": "^5.71.1", + "chart.js": "^4.4.8", + "chartjs-plugin-datalabels": "^2.2.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "date-fns": "^4.1.0", + "framer-motion": "^11.18.2", + "fuse.js": "^7.1.0", + "lucide-react": "^0.453.0", + "mini-svg-data-uri": "^1.4.4", + "next": "15.2.4", + "next-themes": "^0.3.0", + "nuqs": "^2.4.1", + "pocketbase": "^0.21.5", + "prettier-plugin-organize-imports": "^4.1.0", + "react": "19.0.0", + "react-chartjs-2": "^5.3.0", + "react-code-blocks": "^0.1.6", + "react-datepicker": "^7.6.0", + "react-day-picker": "8.10.1", + "react-dom": "19.0.0", + "react-icons": "^5.5.0", + "react-simple-typewriter": "^5.0.1", + "sharp": "^0.33.5", + "simple-icons": "^13.21.0", + "sonner": "^1.7.4", + "tailwind-merge": "^2.6.0", + "zod": "^3.24.2" + }, + "devDependencies": { + "@tanstack/eslint-plugin-query": "^5.68.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.2.0", + "@types/node": "^22.13.16", + "@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.29.0", + "@typescript-eslint/parser": "^8.29.0", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.23.0", + "eslint-config-next": "15.0.2", + "jsdom": "^25.0.1", + "postcss": "^8.5.3", + "prettier": "^3.5.3", + "prettier-plugin-tailwindcss": "^0.6.11", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "tailwindcss-animated": "^1.1.2", + "typescript": "^5.8.2", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.1.1" + } + }, + "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.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.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.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "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.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "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.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "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.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "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/config-helpers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", + "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "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.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "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.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.12.0", + "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.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "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/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@next/env": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.4.tgz", + "integrity": "sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==", + "license": "MIT" + }, + "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.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.4.tgz", + "integrity": "sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.4.tgz", + "integrity": "sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.4.tgz", + "integrity": "sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.4.tgz", + "integrity": "sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.4.tgz", + "integrity": "sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.4.tgz", + "integrity": "sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.4.tgz", + "integrity": "sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.4.tgz", + "integrity": "sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz", + "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.3.tgz", + "integrity": "sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collapsible": "1.1.3", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@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.2", + "@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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.2.tgz", + "integrity": "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2" + }, + "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.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.3.tgz", + "integrity": "sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.2.tgz", + "integrity": "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2" + }, + "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-compose-refs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz", + "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==", + "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.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.6.tgz", + "integrity": "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "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.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz", + "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@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.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.6.tgz", + "integrity": "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.6", + "@radix-ui/react-primitive": "2.0.2", + "@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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz", + "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", + "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", + "license": "MIT", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.2.tgz", + "integrity": "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2" + }, + "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.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.6.tgz", + "integrity": "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-roving-focus": "1.1.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "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.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.5.tgz", + "integrity": "sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@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.2" + }, + "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.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.6.tgz", + "integrity": "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz", + "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@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-portal": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz", + "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2", + "@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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz", + "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1", + "@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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz", + "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.1.2" + }, + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz", + "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@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.2", + "@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-select": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.6.tgz", + "integrity": "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-collection": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.2", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@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.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.2.tgz", + "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2" + }, + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "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.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.3.tgz", + "integrity": "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@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.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz", + "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@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.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-roving-focus": "1.1.2", + "@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.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz", + "integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.5", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.2", + "@radix-ui/react-portal": "1.1.4", + "@radix-ui/react-presence": "1.1.2", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-slot": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.2" + }, + "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.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz", + "integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2" + }, + "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.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", + "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", + "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", + "integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", + "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz", + "integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz", + "integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz", + "integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz", + "integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz", + "integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz", + "integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz", + "integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz", + "integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz", + "integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz", + "integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz", + "integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", + "integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz", + "integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz", + "integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz", + "integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz", + "integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==", + "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/@tanstack/eslint-plugin-query": { + "version": "5.68.0", + "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.68.0.tgz", + "integrity": "sha512-w/+y5LILV1GTWBB2R/lKfUzgocKXU1B7O6jipLUJhmxCKPmJFy5zpfR1Vx7c6yCEsQoKcTbhuR/tIy+1sIGaiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.18.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.71.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.71.1.tgz", + "integrity": "sha512-4+ZswCHOfJX+ikhXNoocamTUmJcHtB+Ljjz/oJkC7/eKB5IrzEwR4vEwZUENiPi+wISucJHR5TUbuuJ26w3kdQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.71.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.71.1.tgz", + "integrity": "sha512-6BTkaSIGT58MroI4kIGXNdx/NhirXPU+75AJObLq+WBa39WmoxhzSk0YX+hqWJ/bvqZJFxslbEU4qIHaRZq+8Q==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.71.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.2.0.tgz", + "integrity": "sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==", + "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 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.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.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "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.13.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.16.tgz", + "integrity": "sha512-15tM+qA4Ypml/N7kyRdvfRjBQT2RL461uF1Bldn06K0Nzn1lY3nAPgHlsVrJxdZ9WhZiW0Fmc1lOYMtDsAuB3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "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==", + "dev": 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==", + "dev": 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.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz", + "integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/type-utils": "8.29.0", + "@typescript-eslint/utils": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz", + "integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/typescript-estree": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", + "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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz", + "integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0" + }, + "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.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz", + "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.29.0", + "@typescript-eslint/utils": "8.29.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", + "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", + "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.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz", + "integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/visitor-keys": "8.29.0", + "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": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz", + "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.29.0", + "@typescript-eslint/types": "8.29.0", + "@typescript-eslint/typescript-estree": "8.29.0" + }, + "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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz", + "integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/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/@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": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", + "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", + "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.1.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "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": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", + "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", + "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.1.1", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", + "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", + "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.1", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "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.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "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/chart.js": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz", + "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chartjs-plugin-datalabels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", + "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==", + "license": "MIT", + "peerDependencies": { + "chart.js": ">=3.0.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.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.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "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.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "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.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "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.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "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.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.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" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "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/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", + "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", + "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.18.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "license": "MIT", + "dependencies": { + "motion-dom": "^11.18.1", + "motion-utils": "^11.18.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.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.1.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", + "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", + "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.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "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/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==", + "dev": true, + "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": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "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.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "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/motion-dom": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^11.18.1" + } + }, + "node_modules/motion-utils": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", + "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.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-15.2.4.tgz", + "integrity": "sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==", + "license": "MIT", + "dependencies": { + "@next/env": "15.2.4", + "@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.2.4", + "@next/swc-darwin-x64": "15.2.4", + "@next/swc-linux-arm64-gnu": "15.2.4", + "@next/swc-linux-arm64-musl": "15.2.4", + "@next/swc-linux-x64-gnu": "15.2.4", + "@next/swc-linux-x64-musl": "15.2.4", + "@next/swc-win32-arm64-msvc": "15.2.4", + "@next/swc-win32-x64-msvc": "15.2.4", + "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.4.1", + "resolved": "https://registry.npmjs.org/nuqs/-/nuqs-2.4.1.tgz", + "integrity": "sha512-u6sngTspqDe3jWHtcmqHQg3dl35niizCZAsm5gy7PBlgG2rwl71Dp2QUv5hwBaWKI9qz0wqILZY86TsRxq66SQ==", + "license": "MIT", + "dependencies": { + "mitt": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/franky47" + }, + "peerDependencies": { + "@remix-run/react": ">=2", + "next": ">=14.2.0", + "react": ">=18.2.0 || ^19.0.0-0", + "react-router": "^6 || ^7", + "react-router-dom": "^6 || ^7" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "next": { + "optional": true + }, + "react-router": { + "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": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "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.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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.8", + "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-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.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "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.11", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.11.tgz", + "integrity": "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==", + "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": "*", + "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": { + "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.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "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", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz", + "integrity": "sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.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-datepicker": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.6.0.tgz", + "integrity": "sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.27.0", + "clsx": "^2.1.1", + "date-fns": "^3.6.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/react-datepicker/node_modules/@floating-ui/react": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.3.tgz", + "integrity": "sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.9", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/react-datepicker/node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "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", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "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.3", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz", + "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.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.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "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.38.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz", + "integrity": "sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.38.0", + "@rollup/rollup-android-arm64": "4.38.0", + "@rollup/rollup-darwin-arm64": "4.38.0", + "@rollup/rollup-darwin-x64": "4.38.0", + "@rollup/rollup-freebsd-arm64": "4.38.0", + "@rollup/rollup-freebsd-x64": "4.38.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.38.0", + "@rollup/rollup-linux-arm-musleabihf": "4.38.0", + "@rollup/rollup-linux-arm64-gnu": "4.38.0", + "@rollup/rollup-linux-arm64-musl": "4.38.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.38.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.38.0", + "@rollup/rollup-linux-riscv64-gnu": "4.38.0", + "@rollup/rollup-linux-riscv64-musl": "4.38.0", + "@rollup/rollup-linux-s390x-gnu": "4.38.0", + "@rollup/rollup-linux-x64-gnu": "4.38.0", + "@rollup/rollup-linux-x64-musl": "4.38.0", + "@rollup/rollup-win32-arm64-msvc": "4.38.0", + "@rollup/rollup-win32-ia32-msvc": "4.38.0", + "@rollup/rollup-win32-x64-msvc": "4.38.0", + "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", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "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/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.21.0", + "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-13.21.0.tgz", + "integrity": "sha512-LI5pVJPBv6oc79OMsffwb6kEqnmB8P1Cjg1crNUlhsxPETQ5UzbCKQdxU+7MW6+DD1qfPkla/vSKlLD4IfyXpQ==", + "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.7.4", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz", + "integrity": "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "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/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, + "node_modules/tailwind-merge": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", + "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.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/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.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "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.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "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.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", + "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "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": "3.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", + "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "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.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", + "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", + "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": "3.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", + "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.1.1", + "@vitest/mocker": "3.1.1", + "@vitest/pretty-format": "^3.1.1", + "@vitest/runner": "3.1.1", + "@vitest/snapshot": "3.1.1", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.2.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.1", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.1", + "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/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.1.1", + "@vitest/ui": "3.1.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "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.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..50379a3 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,93 @@ +{ + "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.2.3", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-tooltip": "^1.1.8", + "@tanstack/react-query": "^5.71.1", + "chart.js": "^4.4.8", + "chartjs-plugin-datalabels": "^2.2.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "date-fns": "^4.1.0", + "framer-motion": "^11.18.2", + "fuse.js": "^7.1.0", + "lucide-react": "^0.453.0", + "mini-svg-data-uri": "^1.4.4", + "next": "15.2.4", + "next-themes": "^0.3.0", + "nuqs": "^2.4.1", + "pocketbase": "^0.21.5", + "prettier-plugin-organize-imports": "^4.1.0", + "react": "19.0.0", + "react-chartjs-2": "^5.3.0", + "react-code-blocks": "^0.1.6", + "react-datepicker": "^7.6.0", + "react-day-picker": "8.10.1", + "react-dom": "19.0.0", + "react-icons": "^5.5.0", + "react-simple-typewriter": "^5.0.1", + "sharp": "^0.33.5", + "simple-icons": "^13.21.0", + "sonner": "^1.7.4", + "tailwind-merge": "^2.6.0", + "zod": "^3.24.2" + }, + "devDependencies": { + "@tanstack/eslint-plugin-query": "^5.68.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.2.0", + "@types/node": "^22.13.16", + "@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.29.0", + "@typescript-eslint/parser": "^8.29.0", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.23.0", + "eslint-config-next": "15.0.2", + "jsdom": "^25.0.1", + "postcss": "^8.5.3", + "prettier": "^3.5.3", + "prettier-plugin-tailwindcss": "^0.6.11", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "tailwindcss-animated": "^1.1.2", + "typescript": "^5.8.2", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.1.1" + }, + "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 0000000..1a69fd2 --- /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 0000000..4aac77d Binary files /dev/null and b/frontend/public/defaultimg.png differ diff --git a/frontend/public/json/2fauth.json b/frontend/public/json/2fauth.json new file mode 100644 index 0000000..4989ac9 --- /dev/null +++ b/frontend/public/json/2fauth.json @@ -0,0 +1,43 @@ +{ + "name": "2FAuth", + "slug": "2fauth", + "categories": [ + 6 + ], + "date_created": "2024-12-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://docs.2fauth.app/", + "logo": "https://raw.githubusercontent.com/Bubka/2FAuth/refs/heads/master/public/logo.svg", + "description": "2FAuth is a web based self-hosted alternative to One Time Passcode (OTP) generators like Google Authenticator, designed for both mobile and desktop. It aims to ease you perform your 2FA authentication steps whatever the device you handle, with a clean and suitable interface.", + "install_methods": [ + { + "type": "default", + "script": "ct/2fauth.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Database credentials: `cat ~/2FAuth.creds`", + "type": "info" + }, + { + "text": "The very first account created is automatically set up as an administrator account.", + "type": "info" + } + ] + } \ No newline at end of file diff --git a/frontend/public/json/actualbudget.json b/frontend/public/json/actualbudget.json new file mode 100644 index 0000000..d364d44 --- /dev/null +++ b/frontend/public/json/actualbudget.json @@ -0,0 +1,34 @@ +{ + "name": "Actual Budget", + "slug": "actualbudget", + "categories": [ + 23 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5006, + "documentation": "https://github.com/community-scripts/ProxmoxVE/discussions/807", + "website": "https://actualbudget.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/actual-budget.svg", + "description": "Actual Budget is a super fast and privacy-focused app for managing your finances. At its heart is the well proven and much loved Envelope Budgeting methodology.", + "install_methods": [ + { + "type": "default", + "script": "ct/actualbudget.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/add-lxc-iptag.json b/frontend/public/json/add-lxc-iptag.json new file mode 100644 index 0000000..ff19bcb --- /dev/null +++ b/frontend/public/json/add-lxc-iptag.json @@ -0,0 +1,47 @@ +{ + "name": "Proxmox VE LXC IP-Tag", + "slug": "add-lxc-iptag", + "categories": [ + 1 + ], + "date_created": "2024-12-16", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "This script automatically adds IP address as tags to LXC containers using a Systemd service. The service also updates the tags if a LXC IP address is changed.", + "install_methods": [ + { + "type": "default", + "script": "misc/add-lxc-iptag.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + }, + { + "text": "Configuration: `nano /opt/lxc-iptag/iptag.conf`. iptag.service must be restarted after change.", + "type": "info" + }, + { + "text": "The Proxmox Node must contain ipcalc and net-tools. `apt-get install -y ipcalc net-tools`", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/add-netbird-lxc.json b/frontend/public/json/add-netbird-lxc.json new file mode 100644 index 0000000..b924bc6 --- /dev/null +++ b/frontend/public/json/add-netbird-lxc.json @@ -0,0 +1,47 @@ +{ + "name": "NetBird", + "slug": "add-netbird-lxc", + "categories": [ + 1 + ], + "date_created": "2024-05-19", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": "https://docs.netbird.io/", + "website": "https://netbird.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/netbird.svg", + "description": "NetBird combines a configuration-free peer-to-peer private network and a centralized access control system in a single platform, making it easy to create secure private networks for your organization or home.", + "install_methods": [ + { + "type": "default", + "script": "misc/add-netbird-lxc.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After the script finishes, reboot the LXC then run `netbird up` in the LXC console", + "type": "info" + }, + { + "text": "Execute within the Proxmox main shell", + "type": "info" + }, + { + "text": "The script only works in Debian/Ubuntu, not in Alpine!", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/add-tailscale-lxc.json b/frontend/public/json/add-tailscale-lxc.json new file mode 100644 index 0000000..82d9b55 --- /dev/null +++ b/frontend/public/json/add-tailscale-lxc.json @@ -0,0 +1,47 @@ +{ + "name": "Tailscale", + "slug": "add-tailscale-lxc", + "categories": [ + 1 + ], + "date_created": "2024-05-02", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://tailscale.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/tailscale.svg", + "description": "Tailscale is a software-defined networking solution that enables secure communication between devices over the internet. It creates a virtual private network (VPN) that enables devices to communicate with each other as if they were on the same local network. Tailscale works even when the devices are separated by firewalls or subnets, and provides secure and encrypted communication between devices. With Tailscale, users can connect devices, servers, computers, and cloud instances to create a secure network, making it easier to manage and control access to resources. Tailscale is designed to be easy to set up and use, providing a streamlined solution for secure communication between devices over the internet.", + "install_methods": [ + { + "type": "default", + "script": "misc/add-tailscale-lxc.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Only supported on Debian 12 LXCs", + "type": "warning" + }, + { + "text": "After the script finishes, reboot the LXC then run `tailscale up` in the LXC console", + "type": "info" + }, + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} diff --git a/frontend/public/json/adguard.json b/frontend/public/json/adguard.json new file mode 100644 index 0000000..f91416c --- /dev/null +++ b/frontend/public/json/adguard.json @@ -0,0 +1,39 @@ +{ + "name": "AdGuard Home", + "slug": "adguard", + "categories": [ + 5 + ], + "date_created": "2024-04-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started", + "website": "https://adguard.com/en/adguard-home/overview.html", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/adguard-home.svg", + "description": "AdGuard Home is an open-source, self-hosted network-wide ad blocker. It blocks advertisements, trackers, phishing and malware websites, and provides protection against online threats. AdGuard Home is a DNS-based solution, which means it blocks ads and malicious content at the network level, before it even reaches your device. It runs on your home network and can be easily configured and managed through a web-based interface. It provides detailed statistics and logs, allowing you to see which websites are being blocked, and why. AdGuard Home is designed to be fast, lightweight, and easy to use, making it an ideal solution for home users who want to block ads, protect their privacy, and improve the speed and security of their online experience.", + "install_methods": [ + { + "type": "default", + "script": "ct/adguard.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Adguard Home can be updated via the user interface.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/adventurelog.json b/frontend/public/json/adventurelog.json new file mode 100644 index 0000000..b579800 --- /dev/null +++ b/frontend/public/json/adventurelog.json @@ -0,0 +1,39 @@ +{ + "name": "AdventureLog", + "slug": "adventurelog", + "categories": [ + 24 + ], + "date_created": "2024-10-26", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://adventurelog.app/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/adventurelog.svg", + "description": "Adventure Log is an app designed to track outdoor activities and personal achievements, allowing users to log their adventures with photos, notes, and location data. It focuses on enhancing outdoor experiences by preserving memories and sharing them with others.", + "install_methods": [ + { + "type": "default", + "script": "ct/adventurelog.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "AdventureLog uses an initial local IP, if you change your LXC-IP, you need to change the IP here: `/opt/adventurelog/backend/server/.env` and here: `/opt/adventurelog/frontend/.env`", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/agentdvr.json b/frontend/public/json/agentdvr.json new file mode 100644 index 0000000..7fbc19b --- /dev/null +++ b/frontend/public/json/agentdvr.json @@ -0,0 +1,34 @@ +{ + "name": "AgentDVR", + "slug": "agentdvr", + "categories": [ + 15 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": true, + "interface_port": 8090, + "documentation": null, + "website": "https://www.ispyconnect.com/", + "logo": "https://ispycontent.azureedge.net/img/ispy2.png?raw=true", + "description": "AgentDVR a new video surveillance solution for the Internet Of Things.", + "install_methods": [ + { + "type": "default", + "script": "ct/agentdvr.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "ubuntu", + "version": "22.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/all-templates.json b/frontend/public/json/all-templates.json new file mode 100644 index 0000000..da695ce --- /dev/null +++ b/frontend/public/json/all-templates.json @@ -0,0 +1,39 @@ +{ + "name": "All Templates", + "slug": "all-templates", + "categories": [ + 1 + ], + "date_created": "2024-05-02", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/proxmox.svg", + "description": "A script designed to allow for the creation of one of the many free LXC templates. Great for creating system LXCs.\r\nThe script creates a `*.creds` file in the Proxmox root directory with the password of the newly created LXC.\r\nPlease take note that if you plan to use this script for creating TurnKey LXCs, you'll need to modify the hostname after creation.", + "install_methods": [ + { + "type": "default", + "script": "misc/all-templates.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Resource and network settings are adjustable post LXC creation.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/alpine-it-tools.json b/frontend/public/json/alpine-it-tools.json new file mode 100644 index 0000000..91c042a --- /dev/null +++ b/frontend/public/json/alpine-it-tools.json @@ -0,0 +1,45 @@ +{ + "name": "Alpine-IT-Tools", + "slug": "alpine-it-tools", + "categories": [ + 20 + ], + "date_created": "2025-01-30", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://it-tools.tech/", + "logo": "https://raw.githubusercontent.com/CorentinTh/it-tools/08d977b8cdb7ffb76adfa18ba6eb4b73795ec814/public/safari-pinned-tab.svg", + "description": "IT-Tools is a web-based suite of utilities designed to streamline and simplify various IT tasks, providing tools for developers and system administrators to manage their workflows efficiently.", + "install_methods": [ + { + "type": "default", + "script": "ct/alpine-it-tools.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 0.2, + "os": "alpine", + "version": "3.21" + } + }, + { + "type": "alpine", + "script": "ct/alpine-it-tools.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 0.2, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/alpine.json b/frontend/public/json/alpine.json new file mode 100644 index 0000000..ee78856 --- /dev/null +++ b/frontend/public/json/alpine.json @@ -0,0 +1,50 @@ +{ + "name": "Alpine", + "slug": "alpine", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.alpinelinux.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/alpinelinux.svg", + "description": "A security-oriented, lightweight Linux distribution based on musl and BusyBox.\r\nBy default, the root password is set to alpine. If you choose to use advanced settings, you will need to define a password, autologin is currently unavailable.", + "install_methods": [ + { + "type": "default", + "script": "ct/alpine.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 0.1, + "os": "alpine", + "version": "3.21" + } + }, + { + "type": "alpine", + "script": "ct/alpine.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 0.1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": "alpine" + }, + "notes": [ + { + "text": "To Update Alpine: `apk update && apk upgrade`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/apache-cassandra.json b/frontend/public/json/apache-cassandra.json new file mode 100644 index 0000000..6b9969a --- /dev/null +++ b/frontend/public/json/apache-cassandra.json @@ -0,0 +1,39 @@ +{ + "name": "Apache-Cassandra", + "slug": "apache-cassandra", + "categories": [ + 8 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://cassandra.apache.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/apachecassandra.svg", + "description": "Apache-Cassandra is an open source NoSQL distributed database trusted by thousands of companies for scalability and high availability without compromising performance.", + "install_methods": [ + { + "type": "default", + "script": "ct/apache-cassandra.sh", + "resources": { + "cpu": 1, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Apache-Cassandra Configuration: `nano /etc/cassandra/cassandra.yaml`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/apache-couchdb.json b/frontend/public/json/apache-couchdb.json new file mode 100644 index 0000000..58471e8 --- /dev/null +++ b/frontend/public/json/apache-couchdb.json @@ -0,0 +1,39 @@ +{ + "name": "Apache-CouchDB", + "slug": "apache-couchdb", + "categories": [ + 8 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 5984, + "documentation": null, + "website": "https://couchdb.apache.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/couchdb.svg", + "description": "Apache-CouchDB Seamless multi-master sync, that scales from Big Data to Mobile, with an Intuitive HTTP/JSON API and designed for Reliability.", + "install_methods": [ + { + "type": "default", + "script": "ct/apache-couchdb.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Show Login Credentials: `cat CouchDB.creds`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/apache-guacamole.json b/frontend/public/json/apache-guacamole.json new file mode 100644 index 0000000..408eb64 --- /dev/null +++ b/frontend/public/json/apache-guacamole.json @@ -0,0 +1,34 @@ +{ + "name": "Apache Guacamole", + "slug": "apache-guacamole", + "categories": [ + 0 + ], + "date_created": "2024-12-19", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://guacamole.apache.org/", + "logo": "https://guacamole.apache.org/images/logos/guac-tricolor-logo.svg", + "description": "Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.", + "install_methods": [ + { + "type": "default", + "script": "ct/apache-guacamole.sh", + "resources": { + "cpu": 1, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "guacadmin", + "password": "guacadmin" + }, + "notes": [] +} diff --git a/frontend/public/json/apache-tika.json b/frontend/public/json/apache-tika.json new file mode 100644 index 0000000..3bdea05 --- /dev/null +++ b/frontend/public/json/apache-tika.json @@ -0,0 +1,34 @@ +{ + "name": "Apache Tika", + "slug": "apache-tika", + "categories": [ + 12 + ], + "date_created": "2025-02-05", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9998, + "documentation": null, + "website": "https://tika.apache.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/apache-tika.svg", + "description": "The Apache Tika™ toolkit detects and extracts metadata and text from over a thousand different file types (such as PPT, XLS, and PDF). All of these file types can be parsed through a single interface, making Tika useful for search engine indexing, content analysis, translation, and much more.", + "install_methods": [ + { + "type": "default", + "script": "ct/apache-tika.sh", + "resources": { + "cpu": 1, + "ram": 2024, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/apache-tomcat.json b/frontend/public/json/apache-tomcat.json new file mode 100644 index 0000000..3003b76 --- /dev/null +++ b/frontend/public/json/apache-tomcat.json @@ -0,0 +1,39 @@ +{ + "name": "Apache Tomcat", + "slug": "apache-tomcat", + "categories": [ + 10 + ], + "date_created": "2025-03-04", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8080, + "documentation": "https://cwiki.apache.org/confluence/display/TOMCAT", + "website": "https://tomcat.apache.org/", + "logo": "https://upload.wikimedia.org/wikipedia/commons/f/fe/Apache_Tomcat_logo.svg", + "description": "Apache Tomcat is an open-source application server that runs Java Servlets and JavaServer Pages (JSP). It allows developers to deploy and manage Java web applications by handling HTTP requests and serving dynamic content. Tomcat is widely used for lightweight web applications and supports various Java EE features like WebSockets and JNDI.", + "install_methods": [ + { + "type": "default", + "script": "ct/apache-tomcat.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "User can select which Adoptium JDK should be used for the selected Tomcat version (9, 10.1 or 11). ", + "type": "info" + } + ] +} diff --git a/frontend/public/json/apt-cacher-ng.json b/frontend/public/json/apt-cacher-ng.json new file mode 100644 index 0000000..b36f467 --- /dev/null +++ b/frontend/public/json/apt-cacher-ng.json @@ -0,0 +1,34 @@ +{ + "name": "Apt-Cacher-NG", + "slug": "apt-cacher-ng", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 3142, + "documentation": null, + "website": "https://www.unix-ag.uni-kl.de/~bloch/acng/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/linux.svg", + "description": "Apt-Cacher-NG is a caching proxy. Specialized for package files from Linux distributors, primarily for Debian (and Debian based) distributions.", + "install_methods": [ + { + "type": "default", + "script": "ct/apt-cacher-ng.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/archivebox.json b/frontend/public/json/archivebox.json new file mode 100644 index 0000000..ab1cfa9 --- /dev/null +++ b/frontend/public/json/archivebox.json @@ -0,0 +1,34 @@ +{ + "name": "ArchiveBox", + "slug": "archivebox", + "categories": [ + 12 + ], + "date_created": "2024-10-19", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://archivebox.io/", + "logo": "https://raw.githubusercontent.com/ArchiveBox/ArchiveBox/refs/heads/dev/website/icon.png", + "description": "ArchiveBox is an open source tool that lets organizations & individuals archive both public & private web content while retaining control over their data. It can be used to save copies of bookmarks, preserve evidence for legal cases, backup photos from FB/Insta/Flickr or media from YT/Soundcloud/etc., save research papers, and more...", + "install_methods": [ + { + "type": "default", + "script": "ct/archivebox.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "archivebox", + "password": "helper-scripts.com" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/archlinux-vm.json b/frontend/public/json/archlinux-vm.json new file mode 100644 index 0000000..17f83be --- /dev/null +++ b/frontend/public/json/archlinux-vm.json @@ -0,0 +1,39 @@ +{ + "name": "Arch Linux", + "slug": "archlinux-vm", + "categories": [ + 2 + ], + "date_created": "2025-01-27", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/arch-linux.svg", + "description": "Arch Linux is a highly customizable, independent Linux distribution that gives users complete control over their system. Known for its rolling release model, Arch Linux is always up-to-date with the latest software. It's favored by experienced users who appreciate its minimalist approach, demanding a hands-on installation and configuration process. This level of control and flexibility makes it a popular choice for those who want to tailor their Linux system to their exact needs.", + "install_methods": [ + { + "type": "default", + "script": "vm/archlinux-vm.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "doesnt work with lvm and lvmthin disks!", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/aria2.json b/frontend/public/json/aria2.json new file mode 100644 index 0000000..62c95f8 --- /dev/null +++ b/frontend/public/json/aria2.json @@ -0,0 +1,39 @@ +{ + "name": "Aria2", + "slug": "aria2", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 6880, + "documentation": null, + "website": "https://aria2.github.io/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/linux.svg", + "description": "Aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.", + "install_methods": [ + { + "type": "default", + "script": "ct/aria2.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Within the LXC console, run `cat rpc.secret` to display the rpc-secret. Copy this token and paste it into the Aria2 RPC Secret Token box within the AriaNG Settings. Then, click the reload AriaNG button.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/audiobookshelf.json b/frontend/public/json/audiobookshelf.json new file mode 100644 index 0000000..053e48b --- /dev/null +++ b/frontend/public/json/audiobookshelf.json @@ -0,0 +1,34 @@ +{ + "name": "Audiobookshelf", + "slug": "audiobookshelf", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 13378, + "documentation": "https://www.audiobookshelf.org/guides/", + "website": "https://www.audiobookshelf.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/audiobookshelf.svg", + "description": "Audiobookshelf is a Self-hosted audiobook and podcast server.", + "install_methods": [ + { + "type": "default", + "script": "ct/audiobookshelf.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/authelia.json b/frontend/public/json/authelia.json new file mode 100644 index 0000000..45051b2 --- /dev/null +++ b/frontend/public/json/authelia.json @@ -0,0 +1,39 @@ +{ + "name": "Authelia", + "slug": "authelia", + "categories": [ + 6 + ], + "date_created": "2025-02-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9091, + "documentation": "https://www.authelia.com/integration/deployment/bare-metal/", + "website": "https://www.authelia.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/authelia.svg", + "description": "Authelia is an open-source authentication and authorization server and portal fulfilling the identity and access management (IAM) role of information security in providing multi-factor authentication and single sign-on (SSO) for your applications via a web portal. It acts as a companion for common reverse proxies.", + "install_methods": [ + { + "type": "default", + "script": "ct/authelia.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "authelia", + "password": "authelia" + }, + "notes": [ + { + "text": "During installation, you will have to input your domain (ex. domain.com). Authelia will use auth.domain.com", + "type": "info" + } + ] +} diff --git a/frontend/public/json/authentik.json b/frontend/public/json/authentik.json new file mode 100644 index 0000000..cb84154 --- /dev/null +++ b/frontend/public/json/authentik.json @@ -0,0 +1,39 @@ +{ + "name": "authentik", + "slug": "authentik", + "categories": [ + 6 + ], + "date_created": "2024-12-27", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9000, + "documentation": "https://docs.goauthentik.io/docs/", + "website": "https://goauthentik.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/authentik.svg", + "description": "authentik is an IdP (Identity Provider) and SSO (single sign on) that is built with security at the forefront of every piece of code, every feature, with an emphasis on flexibility and versatility.", + "install_methods": [ + { + "type": "default", + "script": "ct/authentik.sh", + "resources": { + "cpu": 6, + "ram": 8192, + "hdd": 12, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Authentik is very resource-heavy, it is recommended to use at least 8GB RAM anytime!", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/autobrr.json b/frontend/public/json/autobrr.json new file mode 100644 index 0000000..c4f94ec --- /dev/null +++ b/frontend/public/json/autobrr.json @@ -0,0 +1,34 @@ +{ + "name": "Autobrr", + "slug": "autobrr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7474, + "documentation": "https://autobrr.com/configuration/autobrr", + "website": "https://autobrr.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/autobrr.svg", + "description": "Autobrr is a torrent downloading tool that automates the process of downloading torrents. It is designed to be modern and user-friendly, providing users with a convenient and efficient way to download torrent files. With Autobrr, you can schedule and manage your torrent downloads, and have the ability to automatically download torrents based on certain conditions, such as time of day or availability of seeds. This can save you time and effort, allowing you to focus on other tasks while your torrents are being downloaded in the background.", + "install_methods": [ + { + "type": "default", + "script": "ct/autobrr.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/baikal.json b/frontend/public/json/baikal.json new file mode 100644 index 0000000..fb4d198 --- /dev/null +++ b/frontend/public/json/baikal.json @@ -0,0 +1,34 @@ +{ + "name": "Baïkal", + "slug": "baikal", + "categories": [ + 0 + ], + "date_created": "2025-01-31", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://sabre.io/baikal/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/baikal.webp", + "description": "Baïkal is a lightweight CalDAV+CardDAV server. It offers an extensive web interface with easy management of users, address books and calendars.", + "install_methods": [ + { + "type": "default", + "script": "ct/baikal.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "Admin", + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/barcode-buddy.json b/frontend/public/json/barcode-buddy.json new file mode 100644 index 0000000..27d5bc4 --- /dev/null +++ b/frontend/public/json/barcode-buddy.json @@ -0,0 +1,39 @@ +{ + "name": "Barcode Buddy", + "slug": "barcode-buddy", + "categories": [ + 24 + ], + "date_created": "2025-02-08", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://barcodebuddy-documentation.readthedocs.io/en/latest/", + "website": "https://github.com/Forceu/barcodebuddy", + "logo": "https://raw.githubusercontent.com/Forceu/barcodebuddy/refs/heads/master/incl/img/favicon/android-icon-192x192.png", + "description": "Barcode Buddy for Grocy is an extension for Grocy, allowing to pass barcodes to Grocy. It supports barcodes for products and chores. If you own a physical barcode scanner, it can be integrated, so that all barcodes scanned are automatically pushed to BarcodeBuddy/Grocy.", + "install_methods": [ + { + "type": "default", + "script": "ct/barcode-buddy.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After install enable the option \"Use Redis cache\" on the settings page.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/bazarr.json b/frontend/public/json/bazarr.json new file mode 100644 index 0000000..b51393f --- /dev/null +++ b/frontend/public/json/bazarr.json @@ -0,0 +1,34 @@ +{ + "name": "Bazarr", + "slug": "bazarr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 6767, + "documentation": null, + "website": "https://www.bazarr.media/", + "logo": "https://www.bazarr.media/assets/img/logo.png", + "description": "Bazarr is a companion application to Sonarr and Radarr that manages and downloads subtitles based on your requirements.", + "install_methods": [ + { + "type": "default", + "script": "ct/bazarr.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/beszel.json b/frontend/public/json/beszel.json new file mode 100644 index 0000000..29abf28 --- /dev/null +++ b/frontend/public/json/beszel.json @@ -0,0 +1,34 @@ +{ + "name": "Beszel", + "slug": "beszel", + "categories": [ + 9 + ], + "date_created": "2025-01-20", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8090, + "documentation": "https://beszel.dev/guide/what-is-beszel", + "website": "https://beszel.dev/", + "logo": "https://beszel.dev/icon.svg", + "description": "A lightweight server monitoring platform that provides Docker statistics, historical data, and alert functions\n ", + "install_methods": [ + { + "type": "default", + "script": "ct/beszel.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } \ No newline at end of file diff --git a/frontend/public/json/blocky.json b/frontend/public/json/blocky.json new file mode 100644 index 0000000..3fb801d --- /dev/null +++ b/frontend/public/json/blocky.json @@ -0,0 +1,39 @@ +{ + "name": "Blocky", + "slug": "blocky", + "categories": [ + 5 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 4000, + "documentation": null, + "website": "https://0xerr0r.github.io/blocky/", + "logo": "https://raw.githubusercontent.com/0xERR0R/blocky/main/docs/blocky.svg", + "description": "Blocky is a software tool designed for blocking unwanted ads and trackers on local networks. It functions as a DNS proxy and runs on the Go programming language. Blocky intercepts requests to advertisements and other unwanted content and blocks them before they reach the end user. This results in a cleaner, faster, and more secure online experience for users connected to the local network. Blocky is open-source, easy to configure and can be run on a variety of devices, making it a versatile solution for small to medium-sized local networks.", + "install_methods": [ + { + "type": "default", + "script": "ct/blocky.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Blocky Configuration Path: `/opt/blocky/config.yml`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/boltdiy.json b/frontend/public/json/boltdiy.json new file mode 100644 index 0000000..6705cd9 --- /dev/null +++ b/frontend/public/json/boltdiy.json @@ -0,0 +1,34 @@ +{ + "name": "bolt.diy", + "slug": "boltdiy", + "categories": [ + 20 + ], + "date_created": "2025-02-23", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5173, + "documentation": "https://stackblitz-labs.github.io/bolt.diy/", + "website": "https://github.com/stackblitz-labs/bolt.diy", + "logo": "https://github.com/stackblitz-labs/bolt.diy/raw/refs/heads/main/icons/logo-text.svg", + "description": "The official open source version of Bolt.new (previously known as oTToDev and bolt.new ANY LLM), which allows you to choose the LLM that you use for each prompt! Currently, you can use OpenAI, Anthropic, Ollama, OpenRouter, Gemini, LMStudio, Mistral, xAI, HuggingFace, DeepSeek, or Groq models - and it is easily extended to use any other model supported by the Vercel AI SDK!", + "install_methods": [ + { + "type": "default", + "script": "ct/boltdiy.sh", + "resources": { + "cpu": 2, + "ram": 3072, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/bookstack.json b/frontend/public/json/bookstack.json new file mode 100644 index 0000000..2029eb0 --- /dev/null +++ b/frontend/public/json/bookstack.json @@ -0,0 +1,39 @@ +{ + "name": "BookStack", + "slug": "bookstack", + "categories": [ + 12 + ], + "date_created": "2024-11-05", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://www.bookstackapp.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/bookstack.svg", + "description": "BookStack is a user-friendly documentation platform that offers a simple and intuitive experience. New users should be able to create content with basic word-processing skills. While the platform provides advanced features, they do not interfere with the core simplicity of the user experience.", + "install_methods": [ + { + "type": "default", + "script": "ct/bookstack.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin@admin.com", + "password": "password" + }, + "notes": [ + { + "text": "Bookstack works only with static ip. If you Change the IP of your LXC, you Need to edit the .env File `nano /opt/bookstack/.env`", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/bunkerweb.json b/frontend/public/json/bunkerweb.json new file mode 100644 index 0000000..407767b --- /dev/null +++ b/frontend/public/json/bunkerweb.json @@ -0,0 +1,34 @@ +{ + "name": "BunkerWeb", + "slug": "bunkerweb", + "categories": [ + 6 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.bunkerweb.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/bunkerweb.svg", + "description": "BunkerWeb is a security-focused web server that enhances web application protection. It guards against common web vulnerabilities like SQL injection, XSS, and CSRF. It features simple setup and configuration using a YAML file, customizable security rules, and provides detailed logs for traffic monitoring and threat detection.", + "install_methods": [ + { + "type": "default", + "script": "ct/bunkerweb.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/bytestash.json b/frontend/public/json/bytestash.json new file mode 100644 index 0000000..d06c34e --- /dev/null +++ b/frontend/public/json/bytestash.json @@ -0,0 +1,34 @@ +{ + "name": "ByteStash", + "slug": "bytestash", + "categories": [ + 20 + ], + "date_created": "2025-02-27", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/jordan-dalby/ByteStash/wiki", + "website": "https://github.com/jordan-dalby/ByteStash", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/bytestash.svg", + "description": "ByteStash is a self-hosted web application designed to store, organise, and manage your code snippets efficiently. With support for creating, editing, and filtering snippets, ByteStash helps you keep track of your code in one secure place.", + "install_methods": [ + { + "type": "default", + "script": "ct/bytestash.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/caddy.json b/frontend/public/json/caddy.json new file mode 100644 index 0000000..bb53fd0 --- /dev/null +++ b/frontend/public/json/caddy.json @@ -0,0 +1,43 @@ +{ + "name": "Caddy", + "slug": "caddy", + "categories": [ + 21 + ], + "date_created": "2024-05-11", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": "https://caddyserver.com/docs/", + "website": "https://caddyserver.com/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/caddy.svg", + "description": "Caddy is a powerful, extensible platform to serve your sites, services, and apps, written in Go.", + "install_methods": [ + { + "type": "default", + "script": "ct/caddy.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "if you need an internal module run: `caddy add-package PACKAGENAME`", + "type": "info" + }, + { + "text": "if you need an external module run: `xcaddy build --with github.com/caddy-dns/cloudflare`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/calibre-web.json b/frontend/public/json/calibre-web.json new file mode 100644 index 0000000..5ec565c --- /dev/null +++ b/frontend/public/json/calibre-web.json @@ -0,0 +1,39 @@ +{ + "name": "Calibre-Web", + "slug": "calibre-web", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8083, + "documentation": null, + "website": "https://github.com/janeczku/calibre-web", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/calibre-web.svg", + "description": "Calibre-Web is a web app for browsing, reading and downloading eBooks stored in a Calibre database.", + "install_methods": [ + { + "type": "default", + "script": "ct/calibre-web.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin123" + }, + "notes": [ + { + "text": "Add Calibre-Web Extras via `update`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/casaos.json b/frontend/public/json/casaos.json new file mode 100644 index 0000000..784a747 --- /dev/null +++ b/frontend/public/json/casaos.json @@ -0,0 +1,43 @@ +{ + "name": "CasaOS", + "slug": "casaos", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://www.casaos.io/", + "logo": "https://wiki.casaos.io/_assets/casaos-no-text.svg", + "description": "CasaOS is a software that aims to make it easy for users to create a personal cloud system at home. It uses the Docker ecosystem to provide a simple, user-friendly experience for managing various applications and services.", + "install_methods": [ + { + "type": "default", + "script": "ct/casaos.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "type": "warning" + }, + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/changedetection.json b/frontend/public/json/changedetection.json new file mode 100644 index 0000000..375c463 --- /dev/null +++ b/frontend/public/json/changedetection.json @@ -0,0 +1,34 @@ +{ + "name": "Change Detection", + "slug": "changedetection", + "categories": [ + 24 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5000, + "documentation": null, + "website": "https://changedetection.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/changedetection.svg", + "description": "Change Detection is a service that allows you to monitor changes to web pages and receive notifications when changes occur. It can be used for a variety of purposes such as keeping track of online price changes, monitoring news websites for updates, or tracking changes to online forums.", + "install_methods": [ + { + "type": "default", + "script": "ct/changedetection.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/channels.json b/frontend/public/json/channels.json new file mode 100644 index 0000000..d555c99 --- /dev/null +++ b/frontend/public/json/channels.json @@ -0,0 +1,39 @@ +{ + "name": "Channels DVR Server", + "slug": "channels", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": true, + "interface_port": 8089, + "documentation": null, + "website": "https://getchannels.com/dvr-server/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/channels-dvr.svg", + "description": "Channels DVR Server runs on your computer or NAS device at home. There's no cloud to worry about. Your tv shows and movies will always be available.", + "install_methods": [ + { + "type": "default", + "script": "ct/channels.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/checkmk.json b/frontend/public/json/checkmk.json new file mode 100644 index 0000000..bbe861a --- /dev/null +++ b/frontend/public/json/checkmk.json @@ -0,0 +1,39 @@ +{ + "name": "Checkmk", + "slug": "checkmk", + "categories": [ + 9 + ], + "date_created": "2024-12-19", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://docs.checkmk.com/", + "website": "https://checkmk.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/checkmk.svg", + "description": "Checkmk is an IT monitoring software that tracks the health and performance of your systems, networks, servers, applications, and cloud services. It provides real-time insights, alerts for issues, and tools for troubleshooting, helping ensure smooth operations across your infrastructure.", + "install_methods": [ + { + "type": "default", + "script": "ct/checkmk.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Login Credentials : `cat ~/checkmk.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/clean-lxcs.json b/frontend/public/json/clean-lxcs.json new file mode 100644 index 0000000..8c5c09c --- /dev/null +++ b/frontend/public/json/clean-lxcs.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox VE LXC Cleaner", + "slug": "clean-lxcs", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", + "description": "This script provides options to delete logs and cache, and repopulate apt lists for Ubuntu and Debian systems.", + "install_methods": [ + { + "type": "default", + "script": "misc/clean-lxcs.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/clean-orphaned-lvm.json b/frontend/public/json/clean-orphaned-lvm.json new file mode 100644 index 0000000..668fff3 --- /dev/null +++ b/frontend/public/json/clean-orphaned-lvm.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox Clean Orphaned LVM", + "slug": "clean-orphaned-lvm", + "categories": [ + 1 + ], + "date_created": "2025-01-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "This script helps Proxmox users identify and remove orphaned LVM volumes that are no longer associated with any VM or LXC container. It scans all LVM volumes, detects unused ones, and provides an interactive prompt to delete them safely. System-critical volumes like root, swap, and data are excluded to prevent accidental deletion.", + "install_methods": [ + { + "type": "default", + "script": "misc/clean-orphaned-lvm.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} diff --git a/frontend/public/json/cloudflared.json b/frontend/public/json/cloudflared.json new file mode 100644 index 0000000..2a4aa21 --- /dev/null +++ b/frontend/public/json/cloudflared.json @@ -0,0 +1,39 @@ +{ + "name": "Cloudflared", + "slug": "cloudflared", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": "https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/", + "website": "https://www.cloudflare.com/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/cloudflare.svg", + "description": "Cloudflared is a command-line tool that allows you to securely access resources on the Cloudflare network, such as websites and APIs, from your local computer. It works by creating a secure tunnel between your computer and the Cloudflare network, allowing you to access resources as if they were on your local network.", + "install_methods": [ + { + "type": "default", + "script": "ct/cloudflared.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "With an option to configure cloudflared as a DNS-over-HTTPS (DoH) proxy", + "type": "info" + } + ] +} diff --git a/frontend/public/json/cockpit.json b/frontend/public/json/cockpit.json new file mode 100644 index 0000000..b03d246 --- /dev/null +++ b/frontend/public/json/cockpit.json @@ -0,0 +1,39 @@ +{ + "name": "Cockpit", + "slug": "cockpit", + "categories": [ + 10 + ], + "date_created": "2024-10-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9090, + "documentation": null, + "website": "https://cockpit-project.org/", + "logo": "https://i0.wp.com/easycode.page/wp-content/uploads/2021/10/cockpit.png?fit=400%2C400&ssl=1", + "description": "Cockpit is a web-based graphical interface for managing Linux servers. It allows users to perform tasks like configuring networks, managing storage, and monitoring system performance directly through a web browser. It integrates with existing system tools, making it suitable for both beginners and experienced admins.", + "install_methods": [ + { + "type": "default", + "script": "ct/cockpit.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Set a root password if using autologin. This will be the Cockpit password.`sudo passwd root`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/code-server.json b/frontend/public/json/code-server.json new file mode 100644 index 0000000..fefdb25 --- /dev/null +++ b/frontend/public/json/code-server.json @@ -0,0 +1,41 @@ +{ + "name": "VS Code Server", + "slug": "code-server", + "categories": [ + 1, + 20, + 11 + ], + "date_created": "2024-05-02", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": 8680, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/visual-studio-code.svg", + "description": "VS Code Server is a service you can run on a remote development machine, like your desktop PC or a virtual machine (VM). It allows you to securely connect to that remote machine from anywhere through a vscode.dev URL, without the requirement of SSH.", + "install_methods": [ + { + "type": "default", + "script": "misc/code-server.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within an existing LXC Console", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/commafeed.json b/frontend/public/json/commafeed.json new file mode 100644 index 0000000..07e418b --- /dev/null +++ b/frontend/public/json/commafeed.json @@ -0,0 +1,34 @@ +{ + "name": "CommaFeed", + "slug": "commafeed", + "categories": [ + 19 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8082, + "documentation": null, + "website": "https://www.commafeed.com/", + "logo": "https://raw.githubusercontent.com/Athou/commafeed/master/commafeed-client/public/app-icon-144.png", + "description": "CommaFeed is a Google Reader inspired self-hosted RSS reader.", + "install_methods": [ + { + "type": "default", + "script": "ct/commafeed.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/cosmos.json b/frontend/public/json/cosmos.json new file mode 100644 index 0000000..d29cdef --- /dev/null +++ b/frontend/public/json/cosmos.json @@ -0,0 +1,35 @@ +{ + "name": "Cosmos", + "slug": "cosmos", + "categories": [ + 2, + 3 + ], + "date_created": "2025-02-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://cosmos-cloud.io/doc/1%20index/", + "website": "https://cosmos-cloud.io/", + "logo": "https://cosmos-cloud.io/Logo.png", + "description": "Cosmos Cloud is a self-hosting platform that automates maintenance and security. It offers an app marketplace, reverse proxy management, container control, VPN integration, real-time monitoring, and disk management. Security features include SSO, anti-DDoS, and encryption. It simplifies self-hosting for all users.", + "install_methods": [ + { + "type": "default", + "script": "ct/cosmos.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/crafty-controller.json b/frontend/public/json/crafty-controller.json new file mode 100644 index 0000000..dd8d99e --- /dev/null +++ b/frontend/public/json/crafty-controller.json @@ -0,0 +1,39 @@ +{ + "name": "Crafty Controller", + "slug": "crafty-controller", + "categories": [ + 24 + ], + "date_created": "2025-02-01", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8443, + "documentation": "https://docs.craftycontrol.com/", + "website": "https://craftycontrol.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/crafty-controller.svg", + "description": "Crafty Controller is a free and open-source Minecraft launcher and manager that allows users to start and administer Minecraft servers from a user-friendly interface. The interface is run as a self-hosted web server that is accessible to devices on the local network by default and can be port forwarded to provide external access outside of your local network. Crafty is designed to be easy to install and use, requiring only a bit of technical knowledge and a desire to learn to get started. Crafty Controller is still actively being developed by Arcadia Technology and we are continually making major improvements to the software.\n\nCrafty Controller is a feature rich panel that allows you to create and run servers, manage players, run commands, change server settings, view and edit server files, and make backups. With the help of Crafty Controller managing a large number of Minecraft servers on separate versions is easy and intuitive to do.", + "install_methods": [ + { + "type": "default", + "script": "ct/crafty-controller.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 16, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": null + }, + "notes": [ + { + "text": "Show password: `cat ~/crafty-controller.creds`", + "type": "info" + } + ] + } \ No newline at end of file diff --git a/frontend/public/json/cron-update-lxcs.json b/frontend/public/json/cron-update-lxcs.json new file mode 100644 index 0000000..e02f37e --- /dev/null +++ b/frontend/public/json/cron-update-lxcs.json @@ -0,0 +1,44 @@ +{ + "name": "Proxmox VE Cron LXC Updater", + "slug": "cron-update-lxcs", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/lxc.svg", + "description": "This script will add/remove a crontab schedule that updates all LXCs every Sunday at midnight.", + "install_methods": [ + { + "type": "default", + "script": "misc/cron-update-lxcs.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + }, + { + "text": "To exclude LXCs from updating, edit the crontab using `crontab -e` and add CTID as shown in the example below:\n\n\n\n`0 0 * * 0 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /bin/bash -c '$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/update-lxcs-cron.sh)' -s 103 111 >>/var/log/update-lxcs-cron.log 2>/dev/null`", + "type": "info" + } + + ] +} diff --git a/frontend/public/json/cronicle.json b/frontend/public/json/cronicle.json new file mode 100644 index 0000000..2d46c1c --- /dev/null +++ b/frontend/public/json/cronicle.json @@ -0,0 +1,39 @@ +{ + "name": "Cronicle Primary", + "slug": "cronicle", + "categories": [ + 19 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3012, + "documentation": null, + "website": "https://github.com/jhuckaby/Cronicle", + "logo": "https://github.com/jhuckaby/Cronicle/blob/master/htdocs/images/logo-128.png?raw=true", + "description": "Cronicle is a task scheduling and management software that allows users to schedule and run tasks automatically on multiple servers. It has a web-based user interface that provides a convenient and centralized way to manage tasks and view their execution status. With Cronicle, users can schedule tasks to run at specific times, or on demand, and assign tasks to specific worker servers. The software provides real-time statistics and a live log viewer to help users monitor the progress of tasks. Cronicle is designed for use in large-scale environments, making it a valuable tool for automation and management of complex and time-sensitive tasks.", + "install_methods": [ + { + "type": "default", + "script": "ct/cronicle.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Configuration Path: `/opt/cronicle/conf/config.json` (Primary and Worker Private Keys Must Match)", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/cross-seed.json b/frontend/public/json/cross-seed.json new file mode 100644 index 0000000..a8a8a7c --- /dev/null +++ b/frontend/public/json/cross-seed.json @@ -0,0 +1,39 @@ +{ + "name": "cross-seed", + "slug": "cross-seed", + "categories": [ + 14 + ], + "date_created": "2025-02-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 2468, + "documentation": "https://www.cross-seed.org/docs/category/basics", + "website": "https://www.cross-seed.org/", + "logo": "https://www.cross-seed.org/img/cross-seed.svg", + "description": "cross-seed is an app designed to help you download torrents that you can cross seed based on your existing torrents. It is designed to match conservatively to minimize manual intervention.", + "install_methods": [ + { + "type": "default", + "script": "ct/cross-seed.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After the installation cross-seed will fail to start with an empty configuration. To fix this, edit `~/.cross-seed/config.js` to properly configure cross-seed, then restart by running `systemctl restart cross-seed`.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/crowdsec.json b/frontend/public/json/crowdsec.json new file mode 100644 index 0000000..1200146 --- /dev/null +++ b/frontend/public/json/crowdsec.json @@ -0,0 +1,39 @@ +{ + "name": "CrowdSec", + "slug": "crowdsec", + "categories": [ + 6 + ], + "date_created": "2024-05-02", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://crowdsec.net/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/crowdsec.svg", + "description": "CrowdSec is a free and open-source intrusion prevention system (IPS) designed to provide network security against malicious traffic. It is a collaborative IPS that analyzes behaviors and responses to attacks by sharing signals across a community of users. CrowdSec leverages the collective intelligence of its users to detect and respond to security threats in real-time. With CrowdSec, network administrators can set up protection against a wide range of threats, including malicious traffic, bots, and denial-of-service (DoS) attacks. The software is designed to be easy to use and integrate with existing security systems, making it a valuable tool for enhancing the security of any network.", + "install_methods": [ + { + "type": "default", + "script": "misc/crowdsec.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within an existing LXC Console. Debian only!", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/cryptpad.json b/frontend/public/json/cryptpad.json new file mode 100644 index 0000000..06d45ef --- /dev/null +++ b/frontend/public/json/cryptpad.json @@ -0,0 +1,39 @@ +{ + "name": "CryptPad", + "slug": "cryptpad", + "categories": [ + 12 + ], + "date_created": "2025-03-11", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.cryptpad.org/", + "website": "https://cryptpad.org/", + "logo": "https://raw.githubusercontent.com/cryptpad/cryptpad/refs/heads/main/customize.dist/CryptPad_logo.svg", + "description": "CryptPad is a collaboration suite that is end-to-end encrypted and open-source. It is designed to facilitate collaboration by synchronizing changes to documents in real time. Since all the user data is encrypted, in the event of a breach, attackers have no way of accessing the stored content", + "install_methods": [ + { + "type": "default", + "script": "ct/cryptpad.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 8, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After installation finishes, `systemctl status cryptpad.service` to get token URL which you can use to create admin account", + "type": "info" + } + ] +} diff --git a/frontend/public/json/daemonsync.json b/frontend/public/json/daemonsync.json new file mode 100644 index 0000000..1855ebf --- /dev/null +++ b/frontend/public/json/daemonsync.json @@ -0,0 +1,34 @@ +{ + "name": "Daemon Sync Server", + "slug": "daemonsync", + "categories": [ + 19 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8084, + "documentation": null, + "website": "https://daemonsync.me/", + "logo": "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fimg.informer.com%2Ficons_mac%2Fpng%2F128%2F350%2F350335.png&f=1&nofb=1", + "description": "Sync files from app to server, share photos & videos, back up your data and stay secure inside local network.", + "install_methods": [ + { + "type": "default", + "script": "ct/daemonsync.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/dashy.json b/frontend/public/json/dashy.json new file mode 100644 index 0000000..f6adc1f --- /dev/null +++ b/frontend/public/json/dashy.json @@ -0,0 +1,34 @@ +{ + "name": "Dashy", + "slug": "dashy", + "categories": [ + 10 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 4000, + "documentation": null, + "website": "https://dashy.to/", + "logo": "https://github.com/Lissy93/dashy/raw/master/public/web-icons/dashy-logo.png", + "description": "Dashy is a solution that helps you organize your self-hosted services by centralizing access to them through a single interface.", + "install_methods": [ + { + "type": "default", + "script": "ct/dashy.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/debian-vm.json b/frontend/public/json/debian-vm.json new file mode 100644 index 0000000..ff28330 --- /dev/null +++ b/frontend/public/json/debian-vm.json @@ -0,0 +1,43 @@ +{ + "name": "Debian 12", + "slug": "debian-vm", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.debian.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/debian.svg", + "description": "Debian Linux is a distribution that emphasizes free software. It supports many hardware platforms", + "install_methods": [ + { + "type": "default", + "script": "vm/debian-vm.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "VM has no root password set. To login type in user `root` and just press enter", + "type": "info" + }, + { + "text": "After installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/836´ for useful Debian commands", + "type": "info" + } + ] +} diff --git a/frontend/public/json/debian.json b/frontend/public/json/debian.json new file mode 100644 index 0000000..81cfae0 --- /dev/null +++ b/frontend/public/json/debian.json @@ -0,0 +1,34 @@ +{ + "name": "Debian", + "slug": "debian", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.debian.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/debian.svg", + "description": "Debian Linux is a distribution that emphasizes free software. It supports many hardware platforms.", + "install_methods": [ + { + "type": "default", + "script": "ct/debian.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/deconz.json b/frontend/public/json/deconz.json new file mode 100644 index 0000000..2680e01 --- /dev/null +++ b/frontend/public/json/deconz.json @@ -0,0 +1,34 @@ +{ + "name": "deCONZ", + "slug": "deconz", + "categories": [ + 17 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": true, + "interface_port": 80, + "documentation": null, + "website": "https://www.phoscon.de/en/conbee2/software#deconz", + "logo": "https://phoscon.de/img/phoscon-logo128x.svg", + "description": "deCONZ is a software for managing and controlling Zigbee-based smart home devices. It allows for setting up, configuring and visualizing the status of connected devices, as well as for triggering actions and automations. It works as a bridge between the Zigbee network and other home automation systems and can be used as a standalone solution or integrated into existing setups.", + "install_methods": [ + { + "type": "default", + "script": "ct/deconz.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/deluge.json b/frontend/public/json/deluge.json new file mode 100644 index 0000000..8d11be3 --- /dev/null +++ b/frontend/public/json/deluge.json @@ -0,0 +1,34 @@ +{ + "name": "Deluge", + "slug": "deluge", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8112, + "documentation": null, + "website": "https://www.deluge-torrent.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/deluge.svg", + "description": "Deluge is a free, open-source, lightweight BitTorrent client. It supports various platforms including Windows, Linux, and macOS, and offers features such as peer exchange, DHT, and magnet links.", + "install_methods": [ + { + "type": "default", + "script": "ct/deluge.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": "deluge" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/docker-vm.json b/frontend/public/json/docker-vm.json new file mode 100644 index 0000000..b531072 --- /dev/null +++ b/frontend/public/json/docker-vm.json @@ -0,0 +1,43 @@ +{ + "name": "Docker", + "slug": "docker-vm", + "categories": [ + 2, 3 + ], + "date_created": "2025-01-20", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.docker.com/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/docker.svg", + "description": "Docker is an open-source project for automating the deployment of applications as portable, self-sufficient containers. This Template includes Docker Engine and Docker Compose Plugin.", + "install_methods": [ + { + "type": "default", + "script": "vm/docker-vm.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "root", + "password": "docker" + }, + "notes": [ + { + "text": "After the script completes, click on the VM, then on the Summary or Console tab to find the VM IP.", + "type": "info" + }, + { + "text": "This Script works on amd64 and arm64 Architecture.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/docker.json b/frontend/public/json/docker.json new file mode 100644 index 0000000..e9bd564 --- /dev/null +++ b/frontend/public/json/docker.json @@ -0,0 +1,58 @@ +{ + "name": "Docker", + "slug": "docker", + "categories": [ + 3 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.docker.com/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/docker.svg", + "description": "Docker is an open-source project for automating the deployment of applications as portable, self-sufficient containers.", + "install_methods": [ + { + "type": "default", + "script": "ct/docker.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-docker.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 2, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "type": "warning" + }, + { + "text": "Run Compose V2 by replacing the hyphen (-) with a space, using `docker compose`, instead of `docker-compose`.", + "type": "warning" + }, + { + "text": "Options to Install Portainer and/or Docker Compose V2", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/dockge.json b/frontend/public/json/dockge.json new file mode 100644 index 0000000..a44ea51 --- /dev/null +++ b/frontend/public/json/dockge.json @@ -0,0 +1,43 @@ +{ + "name": "Dockge", + "slug": "dockge", + "categories": [ + 3 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 5001, + "documentation": null, + "website": "https://github.com/louislam/dockge", + "logo": "https://raw.githubusercontent.com/louislam/dockge/master/frontend/public/icon.svg", + "description": "Dockge is a fancy, easy-to-use and reactive self-hosted docker compose.yaml stack-oriented manager.", + "install_methods": [ + { + "type": "default", + "script": "ct/dockge.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 18, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Options to add Immich and/or Home Assistant", + "type": "info" + }, + { + "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/docmost.json b/frontend/public/json/docmost.json new file mode 100644 index 0000000..15d110d --- /dev/null +++ b/frontend/public/json/docmost.json @@ -0,0 +1,34 @@ +{ + "name": "Docmost", + "slug": "docmost", + "categories": [ + 12 + ], + "date_created": "2025-02-18", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docmost.com/docs/installation", + "website": "https://docmost.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/docmost.webp", + "description": "Open-source collaborative wiki and documentation software Create, collaborate, and share knowledge seamlessly with Docmost. Ideal for managing your wiki, knowledge-base, documentation and a lot more.", + "install_methods": [ + { + "type": "default", + "script": "ct/docmost.sh", + "resources": { + "cpu": 3, + "ram": 3072, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/dolibarr.json b/frontend/public/json/dolibarr.json new file mode 100644 index 0000000..97ed391 --- /dev/null +++ b/frontend/public/json/dolibarr.json @@ -0,0 +1,39 @@ +{ + "name": "Dolibarr", + "slug": "dolibarr", + "categories": [ + 25 + ], + "date_created": "2025-02-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://wiki.dolibarr.org/index.php?title=Home", + "website": "https://www.dolibarr.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/dolibarr.svg", + "description": "Dolibarr ERP CRM is a modern software package to manage your company or foundation's activity (contacts, suppliers, invoices, orders, stocks, agenda, accounting, ...). it's an open source Web application (written in PHP) designed for businesses of any sizes, foundations and freelancers.", + "install_methods": [ + { + "type": "default", + "script": "ct/dolibarr.sh", + "resources": { + "cpu": 1, + "ram": 2048, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Database credentials: `cat ~/dolibarr.creds`", + "type": "info" + } + ] + } diff --git a/frontend/public/json/dotnetaspwebapi.json b/frontend/public/json/dotnetaspwebapi.json new file mode 100644 index 0000000..e078427 --- /dev/null +++ b/frontend/public/json/dotnetaspwebapi.json @@ -0,0 +1,39 @@ +{ + "name":"Dotnet ASP Web API", + "slug":"dotnetaspwebapi", + "categories":[ + 20 + ], + "date_created":"2025-01-15", + "type":"ct", + "updateable":true, + "privileged":true, + "interface_port":80, + "documentation":"https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-9.0&tabs=linux-ubuntu", + "website":"https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-9.0&tabs=linux-ubuntu", + "logo":"https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Microsoft_.NET_logo.svg/456px-Microsoft_.NET_logo.svg.png", + "description":"Automatically setup a ASP.NET server up, as well as a FTP server so you can publish to this container from Visual Studio.", + "install_methods":[ + { + "type":"default", + "script":"ct/dotnetaspwebapi.sh", + "resources":{ + "cpu":1, + "ram":1024, + "hdd":8, + "os":"Ubuntu", + "version":"24.04" + } + } + ], + "default_credentials":{ + "username":null, + "password":null + }, + "notes":[ + { + "text":"FTP server credentials: `cat ~/ftp.creds`", + "type":"info" + } + ] +} diff --git a/frontend/public/json/duplicati.json b/frontend/public/json/duplicati.json new file mode 100644 index 0000000..615ed03 --- /dev/null +++ b/frontend/public/json/duplicati.json @@ -0,0 +1,39 @@ +{ + "name": "Duplicati", + "slug": "duplicati", + "categories": [ + 7 + ], + "date_created": "2025-02-06", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8200, + "documentation": "https://docs.duplicati.com/", + "website": "https://duplicati.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/duplicati.svg", + "description": "Duplicati is a free, open-source backup solution that offers zero-trust, fully encrypted backups for your data.", + "install_methods": [ + { + "type": "default", + "script": "ct/duplicati.sh", + "resources": { + "cpu": 1, + "ram": 1048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Admin password and database encryption key: `cat ~/duplicati.creds`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/elementsynapse.json b/frontend/public/json/elementsynapse.json new file mode 100644 index 0000000..adb154a --- /dev/null +++ b/frontend/public/json/elementsynapse.json @@ -0,0 +1,34 @@ +{ + "name": "Element Synapse", + "slug": "elementsynapse", + "categories": [ + 4 + ], + "date_created": "2025-02-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8008, + "documentation": "https://element-hq.github.io/synapse/latest/welcome_and_overview.html", + "website": "https://element.io/", + "logo": "https://element.io/images/logo-mark-primary.svg", + "description": "Synapse is an open source Matrix homeserver implementation, written and maintained by Element. Matrix is the open standard for secure and interoperable real time communications. You can directly run and manage the source code in this repository, available under an AGPL license. There is no support provided from Element unless you have a subscription.", + "install_methods": [ + { + "type": "default", + "script": "ct/elementsynapse.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } \ No newline at end of file diff --git a/frontend/public/json/emby.json b/frontend/public/json/emby.json new file mode 100644 index 0000000..d21f105 --- /dev/null +++ b/frontend/public/json/emby.json @@ -0,0 +1,39 @@ +{ + "name": "Emby Media Server", + "slug": "emby", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8096, + "documentation": null, + "website": "https://emby.media/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/emby.svg", + "description": "Emby brings together your personal videos, music, photos, and live television.", + "install_methods": [ + { + "type": "default", + "script": "ct/emby.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "ubuntu", + "version": "22.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "With Privileged/Unprivileged Hardware Acceleration Support", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/emqx.json b/frontend/public/json/emqx.json new file mode 100644 index 0000000..0aa6865 --- /dev/null +++ b/frontend/public/json/emqx.json @@ -0,0 +1,39 @@ +{ + "name": "EMQX", + "slug": "emqx", + "categories": [ + 18 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 18083, + "documentation": null, + "website": "https://www.emqx.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/emqx.svg", + "description": "EMQX is an open-source MQTT broker that features a high-performance, real-time message processing engine. It is designed to handle large-scale IoT deployments, providing fast and reliable message delivery for connected devices. EMQX is known for its scalability, reliability, and low latency, making it a popular choice for IoT and M2M applications. It also offers a wide range of features and plugins for enhanced security, monitoring, and management.", + "install_methods": [ + { + "type": "default", + "script": "ct/emqx.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "public" + }, + "notes": [ + { + "text": "Setup-Steps: Access Control ➡ Authentication ➡ Create ➡ Next ➡ Next ➡ Create ➡ Users ➡ Add ➡ Username / Password (to authenicate with MQTT) ➡ Save. You're now ready to enjoy a high-performance MQTT Broker.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/ersatztv.json b/frontend/public/json/ersatztv.json new file mode 100644 index 0000000..9f09a97 --- /dev/null +++ b/frontend/public/json/ersatztv.json @@ -0,0 +1,34 @@ +{ + "name": "ErsatzTV", + "slug": "ersatztv", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8409, + "documentation": null, + "website": "https://ersatztv.org/", + "logo": "https://raw.githubusercontent.com/ErsatzTV/ErsatzTV/main/artwork/ersatztv-logo.svg", + "description": "ErsatzTV is software for configuring and streaming custom live channels using your media library.", + "install_methods": [ + { + "type": "default", + "script": "ct/ersatztv.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/esphome.json b/frontend/public/json/esphome.json new file mode 100644 index 0000000..c1e9fa4 --- /dev/null +++ b/frontend/public/json/esphome.json @@ -0,0 +1,34 @@ +{ + "name": "ESPHome", + "slug": "esphome", + "categories": [ + 16 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 6052, + "documentation": null, + "website": "https://esphome.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/esphome.svg", + "description": "ESPHome is a platform for controlling ESP8266/ESP32-based devices using configuration files and integrating them with Home Automation systems. It provides a simple and flexible way to set up and manage the functionality of these devices, including defining and automating actions, monitoring sensors, and connecting to networks and other services. ESPHome is designed to be user-friendly and easy to use, and supports a wide range of features and integrations, making it a popular choice for home automation projects and IoT applications.", + "install_methods": [ + { + "type": "default", + "script": "ct/esphome.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/evcc.json b/frontend/public/json/evcc.json new file mode 100644 index 0000000..f81fde7 --- /dev/null +++ b/frontend/public/json/evcc.json @@ -0,0 +1,39 @@ +{ + "name": "evcc", + "slug": "evcc", + "categories": [ + 16 + ], + "date_created": "2024-10-15", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 7070, + "documentation": "https://evcc.io/#devices", + "website": "https://evcc.io/en/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/evcc.svg", + "description": "EVCC is an open-source tool that manages EV charging, prioritizing solar energy use to reduce costs and optimize charging times. It supports various EVs and chargers, adjusting power automatically based on real-time data.", + "install_methods": [ + { + "type": "default", + "script": "ct/evcc.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To configure evcc, type `cd /etc` followed by `evcc configure` in the evcc LXC shell", + "type": "info" + } + ] +} diff --git a/frontend/public/json/excalidraw.json b/frontend/public/json/excalidraw.json new file mode 100644 index 0000000..b7ea89e --- /dev/null +++ b/frontend/public/json/excalidraw.json @@ -0,0 +1,34 @@ +{ + "name": "Excalidraw", + "slug": "excalidraw", + "categories": [ + 12 + ], + "date_created": "2025-02-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.excalidraw.com/docs", + "website": "https://excalidraw.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/excalidraw.svg", + "description": "An open source virtual hand-drawn style whiteboard. Collaborative and end-to-end encrypted.", + "install_methods": [ + { + "type": "default", + "script": "ct/excalidraw.sh", + "resources": { + "cpu": 2, + "ram": 3072, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } diff --git a/frontend/public/json/fenrus.json b/frontend/public/json/fenrus.json new file mode 100644 index 0000000..ff38d70 --- /dev/null +++ b/frontend/public/json/fenrus.json @@ -0,0 +1,34 @@ +{ + "name": "Fenrus", + "slug": "fenrus", + "categories": [ + 10 + ], + "date_created": "2024-05-05", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 5000, + "documentation": null, + "website": "https://github.com/revenz/Fenrus", + "logo": "https://raw.githubusercontent.com/revenz/Fenrus/master/wwwroot/fenrus.svg", + "description": "A personal home page for quick access to all your personal apps/sites.", + "install_methods": [ + { + "type": "default", + "script": "ct/fenrus.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/fhem.json b/frontend/public/json/fhem.json new file mode 100644 index 0000000..7a1f16e --- /dev/null +++ b/frontend/public/json/fhem.json @@ -0,0 +1,39 @@ +{ + "name": "FHEM", + "slug": "fhem", + "categories": [ + 16 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8083, + "documentation": null, + "website": "https://fhem.de/", + "logo": "https://avatars.githubusercontent.com/u/45183393?s=100&v=4", + "description": "FHEM stands for \"Freundliche Hausautomation und Energie-Messung,\" which translates to \"Friendly Home Automation and Energy Measurement\" in English. The software can interface with a wide range of devices, including lighting systems, thermostats, weather stations, and media devices, among others.", + "install_methods": [ + { + "type": "default", + "script": "ct/fhem.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/filebrowser.json b/frontend/public/json/filebrowser.json new file mode 100644 index 0000000..5d16785 --- /dev/null +++ b/frontend/public/json/filebrowser.json @@ -0,0 +1,50 @@ +{ + "name": "File Browser", + "slug": "filebrowser", + "categories": [ + 1 + ], + "date_created": "2024-05-02", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://filebrowser.org/features", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/file-browser.svg", + "description": "File Browser offers a user-friendly web interface for managing files within a designated directory. It allows you to perform various actions such as uploading, deleting, previewing, renaming, and editing files.", + "install_methods": [ + { + "type": "default", + "script": "misc/filebrowser.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + }, + { + "type": "alpine", + "script": "misc/filebrowser.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": "admin", + "password": "helper-scripts.com" + }, + "notes": [ + { + "text": "Execute within an existing LXC Console", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/fileflows.json b/frontend/public/json/fileflows.json new file mode 100644 index 0000000..70aa275 --- /dev/null +++ b/frontend/public/json/fileflows.json @@ -0,0 +1,39 @@ +{ + "name": "FileFlows", + "slug": "fileflows", + "categories": [ + 13 + ], + "date_created": "2025-03-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 19200, + "documentation": "https://fileflows.com/docs", + "website": "https://fileflows.com/", + "logo": "https://raw.githubusercontent.com/revenz/FileFlows/refs/heads/develop/icon.png", + "description": "FileFlows is a powerful, open-source tool for automating media file processing workflows, including encoding, decoding, and media management. It offers an intuitive GUI and extensive plugin support, making it ideal for tasks like video transcoding, organizing, and managing large media libraries.", + "install_methods": [ + { + "type": "default", + "script": "ct/fileflows.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "With Privileged/Unprivileged Hardware Acceleration Support", + "type": "info" + } + ] +} diff --git a/frontend/public/json/firefly.json b/frontend/public/json/firefly.json new file mode 100644 index 0000000..5a687d0 --- /dev/null +++ b/frontend/public/json/firefly.json @@ -0,0 +1,39 @@ +{ + "name": "Firefly III", + "slug": "firefly", + "categories": [ + 23 + ], + "date_created": "2025-01-01", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://docs.firefly-iii.org/", + "website": "https://firefly-iii.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/firefly-iii.svg", + "description": "Firefly III is a free, self-hosted tool for managing your finances. Track expenses, plan budgets, and get detailed reports.", + "install_methods": [ + { + "type": "default", + "script": "ct/firefly.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Database credentials: `cat ~/firefly.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/flaresolverr.json b/frontend/public/json/flaresolverr.json new file mode 100644 index 0000000..7f1bbd8 --- /dev/null +++ b/frontend/public/json/flaresolverr.json @@ -0,0 +1,34 @@ +{ + "name": "FlareSolverr", + "slug": "flaresolverr", + "categories": [ + 14 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8191, + "documentation": null, + "website": "https://github.com/FlareSolverr/FlareSolverr", + "logo": "https://raw.githubusercontent.com/FlareSolverr/FlareSolverr/master/resources/flaresolverr_logo.svg", + "description": "FlareSolverr is a proxy server to bypass Cloudflare and DDoS-GUARD protection.", + "install_methods": [ + { + "type": "default", + "script": "ct/flaresolverr.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/flowiseai.json b/frontend/public/json/flowiseai.json new file mode 100644 index 0000000..0502d32 --- /dev/null +++ b/frontend/public/json/flowiseai.json @@ -0,0 +1,39 @@ +{ + "name": "FlowiseAI", + "slug": "flowiseai", + "categories": [ + 20 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.flowiseai.com/", + "website": "https://flowiseai.com/", + "logo": "https://flowiseai.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Flogo-color-high.e60de2f8.png&w=256&q=75", + "description": "FlowiseAI is an open source low-code tool for developers to build customized LLM orchestration flow & AI agents", + "install_methods": [ + { + "type": "default", + "script": "ct/flowiseai.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Application takes long time to install. Please be patient!", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/fluid-calendar.json b/frontend/public/json/fluid-calendar.json new file mode 100644 index 0000000..05f4aa5 --- /dev/null +++ b/frontend/public/json/fluid-calendar.json @@ -0,0 +1,40 @@ +{ + "name": "Fluid-Calendar", + "slug": "fluid-calendar", + "categories": [ + 19, + 0 + ], + "date_created": "2025-03-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/dotnetfactory/fluid-calendar/tree/main/docs", + "website": "https://github.com/dotnetfactory/fluid-calendar", + "logo": "https://raw.githubusercontent.com/dotnetfactory/fluid-calendar/refs/heads/main/src/app/favicon.ico", + "description": "The open-source intelligent calendar that adapts to your workflow. Experience seamless task scheduling powered by AI, designed to make your time management effortless.", + "install_methods": [ + { + "type": "default", + "script": "ct/fluid-calendar.sh", + "resources": { + "cpu": 3, + "ram": 4096, + "hdd": 7, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Creds: cat ~/fluid-calendar.creds", + "type": "info" + } + ] +} diff --git a/frontend/public/json/forgejo.json b/frontend/public/json/forgejo.json new file mode 100644 index 0000000..3291eb5 --- /dev/null +++ b/frontend/public/json/forgejo.json @@ -0,0 +1,34 @@ +{ + "name": "Forgejo", + "slug": "forgejo", + "categories": [ + 20 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://forgejo.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/forgejo.svg", + "description": "Forgejo is an open-source, self-hosted Git service that allows individuals and teams to manage their code repositories.", + "install_methods": [ + { + "type": "default", + "script": "ct/forgejo.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/freshrss.json b/frontend/public/json/freshrss.json new file mode 100644 index 0000000..105a996 --- /dev/null +++ b/frontend/public/json/freshrss.json @@ -0,0 +1,43 @@ +{ + "name": "FreshRSS", + "slug": "freshrss", + "categories": [ + 12 + ], + "date_created": "2025-02-10", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://freshrss.github.io/FreshRSS/en/", + "website": "https://freshrss.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/freshrss.svg", + "description": "FreshRSS is a self-hosted RSS and Atom feed aggregator that lets users collect, organize, and read from multiple sources in one place. It is lightweight, easy to work with, powerful, and customizable.", + "install_methods": [ + { + "type": "default", + "script": "ct/freshrss.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Database credentials: `cat ~/freshrss.creds`", + "type": "info" + }, + { + "text": "Per FreshRSS documentation, a cron job to actualize FreshRSS will be setup at `/etc/cron.d/freshrss-actualize`. This can be adjusted as needed", + "type": "info" + } + ] +} diff --git a/frontend/public/json/frigate.json b/frontend/public/json/frigate.json new file mode 100644 index 0000000..e1c4c1b --- /dev/null +++ b/frontend/public/json/frigate.json @@ -0,0 +1,43 @@ +{ + "name": "Frigate", + "slug": "frigate", + "categories": [ + 15 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": true, + "interface_port": 5000, + "documentation": null, + "website": "https://frigate.video/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/frigate.svg", + "description": "Frigate is an open source NVR built around real-time AI object detection. All processing is performed locally on your own hardware, and your camera feeds never leave your home.", + "install_methods": [ + { + "type": "default", + "script": "ct/frigate.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 20, + "os": "debian", + "version": "11" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Discussions (explore more advanced methods): `https://github.com/tteck/Proxmox/discussions/2711`", + "type": "info" + }, + { + "text": "go2rtc Interface port:`1984`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/fstrim.json b/frontend/public/json/fstrim.json new file mode 100644 index 0000000..6a88ff8 --- /dev/null +++ b/frontend/public/json/fstrim.json @@ -0,0 +1,43 @@ +{ + "name": "Proxmox VE LXC Filesystem Trim", + "slug": "fstrim", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": "https://github.com/community-scripts/ProxmoxVE/discussions/805", + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", + "description": "This maintains SSD performance by managing unused blocks. Thin-provisioned storage systems also require management to prevent unnecessary storage use. VMs automate fstrim, while LXC containers need manual or automated fstrim processes for optimal performance.", + "install_methods": [ + { + "type": "default", + "script": "misc/fstrim.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + }, + { + "text": "This is designed to work with SSDs on ext4 filesystems only.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/ghost.json b/frontend/public/json/ghost.json new file mode 100644 index 0000000..8b2d7e6 --- /dev/null +++ b/frontend/public/json/ghost.json @@ -0,0 +1,41 @@ +{ + "name": "Ghost", + "slug": "ghost", + "categories": [ + 25 + ], + "date_created": "2025-01-10", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 2368, + "documentation": "https://ghost.org/docs/", + "website": "https://ghost.org", + "logo": "https://raw.githubusercontent.com/TryGhost/Ghost/b6fe724b577e84f7dd174646d0323dabdcdf576e/apps/shade/src/assets/images/ghost-orb.svg", + "description": "Ghost is a powerful app for professional publishers to create, share, and grow a business around their content. It comes with modern tools to build a website, publish content, send newsletters & offer paid subscriptions to members.", + "install_methods": [ + { + "type": "default", + "script": "ct/ghost.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To run Ghost-CLI commands, first set a password for the ghost-user by running `sudo passwd ghost-user`. Then, switch to the ghost-user with `sudo -su ghost-user`.", + "type": "info" + } + ] +} + + diff --git a/frontend/public/json/gitea.json b/frontend/public/json/gitea.json new file mode 100644 index 0000000..c27c959 --- /dev/null +++ b/frontend/public/json/gitea.json @@ -0,0 +1,45 @@ +{ + "name": "Gitea", + "slug": "gitea", + "categories": [ + 20 + ], + "date_created": "2024-07-26", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://gitea.com", + "logo": "https://gitea.com/gitea/design/raw/branch/main/logo/logo.svg", + "description": "Gitea is a self-hosted Git service. It provides a lightweight and easy-to-install solution for managing Git repositories. Users can collaborate on code, track issues, and manage project tasks. Gitea includes features like pull requests, code reviews, wiki, and project management tools. It is suitable for small to medium-sized teams seeking control over their Git hosting.", + "install_methods": [ + { + "type": "default", + "script": "ct/gitea.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-gitea.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/glance.json b/frontend/public/json/glance.json new file mode 100644 index 0000000..6b879a8 --- /dev/null +++ b/frontend/public/json/glance.json @@ -0,0 +1,39 @@ +{ + "name": "Glance", + "slug": "glance", + "categories": [ + 9 + ], + "date_created": "2024-12-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://github.com/glanceapp/glance/blob/main/docs/configuration.md", + "website": "https://github.com/glanceapp/glance", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/glance.svg", + "description": "A self-hosted dashboard that puts all your feeds in one place", + "install_methods": [ + { + "type": "default", + "script": "ct/glance.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Config file is located in /opt/glance/glance.yml", + "type": "info" + } + ] + } diff --git a/frontend/public/json/glances.json b/frontend/public/json/glances.json new file mode 100644 index 0000000..ad87ffb --- /dev/null +++ b/frontend/public/json/glances.json @@ -0,0 +1,43 @@ +{ + "name": "Glances", + "slug": "glances", + "categories": [ + 9 + ], + "date_created": "2024-05-02", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": 61208, + "documentation": null, + "website": "https://nicolargo.github.io/glances/", + "logo": "https://raw.githubusercontent.com/nicolargo/glances/develop/docs/_static/Glances%20Logo.svg", + "description": "Glances is an open-source system cross-platform monitoring tool. It allows real-time monitoring of various aspects of your system such as CPU, memory, disk, network usage etc.", + "install_methods": [ + { + "type": "default", + "script": "misc/glances.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within an existing LXC Console", + "type": "warning" + }, + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/glpi.json b/frontend/public/json/glpi.json new file mode 100644 index 0000000..3e738fa --- /dev/null +++ b/frontend/public/json/glpi.json @@ -0,0 +1,34 @@ +{ + "name": "GLPI", + "slug": "glpi", + "categories": [ + 25 + ], + "date_created": "2025-01-06", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": "https://glpi-project.org/documentation/", + "website": "https://glpi-project.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/glpi.svg", + "description": "GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.", + "install_methods": [ + { + "type": "default", + "script": "ct/glpi.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "glpi", + "password": "glpi" + }, + "notes": [] +} diff --git a/frontend/public/json/go2rtc.json b/frontend/public/json/go2rtc.json new file mode 100644 index 0000000..fcdd6ed --- /dev/null +++ b/frontend/public/json/go2rtc.json @@ -0,0 +1,34 @@ +{ + "name": "go2rtc", + "slug": "go2rtc", + "categories": [ + 15 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 1984, + "documentation": null, + "website": "https://github.com/AlexxIT/go2rtc", + "logo": "https://github.com/AlexxIT/go2rtc/blob/master/assets/logo.png?raw=true", + "description": "go2rtc is the ultimate camera streaming application with support RTSP, WebRTC, HomeKit, FFmpeg, RTMP, etc.", + "install_methods": [ + { + "type": "default", + "script": "ct/go2rtc.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/gokapi.json b/frontend/public/json/gokapi.json new file mode 100644 index 0000000..3d958dd --- /dev/null +++ b/frontend/public/json/gokapi.json @@ -0,0 +1,34 @@ +{ + "name": "Gokapi", + "slug": "gokapi", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 53842, + "documentation": null, + "website": "https://github.com/Forceu/Gokapi", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/linux.svg", + "description": "Gokapi is a lightweight server to share files, which expire after a set amount of downloads or days.", + "install_methods": [ + { + "type": "default", + "script": "ct/gokapi.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/gomft.json b/frontend/public/json/gomft.json new file mode 100644 index 0000000..870ce37 --- /dev/null +++ b/frontend/public/json/gomft.json @@ -0,0 +1,39 @@ +{ + "name": "GoMFT", + "slug": "gomft", + "categories": [ + 7 + ], + "date_created": "2025-03-18", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://github.com/StarFleetCPTN/GoMFT#configuration", + "website": "https://github.com/StarFleetCPTN/GoMFT", + "logo": "https://raw.githubusercontent.com/StarFleetCPTN/GoMFT/83be259754689acc49a4b0dba25ba8384088a0fc/static/img/logo.svg", + "description": "GoMFT is a web-based managed file transfer application built with Go, leveraging rclone for robust file transfer capabilities. It provides a user-friendly interface for configuring, scheduling, and monitoring file transfers across various storage providers.", + "install_methods": [ + { + "type": "default", + "script": "ct/gomft.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin@example.com", + "password": "admin" + }, + "notes": [ + { + "text": "For additional configuration options, edit .env file here: `/opt/gomft/.env`. Check the documentation for more details.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/gotify.json b/frontend/public/json/gotify.json new file mode 100644 index 0000000..1ffc74a --- /dev/null +++ b/frontend/public/json/gotify.json @@ -0,0 +1,34 @@ +{ + "name": "Gotify", + "slug": "gotify", + "categories": [ + 19 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://gotify.net/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/gotify.svg", + "description": "Gotify is a simple server for sending and receiving messages", + "install_methods": [ + { + "type": "default", + "script": "ct/gotify.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/grafana.json b/frontend/public/json/grafana.json new file mode 100644 index 0000000..8017b4e --- /dev/null +++ b/frontend/public/json/grafana.json @@ -0,0 +1,45 @@ +{ + "name": "Grafana", + "slug": "grafana", + "categories": [ + 9 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://grafana.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/grafana.svg", + "description": "Grafana is a data visualization and monitoring platform that enables users to query, visualize, alert on and understand metrics, logs, and other data sources. It integrates with various data sources, including Prometheus, InfluxDB, Elasticsearch, and many others, to present a unified view of the data and enable users to create insightful and interactive dashboards.", + "install_methods": [ + { + "type": "default", + "script": "ct/grafana.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-grafana.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/graylog.json b/frontend/public/json/graylog.json new file mode 100644 index 0000000..7258b2d --- /dev/null +++ b/frontend/public/json/graylog.json @@ -0,0 +1,43 @@ +{ + "name": "Graylog", + "slug": "graylog", + "categories": [ + 9 + ], + "date_created": "2025-02-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9000, + "documentation": "https://go2docs.graylog.org/current/home.htm", + "website": "https://graylog.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/graylog.svg", + "description": "Graylog is an open-source log management and analysis platform that centralizes and processes log data from various sources, enabling real-time search, analysis, and alerting for IT infrastructure monitoring and troubleshooting.", + "install_methods": [ + { + "type": "default", + "script": "ct/graylog.sh", + "resources": { + "cpu": 2, + "ram": 8192, + "hdd": 30, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Initial Setup credentials: `tail /var/log/graylog-server/server.log` after the server starts for the first time.", + "type": "info" + }, + { + "text": "Type `cat ~/graylog.creds` to get admin password that you use to log in AFTER the Initial Setup", + "type": "info" + } + ] +} diff --git a/frontend/public/json/grist.json b/frontend/public/json/grist.json new file mode 100644 index 0000000..86d4200 --- /dev/null +++ b/frontend/public/json/grist.json @@ -0,0 +1,34 @@ +{ + "name": "Grist", + "slug": "grist", + "categories": [ + 12 + ], + "date_created": "2024-12-27", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8484, + "documentation": null, + "website": "https://www.getgrist.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/grist.svg", + "description": "Grist is a modern, open source spreadsheet that goes beyond the grid", + "install_methods": [ + { + "type": "default", + "script": "ct/grist.sh", + "resources": { + "cpu": 2, + "ram": 3072, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/grocy.json b/frontend/public/json/grocy.json new file mode 100644 index 0000000..5bc73e0 --- /dev/null +++ b/frontend/public/json/grocy.json @@ -0,0 +1,34 @@ +{ + "name": "grocy", + "slug": "grocy", + "categories": [ + 24 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://grocy.info/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/grocy.svg", + "description": "grocy is a web-based self-hosted groceries & household management solution for your home. It helps you keep track of your groceries and household items, manage your shopping list, and keep track of your pantry, recipes, meal plans, and more.", + "install_methods": [ + { + "type": "default", + "script": "ct/grocy.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/habitica.json b/frontend/public/json/habitica.json new file mode 100644 index 0000000..6c6847e --- /dev/null +++ b/frontend/public/json/habitica.json @@ -0,0 +1,43 @@ +{ + "name": "Habitica", + "slug": "habitica", + "categories": [ + 24 + ], + "date_created": "2025-03-03", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://github.com/HabitRPG/habitica/wiki", + "website": "https://habitica.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/habitica.svg", + "description": "Habitica is an open-source habit-building program that treats your life like a role-playing game. Level up as you succeed, lose HP as you fail, and earn Gold to buy weapons and armor!", + "install_methods": [ + { + "type": "default", + "script": "ct/habitica.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "It takes a minute or two after installation for web UI to start, please be patient.", + "type": "info" + }, + { + "text": "Config file is at `/opt/habitica/config.json`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/haos-vm.json b/frontend/public/json/haos-vm.json new file mode 100644 index 0000000..eb945c2 --- /dev/null +++ b/frontend/public/json/haos-vm.json @@ -0,0 +1,43 @@ +{ + "name": "Home Assistant OS", + "slug": "haos-vm", + "categories": [ + 16 + ], + "date_created": "2024-04-29", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": 8123, + "documentation": "https://www.home-assistant.io/docs/", + "website": "https://www.home-assistant.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/home-assistant.svg", + "description": "This script automates the process of creating a Virtual Machine (VM) using the official KVM (qcow2) disk image provided by the Home Assistant Team. It involves finding, downloading, and extracting the image, defining user-defined settings, importing and attaching the disk, setting the boot order, and starting the VM. It supports various storage types, and does not involve any hidden installations. After the script completes, click on the VM, then on the Summary tab to find the VM IP.", + "install_methods": [ + { + "type": "default", + "script": "vm/haos-vm.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 32, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "The disk must have a minimum size of 32GB and its size cannot be changed during the creation of the VM.", + "type": "warning" + }, + { + "text": "After the script completes, click on the VM, then on the Summary or Console tab to find the VM IP.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/headscale.json b/frontend/public/json/headscale.json new file mode 100644 index 0000000..d6a6c81 --- /dev/null +++ b/frontend/public/json/headscale.json @@ -0,0 +1,39 @@ +{ + "name": "Headscale", + "slug": "headscale", + "categories": [ + 4 + ], + "date_created": "2024-05-13", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://headscale.net/", + "website": "https://github.com/juanfont/headscale", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/headscale.svg", + "description": "An open source, self-hosted implementation of the Tailscale control server", + "install_methods": [ + { + "type": "default", + "script": "ct/headscale.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Configuration settings: `/etc/headscale/config.yaml`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/heimdall-dashboard.json b/frontend/public/json/heimdall-dashboard.json new file mode 100644 index 0000000..0b7132e --- /dev/null +++ b/frontend/public/json/heimdall-dashboard.json @@ -0,0 +1,34 @@ +{ + "name": "Heimdall Dashboard", + "slug": "heimdall-dashboard", + "categories": [ + 10 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7990, + "documentation": null, + "website": "https://heimdall.site/", + "logo": "https://raw.githubusercontent.com/linuxserver/Heimdall/refs/heads/master/public/img/heimdall-logo.svg", + "description": "Heimdall Dashboard is a self-hosted, web-based dashboard for managing and monitoring the health of applications and servers. It allows you to keep track of the status of your systems from a single, centralized location, and receive notifications when things go wrong. With Heimdall Dashboard, you have full control over your data and can customize it to meet your specific needs. Self-hosting the dashboard gives you the flexibility to run it on your own infrastructure, making it a suitable solution for organizations that prioritize data security and privacy.", + "install_methods": [ + { + "type": "default", + "script": "ct/heimdall-dashboard.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/hev-socks5-server.json b/frontend/public/json/hev-socks5-server.json new file mode 100644 index 0000000..0be495b --- /dev/null +++ b/frontend/public/json/hev-socks5-server.json @@ -0,0 +1,43 @@ +{ + "name": "hev-socks5-server", + "slug": "hev-socks5-server", + "categories": [ + 4 + ], + "date_created": "2025-02-23", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 1080, + "documentation": null, + "website": "https://github.com/heiher/hev-socks5-server", + "logo": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/35/Tux.svg/405px-Tux.svg.png", + "description": "HevSocks5Server is a simple, lightweight socks5 server.", + "install_methods": [ + { + "type": "default", + "script": "ct/hev-socks5-server.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Default credentials: `cat /root/hev.creds`", + "type": "info" + }, + { + "text": "Config stored at `/etc/hev-socks5-server/main.yml`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/hivemq.json b/frontend/public/json/hivemq.json new file mode 100644 index 0000000..8f710c5 --- /dev/null +++ b/frontend/public/json/hivemq.json @@ -0,0 +1,39 @@ +{ + "name": "HiveMQ CE", + "slug": "hivemq", + "categories": [ + 18 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 1883, + "documentation": null, + "website": "https://www.hivemq.com/", + "logo": "https://hivemq.com/img/svg/hivemq-bee.svg", + "description": "HiveMQ CE is a Java-based open source MQTT broker that fully supports MQTT 3.x and MQTT 5.", + "install_methods": [ + { + "type": "default", + "script": "ct/hivemq.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To check if HiveMQ is listening to the default port for MQTT `lsof -i :1883`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/homarr.json b/frontend/public/json/homarr.json new file mode 100644 index 0000000..abbfda3 --- /dev/null +++ b/frontend/public/json/homarr.json @@ -0,0 +1,34 @@ +{ + "name": "Homarr", + "slug": "homarr", + "categories": [ + 10 + ], + "date_created": "2025-01-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7575, + "documentation": null, + "website": "https://homarr.dev/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/homarr.svg", + "description": "Homarr is a sleek, modern dashboard that puts all of your apps and services at your fingertips.", + "install_methods": [ + { + "type": "default", + "script": "ct/homarr.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/homeassistant-core.json b/frontend/public/json/homeassistant-core.json new file mode 100644 index 0000000..daa1123 --- /dev/null +++ b/frontend/public/json/homeassistant-core.json @@ -0,0 +1,51 @@ +{ + "name": "Home Assistant Core", + "slug": "homeassistant-core", + "categories": [ + 16 + ], + "date_created": "2025-01-17", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8123, + "documentation": "https://www.home-assistant.io/docs/", + "website": "https://www.home-assistant.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/home-assistant.svg", + "description": "A standalone installation of Home Assistant Core refers to a setup where the Home Assistant Core software is installed directly on a device or operating system, without the use of Docker containers. This provides a simpler, but less flexible and scalable solution, as the software is tightly coupled with the underlying system.", + "install_methods": [ + { + "type": "default", + "script": "ct/homeassistant-core.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "ubuntu", + "version": "24.10" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "type": "warning" + }, + { + "text": "Requires PVE 8.2.2 with kernel 6.8.4-3-pve or newer", + "type": "warning" + }, + { + "text": "Use Ubuntu 24.10 ONLY", + "type": "warning" + }, + { + "text": "config path: `/root/.homeassistant`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/homeassistant.json b/frontend/public/json/homeassistant.json new file mode 100644 index 0000000..833958f --- /dev/null +++ b/frontend/public/json/homeassistant.json @@ -0,0 +1,51 @@ +{ + "name": "Home Assistant Container", + "slug": "homeassistant", + "categories": [ + 16 + ], + "date_created": "2024-04-29", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8123, + "documentation": "https://www.home-assistant.io/docs/", + "website": "https://www.home-assistant.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/home-assistant.svg", + "description": "A standalone container-based installation of Home Assistant Core means that the software is installed inside a Docker container, separate from the host operating system. This allows for flexibility and scalability, as well as improved security, as the container can be easily moved or isolated from other processes on the host.", + "install_methods": [ + { + "type": "default", + "script": "ct/homeassistant.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 16, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "type": "warning" + }, + { + "text": "config path: `/var/lib/docker/volumes/hass_config/_data`", + "type": "info" + }, + { + "text": "Portainer interface: $IP: 9443 - User & password must be set manually within 5 minutes, otherwise a restart of Portainer is required!", + "type": "info" + }, + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/homebox.json b/frontend/public/json/homebox.json new file mode 100644 index 0000000..2f9aeea --- /dev/null +++ b/frontend/public/json/homebox.json @@ -0,0 +1,39 @@ +{ + "name": "HomeBox", + "slug": "homebox", + "categories": [ + 24 + ], + "date_created": "2024-09-16", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7745, + "documentation": null, + "website": "https://homebox.software/en/", + "logo": "https://homebox.software/lilbox.svg", + "description": "HomeBox is a simple, home-focused inventory management software. It allows users to organize and track household items by adding, updating, or deleting them. Features include optional details like warranty info, CSV import/export, custom labels, locations, and multi-tenant support for sharing with others. It\u2019s designed to be fast, easy to use, and portable.", + "install_methods": [ + { + "type": "default", + "script": "ct/homebox.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": ".env file location: `/opt/.env`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/homebridge.json b/frontend/public/json/homebridge.json new file mode 100644 index 0000000..ff524ab --- /dev/null +++ b/frontend/public/json/homebridge.json @@ -0,0 +1,34 @@ +{ + "name": "Homebridge", + "slug": "homebridge", + "categories": [ + 16 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8581, + "documentation": null, + "website": "https://homebridge.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/homebridge.svg", + "description": "Homebridge is a popular open-source software platform that enables you to integrate smart home devices and services that do not natively support Apple's HomeKit protocol into the HomeKit ecosystem. This allows you to control and automate these devices using Siri, the Home app, or other HomeKit-enabled apps, making it easy to bring together a variety of different devices into a unified smart home system. With Homebridge, you can expand the capabilities of your smart home, unlocking new possibilities for automating and controlling your devices and systems.", + "install_methods": [ + { + "type": "default", + "script": "ct/homebridge.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/homepage.json b/frontend/public/json/homepage.json new file mode 100644 index 0000000..30002b3 --- /dev/null +++ b/frontend/public/json/homepage.json @@ -0,0 +1,43 @@ +{ + "name": "Homepage", + "slug": "homepage", + "categories": [ + 10 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://gethomepage.dev/configs/", + "website": "https://gethomepage.dev", + "logo": "https://avatars.githubusercontent.com/u/122929872?v=4", + "description": "Homepage is a self-hosted dashboard solution for centralizing and organizing data and information.", + "install_methods": [ + { + "type": "default", + "script": "ct/homepage.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Configuration (bookmarks.yaml, services.yaml, widgets.yaml) path: `/opt/homepage/config/`", + "type": "info" + }, + { + "text": "Add additional allowed hosts to `/opt/homepage/.env`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/homer.json b/frontend/public/json/homer.json new file mode 100644 index 0000000..d997a01 --- /dev/null +++ b/frontend/public/json/homer.json @@ -0,0 +1,39 @@ +{ + "name": "Homer", + "slug": "homer", + "categories": [ + 10 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8010, + "documentation": null, + "website": "https://github.com/bastienwirtz/homer#---------homer", + "logo": "https://raw.githubusercontent.com/bastienwirtz/homer/main/public/assets/icons/logo.svg", + "description": "Homer is a simple and lightweight static homepage generator that allows you to create and manage a home page for your server. It uses a YAML configuration file to define the layout and content of your homepage, making it easy to set up and customize. The generated homepage is static, meaning it does not require any server-side processing, making it fast and efficient to serve. Homer is designed to be a flexible and low-maintenance solution for organizing and accessing your services and information from a single, centralized location.", + "install_methods": [ + { + "type": "default", + "script": "ct/homer.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Configuration Path: `/opt/homer/assets/config.yml`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/host-backup.json b/frontend/public/json/host-backup.json new file mode 100644 index 0000000..2804255 --- /dev/null +++ b/frontend/public/json/host-backup.json @@ -0,0 +1,43 @@ +{ + "name": "Proxmox VE Host Backup", + "slug": "host-backup", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/bash-dark.svg", + "description": "This script serves as a versatile backup utility, enabling users to specify both the backup path and the directory they want to work in. This flexibility empowers users to select the specific files and directories they wish to back up, making it compatible with a wide range of hosts, not limited to Proxmox.", + "install_methods": [ + { + "type": "default", + "script": "misc/host-backup.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + }, + { + "text": "A backup is rendered ineffective when it remains stored on the host", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/hyperhdr.json b/frontend/public/json/hyperhdr.json new file mode 100644 index 0000000..d5f10ef --- /dev/null +++ b/frontend/public/json/hyperhdr.json @@ -0,0 +1,34 @@ +{ + "name": "HyperHDR", + "slug": "hyperhdr", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": true, + "interface_port": 8090, + "documentation": null, + "website": "https://github.com/awawa-dev/HyperHDR", + "logo": "https://raw.githubusercontent.com/awawa-dev/HyperHDR/master/resources/icons/hyperhdr-icon-256px.png", + "description": "HyperHDR is a highly optimized open source ambient lighting implementation based on modern digital video and audio stream analysis.", + "install_methods": [ + { + "type": "default", + "script": "ct/hyperhdr.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/hyperion.json b/frontend/public/json/hyperion.json new file mode 100644 index 0000000..9fdcec4 --- /dev/null +++ b/frontend/public/json/hyperion.json @@ -0,0 +1,34 @@ +{ + "name": "Hyperion", + "slug": "hyperion", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8090, + "documentation": "https://docs.hyperion-project.org/", + "website": "https://hyperion-project.org/forum/", + "logo": "https://github.com/hyperion-project/hyperion.ng/raw/master/doc/logo_dark.png?raw=true", + "description": "Hyperion is an opensource Ambient Lighting implementation. It supports many LED devices and video grabbers.", + "install_methods": [ + { + "type": "default", + "script": "ct/hyperion.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/influxdb.json b/frontend/public/json/influxdb.json new file mode 100644 index 0000000..7fac00d --- /dev/null +++ b/frontend/public/json/influxdb.json @@ -0,0 +1,43 @@ +{ + "name": "InfluxDB", + "slug": "influxdb", + "categories": [ + 8 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8086, + "documentation": null, + "website": "https://www.influxdata.com/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/influx.svg", + "description": "InfluxDB is designed to handle high write and query loads, and is optimized for storing and analyzing time-stamped data, such as metrics, events, and logs. InfluxDB supports SQL-like query language and has a built-in HTTP API for data ingestion and retrieval. It's commonly used for IoT and industrial applications where time-series data is involved.\r\n\r\nTelegraf is a server agent that collects, processes, and aggregates metrics and events data from different sources, such as systems, databases, and APIs, and outputs the data to various outputs, such as InfluxDB, Prometheus, Elasticsearch, and many others.", + "install_methods": [ + { + "type": "default", + "script": "ct/influxdb.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Port for V1: 8888", + "type": "info" + }, + { + "text": "Port for V2: 8086", + "type": "info" + } + ] +} diff --git a/frontend/public/json/inspircd.json b/frontend/public/json/inspircd.json new file mode 100644 index 0000000..391b012 --- /dev/null +++ b/frontend/public/json/inspircd.json @@ -0,0 +1,34 @@ +{ + "name": "InspIRCd 4", + "slug": "inspircd", + "categories": [ + 24 + ], + "date_created": "2024-11-29", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 6667, + "documentation": "https://docs.inspircd.org/", + "website": "https://www.inspircd.org/", + "logo": "https://avatars.githubusercontent.com/u/1560750?s=200&v=4", + "description": "InspIRCd is a modular C++ Internet Relay Chat (IRC) server for UNIX-like and Windows systems.", + "install_methods": [ + { + "type": "default", + "script": "ct/inspircd.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } diff --git a/frontend/public/json/inventree.json b/frontend/public/json/inventree.json new file mode 100644 index 0000000..cd535d2 --- /dev/null +++ b/frontend/public/json/inventree.json @@ -0,0 +1,39 @@ +{ + "name": "InvenTree", + "slug": "inventree", + "categories": [ + 25 + ], + "date_created": "2025-03-06", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://docs.inventree.org/en/latest/", + "website": "https://inventree.org", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/inventree.svg", + "description": "InvenTree is an open-source inventory management system which provides intuitive parts management and stock control. It is designed to be lightweight and easy to use for SME or hobbyist applications.", + "install_methods": [ + { + "type": "default", + "script": "ct/inventree.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "`cat /etc/inventree/admin_password.txt`" + }, + "notes": [ + { + "text": "Please read the documentation for your configuration needs.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/iobroker.json b/frontend/public/json/iobroker.json new file mode 100644 index 0000000..9a3539e --- /dev/null +++ b/frontend/public/json/iobroker.json @@ -0,0 +1,39 @@ +{ + "name": "ioBroker", + "slug": "iobroker", + "categories": [ + 16 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8081, + "documentation": null, + "website": "https://www.iobroker.net/#en/intro", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/iobroker.svg", + "description": "ioBroker is an open-source platform for building and managing smart home automation systems. It provides a centralized control and management interface for connected devices, sensors, and other IoT devices. ioBroker integrates with a wide range of popular smart home systems, devices, and services, making it easy to automate tasks and processes, monitor and control devices, and collect and analyze data from a variety of sources. With its flexible architecture and easy-to-use interface, ioBroker is designed to make it simple for users to build and customize their own smart home automation systems, regardless of their technical background or experience.", + "install_methods": [ + { + "type": "default", + "script": "ct/iobroker.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/iventoy.json b/frontend/public/json/iventoy.json new file mode 100644 index 0000000..3213567 --- /dev/null +++ b/frontend/public/json/iventoy.json @@ -0,0 +1,39 @@ +{ + "name": "iVentoy", + "slug": "iventoy", + "categories": [ + 2 + ], + "date_created": "2024-05-16", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 26000, + "documentation": null, + "website": "https://www.iventoy.com/", + "logo": "https://www.iventoy.com/static/img/iventoy.png", + "description": "iVentoy is an upgraded PXE server that allows simultaneous OS booting and installation on multiple machines via network. It is user-friendly, requiring only the placement of ISO files in a designated folder and selecting PXE boot on the client machine. iVentoy supports x86 Legacy BIOS, IA32 UEFI, x86_64 UEFI, and ARM64 UEFI modes. It is compatible with over 110 OS types, including Windows, WinPE, Linux, and VMware.", + "install_methods": [ + { + "type": "default", + "script": "ct/iventoy.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Container must be privileged.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/jackett.json b/frontend/public/json/jackett.json new file mode 100644 index 0000000..0a93bbc --- /dev/null +++ b/frontend/public/json/jackett.json @@ -0,0 +1,34 @@ +{ + "name": "Jackett", + "slug": "jackett", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 9117, + "documentation": null, + "website": "https://github.com/Jackett/Jackett", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/jackett.svg", + "description": "Jackett supports a wide range of trackers, including popular ones like The Pirate Bay, RARBG, and Torrentz2, as well as many private trackers. It can be integrated with several BitTorrent clients, including qBittorrent, Deluge, and uTorrent, among others.", + "install_methods": [ + { + "type": "default", + "script": "ct/jackett.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/jellyfin.json b/frontend/public/json/jellyfin.json new file mode 100644 index 0000000..6549a6e --- /dev/null +++ b/frontend/public/json/jellyfin.json @@ -0,0 +1,43 @@ +{ + "name": "Jellyfin Media Server", + "slug": "jellyfin", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8096, + "documentation": "https://jellyfin.org/docs/", + "website": "https://jellyfin.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/jellyfin.svg", + "description": "Jellyfin is a free and open-source media server and suite of multimedia applications designed to organize, manage, and share digital media files to networked devices.", + "install_methods": [ + { + "type": "default", + "script": "ct/jellyfin.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "ubuntu", + "version": "22.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "With Privileged/Unprivileged Hardware Acceleration Support", + "type": "info" + }, + { + "text": "FFmpeg path: /usr/lib/jellyfin-ffmpeg/ffmpeg", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/jellyseerr.json b/frontend/public/json/jellyseerr.json new file mode 100644 index 0000000..ba69e32 --- /dev/null +++ b/frontend/public/json/jellyseerr.json @@ -0,0 +1,34 @@ +{ + "name": "Jellyseerr", + "slug": "jellyseerr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5055, + "documentation": null, + "website": "https://github.com/Fallenbagel/jellyseerr", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/jellyseerr.svg", + "description": "Jellyseerr is a free and open source software application for managing requests for your media library. It is a a fork of Overseerr built to bring support for Jellyfin & Emby media servers.", + "install_methods": [ + { + "type": "default", + "script": "ct/jellyseerr.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/jenkins.json b/frontend/public/json/jenkins.json new file mode 100644 index 0000000..7867916 --- /dev/null +++ b/frontend/public/json/jenkins.json @@ -0,0 +1,34 @@ +{ + "name": "Jenkins", + "slug": "jenkins", + "categories": [ + 22 + ], + "date_created": "2024-12-26", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8080, + "documentation": "https://www.jenkins.io/doc/", + "website": "https://www.jenkins.io/", + "logo": "https://www.jenkins.io/images/logos/jenkins/jenkins.svg", + "description": "Jenkins provides hundreds of plugins to support building, deploying and automating any project. ", + "install_methods": [ + { + "type": "default", + "script": "ct/jenkins.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } diff --git a/frontend/public/json/jupyternotebook.json b/frontend/public/json/jupyternotebook.json new file mode 100644 index 0000000..a81e510 --- /dev/null +++ b/frontend/public/json/jupyternotebook.json @@ -0,0 +1,39 @@ +{ + "name": "Jupyter Notebook", + "slug": "jupyternotebook", + "categories": [ + 20 + ], + "date_created": "2025-02-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8888, + "documentation": "https://jupyter-notebook.readthedocs.io/en/stable/", + "website": "https://jupyter.org/", + "logo": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Jupyter_logo.svg/800px-Jupyter_logo.svg.png", + "description": "The Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text. Uses include: data cleaning and transformation, numerical simulation, statistical modeling, data visualization, machine learning, and much more.", + "install_methods": [ + { + "type": "default", + "script": "ct/jupyternotebook.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To get the token to access the Jupyter Notebook, run the following command: jupyter notebook list.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/karakeep.json b/frontend/public/json/karakeep.json new file mode 100644 index 0000000..e118e50 --- /dev/null +++ b/frontend/public/json/karakeep.json @@ -0,0 +1,34 @@ +{ + "name": "karakeep", + "slug": "karakeep", + "categories": [ + 12 + ], + "date_created": "2025-04-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.karakeep.app/", + "website": "https://karakeep.app/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/karakeep.svg", + "description": "karakeep (formerly: hoarder) is an AI-powered bookmarking tool that helps you save and organize your digital content. It automatically tags your links, notes, and images, making them easy to find later. With features like auto-fetching, lists, and full-text search, karakeep is the perfect tool for anyone who wants to keep track of their digital life.", + "install_methods": [ + { + "type": "default", + "script": "ct/karakeep.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/kavita.json b/frontend/public/json/kavita.json new file mode 100644 index 0000000..6e86d6f --- /dev/null +++ b/frontend/public/json/kavita.json @@ -0,0 +1,38 @@ +{ + "name": "Kavita", + "slug": "kavita", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5000, + "documentation": null, + "website": "https://www.kavitareader.com/", + "logo": "https://raw.githubusercontent.com/Kareadita/Kavita/develop/Logo/kavita.svg", + "description": "Kavita is a fast, feature rich, cross platform reading server. Built with a focus for manga, and the goal of being a full solution for all your reading needs.", + "install_methods": [ + { + "type": "default", + "script": "ct/kavita.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [{ + "text": "To enable folder adding append your lxc.conf on your host with 'lxc.environment: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1'", + "type": "info" + } + ] +} diff --git a/frontend/public/json/kernel-clean.json b/frontend/public/json/kernel-clean.json new file mode 100644 index 0000000..2511739 --- /dev/null +++ b/frontend/public/json/kernel-clean.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox VE Kernel Clean", + "slug": "kernel-clean", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "Cleaning unused kernel images is beneficial for reducing the length of the GRUB menu and freeing up disk space. By removing old, unused kernels, the system is able to conserve disk space and streamline the boot process.", + "install_methods": [ + { + "type": "default", + "script": "misc/kernel-clean.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} diff --git a/frontend/public/json/kernel-pin.json b/frontend/public/json/kernel-pin.json new file mode 100644 index 0000000..a381295 --- /dev/null +++ b/frontend/public/json/kernel-pin.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox VE Kernel Pin", + "slug": "kernel-pin", + "categories": [ + 1 + ], + "date_created": "2024-05-08", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "Kernel Pin is an essential tool for effortlessly managing kernel pinning and unpinning.", + "install_methods": [ + { + "type": "default", + "script": "misc/kernel-pin.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} diff --git a/frontend/public/json/keycloak.json b/frontend/public/json/keycloak.json new file mode 100644 index 0000000..f182d81 --- /dev/null +++ b/frontend/public/json/keycloak.json @@ -0,0 +1,43 @@ +{ + "name": "Keycloak", + "slug": "keycloak", + "categories": [ + 6 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8080, + "documentation": "https://github.com/community-scripts/ProxmoxVE/discussions/193", + "website": "https://www.keycloak.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/keycloak.svg", + "description": "Keycloak is an open-source identity and access management solution that provides centralized authentication and authorization for modern applications and services. It enables organizations to secure their applications and services with a single sign-on (SSO) solution, reducing the need for users to remember multiple login credentials. Keycloak supports various authentication protocols, including SAML, OAuth, and OpenID Connect, and integrates with a wide range of applications and services. With Keycloak, administrators can manage user identities, define security policies, and monitor access to their applications and services. The software is designed to be scalable, flexible, and easy to use, making it a valuable tool for enhancing the security and usability of modern applications and services.", + "install_methods": [ + { + "type": "default", + "script": "ct/keycloak.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "First start can take a few minutes", + "type": "warning" + }, + { + "text": "This script requires some extra steps after the installation, Please checkout the 'documentation'", + "type": "info" + } + ] +} diff --git a/frontend/public/json/kimai.json b/frontend/public/json/kimai.json new file mode 100644 index 0000000..aac7ce0 --- /dev/null +++ b/frontend/public/json/kimai.json @@ -0,0 +1,34 @@ +{ + "name": "Kimai", + "slug": "kimai", + "categories": [ + 25 + ], + "date_created": "2024-11-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://www.kimai.org/documentation/", + "website": "https://www.kimai.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/kimai.svg", + "description": "Kimai is an open-source time-tracking software designed for freelancers, small teams, and businesses to efficiently track, manage, and analyze work hours. This web-based tool enables users to log their work time with ease, associating entries with specific clients, projects, and tasks.", + "install_methods": [ + { + "type": "default", + "script": "ct/kimai.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin@helper-scripts.com", + "password": "helper-scripts.com" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/koillection.json b/frontend/public/json/koillection.json new file mode 100644 index 0000000..25fe0b8 --- /dev/null +++ b/frontend/public/json/koillection.json @@ -0,0 +1,34 @@ +{ + "name": "Koillection", + "slug": "koillection", + "categories": [ + 24 + ], + "date_created": "2025-02-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://github.com/benjaminjonard/koillection/wiki", + "website": "https://koillection.github.io/", + "logo": "https://user-images.githubusercontent.com/20560781/80213166-0e560e00-8639-11ea-944e-4f79fdbcef55.png", + "description": "Koillection is a self-hosted collection manager created to keep track of physical (mostly) collections of any kind like books, DVDs, stamps, games... Koillection is meant to be used for any kind of collections and doesn't come with pre-built metadata download. But you can tailor your own HTML scraper, or you can add your own metadata freely.", + "install_methods": [ + { + "type": "default", + "script": "ct/koillection.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } \ No newline at end of file diff --git a/frontend/public/json/kometa.json b/frontend/public/json/kometa.json new file mode 100644 index 0000000..0a36b2b --- /dev/null +++ b/frontend/public/json/kometa.json @@ -0,0 +1,43 @@ +{ + "name": "Kometa", + "slug": "kometa", + "categories": [ + 13 + ], + "date_created": "2025-02-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://kometa.wiki/en/latest/", + "website": "https://github.com/Kometa-Team/Kometa", + "logo": "https://kometa.wiki/en/latest/assets/icon.png", + "description": "Kometa (formerly known as Plex Meta Manager) is a powerful tool designed to give you complete control over your media libraries", + "install_methods": [ + { + "type": "default", + "script": "ct/kometa.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "During installation you will be prompted to input your TMDb key, Plex URL and Plex token. Make sure you have them ready.", + "type": "info" + }, + { + "text": "Configuration file is at `/opt/kometa/config/config.yml`", + "type": "info" + } + ] + } diff --git a/frontend/public/json/komga.json b/frontend/public/json/komga.json new file mode 100644 index 0000000..79a0779 --- /dev/null +++ b/frontend/public/json/komga.json @@ -0,0 +1,39 @@ +{ + "name": "Komga", + "slug": "komga", + "categories": [ + 13 + ], + "date_created": "2024-11-15", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 25600, + "documentation": "https://komga.org/docs/introduction", + "website": "https://komga.org/", + "logo": "https://raw.githubusercontent.com/gotson/komga/25a1cfa8660c57335313c244e41c248371ffd9d6/komga-webui/src/assets/logo.svg", + "description": "A media server for your comics, mangas, BDs, magazines and eBooks. Organize your CBZ, CBR, PDF and EPUB files in different libraries, collections or reading lists. Use the integrated Webreader, the Mihon extension, any OPDS reader, or other integrations. Edit metadata for your series and books.", + "install_methods": [ + { + "type": "default", + "script": "ct/komga.sh", + "resources": { + "cpu": 1, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Starting Komga (Web UI) may take up to 2 minutes after a restart or fresh installation.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/komodo.json b/frontend/public/json/komodo.json new file mode 100644 index 0000000..cbe3729 --- /dev/null +++ b/frontend/public/json/komodo.json @@ -0,0 +1,39 @@ +{ + "name": "Komodo", + "slug": "komodo", + "categories": [ + 3 + ], + "date_created": "2025-01-01", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9120, + "documentation": "https://komo.do/docs/intro", + "website": "https://komo.do", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/komodo.svg", + "description": "Komodo is a build and deployment system that automates the creation of versioned Docker images from Git repositories and facilitates the deployment of Docker containers and Docker Compose setups. It provides features such as build automation triggered by Git pushes, deployment management, and monitoring of uptime and logs across multiple servers. The core API and associated agent are developed in Rust.", + "install_methods": [ + { + "type": "default", + "script": "ct/komodo.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After the initial installation: Enter your desired admin user and password and then click on Sign Up", + "type": "info" + } + ] +} diff --git a/frontend/public/json/kubo.json b/frontend/public/json/kubo.json new file mode 100644 index 0000000..be7343f --- /dev/null +++ b/frontend/public/json/kubo.json @@ -0,0 +1,34 @@ +{ + "name": "Kubo", + "slug": "kubo", + "categories": [ + 4 + ], + "date_created": "2024-06-27", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://github.com/ipfs/kubo", + "logo": "https://user-images.githubusercontent.com/157609/250148884-d6d12db8-fdcf-4be3-8546-2550b69845d8.png", + "description": "Kubo, developed by IPFS, is a decentralized file storage and sharing protocol. It implements the IPFS protocol, allowing users to manage files across a distributed network, ensuring data integrity and availability. Kubo supports file versioning, pinning, provides APIs and CLI tools for developers, and allows customizable node configurations for enhanced privacy and control.", + "install_methods": [ + { + "type": "default", + "script": "ct/kubo.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/lazylibrarian.json b/frontend/public/json/lazylibrarian.json new file mode 100644 index 0000000..9e4d931 --- /dev/null +++ b/frontend/public/json/lazylibrarian.json @@ -0,0 +1,34 @@ +{ + "name": "LazyLibrarian", + "slug": "lazylibrarian", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 5299, + "documentation": null, + "website": "https://gitlab.com/LazyLibrarian/LazyLibrarian", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/lazylibrarian.webp", + "description": "LazyLibrarian is a SickBeard, CouchPotato, Headphones-like application for ebooks, audiobooks and magazines.", + "install_methods": [ + { + "type": "default", + "script": "ct/lazylibrarian.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/lidarr.json b/frontend/public/json/lidarr.json new file mode 100644 index 0000000..bfbdf33 --- /dev/null +++ b/frontend/public/json/lidarr.json @@ -0,0 +1,34 @@ +{ + "name": "Lidarr", + "slug": "lidarr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8686, + "documentation": null, + "website": "https://lidarr.audio/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/lidarr.svg", + "description": "Lidarr is a music management tool designed for Usenet and BitTorrent users. It allows users to manage and organize their music collection with ease. Lidarr integrates with popular Usenet and BitTorrent clients, such as Sonarr and Radarr, to automate the downloading and organizing of music files. The software provides a web-based interface for managing and organizing music, making it easy to search and find songs, albums, and artists. Lidarr also supports metadata management, including album art, artist information, and lyrics, making it easy for users to keep their music collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing music collections, making it a valuable tool for music lovers who want to keep their collection organized and up-to-date. With Lidarr, users can enjoy their music collection from anywhere, making it a powerful tool for managing and sharing music files.", + "install_methods": [ + { + "type": "default", + "script": "ct/lidarr.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/linkwarden.json b/frontend/public/json/linkwarden.json new file mode 100644 index 0000000..74ad1ed --- /dev/null +++ b/frontend/public/json/linkwarden.json @@ -0,0 +1,34 @@ +{ + "name": "Linkwarden", + "slug": "linkwarden", + "categories": [ + 12 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.linkwarden.app/", + "website": "https://linkwarden.app/", + "logo": "https://raw.githubusercontent.com/linkwarden/linkwarden/main/assets/logo.png", + "description": "Linkwarden is a fully self-hostable, open-source collaborative bookmark manager to collect, organize and archive webpages.", + "install_methods": [ + { + "type": "default", + "script": "ct/linkwarden.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 12, + "os": "ubuntu", + "version": "22.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/listmonk.json b/frontend/public/json/listmonk.json new file mode 100644 index 0000000..8010ac2 --- /dev/null +++ b/frontend/public/json/listmonk.json @@ -0,0 +1,34 @@ +{ + "name": "listmonk", + "slug": "listmonk", + "categories": [ + 0 + ], + "date_created": "2024-11-22", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9000, + "documentation": "https://listmonk.app/docs/", + "website": "https://listmonk.app/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/listmonk.svg", + "description": "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard.", + "install_methods": [ + { + "type": "default", + "script": "ct/listmonk.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/lldap.json b/frontend/public/json/lldap.json new file mode 100644 index 0000000..7178d7b --- /dev/null +++ b/frontend/public/json/lldap.json @@ -0,0 +1,34 @@ +{ + "name": "lldap", + "slug": "lldap", + "categories": [ + 6 + ], + "date_created": "2024-08-06", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 17170, + "documentation": null, + "website": "https://github.com/lldap/lldap", + "logo": "https://avatars.githubusercontent.com/u/129409591?s=64&v=4", + "description": "LLDAP is a lightweight LDAP server designed for simplicity and ease of use. It provides secure user authentication and authorization management through LDAP over TLS. Ideal for small to medium-sized environments, It aims to streamline identity management tasks with a minimalistic and straightforward setup.", + "install_methods": [ + { + "type": "default", + "script": "ct/lldap.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "password" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/lubelogger.json b/frontend/public/json/lubelogger.json new file mode 100644 index 0000000..d420083 --- /dev/null +++ b/frontend/public/json/lubelogger.json @@ -0,0 +1,34 @@ +{ + "name": "LubeLogger", + "slug": "lubelogger", + "categories": [ + 24 + ], + "date_created": "2024-11-29", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5000, + "documentation": "https://docs.lubelogger.com/", + "website": "https://lubelogger.com/", + "logo": "https://docs.lubelogger.com/Misc/Branding/a/image-1731645976107.png", + "description": "Web-Based Vehicle Maintenance and Fuel Mileage Tracker", + "install_methods": [ + { + "type": "default", + "script": "ct/lubelogger.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } diff --git a/frontend/public/json/lxc-delete.json b/frontend/public/json/lxc-delete.json new file mode 100644 index 0000000..4f61d7f --- /dev/null +++ b/frontend/public/json/lxc-delete.json @@ -0,0 +1,39 @@ +{ + "name": "Container LXC Deletion", + "slug": "lxc-delete", + "categories": [ + 1 + ], + "date_created": "2025-01-21", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", + "description": "This script helps manage and delete LXC containers on a Proxmox VE server. It lists all available containers, allowing the user to select one or more for deletion through an interactive menu. Running containers are automatically stopped before deletion, and the user is asked to confirm each action. The script ensures a controlled and efficient container management process.", + "install_methods": [ + { + "type": "default", + "script": "misc/lxc-delete.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} diff --git a/frontend/public/json/mafl.json b/frontend/public/json/mafl.json new file mode 100644 index 0000000..9ed6f2e --- /dev/null +++ b/frontend/public/json/mafl.json @@ -0,0 +1,39 @@ +{ + "name": "Mafl", + "slug": "mafl", + "categories": [ + 10 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://mafl.hywax.space/", + "logo": "https://raw.githubusercontent.com/hywax/mafl/main/docs/public/logotype.svg", + "description": "Mafl is an intuitive service for organizing your homepage. Customize Mafl to your individual needs and work even more efficiently!", + "install_methods": [ + { + "type": "default", + "script": "ct/mafl.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Configuration Path: `/opt/mafl/data/config.yml`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/magicmirror.json b/frontend/public/json/magicmirror.json new file mode 100644 index 0000000..d9b8763 --- /dev/null +++ b/frontend/public/json/magicmirror.json @@ -0,0 +1,39 @@ +{ + "name": "MagicMirror Server", + "slug": "magicmirror", + "categories": [ + 24 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://docs.magicmirror.builders/configuration/introduction.html#configuring-your-magicmirror", + "website": "https://docs.magicmirror.builders/", + "logo": "https://github.com/MichMich/MagicMirror/raw/master/.github/header.png", + "description": "MagicMirror\u00b2 is a smart mirror software that allows you to build your own personal smart mirror. It uses modular components that you can customize to display information such as the weather, news, calendar, to-do list, and more. The platform is open source, allowing for community contributions and customization.", + "install_methods": [ + { + "type": "default", + "script": "ct/magicmirror.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Configuration Path: `/opt/magicmirror/config/config.js`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/mariadb.json b/frontend/public/json/mariadb.json new file mode 100644 index 0000000..f4d656b --- /dev/null +++ b/frontend/public/json/mariadb.json @@ -0,0 +1,50 @@ +{ + "name": "Mariadb", + "slug": "mariadb", + "categories": [ + 8 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 3306, + "documentation": "https://github.com/community-scripts/ProxmoxVE/discussions/192", + "website": "https://mariadb.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/mariadb.svg", + "description": "MariaDB is a fork of the popular MySQL database management system that is developed and maintained by the open-source community. It is also commercially supported, offering enterprise-level features and support for organizations that require them. MariaDB aims to maintain high compatibility with MySQL, ensuring a drop-in replacement capability.", + "install_methods": [ + { + "type": "default", + "script": "ct/mariadb.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-mariadb.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This script requires some extra steps after the installation, Please checkout the 'documentation'", + "type": "info" + } + ] +} diff --git a/frontend/public/json/matterbridge.json b/frontend/public/json/matterbridge.json new file mode 100644 index 0000000..c330715 --- /dev/null +++ b/frontend/public/json/matterbridge.json @@ -0,0 +1,39 @@ +{ + "name": "Matterbridge", + "slug": "matterbridge", + "categories": [ + 17 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8283, + "documentation": null, + "website": "https://github.com/Luligu/matterbridge", + "logo": "https://raw.githubusercontent.com/Luligu/matterbridge/main/frontend/public/matterbridge%20624x624.png", + "description": "Matterbridge allows you to have all your Matter devices up and running in a couple of minutes without having to deal with the pairing process of each single device.", + "install_methods": [ + { + "type": "default", + "script": "ct/matterbridge.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/mattermost.json b/frontend/public/json/mattermost.json new file mode 100644 index 0000000..cc9a3ed --- /dev/null +++ b/frontend/public/json/mattermost.json @@ -0,0 +1,39 @@ +{ + "name": "Mattermost", + "slug": "mattermost", + "categories": [ + 25 + ], + "date_created": "2025-01-30", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8065, + "documentation": null, + "website": "https://mattermost.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/mattermost.svg", + "description": "Mattermost is an open source platform for secure collaboration across the entire software development lifecycle. It's written in Go and React and runs as a single Linux binary with MySQL or PostgreSQL. It has a slimilar interface and features to Slack or Discord.", + "install_methods": [ + { + "type": "default", + "script": "ct/mattermost.sh", + "resources": { + "cpu": 1, + "ram": 2048, + "hdd": 8, + "os": "ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/mediamtx.json b/frontend/public/json/mediamtx.json new file mode 100644 index 0000000..b2ee80d --- /dev/null +++ b/frontend/public/json/mediamtx.json @@ -0,0 +1,34 @@ +{ + "name": "MediaMTX", + "slug": "mediamtx", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": "https://github.com/bluenviron/mediamtx/blob/main/README.md", + "website": "https://github.com/bluenviron/mediamtx", + "logo": "https://raw.githubusercontent.com/bluenviron/mediamtx/main/logo.png", + "description": "MediaMTX is a ready-to-use SRT / WebRTC / RTSP / RTMP / LL-HLS media server and media proxy that allows you to read, publish, proxy, record and playback video and audio streams.", + "install_methods": [ + { + "type": "default", + "script": "ct/mediamtx.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/medusa.json b/frontend/public/json/medusa.json new file mode 100644 index 0000000..cf3ad4d --- /dev/null +++ b/frontend/public/json/medusa.json @@ -0,0 +1,34 @@ +{ + "name": "Medusa", + "slug": "medusa", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8081, + "documentation": null, + "website": "https://pymedusa.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/py-medusa.webp", + "description": "Medusa is an automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic: automatic torrent/nzb searching, downloading, and processing at the qualities you want.", + "install_methods": [ + { + "type": "default", + "script": "ct/medusa.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/meilisearch.json b/frontend/public/json/meilisearch.json new file mode 100644 index 0000000..6dd88e9 --- /dev/null +++ b/frontend/public/json/meilisearch.json @@ -0,0 +1,43 @@ +{ + "name": "Meilisearch", + "slug": "meilisearch", + "categories": [ + 8 + ], + "date_created": "2025-04-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7700, + "documentation": "https://www.meilisearch.com/docs", + "website": "https://www.meilisearch.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/meilisearch.svg", + "description": "Meilisearch is a fast, open-source search engine designed for instant, full-text search with typo tolerance. It provides an API that allows developers to integrate powerful search features into applications. Meilisearch-UI is an optional web-based interface that provides a simple way to interact with Meilisearch, visualize indexed data, and test queries without needing to use the API directly.", + "install_methods": [ + { + "type": "default", + "script": "ct/meilisearch.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Meilisearch-UI can optionally be installed for a web-based search interface", + "type": "info" + }, + { + "text": "Meilisearch-UI has early development status and can cause performance issues", + "type": "warn" + } + ] +} diff --git a/frontend/public/json/memos.json b/frontend/public/json/memos.json new file mode 100644 index 0000000..84433fd --- /dev/null +++ b/frontend/public/json/memos.json @@ -0,0 +1,34 @@ +{ + "name": "Memos", + "slug": "memos", + "categories": [ + 12 + ], + "date_created": "2024-10-31", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9030, + "documentation": null, + "website": "https://www.usememos.com/", + "logo": "https://camo.githubusercontent.com/aa5a8cac358e3448ef7bad80fc178699841913ec438ed0ddfe18f867f931d7ee/68747470733a2f2f7777772e7573656d656d6f732e636f6d2f6c6f676f2d726f756e6465642e706e67", + "description": "Memos is an open-source, self-hosted platform designed for fast, privacy-focused note-taking. Users can create, organize, and format notes with Markdown, which are securely stored in a local database. It\u2019s lightweight and customizable, built for quick access and adaptability to individual or team needs.", + "install_methods": [ + { + "type": "default", + "script": "ct/memos.sh", + "resources": { + "cpu": 2, + "ram": 3072, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/meshcentral.json b/frontend/public/json/meshcentral.json new file mode 100644 index 0000000..8b434f7 --- /dev/null +++ b/frontend/public/json/meshcentral.json @@ -0,0 +1,34 @@ +{ + "name": "MeshCentral", + "slug": "meshcentral", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://meshcentral.com/", + "logo": "https://github.com/Ylianst/MeshCentral/blob/master/public/favicon-303x303.png?raw=true", + "description": "MeshCentral is a web-based computer management platform that provides remote control and management capabilities for computers. It allows administrators to manage and control computers over a local network or the internet through a single, centralized web-based interface. With MeshCentral, users can monitor the status of computers, perform remote administration tasks, and control the power state of machines. The software supports various operating systems and provides real-time updates and alerts to keep administrators informed of the status of their systems. MeshCentral is designed to provide an easy-to-use, scalable, and secure solution for remote computer management, making it a valuable tool for IT administrators, helpdesk support, and remote workers.", + "install_methods": [ + { + "type": "default", + "script": "ct/meshcentral.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/metadata.json b/frontend/public/json/metadata.json new file mode 100644 index 0000000..e25f0ee --- /dev/null +++ b/frontend/public/json/metadata.json @@ -0,0 +1,30 @@ +{ + "categories": [ + { "name": "Proxmox & Virtualization", "id": 1, "sort_order": 1.0, "description": "Tools and scripts to manage Proxmox VE and virtualization platforms effectively." }, + { "name": "Operating Systems", "id": 2, "sort_order": 2.0, "description": "Scripts for deploying and managing various operating systems." }, + { "name": "Containers & Docker", "id": 3, "sort_order": 3.0, "description": "Solutions for containerization using Docker and related technologies." }, + { "name": "Network & Firewall", "id": 4, "sort_order": 4.0, "description": "Enhance network security and configure firewalls with ease." }, + { "name": "Adblock & DNS", "id": 5, "sort_order": 5.0, "description": "Optimize your network with DNS and ad-blocking solutions." }, + { "name": "Authentication & Security", "id": 6, "sort_order": 6.0, "description": "Secure your infrastructure with authentication and security tools." }, + { "name": "Backup & Recovery", "id": 7, "sort_order": 7.0, "description": "Reliable backup and recovery scripts to protect your data." }, + { "name": "Databases", "id": 8, "sort_order": 8.0, "description": "Deploy and manage robust database systems with ease." }, + { "name": "Monitoring & Analytics", "id": 9, "sort_order": 9.0, "description": "Monitor system performance and analyze data seamlessly." }, + { "name": "Dashboards & Frontends", "id": 10, "sort_order": 10.0, "description": "Create interactive dashboards and user-friendly frontends." }, + { "name": "Files & Downloads", "id": 11, "sort_order": 11.0, "description": "Manage file sharing and downloading solutions efficiently." }, + { "name": "Documents & Notes", "id": 12, "sort_order": 12.0, "description": "Organize and manage documents and note-taking tools." }, + { "name": "Media & Streaming", "id": 13, "sort_order": 13.0, "description": "Stream and manage media effortlessly across devices." }, + { "name": "*Arr Suite", "id": 14, "sort_order": 14.0, "description": "Automated media management with the popular *Arr suite tools." }, + { "name": "NVR & Cameras", "id": 15, "sort_order": 15.0, "description": "Manage network video recorders and camera setups." }, + { "name": "IoT & Smart Home", "id": 16, "sort_order": 16.0, "description": "Control and automate IoT devices and smart home systems." }, + { "name": "ZigBee, Z-Wave & Matter", "id": 17, "sort_order": 17.0, "description": "Solutions for ZigBee, Z-Wave, and Matter-based device management." }, + { "name": "MQTT & Messaging", "id": 18, "sort_order": 18.0, "description": "Set up reliable messaging and MQTT-based communication systems." }, + { "name": "Automation & Scheduling", "id": 19, "sort_order": 19.0, "description": "Automate tasks and manage scheduling with powerful tools." }, + { "name": "AI / Coding & Dev-Tools", "id": 20, "sort_order": 20.0, "description": "Leverage AI and developer tools for smarter coding workflows." }, + { "name": "Webservers & Proxies", "id": 21, "sort_order": 21.0, "description": "Deploy and configure web servers and proxy solutions." }, + { "name": "Bots & ChatOps", "id": 22, "sort_order": 22.0, "description": "Enhance collaboration with bots and ChatOps integrations." }, + { "name": "Finance & Budgeting", "id": 23, "sort_order": 23.0, "description": "Track expenses and manage budgets efficiently." }, + { "name": "Gaming & Leisure", "id": 24, "sort_order": 24.0, "description": "Scripts for gaming servers and leisure-related tools." }, + { "name": "Business & ERP", "id": 25, "sort_order": 25.0, "description": "Streamline business operations with ERP and management tools." }, + { "name": "Miscellaneous", "id": 0, "sort_order": 99.0, "description": "General scripts and tools that don't fit into other categories." } + ] +} diff --git a/frontend/public/json/metube.json b/frontend/public/json/metube.json new file mode 100644 index 0000000..06efbe1 --- /dev/null +++ b/frontend/public/json/metube.json @@ -0,0 +1,34 @@ +{ + "name": "MeTube", + "slug": "metube", + "categories": [ + 11 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8081, + "documentation": null, + "website": "https://github.com/alexta69/metube", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/metube.svg", + "description": "MeTube allows you to download videos from YouTube and dozens of other sites.", + "install_methods": [ + { + "type": "default", + "script": "ct/metube.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/microcode.json b/frontend/public/json/microcode.json new file mode 100644 index 0000000..10d3c6f --- /dev/null +++ b/frontend/public/json/microcode.json @@ -0,0 +1,43 @@ +{ + "name": "Proxmox VE Processor Microcode", + "slug": "microcode", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/processor.png?raw=true", + "description": "Processor Microcode is a layer of low-level software that runs on the processor and provides patches or updates to its firmware. Microcode updates can fix hardware bugs, improve performance, and enhance security features of the processor.\r\n\r\nIt's important to note that the availability of firmware update mechanisms, such as Intel's Management Engine (ME) or AMD's Platform Security Processor (PSP), may vary depending on the processor and its specific implementation. Therefore, it's recommended to consult the documentation for your processor to confirm whether firmware updates can be applied through the operating system.", + "install_methods": [ + { + "type": "default", + "script": "misc/microcode.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + }, + { + "text": "After a reboot, you can check whether any microcode updates are currently in effect by running the following command. `journalctl -k | grep -E \"microcode\" | head -n 1`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/mikrotik-routeros.json b/frontend/public/json/mikrotik-routeros.json new file mode 100644 index 0000000..a401499 --- /dev/null +++ b/frontend/public/json/mikrotik-routeros.json @@ -0,0 +1,35 @@ +{ + "name": "Mikrotik RouterOS CHR", + "slug": "mikrotik-routeros", + "categories": [ + 2, + 4 + ], + "date_created": "2024-05-02", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://help.mikrotik.com/docs/display/ROS/Cloud+Hosted+Router%2C+CHR", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/mikrotik.svg", + "description": "Mikrotik RouterOS CHR is a Linux-based operating system that transforms a computer into a router. It provides a wide range of features for network routing, firewall, bandwidth management, wireless access point, backhaul link, hotspot gateway, VPN server, and many others. RouterOS is a versatile solution that supports various network configurations, including those with multiple WAN links, hotspots, and VPNs. It is highly customizable, allowing administrators to configure and manage their networks according to their specific requirements. With RouterOS, network administrators can monitor and control the performance and security of their networks, ensuring reliable and secure communication for their users. The software is designed to be easy to use and provides a wide range of tools for network management, making it a valuable solution for small and large networks alike.", + "install_methods": [ + { + "type": "default", + "script": "vm/mikrotik-routeros.sh", + "resources": { + "cpu": 2, + "ram": 512, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": "admin", + "password": "none" + }, + "notes": [] +} diff --git a/frontend/public/json/minio.json b/frontend/public/json/minio.json new file mode 100644 index 0000000..dc8075a --- /dev/null +++ b/frontend/public/json/minio.json @@ -0,0 +1,39 @@ +{ + "name": "MinIO", + "slug": "minio", + "categories": [ + 8 + ], + "date_created": "2025-02-13", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9001, + "documentation": "https://min.io/docs/minio/linux/index.html", + "website": "https://min.io/", + "logo": "https://raw.githubusercontent.com/minio/minio/refs/heads/master/.github/logo.svg", + "description": "MinIO is a High Performance Object Storage released under GNU Affero General Public License v3.0. It is API compatible with Amazon S3 cloud storage service. Use MinIO to build high performance infrastructure for machine learning, analytics and application data workloads.", + "install_methods": [ + { + "type": "default", + "script": "ct/minio.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "minioadmin", + "password": null + }, + "notes": [ + { + "text": "Application credentials: `cat ~/minio.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/mongodb.json b/frontend/public/json/mongodb.json new file mode 100644 index 0000000..a045630 --- /dev/null +++ b/frontend/public/json/mongodb.json @@ -0,0 +1,34 @@ +{ + "name": "MongoDB", + "slug": "mongodb", + "categories": [ + 8 + ], + "date_created": "2024-05-18", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.mongodb.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/mongodb.svg", + "description": "MongoDB is a NoSQL database that uses a document-oriented data model, storing data in JSON-like documents with dynamic schemas. This design offers flexibility and scalability, making it ideal for handling large volumes of data. MongoDB supports indexing, replication, and load balancing, ensuring high performance and availability, and can distribute data across multiple servers, making it well-suited for big data applications.", + "install_methods": [ + { + "type": "default", + "script": "ct/mongodb.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/monica.json b/frontend/public/json/monica.json new file mode 100644 index 0000000..dbea318 --- /dev/null +++ b/frontend/public/json/monica.json @@ -0,0 +1,34 @@ +{ + "name": "Monica", + "slug": "monica", + "categories": [ + 24 + ], + "date_created": "2025-01-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://github.com/monicahq/monica/tree/4.x/docs", + "website": "https://www.monicahq.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/monica.svg", + "description": "Monica is an open-source personal CRM designed to help you manage and strengthen your relationships. It allows you to store important details about your contacts, track interactions, set reminders for special dates, and log activities—all in one secure, private place. Perfect for busy individuals, Monica helps you stay organized, remember meaningful moments, and nurture your connections without ads or data mining. Install it on your own server for full control!", + "install_methods": [ + { + "type": "default", + "script": "ct/monica.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin@helper-scripts.com", + "password": "helper-scripts.com" + }, + "notes": [] +} diff --git a/frontend/public/json/monitor-all.json b/frontend/public/json/monitor-all.json new file mode 100644 index 0000000..52a14fd --- /dev/null +++ b/frontend/public/json/monitor-all.json @@ -0,0 +1,67 @@ +{ + "name": "Proxmox VE Monitor-All", + "slug": "monitor-all", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/monitor.png?raw=true", + "description": "This script will add Monitor-All to Proxmox VE, which will monitor the status of all your instances, both containers and virtual machines, excluding templates and user-defined ones, and automatically restart or reset them if they become unresponsive. This is particularly useful if you're experiencing problems with Home Assistant becoming non-responsive every few days/weeks. Monitor-All also maintains a log of the entire process, which can be helpful for troubleshooting and monitoring purposes.\r\n\r\n\ud83d\udec8 Virtual machines without the QEMU guest agent installed must be excluded.\r\n\ud83d\udec8 Prior to generating any new CT/VM not found in this repository, it's necessary to halt Proxmox VE Monitor-All by running systemctl stop ping-instances.", + "install_methods": [ + { + "type": "default", + "script": "misc/monitor-all.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + }, + { + "text": "Virtual machines without the QEMU guest agent installed must be excluded.", + "type": "warning" + }, + { + "text": "Prior to generating any new CT/VM not found in this repository, it's necessary to halt Proxmox VE Monitor-All by running `systemctl stop ping-instances`.", + "type": "warning" + }, + { + "text": "To make setup changes, first stop the service: `systemctl stop ping-instances`", + "type": "info" + }, + { + "text": "To edit pause time: `nano /usr/local/bin/ping-instances.sh`", + "type": "info" + }, + { + "text": "To add excluded instances: `nano /etc/systemd/system/ping-instances.service`", + "type": "info" + }, + { + "text": "After changes have been saved, `systemctl daemon-reload` and start the service: `systemctl start ping-instances`", + "type": "info" + }, + { + "text": "Monitor-All logs: `cat /var/log/ping-instances.log`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/motioneye.json b/frontend/public/json/motioneye.json new file mode 100644 index 0000000..f303a71 --- /dev/null +++ b/frontend/public/json/motioneye.json @@ -0,0 +1,34 @@ +{ + "name": "MotionEye NVR", + "slug": "motioneye", + "categories": [ + 15 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8765, + "documentation": "https://github.com/motioneye-project/motioneye/wiki", + "website": "https://github.com/motioneye-project/motioneye", + "logo": "https://github.com/home-assistant/brands/blob/master/core_integrations/motioneye/icon.png?raw=true", + "description": "MotionEye is an open-source, self-hosted network video recording (NVR) software designed to manage and monitor IP cameras. It runs on various platforms such as Linux, Raspberry Pi, and Docker, and offers features such as real-time video streaming, motion detection, and customizable camera views.", + "install_methods": [ + { + "type": "default", + "script": "ct/motioneye.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "none" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/mqtt.json b/frontend/public/json/mqtt.json new file mode 100644 index 0000000..5685ac3 --- /dev/null +++ b/frontend/public/json/mqtt.json @@ -0,0 +1,39 @@ +{ + "name": "MQTT", + "slug": "mqtt", + "categories": [ + 18 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": "https://mosquitto.org/documentation/", + "website": "https://mosquitto.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/eclipsemosquitto.svg", + "description": "Eclipse Mosquitto is an open-source message broker that implements the MQTT (Message Queuing Telemetry Transport) protocol. It is a lightweight and simple-to-use message broker that allows IoT devices and applications to communicate with each other by exchanging messages in real-time. Mosquitto is widely used in IoT applications, due to its low resource requirements and its compatibility with a wide range of devices and platforms", + "install_methods": [ + { + "type": "default", + "script": "ct/mqtt.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "You can find post-install info here: `https://github.com/community-scripts/ProxmoxVE/discussions/782`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/mylar3.json b/frontend/public/json/mylar3.json new file mode 100644 index 0000000..520e545 --- /dev/null +++ b/frontend/public/json/mylar3.json @@ -0,0 +1,34 @@ +{ + "name": "Mylar3", + "slug": "mylar3", + "categories": [ + 14 + ], + "date_created": "2024-12-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8090, + "documentation": "https://mylarcomics.com/docs/introduction/", + "website": "https://mylarcomics.com/", + "logo": "https://mylarcomics.com/img/mylarlogo.png", + "description": "Mylar is an automated Comic Book (cbr/cbz) downloader program for use with NZB and torrents.\r\nMylar allows you to create a watchlist of series that it monitors for various things (new issues, updated information, etc). It will grab, sort, and rename downloaded issues. It will also allow you to monitor weekly pull-lists for items belonging to said watchlisted series to download, as well as being able to monitor and maintain story-arcs.", + "install_methods": [ + { + "type": "default", + "script": "ct/mylar3.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/myspeed.json b/frontend/public/json/myspeed.json new file mode 100644 index 0000000..59d0a2a --- /dev/null +++ b/frontend/public/json/myspeed.json @@ -0,0 +1,34 @@ +{ + "name": "MySpeed", + "slug": "myspeed", + "categories": [ + 4 + ], + "date_created": "2024-06-14", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5216, + "documentation": null, + "website": "https://myspeed.dev/", + "logo": "https://raw.githubusercontent.com/gnmyt/myspeed/development/web/public/assets/img/logo.png", + "description": "MySpeed is a speed test analysis tool that records and displays internet speed metrics for up to 30 days. It offers automated tests using Cron expressions and supports multiple speed test servers (Ookla, LibreSpeed, Cloudflare). MySpeed provides detailed statistics, health check notifications via email or messaging apps, and integrates with Prometheus and Grafana for advanced monitoring.", + "install_methods": [ + { + "type": "default", + "script": "ct/myspeed.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/mysql.json b/frontend/public/json/mysql.json new file mode 100644 index 0000000..c5b693a --- /dev/null +++ b/frontend/public/json/mysql.json @@ -0,0 +1,43 @@ +{ + "name": "MySQL", + "slug": "mysql", + "categories": [ + 8 + ], + "date_created": "2024-10-10", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://dev.mysql.com/doc/", + "website": "https://www.mysql.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/mysql.svg", + "description": "MySQL is an open-source relational database management system (RDBMS) that uses SQL for managing and manipulating data. It is known for its scalability, reliability, and high performance, making it suitable for small to large-scale applications. Key features include support for ACID transactions, data replication for high availability, and compatibility with various programming languages like Python, PHP, and Java.", + "install_methods": [ + { + "type": "default", + "script": "ct/mysql.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Database credentials: `cat mysql.creds`", + "type": "info" + }, + { + "text": "With an option to install the MySQL 8.4 LTS release instead of MySQL 8.0", + "type": "info" + } + ] +} diff --git a/frontend/public/json/n8n.json b/frontend/public/json/n8n.json new file mode 100644 index 0000000..e7c7242 --- /dev/null +++ b/frontend/public/json/n8n.json @@ -0,0 +1,34 @@ +{ + "name": "n8n", + "slug": "n8n", + "categories": [ + 16 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5678, + "documentation": null, + "website": "https://n8n.io/", + "logo": "https://docs.n8n.io/_images/n8n-docs-icon.svg", + "description": "n8n is a workflow automation tool that enables users to automate various tasks and processes by connecting various data sources, systems, and services. It provides a visual interface for building workflows, allowing users to easily define and automate complex sequences of actions, such as data processing, conditional branching, and API calls. n8n supports a wide range of integrations, making it a versatile tool for automating a variety of use cases, from simple data processing workflows to complex business processes. With its extendable architecture, n8n is designed to be easily customizable and can be adapted to meet the specific needs of different users and industries.", + "install_methods": [ + { + "type": "default", + "script": "ct/n8n.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/navidrome.json b/frontend/public/json/navidrome.json new file mode 100644 index 0000000..8b7b2ff --- /dev/null +++ b/frontend/public/json/navidrome.json @@ -0,0 +1,39 @@ +{ + "name": "Navidrome", + "slug": "navidrome", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 4533, + "documentation": null, + "website": "https://www.navidrome.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/navidrome.svg", + "description": "Navidrome is a music server solution that makes your music collection accessible from anywhere. It provides a modern web-based user interface and compatibility with a range of third-party mobile apps for both iOS and Android devices. With Navidrome, users can access their music collection from anywhere, whether at home or on the go. The software supports a variety of music formats, making it easy for users to play their favorite songs and albums. Navidrome provides a simple and user-friendly interface for managing and organizing music collections, making it a valuable tool for music lovers who want to access their music from anywhere. The software is designed to be easy to set up and use, making it a popular choice for those who want to host their own music server and enjoy their music collection from anywhere.", + "install_methods": [ + { + "type": "default", + "script": "ct/navidrome.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To change Navidrome music folder path, `nano /var/lib/navidrome/navidrome.toml`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/neo4j.json b/frontend/public/json/neo4j.json new file mode 100644 index 0000000..66f485c --- /dev/null +++ b/frontend/public/json/neo4j.json @@ -0,0 +1,34 @@ +{ + "name": "Neo4j", + "slug": "neo4j", + "categories": [ + 8 + ], + "date_created": "2024-10-20", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 7474, + "documentation": null, + "website": "https://neo4j.com/product/neo4j-graph-database/", + "logo": "https://avatars.githubusercontent.com/u/201120?s=200&v=4", + "description": "Neo4j is a graph database designed to manage complex data relationships. It uses nodes, relationships, and properties to store and analyze connected data, making it ideal for applications like recommendation engines, fraud detection, and network analysis. Its structure allows for fast querying and deep data insights through native graph storage.", + "install_methods": [ + { + "type": "default", + "script": "ct/neo4j.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "neo4j", + "password": "neo4j" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/netbox.json b/frontend/public/json/netbox.json new file mode 100644 index 0000000..b46de4b --- /dev/null +++ b/frontend/public/json/netbox.json @@ -0,0 +1,39 @@ +{ + "name": "NetBox", + "slug": "netbox", + "categories": [ + 4 + ], + "date_created": "2024-11-17", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 443, + "documentation": "https://netboxlabs.com/docs/netbox/en/stable/", + "website": "https://netboxlabs.com/", + "logo": "https://github.com/netbox-community/netbox/wiki/images/logos/netbox_icon.svg", + "description": "NetBox is the source of truth for everything on your network, from physical components like power systems and cabling to virtual assets like IP addresses and VLANs. Network automation and observability tools depend on NetBox’s authoritative data to roll out configurations, monitor changes, and accelerate operations across the enterprise", + "install_methods": [ + { + "type": "default", + "script": "ct/netbox.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Show login and database credentials: `cat netbox.creds`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/netdata.json b/frontend/public/json/netdata.json new file mode 100644 index 0000000..d1abf45 --- /dev/null +++ b/frontend/public/json/netdata.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox VE Netdata", + "slug": "netdata", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.netdata.cloud/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/netdata.svg", + "description": "Netdata is an open-source, real-time performance monitoring tool designed to provide insights into the performance and health of systems and applications. It is often used by system administrators, DevOps professionals, and developers to monitor and troubleshoot issues on servers and other devices.", + "install_methods": [ + { + "type": "default", + "script": "misc/netdata.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/nextcloud-vm.json b/frontend/public/json/nextcloud-vm.json new file mode 100644 index 0000000..3bd500d --- /dev/null +++ b/frontend/public/json/nextcloud-vm.json @@ -0,0 +1,39 @@ +{ + "name": "Nextcloud", + "slug": "nextcloud-vm", + "categories": [ + 2 + ], + "date_created": "2023-11-14", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://www.turnkeylinux.org/nextcloud", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/nextcloud.svg", + "description": "TurnKey Nextcloud is an open-source file sharing server and collaboration platform that can store your personal content, like documents and pictures, in a centralized location.", + "install_methods": [ + { + "type": "default", + "script": "vm/nextcloud-vm.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 12, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": null + }, + "notes": [ + { + "text": "This VM requires extra installation steps, see install guide at `https://github.com/community-scripts/ProxmoxVE/discussions/144`", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/nextcloudpi.json b/frontend/public/json/nextcloudpi.json new file mode 100644 index 0000000..7e31466 --- /dev/null +++ b/frontend/public/json/nextcloudpi.json @@ -0,0 +1,54 @@ +{ + "name": "NextcloudPi", + "slug": "nextcloudpi", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 4443, + "documentation": "https://docs.nextcloudpi.com/", + "website": "https://github.com/nextcloud/nextcloudpi", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/nextcloud.svg", + "description": "NextCloudPi is a popular self-hosted solution for file collaboration and data storage. It is built on the NextCloud software, which is an open-source platform for data management.", + "install_methods": [ + { + "type": "default", + "script": "ct/nextcloudpi.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-nextcloud.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 2, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Only Alpine: To get the username and password, run the script again inside the LXC shell.", + "type": "warning" + }, + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/nextpvr.json b/frontend/public/json/nextpvr.json new file mode 100644 index 0000000..2d23859 --- /dev/null +++ b/frontend/public/json/nextpvr.json @@ -0,0 +1,34 @@ +{ + "name": "NextPVR", + "slug": "nextpvr", + "categories": [ + 13 + ], + "date_created": "2024-11-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8866, + "documentation": "https://github.com/sub3/NextPVR/wiki", + "website": "https://nextpvr.com/", + "logo": null, + "description": "NextPVR is a personal video recorder application for Microsoft Windows, Linux, Mac and Docker. NextPVR makes it easy to watch or record live TV, and provides great features like series recordings, web scheduling, iPhone/iPad client application, Kodi/Emby integration etc.", + "install_methods": [ + { + "type": "default", + "script": "ct/nextpvr.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/nginxproxymanager.json b/frontend/public/json/nginxproxymanager.json new file mode 100644 index 0000000..e937ecc --- /dev/null +++ b/frontend/public/json/nginxproxymanager.json @@ -0,0 +1,43 @@ +{ + "name": "Nginx Proxy Manager", + "slug": "nginxproxymanager", + "categories": [ + 21 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 81, + "documentation": null, + "website": "https://nginxproxymanager.com/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/nginxproxymanager.svg", + "description": "Nginx Proxy Manager is a tool that provides a web-based interface to manage Nginx reverse proxies. It enables users to easily and securely expose their services to the internet by providing features such as HTTPS encryption, domain mapping, and access control. It eliminates the need for manual configuration of Nginx reverse proxies, making it easy for users to quickly and securely expose their services to the public.", + "install_methods": [ + { + "type": "default", + "script": "ct/nginxproxymanager.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin@example.com", + "password": "changeme" + }, + "notes": [ + { + "text": "Since there are hundreds of Certbot instances, it's necessary to install the specific Certbot of your preference. Running `/app/scripts/install-certbot-plugins` within the nginxproxymanager LXC shell will install many additional plugins.", + "type": "warning" + }, + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/nocodb.json b/frontend/public/json/nocodb.json new file mode 100644 index 0000000..bdead1c --- /dev/null +++ b/frontend/public/json/nocodb.json @@ -0,0 +1,34 @@ +{ + "name": "NocoDB", + "slug": "nocodb", + "categories": [ + 25 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://www.nocodb.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/nocodb.svg", + "description": "NocoDB is a document-oriented database management system. It uses the NoSQL (Not Only SQL) data model, which allows for more flexible and scalable data storage than traditional relational databases. NoCoDB stores data in JSON format, making it easier to manage and query complex data structures, and supports a range of data types, including strings, numbers, arrays, and objects. The software provides a web-based interface for managing and querying data, and includes features such as real-time data synchronization, auto-indexing, and full-text search. NoCoDB is designed to be scalable, and can be used for a range of applications, from small projects to large enterprise systems. The software is free and open-source, and is designed to be easy to use and integrate with other applications.", + "install_methods": [ + { + "type": "default", + "script": "ct/nocodb.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/node-red.json b/frontend/public/json/node-red.json new file mode 100644 index 0000000..12ac9ce --- /dev/null +++ b/frontend/public/json/node-red.json @@ -0,0 +1,50 @@ +{ + "name": "Node-Red", + "slug": "node-red", + "categories": [ + 16 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 1880, + "documentation": null, + "website": "https://nodered.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/node-red.svg", + "description": "Node-RED is a visual programming tool that allows developers and non-developers alike to easily wire together hardware devices, APIs, and online services to create custom applications. It provides a visual interface for building workflows, making it easy to create and modify complex integrations without having to write any code. Node-RED is used in a wide range of applications, from simple automations to complex integrations, and is known for its simplicity, versatility, and ease of use.", + "install_methods": [ + { + "type": "default", + "script": "ct/node-red.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-node-red.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To install themes, type `update` in the LXC console. (debian/ubuntu only)", + "type": "info" + } + ] +} diff --git a/frontend/public/json/nodebb.json b/frontend/public/json/nodebb.json new file mode 100644 index 0000000..61b9f01 --- /dev/null +++ b/frontend/public/json/nodebb.json @@ -0,0 +1,40 @@ +{ + "name": "NodeBB", + "slug": "nodebb", + "categories": [ + 10, + 25 + ], + "date_created": "2025-01-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 4567, + "documentation": "https://docs.nodebb.org/", + "website": "https://nodebb.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/nodebb.svg", + "description": "NodeBB Forum Software is powered by Node.js and supports either Redis, MongoDB, or a PostgreSQL database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB takes the best of the modern web: real-time streaming discussions, mobile responsiveness, and rich RESTful read/write APIs, while staying true to the original bulletin board/forum format → categorical hierarchies, local user accounts, and asynchronous messaging.", + "install_methods": [ + { + "type": "default", + "script": "ct/nodebb.sh", + "resources": { + "cpu": 4, + "ram": 2048, + "hdd": 10, + "os": "Ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": "helper-scripts", + "password": "helper-scripts" + }, + "notes": [ + { + "text": "Only use Ubuntu 24.04!", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/notifiarr.json b/frontend/public/json/notifiarr.json new file mode 100644 index 0000000..3e040d0 --- /dev/null +++ b/frontend/public/json/notifiarr.json @@ -0,0 +1,39 @@ +{ + "name": "Notifiarr", + "slug": "notifiarr", + "categories": [ + 14 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5454, + "documentation": null, + "website": "https://notifiarr.com/", + "logo": "https://notifiarr.com/images/logo/notifiarr.png?raw=true", + "description": "Notifiarr is a purpose built system to bring many applications together to manage and customize notifications via Discord. You can monitor many aspects of your network(s), be notified of downtime, be notified of health issues, etc", + "install_methods": [ + { + "type": "default", + "script": "ct/notifiarr.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Manually edit `/etc/notifiarr/notifiarr.conf`to enter the API key from Notifiarr.com, and create a password for the UI.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/npmplus.json b/frontend/public/json/npmplus.json new file mode 100644 index 0000000..cb0d5ce --- /dev/null +++ b/frontend/public/json/npmplus.json @@ -0,0 +1,58 @@ +{ + "name": "NPMplus", + "slug": "npmplus", + "categories": [ + 21 + ], + "date_created": "2025-03-13", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 81, + "documentation": null, + "website": "https://github.com/ZoeyVid/NPMplus", + "logo": "https://raw.githubusercontent.com/ZoeyVid/NPMplus/refs/heads/develop/frontend/app-images/logo-256.png", + "description": "NPMplus is an enhanced version of Nginx Proxy Manager. It simplifies the process of setting up reverse proxies with TLS termination through a user-friendly web interface. Key features include HTTP/3 support, integration with CrowdSec IPS, inclusion of GoAccess for real-time log analysis, and support for ModSecurity with the Core Rule Set.", + "install_methods": [ + { + "type": "default", + "script": "ct/npmplus.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "alpine", + "version": "3.21" + } + }, + { + "type": "alpine", + "script": "ct/npmplus.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": "root", + "password": null + }, + "notes": [ + { + "text": "This uses Docker under the hood, as this can not easily be installed bare-metal. ", + "type": "info" + }, + { + "text": "The initial starting process can be take 1-2min. ", + "type": "info" + }, + { + "text": "Application credentials: `cat /opt/.npm_pwd`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/ntfy.json b/frontend/public/json/ntfy.json new file mode 100644 index 0000000..6b60c42 --- /dev/null +++ b/frontend/public/json/ntfy.json @@ -0,0 +1,34 @@ +{ + "name": "ntfy", + "slug": "ntfy", + "categories": [ + 19 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://ntfy.sh/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/ntfy.svg", + "description": "ntfy (pronounced notify) is a simple HTTP-based pub-sub notification service. It allows you to send notifications to your phone or desktop via scripts from any computer, and/or using a REST API. It's infinitely flexible, and 100% free software.", + "install_methods": [ + { + "type": "default", + "script": "ct/ntfy.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/nxwitness.json b/frontend/public/json/nxwitness.json new file mode 100644 index 0000000..b9b587f --- /dev/null +++ b/frontend/public/json/nxwitness.json @@ -0,0 +1,34 @@ +{ + "name": "Nx Witness", + "slug": "nxwitness", + "categories": [ + 15 + ], + "date_created": "2025-02-13", + "type": "ct", + "updateable": true, + "privileged": true, + "interface_port": 7001, + "documentation": "https://support.networkoptix.com/hc/en-us/articles/360006863413-Access-the-Nx-Witness-User-Manual", + "website": "https://www.networkoptix.com/nx-witness", + "logo": "https://www.networkoptix.com/hs-fs/hubfs/raw_assets/public/NetworkOptix-NB/images/logo.png?width=300&height=75&name=logo.png", + "description": "Nx Witness is a professional video management system (VMS) designed for IP cameras and surveillance systems. It provides real-time video streaming, recording, and remote access with an intuitive user interface. The software supports AI-based video analytics, integrates with third-party security systems, and offers advanced search and event management features. It is used for security monitoring, business intelligence, and large-scale surveillance deployments.", + "install_methods": [ + { + "type": "default", + "script": "ct/nxwitness.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/nzbget.json b/frontend/public/json/nzbget.json new file mode 100644 index 0000000..322fb85 --- /dev/null +++ b/frontend/public/json/nzbget.json @@ -0,0 +1,34 @@ +{ + "name": "NZBGet", + "slug": "nzbget", + "categories": [ + 11 + ], + "date_created": "2024-10-31", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 6789, + "documentation": null, + "website": "https://nzbget.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/nzbget.svg", + "description": "NZBGet is a Usenet downloader focused on efficiency and performance, designed to handle NZB files for downloading content from Usenet. It automates downloading, checking, repairing, and extracting files, optimizing resources to run well on lower-powered devices.", + "install_methods": [ + { + "type": "default", + "script": "ct/nzbget.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "nzbget", + "password": "tegbzn6789" + }, + "notes": [] +} diff --git a/frontend/public/json/octoprint.json b/frontend/public/json/octoprint.json new file mode 100644 index 0000000..67b4071 --- /dev/null +++ b/frontend/public/json/octoprint.json @@ -0,0 +1,34 @@ +{ + "name": "OctoPrint", + "slug": "octoprint", + "categories": [ + 24 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": true, + "interface_port": 5000, + "documentation": null, + "website": "https://octoprint.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/octoprint.svg", + "description": "OctoPrint is a free and open-source web-based 3D printer control software that allows you to remotely control and monitor your 3D printer from a web interface. It was designed to be compatible with a wide range of 3D printers.", + "install_methods": [ + { + "type": "default", + "script": "ct/octoprint.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/olivetin.json b/frontend/public/json/olivetin.json new file mode 100644 index 0000000..45d9cc6 --- /dev/null +++ b/frontend/public/json/olivetin.json @@ -0,0 +1,39 @@ +{ + "name": "OliveTin", + "slug": "olivetin", + "categories": [ + 10 + ], + "date_created": "2024-05-02", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": 1337, + "documentation": null, + "website": "https://www.olivetin.app/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/olivetin.svg", + "description": "OliveTin provides a secure and straightforward way to execute pre-determined shell commands through a web-based interface.", + "install_methods": [ + { + "type": "default", + "script": "misc/olivetin.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Configuration Path: `/etc/OliveTin/config.yaml`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/omada.json b/frontend/public/json/omada.json new file mode 100644 index 0000000..26485ca --- /dev/null +++ b/frontend/public/json/omada.json @@ -0,0 +1,34 @@ +{ + "name": "Omada Controller", + "slug": "omada", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8043, + "documentation": null, + "website": "https://www.tp-link.com/us/support/download/omada-software-controller/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/omada.svg", + "description": "Omada Controller is a software application used to manage TP-Link's Omada EAP (Enterprise Access Point) devices. It allows administrators to centrally manage a large number of EAPs, monitor network performance, and control user access to the network. The software provides an intuitive interface for network configuration, firmware upgrades, and network monitoring. By using the Omada Controller, administrators can streamline the management process, reduce manual intervention, and improve the overall security and reliability of the network.", + "install_methods": [ + { + "type": "default", + "script": "ct/omada.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/ombi.json b/frontend/public/json/ombi.json new file mode 100644 index 0000000..a85f632 --- /dev/null +++ b/frontend/public/json/ombi.json @@ -0,0 +1,34 @@ +{ + "name": "Ombi", + "slug": "ombi", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 5000, + "documentation": null, + "website": "https://ombi.io/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/ombi.svg", + "description": "Ombi is a self-hosted web application designed to empower shared Plex, Emby or Jellyfin users with automated content request capabilities. By integrating with various TV Show and Movie DVR tools, Ombi ensures a smooth and comprehensive experience for your users, allowing them to effortlessly request content on their own.", + "install_methods": [ + { + "type": "default", + "script": "ct/ombi.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/omv.json b/frontend/public/json/omv.json new file mode 100644 index 0000000..41fe9c2 --- /dev/null +++ b/frontend/public/json/omv.json @@ -0,0 +1,39 @@ +{ + "name": "OpenMediaVault", + "slug": "omv", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://www.openmediavault.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/openmediavault.svg", + "description": "OpenMediaVault is a next-generation network-attached storage (NAS) solution based on Debian Linux. It provides a web-based interface for managing and storing digital data, making it easy to use and set up. OpenMediaVault supports various storage protocols, including SMB/CIFS, NFS, and FTP, and provides a wide range of features for data management, such as user and group management, disk quotas, and data backup and recovery. The software is designed to be flexible and scalable, making it a valuable solution for both personal and enterprise use. OpenMediaVault provides a stable and reliable platform for managing and storing digital data, making it a popular choice for those who want to host their own data and ensure its security and privacy. With OpenMediaVault, users can access their data from anywhere and easily share it with others, making it a valuable tool for collaboration and data management.", + "install_methods": [ + { + "type": "default", + "script": "ct/omv.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "openmediavault" + }, + "notes": [ + { + "text": "Running OVM in a LXC container may require a complicated disk setup, consider using a VM instead. More info: `https://github.com/community-scripts/ProxmoxVE/discussions/175`", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/onedev.json b/frontend/public/json/onedev.json new file mode 100644 index 0000000..d8ce9c1 --- /dev/null +++ b/frontend/public/json/onedev.json @@ -0,0 +1,34 @@ +{ + "name": "OneDev", + "slug": "onedev", + "categories": [ + 20 + ], + "date_created": "2024-11-30", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 6610, + "documentation": "https://docs.onedev.io/", + "website": "https://onedev.io/", + "logo": "https://docs.onedev.io/img/logo.svg", + "description": "Git server with CI/CD, kanban, and packages.", + "install_methods": [ + { + "type": "default", + "script": "ct/onedev.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] + } \ No newline at end of file diff --git a/frontend/public/json/opengist.json b/frontend/public/json/opengist.json new file mode 100644 index 0000000..0d285a9 --- /dev/null +++ b/frontend/public/json/opengist.json @@ -0,0 +1,34 @@ +{ + "name": "Opengist", + "slug": "opengist", + "categories": [ + 20 + ], + "date_created": "2025-01-14", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 6157, + "documentation": null, + "website": "https://opengist.io/", + "logo": "https://raw.githubusercontent.com/thomiceli/opengist/master/public/opengist.svg", + "description": "Self-hosted pastebin powered by Git, open-source alternative to Github Gist.", + "install_methods": [ + { + "type": "default", + "script": "ct/opengist.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/openhab.json b/frontend/public/json/openhab.json new file mode 100644 index 0000000..1eadbc9 --- /dev/null +++ b/frontend/public/json/openhab.json @@ -0,0 +1,34 @@ +{ + "name": "openHAB", + "slug": "openhab", + "categories": [ + 16 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8443, + "documentation": "https://www.openhab.org/docs/", + "website": "https://www.openhab.org/", + "logo": "https://www.coxprod.org/domotique/wp-content/uploads/2019/01/openhab-logo-square.png", + "description": "openHAB is a popular open-source home automation platform that provides a vendor and technology agnostic solution for integrating and automating various smart home devices and services. It supports a wide range of devices and protocols, making it easy to bring together different systems and devices into a unified smart home ecosystem. With its user-friendly interface and powerful automation capabilities, openHAB makes it easy to create custom automations and monitor and control your smart home devices and systems, all from a single interface.", + "install_methods": [ + { + "type": "default", + "script": "ct/openhab.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/openobserve.json b/frontend/public/json/openobserve.json new file mode 100644 index 0000000..231297e --- /dev/null +++ b/frontend/public/json/openobserve.json @@ -0,0 +1,39 @@ +{ + "name": "OpenObserve", + "slug": "openobserve", + "categories": [ + 9 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5080, + "documentation": null, + "website": "https://openobserve.ai/", + "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/openobsecure.png?raw=true", + "description": "OpenObserve is a simple yet sophisticated log search, infrastructure monitoring, and APM solution.", + "install_methods": [ + { + "type": "default", + "script": "ct/openobserve.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Show Login Credentials: `cat /opt/openobserve/data/.env`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/openwebui.json b/frontend/public/json/openwebui.json new file mode 100644 index 0000000..404e3da --- /dev/null +++ b/frontend/public/json/openwebui.json @@ -0,0 +1,34 @@ +{ + "name": "Open WebUI", + "slug": "openwebui", + "categories": [ + 20 + ], + "date_created": "2024-10-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://openwebui.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/open-webui.svg", + "description": "OpenWebUI is a self-hosted, web-based interface that allows you to run AI models entirely offline. It integrates with various LLM runners, such as OpenAI and Ollama, and supports features like markdown and LaTeX rendering, model management, and voice/video calls. It also offers multilingual support and the ability to generate images using APIs like DALL-E or ComfyUI", + "install_methods": [ + { + "type": "default", + "script": "ct/openwebui.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 16, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/openwrt.json b/frontend/public/json/openwrt.json new file mode 100644 index 0000000..7f2d01c --- /dev/null +++ b/frontend/public/json/openwrt.json @@ -0,0 +1,35 @@ +{ + "name": "OpenWrt", + "slug": "openwrt", + "categories": [ + 4, + 2 + ], + "date_created": "2024-05-02", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://openwrt.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/openwrt.svg", + "description": "OpenWrt is a powerful open-source firmware that can transform a wide range of networking devices into highly customizable and feature-rich routers, providing users with greater control and flexibility over their network infrastructure.", + "install_methods": [ + { + "type": "default", + "script": "vm/openwrt.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 0.5, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/openziti-tunnel.json b/frontend/public/json/openziti-tunnel.json new file mode 100644 index 0000000..b195c32 --- /dev/null +++ b/frontend/public/json/openziti-tunnel.json @@ -0,0 +1,43 @@ +{ + "name": "openziti-tunnel", + "slug": "openziti-tunnel", + "categories": [ + 4 + ], + "date_created": "2025-04-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://openziti.io/docs/reference/tunnelers/docker/", + "website": "https://www.openziti.io/", + "logo": "https://raw.githubusercontent.com/openziti/ziti-doc/main/docusaurus/static/img/ziti-logo-dark.svg", + "description": "OpenZiti is an open-source, zero trust networking platform that enables secure connectivity between applications, services, and devices. It provides secure, encrypted connections between clients and services, and can be used to create secure, zero trust networks.", + "install_methods": [ + { + "type": "default", + "script": "ct/openziti-tunnel.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "Ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "The Openziti tunnel is installed in host mode; please see documentation for more information", + "type": "info" + }, + { + "text": "Openziti tunnel prompts for identity enrollment token during installation", + "type": "info" + } + ] +} diff --git a/frontend/public/json/opnsense-vm.json b/frontend/public/json/opnsense-vm.json new file mode 100644 index 0000000..61a3f0f --- /dev/null +++ b/frontend/public/json/opnsense-vm.json @@ -0,0 +1,40 @@ +{ + "name": "OPNsense", + "slug": "opnsense-vm", + "categories": [ + 4, + 2 + ], + "date_created": "2025-02-11", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": 443, + "documentation": "https://docs.opnsense.org/", + "website": "https://opnsense.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/opnsense.svg", + "description": "OPNsense is an open-source firewall and routing platform based on FreeBSD. It provides advanced security features, including intrusion detection, VPN support, traffic shaping, and web filtering, with an intuitive web interface for easy management. Known for its reliability and regular updates, OPNsense is a popular choice for both businesses and home networks.", + "install_methods": [ + { + "type": "default", + "script": "vm/opnsense-vm.sh", + "resources": { + "cpu": 4, + "ram": 8192, + "hdd": 10, + "os": "FreeBSD", + "version": "latest" + } + } + ], + "default_credentials": { + "username": "root", + "password": "opnsense" + }, + "notes": [ + { + "text": "It will fail with default settings if there is no vmbr0 and vmbr1 on your node. Use advanced settings in this case.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/outline.json b/frontend/public/json/outline.json new file mode 100644 index 0000000..184a899 --- /dev/null +++ b/frontend/public/json/outline.json @@ -0,0 +1,43 @@ +{ + "name": "Outline", + "slug": "outline", + "categories": [ + 12 + ], + "date_created": "2025-02-26", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.getoutline.com/s/hosting/", + "website": "https://www.getoutline.com", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/outline.svg", + "description": "The fastest knowledge base for growing teams. Beautiful, realtime collaborative, feature packed, and markdown compatible. It’s time to get your team’s knowledge organized.", + "install_methods": [ + { + "type": "default", + "script": "ct/outline.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After installation finishes, application will do a database migration so web UI might be unavailable for a minute or two. Also you need to manually add authentication and/or enable HTTPS.", + "type": "info" + }, + { + "text": "Configuration file is at: `/opt/outline/.env`. Modify to suit your environment.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/overseerr.json b/frontend/public/json/overseerr.json new file mode 100644 index 0000000..a2983d6 --- /dev/null +++ b/frontend/public/json/overseerr.json @@ -0,0 +1,34 @@ +{ + "name": "Overseerr", + "slug": "overseerr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5055, + "documentation": null, + "website": "https://overseerr.dev/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/overseerr.svg", + "description": "Overseerr is a request management and media discovery tool built to work with your existing Plex ecosystem.", + "install_methods": [ + { + "type": "default", + "script": "ct/overseerr.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/owncast.json b/frontend/public/json/owncast.json new file mode 100644 index 0000000..e2b7117 --- /dev/null +++ b/frontend/public/json/owncast.json @@ -0,0 +1,34 @@ +{ + "name": "Owncast", + "slug": "owncast", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://owncast.online/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/owncast.svg", + "description": "Owncast is a free and open source live video and web chat server for use with existing popular broadcasting software.", + "install_methods": [ + { + "type": "default", + "script": "ct/owncast.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "abc123" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/owncloud-vm.json b/frontend/public/json/owncloud-vm.json new file mode 100644 index 0000000..c7b2175 --- /dev/null +++ b/frontend/public/json/owncloud-vm.json @@ -0,0 +1,39 @@ +{ + "name": "ownCloud", + "slug": "owncloud-vm", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://www.turnkeylinux.org/owncloud", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/owncloud.svg", + "description": "TurnKey ownCloud is an open-source file sharing server and collaboration platform that can store your personal content, like documents and pictures, in a centralized location.", + "install_methods": [ + { + "type": "default", + "script": "vm/owncloud-vm.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 12, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": null + }, + "notes": [ + { + "text": "This VM requires extra installation steps, see install guide at `https://github.com/community-scripts/ProxmoxVE/discussions/144`", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/pairdrop.json b/frontend/public/json/pairdrop.json new file mode 100644 index 0000000..b72bbb6 --- /dev/null +++ b/frontend/public/json/pairdrop.json @@ -0,0 +1,34 @@ +{ + "name": "PairDrop", + "slug": "pairdrop", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://github.com/schlagmichdoch/PairDrop", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/pairdrop.svg", + "description": "PairDrop: Local file sharing in your browser.", + "install_methods": [ + { + "type": "default", + "script": "ct/pairdrop.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/paperless-ai.json b/frontend/public/json/paperless-ai.json new file mode 100644 index 0000000..16a0fb8 --- /dev/null +++ b/frontend/public/json/paperless-ai.json @@ -0,0 +1,34 @@ +{ + "name": "PaperlessAI", + "slug": "paperless-ai", + "categories": [ + 20 + ], + "date_created": "2025-02-06", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://github.com/clusterzx/paperless-ai", + "logo": "https://raw.githubusercontent.com/clusterzx/paperless-ai/refs/heads/main/icon.png", + "description": "An automated document analyzer for Paperless-ngx using OpenAI API, Ollama and all OpenAI API compatible Services to automatically analyze and tag your documents.It features: Automode, Manual Mode, Ollama and OpenAI, a Chat function to query your documents with AI, a modern and intuitive Webinterface.", + "install_methods": [ + { + "type": "default", + "script": "ct/paperless-ai.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/paperless-gpt.json b/frontend/public/json/paperless-gpt.json new file mode 100644 index 0000000..59ff75b --- /dev/null +++ b/frontend/public/json/paperless-gpt.json @@ -0,0 +1,39 @@ +{ + "name": "Paperless-GPT", + "slug": "paperless-gpt", + "categories": [ + 20 + ], + "date_created": "2025-03-10", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://github.com/icereed/paperless-gpt", + "logo": "https://raw.githubusercontent.com/icereed/paperless-gpt/refs/heads/main/web-app/src/assets/logo.svg", + "description": "Paperless-GPT seamlessly pairs with paperless-ngx to generate AI-powered document titles and tags, saving you hours of manual sorting. While other tools may offer AI chat features, paperless-gpt stands out by supercharging OCR with LLMs-ensuring high accuracy, even with tricky scans. If you’re craving next-level text extraction and effortless document organization, this is your solution.", + "install_methods": [ + { + "type": "default", + "script": "ct/paperless-gpt.sh", + "resources": { + "cpu": 3, + "ram": 2048, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Configuration File: `/opt/paperless-gpt-data/.env`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/paperless-ngx.json b/frontend/public/json/paperless-ngx.json new file mode 100644 index 0000000..5c64c7e --- /dev/null +++ b/frontend/public/json/paperless-ngx.json @@ -0,0 +1,43 @@ +{ + "name": "Paperless-ngx", + "slug": "paperless-ngx", + "categories": [ + 12 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8000, + "documentation": null, + "website": "https://docs.paperless-ngx.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/paperless-ngx.svg", + "description": "Paperless-ngx is a software tool designed for digitizing and organizing paper documents. It provides a web-based interface for scanning, uploading, and organizing paper documents, making it easier to manage, search, and access important information. Paperless-ngx uses the OCR (Optical Character Recognition) technology to extract text from scanned images and makes it searchable, thus increasing the efficiency of document management.", + "install_methods": [ + { + "type": "default", + "script": "ct/paperless-ngx.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Show Login Credentials, type `update` in the LXC console", + "type": "info" + }, + { + "text": "Script installs English as default OCR language. To install additional languages, use `apt-get install tesseract-ocr-[lang]`, where [lang] is the language code (e.g. `apt-get install tesseract-ocr-deu`).", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/part-db.json b/frontend/public/json/part-db.json new file mode 100644 index 0000000..67d66bb --- /dev/null +++ b/frontend/public/json/part-db.json @@ -0,0 +1,39 @@ +{ + "name": "Part-DB", + "slug": "part-db", + "categories": [ + 25 + ], + "date_created": "2024-12-18", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://docs.part-db.de/", + "website": "https://github.com/Part-DB/Part-DB-server", + "logo": "https://avatars.githubusercontent.com/u/36010898?s=48&v=4", + "description": "Part-DB is an Open source inventory management system for your electronic components", + "install_methods": [ + { + "type": "default", + "script": "ct/part-db.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Show login and database credentials: `cat partdb.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/paymenter.json b/frontend/public/json/paymenter.json new file mode 100644 index 0000000..490d16f --- /dev/null +++ b/frontend/public/json/paymenter.json @@ -0,0 +1,34 @@ +{ + "name": "Paymenter", + "slug": "paymenter", + "categories": [ + 21 + ], + "date_created": "2025-01-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://paymenter.org/docs", + "website": "https://paymenter.org/", + "logo": "https://avatars.githubusercontent.com/u/115177786?s=200&v=4", + "description": "Paymenter is an open source webshop solution for hosting companies. It's developed to provide an more easy way to manage your hosting company.", + "install_methods": [ + { + "type": "default", + "script": "ct/paymenter.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin@paymenter.org", + "password": "paymenter" + }, + "notes": [] +} diff --git a/frontend/public/json/pbs-microcode.json b/frontend/public/json/pbs-microcode.json new file mode 100644 index 0000000..1541a82 --- /dev/null +++ b/frontend/public/json/pbs-microcode.json @@ -0,0 +1,43 @@ +{ + "name": "Proxmox Backup Server Processor Microcode", + "slug": "pbs-microcode", + "categories": [ + 1 + ], + "date_created": "2025-02-07", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/processor.png?raw=true", + "description": "Processor Microcode is a layer of low-level software that runs on the processor and provides patches or updates to its firmware. Microcode updates can fix hardware bugs, improve performance, and enhance security features of the processor. This script is adapted for the Proxmox Backup Server environment and will only run on bare metal systems. If running in a virtualized environment, the script will exit. Note that firmware update mechanisms, such as Intel's Management Engine (ME) or AMD's Platform Security Processor (PSP), may vary depending on your processor and its implementation. Please consult your processor's documentation to verify if firmware updates can be applied through the operating system.", + "install_methods": [ + { + "type": "default", + "script": "misc/pbs_microcode.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox Backup Server shell on a bare metal system. The script will exit if it detects that it is running in a virtualized environment.", + "type": "info" + }, + { + "text": "After a reboot, you can check whether any microcode updates are currently in effect by running the following command: `journalctl -k | grep -E \"microcode\" | head -n 1`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/peanut.json b/frontend/public/json/peanut.json new file mode 100644 index 0000000..139c990 --- /dev/null +++ b/frontend/public/json/peanut.json @@ -0,0 +1,34 @@ +{ + "name": "PeaNUT", + "slug": "peanut", + "categories": [ + 4 + ], + "date_created": "2024-06-14", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://github.com/Brandawg93/PeaNUT/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/peanut.svg", + "description": "PeaNUT is a small dashboard for Network UPS Tools (NUT). It provides a web interface to monitor and manage UPS devices. PeaNUT allows users to view device status, retrieve information, and manage UPS parameters through its API. It's customizable for different UPS devices and supports integration with the Homepage dashboard.", + "install_methods": [ + { + "type": "default", + "script": "ct/peanut.sh", + "resources": { + "cpu": 2, + "ram": 3072, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/pelican-panel.json b/frontend/public/json/pelican-panel.json new file mode 100644 index 0000000..42c3677 --- /dev/null +++ b/frontend/public/json/pelican-panel.json @@ -0,0 +1,43 @@ +{ + "name": "Pelican Panel", + "slug": "pelican-panel", + "categories": [ + 24 + ], + "date_created": "2025-02-27", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://pelican.dev/docs/panel/getting-started", + "website": "https://pelican.dev/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pelican-panel.svg", + "description": "Pelican Panel is a web-based control panel for managing game and application servers. It provides an intuitive interface to start, stop, configure, and monitor servers easily. It works alongside Pelican Wings, a lightweight daemon that handles server deployments and resource management.", + "install_methods": [ + { + "type": "default", + "script": "ct/pelican-panel.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Database credentials: `cat ~/pelican-panel.creds`", + "type": "info" + }, + { + "text": "Step 5 of the Panel installer can be skipped because it has already been set up by the script.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/pelican-wings.json b/frontend/public/json/pelican-wings.json new file mode 100644 index 0000000..b074ad8 --- /dev/null +++ b/frontend/public/json/pelican-wings.json @@ -0,0 +1,39 @@ +{ + "name": "Pelican Wings", + "slug": "pelican-wings", + "categories": [ + 24 + ], + "date_created": "2025-02-27", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://pelican.dev/docs/wings/install", + "website": "https://pelican.dev/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pelican-panel.svg", + "description": "Pelican Wings is Pelican's server control plane, built for the rapidly changing gaming industry and designed to be highly performant and secure. Wings provides an HTTP API allowing you to interface directly with running server instances, fetch server logs, generate backups, and control all aspects of the server lifecycle.", + "install_methods": [ + { + "type": "default", + "script": "ct/pelican-wings.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After installation, you need to use the Auto Deploy command generated by Pelican Panel and, after running the command, restart the Wings service with `systemctl restart wings.service`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/petio.json b/frontend/public/json/petio.json new file mode 100644 index 0000000..d8fc23b --- /dev/null +++ b/frontend/public/json/petio.json @@ -0,0 +1,34 @@ +{ + "name": "Petio", + "slug": "petio", + "categories": [ + 13 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7777, + "documentation": null, + "website": "https://petio.tv/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/petio.webp", + "description": "Petio is a third party companion app available to Plex server owners to allow their users to request, review and discover content.", + "install_methods": [ + { + "type": "default", + "script": "ct/petio.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "ubuntu", + "version": "20.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/pf2etools.json b/frontend/public/json/pf2etools.json new file mode 100644 index 0000000..6db3e37 --- /dev/null +++ b/frontend/public/json/pf2etools.json @@ -0,0 +1,34 @@ +{ + "name": "Pf2eTools", + "slug": "pf2etools", + "categories": [ + 24 + ], + "date_created": "2025-02-13", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://github.com/Pf2eToolsOrg/Pf2eTools/wiki", + "website": "https://pf2etools.com/", + "logo": "https://raw.githubusercontent.com/Pf2eToolsOrg/Pf2eTools/refs/heads/dev/android-chrome-192x192.png", + "description": "Pf2eTools is an open-source website aiming to provide tools and information for Pathfinder 2nd Edition players and gamemasters. It's built using basic web technologies to ensure wide compatibility, and utilises client-side caching for speed, efficiency, and offline access.", + "install_methods": [ + { + "type": "default", + "script": "ct/pf2etools.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/photoprism.json b/frontend/public/json/photoprism.json new file mode 100644 index 0000000..4917d10 --- /dev/null +++ b/frontend/public/json/photoprism.json @@ -0,0 +1,39 @@ +{ + "name": "PhotoPrism", + "slug": "photoprism", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 2342, + "documentation": null, + "website": "https://photoprism.app/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/photoprism.svg", + "description": "PhotoPrism is an AI-Powered Photos App for the Decentralized Web. It makes use of the latest technologies to tag and find pictures automatically without getting in your way.", + "install_methods": [ + { + "type": "default", + "script": "ct/photoprism.sh", + "resources": { + "cpu": 2, + "ram": 3072, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "changeme" + }, + "notes": [ + { + "text": "Please note that Ubuntu 22.04 and Debian 12 are supported, while older Linux distributions may not be compatible.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/phpipam.json b/frontend/public/json/phpipam.json new file mode 100644 index 0000000..7d0592a --- /dev/null +++ b/frontend/public/json/phpipam.json @@ -0,0 +1,34 @@ +{ + "name": "phpIPAM", + "slug": "phpipam", + "categories": [ + 4 + ], + "date_created": "2025-01-15", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://phpipam.net/documents/all-documents/", + "website": "https://phpipam.net/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/phpipam.webp", + "description": "phpipam is an open-source web IP address management application (IPAM). Its goal is to provide light, modern and useful IP address management.", + "install_methods": [ + { + "type": "default", + "script": "ct/phpipam.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "Admin", + "password": "ipamadmin" + }, + "notes": [] +} diff --git a/frontend/public/json/pialert.json b/frontend/public/json/pialert.json new file mode 100644 index 0000000..f661c01 --- /dev/null +++ b/frontend/public/json/pialert.json @@ -0,0 +1,39 @@ +{ + "name": "Pi.Alert", + "slug": "pialert", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://github.com/leiweibau/Pi.Alert/", + "logo": "https://raw.githubusercontent.com/leiweibau/Pi.Alert/main/front/img/favicons/glass_black_white.png", + "description": "Pi.Alert is a WIFI / LAN intruder detector. Checks the devices connected and alert you with unknown devices. It also warns of the disconnection of \"always connected\" devices.", + "install_methods": [ + { + "type": "default", + "script": "ct/pialert.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/pihole.json b/frontend/public/json/pihole.json new file mode 100644 index 0000000..9e88548 --- /dev/null +++ b/frontend/public/json/pihole.json @@ -0,0 +1,51 @@ +{ + "name": "Pi-Hole", + "slug": "pihole", + "categories": [ + 5 + ], + "date_created": "2024-04-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://docs.pi-hole.net/", + "website": "https://pi-hole.net/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pi-hole.svg", + "description": "Pi-hole is a free, open-source network-level advertisement and Internet tracker blocking application. It runs on a Raspberry Pi or other Linux-based systems and acts as a DNS sinkhole, blocking unwanted traffic before it reaches a user's device. Pi-hole can also function as a DHCP server, providing IP addresses and other network configuration information to devices on a network. The software is highly configurable and supports a wide range of customizations, such as allowing or blocking specific domains, setting up blocklists and whitelists, and customizing the appearance of the web-based interface. The main purpose of Pi-hole is to protect users' privacy and security by blocking unwanted and potentially malicious content, such as ads, trackers, and malware. It is designed to be easy to set up and use, and can be configured through a web-based interface or through a terminal-based command-line interface.", + "install_methods": [ + { + "type": "default", + "script": "ct/pihole.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To set your password, log in to the container, and type the following: `pihole setpassword`", + "type": "info" + }, + { + "text": "With an option to add Unbound", + "type": "info" + }, + { + "text": "With an option to configure Unbound as a forwarding DNS server (using DNS-over-TLS (DoT)) as opposed to a recursive DNS server", + "type": "info" + }, + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/pimox-haos-vm.json b/frontend/public/json/pimox-haos-vm.json new file mode 100644 index 0000000..02b8f31 --- /dev/null +++ b/frontend/public/json/pimox-haos-vm.json @@ -0,0 +1,39 @@ +{ + "name": "PiMox HAOS", + "slug": "pimox-haos-vm", + "categories": [ + 16 + ], + "date_created": "2024-04-29", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": 8123, + "documentation": null, + "website": "https://github.com/jiangcuo/Proxmox-Port", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/home-assistant.svg", + "description": "The script automates the manual process of finding, downloading and extracting the aarch64 (qcow2) disk image provided by the Home Assistant Team, creating a VM with user defined settings, importing and attaching the disk, setting the boot order and starting the VM.", + "install_methods": [ + { + "type": "default", + "script": "vm/pimox-haos-vm.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 32, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After the script completes, click on the VM, then on the Summary or Console tab to find the VM IP.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/pingvin.json b/frontend/public/json/pingvin.json new file mode 100644 index 0000000..67cf2e1 --- /dev/null +++ b/frontend/public/json/pingvin.json @@ -0,0 +1,34 @@ +{ + "name": "Pingvin Share", + "slug": "pingvin", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://github.com/stonith404/pingvin-share", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pingvin-share.svg", + "description": "Pingvin Share is self-hosted file sharing platform and an alternative for WeTransfer.", + "install_methods": [ + { + "type": "default", + "script": "ct/pingvin.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/plant-it.json b/frontend/public/json/plant-it.json new file mode 100644 index 0000000..41c397b --- /dev/null +++ b/frontend/public/json/plant-it.json @@ -0,0 +1,43 @@ +{ + "name": "Plant-it", + "slug": "plant-it", + "categories": [ + 24 + ], + "date_created": "2025-03-11", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.plant-it.org/latest/", + "website": "https://plant-it.org/", + "logo": "https://raw.githubusercontent.com/MDeLuise/plant-it/refs/heads/main/images/plant-it-logo.png", + "description": "Plant-it is a self-hosted, open-source app designed to help users manage and track plant care. It allows users to add plants, log activities like watering, fertilizing, and pruning, set reminders, and upload photos for visual tracking. The app includes a database of over 400,000 plant species, offering detailed care information such as optimal growing conditions and maintenance tips.\n\nUsers can organize their plant collection, monitor growth, and share data with others. The app is free to use and works on Android, iOS, and the web.", + "install_methods": [ + { + "type": "default", + "script": "ct/plant-it.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This Script use Adoptium JDK 21 - Sometimes the installation of these takes a while", + "type": "info" + }, + { + "text": "After the initial start, the backend requires approx. 1-2 minutes boot time", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/plex.json b/frontend/public/json/plex.json new file mode 100644 index 0000000..ace3f47 --- /dev/null +++ b/frontend/public/json/plex.json @@ -0,0 +1,43 @@ +{ + "name": "Plex Media Server", + "slug": "plex", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 32400, + "documentation": null, + "website": "https://www.plex.tv/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/plex.svg", + "description": "Plex personal media server magically scans and organizes your files, sorting your media intuitively and beautifully.", + "install_methods": [ + { + "type": "default", + "script": "ct/plex.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "ubuntu", + "version": "22.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "With Privileged/Unprivileged Hardware Acceleration Support", + "type": "info" + }, + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/pocketbase.json b/frontend/public/json/pocketbase.json new file mode 100644 index 0000000..088cd59 --- /dev/null +++ b/frontend/public/json/pocketbase.json @@ -0,0 +1,34 @@ +{ + "name": "Pocketbase", + "slug": "pocketbase", + "categories": [ + 8 + ], + "date_created": "2024-05-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://pocketbase.io/docs/", + "website": "https://pocketbase.io/", + "logo": "https://pocketbase.io/images/logo.svg", + "description": "PocketBase is an open source backend consisting of embedded database (SQLite) with realtime subscriptions, built-in auth management, convenient dashboard UI and simple REST-ish API.", + "install_methods": [ + { + "type": "default", + "script": "ct/pocketbase.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/pocketid.json b/frontend/public/json/pocketid.json new file mode 100644 index 0000000..942bbe6 --- /dev/null +++ b/frontend/public/json/pocketid.json @@ -0,0 +1,43 @@ +{ + "name": "Pocket ID", + "slug": "pocketid", + "categories": [ + 6 + ], + "date_created": "2025-01-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://pocket-id.org/docs/", + "website": "https://github.com/pocket-id/pocket-id", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pocket-id.svg", + "description": "Pocket ID is a simple OIDC provider that allows users to authenticate with their passkeys to your services.", + "install_methods": [ + { + "type": "default", + "script": "ct/pocketid.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Pocket ID requires https to work.", + "type": "warning" + }, + { + "text": "Configuration Path: `/opt/pocket-id/backend/.env`, `/opt/pocket-id/frontend/.env`.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/podman-homeassistant.json b/frontend/public/json/podman-homeassistant.json new file mode 100644 index 0000000..56a54d6 --- /dev/null +++ b/frontend/public/json/podman-homeassistant.json @@ -0,0 +1,51 @@ +{ + "name": "Podman Home Assistant Container", + "slug": "podman-homeassistant", + "categories": [ + 16 + ], + "date_created": "2024-04-29", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8123, + "documentation": "https://www.home-assistant.io/docs/", + "website": "https://www.home-assistant.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/home-assistant.svg", + "description": "A standalone Podman container-based installation of Home Assistant Core means that the Home Assistant Core software is installed inside a container managed by Podman, separate from the host operating system. This provides a flexible and scalable solution for running the software, as the container can be easily moved between host systems or isolated from other processes for security. Podman is a popular open-source tool for managing containers that is similar to Docker, but designed for use on Linux systems without a daemon.\r\n\r\n\ud83d\udec8 If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "install_methods": [ + { + "type": "default", + "script": "ct/podman-homeassistant.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 16, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If the LXC is created Privileged, the script will automatically set up USB passthrough.", + "type": "warning" + }, + { + "text": "config path: `/var/lib/containers/storage/volumes/hass_config/_data`", + "type": "info" + }, + { + "text": "Options to Install Portainer or Portainer Agent", + "type": "warning" + }, + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/podman.json b/frontend/public/json/podman.json new file mode 100644 index 0000000..eb2871f --- /dev/null +++ b/frontend/public/json/podman.json @@ -0,0 +1,39 @@ +{ + "name": "Podman", + "slug": "podman", + "categories": [ + 3 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://podman.io/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/podman.svg", + "description": "Podman is an open-source, daemonless, and portable container engine that allows users to manage containers on Linux systems without the need for a daemon or system service to be running in the background. It provides an API and a command-line interface that can be used to create, run, and manage containers and their associated networks, volumes, and images. It is built on top of the Open Container Initiative (OCI) runtime specification, making it compatible with other OCI-compliant container engines.", + "install_methods": [ + { + "type": "default", + "script": "ct/podman.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Options to Install Portainer or Portainer Agent", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/post-pbs-install.json b/frontend/public/json/post-pbs-install.json new file mode 100644 index 0000000..3fb6e93 --- /dev/null +++ b/frontend/public/json/post-pbs-install.json @@ -0,0 +1,47 @@ +{ + "name": "Proxmox Backup Server Post Install", + "slug": "post-pbs-install", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "The script will give options to Disable the Enterprise Repo, Add/Correct PBS Sources, Enable the No-Subscription Repo, Add Test Repo, Disable Subscription Nag, Update Proxmox Backup Server and Reboot PBS.", + "install_methods": [ + { + "type": "default", + "script": "misc/post-pbs-install.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Proxmox Backup Server ONLY", + "type": "info" + }, + { + "text": "Execute within the Proxmox Backup Server Shell", + "type": "info" + }, + { + "text": "It is recommended to answer “yes” (y) to all options presented during the process.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/post-pmg-install.json b/frontend/public/json/post-pmg-install.json new file mode 100644 index 0000000..70f906d --- /dev/null +++ b/frontend/public/json/post-pmg-install.json @@ -0,0 +1,47 @@ +{ + "name": "Proxmox Mail Gateway Post Install", + "slug": "post-pmg-install", + "categories": [ + 1 + ], + "date_created": "2025-01-20", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "The script will give options to Disable the Enterprise Repo, Add/Correct PMG Sources, Enable the No-Subscription Repo, Add Test Repo, Disable Subscription Nag, Update Proxmox Mail Gateway and Reboot PMG.", + "install_methods": [ + { + "type": "default", + "script": "misc/post-pmg-install.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Proxmox Mail Gateway ONLY", + "type": "warning" + }, + { + "text": "Execute within the Proxmox Mail Gateway Shell", + "type": "info" + }, + { + "text": "It is recommended to answer “yes” (y) to all options presented during the process.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/post-pve-install.json b/frontend/public/json/post-pve-install.json new file mode 100644 index 0000000..f849aaa --- /dev/null +++ b/frontend/public/json/post-pve-install.json @@ -0,0 +1,43 @@ +{ + "name": "Proxmox VE Post Install", + "slug": "post-pve-install", + "categories": [ + 1 + ], + "date_created": "2024-04-28", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "This script provides options for managing Proxmox VE repositories, including disabling the Enterprise Repo, adding or correcting PVE sources, enabling the No-Subscription Repo, adding the test Repo, disabling the subscription nag, updating Proxmox VE, and rebooting the system.", + "install_methods": [ + { + "type": "default", + "script": "misc/post-pve-install.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + }, + { + "text": "It is recommended to answer “yes” (y) to all options presented during the process.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/postgresql.json b/frontend/public/json/postgresql.json new file mode 100644 index 0000000..9a95379 --- /dev/null +++ b/frontend/public/json/postgresql.json @@ -0,0 +1,48 @@ +{ + "name": "PostgreSQL", + "slug": "postgresql", + "categories": [8], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 5432, + "documentation": null, + "website": "https://www.postgresql.org/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/postgresql.svg", + "description": "PostgreSQL (often referred to as Postgres) is an open-source relational database management system that is known for its extensibility and strict adherence to SQL standards. It is a free and powerful database solution, suitable for a wide range of applications, from small projects to large enterprise systems. PostgreSQL is widely used for its reliability, feature-richness, and robustness.", + "install_methods": [ + { + "type": "default", + "script": "ct/postgresql.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-postgresql.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Set a password after installation for postgres user by running `echo \"ALTER USER postgres with encrypted password 'your_password';\" | sudo -u postgres psql`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/privatebin.json b/frontend/public/json/privatebin.json new file mode 100644 index 0000000..62cc187 --- /dev/null +++ b/frontend/public/json/privatebin.json @@ -0,0 +1,34 @@ +{ + "name": "PrivateBin", + "slug": "privatebin", + "categories": [ + 12 + ], + "date_created": "2025-01-29", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://github.com/PrivateBin/PrivateBin/wiki", + "website": "https://github.com/PrivateBin/PrivateBin", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/privatebin.svg", + "description": "PrivateBin is a minimalist, open-source pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256-bit AES.", + "install_methods": [ + { + "type": "default", + "script": "ct/privatebin.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/projectsend.json b/frontend/public/json/projectsend.json new file mode 100644 index 0000000..6cb6bbf --- /dev/null +++ b/frontend/public/json/projectsend.json @@ -0,0 +1,39 @@ +{ + "name": "ProjectSend", + "slug": "projectsend", + "categories": [ + 12 + ], + "date_created": "2025-01-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://docs.projectsend.org/", + "website": "https://projectsend.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/projectsend.svg", + "description": "ProjectSend is a free, open source software that lets you share files with your clients, focused on ease of use and privacy. It supports clients groups, system users roles, statistics, multiple languages, detailed logs... and much more!", + "install_methods": [ + { + "type": "default", + "script": "ct/projectsend.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After running the update script, logging in as a system user in ProjectSend is necessary to upgrade the database.", + "type": "info" + } + ] + } \ No newline at end of file diff --git a/frontend/public/json/prometheus-alertmanager.json b/frontend/public/json/prometheus-alertmanager.json new file mode 100644 index 0000000..5247fea --- /dev/null +++ b/frontend/public/json/prometheus-alertmanager.json @@ -0,0 +1,34 @@ +{ + "name": "Prometheus Alertmanager", + "slug": "prometheus-alertmanager", + "categories": [ + 9 + ], + "date_created": "2025-01-09", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9093, + "documentation": "https://prometheus.io/docs/alerting/latest/overview/", + "website": "https://prometheus.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/prometheus.svg", + "description": "Alerting with Prometheus is separated into two parts. Alerting rules in Prometheus servers send alerts to an Alertmanager. The Alertmanager then manages those alerts, including silencing, inhibition, aggregation and sending out notifications via methods such as email, on-call notification systems, and chat platforms.", + "install_methods": [ + { + "type": "default", + "script": "ct/prometheus-alertmanager.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/prometheus-paperless-ngx-exporter.json b/frontend/public/json/prometheus-paperless-ngx-exporter.json new file mode 100644 index 0000000..05dd437 --- /dev/null +++ b/frontend/public/json/prometheus-paperless-ngx-exporter.json @@ -0,0 +1,43 @@ +{ + "name": "Prometheus Paperless NGX Exporter", + "slug": "prometheus-paperless-ngx-exporter", + "categories": [ + 9 + ], + "date_created": "2025-02-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8081, + "documentation": null, + "website": "https://github.com/hansmi/prometheus-paperless-exporter", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/paperless-ngx.svg", + "description": "Prometheus metrics exporter for Paperless-NGX, a document management system transforming physical documents into a searchable online archive. The exporter relies on Paperless' REST API.", + "install_methods": [ + { + "type": "default", + "script": "ct/prometheus-paperless-ngx-exporter.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Please adjust the Paperless URL in the systemd unit file: /etc/systemd/system/prometheus-paperless-ngx-exporter.service", + "type": "info" + }, + { + "text": "Please adjust the Paperless authentication token in the configuration file: /etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file", + "type": "info" + } + ] +} diff --git a/frontend/public/json/prometheus-pve-exporter.json b/frontend/public/json/prometheus-pve-exporter.json new file mode 100644 index 0000000..ecaa9df --- /dev/null +++ b/frontend/public/json/prometheus-pve-exporter.json @@ -0,0 +1,40 @@ +{ + "name": "Prometheus Proxmox VE Exporter", + "slug": "prometheus-pve-exporter", + "categories": [ + 1, + 9 + ], + "date_created": "2025-01-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9221, + "documentation": "https://github.com/prometheus-pve/prometheus-pve-exporter", + "website": "https://github.com/prometheus-pve/prometheus-pve-exporter", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "An exporter that exposes information gathered from Proxmox VE node for use by the Prometheus monitoring system.", + "install_methods": [ + { + "type": "default", + "script": "ct/prometheus-pve-exporter.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Please adjust the Proxmox credentials in the configuration file: /opt/prometheus-pve-exporter/pve.yml", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/prometheus.json b/frontend/public/json/prometheus.json new file mode 100644 index 0000000..db7d866 --- /dev/null +++ b/frontend/public/json/prometheus.json @@ -0,0 +1,45 @@ +{ + "name": "Prometheus", + "slug": "prometheus", + "categories": [ + 9 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9090, + "documentation": null, + "website": "https://prometheus.io/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/prometheus.svg", + "description": "Prometheus is widely used to monitor the performance and health of various infrastructure components and applications, and trigger alerts based on predefined rules. It has a multi-dimensional data model and supports various data sources and exporters, making it an extremely flexible and scalable monitoring solution.", + "install_methods": [ + { + "type": "default", + "script": "ct/prometheus.sh", + "resources": { + "cpu": 1, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-prometheus.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/prowlarr.json b/frontend/public/json/prowlarr.json new file mode 100644 index 0000000..9020a23 --- /dev/null +++ b/frontend/public/json/prowlarr.json @@ -0,0 +1,34 @@ +{ + "name": "Prowlarr", + "slug": "prowlarr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9696, + "documentation": null, + "website": "https://github.com/Prowlarr/Prowlarr", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/prowlarr.svg", + "description": "Prowlarr is a software tool designed to integrate with various PVR (Personal Video Recorder) apps. It is built on a popular *arr .net/ReactJS base stack and serves as an indexer manager and proxy. Prowlarr makes it easy to manage and organize TV show and movie collections, by integrating with popular PVR apps and automating the downloading and organizing of media files. The software provides a web-based interface for managing and organizing TV shows and movies, making it easy to search and find content. Prowlarr also supports metadata management, including show and movie information, making it easy for users to keep their media collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing media collections, making it a valuable tool for media enthusiasts who want to keep their collection organized and up-to-date. With Prowlarr, users can enjoy their media collection from anywhere, making it a powerful tool for managing and sharing media files.", + "install_methods": [ + { + "type": "default", + "script": "ct/prowlarr.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/proxmox-backup-server.json b/frontend/public/json/proxmox-backup-server.json new file mode 100644 index 0000000..f1bfd9a --- /dev/null +++ b/frontend/public/json/proxmox-backup-server.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox Backup Server", + "slug": "proxmox-backup-server", + "categories": [ + 1 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8007, + "documentation": "https://pbs.proxmox.com/docs/", + "website": "https://www.proxmox.com/en/proxmox-backup-server/overview", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "Proxmox Backup Server is an enterprise backup solution, for backing up and restoring VMs, containers, and physical hosts. By supporting incremental, fully deduplicated backups, Proxmox Backup Server significantly reduces network load and saves valuable storage space.", + "install_methods": [ + { + "type": "default", + "script": "ct/proxmox-backup-server.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "root", + "password": null + }, + "notes": [ + { + "text": "Set a root password if using autologin. This will be the PBS password. `passwd root`", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/proxmox-datacenter-manager.json b/frontend/public/json/proxmox-datacenter-manager.json new file mode 100644 index 0000000..72f960c --- /dev/null +++ b/frontend/public/json/proxmox-datacenter-manager.json @@ -0,0 +1,43 @@ +{ + "name": "Proxmox Datacenter Manager", + "slug": "proxmox-datacenter-manager", + "categories": [ + 1 + ], + "date_created": "2024-12-25", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8443, + "documentation": "https://pve.proxmox.com/wiki/Proxmox_Datacenter_Manager_Roadmap", + "website": "https://pve.proxmox.com/wiki/Proxmox_Datacenter_Manager_Roadmap", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "The Proxmox Datacenter Manager project has been developed with the objective of providing a centralized overview of all your individual nodes and clusters. It also enables basic management like migrations of virtual guests without any cluster network requirements. ", + "install_methods": [ + { + "type": "default", + "script": "ct/proxmox-datacenter-manager.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Set a root password if using autologin. This will be the Proxmox-Datacenter-Manager password. `sudo passwd root`", + "type": "info" + }, + { + "text": "Proxmox Datacenter Manager is in an alpha stage of development. Use it cautiously, as bugs, incomplete features, and potential instabilities are expected.", + "type": "warning" + } + ] + } diff --git a/frontend/public/json/proxmox-mail-gateway.json b/frontend/public/json/proxmox-mail-gateway.json new file mode 100644 index 0000000..79d3649 --- /dev/null +++ b/frontend/public/json/proxmox-mail-gateway.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox Mail Gateway", + "slug": "proxmox-mail-gateway", + "categories": [ + 1 + ], + "date_created": "2025-02-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8006, + "documentation": "https://pmg.proxmox.com/pmg-docs/pmg-admin-guide.html", + "website": "https://www.proxmox.com/en/products/proxmox-mail-gateway/overview", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/proxmox.svg", + "description": "Proxmox Mail Gateway is the leading open-source email security solution helping you to protect your mail server against all email threats from the moment they emerge.", + "install_methods": [ + { + "type": "default", + "script": "ct/proxmox-mail-gateway.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "root", + "password": null + }, + "notes": [ + { + "text": "Set a root password if using autologin. This will be the PMG password. `passwd root`", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/ps5-mqtt.json b/frontend/public/json/ps5-mqtt.json new file mode 100644 index 0000000..355a668 --- /dev/null +++ b/frontend/public/json/ps5-mqtt.json @@ -0,0 +1,39 @@ +{ + "name": "PS5-MQTT", + "slug": "ps5-mqtt", + "categories": [ + 18 + ], + "date_created": "2025-01-09", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8645, + "documentation": null, + "website": "https://github.com/FunkeyFlo/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/ps5-mqtt.svg", + "description": "Integrate your Sony Playstation 5 devices with Home Assistant using MQTT.", + "install_methods": [ + { + "type": "default", + "script": "ct/ps5-mqtt.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 3, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After installation, the MQTT endpoint must be configured. The configuration file is located within the LXC container at: `/opt/.config/ps5-mqtt/config.json`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/pterodactyl-panel.json b/frontend/public/json/pterodactyl-panel.json new file mode 100644 index 0000000..87b3261 --- /dev/null +++ b/frontend/public/json/pterodactyl-panel.json @@ -0,0 +1,39 @@ +{ + "name": "Pterodactyl Panel", + "slug": "pterodactyl-panel", + "categories": [ + 24 + ], + "date_created": "2025-03-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://pterodactyl.io/panel/1.0/getting_started.html", + "website": "https://pterodactyl.io", + "logo": "https://pterodactyl.io/logos/pterry.svg", + "description": "Pterodactyl Panel is a web-based control panel for managing game and application servers. It provides an intuitive interface to start, stop, configure, and monitor servers easily. It works alongside Pterodactyl Wings, a lightweight daemon that handles server deployments and resource management.", + "install_methods": [ + { + "type": "default", + "script": "ct/pterodactyl-panel.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Show login and database credentials: `cat ~/pterodactyl-panel.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/pterodactyl-wings.json b/frontend/public/json/pterodactyl-wings.json new file mode 100644 index 0000000..0d04915 --- /dev/null +++ b/frontend/public/json/pterodactyl-wings.json @@ -0,0 +1,39 @@ +{ + "name": "Pterodactyl Wings", + "slug": "pterodactyl-wings", + "categories": [ + 24 + ], + "date_created": "2025-03-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://pterodactyl.io/wings/1.0/installing.html", + "website": "https://pterodactyl.io", + "logo": "https://pterodactyl.io/logos/pterry.svg", + "description": "Pterodactyl Wings is Pterodactyl's server control plane, built for the rapidly changing gaming industry and designed to be highly performant and secure. Wings provides an HTTP API allowing you to interface directly with running server instances, fetch server logs, generate backups, and control all aspects of the server lifecycle.", + "install_methods": [ + { + "type": "default", + "script": "ct/pterodactyl-wings.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After installation, you need to use the Auto Deploy command generated by Pterodactyl Panel and, after running the command, restart the Wings service with `systemctl restart wings.service`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/qbittorrent.json b/frontend/public/json/qbittorrent.json new file mode 100644 index 0000000..77c0367 --- /dev/null +++ b/frontend/public/json/qbittorrent.json @@ -0,0 +1,34 @@ +{ + "name": "qBittorrent", + "slug": "qbittorrent", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8090, + "documentation": null, + "website": "https://www.qbittorrent.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/qbittorrent.svg", + "description": "qBittorrent offers a user-friendly interface that allows users to search for and download torrent files easily. It also supports magnet links, which allow users to start downloading files without the need for a torrent file.", + "install_methods": [ + { + "type": "default", + "script": "ct/qbittorrent.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "changeme" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/rabbitmq.json b/frontend/public/json/rabbitmq.json new file mode 100644 index 0000000..ab9b9c8 --- /dev/null +++ b/frontend/public/json/rabbitmq.json @@ -0,0 +1,34 @@ +{ + "name": "RabbitMQ", + "slug": "rabbitmq", + "categories": [ + 18 + ], + "date_created": "2024-06-27", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 15672, + "documentation": null, + "website": "https://www.rabbitmq.com/", + "logo": "https://raw.githubusercontent.com/rabbitmq/rabbitmq-website/main/static/img/rabbitmq-logo.svg", + "description": "RabbitMQ is a robust messaging broker widely used for message queuing, streaming, and decoupling services. It supports multiple messaging protocols, ensures reliable message delivery, and offers features like routing, clustering, and federation. RabbitMQ is suitable for various use cases, including microservices communication, real-time data processing, and IoT applications.", + "install_methods": [ + { + "type": "default", + "script": "ct/rabbitmq.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/radarr.json b/frontend/public/json/radarr.json new file mode 100644 index 0000000..78903b3 --- /dev/null +++ b/frontend/public/json/radarr.json @@ -0,0 +1,34 @@ +{ + "name": "Radarr", + "slug": "radarr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7878, + "documentation": null, + "website": "https://radarr.video/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/radarr.svg", + "description": "Radarr is a movie management tool designed for Usenet and BitTorrent users. It allows users to manage and organize their movie collection with ease. Radarr integrates with popular Usenet and BitTorrent clients, such as Sonarr and Lidarr, to automate the downloading and organizing of movie files. The software provides a web-based interface for managing and organizing movies, making it easy to search and find titles, genres, and release dates. Radarr also supports metadata management, including movie posters and information, making it easy for users to keep their movie collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing movie collections, making it a valuable tool for movie enthusiasts who want to keep their collection organized and up-to-date. With Radarr, users can enjoy their movie collection from anywhere, making it a powerful tool for managing and sharing movie files.", + "install_methods": [ + { + "type": "default", + "script": "ct/radarr.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/radicale.json b/frontend/public/json/radicale.json new file mode 100644 index 0000000..255408d --- /dev/null +++ b/frontend/public/json/radicale.json @@ -0,0 +1,43 @@ +{ + "name": "Radicale", + "slug": "radicale", + "categories": [ + 6 + ], + "date_created": "2025-02-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 5232, + "documentation": "https://radicale.org/master.html#documentation-1", + "website": "https://radicale.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/radicale.svg", + "description": "Radicale is a small but powerful CalDAV (calendars, to-do lists) and CardDAV (contacts)", + "install_methods": [ + { + "type": "default", + "script": "ct/radicale.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To view the user credentials : `cat radicale.creds`", + "type": "info" + }, + { + "text": "This application requires additional configuration. Please refer to https://github.com/community-scripts/ProxmoxVE/discussions/2073.", + "type": "info" + } + ] + } \ No newline at end of file diff --git a/frontend/public/json/rdtclient.json b/frontend/public/json/rdtclient.json new file mode 100644 index 0000000..983e95e --- /dev/null +++ b/frontend/public/json/rdtclient.json @@ -0,0 +1,34 @@ +{ + "name": "Real-Debrid Torrent Client", + "slug": "rdtclient", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 6500, + "documentation": null, + "website": "https://github.com/rogerfar/rdt-client", + "logo": "https://fcdn.real-debrid.com/0820/images/logo.png", + "description": "RDTClient is a web interface to manage your torrents on Real-Debrid, AllDebrid or Premiumize.", + "install_methods": [ + { + "type": "default", + "script": "ct/rdtclient.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/readarr.json b/frontend/public/json/readarr.json new file mode 100644 index 0000000..19bb9d7 --- /dev/null +++ b/frontend/public/json/readarr.json @@ -0,0 +1,34 @@ +{ + "name": "Readarr", + "slug": "readarr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8787, + "documentation": null, + "website": "https://readarr.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/readarr.svg", + "description": "Readarr is an eBook and audiobook management tool designed for Usenet and BitTorrent users. It allows users to manage and organize their eBook and audiobook collection with ease. Readarr integrates with popular Usenet and BitTorrent clients, such as Sonarr and Lidarr, to automate the downloading and organizing of eBook and audiobook files. The software provides a web-based interface for managing and organizing eBooks and audiobooks, making it easy to search and find titles, authors, and genres. Readarr also supports metadata management, including cover art and information, making it easy for users to keep their eBook and audiobook collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing eBook and audiobook collections, making it a valuable tool for book and audiobook enthusiasts who want to keep their collection organized and up-to-date. With Readarr, users can enjoy their eBook and audiobook collection from anywhere, making it a powerful tool for managing and sharing book and audiobook files.", + "install_methods": [ + { + "type": "default", + "script": "ct/readarr.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/readeck.json b/frontend/public/json/readeck.json new file mode 100644 index 0000000..9b1dbef --- /dev/null +++ b/frontend/public/json/readeck.json @@ -0,0 +1,34 @@ +{ + "name": "Readeck", + "slug": "readeck", + "categories": [ + 12 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8000, + "documentation": null, + "website": "https://readeck.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/readeck.svg", + "description": "Readeck helps you keep all that web content you want to revisit in an hour, tomorrow, or in 20 years.", + "install_methods": [ + { + "type": "default", + "script": "ct/readeck.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/recyclarr.json b/frontend/public/json/recyclarr.json new file mode 100644 index 0000000..53c2ea7 --- /dev/null +++ b/frontend/public/json/recyclarr.json @@ -0,0 +1,34 @@ +{ + "name": "Recyclarr", + "slug": "recyclarr", + "categories": [ + 14 + ], + "date_created": "2024-11-15", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://recyclarr.dev/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/recyclarr.svg", + "description": "Recyclarr is an automation tool that integrates with media management software like Sonarr and Radarr. It helps users manage and organize their media libraries by automatically searching for and adding content from indexers, based on user-defined criteria. It streamlines the process of maintaining and updating media collections without manual intervention.", + "install_methods": [ + { + "type": "default", + "script": "ct/recyclarr.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/redis.json b/frontend/public/json/redis.json new file mode 100644 index 0000000..3f633f8 --- /dev/null +++ b/frontend/public/json/redis.json @@ -0,0 +1,50 @@ +{ + "name": "Redis ", + "slug": "redis", + "categories": [ + 8 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://redis.io/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/redis.svg", + "description": "Redis is an open-source, in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker.", + "install_methods": [ + { + "type": "default", + "script": "ct/redis.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-redis.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Redis Configuration: `nano /etc/redis/redis.conf` or in Alpine: `nano /etc/redis.conf`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/revealjs.json b/frontend/public/json/revealjs.json new file mode 100644 index 0000000..ed0fd0f --- /dev/null +++ b/frontend/public/json/revealjs.json @@ -0,0 +1,43 @@ +{ + "name": "RevealJS", + "slug": "revealjs", + "categories": [ + 12 + ], + "date_created": "2025-03-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8000, + "documentation": "https://github.com/hakimel/reveal.js/wiki", + "website": "https://github.com/hakimel/reveal.js", + "logo": "https://static.slid.es/reveal/logo-v1/reveal-white-text.svg", + "description": "reveal.js is an open source HTML presentation framework. It's a tool that enables anyone with a web browser to create fully-featured and beautiful presentations for free.", + "install_methods": [ + { + "type": "default", + "script": "ct/revealjs.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Config file is at `/opt/revealjs/gulpfile.js`. Check the documentation for more information.", + "type": "info" + }, + { + "text": "LiveReload is on port: 35729", + "type": "info" + } + ] +} diff --git a/frontend/public/json/rtsptoweb.json b/frontend/public/json/rtsptoweb.json new file mode 100644 index 0000000..2c29791 --- /dev/null +++ b/frontend/public/json/rtsptoweb.json @@ -0,0 +1,34 @@ +{ + "name": "RTSPtoWeb", + "slug": "rtsptoweb", + "categories": [ + 24 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8083, + "documentation": null, + "website": "https://github.com/deepch/RTSPtoWeb", + "logo": "https://brands.home-assistant.io/_/rtsp_to_webrtc/logo.png?raw=true", + "description": "RTSPtoWeb converts your RTSP streams to formats consumable in a web browser like MSE (Media Source Extensions), WebRTC, or HLS. It's fully native Golang without the use of FFmpeg or GStreamer", + "install_methods": [ + { + "type": "default", + "script": "ct/rtsptoweb.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/runtipi.json b/frontend/public/json/runtipi.json new file mode 100644 index 0000000..5980e2f --- /dev/null +++ b/frontend/public/json/runtipi.json @@ -0,0 +1,39 @@ +{ + "name": "Runtipi", + "slug": "runtipi", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://runtipi.io/", + "logo": "https://runtipi.io/_next/static/media/tipi.c0b9b68e.png", + "description": "Runtipi lets you install all your favorite self-hosted apps without the hassle of configuring and managing each service. One-click installs and updates for more than 180 popular apps.", + "install_methods": [ + { + "type": "default", + "script": "ct/runtipi.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/rustdeskserver.json b/frontend/public/json/rustdeskserver.json new file mode 100644 index 0000000..7536a6a --- /dev/null +++ b/frontend/public/json/rustdeskserver.json @@ -0,0 +1,39 @@ +{ + "name": "RustDesk Server", + "slug": "rustdeskserver", + "categories": [ + 21 + ], + "date_created": "2025-02-13", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://rustdesk.com/docs/en/", + "website": "https://rustdesk.com/", + "logo": "https://rustdesk.com/_astro/logo.BKb61-he.svg", + "description": "RustDesk is a full-featured open source remote control alternative for self-hosting and security with minimal configuration.", + "install_methods": [ + { + "type": "default", + "script": "ct/rustdeskserver.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Check our configuration guide for help: `https://github.com/community-scripts/ProxmoxVE/discussions/2388`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/sabnzbd.json b/frontend/public/json/sabnzbd.json new file mode 100644 index 0000000..233397a --- /dev/null +++ b/frontend/public/json/sabnzbd.json @@ -0,0 +1,34 @@ +{ + "name": "SABnzbd", + "slug": "sabnzbd", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7777, + "documentation": null, + "website": "https://sabnzbd.org/", + "logo": "https://raw.githubusercontent.com/sabnzbd/sabnzbd/develop/icons/logo-arrow.svg", + "description": "SABnzbd is a free, open-source software program for downloading binary files from Usenet newsgroups. It is designed to be easy to use, and provides a number of features to simplify the downloading process, such as automatic error detection and repair, download scheduling, and integration with other applications. SABnzbd is a binary newsreader, which means it is specifically designed for downloading binary files, such as images, music, and video, from Usenet newsgroups. With its user-friendly interface and powerful features, SABnzbd makes it easy to manage your Usenet downloads and keep your download queue organized.", + "install_methods": [ + { + "type": "default", + "script": "ct/sabnzbd.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/scaling-governor.json b/frontend/public/json/scaling-governor.json new file mode 100644 index 0000000..3c4be95 --- /dev/null +++ b/frontend/public/json/scaling-governor.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox VE CPU Scaling Governor", + "slug": "scaling-governor", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": "https://www.kernel.org/doc/html/latest/admin-guide/pm/cpufreq.html?#generic-scaling-governors", + "website": null, + "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/cpu.png?raw=true", + "description": "The CPU scaling governor determines how the CPU frequency is adjusted based on the workload, with the goal of either conserving power or improving performance. By scaling the frequency up or down, the operating system can optimize the CPU usage and conserve energy when possible. Generic Scaling Governors", + "install_methods": [ + { + "type": "default", + "script": "misc/scaling-governor.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} diff --git a/frontend/public/json/seafile.json b/frontend/public/json/seafile.json new file mode 100644 index 0000000..ddabe7e --- /dev/null +++ b/frontend/public/json/seafile.json @@ -0,0 +1,47 @@ +{ + "name": "Seafile", + "slug": "seafile", + "categories": [ + 12 + ], + "date_created": "2025-03-11", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8000, + "documentation": "https://manual.seafile.com/11.0/deploy", + "website": "https://seafile.com", + "logo": "https://manual.seafile.com/11.0/media/seafile-transparent-1024.png", + "description": "Seafile is an open source file sync and share platform, focusing on reliability and performance.", + "install_methods": [ + { + "type": "default", + "script": "ct/seafile.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 20, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Application credentials: `cat ~/seafile.creds`", + "type": "info" + }, + { + "text": "Change STORAGE_DIR value in `external-storage.sh` and run `bash external-storage.sh` to use your defined storage instead of internal.", + "type": "info" + }, + { + "text": "Execute `~/domain.sh ` to enable access to Seafile via your domain. Example: ~/domain.sh https://seafile.example.com", + "type": "info" + } + ] +} diff --git a/frontend/public/json/searxng.json b/frontend/public/json/searxng.json new file mode 100644 index 0000000..32565a0 --- /dev/null +++ b/frontend/public/json/searxng.json @@ -0,0 +1,34 @@ +{ + "name": "SearXNG", + "slug": "searxng", + "categories": [ + 0 + ], + "date_created": "2025-02-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8888, + "documentation": "https://docs.searxng.org/", + "website": "https://github.com/searxng/searxng", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/searxng.svg", + "description": "SearXNG is a free internet metasearch engine which aggregates results from up to 215 search services. Users are neither tracked nor profiled. Additionally, SearXNG can be used over Tor for online anonymity.", + "install_methods": [ + { + "type": "default", + "script": "ct/searxng.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/seelf.json b/frontend/public/json/seelf.json new file mode 100644 index 0000000..a27feda --- /dev/null +++ b/frontend/public/json/seelf.json @@ -0,0 +1,39 @@ +{ + "name": "seelf", + "slug": "seelf", + "categories": [ + 4 + ], + "date_created": "2025-02-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://yuukanoo.github.io/seelf/guide/quickstart.html", + "website": "https://yuukanoo.github.io/seelf/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/seelf.svg", + "description": "seelf is a self-hosted software which makes it easy to deploy your own applications on your own hardware using an easy to use interface.", + "install_methods": [ + { + "type": "default", + "script": "ct/seelf.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Initial admin email and password: `cat ~/seelf.creds`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/semaphore.json b/frontend/public/json/semaphore.json new file mode 100644 index 0000000..30ff770 --- /dev/null +++ b/frontend/public/json/semaphore.json @@ -0,0 +1,43 @@ +{ + "name": "Semaphore", + "slug": "semaphore", + "categories": [ + 19 + ], + "date_created": "2025-01-01", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.semaphoreui.com/", + "website": "https://semaphoreui.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/semaphore-ui.svg", + "description": "Semaphore UI is a modern web interface for managing popular DevOps tools", + "install_methods": [ + { + "type": "default", + "script": "ct/semaphore.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": null + }, + "notes": [ + { + "text": "This instance uses BoltDB", + "type": "info" + }, + { + "text": "Admin password: `cat ~/semaphore.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/sftpgo.json b/frontend/public/json/sftpgo.json new file mode 100644 index 0000000..9d8f939 --- /dev/null +++ b/frontend/public/json/sftpgo.json @@ -0,0 +1,34 @@ +{ + "name": "SFTPGo", + "slug": "sftpgo", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://github.com/drakkan/sftpgo", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/sftpgo.webp", + "description": "SFTPGo is a fully featured and highly configurable SFTP server with optional HTTP/S, FTP/S and WebDAV support. Several storage backends are supported: local filesystem, encrypted local filesystem, S3 (compatible) Object Storage, Google Cloud Storage, Azure Blob Storage, SFTP.", + "install_methods": [ + { + "type": "default", + "script": "ct/sftpgo.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/shinobi.json b/frontend/public/json/shinobi.json new file mode 100644 index 0000000..05d8970 --- /dev/null +++ b/frontend/public/json/shinobi.json @@ -0,0 +1,34 @@ +{ + "name": "Shinobi NVR", + "slug": "shinobi", + "categories": [ + 15 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://shinobi.video/", + "logo": "https://gitlab.com/uploads/-/system/project/avatar/6947723/mstile-150x150.png?raw=true", + "description": "Shinobi is an open-source, self-hosted network video recording (NVR) software. It allows you to manage and monitor security cameras and record video footage. Shinobi can be run on various platforms including Linux, macOS, and Raspberry Pi, and offers features such as real-time streaming, motion detection, and email notifications.", + "install_methods": [ + { + "type": "default", + "script": "ct/shinobi.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "ubuntu", + "version": "22.04" + } + } + ], + "default_credentials": { + "username": "admin@shinobi.video", + "password": "admin" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/silverbullet.json b/frontend/public/json/silverbullet.json new file mode 100644 index 0000000..0c24ff5 --- /dev/null +++ b/frontend/public/json/silverbullet.json @@ -0,0 +1,34 @@ +{ + "name": "Silverbullet", + "slug": "silverbullet", + "categories": [ + 12 + ], + "date_created": "2024-12-03", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://silverbullet.md/Manual", + "website": "https://silverbullet.md", + "logo": "https://silverbullet.md/.client/logo.png", + "description": "SilverBullet is a note-taking application optimized for people with a hacker mindset.", + "install_methods": [ + { + "type": "default", + "script": "ct/silverbullet.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/slskd.json b/frontend/public/json/slskd.json new file mode 100644 index 0000000..9919ccd --- /dev/null +++ b/frontend/public/json/slskd.json @@ -0,0 +1,43 @@ +{ + "name": "slskd", + "slug": "slskd", + "categories": [ + 11 + ], + "date_created": "2025-03-31", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5030, + "documentation": "https://github.com/slskd/slskd/tree/master/docs", + "website": "https://github.com/slskd/slskd", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/slskd.png", + "description": "A modern client-server application for the Soulseek file sharing network. ", + "install_methods": [ + { + "type": "default", + "script": "ct/slskd.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "slskd", + "password": "slskd" + }, + "notes": [ + { + "text": "See /opt/slskd/config/slskd.yml to add your Soulseek credentials", + "type": "info" + }, + { + "text": "This LXC includes Soularr; it needs to be configured (/opt/soularr/config.ini) before it will work", + "type": "info" + } + ] +} diff --git a/frontend/public/json/smokeping.json b/frontend/public/json/smokeping.json new file mode 100644 index 0000000..c4b8c83 --- /dev/null +++ b/frontend/public/json/smokeping.json @@ -0,0 +1,34 @@ +{ + "name": "SmokePing", + "slug": "smokeping", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://oss.oetiker.ch/smokeping/", + "logo": "https://images.g2crowd.com/uploads/product/image/large_detail/large_detail_5ca8465f5b01fc1048c47aba6f79b6c6/smokeping.png", + "description": "SmokePing is a deluxe latency measurement tool. It can measure, store and display latency, latency distribution and packet loss.", + "install_methods": [ + { + "type": "default", + "script": "ct/smokeping.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/snipeit.json b/frontend/public/json/snipeit.json new file mode 100644 index 0000000..c12cd10 --- /dev/null +++ b/frontend/public/json/snipeit.json @@ -0,0 +1,39 @@ +{ + "name": "SnipeIT", + "slug": "snipeit", + "categories": [ + 25 + ], + "date_created": "2024-12-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://snipe-it.readme.io/docs/overview", + "website": "https://snipeitapp.com/", + "logo": "https://raw.githubusercontent.com/snipe/snipe-it/refs/heads/master/public/img/snipe-logo-bug.png", + "description": "This is a FOSS project for asset management in IT Operations. Knowing who has which laptop, when it was purchased in order to depreciate it correctly, handling software licenses, etc.", + "install_methods": [ + { + "type": "default", + "script": "ct/snipeit.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Post Install: `https://github.com/community-scripts/ProxmoxVE/discussions/671`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/sonarr.json b/frontend/public/json/sonarr.json new file mode 100644 index 0000000..4fe862b --- /dev/null +++ b/frontend/public/json/sonarr.json @@ -0,0 +1,34 @@ +{ + "name": "Sonarr", + "slug": "sonarr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8989, + "documentation": null, + "website": "https://sonarr.tv/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/sonarr.svg", + "description": "Sonarr is a personal video recorder (PVR) software designed for Usenet and BitTorrent users. It allows users to manage and organize their TV show collection with ease. Sonarr integrates with popular Usenet and BitTorrent clients, such as NZBget and Transmission, to automate the downloading and organizing of TV show files. The software provides a web-based interface for managing and organizing TV shows, making it easy to search and find titles, seasons, and episodes. Sonarr also supports metadata management, including TV show posters and information, making it easy for users to keep their TV show collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing TV show collections, making it a valuable tool for TV show enthusiasts who want to keep their collection organized and up-to-date. With Sonarr, users can enjoy their TV show collection from anywhere, making it a powerful tool for managing and sharing TV show files.", + "install_methods": [ + { + "type": "default", + "script": "ct/sonarr.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/spoolman.json b/frontend/public/json/spoolman.json new file mode 100644 index 0000000..76c37b3 --- /dev/null +++ b/frontend/public/json/spoolman.json @@ -0,0 +1,34 @@ +{ + "name": "Spoolman", + "slug": "spoolman", + "categories": [ + 24 + ], + "date_created": "2024-06-13", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 7912, + "documentation": null, + "website": "https://github.com/Donkie/Spoolman", + "logo": "https://raw.githubusercontent.com/Donkie/Spoolman/master/client/public/favicon.svg", + "description": "Spoolman is a self-hosted web service designed to help you efficiently manage your 3D printer filament spools and monitor their usage.", + "install_methods": [ + { + "type": "default", + "script": "ct/spoolman.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/sqlserver2022.json b/frontend/public/json/sqlserver2022.json new file mode 100644 index 0000000..818b88c --- /dev/null +++ b/frontend/public/json/sqlserver2022.json @@ -0,0 +1,47 @@ +{ + "name":"SQL Server 2022", + "slug":"sqlserver2022", + "categories":[ + 8 + ], + "date_created":"2025-01-14", + "type":"ct", + "updateable":true, + "privileged":true, + "interface_port":1433, + "documentation":"https://learn.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver16", + "website":"https://www.microsoft.com/en-us/sql-server/sql-server-2022", + "logo":"https://www.svgrepo.com/show/303229/microsoft-sql-server-logo.svg", + "description":"Script to automatically set up a SQL Server 2022 installation.", + "install_methods":[ + { + "type":"default", + "script":"ct/sqlserver2022.sh", + "resources":{ + "cpu":1, + "ram":2048, + "hdd":10, + "os":"Ubuntu", + "version":"22.04" + } + } + ], + "default_credentials":{ + "username":null, + "password":null + }, + "notes":[ + { + "text":"if you not choose the install setup, execute: `/opt/mssql/bin/mssql-conf setup` in LXC shell.", + "type":"info" + }, + { + "text":"You can setup the admin account 'SA' during installation", + "type":"info" + }, + { + "text":"Do disable the SA account if you intent to use this in production!", + "type":"warning" + } + ] +} diff --git a/frontend/public/json/stirling-pdf.json b/frontend/public/json/stirling-pdf.json new file mode 100644 index 0000000..2548f21 --- /dev/null +++ b/frontend/public/json/stirling-pdf.json @@ -0,0 +1,34 @@ +{ + "name": "Stirling-PDF", + "slug": "stirling-pdf", + "categories": [ + 12 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://github.com/Stirling-Tools/Stirling-PDF", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/stirling-pdf.svg", + "description": "Stirling-PDF is a powerful locally hosted web based PDF manipulation tool that allows you to perform various operations on PDF files, such as splitting merging, converting, reorganizing, adding images, rotating, compressing, and more.", + "install_methods": [ + { + "type": "default", + "script": "ct/stirling-pdf.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/suwayomi-server.json b/frontend/public/json/suwayomi-server.json new file mode 100644 index 0000000..b28a991 --- /dev/null +++ b/frontend/public/json/suwayomi-server.json @@ -0,0 +1,39 @@ +{ + "name": "Suwayomi-Server", + "slug": "suwayomi-server", + "categories": [ + 13 + ], + "date_created": "2025-02-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 4567, + "documentation": "https://github.com/Suwayomi/Suwayomi-Server/wiki", + "website": "https://github.com/Suwayomi/Suwayomi-Server", + "logo": "https://github.com/Suwayomi/Suwayomi-Server/raw/master/server/src/main/resources/icon/faviconlogo.png", + "description": "A free and open source manga reader server that runs extensions built for Mihon (Tachiyomi).", + "install_methods": [ + { + "type": "default", + "script": "ct/suwayomiserver.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This application is conflicting with Kaspersky products. You need to disable Kaspersky in order to use this application.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/syncthing.json b/frontend/public/json/syncthing.json new file mode 100644 index 0000000..27c6ee9 --- /dev/null +++ b/frontend/public/json/syncthing.json @@ -0,0 +1,34 @@ +{ + "name": "Syncthing", + "slug": "syncthing", + "categories": [ + 12 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8384, + "documentation": null, + "website": "https://syncthing.net/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/syncthing.svg", + "description": "Syncthing is an open-source file syncing tool that allows users to keep their files in sync across multiple devices by using peer-to-peer synchronization. It doesn't rely on any central server, so all data transfers are directly between devices.", + "install_methods": [ + { + "type": "default", + "script": "ct/syncthing.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/tandoor.json b/frontend/public/json/tandoor.json new file mode 100644 index 0000000..bf8f7a0 --- /dev/null +++ b/frontend/public/json/tandoor.json @@ -0,0 +1,34 @@ +{ + "name": "Tandoor Recipes", + "slug": "tandoor", + "categories": [ + 24 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8002, + "documentation": null, + "website": "https://tandoor.dev/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/tandoor.svg", + "description": "Tandoor Recipes is an application for managing recipes, planning meals, building shopping lists and much much more!", + "install_methods": [ + { + "type": "default", + "script": "ct/tandoor.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/tasmoadmin.json b/frontend/public/json/tasmoadmin.json new file mode 100644 index 0000000..826c07e --- /dev/null +++ b/frontend/public/json/tasmoadmin.json @@ -0,0 +1,34 @@ +{ + "name": "TasmoAdmin", + "slug": "tasmoadmin", + "categories": [ + 16 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 9999, + "documentation": null, + "website": "https://github.com/TasmoAdmin/TasmoAdmin#readme", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/tasmoadmin.svg", + "description": "TasmoAdmin is an administrative platform for devices flashed with Tasmota.", + "install_methods": [ + { + "type": "default", + "script": "ct/tasmoadmin.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/tasmocompiler.json b/frontend/public/json/tasmocompiler.json new file mode 100644 index 0000000..be74004 --- /dev/null +++ b/frontend/public/json/tasmocompiler.json @@ -0,0 +1,34 @@ +{ + "name": "TasmoCompiler", + "slug": "tasmocompiler", + "categories": [ + 16 + ], + "date_created": "2025-02-10", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/benzino77/tasmocompiler/blob/master/README.md", + "website": "https://github.com/benzino77/tasmocompiler", + "logo": "https://github.com/benzino77/tasmocompiler/raw/master/docs/logo/tasmocompiler-symbol.svg", + "description": "TasmoCompiler is a simple web GUI which allows you to compile fantastic Tasmota firmware with your own settings.", + "install_methods": [ + { + "type": "default", + "script": "ct/tasmocompiler.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/tautulli.json b/frontend/public/json/tautulli.json new file mode 100644 index 0000000..034be79 --- /dev/null +++ b/frontend/public/json/tautulli.json @@ -0,0 +1,34 @@ +{ + "name": "Tautulli", + "slug": "tautulli", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8181, + "documentation": null, + "website": "https://tautulli.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/tautulli.svg", + "description": "Tautulli allows you to monitor and track your Plex Media Server usage, such as viewing statistics and analysis of your media library. It can be used to monitor user activity, get notifications about new media added to your library, and even generate reports on your media usage.", + "install_methods": [ + { + "type": "default", + "script": "ct/tautulli.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/tdarr.json b/frontend/public/json/tdarr.json new file mode 100644 index 0000000..a712d93 --- /dev/null +++ b/frontend/public/json/tdarr.json @@ -0,0 +1,39 @@ +{ + "name": "Tdarr", + "slug": "tdarr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8265, + "documentation": null, + "website": "https://tdarr.io/", + "logo": "https://home.tdarr.io/static/media/logo3-min.246d6df44c7f16ddebaf.png", + "description": "Tdarr is a media transcoding application designed to automate the transcode and remux management of a media library. It uses conditional-based processing to determine the required encoding and remux operations for each file in the library. The software integrates with popular media management tools, such as Sonarr and Radarr, to ensure that newly added media files are automatically processed and optimized for the user's desired playback device. Tdarr provides a web-based interface for monitoring and managing the transcoding process, and also supports real-time logging and reporting. The software is designed to be flexible and configurable, with a wide range of encoding and remux options available to users. Tdarr is an ideal solution for media enthusiasts who want to optimize their library for seamless playback on a variety of devices, while also streamlining the management and maintenance of their media library.", + "install_methods": [ + { + "type": "default", + "script": "ct/tdarr.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "With Privileged/Unprivileged Hardware Acceleration Support", + "type": "info" + } + ] +} diff --git a/frontend/public/json/technitiumdns.json b/frontend/public/json/technitiumdns.json new file mode 100644 index 0000000..44177de --- /dev/null +++ b/frontend/public/json/technitiumdns.json @@ -0,0 +1,39 @@ +{ + "name": "Technitium DNS", + "slug": "technitiumdns", + "categories": [ + 5 + ], + "date_created": "2024-04-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5380, + "documentation": null, + "website": "https://technitium.com/dns/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/technitium.svg", + "description": "Technitium DNS Server is a free, open-source and privacy-focused DNS (Domain Name System) server software for Windows, Linux, and macOS. It is designed to provide a secure, fast, and reliable DNS resolution service to its users. The server can be configured through a web-based interface, and it supports a variety of advanced features, such as automatic IP updates, IPv6 support, caching of DNS queries, and the ability to block unwanted domains. It is also designed to be highly secure, with built-in measures to prevent common types of DNS attacks and data leaks. Technitium DNS Server is aimed at providing an alternative to traditional DNS servers, which often have privacy and security concerns associated with them, and it is ideal for users who are looking for a more secure and private DNS resolution service.", + "install_methods": [ + { + "type": "default", + "script": "ct/technitiumdns.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/teddycloud.json b/frontend/public/json/teddycloud.json new file mode 100644 index 0000000..a807317 --- /dev/null +++ b/frontend/public/json/teddycloud.json @@ -0,0 +1,39 @@ +{ + "name": "TeddyCloud", + "slug": "teddycloud", + "categories": [ + 13 + ], + "date_created": "2024-12-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://tonies-wiki.revvox.de/docs/tools/teddycloud/", + "website": "https://tonies-wiki.revvox.de/docs/tools/teddycloud/", + "logo": "https://avatars.githubusercontent.com/u/57543015", + "description": "TeddyCloud is an open source server replacement for the Boxine Cloud.", + "install_methods": [ + { + "type": "default", + "script": "ct/teddycloud.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "First start of the service can take some time due to certificate generation.", + "type": "warn" + } + ] +} diff --git a/frontend/public/json/the-lounge.json b/frontend/public/json/the-lounge.json new file mode 100644 index 0000000..493e7ab --- /dev/null +++ b/frontend/public/json/the-lounge.json @@ -0,0 +1,39 @@ +{ + "name": "The Lounge", + "slug": "the-lounge", + "categories": [ + 22 + ], + "date_created": "2024-11-28", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9000, + "documentation": "https://thelounge.chat/docs", + "website": "https://thelounge.chat/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/the-lounge.svg", + "description": "Modern web IRC client designed for self-hosting ", + "install_methods": [ + { + "type": "default", + "script": "ct/the-lounge.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "The Lounge is running in private mode. Use `runuser -u thelounge -- thelounge add usernamehere` to create users.", + "type": "info" + } + ] + } diff --git a/frontend/public/json/threadfin.json b/frontend/public/json/threadfin.json new file mode 100644 index 0000000..bea0c57 --- /dev/null +++ b/frontend/public/json/threadfin.json @@ -0,0 +1,34 @@ +{ + "name": "Threadfin", + "slug": "threadfin", + "categories": [ + 13 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 34400, + "documentation": null, + "website": "https://github.com/Threadfin/Threadfin", + "logo": "https://raw.githubusercontent.com/Threadfin/Threadfin/main/html/img/threadfin.png", + "description": "Threadfin is a M3U proxy for Kernel, Plex, Jellyfin, or Emby, based on xTeVe.", + "install_methods": [ + { + "type": "default", + "script": "ct/threadfin.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/tianji.json b/frontend/public/json/tianji.json new file mode 100644 index 0000000..944a233 --- /dev/null +++ b/frontend/public/json/tianji.json @@ -0,0 +1,34 @@ +{ + "name": "Tianji", + "slug": "tianji", + "categories": [ + 9 + ], + "date_created": "2024-09-14", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 12345, + "documentation": null, + "website": "https://tianji.msgbyte.com/", + "logo": "https://tianji.msgbyte.com/img/logo.svg", + "description": "Tianji is an open-source tool for website analytics, uptime monitoring, and server status tracking, all in one. It\u2019s lightweight, privacy-focused, and helps teams monitor web traffic, server health, and gather user interaction data", + "install_methods": [ + { + "type": "default", + "script": "ct/tianji.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 12, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/traccar.json b/frontend/public/json/traccar.json new file mode 100644 index 0000000..33206b3 --- /dev/null +++ b/frontend/public/json/traccar.json @@ -0,0 +1,34 @@ +{ + "name": "Traccar", + "slug": "traccar", + "categories": [ + 0 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8082, + "documentation": null, + "website": "https://www.traccar.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/traccar.svg", + "description": "Traccar is an open source GPS tracking system. It supports more than 200 GPS protocols and more than 2000 models of GPS tracking devices.", + "install_methods": [ + { + "type": "default", + "script": "ct/traccar.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/traefik.json b/frontend/public/json/traefik.json new file mode 100644 index 0000000..80fa935 --- /dev/null +++ b/frontend/public/json/traefik.json @@ -0,0 +1,34 @@ +{ + "name": "Traefik", + "slug": "traefik", + "categories": [ + 21 + ], + "date_created": "2024-05-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://traefik.io/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/traefik-gopher.svg", + "description": "Traefik (pronounced traffic) is an open-source edge router and reverse proxy that simplifies managing microservices. It automatically discovers services, dynamically updates routing rules without downtime, provides load balancing, handles SSL termination, and supports various middleware for added functionality. Ideal for cloud-native environments, it integrates seamlessly with platforms like Docker and Kubernetes.", + "install_methods": [ + { + "type": "default", + "script": "ct/traefik.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/transmission.json b/frontend/public/json/transmission.json new file mode 100644 index 0000000..ea7c722 --- /dev/null +++ b/frontend/public/json/transmission.json @@ -0,0 +1,34 @@ +{ + "name": "Transmission", + "slug": "transmission", + "categories": [ + 11 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 9091, + "documentation": null, + "website": "https://transmissionbt.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/transmission.svg", + "description": "Transmission is a free, open-source BitTorrent client known for its fast download speeds and ease of use. It supports various platforms such as Windows, Linux, and macOS and has features like web interface, peer exchange, and encrypted transfers.", + "install_methods": [ + { + "type": "default", + "script": "ct/transmission.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "transmission", + "password": "transmission" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/trilium.json b/frontend/public/json/trilium.json new file mode 100644 index 0000000..acf0a01 --- /dev/null +++ b/frontend/public/json/trilium.json @@ -0,0 +1,34 @@ +{ + "name": "TriliumNext", + "slug": "trilium", + "categories": [ + 12 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": null, + "website": "https://github.com/TriliumNext/Notes", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/triliumnext.svg", + "description": "TriliumNext is an newer Fork of Trilium. TriliumNext is an open-source note-taking and personal knowledge management application. It allows users to organize and manage their notes, ideas, and information in a single place, using a hierarchical tree-like structure. Trilium offers a range of features, including rich text formatting, links, images, and attachments, making it easy to create and structure notes. The software is designed to be flexible and customizable, with a range of customization options and plugins available, including themes, export options, and more. Trilium is a self-hosted solution, and can be run on a local machine or a cloud-based server, providing users with full control over their notes and information.", + "install_methods": [ + { + "type": "default", + "script": "ct/trilium.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/turnkey.json b/frontend/public/json/turnkey.json new file mode 100644 index 0000000..91aa6bb --- /dev/null +++ b/frontend/public/json/turnkey.json @@ -0,0 +1,43 @@ +{ + "name": "TurnKey", + "slug": "turnkey", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "turnkey", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://www.turnkeylinux.org/", + "logo": "https://blog.desdelinux.net/wp-content/uploads/2017/01/TurnKey-Linux.png", + "description": "TurnKey LXC Appliances is an open-source project that provides a collection of free, ready-to-use virtual appliances and installation images for various software applications and services. These appliances are pre-configured and come with all the necessary software and settings to simplify deployment and management. The goal of TurnKey Linux is to make it easier for users to set up and run popular software applications without the need for extensive manual configuration.", + "install_methods": [ + { + "type": "default", + "script": "turnkey/turnkey.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "The script creates a `*.creds` file in the Proxmox root directory with the password of the newly created TurnKey LXC Appliance.", + "type": "info" + }, + { + "text": "Retrieve Password: `cat turnkey-name.creds`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/typesense.json b/frontend/public/json/typesense.json new file mode 100644 index 0000000..61f35ef --- /dev/null +++ b/frontend/public/json/typesense.json @@ -0,0 +1,39 @@ +{ + "name": "TypeSense", + "slug": "typesense", + "categories": [ + 20 + ], + "date_created": "2025-01-06", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://typesense.org/docs/", + "website": "https://typesense.org/", + "logo": "https://typesense.org/_nuxt/img/typesense_logo_white.0f9fb0a.svg", + "description": "Typesense is an open-source, fast, and lightweight search engine optimized for delivering instant, relevant, and typo-tolerant search results. Designed for ease of use and high performance, it offers features like real-time indexing, fuzzy matching, customizable relevance ranking, and a simple API for integration. Typesense is particularly well-suited for applications requiring instant search capabilities, such as e-commerce, documentation, or any content-rich websites. It is often compared to tools like Elasticsearch but is more developer-friendly and less resource-intensive.", + "install_methods": [ + { + "type": "default", + "script": "ct/typesense.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This script requires some extra steps after the installation, Please checkout the 'documentation' Button", + "type": "info" + } + ] +} diff --git a/frontend/public/json/ubuntu.json b/frontend/public/json/ubuntu.json new file mode 100644 index 0000000..2244621 --- /dev/null +++ b/frontend/public/json/ubuntu.json @@ -0,0 +1,34 @@ +{ + "name": "Ubuntu", + "slug": "ubuntu", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://ubuntu.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/ubuntu.svg", + "description": "Ubuntu is a distribution based on Debian, designed to have regular releases and a consistent user experience.", + "install_methods": [ + { + "type": "default", + "script": "ct/ubuntu.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "ubuntu", + "version": "22.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/ubuntu2204-vm.json b/frontend/public/json/ubuntu2204-vm.json new file mode 100644 index 0000000..2c93097 --- /dev/null +++ b/frontend/public/json/ubuntu2204-vm.json @@ -0,0 +1,39 @@ +{ + "name": "Ubuntu 22.04", + "slug": "ubuntu2204-vm", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://ubuntu.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/ubuntu.svg", + "description": "Ubuntu is a distribution based on Debian, designed to have regular releases and a consistent user experience.", + "install_methods": [ + { + "type": "default", + "script": "vm/ubuntu2204-vm.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "after installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/272´", + "type": "info" + } + ] +} diff --git a/frontend/public/json/ubuntu2404-vm.json b/frontend/public/json/ubuntu2404-vm.json new file mode 100644 index 0000000..ae49be2 --- /dev/null +++ b/frontend/public/json/ubuntu2404-vm.json @@ -0,0 +1,39 @@ +{ + "name": "Ubuntu 24.04", + "slug": "ubuntu2404-vm", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://ubuntu.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/ubuntu.svg", + "description": "Ubuntu is a distribution based on Debian, designed to have regular releases and a consistent user experience.", + "install_methods": [ + { + "type": "default", + "script": "vm/ubuntu2404-vm.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 7, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "after installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/272´", + "type": "info" + } + ] +} diff --git a/frontend/public/json/ubuntu2410-vm.json b/frontend/public/json/ubuntu2410-vm.json new file mode 100644 index 0000000..2dcbc17 --- /dev/null +++ b/frontend/public/json/ubuntu2410-vm.json @@ -0,0 +1,39 @@ +{ + "name": "Ubuntu 24.10", + "slug": "ubuntu2410-vm", + "categories": [ + 2 + ], + "date_created": "2025-01-24", + "type": "vm", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": "https://ubuntu.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/ubuntu.svg", + "description": "Ubuntu is a distribution based on Debian, designed to have regular releases and a consistent user experience.", + "install_methods": [ + { + "type": "default", + "script": "vm/ubuntu2410-vm.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "after installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/272´", + "type": "info" + } + ] +} diff --git a/frontend/public/json/umami.json b/frontend/public/json/umami.json new file mode 100644 index 0000000..54640e7 --- /dev/null +++ b/frontend/public/json/umami.json @@ -0,0 +1,39 @@ +{ + "name": "Umami", + "slug": "umami", + "categories": [ + 9 + ], + "date_created": "2024-05-09", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://umami.is/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/umami.svg", + "description": "Umami makes it easy to collect, analyze, and understand your web data while maintaining visitor privacy and data ownership.", + "install_methods": [ + { + "type": "default", + "script": "ct/umami.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 12, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "umami" + }, + "notes": [ + { + "text": "To view the database credentials : `cat umami.creds`", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/unbound.json b/frontend/public/json/unbound.json new file mode 100644 index 0000000..3e8e9af --- /dev/null +++ b/frontend/public/json/unbound.json @@ -0,0 +1,39 @@ +{ + "name": "Unbound", + "slug": "unbound", + "categories": [ + 5 + ], + "date_created": "2024-12-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5335, + "documentation": null, + "website": "https://www.nlnetlabs.nl/projects/unbound/about/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/unbound.svg", + "description": "Unbound is a validating, recursive, caching DNS resolver. It is designed to be fast and lean and incorporates modern features based on open standards.", + "install_methods": [ + { + "type": "default", + "script": "ct/unbound.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Unbound Configuration Path: `/etc/unbound/unbound.conf.d/unbound.conf`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/unifi.json b/frontend/public/json/unifi.json new file mode 100644 index 0000000..eaddbc2 --- /dev/null +++ b/frontend/public/json/unifi.json @@ -0,0 +1,39 @@ +{ + "name": "UniFi Network Server", + "slug": "unifi", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 8443, + "documentation": null, + "website": "https://www.ui.com/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/ubiquiti.svg", + "description": "UniFi Network Server is a software that helps manage and monitor UniFi networks (Wi-Fi, Ethernet, etc.) by providing an intuitive user interface and advanced features. It allows network administrators to configure, monitor, and upgrade network devices, as well as view network statistics, client devices, and historical events. The aim of the application is to make the management of UniFi networks easier and more efficient.", + "install_methods": [ + { + "type": "default", + "script": "ct/unifi.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "For non-AVX CPUs, MongoDB 4.4 is installed. Please note this is a legacy solution that may present security risks and could become unsupported in future updates.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/unmanic.json b/frontend/public/json/unmanic.json new file mode 100644 index 0000000..3551420 --- /dev/null +++ b/frontend/public/json/unmanic.json @@ -0,0 +1,34 @@ +{ + "name": "Unmanic", + "slug": "unmanic", + "categories": [ + 0 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": true, + "interface_port": 8888, + "documentation": null, + "website": "https://docs.unmanic.app/", + "logo": "https://raw.githubusercontent.com/Unmanic/unmanic/master/icon.png", + "description": "Unmanic is a simple tool for optimising your file library. You can use it to convert your files into a single, uniform format, manage file movements based on timestamps, or execute custom commands against a file based on its file size.", + "install_methods": [ + { + "type": "default", + "script": "ct/unmanic.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/update-lxcs.json b/frontend/public/json/update-lxcs.json new file mode 100644 index 0000000..4b2ee3d --- /dev/null +++ b/frontend/public/json/update-lxcs.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox VE LXC Updater", + "slug": "update-lxcs", + "categories": [ + 1 + ], + "date_created": "2024-04-29", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", + "description": "This script has been created to simplify and speed up the process of updating all LXC containers across various Linux distributions, such as Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, and ArchLinux. It's designed to automatically skip templates and specific containers during the update, enhancing its convenience and usability.", + "install_methods": [ + { + "type": "default", + "script": "misc/update-lxcs.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/update-repo.json b/frontend/public/json/update-repo.json new file mode 100644 index 0000000..5366c92 --- /dev/null +++ b/frontend/public/json/update-repo.json @@ -0,0 +1,39 @@ +{ + "name": "Proxmox Update Repositories", + "slug": "update-repo", + "categories": [ + 1 + ], + "date_created": "2024-11-04", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": null, + "website": null, + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/linuxcontainers.svg", + "description": "This script updates repository links in LXC containers, replacing old links from the tteck repository with links to the new community-scripts repository to fix issues related to updating scripts.", + "install_methods": [ + { + "type": "default", + "script": "misc/update-repo.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Execute within the Proxmox shell", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/uptimekuma.json b/frontend/public/json/uptimekuma.json new file mode 100644 index 0000000..9814ddf --- /dev/null +++ b/frontend/public/json/uptimekuma.json @@ -0,0 +1,34 @@ +{ + "name": "Uptime Kuma", + "slug": "uptimekuma", + "categories": [ + 9 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3001, + "documentation": null, + "website": "https://github.com/louislam/uptime-kuma#uptime-kuma", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/uptime-kuma.svg", + "description": "Uptime Kuma is a monitoring and alerting system that tracks the availability and performance of servers, websites, and other internet-connected devices. It can be self-hosted and is open-source, offering a visually appealing interface for monitoring and receiving notifications about downtime events.", + "install_methods": [ + { + "type": "default", + "script": "ct/uptimekuma.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/urbackupserver.json b/frontend/public/json/urbackupserver.json new file mode 100644 index 0000000..2e232fc --- /dev/null +++ b/frontend/public/json/urbackupserver.json @@ -0,0 +1,39 @@ +{ + "name":"UrBackup Server", + "slug":"urbackupserver", + "categories":[ + 7 + ], + "date_created":"2025-01-18", + "type":"ct", + "updateable":true, + "privileged":true, + "interface_port":55414, + "documentation":"https://www.urbackup.org/documentation.html", + "website":"https://www.urbackup.org/", + "logo":"https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/urbackup.webp", + "description":"URBackup is an open-source backup software designed for creating reliable and efficient backups of both files and system images. It supports client-server architecture, allowing you to back up multiple computers to a central server. It offers features such as incremental backups, real-time file backup, and scheduling, ensuring minimal data loss and quick recovery", + "install_methods":[ + { + "type":"default", + "script":"ct/urbackupserver.sh", + "resources":{ + "cpu": 1, + "ram": 1024, + "hdd": 16, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials":{ + "username":null, + "password":null + }, + "notes":[ + { + "text":"You probably want to drastically extend the storage space to fit whatever clients you want to back up", + "type":"info" + } + ] +} diff --git a/frontend/public/json/vaultwarden.json b/frontend/public/json/vaultwarden.json new file mode 100644 index 0000000..7c703a6 --- /dev/null +++ b/frontend/public/json/vaultwarden.json @@ -0,0 +1,54 @@ +{ + "name": "Vaultwarden", + "slug": "vaultwarden", + "categories": [ + 6 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8000, + "documentation": null, + "website": "https://github.com/dani-garcia/vaultwarden/", + "logo": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/resources/vaultwarden-icon-white.svg", + "description": "Vaultwarden is a self-hosted password manager which provides secure and encrypted password storage. It uses client-side encryption and provides access to passwords through a web interface and mobile apps.", + "install_methods": [ + { + "type": "default", + "script": "ct/vaultwarden.sh", + "resources": { + "cpu": 4, + "ram": 6144, + "hdd": 6, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-vaultwarden.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 0.5, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Vaultwarden needs to be behind a proxy (Nginx Proxy Manager) to obtain HTTPS and to allow clients to connect.", + "type": "warning" + }, + { + "text": "To set the Admin Token, run the command below (or type update) in the LXC Console.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json new file mode 100644 index 0000000..99255d0 --- /dev/null +++ b/frontend/public/json/versions.json @@ -0,0 +1,1252 @@ +[ + { + "name": "semaphoreui/semaphore", + "version": "v2.13.11-beta1", + "date": "2025-04-08T10:56:42Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.84.3", + "date": "2025-03-27T11:54:33Z" + }, + { + "name": "fhem/fhem-mirror", + "version": "6.2", + "date": "2025-04-08T10:34:47Z" + }, + { + "name": "openobserve/openobserve", + "version": "v0.14.6-rc1", + "date": "2025-04-08T08:50:03Z" + }, + { + "name": "prometheus/prometheus", + "version": "v0.303.0-rc.1", + "date": "2025-04-07T04:39:38Z" + }, + { + "name": "NLnetLabs/unbound", + "version": "release-1.23.0rc1", + "date": "2025-04-08T06:39:46Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1744", + "date": "2025-04-08T06:09:14Z" + }, + { + "name": "StarFleetCPTN/GoMFT", + "version": "v0.2.6", + "date": "2025-04-08T02:23:38Z" + }, + { + "name": "coder/code-server", + "version": "v4.99.0", + "date": "2025-04-08T00:55:36Z" + }, + { + "name": "pelican-dev/panel", + "version": "v1.0.0-beta19", + "date": "2025-04-07T23:06:29Z" + }, + { + "name": "pelican-dev/wings", + "version": "v1.0.0-beta11", + "date": "2025-04-07T23:02:00Z" + }, + { + "name": "Threadfin/Threadfin", + "version": "1.2.32", + "date": "2025-04-07T20:01:09Z" + }, + { + "name": "NodeBB/NodeBB", + "version": "v4.2.0", + "date": "2025-03-19T18:34:01Z" + }, + { + "name": "go-gitea/gitea", + "version": "v1.23.7", + "date": "2025-04-07T19:27:52Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.4.0b4", + "date": "2025-04-07T19:14:53Z" + }, + { + "name": "wazuh/wazuh", + "version": "coverity-w15-4.12.0", + "date": "2025-04-07T17:50:14Z" + }, + { + "name": "keycloak/keycloak", + "version": "26.1.4", + "date": "2025-03-13T15:41:42Z" + }, + { + "name": "Brandawg93/PeaNUT", + "version": "v5.7.0", + "date": "2025-04-07T16:14:10Z" + }, + { + "name": "thomiceli/opengist", + "version": "v1.10.0", + "date": "2025-04-07T14:32:15Z" + }, + { + "name": "apache/cassandra", + "version": "5.0.4-tentative", + "date": "2025-04-07T12:05:05Z" + }, + { + "name": "Graylog2/graylog2-server", + "version": "6.2.0-beta.4", + "date": "2025-04-07T11:28:13Z" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "pmm-6401-v1.115.0", + "date": "2025-04-07T11:15:53Z" + }, + { + "name": "syncthing/syncthing", + "version": "v1.29.4", + "date": "2025-04-01T08:45:07Z" + }, + { + "name": "fallenbagel/jellyseerr", + "version": "preview-back-to-axios", + "date": "2025-04-07T09:23:08Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.1.5", + "date": "2025-04-07T09:19:35Z" + }, + { + "name": "redis/redis", + "version": "8.0-rc1-int2", + "date": "2025-04-02T19:05:08Z" + }, + { + "name": "zabbix/zabbix", + "version": "7.4.0beta1", + "date": "2025-04-07T08:14:13Z" + }, + { + "name": "nzbgetcom/nzbget", + "version": "v24.8", + "date": "2025-03-18T07:33:51Z" + }, + { + "name": "mattermost/mattermost", + "version": "server/public/v0.1.11", + "date": "2025-03-28T14:04:31Z" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.1", + "date": "2025-01-01T16:15:52Z" + }, + { + "name": "open-webui/open-webui", + "version": "v0.6.2", + "date": "2025-04-07T03:41:23Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "v6.2.10", + "date": "2025-03-22T13:02:26Z" + }, + { + "name": "Luligu/matterbridge", + "version": "2.2.7", + "date": "2025-04-06T20:00:53Z" + }, + { + "name": "Dolibarr/dolibarr", + "version": "21.0.1", + "date": "2025-04-06T19:22:59Z" + }, + { + "name": "stonith404/pingvin-share", + "version": "v1.11.1", + "date": "2025-04-06T18:39:42Z" + }, + { + "name": "wavelog/wavelog", + "version": "2.0.3", + "date": "2025-04-06T17:35:41Z" + }, + { + "name": "TandoorRecipes/recipes", + "version": "1.5.34", + "date": "2025-03-27T16:17:38Z" + }, + { + "name": "runtipi/runtipi", + "version": "v3.10.0", + "date": "2025-03-15T14:38:16Z" + }, + { + "name": "stackblitz-labs/bolt.diy", + "version": "v0.0.7-hf1", + "date": "2025-03-10T20:49:39Z" + }, + { + "name": "msgbyte/tianji", + "version": "v1.19.7", + "date": "2025-04-06T14:22:44Z" + }, + { + "name": "Prowlarr/Prowlarr", + "version": "v1.32.2.4987", + "date": "2025-03-16T09:41:37Z" + }, + { + "name": "Radarr/Radarr", + "version": "v5.21.1.9799", + "date": "2025-03-24T15:52:12Z" + }, + { + "name": "karakeep-app/karakeep", + "version": "extension/v1.2.4", + "date": "2025-04-06T11:56:18Z" + }, + { + "name": "TechnitiumSoftware/DnsServer", + "version": "v13.5.0", + "date": "2025-04-06T11:24:50Z" + }, + { + "name": "TriliumNext/Notes", + "version": "v0.92.6", + "date": "2025-04-06T10:38:54Z" + }, + { + "name": "kimai/kimai", + "version": "2.32.0", + "date": "2025-04-06T09:43:51Z" + }, + { + "name": "inventree/InvenTree", + "version": "0.17.10", + "date": "2025-04-06T05:31:49Z" + }, + { + "name": "ollama/ollama", + "version": "v0.6.5", + "date": "2025-04-06T00:15:39Z" + }, + { + "name": "jellyfin/jellyfin", + "version": "v10.10.7", + "date": "2025-04-05T19:14:59Z" + }, + { + "name": "azukaar/Cosmos-Server", + "version": "v0.18.4", + "date": "2025-04-05T19:12:57Z" + }, + { + "name": "wger-project/wger", + "version": "2.3", + "date": "2025-04-05T18:05:36Z" + }, + { + "name": "Paymenter/Paymenter", + "version": "v1.0.2", + "date": "2025-04-05T17:40:25Z" + }, + { + "name": "bastienwirtz/homer", + "version": "v25.04.1", + "date": "2025-04-05T12:39:18Z" + }, + { + "name": "navidrome/navidrome", + "version": "v0.55.2", + "date": "2025-04-05T12:07:32Z" + }, + { + "name": "Kozea/Radicale", + "version": "v3.5.1", + "date": "2025-04-05T06:20:18Z" + }, + { + "name": "actualbudget/actual", + "version": "v25.4.0", + "date": "2025-04-05T04:14:57Z" + }, + { + "name": "home-assistant/core", + "version": "2025.4.1", + "date": "2025-04-04T20:59:57Z" + }, + { + "name": "Koenkk/zigbee2mqtt", + "version": "2.2.1", + "date": "2025-04-04T20:15:48Z" + }, + { + "name": "YunoHost/yunohost", + "version": "debian/12.0.13", + "date": "2025-04-04T20:05:45Z" + }, + { + "name": "homarr-labs/homarr", + "version": "v1.14.0", + "date": "2025-04-04T19:15:59Z" + }, + { + "name": "Athou/commafeed", + "version": "5.7.0", + "date": "2025-04-04T18:10:16Z" + }, + { + "name": "icereed/paperless-gpt", + "version": "v0.14.4", + "date": "2025-04-04T14:18:53Z" + }, + { + "name": "apache/tomcat", + "version": "9.0.104", + "date": "2025-04-04T12:58:11Z" + }, + { + "name": "sabnzbd/sabnzbd", + "version": "4.5.0", + "date": "2025-03-30T16:17:11Z" + }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.49.12", + "date": "2025-04-04T07:31:08Z" + }, + { + "name": "minio/minio", + "version": "RELEASE.2025-04-03T14-56-28Z", + "date": "2025-04-03T19:08:18Z" + }, + { + "name": "OctoPrint/OctoPrint", + "version": "1.10.3", + "date": "2024-11-05T09:20:50Z" + }, + { + "name": "jupyter/notebook", + "version": "@jupyter-notebook/ui-components@7.4.0-rc.0", + "date": "2025-04-03T06:49:38Z" + }, + { + "name": "rabbitmq/rabbitmq-server", + "version": "v4.0.8", + "date": "2025-04-03T05:11:15Z" + }, + { + "name": "HabitRPG/habitica", + "version": "v5.35.1", + "date": "2025-04-02T21:49:00Z" + }, + { + "name": "zitadel/zitadel", + "version": "v2.63.9", + "date": "2025-03-31T12:47:21Z" + }, + { + "name": "BookStackApp/BookStack", + "version": "v25.02.2", + "date": "2025-04-02T16:39:50Z" + }, + { + "name": "cloudflare/cloudflared", + "version": "2025.4.0", + "date": "2025-04-02T15:38:53Z" + }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.503", + "date": "2025-04-02T15:12:13Z" + }, + { + "name": "hargata/lubelog", + "version": "v1.4.6", + "date": "2025-04-02T14:07:12Z" + }, + { + "name": "immich-app/immich", + "version": "v1.131.3", + "date": "2025-04-01T22:48:22Z" + }, + { + "name": "MagicMirrorOrg/MagicMirror", + "version": "v2.31.0", + "date": "2025-04-01T18:12:45Z" + }, + { + "name": "influxdata/influxdb", + "version": "v3.0.0-0.beta.3", + "date": "2025-04-01T15:34:30Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.127.1", + "date": "2025-03-26T21:44:28Z" + }, + { + "name": "theonedev/onedev", + "version": "v11.8.6", + "date": "2025-04-01T13:52:03Z" + }, + { + "name": "neo4j/neo4j", + "version": "5.26.5", + "date": "2025-04-01T09:32:48Z" + }, + { + "name": "diced/zipline", + "version": "v4.0.2", + "date": "2025-04-01T04:51:05Z" + }, + { + "name": "outline/outline", + "version": "v0.82.1-18", + "date": "2025-03-31T23:12:40Z" + }, + { + "name": "esphome/esphome", + "version": "2025.3.3", + "date": "2025-03-31T22:07:05Z" + }, + { + "name": "Kometa-Team/Kometa", + "version": "v2.2.0", + "date": "2025-03-31T21:31:48Z" + }, + { + "name": "traefik/traefik", + "version": "v3.3.5", + "date": "2025-03-31T08:55:12Z" + }, + { + "name": "home-assistant/operating-system", + "version": "15.1", + "date": "2025-03-31T13:42:20Z" + }, + { + "name": "documenso/documenso", + "version": "v1.10.0-rc.4", + "date": "2025-03-31T09:02:22Z" + }, + { + "name": "MediaBrowser/Emby.Releases", + "version": "4.8.11.0", + "date": "2025-03-10T06:39:11Z" + }, + { + "name": "louislam/dockge", + "version": "1.5.0", + "date": "2025-03-30T17:42:59Z" + }, + { + "name": "pi-hole/pi-hole", + "version": "v6.0.6", + "date": "2025-03-30T16:59:06Z" + }, + { + "name": "Part-DB/Part-DB-server", + "version": "v1.17.0", + "date": "2025-03-30T14:21:53Z" + }, + { + "name": "openhab/openhab-core", + "version": "4.3.4", + "date": "2025-03-30T13:32:38Z" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.26.6", + "date": "2025-03-30T08:02:19Z" + }, + { + "name": "Readarr/Readarr", + "version": "v2.0.0.4645", + "date": "2017-03-07T18:56:06Z" + }, + { + "name": "Lidarr/Lidarr", + "version": "v2.10.3.4602", + "date": "2025-03-23T11:00:37Z" + }, + { + "name": "aceberg/WatchYourLAN", + "version": "2.1.2-alpine", + "date": "2025-03-30T06:25:22Z" + }, + { + "name": "pocket-id/pocket-id", + "version": "v0.45.0", + "date": "2025-03-29T23:12:22Z" + }, + { + "name": "glanceapp/glance", + "version": "v0.7.9", + "date": "2025-03-29T18:08:11Z" + }, + { + "name": "tobychui/zoraxy", + "version": "v3.1.9", + "date": "2025-03-01T02:24:33Z" + }, + { + "name": "inspircd/inspircd", + "version": "v4.7.0", + "date": "2025-03-29T03:50:50Z" + }, + { + "name": "bunkerity/bunkerweb", + "version": "v1.6.1", + "date": "2025-03-15T17:29:17Z" + }, + { + "name": "OliveTin/OliveTin", + "version": "2025.3.28", + "date": "2025-03-29T00:18:56Z" + }, + { + "name": "TasmoAdmin/TasmoAdmin", + "version": "v4.2.3", + "date": "2025-02-09T23:07:48Z" + }, + { + "name": "gristlabs/grist-core", + "version": "v1.5.0", + "date": "2025-03-28T20:43:51Z" + }, + { + "name": "grocy/grocy", + "version": "v4.5.0", + "date": "2025-03-28T19:02:22Z" + }, + { + "name": "louislam/uptime-kuma", + "version": "2.0.0-beta.2-temp", + "date": "2025-03-28T08:45:58Z" + }, + { + "name": "emqx/emqx", + "version": "e5.9.0-beta.2", + "date": "2025-03-28T15:06:27Z" + }, + { + "name": "goauthentik/authentik", + "version": "version/2025.2.3", + "date": "2025-03-28T14:28:34Z" + }, + { + "name": "hakimel/reveal.js", + "version": "5.2.1", + "date": "2025-03-28T13:00:23Z" + }, + { + "name": "cockpit-project/cockpit", + "version": "336.2", + "date": "2025-03-28T10:16:47Z" + }, + { + "name": "gethomepage/homepage", + "version": "v1.1.1", + "date": "2025-03-28T04:12:31Z" + }, + { + "name": "Bubka/2FAuth", + "version": "v5.5.0", + "date": "2025-03-27T22:35:02Z" + }, + { + "name": "ellite/Wallos", + "version": "v2.48.1", + "date": "2025-03-27T22:02:16Z" + }, + { + "name": "hivemq/hivemq-community-edition", + "version": "2025.2", + "date": "2025-03-27T19:21:13Z" + }, + { + "name": "tailscale/tailscale", + "version": "v1.82.0", + "date": "2025-03-27T13:08:18Z" + }, + { + "name": "evcc-io/evcc", + "version": "0.202.1", + "date": "2025-03-27T08:24:55Z" + }, + { + "name": "duplicati/duplicati", + "version": "v2.1.0.112-2.1.0.112_canary_2025-03-26", + "date": "2025-03-26T21:04:38Z" + }, + { + "name": "forgejo/forgejo", + "version": "v12.0.0-dev", + "date": "2025-03-26T09:58:55Z" + }, + { + "name": "sct/overseerr", + "version": "v1.34.0", + "date": "2025-03-26T08:48:34Z" + }, + { + "name": "grafana/grafana", + "version": "v11.6.0", + "date": "2025-03-25T22:10:15Z" + }, + { + "name": "Stirling-Tools/Stirling-PDF", + "version": "v0.45.0", + "date": "2025-03-25T18:48:17Z" + }, + { + "name": "ipfs/kubo", + "version": "v0.34.1", + "date": "2025-03-25T18:11:12Z" + }, + { + "name": "dotnetfactory/fluid-calendar", + "version": "v1.3.0", + "date": "2025-03-25T15:55:02Z" + }, + { + "name": "hansmi/prometheus-paperless-exporter", + "version": "v0.0.7", + "date": "2025-03-25T15:11:18Z" + }, + { + "name": "crowdsecurity/crowdsec", + "version": "v1.6.8", + "date": "2025-03-25T13:33:10Z" + }, + { + "name": "caddyserver/caddy", + "version": "v2.9.1", + "date": "2025-01-08T15:22:53Z" + }, + { + "name": "ZoeyVid/NPMplus", + "version": "2025-03-24-r2", + "date": "2025-03-24T20:52:35Z" + }, + { + "name": "docmost/docmost", + "version": "v0.9.0", + "date": "2025-03-24T18:25:37Z" + }, + { + "name": "requarks/wiki", + "version": "v2.5.307", + "date": "2025-03-24T01:33:31Z" + }, + { + "name": "moghtech/komodo", + "version": "v1.17.0", + "date": "2025-03-24T00:46:32Z" + }, + { + "name": "nicolargo/glances", + "version": "v4.3.1", + "date": "2025-03-23T09:02:54Z" + }, + { + "name": "usememos/memos", + "version": "v0.24.2", + "date": "2025-03-23T04:01:50Z" + }, + { + "name": "netbox-community/netbox", + "version": "v4.2.6", + "date": "2025-03-21T21:20:29Z" + }, + { + "name": "leiweibau/Pi.Alert", + "version": "v2025-03-21", + "date": "2025-03-21T19:50:46Z" + }, + { + "name": "clusterzx/paperless-ai", + "version": "v2.7.6", + "date": "2025-03-21T19:24:53Z" + }, + { + "name": "photoprism/photoprism", + "version": "250321-57590c48b", + "date": "2025-03-21T11:48:16Z" + }, + { + "name": "AdguardTeam/AdGuardHome", + "version": "v0.107.59", + "date": "2025-03-21T11:11:39Z" + }, + { + "name": "jhuckaby/Cronicle", + "version": "v0.9.77", + "date": "2025-03-21T02:25:42Z" + }, + { + "name": "seanmorley15/AdventureLog", + "version": "v0.9.0", + "date": "2025-03-19T13:30:02Z" + }, + { + "name": "Donkie/Spoolman", + "version": "v0.22.1", + "date": "2025-03-18T21:01:22Z" + }, + { + "name": "apache/couchdb", + "version": "3.4.3.post1", + "date": "2025-03-18T09:44:59Z" + }, + { + "name": "authelia/authelia", + "version": "v4.39.1", + "date": "2025-03-18T03:57:41Z" + }, + { + "name": "advplyr/audiobookshelf", + "version": "v2.20.0", + "date": "2025-03-17T22:44:56Z" + }, + { + "name": "Kareadita/Kavita", + "version": "v0.8.5.11", + "date": "2025-03-17T19:25:25Z" + }, + { + "name": "Sonarr/Sonarr", + "version": "v4.0.14.2939", + "date": "2025-03-17T19:12:37Z" + }, + { + "name": "webmin/webmin", + "version": "2.303", + "date": "2025-03-17T04:54:50Z" + }, + { + "name": "autobrr/autobrr", + "version": "v1.60.0", + "date": "2025-03-16T18:39:49Z" + }, + { + "name": "henrygd/beszel", + "version": "v0.10.2", + "date": "2025-03-15T07:14:54Z" + }, + { + "name": "paperless-ngx/paperless-ngx", + "version": "v2.15.0-beta", + "date": "2025-03-14T18:05:28Z" + }, + { + "name": "FlowiseAI/Flowise", + "version": "flowise@2.2.7-patch.1", + "date": "2025-03-14T14:53:53Z" + }, + { + "name": "docker/compose", + "version": "v2.34.0", + "date": "2025-03-14T09:11:17Z" + }, + { + "name": "FreshRSS/FreshRSS", + "version": "1.26.1", + "date": "2025-03-13T21:34:25Z" + }, + { + "name": "transmission/transmission", + "version": "4.0.1-beta.1", + "date": "2024-12-13T00:16:24Z" + }, + { + "name": "gotson/komga", + "version": "1.21.2", + "date": "2025-03-12T04:19:30Z" + }, + { + "name": "benjaminjonard/koillection", + "version": "1.6.12", + "date": "2025-03-11T15:04:43Z" + }, + { + "name": "excalidraw/excalidraw", + "version": "v0.18.0", + "date": "2025-03-11T12:47:22Z" + }, + { + "name": "Ombi-app/Ombi", + "version": "v4.47.1", + "date": "2025-01-05T21:14:23Z" + }, + { + "name": "mylar3/mylar3", + "version": "v0.8.2", + "date": "2025-03-11T05:20:22Z" + }, + { + "name": "AlexxIT/go2rtc", + "version": "v1.9.9", + "date": "2025-03-10T03:22:11Z" + }, + { + "name": "awawa-dev/HyperHDR", + "version": "v21.0.0.0", + "date": "2025-03-09T12:25:44Z" + }, + { + "name": "YuukanOO/seelf", + "version": "v2.4.2", + "date": "2025-03-08T10:49:04Z" + }, + { + "name": "umami-software/umami", + "version": "v2.17.0", + "date": "2025-03-08T06:08:04Z" + }, + { + "name": "rogerfar/rdt-client", + "version": "v2.0.102", + "date": "2025-03-07T20:48:46Z" + }, + { + "name": "prometheus/alertmanager", + "version": "v0.28.1", + "date": "2025-03-07T15:41:35Z" + }, + { + "name": "eclipse-mosquitto/mosquitto", + "version": "v2.0.21", + "date": "2025-03-06T16:24:56Z" + }, + { + "name": "matze/wastebin", + "version": "3.0.0", + "date": "2025-03-05T21:41:29Z" + }, + { + "name": "snipe/snipe-it", + "version": "v8.0.4", + "date": "2025-03-05T17:12:03Z" + }, + { + "name": "toniebox-reverse-engineering/teddycloud", + "version": "tc_v0.6.4", + "date": "2025-03-05T15:43:40Z" + }, + { + "name": "sysadminsmedia/homebox", + "version": "v0.18.0", + "date": "2025-03-04T15:35:27Z" + }, + { + "name": "heiher/hev-socks5-server", + "version": "2.8.0", + "date": "2025-03-02T04:30:50Z" + }, + { + "name": "jordan-dalby/ByteStash", + "version": "v1.5.7", + "date": "2025-02-27T20:04:08Z" + }, + { + "name": "cross-seed/cross-seed", + "version": "v6.11.2", + "date": "2025-02-26T14:54:49Z" + }, + { + "name": "silverbulletmd/silverbullet", + "version": "0.10.4", + "date": "2025-02-25T18:13:42Z" + }, + { + "name": "juanfont/headscale", + "version": "v0.25.1", + "date": "2025-02-25T17:30:48Z" + }, + { + "name": "benzino77/tasmocompiler", + "version": "v12.5.0", + "date": "2025-02-25T14:55:50Z" + }, + { + "name": "schlagmichdoch/PairDrop", + "version": "v1.11.2", + "date": "2025-02-24T19:47:06Z" + }, + { + "name": "drakkan/sftpgo", + "version": "v2.6.6", + "date": "2025-02-24T19:14:46Z" + }, + { + "name": "ioBroker/ioBroker", + "version": "2025-02-23", + "date": "2025-02-24T16:05:06Z" + }, + { + "name": "ventoy/Ventoy", + "version": "v1.1.05", + "date": "2025-02-24T11:53:12Z" + }, + { + "name": "prometheus-pve/prometheus-pve-exporter", + "version": "v3.5.2", + "date": "2025-02-18T16:43:41Z" + }, + { + "name": "typesense/typesense", + "version": "v28.0", + "date": "2025-02-18T15:49:57Z" + }, + { + "name": "qbittorrent/qBittorrent", + "version": "release-5.0.4", + "date": "2025-02-18T14:14:11Z" + }, + { + "name": "postgres/postgres", + "version": "REL_13_20", + "date": "2025-02-17T21:17:13Z" + }, + { + "name": "sbondCo/Watcharr", + "version": "v2.0.2", + "date": "2025-02-16T21:34:29Z" + }, + { + "name": "recyclarr/recyclarr", + "version": "v7.4.1", + "date": "2025-02-15T20:54:00Z" + }, + { + "name": "node-red/node-red", + "version": "4.0.9", + "date": "2025-02-14T17:10:20Z" + }, + { + "name": "mayswind/AriaNg", + "version": "1.3.10", + "date": "2025-02-14T16:23:14Z" + }, + { + "name": "TryGhost/Ghost-CLI", + "version": "v1.27.0", + "date": "2025-02-13T15:55:36Z" + }, + { + "name": "MariaDB/server", + "version": "mariadb-11.7.2", + "date": "2025-02-13T04:13:46Z" + }, + { + "name": "glpi-project/glpi", + "version": "10.0.18", + "date": "2025-02-12T11:07:02Z" + }, + { + "name": "WordPress/WordPress", + "version": "6.7.2", + "date": "2025-02-11T16:13:18Z" + }, + { + "name": "homebridge/homebridge", + "version": "v1.9.0", + "date": "2025-02-11T13:26:42Z" + }, + { + "name": "dani-garcia/vaultwarden", + "version": "1.33.2", + "date": "2025-02-09T17:54:59Z" + }, + { + "name": "slskd/slskd", + "version": "0.22.2", + "date": "2025-02-09T00:00:04Z" + }, + { + "name": "blakeblackshear/frigate", + "version": "v0.15.0", + "date": "2025-02-08T18:45:30Z" + }, + { + "name": "bluenviron/mediamtx", + "version": "v1.11.3", + "date": "2025-02-07T19:29:19Z" + }, + { + "name": "apache/tika", + "version": "2.9.3", + "date": "2025-02-07T00:15:40Z" + }, + { + "name": "actualbudget/actual-server", + "version": "v25.2.1", + "date": "2025-02-06T20:41:28Z" + }, + { + "name": "NginxProxyManager/nginx-proxy-manager", + "version": "v2.12.3", + "date": "2025-02-06T11:07:07Z" + }, + { + "name": "mongodb/mongo", + "version": "r8.0.5-rc1", + "date": "2025-02-04T20:35:23Z" + }, + { + "name": "Forceu/Gokapi", + "version": "v1.9.6", + "date": "2024-12-18T14:35:37Z" + }, + { + "name": "PrivateBin/PrivateBin", + "version": "1.7.6", + "date": "2025-02-01T09:50:52Z" + }, + { + "name": "rustdesk/rustdesk-server", + "version": "1.1.14", + "date": "2025-01-25T12:48:28Z" + }, + { + "name": "crafty-controller/crafty-4", + "version": "v4.4.7", + "date": "2025-01-20T15:45:06Z" + }, + { + "name": "owncast/owncast", + "version": "v0.2.1", + "date": "2025-01-19T22:40:40Z" + }, + { + "name": "donaldzou/WGDashboard", + "version": "v4.1.4", + "date": "2025-01-19T13:14:19Z" + }, + { + "name": "0xERR0R/blocky", + "version": "v0.25", + "date": "2025-01-17T20:49:31Z" + }, + { + "name": "petio-team/petio", + "version": "v0.5.7", + "date": "2025-01-17T15:57:17Z" + }, + { + "name": "readeck/readeck", + "version": "0.17.1", + "date": "2025-01-15T19:13:33Z" + }, + { + "name": "linkwarden/linkwarden", + "version": "v2.9.3", + "date": "2025-01-13T16:19:53Z" + }, + { + "name": "Tautulli/Tautulli", + "version": "v2.15.1", + "date": "2025-01-11T23:38:33Z" + }, + { + "name": "traccar/traccar", + "version": "v6.6", + "date": "2025-01-11T17:26:49Z" + }, + { + "name": "ErsatzTV/ErsatzTV", + "version": "v25.1.0", + "date": "2025-01-10T18:14:54Z" + }, + { + "name": "go-vikunja/vikunja", + "version": "v0.24.6", + "date": "2024-12-22T20:24:35Z" + }, + { + "name": "IceWhaleTech/CasaOS", + "version": "v0.4.15", + "date": "2024-12-19T03:19:49Z" + }, + { + "name": "mysql/mysql-server", + "version": "mysql-cluster-7.6.33", + "date": "2024-12-16T11:55:50Z" + }, + { + "name": "ArchiveBox/ArchiveBox", + "version": "v0.7.3", + "date": "2024-12-15T10:18:06Z" + }, + { + "name": "pymedusa/Medusa", + "version": "v1.0.22", + "date": "2024-12-13T12:22:19Z" + }, + { + "name": "MDeLuise/plant-it", + "version": "0.10.0", + "date": "2024-12-10T09:35:26Z" + }, + { + "name": "phpipam/phpipam", + "version": "v1.7.3", + "date": "2024-11-27T21:26:11Z" + }, + { + "name": "lldap/lldap", + "version": "v0.6.1", + "date": "2024-11-22T21:48:41Z" + }, + { + "name": "gotify/server", + "version": "v2.6.1", + "date": "2024-11-16T08:44:53Z" + }, + { + "name": "janeczku/calibre-web", + "version": "0.6.24", + "date": "2024-11-16T06:47:56Z" + }, + { + "name": "pterodactyl/panel", + "version": "v1.11.10", + "date": "2024-11-15T02:29:18Z" + }, + { + "name": "sabre-io/Baikal", + "version": "0.10.1", + "date": "2024-11-10T10:25:45Z" + }, + { + "name": "nextcloud/nextcloudpi", + "version": "v1.55.3", + "date": "2024-11-08T22:21:10Z" + }, + { + "name": "caddyserver/xcaddy", + "version": "v0.4.4", + "date": "2024-11-05T23:06:11Z" + }, + { + "name": "linuxserver/Heimdall", + "version": "v2.6.3", + "date": "2024-11-05T11:00:43Z" + }, + { + "name": "zerotier/ZeroTierOne", + "version": "1.14.2", + "date": "2024-10-29T16:17:48Z" + }, + { + "name": "CorentinTh/it-tools", + "version": "v2024.10.22-7ca5933", + "date": "2024-10-22T09:58:03Z" + }, + { + "name": "Notifiarr/notifiarr", + "version": "v0.8.3", + "date": "2024-10-04T23:49:07Z" + }, + { + "name": "FunkeyFlo/ps5-mqtt", + "version": "v1.4.0", + "date": "2024-08-06T19:57:33Z" + }, + { + "name": "projectsend/projectsend", + "version": "r1720", + "date": "2024-08-03T04:07:20Z" + }, + { + "name": "Pf2eToolsOrg/Pf2eTools", + "version": "v0.8.13", + "date": "2024-07-29T12:54:27Z" + }, + { + "name": "hywax/mafl", + "version": "v0.15.4", + "date": "2024-07-13T11:03:43Z" + }, + { + "name": "FlareSolverr/FlareSolverr", + "version": "v3.3.21", + "date": "2024-06-26T01:14:46Z" + }, + { + "name": "Suwayomi/Suwayomi-Server", + "version": "v1.1.1", + "date": "2024-06-15T17:23:48Z" + }, + { + "name": "Forceu/barcodebuddy", + "version": "v1.8.1.8", + "date": "2024-06-02T20:01:53Z" + }, + { + "name": "Lissy93/dashy", + "version": "3.1.1", + "date": "2024-05-30T17:20:53Z" + }, + { + "name": "motioneye-project/motioneye", + "version": "0.42.1", + "date": "2020-06-07T07:27:04Z" + }, + { + "name": "gnmyt/MySpeed", + "version": "v1.0.9", + "date": "2024-05-21T22:15:33Z" + }, + { + "name": "binwiederhier/ntfy", + "version": "v2.11.0", + "date": "2024-05-13T20:19:54Z" + }, + { + "name": "pterodactyl/wings", + "version": "v1.11.13", + "date": "2024-05-08T04:20:34Z" + }, + { + "name": "CrazyWolf13/web-check", + "version": "1.0.0", + "date": "2024-05-05T02:01:51Z" + }, + { + "name": "monicahq/monica", + "version": "v4.1.2", + "date": "2024-05-04T08:06:50Z" + }, + { + "name": "thelounge/thelounge-deb", + "version": "v4.4.3", + "date": "2024-04-06T12:24:35Z" + }, + { + "name": "hyperion-project/hyperion.ng", + "version": "2.0.16", + "date": "2024-01-18T16:11:07Z" + }, + { + "name": "deepch/RTSPtoWeb", + "version": "v2.4.3", + "date": "2023-03-29T12:05:02Z" + }, + { + "name": "Shinobi-Systems/Shinobi", + "version": "furrykitten-3", + "date": "2022-07-15T05:20:17Z" + } +] diff --git a/frontend/public/json/victoriametrics.json b/frontend/public/json/victoriametrics.json new file mode 100644 index 0000000..06da91d --- /dev/null +++ b/frontend/public/json/victoriametrics.json @@ -0,0 +1,34 @@ +{ + "name": "VictoriaMetrics", + "slug": "victoriametrics", + "categories": [ + 8 + ], + "date_created": "2025-02-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8428, + "documentation": "https://docs.victoriametrics.com/", + "website": "https://victoriametrics.com/", + "logo": "https://marketplace-assets.digitalocean.com/logos/victoriametrics-victoriametricss.png", + "description": "VictoriaMetrics is a fast, cost-saving, and scalable solution for monitoring and managing time series data. It delivers high performance and reliability, making it an ideal choice for businesses of all sizes.", + "install_methods": [ + { + "type": "default", + "script": "ct/victoriametrics.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 16, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/vikunja.json b/frontend/public/json/vikunja.json new file mode 100644 index 0000000..01115bd --- /dev/null +++ b/frontend/public/json/vikunja.json @@ -0,0 +1,34 @@ +{ + "name": "Vikunja", + "slug": "vikunja", + "categories": [ + 12 + ], + "date_created": "2024-11-05", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3456, + "documentation": null, + "website": "https://vikunja.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/vikunja.svg", + "description": "Vikunja is a powerful self-hosted todo app. It allows you to create and manage to-do lists. You can plan tasks, set priorities and collaborate with others. The best part is that your data is safe with you and you can customize the app to your liking. It's like a personal assistant that helps you stay organized.", + "install_methods": [ + { + "type": "default", + "script": "ct/vikunja.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/wallos.json b/frontend/public/json/wallos.json new file mode 100644 index 0000000..0ff7ac1 --- /dev/null +++ b/frontend/public/json/wallos.json @@ -0,0 +1,34 @@ +{ + "name": "Wallos", + "slug": "wallos", + "categories": [ + 23 + ], + "date_created": "2024-10-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://github.com/ellite/wallos", + "website": "https://wallosapp.com/", + "logo": "https://raw.githubusercontent.com/ellite/Wallos/refs/heads/main/images/icon/android-chrome-192x192.png", + "description": "Wallos is a personal finance and budgeting tool that provides an intuitive interface for tracking expenses, managing subscriptions, and monitoring financial health. It features APIs for categories, notifications, payments, and user settings, making it suitable for automation and custom integrations. Additionally, it supports multi-language functionality.", + "install_methods": [ + { + "type": "default", + "script": "ct/wallos.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/wastebin.json b/frontend/public/json/wastebin.json new file mode 100644 index 0000000..728c461 --- /dev/null +++ b/frontend/public/json/wastebin.json @@ -0,0 +1,34 @@ +{ + "name": "Wastebin", + "slug": "wastebin", + "categories": [ + 12 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8088, + "documentation": null, + "website": "https://github.com/matze/wastebin", + "logo": "https://raw.githubusercontent.com/matze/wastebin/master/assets/favicon.png?raw=true", + "description": "Wastebin is a minimal pastebin with a design shamelessly copied from bin.", + "install_methods": [ + { + "type": "default", + "script": "ct/wastebin.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/watcharr.json b/frontend/public/json/watcharr.json new file mode 100644 index 0000000..ba6385d --- /dev/null +++ b/frontend/public/json/watcharr.json @@ -0,0 +1,34 @@ +{ + "name": "Watcharr", + "slug": "watcharr", + "categories": [ + 13 + ], + "date_created": "2025-02-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3080, + "documentation": "https://watcharr.app/docs/introduction", + "website": "https://watcharr.app/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/watcharr.webp", + "description": "Open source, self-hostable watched list for all your content with user authentication, modern and clean UI and a very simple setup.", + "install_methods": [ + { + "type": "default", + "script": "ct/watcharr.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/watchyourlan.json b/frontend/public/json/watchyourlan.json new file mode 100644 index 0000000..ff93c58 --- /dev/null +++ b/frontend/public/json/watchyourlan.json @@ -0,0 +1,34 @@ +{ + "name": "WatchYourLAN", + "slug": "watchyourlan", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8840, + "documentation": null, + "website": "https://github.com/aceberg/WatchYourLAN", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/webp/watchyourlan.webp", + "description": "WatchYourLAN is a lightweight network IP scanner with web GUI.", + "install_methods": [ + { + "type": "default", + "script": "ct/watchyourlan.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/wavelog.json b/frontend/public/json/wavelog.json new file mode 100644 index 0000000..88135dd --- /dev/null +++ b/frontend/public/json/wavelog.json @@ -0,0 +1,39 @@ +{ + "name": "Wavelog", + "slug": "wavelog", + "categories": [ + 24 + ], + "date_created": "2024-11-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://github.com/wavelog/wavelog/wiki", + "website": "https://www.wavelog.org/", + "logo": "https://raw.githubusercontent.com/wavelog/wavelog/refs/heads/master/assets/logo/wavelog_icon_only_darkly.png", + "description": "Wavelog is a self-hosted PHP application that allows you to log your amateur radio contacts anywhere. All you need is a web browser and active internet connection.", + "install_methods": [ + { + "type": "default", + "script": "ct/wavelog.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Database credentials: `cat wavelog.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/wazuh.json b/frontend/public/json/wazuh.json new file mode 100644 index 0000000..26eda69 --- /dev/null +++ b/frontend/public/json/wazuh.json @@ -0,0 +1,43 @@ +{ + "name": "Wazuh", + "slug": "wazuh", + "categories": [ + 9 + ], + "date_created": "2025-03-24", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 443, + "documentation": "https://documentation.wazuh.com/", + "website": "https://wazuh.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/wazuh.svg", + "description": "Wazuh is an open-source security monitoring solution that provides endpoint protection, network monitoring, and log analysis capabilities.", + "install_methods": [ + { + "type": "default", + "script": "ct/wazuh.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 18, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "root", + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + }, + { + "text": "Show password: `cat ~/wazuh.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/web-check.json b/frontend/public/json/web-check.json new file mode 100644 index 0000000..53cda34 --- /dev/null +++ b/frontend/public/json/web-check.json @@ -0,0 +1,34 @@ +{ + "name": "Web-Check", + "slug": "web-check", + "categories": [ + 4 + ], + "date_created": "2025-02-27", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/Lissy93/web-check/blob/master/.github/README.md", + "website": "https://github.com/lissy93/web-check", + "logo": "https://raw.githubusercontent.com/Lissy93/web-check/refs/heads/master/.github/web-check-logo.png", + "description": "Get an insight into the inner-workings of a given website: uncover potential attack vectors, analyse server architecture, view security configurations, and learn what technologies a site is using.", + "install_methods": [ + { + "type": "default", + "script": "ct/web-check.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 12, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/webmin.json b/frontend/public/json/webmin.json new file mode 100644 index 0000000..1f90782 --- /dev/null +++ b/frontend/public/json/webmin.json @@ -0,0 +1,39 @@ +{ + "name": "Webmin System Administration", + "slug": "webmin", + "categories": [ + 1 + ], + "date_created": "2024-05-02", + "type": "misc", + "updateable": false, + "privileged": false, + "interface_port": 10000, + "documentation": null, + "website": "https://webmin.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/webmin.svg", + "description": "Webmin provides a graphical user interface (GUI) for tasks such as user account management, package management, file system configuration, network configuration, and more.", + "install_methods": [ + { + "type": "default", + "script": "misc/webmin.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": "root", + "password": "root" + }, + "notes": [ + { + "text": "Execute within an existing LXC Console", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/wger.json b/frontend/public/json/wger.json new file mode 100644 index 0000000..2b93596 --- /dev/null +++ b/frontend/public/json/wger.json @@ -0,0 +1,39 @@ +{ + "name": "wger", + "slug": "wger", + "categories": [ + 24 + ], + "date_created": "2025-02-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://wger.readthedocs.io/en/latest/index.html#", + "website": "https://wger.de", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/wger.svg", + "description": "wger (ˈvɛɡɐ) Workout Manager is a free, open source web application that helps you manage your personal workouts, weight and diet plans and can also be used as a simple gym management utility. It offers a REST API as well, for easy integration with other projects and tools.", + "install_methods": [ + { + "type": "default", + "script": "ct/wger.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "adminadmin" + }, + "notes": [ + { + "text": "Enable proxy support by uncommenting this line in `/home/wger/src/settings.py` and pointing it to your URL: `# CSRF_TRUSTED_ORIGINS = ['http://127.0.0.1', 'https://my.domain.example.com']`, then restart the service `systemctl restart wger`.", + "type": "info" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/whisparr.json b/frontend/public/json/whisparr.json new file mode 100644 index 0000000..c41d30d --- /dev/null +++ b/frontend/public/json/whisparr.json @@ -0,0 +1,34 @@ +{ + "name": "Whisparr", + "slug": "whisparr", + "categories": [ + 14 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 6969, + "documentation": null, + "website": "https://github.com/Whisparr/Whisparr", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/whisparr.svg", + "description": "Whisparr is an adult movie collection manager for Usenet and BitTorrent users.", + "install_methods": [ + { + "type": "default", + "script": "ct/whisparr.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/whoogle.json b/frontend/public/json/whoogle.json new file mode 100644 index 0000000..9ae0328 --- /dev/null +++ b/frontend/public/json/whoogle.json @@ -0,0 +1,34 @@ +{ + "name": "Whoogle", + "slug": "whoogle", + "categories": [ + 0 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5000, + "documentation": null, + "website": "https://github.com/benbusby/whoogle-search", + "logo": "https://github.com/community-scripts/ProxmoxVE/blob/main/misc/images/whoogle.png?raw=true", + "description": "Get Google search results, but without any ads, javascript, AMP links, cookies, or IP address tracking.", + "install_methods": [ + { + "type": "default", + "script": "ct/whoogle.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/wikijs.json b/frontend/public/json/wikijs.json new file mode 100644 index 0000000..d9a600e --- /dev/null +++ b/frontend/public/json/wikijs.json @@ -0,0 +1,34 @@ +{ + "name": "Wiki.js", + "slug": "wikijs", + "categories": [ + 12 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://js.wiki/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/wiki-js.svg", + "description": "Wiki.js is a free, open-source, and modern wiki application built using Node.js. It is designed to be fast, easy to use, and flexible, with a range of features for collaboration, knowledge management, and content creation. Wiki.js supports Markdown syntax for editing pages, and includes features such as version control, page history, and access control, making it easy to manage content and collaborate with others. The software is fully customizable, with a range of themes and extensions available, and can be deployed on a local server or in the cloud, making it an ideal choice for small teams and organizations looking to create and manage a wiki. Wiki.js provides a modern, user-friendly interface, and supports a range of data sources, including local file systems, databases, and cloud storage services.", + "install_methods": [ + { + "type": "default", + "script": "ct/wikijs.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 7, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/wireguard.json b/frontend/public/json/wireguard.json new file mode 100644 index 0000000..5984f9d --- /dev/null +++ b/frontend/public/json/wireguard.json @@ -0,0 +1,50 @@ +{ + "name": "WireGuard", + "slug": "wireguard", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 10086, + "documentation": "https://www.wireguard.com/quickstart/", + "website": "https://www.wireguard.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/wireguard.svg", + "description": "WireGuard is a free and open-source virtual private network (VPN) software that uses modern cryptography to secure the data transmitted over a network. It is designed to be fast, secure, and easy to use. WireGuard supports various operating systems, including Linux, Windows, macOS, Android, and iOS. It operates at the network layer and is capable of being used with a wide range of protocols and configurations. Unlike other VPN protocols, WireGuard is designed to be simple and fast, with a focus on security and speed. It is known for its ease of setup and configuration, making it a popular choice for personal and commercial use.", + "install_methods": [ + { + "type": "default", + "script": "ct/wireguard.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-wireguard.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [ + { + "text": "Wireguard and WGDashboard are not the same. More info: `https://donaldzou.github.io/WGDashboard-Documentation/what-is-wireguard-what-is-wgdashboard.html`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/wordpress.json b/frontend/public/json/wordpress.json new file mode 100644 index 0000000..c6a77de --- /dev/null +++ b/frontend/public/json/wordpress.json @@ -0,0 +1,34 @@ +{ + "name": "Wordpress", + "slug": "wordpress", + "categories": [ + 21 + ], + "date_created": "2025-01-14", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://wordpress.org/documentation/", + "website": "https://wordpress.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/wordpress.svg", + "description": "WordPress is the simplest, most popular way to create your own website or blog. In fact, WordPress powers over 43.6% of all the websites on the Internet. Yes – more than one in four websites that you visit are likely powered by WordPress.\n\nOn a slightly more technical level, WordPress is an open-source content management system licensed under GPLv2, which means that anyone can use or modify the WordPress software for free.", + "install_methods": [ + { + "type": "default", + "script": "ct/wordpress.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/yt-dlp-webui.json b/frontend/public/json/yt-dlp-webui.json new file mode 100644 index 0000000..5966bb3 --- /dev/null +++ b/frontend/public/json/yt-dlp-webui.json @@ -0,0 +1,47 @@ +{ + "name": "yt-dlp-webui", + "slug": "yt-dlp-webui", + "categories": [ + 11 + ], + "date_created": "2025-03-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3033, + "documentation": "https://github.com/marcopiovanello/yt-dlp-web-ui", + "website": "https://github.com/marcopiovanello/yt-dlp-web-ui", + "logo": "https://raw.githubusercontent.com/marcopiovanello/yt-dlp-web-ui/refs/heads/master/frontend/src/assets/favicon.ico", + "description": "A not so terrible web ui for yt-dlp.\nHigh performance extendeable web ui and RPC server for yt-dlp with low impact on resources.\nCreated for the only purpose of fetching videos from my server/nas and monitor upcoming livestreams.", + "install_methods": [ + { + "type": "default", + "script": "ct/yt-dlp-webui.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": null + }, + "notes": [ + { + "text": "Show password: `cat ~/yt-dlp-webui.creds`", + "type": "info" + }, + { + "text": "The config file is located in `/opt/yt-dlp-webui/config.conf`", + "type": "info" + }, + { + "text": "Make sure to either mount an external path or increase the Disk space afterwards", + "type": "info" + } + ] +} diff --git a/frontend/public/json/yunohost.json b/frontend/public/json/yunohost.json new file mode 100644 index 0000000..9cd9a74 --- /dev/null +++ b/frontend/public/json/yunohost.json @@ -0,0 +1,39 @@ +{ + "name": "YunoHost", + "slug": "yunohost", + "categories": [ + 2 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": null, + "website": "https://yunohost.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/yunohost.svg", + "description": "YunoHost is an operating system aiming for the simplest administration of a server, and therefore democratize self-hosting, while making sure it stays reliable, secure, ethical and lightweight.", + "install_methods": [ + { + "type": "default", + "script": "ct/yunohost.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 20, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + } + ] +} \ No newline at end of file diff --git a/frontend/public/json/zabbix.json b/frontend/public/json/zabbix.json new file mode 100644 index 0000000..d0261c2 --- /dev/null +++ b/frontend/public/json/zabbix.json @@ -0,0 +1,43 @@ +{ + "name": "Zabbix", + "slug": "zabbix", + "categories": [ + 9 + ], + "date_created": "2024-06-12", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://www.zabbix.com/documentation/current/en/manual", + "website": "https://www.zabbix.com/", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/zabbix.svg", + "description": "Zabbix is an all-in-one monitoring solution with a variety of enterprise-grade features available right out of the box.", + "install_methods": [ + { + "type": "default", + "script": "ct/zabbix.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "Admin", + "password": "zabbix" + }, + "notes": [ + { + "text": "Database credentials: `cat zabbix.creds`", + "type": "info" + }, + { + "text": "Zabbix agent 2 is used by default", + "type": "info" + } + ] +} diff --git a/frontend/public/json/zammad.json b/frontend/public/json/zammad.json new file mode 100644 index 0000000..39b73e3 --- /dev/null +++ b/frontend/public/json/zammad.json @@ -0,0 +1,34 @@ +{ + "name": "Zammad", + "slug": "zammad", + "categories": [ + 25 + ], + "date_created": "2024-12-18", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": null, + "documentation": "https://docs.zammad.org/en/latest/", + "website": "https://zammad.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/zammad.svg", + "description": "Zammad is a web based open source helpdesk/customer support system with many features to manage customer communication via several channels like telephone, facebook, twitter, chat and emails. It is distributed under version 3 of the GNU AFFERO General Public License (GNU AGPLv3).", + "install_methods": [ + { + "type": "default", + "script": "ct/zammad.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/zerotier-one.json b/frontend/public/json/zerotier-one.json new file mode 100644 index 0000000..66f9545 --- /dev/null +++ b/frontend/public/json/zerotier-one.json @@ -0,0 +1,34 @@ +{ + "name": "Zerotier-One", + "slug": "zerotier-one", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3443, + "documentation": "https://docs.zerotier.com/", + "website": "https://www.zerotier.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/zerotier.svg", + "description": "ZeroTier is a secure network overlay that allows you to manage all of your network resources as if they were on the same LAN. The software-defined solution can be deployed in minutes from anywhere. No matter how many devices you need to connect, or where they are in the world, ZeroTier makes global networking simple.", + "install_methods": [ + { + "type": "default", + "script": "ct/zerotier-one.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "password" + }, + "notes": [] +} diff --git a/frontend/public/json/zigbee2mqtt.json b/frontend/public/json/zigbee2mqtt.json new file mode 100644 index 0000000..a68e720 --- /dev/null +++ b/frontend/public/json/zigbee2mqtt.json @@ -0,0 +1,50 @@ +{ + "name": "Zigbee2MQTT", + "slug": "zigbee2mqtt", + "categories": [ + 17 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": true, + "interface_port": 9442, + "documentation": "https://www.zigbee2mqtt.io/guide/getting-started/", + "website": "https://www.zigbee2mqtt.io/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/zigbee2mqtt.svg", + "description": "Zigbee2MQTT is an open-source software project that allows you to use Zigbee-based smart home devices (such as those sold under the Philips Hue and Ikea Tradfri brands) with MQTT-based home automation systems, like Home Assistant, Node-RED, and others. The software acts as a bridge between your Zigbee devices and MQTT, allowing you to control and monitor these devices from your home automation system.", + "install_methods": [ + { + "type": "default", + "script": "ct/zigbee2mqtt.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-zigbee2mqtt.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 0.3, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "You can find the post-install guide here: `https://github.com/community-scripts/ProxmoxVE/discussions/410`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/zipline.json b/frontend/public/json/zipline.json new file mode 100644 index 0000000..b1d045e --- /dev/null +++ b/frontend/public/json/zipline.json @@ -0,0 +1,34 @@ +{ + "name": "Zipline", + "slug": "zipline", + "categories": [ + 11 + ], + "date_created": "2024-09-16", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": null, + "website": "https://zipline.diced.sh/", + "logo": "https://raw.githubusercontent.com/diced/zipline/trunk/public/zipline_small.png", + "description": "Zipline is a file-sharing and URL-shortening server designed for easy setup and extensive features. It allows users to upload files, organize them into folders, create shortened URLs, and manage uploads through a user-friendly dashboard. Additional features include image compression, video thumbnails, password protection, 2FA, OAuth2 registration, and API access for custom control. It supports integrations with platforms like Discord.", + "install_methods": [ + { + "type": "default", + "script": "ct/zipline.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "administrator", + "password": "password" + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/json/zitadel.json b/frontend/public/json/zitadel.json new file mode 100644 index 0000000..a48d933 --- /dev/null +++ b/frontend/public/json/zitadel.json @@ -0,0 +1,43 @@ +{ + "name": "Zitadel", + "slug": "zitadel", + "categories": [ + 6 + ], + "date_created": "2025-02-10", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://zitadel.com/docs/guides/overview", + "website": "https://zitadel.com", + "logo": "https://raw.githubusercontent.com/zitadel/zitadel/refs/heads/main/console/src/assets/icons/android-chrome-512x512.png", + "description": "Zitadel is an open-source identity and access management (IAM) solution designed to provide secure authentication, authorization, and user management for modern applications and services. Built with a focus on flexibility, scalability, and security, Zitadel offers a comprehensive set of features for developers and organizations looking to implement robust identity management.", + "install_methods": [ + { + "type": "default", + "script": "ct/zitadel.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "zitadel-admin@zitadel.localhost", + "password": "Password1!" + }, + "notes": [ + { + "text": "Application credentials: `cat ~/zitadel.creds`", + "type": "info" + }, + { + "text": "Change the ExternalDomain value in `/opt/zitadel/config.yaml` to your domain/hostname/IP and run `bash zitadel-rerun.sh`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/zoraxy.json b/frontend/public/json/zoraxy.json new file mode 100644 index 0000000..7a78e21 --- /dev/null +++ b/frontend/public/json/zoraxy.json @@ -0,0 +1,34 @@ +{ + "name": "Zoraxy", + "slug": "zoraxy", + "categories": [ + 4 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8000, + "documentation": null, + "website": "https://zoraxy.aroz.org/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/zoraxy.svg", + "description": "Zoraxy is an all in one homelab network routing solution.", + "install_methods": [ + { + "type": "default", + "script": "ct/zoraxy.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/zwave-js-ui.json b/frontend/public/json/zwave-js-ui.json new file mode 100644 index 0000000..daf8933 --- /dev/null +++ b/frontend/public/json/zwave-js-ui.json @@ -0,0 +1,34 @@ +{ + "name": "Z-Wave JS UI", + "slug": "zwave-js-ui", + "categories": [ + 17 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": true, + "interface_port": 8091, + "documentation": "https://zwave-js.github.io/zwave-js-ui/#/", + "website": "https://github.com/zwave-js/zwave-js-ui#", + "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/zwave.svg", + "description": "Z-Wave JS UI is an open-source software that serves as a gateway between Z-Wave devices and MQTT (Message Queuing Telemetry Transport) protocol, allowing users to control and monitor their Z-Wave devices via a user interface. The software provides a configurable platform to manage Z-Wave networks and integrate with other smart home systems through MQTT.", + "install_methods": [ + { + "type": "default", + "script": "ct/zwave-js-ui.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} \ No newline at end of file diff --git a/frontend/public/logo.png b/frontend/public/logo.png new file mode 100644 index 0000000..1d2186d 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 0000000..4b1dc40 --- /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 0000000..1ab52db --- /dev/null +++ b/frontend/src/__tests__/public/validate-json.test.ts @@ -0,0 +1,56 @@ +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"; +console.log('Current directory: ' + process.cwd()); +const jsonDir = "public/json"; +const metadataFileName = "metadata.json"; +const versionsFileName = "versions.json"; +const encoding = "utf-8"; + +const fileNames = (await fs.readdir(jsonDir)) + .filter((fileName) => fileName !== metadataFileName && fileName !== versionsFileName); + +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) + //FIXME: Dose note account for new dir structure and files in /script/tools + + 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 0000000..063af62 --- /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 0000000..c7392a1 --- /dev/null +++ b/frontend/src/app/api/categories/route.ts @@ -0,0 +1,57 @@ +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 versionFileName = "version.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 && fileName !== versionFileName) + .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/api/versions/route.ts b/frontend/src/app/api/versions/route.ts new file mode 100644 index 0000000..94585ba --- /dev/null +++ b/frontend/src/app/api/versions/route.ts @@ -0,0 +1,45 @@ +import { AppVersion } from "@/lib/types"; +import { error } from "console"; +import { promises as fs } from "fs"; +// import Error from "next/error"; +import { NextResponse } from "next/server"; +import path from "path"; + +export const dynamic = "force-static"; + +const jsonDir = "public/json"; +const versionsFileName = "versions.json"; +const encoding = "utf-8"; + +const getVersions = async () => { + const filePath = path.resolve(jsonDir, versionsFileName); + const fileContent = await fs.readFile(filePath, encoding); + const versions: AppVersion[] = JSON.parse(fileContent); + + const modifiedVersions = versions.map(version => { + let newName = version.name; + newName = newName.toLowerCase().replace(/[^a-z0-9/]/g, ''); + return { ...version, name: newName, date: new Date(version.date) }; + }); + + return modifiedVersions; +}; + +export async function GET() { + try { + + const versions = await getVersions(); + return NextResponse.json(versions); + + } catch (error) { + console.error(error); + const err = error as globalThis.Error; + return NextResponse.json({ + name: err.name, + message: err.message || "An unexpected error occurred", + version: "No version found - Error" + }, { + status: 500, + }); + } +} diff --git a/frontend/src/app/category-view/page.tsx b/frontend/src/app/category-view/page.tsx new file mode 100644 index 0000000..1d5a9e9 --- /dev/null +++ b/frontend/src/app/category-view/page.tsx @@ -0,0 +1,276 @@ +"use client"; + +import React, { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import { Card, CardContent } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { ChevronLeft, ChevronRight } from "lucide-react"; +import { Category } from "@/lib/types"; + +const defaultLogo = "/default-logo.png"; // Fallback logo path +const MAX_DESCRIPTION_LENGTH = 100; // Set max length for description +const MAX_LOGOS = 5; // Max logos to display at once + +const formattedBadge = (type: string) => { + switch (type) { + case "vm": + return VM; + case "ct": + return ( + LXC + ); + case "misc": + return MISC; + } + return null; +}; + +const CategoryView = () => { + const [categories, setCategories] = useState([]); + const [selectedCategoryIndex, setSelectedCategoryIndex] = useState(null); + const [currentScripts, setCurrentScripts] = useState([]); + const [logoIndices, setLogoIndices] = useState<{ [key: string]: number }>({}); + const router = useRouter(); + + useEffect(() => { + const fetchCategories = async () => { + try { + const basePath = process.env.NODE_ENV === "production" ? "/ProxmoxVE" : ""; + const response = await fetch(`${basePath}/api/categories`); + if (!response.ok) { + throw new Error("Failed to fetch categories"); + } + const data = await response.json(); + setCategories(data); + + // Initialize logo indices + const initialLogoIndices: { [key: string]: number } = {}; + data.forEach((category: any) => { + initialLogoIndices[category.name] = 0; + }); + setLogoIndices(initialLogoIndices); + } catch (error) { + console.error("Error fetching categories:", error); + } + }; + + fetchCategories(); + }, []); + + const handleCategoryClick = (index: number) => { + setSelectedCategoryIndex(index); + setCurrentScripts(categories[index]?.scripts || []); // Update scripts for the selected category + }; + + const handleBackClick = () => { + setSelectedCategoryIndex(null); + setCurrentScripts([]); // Clear scripts when going back + }; + + const handleScriptClick = (scriptSlug: string) => { + router.push(`/scripts?id=${scriptSlug}`); + }; + + const navigateCategory = (direction: "prev" | "next") => { + if (selectedCategoryIndex !== null) { + const newIndex = + direction === "prev" + ? (selectedCategoryIndex - 1 + categories.length) % categories.length + : (selectedCategoryIndex + 1) % categories.length; + setSelectedCategoryIndex(newIndex); + setCurrentScripts(categories[newIndex]?.scripts || []); // Update scripts for the new category + } + }; + + const switchLogos = (categoryName: string, direction: "prev" | "next") => { + setLogoIndices((prev) => { + const currentIndex = prev[categoryName] || 0; + const category = categories.find((cat) => cat.name === categoryName); + if (!category || !category.scripts) return prev; + + const totalLogos = category.scripts.length; + const newIndex = + direction === "prev" + ? (currentIndex - MAX_LOGOS + totalLogos) % totalLogos + : (currentIndex + MAX_LOGOS) % totalLogos; + + return { ...prev, [categoryName]: newIndex }; + }); + }; + + const truncateDescription = (text: string) => { + return text.length > MAX_DESCRIPTION_LENGTH + ? `${text.slice(0, MAX_DESCRIPTION_LENGTH)}...` + : text; + }; + + const renderResources = (script: any) => { + const cpu = script.install_methods[0]?.resources.cpu; + const ram = script.install_methods[0]?.resources.ram; + const hdd = script.install_methods[0]?.resources.hdd; + + const resourceParts = []; + if (cpu) resourceParts.push(CPU: {cpu}vCPU); + if (ram) resourceParts.push(RAM: {ram}MB); + if (hdd) resourceParts.push(HDD: {hdd}GB); + + return resourceParts.length > 0 ? ( +
+ {resourceParts.map((part, index) => ( + + {part} + {index < resourceParts.length - 1 && " | "} + + ))} +
+ ) : null; + }; + + return ( +
+ {categories.length === 0 && ( +

No categories available. Please check the API endpoint.

+ )} + {selectedCategoryIndex !== null ? ( +
+ {/* Header with Navigation */} +
+ +

+ {categories[selectedCategoryIndex].name} +

+ +
+ + {/* Scripts Grid */} +
+ {currentScripts + .sort((a, b) => a.name.localeCompare(b.name)) + .map((script) => ( + handleScriptClick(script.slug)} + > + +

+ {script.name} +

+ {script.name +

+ Created at: {script.date_created || "No date available"} +

+

+ {truncateDescription(script.description || "No description available.")} +

+ {renderResources(script)} +
+
+ ))} +
+ + {/* Back to Categories Button */} +
+ +
+
+ ) : ( +
+ {/* Categories Grid */} +
+

Categories

+

+ {categories.reduce((total, category) => total + (category.scripts?.length || 0), 0)} Total scripts +

+
+
+ {categories.map((category, index) => ( + handleCategoryClick(index)} + className="cursor-pointer hover:shadow-lg flex flex-col items-center justify-center py-6 transition-shadow duration-300" + > + +

+ {category.name} +

+
+ + {category.scripts && + category.scripts + .slice(logoIndices[category.name] || 0, (logoIndices[category.name] || 0) + MAX_LOGOS) + .map((script, i) => ( +
+ {script.name { + e.stopPropagation(); + handleScriptClick(script.slug); + }} + /> + {formattedBadge(script.type)} +
+ ))} + +
+

+ {(category as any).description || "No description available."} +

+
+
+ ))} +
+
+ )} +
+ ); +}; + +export default CategoryView; diff --git a/frontend/src/app/data/page.tsx b/frontend/src/app/data/page.tsx new file mode 100644 index 0000000..b752464 --- /dev/null +++ b/frontend/src/app/data/page.tsx @@ -0,0 +1,198 @@ +"use client"; + +import React, { JSX, useEffect, useState } from "react"; +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import ApplicationChart from "../../components/ApplicationChart"; + +interface DataModel { + id: number; + ct_type: number; + disk_size: number; + core_count: number; + ram_size: number; + os_type: string; + os_version: string; + disableip6: string; + nsapp: string; + created_at: string; + method: string; + pve_version: string; + status: string; + error: string; + type: string; + [key: string]: any; +} + +interface SummaryData { + total_entries: number; + status_count: Record; + nsapp_count: Record; +} + +const DataFetcher: React.FC = () => { + const [data, setData] = useState([]); + const [summary, setSummary] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [currentPage, setCurrentPage] = useState(1); + const [itemsPerPage, setItemsPerPage] = useState(25); + const [sortConfig, setSortConfig] = useState<{ key: string; direction: 'ascending' | 'descending' } | null>(null); + + useEffect(() => { + const fetchSummary = async () => { + try { + const response = await fetch("https://api.htl-braunau.at/data/summary"); + if (!response.ok) throw new Error(`Failed to fetch summary: ${response.statusText}`); + const result: SummaryData = await response.json(); + setSummary(result); + } catch (err) { + setError((err as Error).message); + } + }; + + fetchSummary(); + }, []); + + useEffect(() => { + const fetchPaginatedData = async () => { + setLoading(true); + try { + const response = await fetch(`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${itemsPerPage === 0 ? '' : itemsPerPage}`); + if (!response.ok) throw new Error(`Failed to fetch data: ${response.statusText}`); + const result: DataModel[] = await response.json(); + setData(result); + } catch (err) { + setError((err as Error).message); + } finally { + setLoading(false); + } + }; + + fetchPaginatedData(); + }, [currentPage, itemsPerPage]); + + const sortedData = React.useMemo(() => { + if (!sortConfig) return data; + const sorted = [...data].sort((a, b) => { + if (a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === 'ascending' ? -1 : 1; + } + if (a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === 'ascending' ? 1 : -1; + } + return 0; + }); + return sorted; + }, [data, sortConfig]); + + if (loading) return

Loading...

; + if (error) return

Error: {error}

; + + const requestSort = (key: string) => { + let direction: 'ascending' | 'descending' = 'ascending'; + if (sortConfig && sortConfig.key === key && sortConfig.direction === 'ascending') { + direction = 'descending'; + } + setSortConfig({ key, direction }); + }; + + const formatDate = (dateString: string): string => { + const date = new Date(dateString); + const year = date.getFullYear(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const timezoneOffset = dateString.slice(-6); + return `${day}.${month}.${year} ${hours}:${minutes} ${timezoneOffset} GMT`; + }; + + return ( +
+

Created LXCs

+ +

+
+

{summary?.total_entries} results found

+

Status Legend: 🔄 installing {summary?.status_count["installing"] ?? 0} | ✔️ completed {summary?.status_count["done"] ?? 0} | ❌ failed {summary?.status_count["failed"] ?? 0} | ❓ unknown

+
+
+
+ + + + + + + + + + + + + + + + + + + {sortedData.map((item, index) => ( + + + + + + + + + + + + + + + ))} + +
requestSort('status')}>Status requestSort('type')}>Type requestSort('nsapp')}>Application requestSort('os_type')}>OS requestSort('os_version')}>OS Version requestSort('disk_size')}>Disk Size requestSort('core_count')}>Core Count requestSort('ram_size')}>RAM Size requestSort('method')}>Method requestSort('pve_version')}>PVE Version requestSort('error')}>Error Message requestSort('created_at')}>Created At
+ {item.status === "done" ? ( + "✔️" + ) : item.status === "failed" ? ( + "❌" + ) : item.status === "installing" ? ( + "🔄" + ) : ( + item.status + )} + {item.type === "lxc" ? ( + "📦" + ) : item.type === "vm" ? ( + "🖥️" + ) : ( + item.type + )}{item.nsapp}{item.os_type}{item.os_version}{item.disk_size}{item.core_count}{item.ram_size}{item.method}{item.pve_version}{item.error}{formatDate(item.created_at)}
+
+
+
+ + Page {currentPage} + + +
+
+ ); +}; + +export default DataFetcher; diff --git a/frontend/src/app/favicon.ico b/frontend/src/app/favicon.ico new file mode 100644 index 0000000..2ef326e 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 0000000..d6b9906 --- /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} + + +)); + +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 ( +
+ + +
+ {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 0000000..8a597c5 --- /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) => ( +
+ +
+ { + 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, + }) + } + /> +
+
+ + +
+ +
+ ))} + + + ); +} + +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 0000000..5827285 --- /dev/null +++ b/frontend/src/app/json-editor/_components/Note.tsx @@ -0,0 +1,150 @@ +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]); + + return ( + <> +

Notes

+ {script.notes.map((note, index) => ( + + ))} + + + ); +} + +const NoteItem = memo( + ({ + note, + index, + updateNote, + removeNote, + }: { + note: Script["notes"][number]; + index: number; + updateNote: (index: number, key: keyof Script["notes"][number], value: string) => void; + removeNote: (index: number) => void; + }) => { + const inputRef = useRef(null); + + const handleTextChange = useCallback((e: React.ChangeEvent) => { + updateNote(index, "text", e.target.value); + setTimeout(() => { + inputRef.current?.focus(); + }, 0); + }, [index, updateNote]); + + return ( +
+ + + +
+ ); + } +); + +NoteItem.displayName = 'NoteItem'; + + +export default memo(Note); \ No newline at end of file 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 0000000..ad9d16b --- /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 0000000..4e16155 --- /dev/null +++ b/frontend/src/app/json-editor/page.tsx @@ -0,0 +1,355 @@ +"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, Download } 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 + + + + + + +
+ +
+
+
+ + {children} + + +
+
+
+
+
+
+ + + ); +} diff --git a/frontend/src/app/manifest.ts b/frontend/src/app/manifest.ts new file mode 100644 index 0000000..1cfc38f --- /dev/null +++ b/frontend/src/app/manifest.ts @@ -0,0 +1,28 @@ +import { basePath } from "@/config/siteConfig"; +import type { MetadataRoute } from "next"; + +export const generateStaticParams = () => { + return []; +}; + +export default function manifest(): MetadataRoute.Manifest { + return { + name: "Proxmox VE Helper-Scripts", + short_name: "Proxmox VE Helper-Scripts", + description: + "A Re-designed Front-end for the Proxmox VE Helper-Scripts Repository. Featuring over 200+ scripts to help you manage your Proxmox VE environment.", + theme_color: "#030712", + background_color: "#030712", + display: "standalone", + orientation: "portrait", + scope: `${basePath}`, + start_url: `${basePath}`, + icons: [ + { + src: "logo.png", + sizes: "512x512", + type: "image/png", + }, + ], + }; +} diff --git a/frontend/src/app/not-found.tsx b/frontend/src/app/not-found.tsx new file mode 100644 index 0000000..8307ae2 --- /dev/null +++ b/frontend/src/app/not-found.tsx @@ -0,0 +1,20 @@ +"use client"; +import { Button } from "@/components/ui/button"; + +export default function NotFoundPage() { + return ( +
+
+

+ 404 +

+

+ Oops, the page you are looking for could not be found. +

+
+ +
+ ); +} diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx new file mode 100644 index 0000000..d06b557 --- /dev/null +++ b/frontend/src/app/page.tsx @@ -0,0 +1,143 @@ +"use client"; +import FAQ from "@/components/FAQ"; +import AnimatedGradientText from "@/components/ui/animated-gradient-text"; +import { Button } from "@/components/ui/button"; +import { CardFooter } from "@/components/ui/card"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import Particles from "@/components/ui/particles"; +import { Separator } from "@/components/ui/separator"; +import { basePath } from "@/config/siteConfig"; +import { cn } from "@/lib/utils"; +import { ArrowRightIcon, ExternalLink } from "lucide-react"; +import { useTheme } from "next-themes"; +import Link from "next/link"; +import { useEffect, useState } from "react"; +import { FaGithub } from "react-icons/fa"; + +function CustomArrowRightIcon() { + return ; +} + +export default function Page() { + const { theme } = useTheme(); + + const [color, setColor] = useState("#000000"); + + useEffect(() => { + setColor(theme === "dark" ? "#ffffff" : "#000000"); + }, [theme]); + + return ( + <> +
+ +
+
+ + +
+ +
+ ❤️ + + Scripts by tteck + + +
+ + + + Thank You! + + A big thank you to tteck and the many contributors who have made this project possible. Your hard + work is truly appreciated by the entire Proxmox community! + + + + + + + +
+ +
+

+ Make managing your Homelab a breeze +

+
+

+ We are a community-driven initiative that simplifies the setup of Proxmox Virtual Environment (VE). +

+

+ With 300+ scripts to help you manage your Proxmox VE environment. Whether you're a seasoned + user or a newcomer, we've got you covered. +

+
+
+
+ + + +
+
+ + {/* FAQ Section */} +
+
+
+

Frequently Asked Questions

+

+ Find answers to common questions about our Proxmox VE scripts +

+
+ +
+
+
+
+ + ); +} diff --git a/frontend/src/app/robots.ts b/frontend/src/app/robots.ts new file mode 100644 index 0000000..fc01ac8 --- /dev/null +++ b/frontend/src/app/robots.ts @@ -0,0 +1,14 @@ +import { basePath } from "@/config/siteConfig"; +import type { MetadataRoute } from "next"; + +export const dynamic = "force-static"; + +export default function robots(): MetadataRoute.Robots { + return { + rules: { + userAgent: "*", + allow: "/", + }, + sitemap: `https://community-scripts.github.io/${basePath}/sitemap.xml`, + }; +} diff --git a/frontend/src/app/scripts/_components/ResourceDisplay.tsx b/frontend/src/app/scripts/_components/ResourceDisplay.tsx new file mode 100644 index 0000000..7c9ed63 --- /dev/null +++ b/frontend/src/app/scripts/_components/ResourceDisplay.tsx @@ -0,0 +1,42 @@ +import { CPUIcon, HDDIcon, RAMIcon } from "@/components/icons/resource-icons"; +import { getDisplayValueFromRAM } from "@/lib/utils/resource-utils"; + +interface ResourceDisplayProps { + title: string; + cpu: number | null; + ram: number | null; + hdd: number | null; +} + +interface IconTextProps { + icon: React.ReactNode; + label: string; +} + +function IconText({ icon, label }: IconTextProps) { + return ( + + {icon} + {label} + + ); +} + +export function ResourceDisplay({ title, cpu, ram, hdd }: ResourceDisplayProps) { + const hasCPU = typeof cpu === "number" && cpu > 0; + const hasRAM = typeof ram === "number" && ram > 0; + const hasHDD = typeof hdd === "number" && hdd > 0; + + if (!hasCPU && !hasRAM && !hasHDD) return null; + + return ( +
+ {title} +
+ {hasCPU && } label={`${cpu} vCPU`} />} + {hasRAM && } label={getDisplayValueFromRAM(ram!)} />} + {hasHDD && } label={`${hdd} GB`} />} +
+
+ ); +} diff --git a/frontend/src/app/scripts/_components/ScriptAccordion.tsx b/frontend/src/app/scripts/_components/ScriptAccordion.tsx new file mode 100644 index 0000000..2361687 --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptAccordion.tsx @@ -0,0 +1,132 @@ +import { useCallback, useEffect, useRef } from "react"; + +import { formattedBadge } from "@/components/CommandMenu"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { Category } from "@/lib/types"; +import { cn } from "@/lib/utils"; +import Image from "next/image"; +import Link from "next/link"; +import { useState } from "react"; +import { basePath } from "@/config/siteConfig"; + +export default function ScriptAccordion({ + items, + selectedScript, + setSelectedScript, +}: { + items: Category[]; + selectedScript: string | null; + setSelectedScript: (script: string | null) => void; +}) { + const [expandedItem, setExpandedItem] = useState( + undefined, + ); + const linkRefs = useRef<{ [key: string]: HTMLAnchorElement | null }>({}); + + const handleAccordionChange = (value: string | undefined) => { + setExpandedItem(value); + }; + + const handleSelected = useCallback( + (slug: string) => { + setSelectedScript(slug); + }, + [setSelectedScript], + ); + + useEffect(() => { + if (selectedScript) { + const category = items.find((category) => + category.scripts.some((script) => script.slug === selectedScript), + ); + if (category) { + setExpandedItem(category.name); + handleSelected(selectedScript); + } + } + }, [selectedScript, items, handleSelected]); + return ( + + {items.map((category) => ( + + +
+ {category.name} + + {category.scripts.length} + +
{" "} +
+ + {category.scripts + .slice() + .sort((a, b) => a.name.localeCompare(b.name)) + .map((script, index) => ( +
+ handleSelected(script.slug)} + ref={(el) => { + linkRefs.current[script.slug] = el; + }} + > +
+ + ((e.currentTarget as HTMLImageElement).src = + `/${basePath}/logo.png`) + } + alt={script.name} + className="mr-1 w-4 h-4 rounded-full" + /> + + {script.name} + +
+ {formattedBadge(script.type)} + +
+ ))} +
+
+ ))} +
+ ); +} diff --git a/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx b/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx new file mode 100644 index 0000000..3713a16 --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx @@ -0,0 +1,223 @@ +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { basePath, mostPopularScripts } from "@/config/siteConfig"; +import { extractDate } from "@/lib/time"; +import { Category, Script } from "@/lib/types"; +import { CalendarPlus } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import { useMemo, useState } from "react"; + +const ITEMS_PER_PAGE = 3; + +export const getDisplayValueFromType = (type: string) => { + switch (type) { + case "ct": + return "LXC"; + case "vm": + return "VM"; + case "misc": + return ""; + default: + return ""; + } +}; + +export function LatestScripts({ items }: { items: Category[] }) { + const [page, setPage] = useState(1); + + const latestScripts = useMemo(() => { + if (!items) return []; + + const scripts = items.flatMap((category) => category.scripts || []); + + // Filter out duplicates by slug + const uniqueScriptsMap = new Map(); + scripts.forEach((script) => { + if (!uniqueScriptsMap.has(script.slug)) { + uniqueScriptsMap.set(script.slug, script); + } + }); + + return Array.from(uniqueScriptsMap.values()).sort( + (a, b) => + new Date(b.date_created).getTime() - new Date(a.date_created).getTime(), + ); + }, [items]); + + const goToNextPage = () => { + setPage((prevPage) => prevPage + 1); + }; + + const goToPreviousPage = () => { + setPage((prevPage) => prevPage - 1); + }; + + const startIndex = (page - 1) * ITEMS_PER_PAGE; + const endIndex = page * ITEMS_PER_PAGE; + + if (!items) { + return null; + } + + return ( +
+ {latestScripts.length > 0 && ( +
+

Newest Scripts

+
+ {page > 1 && ( +
+ Previous +
+ )} + {endIndex < latestScripts.length && ( +
+ {page === 1 ? "More.." : "Next"} +
+ )} +
+
+ )} +
+ {latestScripts.slice(startIndex, endIndex).map((script) => ( + + + +
+ + ((e.currentTarget as HTMLImageElement).src = + `/${basePath}/logo.png`) + } + className="h-11 w-11 object-contain" + /> +
+
+

+ {script.name} {getDisplayValueFromType(script.type)} +

+

+ + {extractDate(script.date_created)} +

+
+
+
+ + + {script.description} + + + + + +
+ ))} +
+
+ ); +} + +export function MostViewedScripts({ items }: { items: Category[] }) { + const mostViewedScripts = items.reduce((acc: Script[], category) => { + const foundScripts = category.scripts.filter((script) => + mostPopularScripts.includes(script.slug), + ); + return acc.concat(foundScripts); + }, []); + + return ( +
+ {mostViewedScripts.length > 0 && ( + <> +

Most Viewed Scripts

+ + )} +
+ {mostViewedScripts.map((script) => ( + + + +
+ + ((e.currentTarget as HTMLImageElement).src = + `/${basePath}/logo.png`) + } + className="h-11 w-11 object-contain" + /> +
+
+

+ {script.name} {getDisplayValueFromType(script.type)} +

+

+ + {extractDate(script.date_created)} +

+
+
+
+ + + {script.description} + + + + + +
+ ))} +
+
+ ); +} diff --git a/frontend/src/app/scripts/_components/ScriptItem.tsx b/frontend/src/app/scripts/_components/ScriptItem.tsx new file mode 100644 index 0000000..fa04481 --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItem.tsx @@ -0,0 +1,160 @@ +"use client"; + +import { extractDate } from "@/lib/time"; +import { AppVersion, Script } from "@/lib/types"; + +import { X } from "lucide-react"; +import Image from "next/image"; + +import { Separator } from "@/components/ui/separator"; +import { basePath } from "@/config/siteConfig"; +import { useVersions } from "@/hooks/useVersions"; +import { cleanSlug } from "@/lib/utils/resource-utils"; +import { Suspense } from "react"; +import { ResourceDisplay } from "./ResourceDisplay"; +import { getDisplayValueFromType } from "./ScriptInfoBlocks"; +import Alerts from "./ScriptItems/Alerts"; +import DefaultPassword from "./ScriptItems/DefaultPassword"; +import Description from "./ScriptItems/Description"; +import InstallCommand from "./ScriptItems/InstallCommand"; +import Tooltips from "./ScriptItems/Tooltips"; +import InterFaces from "./ScriptItems/InterFaces"; +import Buttons from "./ScriptItems/Buttons"; + +interface ScriptItemProps { + item: Script; + setSelectedScript: (script: string | null) => void; +} + +function ScriptHeader({ item }: { item: Script }) { + const defaultInstallMethod = item.install_methods?.[0]; + const os = defaultInstallMethod?.resources?.os || "Proxmox Node"; + const version = defaultInstallMethod?.resources?.version || ""; + + return ( +
+
+
+ ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)} + height={400} + alt={item.name} + unoptimized + /> +
+
+
+
+
+

+ {item.name} + + + {getDisplayValueFromType(item.type)} + +

+
+ Added {extractDate(item.date_created)} + + + {os} {version} + +
+
+ {/* */} +
+
+ {defaultInstallMethod?.resources && ( + + )} + {item.install_methods.find((method) => method.type === "alpine")?.resources && ( + method.type === "alpine")!.resources!} + /> + )} +
+
+
+
+
+ +
+ +
+
+
+ ); +} + +function VersionInfo({ item }: { item: Script }) { + const { data: versions = [], isLoading } = useVersions(); + + if (isLoading || versions.length === 0) { + return

Loading versions...

; + } + + const matchedVersion = versions.find((v: AppVersion) => { + const cleanName = v.name.replace(/[^a-z0-9]/gi, "").toLowerCase(); + return cleanName === cleanSlug(item.slug) || cleanName.includes(cleanSlug(item.slug)); + }); + + if (!matchedVersion) return null; + + return {matchedVersion.version}; +} + +export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) { + const closeScript = () => { + window.history.pushState({}, document.title, window.location.pathname); + setSelectedScript(null); + }; + + return ( +
+
+
+

Selected Script

+ +
+ +
+
+ }> + + + + + + +
+
+

How to {item.type === "misc" ? "use" : "install"}

+ +
+ +
+ +
+
+ + +
+
+
+
+ ); +} diff --git a/frontend/src/app/scripts/_components/ScriptItems/Alerts.tsx b/frontend/src/app/scripts/_components/ScriptItems/Alerts.tsx new file mode 100644 index 0000000..c4c2902 --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItems/Alerts.tsx @@ -0,0 +1,35 @@ +import TextCopyBlock from "@/components/TextCopyBlock"; +import { AlertColors } from "@/config/siteConfig"; +import { Script } from "@/lib/types"; +import { cn } from "@/lib/utils"; +import { AlertCircle, NotepadText } from "lucide-react"; + +type NoteProps = { + text: string; + type: keyof typeof AlertColors; +} + +export default function Alerts({ item }: { item: Script }) { + return ( + <> + {item?.notes?.length > 0 && + item.notes.map((note: NoteProps, index: number) => ( +
+

+ {note.type == "info" ? ( + + ) : ( + + )} + {TextCopyBlock(note.text)} +

+
+ ))} + + ); +} diff --git a/frontend/src/app/scripts/_components/ScriptItems/Buttons.tsx b/frontend/src/app/scripts/_components/ScriptItems/Buttons.tsx new file mode 100644 index 0000000..7d9277a --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItems/Buttons.tsx @@ -0,0 +1,89 @@ +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { basePath } from "@/config/siteConfig"; +import { Script } from "@/lib/types"; +import { BookOpenText, Code, Globe, LinkIcon, RefreshCcw } from "lucide-react"; + +const generateInstallSourceUrl = (slug: string) => { + const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`; + return `${baseUrl}/install/${slug}-install.sh`; +}; + +const generateSourceUrl = (slug: string, type: string) => { + const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`; + return type === "vm" ? `${baseUrl}/vm/${slug}.sh` : `${baseUrl}/misc/${slug}.sh`; +}; + +const generateUpdateUrl = (slug: string) => { + const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`; + return `${baseUrl}/ct/${slug}.sh`; +}; + +interface LinkItem { + href: string; + icon: React.ReactNode; + text: string; +} + +export default function Buttons({ item }: { item: Script }) { + const isCtOrDefault = ["ct"].includes(item.type); + const installSourceUrl = isCtOrDefault ? generateInstallSourceUrl(item.slug) : null; + const updateSourceUrl = isCtOrDefault ? generateUpdateUrl(item.slug) : null; + const sourceUrl = !isCtOrDefault ? generateSourceUrl(item.slug, item.type) : null; + + const links = [ + item.website && { + href: item.website, + icon: , + text: "Website", + }, + item.documentation && { + href: item.documentation, + icon: , + text: "Documentation", + }, + installSourceUrl && { + href: installSourceUrl, + icon: , + text: "Install Source", + }, + updateSourceUrl && { + href: updateSourceUrl, + icon: , + text: "Update Source", + }, + sourceUrl && { + href: sourceUrl, + icon: , + text: "Source Code", + }, + ].filter(Boolean) as LinkItem[]; + + if (links.length === 0) return null; + + return ( + + + + + + {links.map((link, index) => ( + + + {link.icon} + {link.text} + + + ))} + + + ); +} diff --git a/frontend/src/app/scripts/_components/ScriptItems/DefaultPassword.tsx b/frontend/src/app/scripts/_components/ScriptItems/DefaultPassword.tsx new file mode 100644 index 0000000..5034bc9 --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItems/DefaultPassword.tsx @@ -0,0 +1,37 @@ +import handleCopy from "@/components/handleCopy"; +import { Button } from "@/components/ui/button"; +import { Separator } from "@/components/ui/separator"; +import { Script } from "@/lib/types"; + +export default function DefaultPassword({ item }: { item: Script }) { + const { username, password } = item.default_credentials; + const hasDefaultLogin = username && password; + + if (!hasDefaultLogin) return null; + + const copyCredential = (type: "username" | "password") => { + handleCopy(type, item.default_credentials[type] ?? ""); + }; + + return ( +
+
+

Default Login Credentials

+
+ +
+

+ You can use the following credentials to login to the {item.name} {item.type}. +

+ {["username", "password"].map((type) => ( +
+ {type.charAt(0).toUpperCase() + type.slice(1)}:{" "} + +
+ ))} +
+
+ ); +} diff --git a/frontend/src/app/scripts/_components/ScriptItems/DefaultSettings.tsx b/frontend/src/app/scripts/_components/ScriptItems/DefaultSettings.tsx new file mode 100644 index 0000000..33ae0b8 --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItems/DefaultSettings.tsx @@ -0,0 +1,29 @@ +import { Script } from "@/lib/types"; + +export default function DefaultSettings({ item }: { item: Script }) { + const getDisplayValueFromRAM = (ram: number) => (ram >= 1024 ? `${Math.floor(ram / 1024)}GB` : `${ram}MB`); + + const ResourceDisplay = ({ settings, title }: { settings: (typeof item.install_methods)[0]; title: string }) => { + const { cpu, ram, hdd } = settings.resources; + return ( +
+

{title}

+

CPU: {cpu}vCPU

+

RAM: {getDisplayValueFromRAM(ram ?? 0)}

+

HDD: {hdd}GB

+
+ ); + }; + + const defaultSettings = item.install_methods.find((method) => method.type === "default"); + const defaultAlpineSettings = item.install_methods.find((method) => method.type === "alpine"); + + const hasDefaultSettings = defaultSettings?.resources && Object.values(defaultSettings.resources).some(Boolean); + + return ( +
+ {hasDefaultSettings && } + {defaultAlpineSettings && } +
+ ); +} diff --git a/frontend/src/app/scripts/_components/ScriptItems/Description.tsx b/frontend/src/app/scripts/_components/ScriptItems/Description.tsx new file mode 100644 index 0000000..6a09f0a --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItems/Description.tsx @@ -0,0 +1,13 @@ +import TextCopyBlock from "@/components/TextCopyBlock"; +import { Script } from "@/lib/types"; + +export default function Description({ item }: { item: Script }) { + return ( +
+

Description

+

+ {TextCopyBlock(item.description)} +

+
+ ); +} diff --git a/frontend/src/app/scripts/_components/ScriptItems/InstallCommand.tsx b/frontend/src/app/scripts/_components/ScriptItems/InstallCommand.tsx new file mode 100644 index 0000000..647b140 --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItems/InstallCommand.tsx @@ -0,0 +1,89 @@ +import CodeCopyButton from "@/components/ui/code-copy-button"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { basePath } from "@/config/siteConfig"; +import { Script } from "@/lib/types"; +import { getDisplayValueFromType } from "../ScriptInfoBlocks"; + +const getInstallCommand = (scriptPath = "", isAlpine = false) => { + const url = `https://raw.githubusercontent.com/community-scripts/${basePath}/main/${scriptPath}`; + return isAlpine + ? `bash -c "$(curl -fsSL ${url})"` + : `bash -c "$(curl -fsSL ${url})"`; +}; + + +export default function InstallCommand({ item }: { item: Script }) { + const alpineScript = item.install_methods.find( + (method) => method.type === "alpine", + ); + + const defaultScript = item.install_methods.find( + (method) => method.type === "default", + ); + + const renderInstructions = (isAlpine = false) => ( + <> +

+ {isAlpine ? ( + <> + As an alternative option, you can use Alpine Linux and the{" "} + {item.name} package to create a {item.name}{" "} + {getDisplayValueFromType(item.type)} container with faster creation + time and minimal system resource usage. You are also obliged to + adhere to updates provided by the package maintainer. + + ) : item.type == "misc" ? ( + <> + To use the {item.name} script, run the command below in the shell. + + ) : ( + <> + {" "} + To create a new Proxmox VE {item.name}{" "} + {getDisplayValueFromType(item.type)}, run the command below in the + Proxmox VE Shell. + + )} +

+ {isAlpine && ( +

+ To create a new Proxmox VE Alpine-{item.name}{" "} + {getDisplayValueFromType(item.type)}, run the command below in the + Proxmox VE Shell +

+ )} + + ); + + return ( +
+ {alpineScript ? ( + + + Default + Alpine Linux + + + {renderInstructions()} + + {getInstallCommand(defaultScript?.script)} + + + + {renderInstructions(true)} + + {getInstallCommand(alpineScript.script, true)} + + + + ) : defaultScript?.script ? ( + <> + {renderInstructions()} + + {getInstallCommand(defaultScript.script)} + + + ) : null} +
+ ); +} \ No newline at end of file diff --git a/frontend/src/app/scripts/_components/ScriptItems/InterFaces.tsx b/frontend/src/app/scripts/_components/ScriptItems/InterFaces.tsx new file mode 100644 index 0000000..d7ea148 --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItems/InterFaces.tsx @@ -0,0 +1,21 @@ +import handleCopy from "@/components/handleCopy"; +import { buttonVariants } from "@/components/ui/button"; +import { Script } from "@/lib/types"; +import { cn } from "@/lib/utils"; +import { ClipboardIcon } from "lucide-react"; + +export default function InterFaces({ item }: { item: Script }) { + return ( +
+ {item.interface_port !== null ? ( +
+

Default Interface:

+ + {item.interface_port} + handleCopy("default interface", String(item.interface_port))} className="size-4 cursor-pointer" /> + +
+ ) : null} +
+ ); +} diff --git a/frontend/src/app/scripts/_components/ScriptItems/Tooltips.tsx b/frontend/src/app/scripts/_components/ScriptItems/Tooltips.tsx new file mode 100644 index 0000000..9adb58b --- /dev/null +++ b/frontend/src/app/scripts/_components/ScriptItems/Tooltips.tsx @@ -0,0 +1,52 @@ +import { Badge } from "@/components/ui/badge"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { Script } from "@/lib/types"; +import { CircleHelp } from "lucide-react"; +import React from "react"; + +interface TooltipProps { + variant: "warning" | "success"; + label: string; + content: string; +} + +const TooltipBadge: React.FC = ({ variant, label, content }) => ( + + + + + {label} + + + + {content} + + + +); + +export default function Tooltips({ item }: { item: Script }) { + return ( +
+ {item.privileged && ( + + )} + {item.updateable && ( + + )} +
+ ); +} diff --git a/frontend/src/app/scripts/_components/Sidebar.tsx b/frontend/src/app/scripts/_components/Sidebar.tsx new file mode 100644 index 0000000..3680210 --- /dev/null +++ b/frontend/src/app/scripts/_components/Sidebar.tsx @@ -0,0 +1,43 @@ +"use client"; + +import type { Category, Script } from "@/lib/types"; +import ScriptAccordion from "./ScriptAccordion"; + +const Sidebar = ({ + items, + selectedScript, + setSelectedScript, +}: { + items: Category[]; + selectedScript: string | null; + setSelectedScript: (script: string | null) => void; +}) => { + const uniqueScripts = items.reduce((acc, category) => { + for (const script of category.scripts) { + if (!acc.some((s) => s.name === script.name)) { + acc.push(script); + } + } + return acc; + }, [] as Script[]); + + return ( +
+
+

Categories

+

+ {uniqueScripts.length} Total scripts +

+
+
+ +
+
+ ); +}; + +export default Sidebar; \ No newline at end of file diff --git a/frontend/src/app/scripts/_components/VersionBadge.tsx b/frontend/src/app/scripts/_components/VersionBadge.tsx new file mode 100644 index 0000000..712893d --- /dev/null +++ b/frontend/src/app/scripts/_components/VersionBadge.tsx @@ -0,0 +1,13 @@ +import { AppVersion } from "@/lib/types"; + +interface VersionBadgeProps { + version: AppVersion; +} + +export function VersionBadge({ version }: VersionBadgeProps) { + return ( +
+ {version.version} +
+ ); +} diff --git a/frontend/src/app/scripts/page.tsx b/frontend/src/app/scripts/page.tsx new file mode 100644 index 0000000..590b673 --- /dev/null +++ b/frontend/src/app/scripts/page.tsx @@ -0,0 +1,79 @@ +"use client"; + +export const dynamic = "force-static"; + +import { ScriptItem } from "@/app/scripts/_components/ScriptItem"; +import { fetchCategories } from "@/lib/data"; +import { Category, Script } from "@/lib/types"; +import { Loader2 } from "lucide-react"; +import { useQueryState } from "nuqs"; +import { Suspense, useEffect, useState } from "react"; +import { + LatestScripts, + MostViewedScripts, +} from "./_components/ScriptInfoBlocks"; +import Sidebar from "./_components/Sidebar"; + +function ScriptContent() { + const [selectedScript, setSelectedScript] = useQueryState("id"); + const [links, setLinks] = useState([]); + const [item, setItem] = useState