diff --git a/.github/CONTRIBUTOR_GUIDE/ct/AppName.md b/.github/CONTRIBUTOR_GUIDE/ct/AppName.md index 20d28d869..96d7add38 100644 --- a/.github/CONTRIBUTOR_GUIDE/ct/AppName.md +++ b/.github/CONTRIBUTOR_GUIDE/ct/AppName.md @@ -40,8 +40,8 @@ - Import the build.func file. - When developing your own script, change the URL to your own repository. -> [!CAUTION] -> Before opening a Pull Request, change the URL to point to the community-scripts repo. +> [!IMPORTANT] +> You also need to change all apperances of this URL in `misc/build.func` and `misc/install.func` Example for development: @@ -55,6 +55,9 @@ Final script: source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) ``` +> [!CAUTION] +> Before opening a Pull Request, change the URLs to point to the community-scripts repo. + ### 1.3 **Metadata** - Add clear comments for script metadata, including author, copyright, and license information. diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 5f1f19727..2f1c07dfc 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ ko_fi: community_scripts +github: community_scripts diff --git a/.github/workflows/auto-update-app-headers.yml b/.github/workflows/auto-update-app-headers.yml index b02c3e619..0a62c2dd5 100644 --- a/.github/workflows/auto-update-app-headers.yml +++ b/.github/workflows/auto-update-app-headers.yml @@ -1,4 +1,4 @@ -name: Auto Update .app-headers +name: Auto Update .app-files on: push: @@ -6,10 +6,10 @@ on: - main paths: - 'ct/**.sh' - workflow_dispatch: # ErmΓΆglicht das manuelle AusfΓΌhren der Action + workflow_dispatch: jobs: - update-app-headers: + update-app-files: runs-on: ubuntu-latest permissions: @@ -21,62 +21,59 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - # Step 2: Set up Git user for committing changes + # Step 2: Disable file mode changes detection + - name: Disable file mode changes + run: git config core.fileMode false + + # Step 3: Set up Git user for committing changes - name: Set up Git run: | git config --global user.name "GitHub Actions" - git config --global user.email "actions@github.com" + git config --global user.email "github-actions[bot]@users.noreply.github.com" - # Step 3: Install figlet + # Step 4: Install figlet - name: Install figlet run: sudo apt-get install -y figlet - # Step 4: Run the generate-app-headers.sh script to update .app-headers - - name: Run generate-app-headers.sh to update .app-headers + # Step 5: Run the updated generate-app-files.sh script + - name: Run generate-app-files.sh run: | chmod +x .github/workflows/scripts/generate-app-headers.sh .github/workflows/scripts/generate-app-headers.sh env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # Step 5: Check if there are any changes + # Step 6: Check if there are any changes - name: Check if there are any changes - id: verify-diff run: | - git diff --quiet . || echo "changed=true" >> $GITHUB_OUTPUT + echo "Checking for changes..." + git add -A # Untracked Dateien aufnehmen + git status + if git diff --cached --quiet; then + echo "No changes detected." + echo "changed=false" >> "$GITHUB_ENV" + else + echo "Changes detected:" + git diff --stat --cached + echo "changed=true" >> "$GITHUB_ENV" + fi - # Step 6: Commit changes (if any) and create a PR + # Step 7: Commit and create PR if changes exist - name: Commit and create PR if changes exist - if: steps.verify-diff.outputs.changed == 'true' + if: env.changed == 'true' run: | - git config --global user.name "github-actions[bot]" - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git add ./misc/.app-headers - git commit -m "Update .app-headers file" - # Create a temporary branch for the PR - git checkout -b pr-update-app-headers - git push origin pr-update-app-headers --force - - # Create PR against main - gh pr create --title "[core] update .app-headers file" \ - --body "This PR is auto-generated by a Github Action to update the .app-headers file." \ - --head pr-update-app-headers \ + git commit -m "Update .app files" + git checkout -b pr-update-app-files + git push origin pr-update-app-files --force + gh pr create --title "[core] update .app files" \ + --body "This PR is auto-generated by a GitHub Action to update the .app files." \ + --head pr-update-app-files \ --base main \ --label "automated pr" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Re-approve pull request after update - if: steps.verify-diff.outputs.changed == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - PR_NUMBER=$(gh pr list --head "pr-update-app-headers" --json number --jq '.[].number') - # Check if the PR was created by the bot (skip review if so) - PR_AUTHOR=$(gh pr view "$PR_NUMBER" --json author --jq '.author.login') - if [ "$PR_AUTHOR" != "github-actions[bot]" ]; then - gh pr review "$PR_NUMBER" --approve - else - echo "PR was created by the bot, skipping review." - fi - + # Step 8: Output success message when no changes + - name: No changes detected + if: env.changed == 'false' + run: echo "No changes to commit. Workflow completed successfully." diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b356eb49..d4eb65f81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,204 @@ All LXC instances created using this repository come pre-installed with Midnight Do not break established syntax in this file, as it is automatically updated by a Github Workflow +## 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 diff --git a/ct/actualbudget.sh b/ct/actualbudget.sh index 79b264ef2..75a01044f 100644 --- a/ct/actualbudget.sh +++ b/ct/actualbudget.sh @@ -28,33 +28,45 @@ function update_script() { header_info check_container_storage check_container_resources + if [[ ! -d /opt/actualbudget ]]; then msg_error "No ${APP} Installation Found!" exit fi - if ! command -v jq >/dev/null 2>&1; then - echo "Installing jq..." - apt-get install -y jq >/dev/null 2>&1 - echo "Installed jq..." + + RELEASE=$(curl -s 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" + + msg_info "Updating ${APP} to ${RELEASE}" + cd /tmp + wget -q https://github.com/actualbudget/actual-server/archive/refs/tags/v${RELEASE}.tar.gz + mv /opt/actualbudget /opt/actualbudget_bak + mkdir -p /opt/actualbudget/ + tar -xzf v${RELEASE}.tar.gz >/dev/null 2>&1 + mv *ctual-server-*/* /opt/actualbudget + rm -rf /opt/actualbudget/.env + mv /opt/actualbudget_bak/.env /opt/actualbudget + mv /opt/actualbudget_bak/server-files /opt/actualbudget/server-files + cd /opt/actualbudget + yarn install &>/dev/null + echo "${RELEASE}" >/opt/actualbudget_version.txt + msg_ok "Updated ${APP}" + + msg_info "Starting ${APP}" + systemctl start actualbudget + msg_ok "Started ${APP}" + + msg_info "Cleaning Up" + rm -rf /opt/actualbudget_bak + rm -rf /tmp/actual-server.tar.gz + msg_ok "Cleaned" + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" fi - - msg_info "Updating ${APP}" - systemctl stop actualbudget - RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual-server/tags | jq --raw-output '.[0].name') - TEMPD="$(mktemp -d)" - cd "${TEMPD}" - wget -q https://codeload.github.com/actualbudget/actual-server/legacy.tar.gz/refs/tags/${RELEASE} -O - | tar -xz - mv /opt/actualbudget /opt/actualbudget_bak - mkdir -p /opt/actualbudget/ - mv actualbudget-actual-server-*/* /opt/actualbudget/ - mv /opt/actualbudget_bak/.env /opt/actualbudget - mv /opt/actualbudget_bak/server-files /opt/actualbudget/server-files - cd /opt/actualbudget - yarn install &>/dev/null - systemctl start actualbudget - msg_ok "Successfully Updated ${APP} to ${RELEASE}" - rm -rf "${TEMPD}" - rm -rf /opt/actualbudget_bak exit } diff --git a/ct/alpine-docker.sh b/ct/alpine-docker.sh index 02b9b7bc0..ce4d1f7f1 100644 --- a/ct/alpine-docker.sh +++ b/ct/alpine-docker.sh @@ -11,7 +11,7 @@ var_cpu="1" var_ram="1024" var_disk="2" var_os="alpine" -var_version="3.20" +var_version="3.21" var_unprivileged="1" # App Output & Base Settings diff --git a/ct/alpine-grafana.sh b/ct/alpine-grafana.sh index 0a482b209..d921a29fc 100644 --- a/ct/alpine-grafana.sh +++ b/ct/alpine-grafana.sh @@ -11,7 +11,7 @@ var_cpu="1" var_ram="256" var_disk="1" var_os="alpine" -var_version="3.20" +var_version="3.21" var_unprivileged="1" # App Output & Base Settings diff --git a/ct/alpine-nextcloud.sh b/ct/alpine-nextcloud.sh index 817ff3907..4e03088c2 100644 --- a/ct/alpine-nextcloud.sh +++ b/ct/alpine-nextcloud.sh @@ -11,7 +11,7 @@ var_cpu="2" var_ram="1024" var_disk="2" var_os="alpine" -var_version="3.20" +var_version="3.21" var_unprivileged="1" # App Output & Base Settings diff --git a/ct/alpine-vaultwarden.sh b/ct/alpine-vaultwarden.sh index 5d4d91329..447a6d228 100644 --- a/ct/alpine-vaultwarden.sh +++ b/ct/alpine-vaultwarden.sh @@ -9,9 +9,9 @@ APP="Alpine-Vaultwarden" var_tags="alpine;vault" var_cpu="1" var_ram="256" -var_disk="0.3" +var_disk="0.5" var_os="alpine" -var_version="3.20" +var_version="3.21" var_unprivileged="1" # App Output & Base Settings diff --git a/ct/alpine-zigbee2mqtt.sh b/ct/alpine-zigbee2mqtt.sh index 413c05e91..54f75980c 100644 --- a/ct/alpine-zigbee2mqtt.sh +++ b/ct/alpine-zigbee2mqtt.sh @@ -11,7 +11,7 @@ var_disk="0.3" var_cpu="1" var_ram="256" var_os="alpine" -var_version="3.20" +var_version="3.21" var_unprivileged="0" # App Output & Base Settings diff --git a/ct/alpine.sh b/ct/alpine.sh index 493dce5a9..f6d93aef8 100644 --- a/ct/alpine.sh +++ b/ct/alpine.sh @@ -11,7 +11,7 @@ var_cpu="1" var_ram="512" var_disk="0.1" var_os="alpine" -var_version="3.20" +var_version="3.21" var_unprivileged="1" # App Output & Base Settings diff --git a/ct/beszel.sh b/ct/beszel.sh new file mode 100644 index 000000000..b0b87e1d8 --- /dev/null +++ b/ct/beszel.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +source <(curl -s 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 Default Values +APP="Beszel" +var_tags="monitoring" +var_cpu="1" +var_ram="512" +var_disk="5" +var_os="debian" +var_version="12" +var_unprivileged="1" + +# App Output & Base Settings +header_info "$APP" +base_settings + +# Core +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/beszel ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + /opt/beszel/beszel update + msg_error "Ther is currently no automatic update function for ${APP}." + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following IP:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8090${CL}" diff --git a/ct/caddy.sh b/ct/caddy.sh index 859d34792..03974eb23 100644 --- a/ct/caddy.sh +++ b/ct/caddy.sh @@ -10,7 +10,7 @@ APP="Caddy" var_tags="webserver" var_cpu="1" var_ram="512" -var_disk="2" +var_disk="4" var_os="debian" var_version="12" var_unprivileged="1" @@ -46,4 +46,4 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} 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 +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:80${CL}" diff --git a/ct/headers/2fauth b/ct/headers/2fauth new file mode 100644 index 000000000..b6421719c --- /dev/null +++ b/ct/headers/2fauth @@ -0,0 +1,6 @@ + ___ _________ __ __ + |__ \ / ____/ | __ __/ /_/ /_ + __/ // /_ / /| |/ / / / __/ __ \ + / __// __/ / ___ / /_/ / /_/ / / / +/____/_/ /_/ |_\__,_/\__/_/ /_/ + diff --git a/ct/headers/5etools b/ct/headers/5etools new file mode 100644 index 000000000..1556067f1 --- /dev/null +++ b/ct/headers/5etools @@ -0,0 +1,6 @@ + ______ __ __ + / ____/__ / /_____ ____ / /____ + /___ \/ _ \/ __/ __ \/ __ \/ / ___/ + ____/ / __/ /_/ /_/ / /_/ / (__ ) +/_____/\___/\__/\____/\____/_/____/ + diff --git a/ct/headers/actualbudget b/ct/headers/actualbudget new file mode 100644 index 000000000..db7f30933 --- /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 000000000..2332df179 --- /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 000000000..8e3c88d11 --- /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 000000000..dfe67792b --- /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 000000000..ecf1e0554 --- /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 000000000..7fd1b265d --- /dev/null +++ b/ct/headers/alpine-docker @@ -0,0 +1,6 @@ + ___ __ _ ____ __ + / | / /___ (_)___ ___ / __ \____ _____/ /_____ _____ + / /| | / / __ \/ / __ \/ _ \______/ / / / __ \/ ___/ //_/ _ \/ ___/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / /_/ / /__/ ,< / __/ / +/_/ |_/_/ .___/_/_/ /_/\___/ /_____/\____/\___/_/|_|\___/_/ + /_/ diff --git a/ct/headers/alpine-grafana b/ct/headers/alpine-grafana new file mode 100644 index 000000000..3fe493c9d --- /dev/null +++ b/ct/headers/alpine-grafana @@ -0,0 +1,6 @@ + ___ __ _ ______ ____ + / | / /___ (_)___ ___ / ____/________ _/ __/___ _____ ____ _ + / /| | / / __ \/ / __ \/ _ \______/ / __/ ___/ __ `/ /_/ __ `/ __ \/ __ `/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / / / /_/ / __/ /_/ / / / / /_/ / +/_/ |_/_/ .___/_/_/ /_/\___/ \____/_/ \__,_/_/ \__,_/_/ /_/\__,_/ + /_/ diff --git a/ct/headers/alpine-nextcloud b/ct/headers/alpine-nextcloud new file mode 100644 index 000000000..b27eb0cad --- /dev/null +++ b/ct/headers/alpine-nextcloud @@ -0,0 +1,12 @@ + ___ __ _ _ __ __ __ + / | / /___ (_)___ ___ / | / /__ _ __/ /______/ /___ __ __ + / /| | / / __ \/ / __ \/ _ \______/ |/ / _ \| |/_/ __/ ___/ / __ \/ / / / + / ___ |/ / /_/ / / / / / __/_____/ /| / __/> < +/_/ |_/_/ \___/_/ /_/_/ |___/\___/_____/\____/_/|_| + diff --git a/ct/headers/aria2 b/ct/headers/aria2 new file mode 100644 index 000000000..3080e17b4 --- /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 000000000..5e249a852 --- /dev/null +++ b/ct/headers/audiobookshelf @@ -0,0 +1,6 @@ + ___ __ __ __ ______ + ____ ___ ______/ (_)___ / /_ ____ ____ / /_______/ /_ ___ / / __/ + / __ `/ / / / __ / / __ \/ __ \/ __ \/ __ \/ //_/ ___/ __ \/ _ \/ / /_ +/ /_/ / /_/ / /_/ / / /_/ / /_/ / /_/ / /_/ / ,< (__ ) / / / __/ / __/ +\__,_/\__,_/\__,_/_/\____/_.___/\____/\____/_/|_/____/_/ /_/\___/_/_/ + diff --git a/ct/headers/authentik b/ct/headers/authentik new file mode 100644 index 000000000..f609964e0 --- /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 000000000..56322d59e --- /dev/null +++ b/ct/headers/autobrr @@ -0,0 +1,6 @@ + ___ __ __ + / | __ __/ /_____ / /_ __________ + / /| |/ / / / __/ __ \/ __ \/ ___/ ___/ + / ___ / /_/ / /_/ /_/ / /_/ / / / / +/_/ |_\__,_/\__/\____/_.___/_/ /_/ + diff --git a/ct/headers/bazarr b/ct/headers/bazarr new file mode 100644 index 000000000..e487a77d8 --- /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 000000000..dcb0d38d6 --- /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 000000000..3bd089bab --- /dev/null +++ b/ct/headers/blocky @@ -0,0 +1,6 @@ + ____ __ __ + / __ )/ /___ _____/ /____ __ + / __ / / __ \/ ___/ //_/ / / / + / /_/ / / /_/ / /__/ ,< / /_/ / +/_____/_/\____/\___/_/|_|\__, / + /____/ diff --git a/ct/headers/bookstack b/ct/headers/bookstack new file mode 100644 index 000000000..f68646662 --- /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 000000000..188677c45 --- /dev/null +++ b/ct/headers/bunkerweb @@ -0,0 +1,6 @@ + ____ __ _ __ __ + / __ )__ ______ / /_____ ____| | / /__ / /_ + / __ / / / / __ \/ //_/ _ \/ ___/ | /| / / _ \/ __ \ + / /_/ / /_/ / / / / ,< / __/ / | |/ |/ / __/ /_/ / +/_____/\__,_/_/ /_/_/|_|\___/_/ |__/|__/\___/_.___/ + diff --git a/ct/headers/caddy b/ct/headers/caddy new file mode 100644 index 000000000..6f47f9627 --- /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 000000000..ae9dc0379 --- /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 000000000..4af563a20 --- /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 000000000..bf9fefb4a --- /dev/null +++ b/ct/headers/changedetection @@ -0,0 +1,12 @@ + ________ + / ____/ /_ ____ _____ ____ ____ + / / / __ \/ __ `/ __ \/ __ `/ _ \ +/ /___/ / / / /_/ / / / / /_/ / __/ +\____/_/ /_/\__,_/_/ /_/\__, /\___/ + /____/ + ____ __ __ _ + / __ \___ / /____ _____/ /_(_)___ ____ + / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \ + / /_/ / __/ /_/ __/ /__/ /_/ / /_/ / / / / +/_____/\___/\__/\___/\___/\__/_/\____/_/ /_/ + diff --git a/ct/headers/channels b/ct/headers/channels new file mode 100644 index 000000000..7600b6e47 --- /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 000000000..ff80000cd --- /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 000000000..8011c2c23 --- /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 000000000..8eb04a26e --- /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 000000000..06beb9a56 --- /dev/null +++ b/ct/headers/commafeed @@ -0,0 +1,6 @@ + ______ ______ __ + / ____/___ ____ ___ ____ ___ ____ _/ ____/__ ___ ____/ / + / / / __ \/ __ `__ \/ __ `__ \/ __ `/ /_ / _ \/ _ \/ __ / +/ /___/ /_/ / / / / / / / / / / / /_/ / __/ / __/ __/ /_/ / +\____/\____/_/ /_/ /_/_/ /_/ /_/\__,_/_/ \___/\___/\__,_/ + diff --git a/ct/headers/cronicle b/ct/headers/cronicle new file mode 100644 index 000000000..6d6f7cfc9 --- /dev/null +++ b/ct/headers/cronicle @@ -0,0 +1,6 @@ + ______ _ __ + / ____/________ ____ (_)____/ /__ + / / / ___/ __ \/ __ \/ / ___/ / _ \ +/ /___/ / / /_/ / / / / / /__/ / __/ +\____/_/ \____/_/ /_/_/\___/_/\___/ + diff --git a/ct/headers/daemonsync b/ct/headers/daemonsync new file mode 100644 index 000000000..532072375 --- /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 000000000..330f9e3d0 --- /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 000000000..a6f474d46 --- /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 000000000..fcfceb280 --- /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 000000000..6dc49d04b --- /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 000000000..907ffbaef --- /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 000000000..040b66ac8 --- /dev/null +++ b/ct/headers/dockge @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /______ ____ + / / / / __ \/ ___/ //_/ __ `/ _ \ + / /_/ / /_/ / /__/ ,< / /_/ / __/ +/_____/\____/\___/_/|_|\__, /\___/ + /____/ diff --git a/ct/headers/dotnetaspwebapi b/ct/headers/dotnetaspwebapi new file mode 100644 index 000000000..f00b63ca3 --- /dev/null +++ b/ct/headers/dotnetaspwebapi @@ -0,0 +1,12 @@ + ____ __ __ ___ _____ ____ _ __ __ + / __ \____ / /_____ ___ / /_ / | / ___// __ \ | | / /__ / /_ + / / / / __ \/ __/ __ \/ _ \/ __/ / /| | \__ \/ /_/ / | | /| / / _ \/ __ \ + / /_/ / /_/ / /_/ / / / __/ /_ / ___ |___/ / ____/ | |/ |/ / __/ /_/ / +/_____/\____/\__/_/ /_/\___/\__/ /_/ |_/____/_/ |__/|__/\___/_.___/ + + ___ ____ ____ + / | / __ \/ _/ + / /| | / /_/ // / + / ___ |/ ____// / +/_/ |_/_/ /___/ + diff --git a/ct/headers/emby b/ct/headers/emby new file mode 100644 index 000000000..84afb1d6a --- /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 000000000..f6cb5038c --- /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 000000000..f47317c39 --- /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 000000000..5c9e86c65 --- /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 000000000..9317a5410 --- /dev/null +++ b/ct/headers/evcc @@ -0,0 +1,6 @@ + + ___ _ ____________ + / _ \ | / / ___/ ___/ +/ __/ |/ / /__/ /__ +\___/|___/\___/\___/ + diff --git a/ct/headers/fenrus b/ct/headers/fenrus new file mode 100644 index 000000000..95e073aab --- /dev/null +++ b/ct/headers/fenrus @@ -0,0 +1,6 @@ + ______ + / ____/__ ____ _______ _______ + / /_ / _ \/ __ \/ ___/ / / / ___/ + / __/ / __/ / / / / / /_/ (__ ) +/_/ \___/_/ /_/_/ \__,_/____/ + diff --git a/ct/headers/fhem b/ct/headers/fhem new file mode 100644 index 000000000..fe0a80c40 --- /dev/null +++ b/ct/headers/fhem @@ -0,0 +1,6 @@ + ________ __________ ___ + / ____/ / / / ____/ |/ / + / /_ / /_/ / __/ / /|_/ / + / __/ / __ / /___/ / / / +/_/ /_/ /_/_____/_/ /_/ + diff --git a/ct/headers/firefly b/ct/headers/firefly new file mode 100644 index 000000000..3aabc10c5 --- /dev/null +++ b/ct/headers/firefly @@ -0,0 +1,6 @@ + _______ ______ + / ____(_)_______ / __/ /_ __ + / /_ / / ___/ _ \/ /_/ / / / / + / __/ / / / / __/ __/ / /_/ / +/_/ /_/_/ \___/_/ /_/\__, / + /____/ diff --git a/ct/headers/flaresolverr b/ct/headers/flaresolverr new file mode 100644 index 000000000..a710dd625 --- /dev/null +++ b/ct/headers/flaresolverr @@ -0,0 +1,6 @@ + ________ _____ __ + / ____/ /___ _________ / ___/____ / / _____ __________ + / /_ / / __ `/ ___/ _ \\__ \/ __ \/ / | / / _ \/ ___/ ___/ + / __/ / / /_/ / / / __/__/ / /_/ / /| |/ / __/ / / / +/_/ /_/\__,_/_/ \___/____/\____/_/ |___/\___/_/ /_/ + diff --git a/ct/headers/flowiseai b/ct/headers/flowiseai new file mode 100644 index 000000000..7011f22b4 --- /dev/null +++ b/ct/headers/flowiseai @@ -0,0 +1,6 @@ + ________ _ ___ ____ + / ____/ /___ _ __(_)_______ / | / _/ + / /_ / / __ \ | /| / / / ___/ _ \/ /| | / / + / __/ / / /_/ / |/ |/ / (__ ) __/ ___ |_/ / +/_/ /_/\____/|__/|__/_/____/\___/_/ |_/___/ + diff --git a/ct/headers/forgejo b/ct/headers/forgejo new file mode 100644 index 000000000..4fb3af69e --- /dev/null +++ b/ct/headers/forgejo @@ -0,0 +1,6 @@ + ______ _ + / ____/___ _________ ____ (_)___ + / /_ / __ \/ ___/ __ `/ _ \ / / __ \ + / __/ / /_/ / / / /_/ / __/ / / /_/ / +/_/ \____/_/ \__, /\___/_/ /\____/ + /____/ /___/ diff --git a/ct/headers/frigate b/ct/headers/frigate new file mode 100644 index 000000000..94ffd3a7d --- /dev/null +++ b/ct/headers/frigate @@ -0,0 +1,6 @@ + ______ _ __ + / ____/____(_)___ _____ _/ /____ + / /_ / ___/ / __ `/ __ `/ __/ _ \ + / __/ / / / / /_/ / /_/ / /_/ __/ +/_/ /_/ /_/\__, /\__,_/\__/\___/ + /____/ diff --git a/ct/headers/ghost b/ct/headers/ghost new file mode 100644 index 000000000..c16e83b87 --- /dev/null +++ b/ct/headers/ghost @@ -0,0 +1,6 @@ + ________ __ + / ____/ /_ ____ _____/ /_ + / / __/ __ \/ __ \/ ___/ __/ +/ /_/ / / / / /_/ (__ ) /_ +\____/_/ /_/\____/____/\__/ + diff --git a/ct/headers/gitea b/ct/headers/gitea new file mode 100644 index 000000000..7826ac30a --- /dev/null +++ b/ct/headers/gitea @@ -0,0 +1,6 @@ + _______ __ + / ____(_) /____ ____ _ + / / __/ / __/ _ \/ __ `/ +/ /_/ / / /_/ __/ /_/ / +\____/_/\__/\___/\__,_/ + diff --git a/ct/headers/glance b/ct/headers/glance new file mode 100644 index 000000000..abaaa8af2 --- /dev/null +++ b/ct/headers/glance @@ -0,0 +1,6 @@ + ________ + / ____/ /___ _____ ________ + / / __/ / __ `/ __ \/ ___/ _ \ +/ /_/ / / /_/ / / / / /__/ __/ +\____/_/\__,_/_/ /_/\___/\___/ + diff --git a/ct/headers/glpi b/ct/headers/glpi new file mode 100644 index 000000000..789b62590 --- /dev/null +++ b/ct/headers/glpi @@ -0,0 +1,6 @@ + ________ ____ ____ + / ____/ / / __ \/ _/ + / / __/ / / /_/ // / +/ /_/ / /___/ ____// / +\____/_____/_/ /___/ + diff --git a/ct/headers/go2rtc b/ct/headers/go2rtc new file mode 100644 index 000000000..3a3e8bf8c --- /dev/null +++ b/ct/headers/go2rtc @@ -0,0 +1,6 @@ + ___ __ + ____ _____ |__ \ _____/ /______ + / __ `/ __ \__/ // ___/ __/ ___/ + / /_/ / /_/ / __// / / /_/ /__ + \__, /\____/____/_/ \__/\___/ +/____/ diff --git a/ct/headers/gokapi b/ct/headers/gokapi new file mode 100644 index 000000000..c612c9fa1 --- /dev/null +++ b/ct/headers/gokapi @@ -0,0 +1,6 @@ + ______ __ _ + / ____/___ / /______ _____ (_) + / / __/ __ \/ //_/ __ `/ __ \/ / +/ /_/ / /_/ / ,< / /_/ / /_/ / / +\____/\____/_/|_|\__,_/ .___/_/ + /_/ diff --git a/ct/headers/gotify b/ct/headers/gotify new file mode 100644 index 000000000..8532f9ef9 --- /dev/null +++ b/ct/headers/gotify @@ -0,0 +1,6 @@ + ______ __ _ ____ + / ____/___ / /_(_) __/_ __ + / / __/ __ \/ __/ / /_/ / / / +/ /_/ / /_/ / /_/ / __/ /_/ / +\____/\____/\__/_/_/ \__, / + /____/ diff --git a/ct/headers/grafana b/ct/headers/grafana new file mode 100644 index 000000000..9eb8a245f --- /dev/null +++ b/ct/headers/grafana @@ -0,0 +1,6 @@ + ______ ____ + / ____/________ _/ __/___ _____ ____ _ + / / __/ ___/ __ `/ /_/ __ `/ __ \/ __ `/ +/ /_/ / / / /_/ / __/ /_/ / / / / /_/ / +\____/_/ \__,_/_/ \__,_/_/ /_/\__,_/ + diff --git a/ct/headers/grist b/ct/headers/grist new file mode 100644 index 000000000..f82ced4f1 --- /dev/null +++ b/ct/headers/grist @@ -0,0 +1,6 @@ + ______ _ __ + / ____/____(_)____/ /_ + / / __/ ___/ / ___/ __/ +/ /_/ / / / (__ ) /_ +\____/_/ /_/____/\__/ + diff --git a/ct/headers/grocy b/ct/headers/grocy new file mode 100644 index 000000000..2aad01d40 --- /dev/null +++ b/ct/headers/grocy @@ -0,0 +1,6 @@ + + ____ __________ _______ __ + / __ `/ ___/ __ \/ ___/ / / / + / /_/ / / / /_/ / /__/ /_/ / + \__, /_/ \____/\___/\__, / +/____/ /____/ diff --git a/ct/headers/headscale b/ct/headers/headscale new file mode 100644 index 000000000..ff8ca5149 --- /dev/null +++ b/ct/headers/headscale @@ -0,0 +1,6 @@ + __ __ __ __ + / / / /__ ____ _____/ /_____________ _/ /__ + / /_/ / _ \/ __ `/ __ / ___/ ___/ __ `/ / _ \ + / __ / __/ /_/ / /_/ (__ ) /__/ /_/ / / __/ +/_/ /_/\___/\__,_/\__,_/____/\___/\__,_/_/\___/ + diff --git a/ct/headers/heimdall-dashboard b/ct/headers/heimdall-dashboard new file mode 100644 index 000000000..245902b76 --- /dev/null +++ b/ct/headers/heimdall-dashboard @@ -0,0 +1,12 @@ + __ __ _ __ ____ ____ __ __ + / / / /__ (_)___ ___ ____/ /___ _/ / / / __ \____ ______/ /_ / /_ + / /_/ / _ \/ / __ `__ \/ __ / __ `/ / /_____/ / / / __ `/ ___/ __ \/ __ \ + / __ / __/ / / / / / / /_/ / /_/ / / /_____/ /_/ / /_/ (__ ) / / / /_/ / +/_/ /_/\___/_/_/ /_/ /_/\__,_/\__,_/_/_/ /_____/\__,_/____/_/ /_/_.___/ + + __ + ____ ____ __________/ / + / __ \/ __ `/ ___/ __ / +/ /_/ / /_/ / / / /_/ / +\____/\__,_/_/ \__,_/ + diff --git a/ct/headers/hivemq b/ct/headers/hivemq new file mode 100644 index 000000000..ac5216a72 --- /dev/null +++ b/ct/headers/hivemq @@ -0,0 +1,6 @@ + __ ___ __ _______ + / / / (_) _____ / |/ / __ \ + / /_/ / / | / / _ \/ /|_/ / / / / + / __ / /| |/ / __/ / / / /_/ / +/_/ /_/_/ |___/\___/_/ /_/\___\_\ + diff --git a/ct/headers/hoarder b/ct/headers/hoarder new file mode 100644 index 000000000..c09416d41 --- /dev/null +++ b/ct/headers/hoarder @@ -0,0 +1,6 @@ + __ __ __ + / / / /___ ____ __________/ /__ _____ + / /_/ / __ \/ __ `/ ___/ __ / _ \/ ___/ + / __ / /_/ / /_/ / / / /_/ / __/ / +/_/ /_/\____/\__,_/_/ \__,_/\___/_/ + diff --git a/ct/headers/homarr b/ct/headers/homarr new file mode 100644 index 000000000..1bd7a939e --- /dev/null +++ b/ct/headers/homarr @@ -0,0 +1,6 @@ + __ __ + / / / /___ ____ ___ ____ ___________ + / /_/ / __ \/ __ `__ \/ __ `/ ___/ ___/ + / __ / /_/ / / / / / / /_/ / / / / +/_/ /_/\____/_/ /_/ /_/\__,_/_/ /_/ + diff --git a/ct/headers/homeassistant b/ct/headers/homeassistant new file mode 100644 index 000000000..a88730f49 --- /dev/null +++ b/ct/headers/homeassistant @@ -0,0 +1,6 @@ + __ __ ___ _ __ __ + / / / /___ ____ ___ ___ / | __________(_)____/ /_____ _____ / /_ + / /_/ / __ \/ __ `__ \/ _ \ / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ + / __ / /_/ / / / / / / __/ / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ +/_/ /_/\____/_/ /_/ /_/\___/ /_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ + diff --git a/ct/headers/homeassistant-core b/ct/headers/homeassistant-core new file mode 100644 index 000000000..efbc16431 --- /dev/null +++ b/ct/headers/homeassistant-core @@ -0,0 +1,12 @@ + __ __ + / / / /___ ____ ___ ___ + / /_/ / __ \/ __ `__ \/ _ \ + / __ / /_/ / / / / / / __/ +/_/ /_/\____/_/ /_/ /_/\___/ + + ___ _ __ __ ______ + / | __________(_)____/ /_____ _____ / /_ / ____/___ ________ + / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/_____/ / / __ \/ ___/ _ \ + / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_/_____/ /___/ /_/ / / / __/ +/_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ \____/\____/_/ \___/ + diff --git a/ct/headers/homebox b/ct/headers/homebox new file mode 100644 index 000000000..da717216b --- /dev/null +++ b/ct/headers/homebox @@ -0,0 +1,6 @@ + __ __ ____ + / / / /___ ____ ___ ___ / __ )____ _ __ + / /_/ / __ \/ __ `__ \/ _ \/ __ / __ \| |/_/ + / __ / /_/ / / / / / / __/ /_/ / /_/ /> < +/_/ /_/\____/_/ /_/ /_/\___/_____/\____/_/|_| + diff --git a/ct/headers/homebridge b/ct/headers/homebridge new file mode 100644 index 000000000..a3da02405 --- /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 000000000..4ff42a16b --- /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 000000000..80e4281a2 --- /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 000000000..cbbcfc570 --- /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 000000000..2c0f7972c --- /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 000000000..b8efea541 --- /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 000000000..9aa8b5943 --- /dev/null +++ b/ct/headers/nextcloudpi @@ -0,0 +1,6 @@ + _ __ __ ________ ______ _ + / | / /__ _ __/ /_/ ____/ /___ __ ______/ / __ \(_) + / |/ / _ \| |/_/ __/ / / / __ \/ / / / __ / /_/ / / + / /| / __/> < / ____/ / / /_/ /> < +/_/ \__,_/ .___/\___/_/ /_/\___/____/____/ /_/ /_/\__, /_/|_| + /_/ /____/ diff --git a/ct/headers/part-db b/ct/headers/part-db new file mode 100644 index 000000000..fe3255506 --- /dev/null +++ b/ct/headers/part-db @@ -0,0 +1,6 @@ + ____ __ ____ ____ + / __ \____ ______/ /_ / __ \/ __ ) + / /_/ / __ `/ ___/ __/_____/ / / / __ | + / ____/ /_/ / / / /_/_____/ /_/ / /_/ / +/_/ \__,_/_/ \__/ /_____/_____/ + diff --git a/ct/headers/pbs b/ct/headers/pbs new file mode 100644 index 000000000..785d90a83 --- /dev/null +++ b/ct/headers/pbs @@ -0,0 +1,6 @@ + ____ ____ _____ + / __ \/ __ ) ___/ + / /_/ / __ \__ \ + / ____/ /_/ /__/ / +/_/ /_____/____/ + diff --git a/ct/headers/peanut b/ct/headers/peanut new file mode 100644 index 000000000..11a2cd5c6 --- /dev/null +++ b/ct/headers/peanut @@ -0,0 +1,6 @@ + ____ _ ____ ________ + / __ \___ ____ _/ | / / / / /_ __/ + / /_/ / _ \/ __ `/ |/ / / / / / / + / ____/ __/ /_/ / /| / /_/ / / / +/_/ \___/\__,_/_/ |_/\____/ /_/ + diff --git a/ct/headers/petio b/ct/headers/petio new file mode 100644 index 000000000..d8deb745a --- /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 000000000..b6f7cb106 --- /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 000000000..a8a9cabe5 --- /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 000000000..51ba79de5 --- /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 000000000..07f2474c1 --- /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 000000000..9a727b229 --- /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 000000000..8177f8179 --- /dev/null +++ b/ct/headers/pingvin @@ -0,0 +1,6 @@ + ____ _ _ + / __ \(_)___ ____ __ __(_)___ + / /_/ / / __ \/ __ `/ | / / / __ \ + / ____/ / / / / /_/ /| |/ / / / / / +/_/ /_/_/ /_/\__, / |___/_/_/ /_/ + /____/ diff --git a/ct/headers/plex b/ct/headers/plex new file mode 100644 index 000000000..2e27d0b8e --- /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 000000000..5eea86259 --- /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 000000000..a1540eff0 --- /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 000000000..2f81f14a8 --- /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 000000000..c1241da46 --- /dev/null +++ b/ct/headers/podman-homeassistant @@ -0,0 +1,12 @@ + ____ __ __ __ + / __ \____ ____/ /___ ___ ____ _____ / / / /___ ____ ___ ___ + / /_/ / __ \/ __ / __ `__ \/ __ `/ __ \______/ /_/ / __ \/ __ `__ \/ _ \ + / ____/ /_/ / /_/ / / / / / / /_/ / / / /_____/ __ / /_/ / / / / / / __/ +/_/ \____/\__,_/_/ /_/ /_/\__,_/_/ /_/ /_/ /_/\____/_/ /_/ /_/\___/ + + ___ _ __ __ + / | __________(_)____/ /_____ _____ / /_ + / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/ + / ___ |(__ |__ ) (__ ) /_/ /_/ / / / / /_ +/_/ |_/____/____/_/____/\__/\__,_/_/ /_/\__/ + diff --git a/ct/headers/postgresql b/ct/headers/postgresql new file mode 100644 index 000000000..8297b0ad4 --- /dev/null +++ b/ct/headers/postgresql @@ -0,0 +1,6 @@ + ____ __ _____ ____ __ + / __ \____ _____/ /_____ _________ / ___// __ \ / / + / /_/ / __ \/ ___/ __/ __ `/ ___/ _ \\__ \/ / / / / / + / ____/ /_/ (__ ) /_/ /_/ / / / __/__/ / /_/ / / /___ +/_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/ + /____/ diff --git a/ct/headers/projectsend b/ct/headers/projectsend new file mode 100644 index 000000000..c388eb724 --- /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 000000000..f5a9cccce --- /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 000000000..43a4876bd --- /dev/null +++ b/ct/headers/prometheus-alertmanager @@ -0,0 +1,12 @@ + ____ __ __ ___ __ + / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______ / | / / + / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /| | / / + / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ )_____/ ___ |/ / +/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/ /_/ |_/_/ + + __ + ___ _____/ /_____ ___ ____ _____ ____ _____ ____ _____ + / _ \/ ___/ __/ __ `__ \/ __ `/ __ \/ __ `/ __ `/ _ \/ ___/ +/ __/ / / /_/ / / / / / /_/ / / / / /_/ / /_/ / __/ / +\___/_/ \__/_/ /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/ + /____/ diff --git a/ct/headers/prometheus-pve-exporter b/ct/headers/prometheus-pve-exporter new file mode 100644 index 000000000..35d5d2157 --- /dev/null +++ b/ct/headers/prometheus-pve-exporter @@ -0,0 +1,12 @@ + ____ __ __ ____ + / __ \_________ ____ ___ ___ / /_/ /_ ___ __ _______ / __ \ + / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /_/ / + / ____/ / / /_/ / / / / / / __/ /_/ / / / __/ /_/ (__ )_____/ ____/ +/_/ /_/ \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/ /_/ + + _ ________ ______ __ +| | / / ____/ / ____/ ______ ____ _____/ /____ _____ +| | / / __/______/ __/ | |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/ +| |/ / /__/_____/ /____> < +/____/\__,_/_.___/_.___/_/_/|_| + diff --git a/ct/headers/zammad b/ct/headers/zammad new file mode 100644 index 000000000..eb9999df1 --- /dev/null +++ b/ct/headers/zammad @@ -0,0 +1,6 @@ + _____ __ +/__ / ____ _____ ___ ____ ___ ____ _____/ / + / / / __ `/ __ `__ \/ __ `__ \/ __ `/ __ / + / /__/ /_/ / / / / / / / / / / / /_/ / /_/ / +/____/\__,_/_/ /_/ /_/_/ /_/ /_/\__,_/\__,_/ + diff --git a/ct/headers/zigbee2mqtt b/ct/headers/zigbee2mqtt new file mode 100644 index 000000000..f6925a017 --- /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 000000000..ce2b4b914 --- /dev/null +++ b/ct/headers/zipline @@ -0,0 +1,6 @@ + _____ _ ___ +/__ / (_)___ / (_)___ ___ + / / / / __ \/ / / __ \/ _ \ + / /__/ / /_/ / / / / / / __/ +/____/_/ .___/_/_/_/ /_/\___/ + /_/ diff --git a/ct/headers/zoraxy b/ct/headers/zoraxy new file mode 100644 index 000000000..f93198af0 --- /dev/null +++ b/ct/headers/zoraxy @@ -0,0 +1,6 @@ + _____ +/__ / ____ _________ __ ____ __ + / / / __ \/ ___/ __ `/ |/_/ / / / + / /__/ /_/ / / / /_/ /> /dev/null - yarn build &>/dev/null + pnpm install &>/dev/null + pnpm run db:migration:sqlite:run &>/dev/null + pnpm build &>/dev/null + mkdir 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 "Restoring Data" - rm -rf /opt/homarr/data/configs - mv /opt/homarr-data-backup/configs /opt/homarr/data/configs - mv /opt/homarr-data-backup/db.sqlite /opt/homarr/database/db.sqlite - yarn db:migrate &>/dev/null - rm -rf /opt/homarr-data-backup - msg_ok "Restored Data" - msg_info "Starting Services" systemctl start homarr msg_ok "Started Services" msg_ok "Updated Successfully" else - msg_ok "No update required. ${APP} is already at ${RELEASE}" + msg_ok "No update required. ${APP} is already at v${RELEASE}" fi exit } @@ -83,4 +84,4 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} 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 +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/jellyfin.sh b/ct/jellyfin.sh index 7e8647ad5..8862e5de7 100644 --- a/ct/jellyfin.sh +++ b/ct/jellyfin.sh @@ -35,7 +35,7 @@ function update_script() { msg_info "Updating ${APP} LXC" apt-get update &>/dev/null apt-get -y upgrade &>/dev/null - apt-get --with-new-pkgs upgrade jellyfin jellyfin-server &>/dev/null + apt-get -y --with-new-pkgs upgrade jellyfin jellyfin-server &>/dev/null msg_ok "Updated ${APP} LXC" exit } diff --git a/ct/lubelogger.sh b/ct/lubelogger.sh index cd6e85d1c..3bc3019e2 100644 --- a/ct/lubelogger.sh +++ b/ct/lubelogger.sh @@ -42,14 +42,17 @@ function update_script() { msg_info "Updating ${APP} to v${RELEASE}" cd /opt wget -q https://github.com/hargata/lubelog/releases/download/v${RELEASE}/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip - mkdir -p /tmp/lubeloggerData/wwwroot + mkdir -p /tmp/lubeloggerData/data cp /opt/lubelogger/appsettings.json /tmp/lubeloggerData/appsettings.json - cp -r /opt/lubelogger/config /tmp/lubeloggerData/ - cp -r /opt/lubelogger/data /tmp/lubeloggerData/ - [[ -e /opt/lubelogger/wwwroot/translations ]] && cp -r /opt/lubelogger/wwwroot/translations /tmp/lubeloggerData/wwwroot/ - [[ -e /opt/lubelogger/wwwroot/documents ]] && cp -r /opt/lubelogger/wwwroot/documents /tmp/lubeloggerData/wwwroot/ - [[ -e /opt/lubelogger/wwwroot/images ]] && cp -r /opt/lubelogger/wwwroot/images /tmp/lubeloggerData/wwwroot/ - [[ -e /opt/lubelogger/wwwroot/temp ]] && cp -r /opt/lubelogger/wwwroot/temp /tmp/lubeloggerData/wwwroot/ + 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 diff --git a/ct/monica.sh b/ct/monica.sh new file mode 100644 index 000000000..cb9785875 --- /dev/null +++ b/ct/monica.sh @@ -0,0 +1,81 @@ +#!/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: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.monicahq.com/ + +# App Default Values +APP="Monica" +var_tags="network" +var_cpu="2" +var_ram="2048" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +# App Output & Base Settings +header_info "$APP" +base_settings + +# Core +variables +color +catch_errors + +function 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 -s 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 + wget -q "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/ + composer install --no-interaction --no-dev &>/dev/null + yarn install &>/dev/null + yarn run production &>/dev/null + php artisan monica:update --force &>/dev/null + 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/nodebb.sh b/ct/nodebb.sh new file mode 100644 index 000000000..a327a02b8 --- /dev/null +++ b/ct/nodebb.sh @@ -0,0 +1,63 @@ +#!/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 + +# App Default Values +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 -s 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 + ./nodebb upgrade >/dev/null 2>&1 + 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}" diff --git a/ct/opengist.sh b/ct/opengist.sh index fb924fbdf..796a0ae35 100644 --- a/ct/opengist.sh +++ b/ct/opengist.sh @@ -32,29 +32,35 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Stopping Service" - systemctl stop opengist.service - msg_ok "Stopped Service" - apt-get update &>/dev/null - apt-get upgrade &>/dev/null RELEASE=$(curl -s 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}" + apt-get update &>/dev/null + apt-get -y upgrade &>/dev/null cd /opt - wget -qO "https://github.com/thomiceli/opengist/releases/download/v${RELEASE}/opengist${RELEASE}-linux-arm64.tar.gz" - rm -rf /opt/opengist + mv /opt/opengist /opt/opengist-backup + wget -q "https://github.com/thomiceli/opengist/releases/download/v${RELEASE}/opengist${RELEASE}-linux-arm64.tar.gz" tar -xzf opengist${RELEASE}-linux-arm64.tar.gz + mv /opt/opengist-backup/config.yml /opt/opengist/config.yml chmod +x /opt/opengist/opengist echo "${RELEASE}" >"/opt/${APP}_version.txt" - rm -rf /opt/opengist${RELEASE}-linux-arm64.tar.gz - apt-get -y autoremove &>/dev/null - apt-get -y autoclean &>/dev/null 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 + apt-get -y autoremove &>/dev/null + apt-get -y autoclean &>/dev/null + msg_ok "Cleaned" + msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at v${RELEASE}." fi diff --git a/ct/openhab.sh b/ct/openhab.sh index 7347fa5b0..64723af8d 100644 --- a/ct/openhab.sh +++ b/ct/openhab.sh @@ -45,5 +45,6 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} 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 +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}" diff --git a/ct/pbs.sh b/ct/pbs.sh index 709900d0e..26f27ccd3 100644 --- a/ct/pbs.sh +++ b/ct/pbs.sh @@ -52,4 +52,4 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8007${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8007${CL}" diff --git a/ct/pingvin.sh b/ct/pingvin.sh index aeb853c1e..9d7e2ed20 100644 --- a/ct/pingvin.sh +++ b/ct/pingvin.sh @@ -32,30 +32,42 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Stopping Pingvin Share" - systemctl stop pm2-root.service - msg_ok "Stopped Pingvin Share" + + RELEASE=$(curl -s 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 + wget -q "https://github.com/stonith404/pingvin-share/archive/refs/tags/v${RELEASE}.zip" + unzip -q v${RELEASE}.zip + mv pingvin-share-${RELEASE} /opt/pingvin-share + cd /opt/pingvin-share + cd backend + npm install &>/dev/null + npm run build &>/dev/null + cd ../frontend + npm install &>/dev/null + npm run build &>/dev/null + echo "${RELEASE}" >"/opt/pingvin_version.txt" + rm -rf /opt/v${RELEASE}.zip + msg_ok "Updated Pingvin Share to v${RELEASE}" - msg_info "Updating Pingvin Share" - cd /opt/pingvin-share - git fetch --tags - git checkout $(git describe --tags $(git rev-list --tags --max-count=1)) &>/dev/null - cd backend - npm install &>/dev/null - npm run build &>/dev/null - cd ../frontend - npm install &>/dev/null - npm run build &>/dev/null - msg_ok "Updated Pingvin Share" + msg_info "Starting Pingvin Share" + systemctl start pm2-root.service + msg_ok "Started Pingvin Share" - msg_info "Starting Pingvin Share" - systemctl start pm2-root.service - msg_ok "Started Pingvin Share" - - msg_ok "Updated Successfully" - exit + msg_ok "Updated Successfully" + exit + else + msg_ok "No update required. Pingvin Share is already at v${RELEASE}." + fi } + start build_container description @@ -63,4 +75,4 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} 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 +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/pocketbase.sh b/ct/pocketbase.sh index e62f4a4b3..a3ac56aa2 100644 --- a/ct/pocketbase.sh +++ b/ct/pocketbase.sh @@ -54,4 +54,4 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} 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}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/_/${CL}" diff --git a/ct/pocketid.sh b/ct/pocketid.sh new file mode 100755 index 000000000..5e717f6f8 --- /dev/null +++ b/ct/pocketid.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: Snarkenfaugister +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/stonith404/pocket-id + +# App Default Values +APP="PocketID" +TAGS="identity-provider" +var_cpu="2" +var_ram="2048" +var_disk="4" +var_os="debian" +var_version="12" +var_unprivileged="1" + +# App Output & Base Settings +header_info "$APP" +base_settings + +# Core +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/pocket-id ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/stonith404/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 + wget -q "https://github.com/stonith404/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/projectsend.sh b/ct/projectsend.sh new file mode 100644 index 000000000..f2e845662 --- /dev/null +++ b/ct/projectsend.sh @@ -0,0 +1,71 @@ +#!/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: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.projectsend.org/ + +# App Default Values +APP="ProjectSend" +var_tags="media" +var_cpu="1" +var_ram="1024" +var_disk="8" +var_os="debian" +var_version="12" +var_unprivileged="1" + +# App Output & Base Settings +header_info "$APP" +base_settings + +# Core +variables +color +catch_errors + +function 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 -s 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 + wget -q "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-pve-exporter.sh b/ct/prometheus-pve-exporter.sh new file mode 100644 index 000000000..198e42806 --- /dev/null +++ b/ct/prometheus-pve-exporter.sh @@ -0,0 +1,57 @@ +#!/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: Andy Grunwald (andygrunwald) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/prometheus-pve/prometheus-pve-exporter + +# App Default Values +APP="Prometheus-PVE-Exporter" +var_tags="monitoring" +var_cpu="1" +var_ram="1024" +var_disk="2" +var_os="debian" +var_version="12" +var_unprivileged="1" + +# App Output & Base Settings +header_info "$APP" +base_settings + +# Core +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -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}" + pip install prometheus-pve-exporter --upgrade --root-user-action=ignore &>/dev/null + 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/sqlserver2022.sh b/ct/sqlserver2022.sh new file mode 100644 index 000000000..fe7ab57e3 --- /dev/null +++ b/ct/sqlserver2022.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/kris701/ProxmoxVE/refs/heads/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 Default Values +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" + +# App Output & Base Settings +header_info "$APP" +base_settings + +# Core +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/mssql ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP} LXC" + apt-get update &>/dev/null + apt-get -y upgrade &>/dev/null + msg_ok "Updated Successfully" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${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/teddycloud.sh b/ct/teddycloud.sh index 687bb23e0..211b7abad 100644 --- a/ct/teddycloud.sh +++ b/ct/teddycloud.sh @@ -36,14 +36,12 @@ function update_script() { msg_ok "Stopped ${APP}" msg_info "Updating ${APP} to v${VERSION}" - PREVIOUS_VERSION="$(readlink -f /opt/teddycloud)" + cd /opt + mv /opt/teddycloud /opt_teddycloud_bak wget -q "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip" - unzip -q -d "/opt/teddycloud-${VERSION}" "teddycloud.amd64.release_v${VERSION}.zip" - ln -fns "/opt/teddycloud-${VERSION}" /opt/teddycloud + 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" - cp -R "${PREVIOUS_VERSION}/certs" /opt/teddycloud - cp -R "${PREVIOUS_VERSION}/config" /opt/teddycloud - cp -R "${PREVIOUS_VERSION}/data" /opt/teddycloud msg_ok "Updated ${APP} to v${VERSION}" msg_info "Starting ${APP}" @@ -51,8 +49,8 @@ function update_script() { msg_ok "Started ${APP}" msg_info "Cleaning up" - rm "teddycloud.amd64.release_v${VERSION}.zip" - rm -rf "${PREVIOUS_VERSION}" + 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}" diff --git a/ct/unifi.sh b/ct/unifi.sh index 141c53d92..7ddb65d27 100644 --- a/ct/unifi.sh +++ b/ct/unifi.sh @@ -46,4 +46,4 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8443${CL}" +echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8443${CL}" diff --git a/ct/urbackupserver.sh b/ct/urbackupserver.sh new file mode 100644 index 000000000..7ebcffb87 --- /dev/null +++ b/ct/urbackupserver.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/refs/heads/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Kristian Skov +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.urbackup.org/ + +# App Default Values +APP="UrBackup Server" +var_tags="web" +var_cpu="1" +var_ram="1024" +var_disk="16" +var_os="debian" +var_version="12" +var_unprivileged="0" + +# App Output & Base Settings +header_info "$APP" +base_settings + +# Core +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /var/urbackup ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating ${APP} LXC" + apt-get update &>/dev/null + apt-get -y upgrade &>/dev/null + msg_ok "Updated Successfully" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${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}" diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 40e82fae3..af124282a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -38,6 +38,7 @@ "prettier-plugin-organize-imports": "^4.1.0", "react": "19.0.0-rc-02c0e824-20241028", "react-code-blocks": "^0.1.6", + "react-datepicker": "^7.6.0", "react-day-picker": "8.10.1", "react-dom": "19.0.0-rc-02c0e824-20241028", "react-icons": "^5.1.0", @@ -467,9 +468,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -484,9 +485,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -501,9 +502,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -518,9 +519,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -535,9 +536,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -552,9 +553,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -569,9 +570,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -586,9 +587,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -603,9 +604,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -620,9 +621,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -637,9 +638,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -654,9 +655,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -671,9 +672,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -688,9 +689,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -705,9 +706,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -722,9 +723,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -739,9 +740,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -755,10 +756,27 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -773,9 +791,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -790,9 +808,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -807,9 +825,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -824,9 +842,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -841,9 +859,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -858,9 +876,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -1066,9 +1084,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "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": { @@ -4844,9 +4862,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4857,30 +4875,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -7999,6 +8018,46 @@ "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", @@ -9037,6 +9096,12 @@ "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.5.4", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz", @@ -9535,13 +9600,13 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.1.tgz", - "integrity": "sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.24.0", + "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, diff --git a/frontend/package.json b/frontend/package.json index 2309f43c5..e689ba4c0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -49,6 +49,7 @@ "prettier-plugin-organize-imports": "^4.1.0", "react": "19.0.0-rc-02c0e824-20241028", "react-code-blocks": "^0.1.6", + "react-datepicker": "^7.6.0", "react-day-picker": "8.10.1", "react-dom": "19.0.0-rc-02c0e824-20241028", "react-icons": "^5.1.0", diff --git a/frontend/src/app/category-view/page.tsx b/frontend/src/app/category-view/page.tsx new file mode 100644 index 000000000..1d5a9e91c --- /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 000000000..59be8a01d --- /dev/null +++ b/frontend/src/app/data/page.tsx @@ -0,0 +1,236 @@ +"use client"; + +import React, { useEffect, useState } from "react"; +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import { string } from "zod"; + + +interface DataModel { + id: number; + ct_type: number; + disk_size: number; + core_count: number; + ram_size: number; + verbose: string; + os_type: string; + os_version: string; + hn: string; + disableip6: string; + ssh: string; + tags: string; + nsapp: string; + created_at: string; + method: string; + pve_version: string; +} + + +const DataFetcher: React.FC = () => { + const [data, setData] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [searchQuery, setSearchQuery] = useState(''); + const [startDate, setStartDate] = useState(null); + const [endDate, setEndDate] = useState(null); + const [sortConfig, setSortConfig] = useState<{ key: keyof DataModel | null, direction: 'ascending' | 'descending' }>({ key: 'id', direction: 'descending' }); + const [itemsPerPage, setItemsPerPage] = useState(5); + const [currentPage, setCurrentPage] = useState(1); + + useEffect(() => { + const fetchData = async () => { + try { + const response = await fetch("https://api.htl-braunau.at/data/json"); + 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); + } + }; + + fetchData(); + }, []); + + + const filteredData = data.filter(item => { + const matchesSearchQuery = Object.values(item).some(value => + value.toString().toLowerCase().includes(searchQuery.toLowerCase()) + ); + const itemDate = new Date(item.created_at); + const matchesDateRange = (!startDate || itemDate >= startDate) && (!endDate || itemDate <= endDate); + return matchesSearchQuery && matchesDateRange; + }); + + const sortedData = React.useMemo(() => { + let sortableData = [...filteredData]; + if (sortConfig.key !== null) { + sortableData.sort((a, b) => { + if (sortConfig.key !== null && a[sortConfig.key] < b[sortConfig.key]) { + return sortConfig.direction === 'ascending' ? -1 : 1; + } + if (sortConfig.key !== null && a[sortConfig.key] > b[sortConfig.key]) { + return sortConfig.direction === 'ascending' ? 1 : -1; + } + return 0; + }); + } + return sortableData; + }, [filteredData, sortConfig]); + + const requestSort = (key: keyof DataModel | null) => { + let direction: 'ascending' | 'descending' = 'ascending'; + if (sortConfig.key === key && sortConfig.direction === 'ascending') { + direction = 'descending'; + } else if (sortConfig.key === key && sortConfig.direction === 'descending') { + direction = 'ascending'; + } else { + direction = 'descending'; + } + setSortConfig({ key, direction }); + }; + + interface SortConfig { + key: keyof DataModel | null; + direction: 'ascending' | 'descending'; + } + + 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`; + }; + + const handleItemsPerPageChange = (event: React.ChangeEvent) => { + setItemsPerPage(Number(event.target.value)); + setCurrentPage(1); + }; + + const paginatedData = sortedData.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage); + + if (loading) return

Loading...

; + if (error) return

Error: {error}

; + + + return ( +
+

Created LXCs

+
+
+ setSearchQuery(e.target.value)} + className="p-2 border" + /> + +
+
+ setStartDate(date)} + selectsStart + startDate={startDate} + endDate={endDate} + placeholderText="Start date" + className="p-2 border" + /> + +
+ +
+ setEndDate(date)} + selectsEnd + startDate={startDate} + endDate={endDate} + placeholderText="End date" + className="p-2 border" + /> + +
+
+
+

{filteredData.length} results found

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + {paginatedData.map((item, index) => ( + + + + + + + + + + + + + + + + ))} + +
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('hn')}>Hostname requestSort('ssh')}>SSH requestSort('verbose')}>Verb requestSort('tags')}>Tags requestSort('method')}>Method requestSort('pve_version')}>PVE Version requestSort('created_at')}>Created At
{item.nsapp}{item.os_type}{item.os_version}{item.disk_size}{item.core_count}{item.ram_size}{item.hn}{item.ssh}{item.verbose}{item.tags.replace(/;/g, ' ')}{item.method}{item.pve_version}{formatDate(item.created_at)}
+
+
+
+ + Page {currentPage} + +
+
+ ); +}; + + + +export default DataFetcher; diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 8a5fbc14a..2b626f500 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -34,89 +34,88 @@ export default function Page() { }, [theme]); return ( -
- -
-
- - -
- -
- ❀️ - - Scripts by Tteck - - -
- - - - Thank You! - - A big thank you to Tteck, for your hard work over all of these years, - and also to the many other contributors to the project. - Your hard work is truly appreciated by the entire Proxmox community! - - - - - - - - -
+
+ +
+
+ + +
+ +
+ ❀️ + + 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 -

-

+

+

+ Make managing your Homelab a breeze +

+
This project aims to take the community-made Proxmox Helper Scripts, originally started by tteck, and port it to arm64.

@@ -129,22 +128,23 @@ export default function Page() { the process of creating and configuring Linux containers (LXC) and virtual machines (VMs) on Proxmox VE.

-
-
- - - -
-
-
-
- ); +
+
+
+ + + +
+
+
+
+ ); } diff --git a/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx b/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx index 1c418c94c..3713a165b 100644 --- a/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx +++ b/frontend/src/app/scripts/_components/ScriptInfoBlocks.tsx @@ -35,8 +35,18 @@ export function LatestScripts({ items }: { items: Category[] }) { const latestScripts = useMemo(() => { if (!items) return []; + const scripts = items.flatMap((category) => category.scripts || []); - return scripts.sort( + + // 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(), ); @@ -49,7 +59,7 @@ export function LatestScripts({ items }: { items: Category[] }) { const goToPreviousPage = () => { setPage((prevPage) => prevPage - 1); }; - + const startIndex = (page - 1) * ITEMS_PER_PAGE; const endIndex = page * ITEMS_PER_PAGE; @@ -90,7 +100,7 @@ export function LatestScripts({ items }: { items: Category[] }) { > -
+
{ const foundScripts = category.scripts.filter((script) => - mostPopularScripts.includes(script.name), + mostPopularScripts.includes(script.slug), ); return acc.concat(foundScripts); }, []); @@ -162,7 +172,7 @@ export function MostViewedScripts({ items }: { items: Category[] }) { > -
+
void; + items: Category[]; + selectedScript: string | null; + setSelectedScript: (script: string | null) => void; }) => { - return ( -
-
-

Categories

-

- {items.reduce((acc, category) => acc + category.scripts.length, 0)}{" "} - Total scripts -

-
-
- -
-
- ); + 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; +export default Sidebar; \ No newline at end of file diff --git a/frontend/src/components/Footer.tsx b/frontend/src/components/Footer.tsx index 38a93803c..56062d6fe 100644 --- a/frontend/src/components/Footer.tsx +++ b/frontend/src/components/Footer.tsx @@ -5,7 +5,7 @@ export default function Footer() { return (
-
+
Website built by the community. The source code is avaliable on{" "} -
-
- - logo - Proxmox ARM64 Helper-Scripts - -
- - - {navbarLinks.map(({ href, event, icon, text }) => ( - - - - - - - {text} - - - - ))} - -
-
-
- - ); + <> +
+
+ + logo + Proxmox ARM64 Helper-Scripts + +
+ + + {navbarLinks.map(({ href, event, icon, text, mobileHidden }) => ( + + + + + + + {text} + + + + ))} + +
+
+
+ + ); } export default Navbar; diff --git a/frontend/src/config/siteConfig.tsx b/frontend/src/config/siteConfig.tsx index 2e32cc7a5..4076d4650 100644 --- a/frontend/src/config/siteConfig.tsx +++ b/frontend/src/config/siteConfig.tsx @@ -1,7 +1,7 @@ import { OperatingSystem } from "@/lib/types"; import { MessagesSquare, Scroll } from "lucide-react"; -import { FaDiscord, FaGithub } from "react-icons/fa"; import React from "react"; +import { FaDiscord, FaGithub } from "react-icons/fa"; export const basePath = process.env.BASE_PATH; diff --git a/install/actualbudget-install.sh b/install/actualbudget-install.sh index f8ca7f61c..7cb40070d 100644 --- a/install/actualbudget-install.sh +++ b/install/actualbudget-install.sh @@ -18,9 +18,8 @@ $STD apt-get install -y \ curl \ sudo \ mc \ + tini \ gpg \ - git \ - jq \ build-essential \ wget \ openssh-server @@ -29,7 +28,7 @@ msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg -echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list +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" @@ -38,10 +37,12 @@ $STD apt-get install -y nodejs $STD npm install --global yarn msg_ok "Installed Node.js" -RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual-server/tags | jq --raw-output '.[0].name') -msg_info "Installing Actual Budget $RELEASE" -wget -q https://codeload.github.com/actualbudget/actual-server/legacy.tar.gz/refs/tags/${RELEASE} -O - | tar -xz -mv actualbudget-actual-server-* /opt/actualbudget +msg_info "Installing Actual Budget" +cd /opt +RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +wget -q https://github.com/actualbudget/actual-server/archive/refs/tags/v${RELEASE}.tar.gz +tar -xzf v${RELEASE}.tar.gz +mv *ctual-server-* /opt/actualbudget mkdir -p /opt/actualbudget/server-files mkdir -p /opt/actualbudget-data chown -R root:root /opt/actualbudget/server-files @@ -54,6 +55,7 @@ PORT=5006 EOF cd /opt/actualbudget $STD yarn install +echo "${RELEASE}" >"/opt/actualbudget_version.txt" msg_ok "Installed Actual Budget" msg_info "Creating Service" @@ -82,6 +84,7 @@ motd_ssh customize msg_info "Cleaning up" +rm -rf /opt/v${RELEASE}.tar.gz $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/bazarr-install.sh b/install/bazarr-install.sh index 7ae07552e..a05dde468 100644 --- a/install/bazarr-install.sh +++ b/install/bazarr-install.sh @@ -21,13 +21,13 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-pip rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing Bazarr" mkdir -p /var/lib/bazarr/ diff --git a/install/beszel-install.sh b/install/beszel-install.sh new file mode 100644 index 000000000..378570cf6 --- /dev/null +++ b/install/beszel-install.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Michelle Zitzerman (Sinofage) +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + tar \ + sudo \ + mc +msg_ok "Installed Dependencies" + +msg_info "Installing Beszel" +mkdir -p /opt/beszel +curl -sL "https://github.com/henrygd/beszel/releases/latest/download/beszel_$(uname -s)_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/armv6l/arm/' -e 's/armv7l/arm/' -e 's/aarch64/arm64/').tar.gz" | tar -xz -O beszel | tee /opt/beszel/beszel >/dev/null +chmod +x /opt/beszel/beszel +msg_ok "Installed Beszel" + +msg_info "Creating Service" +cat </etc/systemd/system/beszel-hub.service +[Unit] +Description=Beszel Hub Service +After=network.target + +[Service] +ExecStart=/opt/beszel/beszel serve --http "0.0.0.0:8090" +WorkingDirectory=/opt/beszel +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now beszel-hub.service +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" \ No newline at end of file diff --git a/install/caddy-install.sh b/install/caddy-install.sh index 5f1b6da3e..113485c96 100644 --- a/install/caddy-install.sh +++ b/install/caddy-install.sh @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2024 tteck -# Author: tteck (tteckster) -# License: MIT -# https://github.com/tteck/Proxmox/raw/main/LICENSE +# Copyright (c) 2021-2025 tteck +# Author: tteck (tteckster) | Co-Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" color @@ -14,7 +13,16 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y {debian-keyring,debian-archive-keyring,apt-transport-https,gpg,curl,sudo,mc,wget,openssh-server} +$STD apt-get install -y \ + debian-keyring \ + debian-archive-keyring \ + apt-transport-https \ + gpg \ + curl \ + sudo \ + mc \ + wget \ + openssh-server msg_ok "Installed Dependencies" msg_info "Installing Caddy" @@ -24,6 +32,29 @@ $STD apt-get update $STD apt-get install -y caddy msg_ok "Installed Caddy" +read -r -p "Would you like to install xCaddy Addon? " prompt +if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then + msg_info "Installing Golang" + cd /opt + set +o pipefail + GOLANG=$(curl -s https://go.dev/dl/ | grep -o "go.*\linux-amd64.tar.gz" | head -n 1) + wget -q https://golang.org/dl/$GOLANG + tar -xzf $GOLANG -C /usr/local + ln -s /usr/local/go/bin/go /usr/local/bin/go + set -o pipefail + rm -rf /opt/go* + msg_ok "Installed Golang" + + msg_info "Setup xCaddy" + cd /opt + RELEASE=$(curl -s https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + wget -q https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${RELEASE:1}_linux_amd64.deb + $STD dpkg -i xcaddy_${RELEASE:1}_linux_amd64.deb + rm -rf /opt/xcaddy* + $STD xcaddy build + msg_ok "Setup xCaddy" +fi + motd_ssh customize diff --git a/install/calibre-web-install.sh b/install/calibre-web-install.sh index 21e214a98..05d25b02d 100644 --- a/install/calibre-web-install.sh +++ b/install/calibre-web-install.sh @@ -37,6 +37,7 @@ msg_ok "Installed Kepubify" msg_info "Installing Calibre-Web" mkdir -p /opt/calibre-web +$STD apt-get install -y calibre $STD wget https://github.com/janeczku/calibre-web/raw/master/library/metadata.db -P /opt/calibre-web $STD pip install calibreweb $STD pip install jsonschema diff --git a/install/changedetection-install.sh b/install/changedetection-install.sh index c34132d8e..c9a4e8042 100644 --- a/install/changedetection-install.sh +++ b/install/changedetection-install.sh @@ -49,13 +49,13 @@ $STD apt-get install -y \ openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-pip rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Setting up Node.js Repository" mkdir -p /etc/apt/keyrings diff --git a/install/deluge-install.sh b/install/deluge-install.sh index 271af84d9..704502069 100644 --- a/install/deluge-install.sh +++ b/install/deluge-install.sh @@ -21,13 +21,13 @@ $STD apt-get install -y python3-libtorrent $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-pip rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing Deluge" $STD pip install deluge[all] diff --git a/install/esphome-install.sh b/install/esphome-install.sh index b3068ae57..b519c33f2 100644 --- a/install/esphome-install.sh +++ b/install/esphome-install.sh @@ -22,14 +22,14 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-pip \ python3-venv rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing ESPHome" mkdir /root/config diff --git a/install/frigate-install.sh b/install/frigate-install.sh index 722c05b61..67e4c331e 100644 --- a/install/frigate-install.sh +++ b/install/frigate-install.sh @@ -18,11 +18,11 @@ msg_info "Installing Dependencies (Patience)" $STD apt-get install -y {curl,sudo,mc,git,gpg,automake,build-essential,xz-utils,libtool,ccache,pkg-config,libgtk-3-dev,libavcodec-dev,libavformat-dev,libswscale-dev,libv4l-dev,libxvidcore-dev,libx264-dev,libjpeg-dev,libpng-dev,libtiff-dev,gfortran,openexr,libatlas-base-dev,libssl-dev,libtbb2,libtbb-dev,libdc1394-22-dev,libopenexr-dev,libgstreamer-plugins-base1.0-dev,libgstreamer1.0-dev,gcc,gfortran,libopenblas-dev,liblapack-dev,libusb-1.0-0-dev,jq,moreutils,wget,openssh-server,ca-certificates} msg_ok "Installed Dependencies" -msg_info "Installing Python3 Dependencies" +msg_info "Setup Python3" $STD apt-get install -y {python3,python3-dev,python3-setuptools,python3-distutils,python3-pip} rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED $STD pip install --upgrade pip -msg_ok "Installed Python3 Dependencies" +msg_ok "Setup Python3" msg_info "Installing Node.js" mkdir -p /etc/apt/keyrings diff --git a/install/homarr-install.sh b/install/homarr-install.sh index c4d206f97..20c6278cf 100644 --- a/install/homarr-install.sh +++ b/install/homarr-install.sh @@ -1,10 +1,8 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2025 tteck -# Author: tteck (tteckster) -# Co-Author: MickLesk (Canbiz) -# License: MIT -# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# 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/ajnart/homarr source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" @@ -20,6 +18,7 @@ $STD apt-get install -y \ sudo \ mc \ curl \ + redis-server \ ca-certificates \ gnupg \ make \ @@ -32,32 +31,40 @@ msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg -echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list +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/Yarn" +msg_info "Installing Node.js/pnpm" $STD apt-get update $STD apt-get install -y nodejs -$STD npm install -g yarn -msg_ok "Installed Node.js/Yarn" +$STD npm install -g pnpm@latest +msg_ok "Installed Node.js/pnpm" msg_info "Installing Homarr (Patience)" -RELEASE=$(curl -s https://api.github.com/repos/ajnart/homarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -wget -q "https://github.com/ajnart/homarr/archive/refs/tags/v${RELEASE}.zip" +cd /opt +RELEASE=$(curl -s https://api.github.com/repos/homarr-labs/homarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +wget -q "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip" unzip -q v${RELEASE}.zip -rm -rf v${RELEASE}.zip mv homarr-${RELEASE} /opt/homarr +mkdir -p /opt/homarr_db +touch /opt/homarr_db/db.sqlite +AUTH_SECRET="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)" +SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)" + cat </opt/homarr/.env -DATABASE_URL="file:./database/db.sqlite" -NEXTAUTH_URL="http://localhost:3000" -NEXTAUTH_SECRET="$(openssl rand -base64 32)" -NEXT_PUBLIC_DISABLE_ANALYTICS="true" -DEFAULT_COLOR_SCHEME="dark" +AUTH_SECRET='${AUTH_SECRET}' +DB_DRIVER='better-sqlite3' +SECRET_ENCRYPTION_KEY='${SECRET_ENCRYPTION_KEY}' +DB_URL='/opt/homarr_db/db.sqlite' +TURBO_TELEMETRY_DISABLED=1 EOF + cd /opt/homarr -$STD yarn install -$STD yarn build -$STD yarn db:migrate +$STD pnpm install +$STD pnpm run db:migration:sqlite:run +$STD pnpm build +mkdir build +cp ./node_modules/better-sqlite3/build/Release/better_sqlite3.node ./build/better_sqlite3.node echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed Homarr" @@ -71,18 +78,19 @@ After=network.target Type=exec WorkingDirectory=/opt/homarr EnvironmentFile=-/opt/homarr/.env -ExecStart=/usr/bin/yarn start +ExecStart=/usr/bin/pnpm start [Install] WantedBy=multi-user.target EOF -systemctl enable -q --now homarr.service +systemctl enable -q --now homarr msg_ok "Created Service" motd_ssh customize msg_info "Cleaning up" +rm -rf /opt/v${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/homeassistant-core-install.sh b/install/homeassistant-core-install.sh index 5c75b0f91..1bf8805bf 100644 --- a/install/homeassistant-core-install.sh +++ b/install/homeassistant-core-install.sh @@ -51,7 +51,7 @@ $STD apt-get install -y \ openssh-server msg_ok "Installed Dependencies" -msg_info "Setup Python3/pip" +msg_info "Setup Python3" $STD apt-get update $STD rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED $STD apt-get remove --purge -y python3.12 python3.12-dev python3.12-venv diff --git a/install/homeassistant-install.sh b/install/homeassistant-install.sh index a8a2fd736..47c2f8428 100644 --- a/install/homeassistant-install.sh +++ b/install/homeassistant-install.sh @@ -21,14 +21,14 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-pip \ python3-venv rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing runlike" $STD pip install runlike diff --git a/install/jellyfin-install.sh b/install/jellyfin-install.sh index 031ca1b44..17d81ea3f 100644 --- a/install/jellyfin-install.sh +++ b/install/jellyfin-install.sh @@ -53,6 +53,7 @@ EOF # Install Jellyfin using the metapackage (which will fetch jellyfin-server, jellyfin-web, and jellyfin-ffmpeg5) $STD apt-get update $STD apt-get install -y jellyfin +sed -i 's/"MinimumLevel": "Information"/"MinimumLevel": "Error"/g' /etc/jellyfin/logging.json chown -R jellyfin:adm /etc/jellyfin sleep 10 systemctl restart jellyfin diff --git a/install/kimai-install.sh b/install/kimai-install.sh index 266675bc0..2a31aa06f 100644 --- a/install/kimai-install.sh +++ b/install/kimai-install.sh @@ -24,12 +24,27 @@ $STD apt-get install -y \ expect \ composer \ mariadb-server \ - libapache2-mod-php \ - php8.2-{mbstring,gd,intl,pdo,mysql,tokenizer,zip,xml} \ + lsb-release \ wget \ openssh-server msg_ok "Installed Dependencies" +msg_info "Setup PHP8.4 Repository" +$STD curl -sSLo /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 +msg_ok "Setup PHP8.4 Repository" + +msg_info "Setup PHP" +$STD apt-get remove -y php8.2* +#$STD apt-get remove -y php8.3* +$STD apt-get install -y \ + php8.3 \ + php8.3-{mbstring,gd,intl,common,mysql,zip,xml} \ + libapache2-mod-php8.3 +msg_info "Setup PHP" + msg_info "Setting up database" DB_NAME=kimai_db DB_USER=kimai @@ -74,6 +89,7 @@ send "helper-scripts.com\r" expect eof EOF +$STD composer update --no-interaction echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed Kimai" diff --git a/install/monica-install.sh b/install/monica-install.sh new file mode 100644 index 000000000..586bb7c53 --- /dev/null +++ b/install/monica-install.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + sudo \ + mc \ + gnupg2\ + mariadb-server \ + apache2 \ + libapache2-mod-php \ + php-{bcmath,curl,dom,gd,gmp,iconv,intl,json,mbstring,mysqli,opcache,pdo-mysql,redis,tokenizer,xml,zip} \ + composer +msg_ok "Installed Dependencies" + +msg_info "Setting up MariaDB" +DB_NAME=monica +DB_USER=monica +DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) +$STD mysql -u root -e "CREATE DATABASE $DB_NAME;" +$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');" +$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;" +{ + echo "monica-Credentials" + echo "monica Database User: $DB_USER" + echo "monica Database Password: $DB_PASS" + echo "monica Database Name: $DB_NAME" +} >> ~/monica.creds +msg_ok "Set up MariaDB" + +msg_info "Setting up Node.js/Yarn" +mkdir -p /etc/apt/keyrings +curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg +echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list +$STD apt-get update +$STD apt-get install -y nodejs +$STD npm install -g npm@latest +$STD npm install -g yarn +msg_ok "Installed Node.js/Yarn" + +msg_info "Installing monica" +RELEASE=$(curl -s https://api.github.com/repos/monicahq/monica/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +cd /opt +wget -q "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 /opt/monica/.env.example /opt/monica/.env +HASH_SALT=$(openssl rand -base64 32) +sed -i -e "s|^DB_USERNAME=.*|DB_USERNAME=${DB_USER}|" \ + -e "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" \ + -e "s|^HASH_SALT=.*|HASH_SALT=${HASH_SALT}|" \ + /opt/monica/.env +$STD composer install --no-dev -o --no-interaction +$STD yarn install +$STD yarn run production +$STD php artisan key:generate +$STD php artisan setup:production --email=admin@helper-scripts.com --password=helper-scripts.com --force +chown -R www-data:www-data /opt/monica +chmod -R 775 /opt/monica/storage +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Installed monica" + +msg_info "Creating Service" +cat </etc/apache2/sites-available/monica.conf + + ServerName monica + DocumentRoot /opt/monica/public + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog /var/log/apache2/monica_error.log + CustomLog /var/log/apache2/monica_access.log combined + +EOF +$STD a2ensite monica +$STD a2enmod rewrite +$STD a2dissite 000-default.conf +$STD systemctl reload apache2 +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -rf "/opt/monica-v${RELEASE}.tar.bz2" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/motioneye-install.sh b/install/motioneye-install.sh index bc297b1cb..0b107a0dd 100644 --- a/install/motioneye-install.sh +++ b/install/motioneye-install.sh @@ -23,13 +23,13 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-pip rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing Motion" $STD apt-get install -y motion diff --git a/install/mylar3-install.sh b/install/mylar3-install.sh index 7687deeac..2faa4674c 100644 --- a/install/mylar3-install.sh +++ b/install/mylar3-install.sh @@ -28,11 +28,11 @@ $STD apt-get install -y unrar rm /etc/apt/sources.list.d/non-free.list msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y python3-pip rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED $STD pip install -U --no-cache-dir pip -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing ${APPLICATION}" mkdir -p /opt/mylar3 diff --git a/install/nodebb-install.sh b/install/nodebb-install.sh new file mode 100644 index 000000000..a7a5008e1 --- /dev/null +++ b/install/nodebb-install.sh @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2024 tteck +# Author: MickLesk (Canbiz) +# License: MIT | https://github.com/tteck/Proxmox/raw/main/LICENSE +# Source: https://github.com/NodeBB/NodeBB + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies (Patience)" +$STD apt-get install -y \ + build-essential \ + curl \ + sudo \ + make \ + redis-server \ + expect \ + gnupg \ + ca-certificates \ + mc +msg_ok "Installed Dependencies" + +msg_info "Setting up Node.js & MongoDB 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 + +curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | gpg --dearmor -o /etc/apt/keyrings/mongodb-server-8.0.gpg +echo "deb [arch=amd64,arm64 signed-by=/etc/apt/keyrings/mongodb-server-8.0.gpg] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-8.0.list +$STD apt-get update +msg_ok "Set up Repositories" + +msg_info "Installing Node.js" +$STD apt-get install -y nodejs +msg_ok "Installed Node.js" + +msg_info "Installing MongoDB" +$STD apt-get install -y mongodb-org +systemctl enable -q --now mongod +sleep 10 # MongoDB needs some secounds to start, if not sleep it collide with following mongosh +msg_ok "Installed MongoDB" + +msg_info "Configure MongoDB" +MONGO_ADMIN_USER="admin" +MONGO_ADMIN_PWD="$(openssl rand -base64 18 | cut -c1-13)" +NODEBB_USER="nodebb" +NODEBB_PWD="$(openssl rand -base64 18 | cut -c1-13)" +MONGO_CONNECTION_STRING="mongodb://${NODEBB_USER}:${NODEBB_PWD}@localhost:27017/nodebb" +NODEBB_SECRET=$(uuidgen) +{ + echo "NodeBB-Credentials" + echo "Mongo Database User: $MONGO_ADMIN_USER" + echo "Mongo Database Password: $MONGO_ADMIN_PWD" + echo "NodeBB User: $NODEBB_USER" + echo "NodeBB Password: $NODEBB_PWD" + echo "NodeBB Secret: $NODEBB_SECRET" +} >> ~/nodebb.creds + +$STD mongosh <> /etc/mongod.conf' +systemctl restart mongod +msg_ok "MongoDB successfully configurated" + +msg_info "Install NodeBB" +cd /opt +RELEASE=$(curl -s https://api.github.com/repos/NodeBB/NodeBB/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +wget -q "https://github.com/NodeBB/NodeBB/archive/refs/tags/v${RELEASE}.zip" +unzip -q v${RELEASE}.zip +mv NodeBB-${RELEASE} /opt/nodebb +cd /opt/nodebb +touch pidfile +expect < /dev/null 2>&1 +log_file /dev/null +set timeout -1 + +spawn ./nodebb setup +expect "URL used to access this NodeBB" { + send "http://localhost:4567\r" +} +expect "Please enter a NodeBB secret" { + send "$NODEBB_SECRET\r" +} +expect "Would you like to submit anonymous plugin usage to nbbpm? (yes)" { + send "no\r" +} +expect "Which database to use (mongo)" { + send "mongo\r" +} +expect "Format: mongodb://*" { + send "$MONGO_CONNECTION_STRING\r" +} +expect "Administrator username" { + send "helper-scripts\r" +} +expect "Administrator email address" { + send "helper-scripts@local.com\r" +} +expect "Password" { + send "helper-scripts\r" +} +expect "Confirm Password" { + send "helper-scripts\r" +} +expect eof +EOF +echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" +msg_ok "Installed NodeBB" + +msg_info "Creating Services" +cat </etc/systemd/system/nodebb.service +[Unit] +Description=NodeBB +Documentation=https://docs.nodebb.org +After=system.slice multi-user.target mongod.service + +[Service] +Type=forking +User=root + +WorkingDirectory=/opt/nodebb +PIDFile=/opt/nodebb/pidfile +ExecStart=/usr/bin/node /opt/nodebb/loader.js +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now nodebb +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -R /opt/v${RELEASE}.zip +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" \ No newline at end of file diff --git a/install/octoprint-install.sh b/install/octoprint-install.sh index ede7d9eb5..7ad48f165 100644 --- a/install/octoprint-install.sh +++ b/install/octoprint-install.sh @@ -24,7 +24,7 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ @@ -33,7 +33,7 @@ $STD apt-get install -y \ $STD apt-get install -y python3-setuptools rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Creating user octoprint" useradd -m -s /bin/bash -p $(openssl passwd -1 octoprint) octoprint diff --git a/install/openhab-install.sh b/install/openhab-install.sh index dcab412f1..4c5dfd60a 100644 --- a/install/openhab-install.sh +++ b/install/openhab-install.sh @@ -23,13 +23,13 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Installing Azul Zulu" +msg_info "Installing Azul Zulu21" wget -qO /etc/apt/trusted.gpg.d/zulu-repo.asc "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9" wget -q https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb $STD dpkg -i zulu-repo_1.0.0-3_all.deb $STD apt-get update -$STD apt-get -y install zulu17-jdk -msg_ok "Installed Azul Zulu" +$STD apt-get -y install zulu21-jdk +msg_ok "Installed Azul Zulu21" msg_info "Installing openHAB" curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor >openhab.gpg diff --git a/install/paperless-ngx-install.sh b/install/paperless-ngx-install.sh index a70d5b232..0545b98c7 100644 --- a/install/paperless-ngx-install.sh +++ b/install/paperless-ngx-install.sh @@ -14,7 +14,7 @@ network_check update_os msg_info "Installing Dependencies (Patience)" -$STD apt-get install -y --no-install-recommends \ +$STD apt-get install -y \ redis \ postgresql \ build-essential \ @@ -43,7 +43,7 @@ $STD apt-get install -y --no-install-recommends \ msg_ok "Installed Dependencies" msg_info "Installing Python3 Dependencies (Patience)" -$STD apt-get install -y --no-install-recommends \ +$STD apt-get install -y \ python3 \ python3-pip \ python3-dev \ @@ -52,7 +52,7 @@ $STD apt-get install -y --no-install-recommends \ msg_ok "Installed Python3 Dependencies" msg_info "Installing OCR Dependencies (Patience)" -$STD apt-get install -y --no-install-recommends \ +$STD apt-get install -y \ unpaper \ icc-profiles-free \ qpdf \ @@ -62,7 +62,7 @@ $STD apt-get install -y --no-install-recommends \ zlib1g \ tesseract-ocr \ tesseract-ocr-eng - + cd /tmp wget -q https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz $STD tar -xzf ghostscript-10.04.0.tar.gz @@ -199,6 +199,7 @@ Requires=redis.service [Service] WorkingDirectory=/opt/paperless/src +ExecStartPre=/bin/sleep 2 ExecStart=python3 manage.py document_consumer [Install] @@ -223,7 +224,7 @@ EOF sed -i -e 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/' /etc/ImageMagick-6/policy.xml systemctl daemon-reload -$STD systemctl enable --now paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service +$STD systemctl enable -q --now paperless-webserver paperless-scheduler paperless-task-queue paperless-consumer msg_ok "Created Services" motd_ssh diff --git a/install/photoprism-install.sh b/install/photoprism-install.sh index 38d1559e7..8b6069a8b 100644 --- a/install/photoprism-install.sh +++ b/install/photoprism-install.sh @@ -14,35 +14,37 @@ network_check update_os msg_info "Installing Dependencies (Patience)" -$STD apt-get install -y curl -$STD apt-get install -y sudo -$STD apt-get install -y mc -$STD apt-get install -y exiftool -$STD apt-get install -y ffmpeg -$STD apt-get install -y libheif1 -$STD apt-get install -y libpng-dev -$STD apt-get install -y libjpeg-dev -$STD apt-get install -y libtiff-dev -$STD apt-get install -y imagemagick -$STD apt-get install -y darktable -$STD apt-get install -y rawtherapee -$STD apt-get install -y libvips42 -$STD apt-get install -y wget -$STD apt-get install -y openssh-server +$STD apt-get install -y \ + curl \ + sudo \ + mc \ + exiftool \ + ffmpeg \ + libheif1 \ + libpng-dev \ + libjpeg-dev \ + libtiff-dev \ + imagemagick \ + darktable \ + rawtherapee \ + libvips42 \ + lsb-release \ + wget \ + openssh-server echo 'export PATH=/usr/local:$PATH' >>~/.bashrc export PATH=/usr/local:$PATH msg_ok "Installed Dependencies" msg_info "Installing PhotoPrism (Patience)" -mkdir -p /opt/photoprism/{cache,config,photos/originals,photos/import,storage,temp} +mkdir -p /opt/photoprism/{cache,config,photos,storage,temp} +mkdir -p /opt/photoprism/photos/{originals,import} +mkdir -p /opt/photoprism_backups wget -q -cO - https://dl.photoprism.app/pkg/linux/arm64.tar.gz | tar -xz -C /opt/photoprism --strip-components=1 -if [[ ${PCT_OSTYPE} == "ubuntu" ]]; then - wget -q -cO - https://dl.photoprism.app/dist/libheif/libheif-jammy-arm64-v1.17.1.tar.gz | tar -xzf - -C /usr/local --strip-components=1 -else - wget -q -cO - https://dl.photoprism.app/dist/libheif/libheif-bookworm-arm64-v1.17.1.tar.gz | tar -xzf - -C /usr/local --strip-components=1 -fi +LIBHEIF_URL=$(wget -q -O - "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-$(lsb_release -cs)-arm64-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1) +wget -q -cO - "https://dl.photoprism.app/dist/libheif/$LIBHEIF_URL" | tar -xzf - -C /usr/local --strip-components=1 ldconfig +chmod -R 755 /opt/photoprism/photos/originals cat </opt/photoprism/config/.env PHOTOPRISM_AUTH_MODE='password' PHOTOPRISM_ADMIN_PASSWORD='helper-scripts.com' @@ -52,6 +54,14 @@ PHOTOPRISM_SITE_CAPTION='https://tteck.github.io/Proxmox/' PHOTOPRISM_STORAGE_PATH='/opt/photoprism/storage' PHOTOPRISM_ORIGINALS_PATH='/opt/photoprism/photos/originals' PHOTOPRISM_IMPORT_PATH='/opt/photoprism/photos/import' +PHOTOPRISM_BACKUP_PATH='/opt/photoprism_backups' +PHOTOPRISM_DATABASE_DRIVER='sqlite' +PHOTOPRISM_DISABLE_WEBDAV='false' +PHOTOPRISM_DISABLE_FACES='false' +PHOTOPRISM_AUTO_INDEX='300' +PHOTOPRISM_AUTO_IMPORT='-1' +PHOTOPRISM_PUBLIC='false' +PHOTOPRISM_DEBUG='false' EOF ln -sf /opt/photoprism/bin/photoprism /usr/local/bin/photoprism msg_ok "Installed PhotoPrism" diff --git a/install/pingvin-install.sh b/install/pingvin-install.sh index b6cfa583b..befeabceb 100644 --- a/install/pingvin-install.sh +++ b/install/pingvin-install.sh @@ -2,6 +2,7 @@ # Copyright (c) 2021-2024 tteck # Author: tteck (tteckster) +# Co-Author: michelroegl-brunner # License: MIT # https://github.com/tteck/Proxmox/raw/main/LICENSE @@ -14,13 +15,14 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y curl -$STD apt-get install -y sudo -$STD apt-get install -y mc -$STD apt-get install -y git -$STD apt-get install -y gnupg -$STD apt-get install -y wget -$STD apt-get install -y openssh-server +$STD apt-get install -y \ + curl \ + sudo \ + mc \ + git \ + gnupg \ + wget \ + openssh-server msg_ok "Installed Dependencies" msg_info "Setting up Node.js Repository" @@ -36,11 +38,14 @@ $STD npm install pm2 -g msg_ok "Installed Node.js" msg_info "Installing Pingvin Share (Patience)" -git clone -q https://github.com/stonith404/pingvin-share /opt/pingvin-share -cd /opt/pingvin-share -$STD git fetch --tags -$STD git checkout $(git describe --tags `git rev-list --tags --max-count=1`) -cd backend +cd /opt +RELEASE=$(curl -s https://api.github.com/repos/stonith404/pingvin-share/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" +wget -q "https://github.com/stonith404/pingvin-share/archive/refs/tags/v${RELEASE}.zip" +unzip -q v${RELEASE}.zip +echo "${RELEASE}" >"/opt/pingvin_version.txt" +mv pingvin-share-${RELEASE} /opt/pingvin-share +cd /opt/pingvin-share/backend $STD npm install $STD npm run build $STD pm2 start --name="pingvin-share-backend" npm -- run prod @@ -59,6 +64,7 @@ motd_ssh customize msg_info "Cleaning up" +rm -rf /opt/v${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/pocketid-install.sh b/install/pocketid-install.sh new file mode 100644 index 000000000..c330ad365 --- /dev/null +++ b/install/pocketid-install.sh @@ -0,0 +1,130 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Snarkenfaugister +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/stonith404/pocket-id + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + sudo \ + mc \ + gpg \ + caddy \ + gcc +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 Golang" +cd /tmp +set +o pipefail +GO_RELEASE=$(curl -s https://go.dev/dl/ | grep -o -m 1 "go.*\linux-amd64.tar.gz") +wget -q https://golang.org/dl/${GO_RELEASE} +tar -xzf ${GO_RELEASE} -C /usr/local +ln -s /usr/local/go/bin/go /usr/bin/go +set -o pipefail +msg_ok "Installed Golang" + +read -r -p "What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url +msg_info "Setup Pocket ID" +cd /opt +RELEASE=$(curl -s https://api.github.com/repos/stonith404/pocket-id/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +wget -q "https://github.com/stonith404/pocket-id/archive/refs/tags/v${RELEASE}.zip" +unzip -q v${RELEASE}.zip +mv pocket-id-${RELEASE}/ /opt/pocket-id + +cd /opt/pocket-id/backend +cp .env.example .env +sed -i "s/PUBLIC_APP_URL=http:\/\/localhost/PUBLIC_APP_URL=https:\/\/${public_url}/" .env +cd cmd +CGO_ENABLED=1 +GOOS=linux +$STD go build -o ../pocket-id-backend + +cd ../../frontend +cp .env.example .env +sed -i "s/PUBLIC_APP_URL=http:\/\/localhost/PUBLIC_APP_URL=https:\/\/${public_url}/" .env +$STD npm install +$STD npm run build + +cd .. +cp reverse-proxy/Caddyfile /etc/caddy/Caddyfile +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Setup Pocket ID" + +msg_info "Creating Service" +cat </etc/systemd/system/pocketid-backend.service +[Unit] +Description=Pocket ID Backend +After=network.target + +[Service] +Type=simple +User=root +Group=root +WorkingDirectory=/opt/pocket-id/backend +EnvironmentFile=/opt/pocket-id/backend/.env +ExecStart=/opt/pocket-id/backend/pocket-id-backend +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/pocketid-frontend.service +[Unit] +Description=Pocket ID Frontend +After=network.target + +[Service] +Type=simple +User=root +Group=root +WorkingDirectory=/opt/pocket-id/frontend +EnvironmentFile=/opt/pocket-id/frontend/.env +ExecStart=/usr/bin/node build/index.js +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF +msg_ok "Created Service" + +msg_info "Starting Services" +systemctl enable -q --now pocketid-backend +systemctl enable -q --now pocketid-frontend +systemctl restart caddy +msg_ok "Started Services" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f /opt/v${RELEASE}.zip +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" + +motd_ssh +customize diff --git a/install/projectsend-install.sh b/install/projectsend-install.sh new file mode 100644 index 000000000..e6f11732d --- /dev/null +++ b/install/projectsend-install.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + sudo \ + mc \ + mariadb-server \ + apache2 \ + libapache2-mod-php \ + php8.2-{pdo,mysql,mbstring,gettext,fileinfo,gd,xml,zip} +msg_ok "Installed Dependencies" + +msg_info "Setting up MariaDB" +DB_NAME=projectsend +DB_USER=projectsend +DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) +$STD mysql -u root -e "CREATE DATABASE $DB_NAME;" +$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');" +$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;" +{ + echo "projectsend-Credentials" + echo "projectsend Database User: $DB_USER" + echo "projectsend Database Password: $DB_PASS" + echo "projectsend Database Name: $DB_NAME" +} >> ~/projectsend.creds +msg_ok "Set up MariaDB" + +msg_info "Installing projectsend" +RELEASE=$(curl -s https://api.github.com/repos/projectsend/projectsend/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +cd /opt +wget -q "https://github.com/projectsend/projectsend/releases/download/r${RELEASE}/projectsend-r${RELEASE}.zip" +mkdir projectsend +unzip -q "projectsend-r${RELEASE}.zip" -d projectsend +mv /opt/projectsend/includes/sys.config.sample.php /opt/projectsend/includes/sys.config.php +chown -R www-data:www-data /opt/projectsend +chmod -R 775 /opt/projectsend +chmod 644 /opt/projectsend/includes/sys.config.php +sed -i -e "s/\(define('DB_NAME', \).*/\1'$DB_NAME');/" \ + -e "s/\(define('DB_USER', \).*/\1'$DB_USER');/" \ + -e "s/\(define('DB_PASSWORD', \).*/\1'$DB_PASS');/" \ + /opt/projectsend/includes/sys.config.php +sed -i -e "s/^\(memory_limit = \).*/\1 256M/" \ + -e "s/^\(post_max_size = \).*/\1 256M/" \ + -e "s/^\(upload_max_filesize = \).*/\1 256M/" \ + -e "s/^\(max_execution_time = \).*/\1 300/" \ + /etc/php/8.2/apache2/php.ini +echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +msg_ok "Installed projectsend" + +msg_info "Creating Service" +cat </etc/apache2/sites-available/projectsend.conf + + ServerName projectsend + DocumentRoot /opt/projectsend + + Options FollowSymLinks + AllowOverride All + Require all granted + + + ErrorLog /var/log/apache2/projectsend_error.log + CustomLog /var/log/apache2/projectsend_access.log combined + +EOF +$STD a2ensite projectsend +$STD a2enmod rewrite +$STD a2dissite 000-default.conf +$STD systemctl reload apache2 +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -rf "/opt/projectsend-r${RELEASE}.zip" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/prometheus-pve-exporter-install.sh b/install/prometheus-pve-exporter-install.sh new file mode 100644 index 000000000..a1e3c8918 --- /dev/null +++ b/install/prometheus-pve-exporter-install.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +# 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 + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + sudo \ + mc +msg_ok "Installed Dependencies" + +msg_info "Setup Python3" +$STD apt-get install -y \ + python3 \ + python3-pip +rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED +msg_ok "Setup Python3" + +msg_info "Installing Prometheus Proxmox VE Exporter" +python3 -m pip install --quiet --root-user-action=ignore prometheus-pve-exporter +mkdir -p /opt/prometheus-pve-exporter +cat < /opt/prometheus-pve-exporter/pve.yml +default: + user: prometheus@pve + password: sEcr3T! + verify_ssl: false +EOF +msg_ok "Installed Prometheus Proxmox VE Exporter" + +msg_info "Creating Service" +cat </etc/systemd/system/prometheus-pve-exporter.service +[Unit] +Description=Prometheus Proxmox VE Exporter +Documentation=https://github.com/znerol/prometheus-pve-exporter +After=syslog.target network.target + +[Service] +User=root +Restart=always +Type=simple +ExecStart=pve_exporter \ + --config.file=/opt/prometheus-pve-exporter/pve.yml \ + --web.listen-address=0.0.0.0:9221 +ExecReload=/bin/kill -HUP \$MAINPID + +[Install] +WantedBy=multi-user.target +EOF + +systemctl enable -q --now prometheus-pve-exporter +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/sabnzbd-install.sh b/install/sabnzbd-install.sh index ad4bc475b..d0c6c8a68 100644 --- a/install/sabnzbd-install.sh +++ b/install/sabnzbd-install.sh @@ -29,13 +29,13 @@ $STD apt-get install -y unrar rm /etc/apt/sources.list.d/non-free.list msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3-dev \ python3-pip $STD apt-get install -y python3-setuptools rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing SABnzbd" RELEASE=$(curl -s https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') diff --git a/install/sqlserver2022-install.sh b/install/sqlserver2022-install.sh new file mode 100644 index 000000000..7e06fe03d --- /dev/null +++ b/install/sqlserver2022-install.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Kristian Skov +# License: MIT +# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt install -y \ + curl \ + mc \ + sudo \ + gpg \ + coreutils +msg_ok "Installed Dependencies" + +msg_info "Setup SQL Server 2022" +$STD curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg +$STD curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc +$STD curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | tee /etc/apt/sources.list.d/mssql-server-2022.list +$STD apt-get clean * +$STD apt-get update -y +$STD apt-get install -y mssql-server +msg_ok "Setup Server 2022" + +msg_info "Installing SQL Server Tools" +export DEBIAN_FRONTEND=noninteractive +export ACCEPT_EULA=Y +curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc +curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | tee /etc/apt/sources.list.d/mssql-release.list +$STD apt-get update +$STD apt-get install -y -qq \ + mssql-tools18 \ + unixodbc-dev +echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile +source ~/.bash_profile +msg_ok "Installed SQL Server Tools" + +read -r -p "Do you want to run the SQL server setup now? (Later is also possible) " prompt +if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then + /opt/mssql/bin/mssql-conf setup +else + msg_ok "Skipping SQL Server setup. You can run it later with '/opt/mssql/bin/mssql-conf setup'." +fi + +msg_info "Start Service" +systemctl enable -q --now mssql-server +msg_ok "Service started" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/tandoor-install.sh b/install/tandoor-install.sh index ae5fbbffd..8ccd813fc 100644 --- a/install/tandoor-install.sh +++ b/install/tandoor-install.sh @@ -34,14 +34,14 @@ $STD apt-get install -y --no-install-recommends \ openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-setuptools \ python3-pip rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Setting up Node.js Repository" mkdir -p /etc/apt/keyrings diff --git a/install/tautulli-install.sh b/install/tautulli-install.sh index 945b7a4df..1184e93fb 100644 --- a/install/tautulli-install.sh +++ b/install/tautulli-install.sh @@ -23,13 +23,13 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-pip rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing Tautulli" cd /opt diff --git a/install/teddycloud-install.sh b/install/teddycloud-install.sh index 75c04b12d..533ff7a83 100644 --- a/install/teddycloud-install.sh +++ b/install/teddycloud-install.sh @@ -32,6 +32,7 @@ VERSION="${RELEASE#tc_v}" wget -q "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip" unzip -q -d "/opt/teddycloud-${VERSION}" "teddycloud.amd64.release_v${VERSION}.zip" ln -fns "/opt/teddycloud-${VERSION}" /opt/teddycloud +rm -rf teddycloud.amd64.release_v${VERSION}.zip echo "${VERSION}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed TeddyCloud" diff --git a/install/urbackupserver-install.sh b/install/urbackupserver-install.sh new file mode 100644 index 000000000..120e1b933 --- /dev/null +++ b/install/urbackupserver-install.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Kristian Skov +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<< "$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + curl \ + sudo \ + mc \ + gnupg \ + coreutils +msg_ok "Installed Dependencies" + +msg_info "Installing UrBackup Server" +curl -fsSL https://download.opensuse.org/repositories/home:uroni/Debian_12/Release.key | gpg --dearmor >/etc/apt/trusted.gpg.d/home_uroni.gpg +echo 'deb [signed-by=/etc/apt/trusted.gpg.d/home_uroni.gpg] http://download.opensuse.org/repositories/home:/uroni/Debian_12/ /' >/etc/apt/sources.list.d/home:uroni.list +$STD apt-get update -y +apt-get install -y -qq urbackup-server +msg_ok "Installed UrBackup Server" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/whoogle-install.sh b/install/whoogle-install.sh index 0c2b51e89..d08953da5 100644 --- a/install/whoogle-install.sh +++ b/install/whoogle-install.sh @@ -21,13 +21,13 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Updating Python3" +msg_info "Setup Python3" $STD apt-get install -y \ python3 \ python3-dev \ python3-pip rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Updated Python3" +msg_ok "Setup Python3" msg_info "Installing Whoogle" $STD pip install brotli diff --git a/json/2fauth.json b/json/2fauth.json index 12bd22c36..bb1e6def6 100644 --- a/json/2fauth.json +++ b/json/2fauth.json @@ -2,7 +2,7 @@ "name": "2FAuth", "slug": "2fauth", "categories": [ - 0 + 6 ], "date_created": "2024-12-20", "type": "ct", diff --git a/json/5etools.json b/json/5etools.json index dcc371f13..be9e0fab1 100644 --- a/json/5etools.json +++ b/json/5etools.json @@ -2,7 +2,7 @@ "name": "5etools", "slug": "5etools", "categories": [ - 0 + 24 ], "date_created": "2025-01-02", "type": "ct", diff --git a/json/actualbudget.json b/json/actualbudget.json index 5142d8a22..4eb7684b4 100644 --- a/json/actualbudget.json +++ b/json/actualbudget.json @@ -2,7 +2,7 @@ "name": "Actual Budget", "slug": "actualbudget", "categories": [ - 0 + 23 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/add-netbird-lxc.json b/json/add-netbird-lxc.json index c9db163a1..e66a492d1 100644 --- a/json/add-netbird-lxc.json +++ b/json/add-netbird-lxc.json @@ -2,7 +2,7 @@ "name": "NetBird", "slug": "add-netbird-lxc", "categories": [ - 11 + 1 ], "date_created": "2024-05-19", "type": "misc", diff --git a/json/add-tailscale-lxc.json b/json/add-tailscale-lxc.json index 8bdc5e473..d95295da4 100644 --- a/json/add-tailscale-lxc.json +++ b/json/add-tailscale-lxc.json @@ -2,7 +2,7 @@ "name": "Tailscale", "slug": "add-tailscale-lxc", "categories": [ - 11 + 1 ], "date_created": "2024-05-02", "type": "misc", diff --git a/json/adguard.json b/json/adguard.json index 0e9499e0a..bb7ac45af 100644 --- a/json/adguard.json +++ b/json/adguard.json @@ -2,7 +2,7 @@ "name": "AdGuard Home", "slug": "adguard", "categories": [ - 13 + 5 ], "date_created": "2024-04-28", "type": "ct", diff --git a/json/adventurelog.json b/json/adventurelog.json index f85645796..dc2bb4e21 100644 --- a/json/adventurelog.json +++ b/json/adventurelog.json @@ -2,7 +2,7 @@ "name": "AdventureLog", "slug": "adventurelog", "categories": [ - 0 + 24 ], "date_created": "2024-10-26", "type": "ct", diff --git a/json/agentdvr.json b/json/agentdvr.json index 991377339..71a8826f9 100644 --- a/json/agentdvr.json +++ b/json/agentdvr.json @@ -2,7 +2,7 @@ "name": "AgentDVR", "slug": "agentdvr", "categories": [ - 17 + 15 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/all-templates.json b/json/all-templates.json index 7f9367760..e3c6e59db 100644 --- a/json/all-templates.json +++ b/json/all-templates.json @@ -2,7 +2,7 @@ "name": "All Templates", "slug": "all-templates", "categories": [ - 10 + 1 ], "date_created": "2024-05-02", "type": "misc", diff --git a/json/alpine.json b/json/alpine.json index 8c1756cb9..93f0ce30d 100644 --- a/json/alpine.json +++ b/json/alpine.json @@ -2,7 +2,7 @@ "name": "Alpine", "slug": "alpine", "categories": [ - 9 + 2 ], "date_created": "2024-05-02", "type": "ct", @@ -22,7 +22,7 @@ "ram": 512, "hdd": 0.1, "os": "alpine", - "version": "3.19" + "version": "3.21" } } ], diff --git a/json/apache-cassandra.json b/json/apache-cassandra.json index ad76772f0..7ce90c8f4 100644 --- a/json/apache-cassandra.json +++ b/json/apache-cassandra.json @@ -2,7 +2,7 @@ "name": "Apache-Cassandra", "slug": "apache-cassandra", "categories": [ - 5 + 8 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/apache-couchdb.json b/json/apache-couchdb.json index be43aeaaa..f1fcfcb9b 100644 --- a/json/apache-couchdb.json +++ b/json/apache-couchdb.json @@ -2,7 +2,7 @@ "name": "Apache-CouchDB", "slug": "apache-couchdb", "categories": [ - 5 + 8 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/apache-guacamole.json b/json/apache-guacamole.json index a49744ed7..5bf24bcff 100644 --- a/json/apache-guacamole.json +++ b/json/apache-guacamole.json @@ -1,35 +1,35 @@ { - "name": "Apache Guacamole", - "slug": "apache-guacamole", - "categories": [ - 11 - ], - "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": [], - "status": "βœ…" -} \ No newline at end of file + "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": [], + "status": "βœ…" +} diff --git a/json/apt-cacher-ng.json b/json/apt-cacher-ng.json index 82aea6459..9dab05b22 100644 --- a/json/apt-cacher-ng.json +++ b/json/apt-cacher-ng.json @@ -2,7 +2,7 @@ "name": "Apt-Cacher-NG", "slug": "apt-cacher-ng", "categories": [ - 11 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/archivebox.json b/json/archivebox.json index a7e9f3a99..cdd28e1bc 100644 --- a/json/archivebox.json +++ b/json/archivebox.json @@ -2,7 +2,7 @@ "name": "ArchiveBox", "slug": "archivebox", "categories": [ - 0 + 12 ], "date_created": "2024-10-19", "type": "ct", diff --git a/json/archlinux-vm.json b/json/archlinux-vm.json new file mode 100644 index 000000000..ddd910672 --- /dev/null +++ b/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/ArchLinuxStudio/ArchLinuxTutorial/refs/heads/master/docs/arch_seo.png", + "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/json/aria2.json b/json/aria2.json index 141c6a6e1..ee198b0d9 100644 --- a/json/aria2.json +++ b/json/aria2.json @@ -2,7 +2,7 @@ "name": "Aria2", "slug": "aria2", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/authentik.json b/json/authentik.json index 0c07bf13d..2a2a12612 100644 --- a/json/authentik.json +++ b/json/authentik.json @@ -2,7 +2,7 @@ "name": "authentik", "slug": "authentik", "categories": [ - 11 + 6 ], "date_created": "2024-12-27", "type": "ct", diff --git a/json/autobrr.json b/json/autobrr.json index fe897f78b..d5cda8d75 100644 --- a/json/autobrr.json +++ b/json/autobrr.json @@ -2,7 +2,7 @@ "name": "Autobrr", "slug": "autobrr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/bazarr.json b/json/bazarr.json index fb5fe826c..79cbe2a58 100644 --- a/json/bazarr.json +++ b/json/bazarr.json @@ -2,7 +2,7 @@ "name": "Bazarr", "slug": "bazarr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/beszel.json b/json/beszel.json new file mode 100644 index 000000000..8a67b41b1 --- /dev/null +++ b/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/json/blocky.json b/json/blocky.json index 107b45d61..f177b100e 100644 --- a/json/blocky.json +++ b/json/blocky.json @@ -2,7 +2,7 @@ "name": "Blocky", "slug": "blocky", "categories": [ - 13 + 5 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/bookstack.json b/json/bookstack.json index 083d09381..7abcbce68 100644 --- a/json/bookstack.json +++ b/json/bookstack.json @@ -2,7 +2,7 @@ "name": "BookStack", "slug": "bookstack", "categories": [ - 14 + 12 ], "date_created": "2024-11-05", "type": "ct", diff --git a/json/bunkerweb.json b/json/bunkerweb.json index 7747c8d20..26fccc94a 100644 --- a/json/bunkerweb.json +++ b/json/bunkerweb.json @@ -2,7 +2,7 @@ "name": "BunkerWeb", "slug": "bunkerweb", "categories": [ - 11 + 6 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/caddy.json b/json/caddy.json index 51a83605c..b9e8c7435 100644 --- a/json/caddy.json +++ b/json/caddy.json @@ -2,7 +2,7 @@ "name": "Caddy", "slug": "caddy", "categories": [ - 11 + 21 ], "date_created": "2024-05-11", "type": "ct", @@ -20,7 +20,7 @@ "resources": { "cpu": 1, "ram": 512, - "hdd": 2, + "hdd": 4, "os": "debian", "version": "12" } @@ -30,6 +30,15 @@ "username": null, "password": null }, - "notes": [], - "status": "βœ…" -} \ No newline at end of file + "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" + } + ], + "status": "βœ…" +} diff --git a/json/calibre-web.json b/json/calibre-web.json index 70a080a78..c8d485f7d 100644 --- a/json/calibre-web.json +++ b/json/calibre-web.json @@ -2,7 +2,7 @@ "name": "Calibre-Web", "slug": "calibre-web", "categories": [ - 12 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/casaos.json b/json/casaos.json index f9c9d1f1c..8e572b3c8 100644 --- a/json/casaos.json +++ b/json/casaos.json @@ -2,7 +2,7 @@ "name": "CasaOS", "slug": "casaos", "categories": [ - 8 + 2 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/changedetection.json b/json/changedetection.json index 03823a22e..f9cc987d9 100644 --- a/json/changedetection.json +++ b/json/changedetection.json @@ -2,7 +2,7 @@ "name": "Change Detection", "slug": "changedetection", "categories": [ - 7 + 24 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/channels.json b/json/channels.json index bf908c64c..f7a620baf 100644 --- a/json/channels.json +++ b/json/channels.json @@ -2,7 +2,7 @@ "name": "Channels DVR Server", "slug": "channels", "categories": [ - 17 + 15 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/checkmk.json b/json/checkmk.json index 9885e26e1..d7ac2d27b 100644 --- a/json/checkmk.json +++ b/json/checkmk.json @@ -1,35 +1,35 @@ { - "name": "Checkmk", - "slug": "checkmk", - "categories": [ - 7 - ], - "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://checkmk.com/application/files/cache/thumbnails/67fc39c599afdf20557d538416e3efd3.png", - "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 - }, + "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://checkmk.com/application/files/cache/thumbnails/67fc39c599afdf20557d538416e3efd3.png", + "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`", diff --git a/json/clean-orphaned-lvm.json b/json/clean-orphaned-lvm.json new file mode 100644 index 000000000..4382ce3f2 --- /dev/null +++ b/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/home-assistant/brands/master/core_integrations/proxmoxve/icon.png", + "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/json/cloudflared.json b/json/cloudflared.json index 5e6328169..acdad10b5 100644 --- a/json/cloudflared.json +++ b/json/cloudflared.json @@ -2,7 +2,7 @@ "name": "Cloudflared", "slug": "cloudflared", "categories": [ - 11 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/cockpit.json b/json/cockpit.json index c9086d0b5..7add4b248 100644 --- a/json/cockpit.json +++ b/json/cockpit.json @@ -2,7 +2,7 @@ "name": "Cockpit", "slug": "cockpit", "categories": [ - 16 + 10 ], "date_created": "2024-10-20", "type": "ct", diff --git a/json/code-server.json b/json/code-server.json index f49e01481..8ad175d2b 100644 --- a/json/code-server.json +++ b/json/code-server.json @@ -2,7 +2,9 @@ "name": "VS Code Server", "slug": "code-server", "categories": [ - 19 + 1, + 20, + 11 ], "date_created": "2024-05-02", "type": "misc", @@ -37,4 +39,4 @@ } ], "status": "βœ…" -} \ No newline at end of file +} diff --git a/json/commafeed.json b/json/commafeed.json index 6d9ce1816..b6f7559da 100644 --- a/json/commafeed.json +++ b/json/commafeed.json @@ -2,7 +2,7 @@ "name": "CommaFeed", "slug": "commafeed", "categories": [ - 0 + 19 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/cronicle.json b/json/cronicle.json index 160fffdc1..34af19164 100644 --- a/json/cronicle.json +++ b/json/cronicle.json @@ -2,7 +2,7 @@ "name": "Cronicle Primary", "slug": "cronicle", "categories": [ - 11 + 19 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/crowdsec.json b/json/crowdsec.json index 23ce134c6..db9b9ae91 100644 --- a/json/crowdsec.json +++ b/json/crowdsec.json @@ -2,7 +2,7 @@ "name": "CrowdSec", "slug": "crowdsec", "categories": [ - 11 + 6 ], "date_created": "2024-05-02", "type": "misc", diff --git a/json/daemonsync.json b/json/daemonsync.json index 33e254862..3da729122 100644 --- a/json/daemonsync.json +++ b/json/daemonsync.json @@ -2,7 +2,7 @@ "name": "Daemon Sync Server", "slug": "daemonsync", "categories": [ - 16 + 19 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/dashy.json b/json/dashy.json index 821b58523..aa850f279 100644 --- a/json/dashy.json +++ b/json/dashy.json @@ -2,7 +2,7 @@ "name": "Dashy", "slug": "dashy", "categories": [ - 15 + 10 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/debian-vm.json b/json/debian-vm.json index c375aa7b6..01b9052a3 100644 --- a/json/debian-vm.json +++ b/json/debian-vm.json @@ -2,7 +2,7 @@ "name": "Debian 12", "slug": "debian-vm", "categories": [ - 9 + 2 ], "date_created": "2024-05-02", "type": "vm", diff --git a/json/debian.json b/json/debian.json index 9aaf7e823..75cb722f6 100644 --- a/json/debian.json +++ b/json/debian.json @@ -2,7 +2,7 @@ "name": "Debian", "slug": "debian", "categories": [ - 9 + 2 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/deconz.json b/json/deconz.json index 622d38f47..91cac88f6 100644 --- a/json/deconz.json +++ b/json/deconz.json @@ -2,7 +2,7 @@ "name": "deCONZ", "slug": "deconz", "categories": [ - 6 + 17 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/deluge.json b/json/deluge.json index d64f2750c..670c456c7 100644 --- a/json/deluge.json +++ b/json/deluge.json @@ -2,7 +2,7 @@ "name": "Deluge", "slug": "deluge", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/docker-vm.json b/json/docker-vm.json new file mode 100644 index 000000000..b53107214 --- /dev/null +++ b/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/json/docker.json b/json/docker.json index 03e3e4391..bf2182538 100644 --- a/json/docker.json +++ b/json/docker.json @@ -2,7 +2,7 @@ "name": "Docker", "slug": "docker", "categories": [ - 8 + 3 ], "date_created": "2024-05-02", "type": "ct", @@ -33,7 +33,7 @@ "ram": 1024, "hdd": 2, "os": "alpine", - "version": "3.19" + "version": "3.21" } } ], diff --git a/json/dockge.json b/json/dockge.json index 4af90484c..9bd37978b 100644 --- a/json/dockge.json +++ b/json/dockge.json @@ -2,7 +2,7 @@ "name": "Dockge", "slug": "dockge", "categories": [ - 8 + 3 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/dotnetaspwebapi.json b/json/dotnetaspwebapi.json index dd117d1db..8181f1309 100644 --- a/json/dotnetaspwebapi.json +++ b/json/dotnetaspwebapi.json @@ -2,7 +2,7 @@ "name":"Dotnet ASP Web API", "slug":"dotnetaspwebapi", "categories":[ - 0 + 20 ], "date_created":"2025-01-15", "type":"ct", diff --git a/json/emby.json b/json/emby.json index d0c07676f..62843a099 100644 --- a/json/emby.json +++ b/json/emby.json @@ -2,7 +2,7 @@ "name": "Emby Media Server", "slug": "emby", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/emqx.json b/json/emqx.json index da2074d3c..0d3113779 100644 --- a/json/emqx.json +++ b/json/emqx.json @@ -2,7 +2,7 @@ "name": "EMQX", "slug": "emqx", "categories": [ - 4 + 18 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/ersatztv.json b/json/ersatztv.json index e912616f0..76481936e 100644 --- a/json/ersatztv.json +++ b/json/ersatztv.json @@ -2,7 +2,7 @@ "name": "ErsatzTV", "slug": "ersatztv", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/esphome.json b/json/esphome.json index 4145cc721..a4866cdf9 100644 --- a/json/esphome.json +++ b/json/esphome.json @@ -2,7 +2,7 @@ "name": "ESPHome", "slug": "esphome", "categories": [ - 3 + 16 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/evcc.json b/json/evcc.json index 014aca046..3ae4cd9c4 100644 --- a/json/evcc.json +++ b/json/evcc.json @@ -2,7 +2,7 @@ "name": "evcc", "slug": "evcc", "categories": [ - 0 + 16 ], "date_created": "2024-10-15", "type": "ct", diff --git a/json/fenrus.json b/json/fenrus.json index ae2563cb1..8eee43456 100644 --- a/json/fenrus.json +++ b/json/fenrus.json @@ -2,7 +2,7 @@ "name": "Fenrus", "slug": "fenrus", "categories": [ - 15 + 10 ], "date_created": "2024-05-05", "type": "ct", diff --git a/json/fhem.json b/json/fhem.json index 11273a969..2d82a527c 100644 --- a/json/fhem.json +++ b/json/fhem.json @@ -2,7 +2,7 @@ "name": "FHEM", "slug": "fhem", "categories": [ - 3 + 16 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/filebrowser.json b/json/filebrowser.json index 0718123de..1600a8750 100644 --- a/json/filebrowser.json +++ b/json/filebrowser.json @@ -2,7 +2,7 @@ "name": "File Browser", "slug": "filebrowser", "categories": [ - 16 + 1 ], "date_created": "2024-05-02", "type": "misc", diff --git a/json/firefly.json b/json/firefly.json index 2ad158489..de83e530a 100644 --- a/json/firefly.json +++ b/json/firefly.json @@ -1,40 +1,40 @@ { - "name": "Firefly III", - "slug": "firefly", - "categories": [ - 0 - ], - "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/firefly-iii/firefly-iii/develop/.github/assets/img/logo-small.png", - "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" - } - ], - "status": "βœ…" -} \ No newline at end of file + "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/firefly-iii/firefly-iii/develop/.github/assets/img/logo-small.png", + "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" + } + ], + "status": "βœ…" +} diff --git a/json/flaresolverr.json b/json/flaresolverr.json index 9c4f317b0..ece8a4227 100644 --- a/json/flaresolverr.json +++ b/json/flaresolverr.json @@ -2,7 +2,7 @@ "name": "FlareSolverr", "slug": "flaresolverr", "categories": [ - 11 + 14 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/flowiseai.json b/json/flowiseai.json index 164ccc672..9e04b6b1e 100644 --- a/json/flowiseai.json +++ b/json/flowiseai.json @@ -2,7 +2,7 @@ "name": "FlowiseAI", "slug": "flowiseai", "categories": [ - 19 + 20 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/forgejo.json b/json/forgejo.json index 7f2a36bfe..c56e944c0 100644 --- a/json/forgejo.json +++ b/json/forgejo.json @@ -2,7 +2,7 @@ "name": "Forgejo", "slug": "forgejo", "categories": [ - 19 + 20 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/frigate.json b/json/frigate.json index 90f6da0c6..9c4e9700f 100644 --- a/json/frigate.json +++ b/json/frigate.json @@ -2,7 +2,7 @@ "name": "Frigate", "slug": "frigate", "categories": [ - 17 + 15 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/fstrim.json b/json/fstrim.json index c63692272..535e352fe 100644 --- a/json/fstrim.json +++ b/json/fstrim.json @@ -41,4 +41,4 @@ } ], "status": "βœ…" -} \ No newline at end of file +} diff --git a/json/ghost.json b/json/ghost.json index 21340d404..fdbc461a9 100644 --- a/json/ghost.json +++ b/json/ghost.json @@ -2,7 +2,7 @@ "name": "Ghost", "slug": "ghost", "categories": [ - 12 + 25 ], "date_created": "2025-01-10", "type": "ct", diff --git a/json/gitea.json b/json/gitea.json index 668dccba5..6d4a29b4c 100644 --- a/json/gitea.json +++ b/json/gitea.json @@ -2,7 +2,7 @@ "name": "Gitea", "slug": "gitea", "categories": [ - 19 + 20 ], "date_created": "2024-07-26", "type": "ct", diff --git a/json/glance.json b/json/glance.json index 886d25cfb..50921ef8d 100644 --- a/json/glance.json +++ b/json/glance.json @@ -2,7 +2,7 @@ "name": "Glance", "slug": "glance", "categories": [ - 15 + 9 ], "date_created": "2024-12-02", "type": "ct", diff --git a/json/glances.json b/json/glances.json index b9b337327..dda85650f 100644 --- a/json/glances.json +++ b/json/glances.json @@ -2,7 +2,7 @@ "name": "Glances", "slug": "glances", "categories": [ - 7 + 9 ], "date_created": "2024-05-02", "type": "misc", diff --git a/json/glpi.json b/json/glpi.json index 0e46ecd5b..29b2ad9b0 100644 --- a/json/glpi.json +++ b/json/glpi.json @@ -1,35 +1,35 @@ { - "name": "GLPI", - "slug": "glpi", - "categories": [ - 0 - ], - "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/glpi-project/glpi/refs/heads/main/public/pics/login_logo_glpi.png", - "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": [], - "status": "βœ…" -} \ No newline at end of file + "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/glpi-project/glpi/refs/heads/main/public/pics/login_logo_glpi.png", + "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": [], + "status": "βœ…" +} diff --git a/json/go2rtc.json b/json/go2rtc.json index b594bf9ef..2e1ac4678 100644 --- a/json/go2rtc.json +++ b/json/go2rtc.json @@ -2,7 +2,7 @@ "name": "go2rtc", "slug": "go2rtc", "categories": [ - 0 + 15 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/gokapi.json b/json/gokapi.json index 334c9023f..52c64a51b 100644 --- a/json/gokapi.json +++ b/json/gokapi.json @@ -2,7 +2,7 @@ "name": "Gokapi", "slug": "gokapi", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/gotify.json b/json/gotify.json index 1ec204c94..d51cca1e0 100644 --- a/json/gotify.json +++ b/json/gotify.json @@ -2,7 +2,7 @@ "name": "Gotify", "slug": "gotify", "categories": [ - 0 + 19 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/grafana.json b/json/grafana.json index 49870f80e..fb2f9237d 100644 --- a/json/grafana.json +++ b/json/grafana.json @@ -2,11 +2,11 @@ "name": "Grafana", "slug": "grafana", "categories": [ - 7 + 9 ], "date_created": "2024-05-02", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 3000, "documentation": null, @@ -33,7 +33,7 @@ "ram": 256, "hdd": 1, "os": "alpine", - "version": "3.19" + "version": "3.21" } } ], diff --git a/json/grist.json b/json/grist.json index 7eeed63b7..b78d01bb1 100644 --- a/json/grist.json +++ b/json/grist.json @@ -1,35 +1,35 @@ { - "name": "Grist", - "slug": "grist", - "categories": [ - 5 - ], - "date_created": "2024-12-27", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 8484, - "documentation": null, - "website": "https://www.getgrist.com/", - "logo": "https://github.com/gristlabs/grist-core/blob/main/static/img/logo-grist.png?raw=true", - "description": "Grist is a modern, open source spreadsheet that goes beyond the grid", - "install_methods": [ - { - "type": "default", - "script": "ct/grist.sh", - "resources": { - "cpu": 1, - "ram": 1024, - "hdd": 4, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [], - "status": "🚧" -} \ No newline at end of file + "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://github.com/gristlabs/grist-core/blob/main/static/img/logo-grist.png?raw=true", + "description": "Grist is a modern, open source spreadsheet that goes beyond the grid", + "install_methods": [ + { + "type": "default", + "script": "ct/grist.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [], + "status": "🚧" +} diff --git a/json/grocy.json b/json/grocy.json index 63cd60474..bfdf81b66 100644 --- a/json/grocy.json +++ b/json/grocy.json @@ -2,7 +2,7 @@ "name": "grocy", "slug": "grocy", "categories": [ - 0 + 24 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/haos-vm.json b/json/haos-vm.json index efa822365..d9dbf0b91 100644 --- a/json/haos-vm.json +++ b/json/haos-vm.json @@ -2,7 +2,7 @@ "name": "Home Assistant OS", "slug": "haos-vm", "categories": [ - 2 + 16 ], "date_created": "2024-04-29", "type": "vm", @@ -41,4 +41,4 @@ } ], "status": "❌" -} \ No newline at end of file +} diff --git a/json/headscale.json b/json/headscale.json index 4b18aabb5..c079827fb 100644 --- a/json/headscale.json +++ b/json/headscale.json @@ -2,7 +2,7 @@ "name": "Headscale", "slug": "headscale", "categories": [ - 11 + 4 ], "date_created": "2024-05-13", "type": "ct", diff --git a/json/heimdall-dashboard.json b/json/heimdall-dashboard.json index 042ce0971..ca7556294 100644 --- a/json/heimdall-dashboard.json +++ b/json/heimdall-dashboard.json @@ -2,7 +2,7 @@ "name": "Heimdall Dashboard", "slug": "heimdall-dashboard", "categories": [ - 15 + 10 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/hivemq.json b/json/hivemq.json index 0e5ec1546..e197c3236 100644 --- a/json/hivemq.json +++ b/json/hivemq.json @@ -2,7 +2,7 @@ "name": "HiveMQ CE", "slug": "hivemq", "categories": [ - 4 + 18 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/hoarder.json b/json/hoarder.json index 09c1d4c5c..3f59a61c2 100644 --- a/json/hoarder.json +++ b/json/hoarder.json @@ -1,38 +1,35 @@ { - "name": "Hoarder", - "slug": "hoarder", - "categories": [ - 14 - ], - "date_created": "2024-12-02", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 3000, - "documentation": "https://docs.hoarder.app/", - "website": "https://hoarder.app/", - "logo": "https://raw.githubusercontent.com/hoarder-app/hoarder/refs/heads/main/screenshots/logo.png", - "description": "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, Hoarder is the perfect tool for anyone who wants to keep track of their digital life.", - "install_methods": [ - { - "type": "default", - "script": "ct/hoarder.sh", - "resources": { - "cpu": 2, - "ram": 4096, - "hdd": 8, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [{ - "text": "No arm64 version of dependency available", - "type": "warning" - }], - "status": "❌" -} \ No newline at end of file + "name": "Hoarder", + "slug": "hoarder", + "categories": [ + 12 + ], + "date_created": "2024-12-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://docs.hoarder.app/", + "website": "https://hoarder.app/", + "logo": "https://raw.githubusercontent.com/hoarder-app/hoarder/refs/heads/main/screenshots/logo.png", + "description": "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, Hoarder is the perfect tool for anyone who wants to keep track of their digital life.", + "install_methods": [ + { + "type": "default", + "script": "ct/hoarder.sh", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [], + "status": "❌" +} diff --git a/json/homarr.json b/json/homarr.json index d9c52d911..01964ddd7 100644 --- a/json/homarr.json +++ b/json/homarr.json @@ -2,9 +2,9 @@ "name": "Homarr", "slug": "homarr", "categories": [ - 15 + 10 ], - "date_created": "2024-05-02", + "date_created": "2025-01-28", "type": "ct", "updateable": true, "privileged": false, @@ -19,7 +19,7 @@ "script": "ct/homarr.sh", "resources": { "cpu": 2, - "ram": 2048, + "ram": 4096, "hdd": 8, "os": "debian", "version": "12" diff --git a/json/homeassistant-core.json b/json/homeassistant-core.json index a0a880176..ae63974b3 100644 --- a/json/homeassistant-core.json +++ b/json/homeassistant-core.json @@ -2,7 +2,7 @@ "name": "Home Assistant Core", "slug": "homeassistant-core", "categories": [ - 2 + 16 ], "date_created": "2025-01-17", "type": "ct", diff --git a/json/homeassistant.json b/json/homeassistant.json index 22febd982..99bd23536 100644 --- a/json/homeassistant.json +++ b/json/homeassistant.json @@ -2,7 +2,7 @@ "name": "Home Assistant Container", "slug": "homeassistant", "categories": [ - 2 + 16 ], "date_created": "2024-04-29", "type": "ct", diff --git a/json/homebox.json b/json/homebox.json index 934cd94f1..78838f0ab 100644 --- a/json/homebox.json +++ b/json/homebox.json @@ -2,7 +2,7 @@ "name": "HomeBox", "slug": "homebox", "categories": [ - 14 + 24 ], "date_created": "2024-09-16", "type": "ct", diff --git a/json/homebridge.json b/json/homebridge.json index fa7a19b31..c78f2fdb4 100644 --- a/json/homebridge.json +++ b/json/homebridge.json @@ -2,7 +2,7 @@ "name": "Homebridge", "slug": "homebridge", "categories": [ - 3 + 16 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/homepage.json b/json/homepage.json index 842e5baad..f39436779 100644 --- a/json/homepage.json +++ b/json/homepage.json @@ -2,7 +2,7 @@ "name": "Homepage", "slug": "homepage", "categories": [ - 15 + 10 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/homer.json b/json/homer.json index 96941ff7e..50efd2e37 100644 --- a/json/homer.json +++ b/json/homer.json @@ -2,7 +2,7 @@ "name": "Homer", "slug": "homer", "categories": [ - 15 + 10 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/hyperhdr.json b/json/hyperhdr.json index fc41abc1b..b5f14ad81 100644 --- a/json/hyperhdr.json +++ b/json/hyperhdr.json @@ -2,7 +2,7 @@ "name": "HyperHDR", "slug": "hyperhdr", "categories": [ - 0 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/hyperion.json b/json/hyperion.json index af9fe8513..a36af0569 100644 --- a/json/hyperion.json +++ b/json/hyperion.json @@ -2,7 +2,7 @@ "name": "Hyperion", "slug": "hyperion", "categories": [ - 0 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/influxdb.json b/json/influxdb.json index 310ac3872..ad5b671b2 100644 --- a/json/influxdb.json +++ b/json/influxdb.json @@ -2,7 +2,7 @@ "name": "InfluxDB", "slug": "influxdb", "categories": [ - 5 + 8 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/inspircd.json b/json/inspircd.json index d7314da91..b69a83842 100644 --- a/json/inspircd.json +++ b/json/inspircd.json @@ -2,7 +2,7 @@ "name": "InspIRCd 4", "slug": "inspircd", "categories": [ - 0 + 24 ], "date_created": "2024-11-29", "type": "ct", diff --git a/json/iobroker.json b/json/iobroker.json index 2a08d2c60..60384b111 100644 --- a/json/iobroker.json +++ b/json/iobroker.json @@ -2,7 +2,7 @@ "name": "ioBroker", "slug": "iobroker", "categories": [ - 3 + 16 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/iventoy.json b/json/iventoy.json index b7fd17c27..3644f7b76 100644 --- a/json/iventoy.json +++ b/json/iventoy.json @@ -2,7 +2,7 @@ "name": "iVentoy", "slug": "iventoy", "categories": [ - 11 + 2 ], "date_created": "2024-05-16", "type": "ct", diff --git a/json/jackett.json b/json/jackett.json index 3aa16c35a..885e7874a 100644 --- a/json/jackett.json +++ b/json/jackett.json @@ -2,7 +2,7 @@ "name": "Jackett", "slug": "jackett", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/jellyfin.json b/json/jellyfin.json index ef1a13f18..1a932ca00 100644 --- a/json/jellyfin.json +++ b/json/jellyfin.json @@ -2,7 +2,7 @@ "name": "Jellyfin Media Server", "slug": "jellyfin", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/jellyseerr.json b/json/jellyseerr.json index c40feb67f..93ea1ea6e 100644 --- a/json/jellyseerr.json +++ b/json/jellyseerr.json @@ -2,7 +2,7 @@ "name": "Jellyseerr", "slug": "jellyseerr", "categories": [ - 12 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/jenkins.json b/json/jenkins.json index 0464c64a9..b4101eea2 100644 --- a/json/jenkins.json +++ b/json/jenkins.json @@ -2,7 +2,7 @@ "name": "Jenkins", "slug": "jenkins", "categories": [ - 3 + 22 ], "date_created": "2024-12-26", "type": "ct", diff --git a/json/kavita.json b/json/kavita.json index 688cc36d3..0389306cf 100644 --- a/json/kavita.json +++ b/json/kavita.json @@ -2,7 +2,7 @@ "name": "Kavita", "slug": "kavita", "categories": [ - 14 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/kernel-clean.json b/json/kernel-clean.json index 2f4d67396..76f564a15 100644 --- a/json/kernel-clean.json +++ b/json/kernel-clean.json @@ -37,4 +37,4 @@ } ], "status": "βœ…" -} \ No newline at end of file +} diff --git a/json/kernel-pin.json b/json/kernel-pin.json index 4599365ad..8ee396ce0 100644 --- a/json/kernel-pin.json +++ b/json/kernel-pin.json @@ -37,4 +37,4 @@ } ], "status": "🚧" -} \ No newline at end of file +} diff --git a/json/keycloak.json b/json/keycloak.json index 8c32b7ee2..de71f1247 100644 --- a/json/keycloak.json +++ b/json/keycloak.json @@ -2,7 +2,7 @@ "name": "Keycloak", "slug": "keycloak", "categories": [ - 11 + 6 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/kimai.json b/json/kimai.json index efcc68b17..f76dc381c 100644 --- a/json/kimai.json +++ b/json/kimai.json @@ -1,35 +1,35 @@ { - "name": "Kimai", - "slug": "kimai", - "categories": [ - 0 - ], - "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/kimai/images/refs/heads/main/logo-transparent.png", - "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": [], - "status": "🚧" + "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/kimai/images/refs/heads/main/logo-transparent.png", + "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": [], + "status": "🚧" } \ No newline at end of file diff --git a/json/komga.json b/json/komga.json index 10f86dbea..2bf38dd68 100644 --- a/json/komga.json +++ b/json/komga.json @@ -2,7 +2,7 @@ "name": "Komga", "slug": "komga", "categories": [ - 12 + 13 ], "date_created": "2024-11-15", "type": "ct", diff --git a/json/komodo.json b/json/komodo.json index 31020169f..a87d3a3a5 100644 --- a/json/komodo.json +++ b/json/komodo.json @@ -1,40 +1,40 @@ { - "name": "Komodo", - "slug": "komodo", - "categories": [ - 8 - ], - "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://komo.do/img/logo512.png", - "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" - } - ], - "status": "🚧" + "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://komo.do/img/logo512.png", + "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" + } + ], + "status": "🚧" } \ No newline at end of file diff --git a/json/kubo.json b/json/kubo.json index ae1cfcfc7..554923c45 100644 --- a/json/kubo.json +++ b/json/kubo.json @@ -2,7 +2,7 @@ "name": "Kubo", "slug": "kubo", "categories": [ - 16 + 4 ], "date_created": "2024-06-27", "type": "ct", diff --git a/json/lazylibrarian.json b/json/lazylibrarian.json index 13a515c20..d2675f26a 100644 --- a/json/lazylibrarian.json +++ b/json/lazylibrarian.json @@ -2,7 +2,7 @@ "name": "LazyLibrarian", "slug": "lazylibrarian", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/lidarr.json b/json/lidarr.json index 5f168fa45..c64c1d858 100644 --- a/json/lidarr.json +++ b/json/lidarr.json @@ -2,7 +2,7 @@ "name": "Lidarr", "slug": "lidarr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/linkwarden.json b/json/linkwarden.json index a31bc4845..3ec555040 100644 --- a/json/linkwarden.json +++ b/json/linkwarden.json @@ -2,7 +2,7 @@ "name": "Linkwarden", "slug": "linkwarden", "categories": [ - 15 + 12 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/listmonk.json b/json/listmonk.json index 97330e41f..3397e832c 100644 --- a/json/listmonk.json +++ b/json/listmonk.json @@ -2,7 +2,7 @@ "name": "listmonk", "slug": "listmonk", "categories": [ - 14 + 0 ], "date_created": "2024-11-22", "type": "ct", diff --git a/json/lldap.json b/json/lldap.json index c2c95654c..573aee312 100644 --- a/json/lldap.json +++ b/json/lldap.json @@ -2,7 +2,7 @@ "name": "lldap", "slug": "lldap", "categories": [ - 11 + 6 ], "date_created": "2024-08-06", "type": "ct", diff --git a/json/lubelogger.json b/json/lubelogger.json index 3dfb2b759..0baeb98d4 100644 --- a/json/lubelogger.json +++ b/json/lubelogger.json @@ -2,7 +2,7 @@ "name": "LubeLogger", "slug": "lubelogger", "categories": [ - 0 + 24 ], "date_created": "2024-11-29", "type": "ct", diff --git a/json/lxc-delete.json b/json/lxc-delete.json new file mode 100644 index 000000000..f2010dbe3 --- /dev/null +++ b/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/home-assistant/brands/master/core_integrations/proxmoxve/icon.png", + "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/json/mafl.json b/json/mafl.json index 126d2ce42..21dfad6f3 100644 --- a/json/mafl.json +++ b/json/mafl.json @@ -2,7 +2,7 @@ "name": "Mafl", "slug": "mafl", "categories": [ - 15 + 10 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/magicmirror.json b/json/magicmirror.json index d399ab668..e5b42be08 100644 --- a/json/magicmirror.json +++ b/json/magicmirror.json @@ -2,7 +2,7 @@ "name": "MagicMirror Server", "slug": "magicmirror", "categories": [ - 0 + 24 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/mariadb.json b/json/mariadb.json index 0d3ab6032..0322a0a77 100644 --- a/json/mariadb.json +++ b/json/mariadb.json @@ -2,7 +2,7 @@ "name": "Mariadb", "slug": "mariadb", "categories": [ - 5 + 8 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/matterbridge.json b/json/matterbridge.json index b01d96a4a..b695bce8c 100644 --- a/json/matterbridge.json +++ b/json/matterbridge.json @@ -2,7 +2,7 @@ "name": "Matterbridge", "slug": "matterbridge", "categories": [ - 6 + 17 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/mediamtx.json b/json/mediamtx.json index 888d4ef69..0647cde19 100644 --- a/json/mediamtx.json +++ b/json/mediamtx.json @@ -2,7 +2,7 @@ "name": "MediaMTX", "slug": "mediamtx", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/medusa.json b/json/medusa.json index 4a94ec7f1..fcad277ef 100644 --- a/json/medusa.json +++ b/json/medusa.json @@ -2,7 +2,7 @@ "name": "Medusa", "slug": "medusa", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/memos.json b/json/memos.json index e665a7874..f40d92ede 100644 --- a/json/memos.json +++ b/json/memos.json @@ -2,7 +2,7 @@ "name": "Memos", "slug": "memos", "categories": [ - 14 + 12 ], "date_created": "2024-10-31", "type": "ct", diff --git a/json/meshcentral.json b/json/meshcentral.json index 7a79e2d1e..136135cc7 100644 --- a/json/meshcentral.json +++ b/json/meshcentral.json @@ -2,7 +2,7 @@ "name": "MeshCentral", "slug": "meshcentral", "categories": [ - 11 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/metadata.json b/json/metadata.json index 910be1c0b..e25f0ee70 100644 --- a/json/metadata.json +++ b/json/metadata.json @@ -1,105 +1,30 @@ { - "categories": [ - { - "name": "Proxmox VE Tools", - "id": 1, - "sort_order": 1.0 - }, - { - "name": "AdBlocker & DNS", - "id": 13, - "sort_order": 2.0 - }, - { - "name": "*Arr Suite", - "id": 18, - "sort_order": 3.0 - }, - { - "name": "Automation", - "id": 3, - "sort_order": 4.0 - }, - { - "name": "Coding & AI", - "id": 19, - "sort_order": 5.0 - }, - { - "name": "Dashboards", - "id": 15, - "sort_order": 5.0 - }, - { - "name": "Database", - "id": 5, - "sort_order": 6.0 - }, - { - "name": "Docker & Kubernetes", - "id": 8, - "sort_order": 7.0 - }, - { - "name": "Document & Notes", - "id": 14, - "sort_order": 8.0 - }, - { - "name": "File & Downloads", - "id": 16, - "sort_order": 9.0 - }, - { - "name": "Home Assistant", - "id": 2, - "sort_order": 10.0 - }, - { - "name": "Media & Photo", - "id": 12, - "sort_order": 11.0 - }, - { - "name": "Monitoring & Analytics", - "id": 7, - "sort_order": 12.0 - }, - { - "name": "MQTT", - "id": 4, - "sort_order": 13.0 - }, - { - "name": "NVR & DVR", - "id": 17, - "sort_order": 14.0 - }, - { - "name": "Operating System", - "id": 9, - "sort_order": 15.0 - }, - { - "name": "Server & Networking", - "id": 11, - "sort_order": 16.0 - }, - { - "name": "TurnKey", - "id": 10, - "sort_order": 17.0 - }, - { - "name": "Matter, Zigbee & ZWave", - "id": 6, - "sort_order": 18.0 - }, - { - "name": "Miscellaneous", - "id": 0, - "sort_order": 99.0 - } - ], - "status": "🚧" -} \ No newline at end of file + "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/json/metube.json b/json/metube.json index ce51021d5..643e52c08 100644 --- a/json/metube.json +++ b/json/metube.json @@ -2,7 +2,7 @@ "name": "MeTube", "slug": "metube", "categories": [ - 12 + 11 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/microcode.json b/json/microcode.json index 56c13ae61..cb09aeac7 100644 --- a/json/microcode.json +++ b/json/microcode.json @@ -41,4 +41,4 @@ } ], "status": "❌" -} \ No newline at end of file +} diff --git a/json/mikrotik-routeros.json b/json/mikrotik-routeros.json index c96f5dfe2..b6e2c071a 100644 --- a/json/mikrotik-routeros.json +++ b/json/mikrotik-routeros.json @@ -2,7 +2,7 @@ "name": "Mikrotik RouterOS CHR", "slug": "mikrotik-routeros", "categories": [ - 11 + 2 ], "date_created": "2024-05-02", "type": "vm", diff --git a/json/mongodb.json b/json/mongodb.json index c9535d00d..835461892 100644 --- a/json/mongodb.json +++ b/json/mongodb.json @@ -2,7 +2,7 @@ "name": "MongoDB", "slug": "mongodb", "categories": [ - 5 + 8 ], "date_created": "2024-05-18", "type": "ct", diff --git a/json/monica.json b/json/monica.json new file mode 100644 index 000000000..6e91b210a --- /dev/null +++ b/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/monicahq/monica/0400350b4f9bf02300b030b9924b66ef2960b188/public/img/favicon.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/json/motioneye.json b/json/motioneye.json index dacf8ea62..5f899639e 100644 --- a/json/motioneye.json +++ b/json/motioneye.json @@ -2,7 +2,7 @@ "name": "MotionEye NVR", "slug": "motioneye", "categories": [ - 17 + 15 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/mqtt.json b/json/mqtt.json index d53a2d653..abc002c90 100644 --- a/json/mqtt.json +++ b/json/mqtt.json @@ -2,7 +2,7 @@ "name": "MQTT", "slug": "mqtt", "categories": [ - 4 + 18 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/mylar3.json b/json/mylar3.json index 9feb4dce7..74a1152b8 100644 --- a/json/mylar3.json +++ b/json/mylar3.json @@ -2,7 +2,7 @@ "name": "Mylar3", "slug": "mylar3", "categories": [ - 12 + 14 ], "date_created": "2024-12-02", "type": "ct", diff --git a/json/myspeed.json b/json/myspeed.json index 4044a66db..f4249a3b3 100644 --- a/json/myspeed.json +++ b/json/myspeed.json @@ -2,7 +2,7 @@ "name": "MySpeed", "slug": "myspeed", "categories": [ - 7 + 4 ], "date_created": "2024-06-14", "type": "ct", diff --git a/json/mysql.json b/json/mysql.json index d5ad13c34..5bec4a00d 100644 --- a/json/mysql.json +++ b/json/mysql.json @@ -2,7 +2,7 @@ "name": "MySQL", "slug": "mysql", "categories": [ - 5 + 8 ], "date_created": "2024-10-10", "type": "ct", diff --git a/json/n8n.json b/json/n8n.json index d3a4f2dd5..a3bdcad30 100644 --- a/json/n8n.json +++ b/json/n8n.json @@ -2,7 +2,7 @@ "name": "n8n", "slug": "n8n", "categories": [ - 3 + 16 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/navidrome.json b/json/navidrome.json index b412612f7..3e7c646dc 100644 --- a/json/navidrome.json +++ b/json/navidrome.json @@ -2,7 +2,7 @@ "name": "Navidrome", "slug": "navidrome", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/neo4j.json b/json/neo4j.json index 7da7cc260..01b9adb01 100644 --- a/json/neo4j.json +++ b/json/neo4j.json @@ -2,7 +2,7 @@ "name": "Neo4j", "slug": "neo4j", "categories": [ - 5 + 8 ], "date_created": "2024-10-20", "type": "ct", diff --git a/json/netbox.json b/json/netbox.json index 78ddb7b6b..7afa04392 100644 --- a/json/netbox.json +++ b/json/netbox.json @@ -2,7 +2,7 @@ "name": "NetBox", "slug": "netbox", "categories": [ - 11 + 4 ], "date_created": "2024-11-17", "type": "ct", diff --git a/json/nextcloud-vm.json b/json/nextcloud-vm.json index fc639387b..bf337b2e5 100644 --- a/json/nextcloud-vm.json +++ b/json/nextcloud-vm.json @@ -2,7 +2,7 @@ "name": "Nextcloud", "slug": "nextcloud-vm", "categories": [ - 12 + 2 ], "date_created": "2023-11-14", "type": "vm", @@ -37,4 +37,4 @@ } ], "status": "βœ…" -} \ No newline at end of file +} diff --git a/json/nextcloudpi.json b/json/nextcloudpi.json index 625f951b7..d58cab9c3 100644 --- a/json/nextcloudpi.json +++ b/json/nextcloudpi.json @@ -2,7 +2,7 @@ "name": "Nextcloud", "slug": "nextcloudpi", "categories": [ - 12 + 2 ], "date_created": "2024-05-02", "type": "ct", @@ -33,7 +33,7 @@ "ram": 1024, "hdd": 2, "os": "alpine", - "version": "3.19" + "version": "3.21" } } ], diff --git a/json/nextpvr.json b/json/nextpvr.json index 0581b321b..60680701e 100644 --- a/json/nextpvr.json +++ b/json/nextpvr.json @@ -1,35 +1,35 @@ { - "name": "NextPVR", - "slug": "nextpvr", - "categories": [ - 17 - ], - "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": [], - "status": "🚧" -} \ No newline at end of file + "name": "NextPVR", + "slug": "nextpvr", + "categories": [ + 15 + ], + "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": [], + "status": "🚧" +} diff --git a/json/nginxproxymanager.json b/json/nginxproxymanager.json index 91c3113ab..fbc3b19b6 100644 --- a/json/nginxproxymanager.json +++ b/json/nginxproxymanager.json @@ -2,7 +2,7 @@ "name": "Nginx Proxy Manager", "slug": "nginxproxymanager", "categories": [ - 11 + 21 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/nocodb.json b/json/nocodb.json index fd5763421..6896590ae 100644 --- a/json/nocodb.json +++ b/json/nocodb.json @@ -2,7 +2,7 @@ "name": "NocoDB", "slug": "nocodb", "categories": [ - 14 + 25 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/node-red.json b/json/node-red.json index 8b3c784c5..93d890639 100644 --- a/json/node-red.json +++ b/json/node-red.json @@ -2,7 +2,7 @@ "name": "Node-Red", "slug": "node-red", "categories": [ - 3 + 16 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/nodebb.json b/json/nodebb.json new file mode 100644 index 000000000..85b8c1294 --- /dev/null +++ b/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/NodeBB/NodeBB/refs/heads/master/public/logo.png", + "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/json/notifiarr.json b/json/notifiarr.json index eec092f01..e564f62ed 100644 --- a/json/notifiarr.json +++ b/json/notifiarr.json @@ -2,7 +2,7 @@ "name": "Notifiarr", "slug": "notifiarr", "categories": [ - 18 + 14 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/ntfy.json b/json/ntfy.json index 567d8c757..f3a350cc7 100644 --- a/json/ntfy.json +++ b/json/ntfy.json @@ -2,7 +2,7 @@ "name": "ntfy", "slug": "ntfy", "categories": [ - 0 + 19 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/nzbget.json b/json/nzbget.json index 031eb6e83..18d2f3689 100644 --- a/json/nzbget.json +++ b/json/nzbget.json @@ -2,7 +2,7 @@ "name": "NZBGet", "slug": "nzbget", "categories": [ - 16 + 11 ], "date_created": "2024-10-31", "type": "ct", diff --git a/json/octoprint.json b/json/octoprint.json index f130da279..42ab14ba4 100644 --- a/json/octoprint.json +++ b/json/octoprint.json @@ -2,7 +2,7 @@ "name": "OctoPrint", "slug": "octoprint", "categories": [ - 0 + 24 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/olivetin.json b/json/olivetin.json index 0b06a78a2..a7ca707e9 100644 --- a/json/olivetin.json +++ b/json/olivetin.json @@ -2,7 +2,7 @@ "name": "OliveTin", "slug": "olivetin", "categories": [ - 15 + 10 ], "date_created": "2024-05-02", "type": "misc", diff --git a/json/omada.json b/json/omada.json index 9dc4a76fb..693b7fb37 100644 --- a/json/omada.json +++ b/json/omada.json @@ -2,7 +2,7 @@ "name": "Omada Controller", "slug": "omada", "categories": [ - 11 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/ombi.json b/json/ombi.json index 93f050007..f057af1aa 100644 --- a/json/ombi.json +++ b/json/ombi.json @@ -2,7 +2,7 @@ "name": "Ombi", "slug": "ombi", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/omv.json b/json/omv.json index c1cd8f0af..610eb68aa 100644 --- a/json/omv.json +++ b/json/omv.json @@ -2,7 +2,7 @@ "name": "OpenMediaVault", "slug": "omv", "categories": [ - 12 + 2 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/onedev.json b/json/onedev.json index ce46108d2..a7ae2134f 100644 --- a/json/onedev.json +++ b/json/onedev.json @@ -2,7 +2,7 @@ "name": "OneDev", "slug": "onedev", "categories": [ - 3 + 20 ], "date_created": "2024-11-30", "type": "ct", diff --git a/json/opengist.json b/json/opengist.json index 02e2f841b..dc279e248 100644 --- a/json/opengist.json +++ b/json/opengist.json @@ -2,11 +2,11 @@ "name": "Opengist", "slug": "opengist", "categories": [ - 3 + 20 ], "date_created": "2025-01-14", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 6157, "documentation": null, diff --git a/json/openhab.json b/json/openhab.json index c00187352..1c4ac536a 100644 --- a/json/openhab.json +++ b/json/openhab.json @@ -2,14 +2,14 @@ "name": "openHAB", "slug": "openhab", "categories": [ - 3 + 16 ], "date_created": "2024-05-02", "type": "ct", "updateable": false, "privileged": false, - "interface_port": 8080, - "documentation": null, + "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.", @@ -32,4 +32,4 @@ }, "notes": [], "status": "βœ…" -} \ No newline at end of file +} diff --git a/json/openobserve.json b/json/openobserve.json index 74480438b..474a0add9 100644 --- a/json/openobserve.json +++ b/json/openobserve.json @@ -2,7 +2,7 @@ "name": "OpenObserve", "slug": "openobserve", "categories": [ - 7 + 9 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/openwebui.json b/json/openwebui.json index cf6d24d57..87bec494c 100644 --- a/json/openwebui.json +++ b/json/openwebui.json @@ -2,7 +2,7 @@ "name": "Open WebUI", "slug": "openwebui", "categories": [ - 19 + 20 ], "date_created": "2024-10-24", "type": "ct", diff --git a/json/openwrt.json b/json/openwrt.json index 9fb1dba75..a0f2f8943 100644 --- a/json/openwrt.json +++ b/json/openwrt.json @@ -2,7 +2,7 @@ "name": "OpenWrt", "slug": "openwrt", "categories": [ - 11 + 4 ], "date_created": "2024-05-02", "type": "vm", diff --git a/json/overseerr.json b/json/overseerr.json index 264f67b62..a8bce16ba 100644 --- a/json/overseerr.json +++ b/json/overseerr.json @@ -2,7 +2,7 @@ "name": "Overseerr", "slug": "overseerr", "categories": [ - 12 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/owncast.json b/json/owncast.json index e4baf4993..5a27c089c 100644 --- a/json/owncast.json +++ b/json/owncast.json @@ -2,7 +2,7 @@ "name": "Owncast", "slug": "owncast", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/owncloud-vm.json b/json/owncloud-vm.json index da8c6783a..caee53ea2 100644 --- a/json/owncloud-vm.json +++ b/json/owncloud-vm.json @@ -2,7 +2,7 @@ "name": "ownCloud", "slug": "owncloud-vm", "categories": [ - 12 + 2 ], "date_created": "2024-05-02", "type": "vm", @@ -37,4 +37,4 @@ } ], "status": "❌" -} \ No newline at end of file +} diff --git a/json/pairdrop.json b/json/pairdrop.json index 43bf89805..cb7368a45 100644 --- a/json/pairdrop.json +++ b/json/pairdrop.json @@ -2,7 +2,7 @@ "name": "PairDrop", "slug": "pairdrop", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/paperless-ngx.json b/json/paperless-ngx.json index 4990642b6..bcd658895 100644 --- a/json/paperless-ngx.json +++ b/json/paperless-ngx.json @@ -2,7 +2,7 @@ "name": "Paperless-ngx", "slug": "paperless-ngx", "categories": [ - 14 + 12 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/part-db.json b/json/part-db.json index 2cd3e7ad9..24fd83332 100644 --- a/json/part-db.json +++ b/json/part-db.json @@ -2,7 +2,7 @@ "name": "Part-DB", "slug": "part-db", "categories": [ - 0 + 25 ], "date_created": "2024-12-18", "type": "ct", diff --git a/json/pbs.json b/json/pbs.json index a7d6ff65c..8039ad527 100644 --- a/json/pbs.json +++ b/json/pbs.json @@ -2,7 +2,7 @@ "name": "Proxmox Backup Server", "slug": "pbs", "categories": [ - 11 + 1 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/peanut.json b/json/peanut.json index cd369591f..cf9750cc6 100644 --- a/json/peanut.json +++ b/json/peanut.json @@ -2,7 +2,7 @@ "name": "PeaNUT", "slug": "peanut", "categories": [ - 7 + 4 ], "date_created": "2024-06-14", "type": "ct", diff --git a/json/petio.json b/json/petio.json index 2192a3ba2..bca6fc38c 100644 --- a/json/petio.json +++ b/json/petio.json @@ -2,7 +2,7 @@ "name": "Petio", "slug": "petio", "categories": [ - 12 + 13 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/pf2etools.json b/json/pf2etools.json index 5654209ae..a9e4473c9 100644 --- a/json/pf2etools.json +++ b/json/pf2etools.json @@ -2,7 +2,7 @@ "name": "Pf2eTools", "slug": "Pf2eTools", "categories": [ - 0 + 24 ], "date_created": "2025-01-02", "type": "ct", diff --git a/json/photoprism.json b/json/photoprism.json index 995439d9d..6c617b10f 100644 --- a/json/photoprism.json +++ b/json/photoprism.json @@ -2,7 +2,7 @@ "name": "PhotoPrism", "slug": "photoprism", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/phpipam.json b/json/phpipam.json index 43a792137..9c63cf626 100644 --- a/json/phpipam.json +++ b/json/phpipam.json @@ -2,7 +2,7 @@ "name": "phpIPAM", "slug": "phpipam", "categories": [ - 11 + 4 ], "date_created": "2025-01-15", "type": "ct", diff --git a/json/pialert.json b/json/pialert.json index 64e5d93bd..d279de990 100644 --- a/json/pialert.json +++ b/json/pialert.json @@ -2,7 +2,7 @@ "name": "Pi.Alert", "slug": "pialert", "categories": [ - 7 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/pihole.json b/json/pihole.json index 46e4391f2..19124d1ed 100644 --- a/json/pihole.json +++ b/json/pihole.json @@ -2,7 +2,7 @@ "name": "Pi-Hole", "slug": "pihole", "categories": [ - 13 + 5 ], "date_created": "2024-04-28", "type": "ct", diff --git a/json/pimox-haos-vm.json b/json/pimox-haos-vm.json index a44d0d7fb..59a2630bd 100644 --- a/json/pimox-haos-vm.json +++ b/json/pimox-haos-vm.json @@ -2,7 +2,7 @@ "name": "PiMox HAOS", "slug": "pimox-haos-vm", "categories": [ - 2 + 16 ], "date_created": "2024-04-29", "type": "vm", @@ -37,4 +37,4 @@ } ], "status": "βœ…" -} \ No newline at end of file +} diff --git a/json/pingvin.json b/json/pingvin.json index e251c1355..aed1a3461 100644 --- a/json/pingvin.json +++ b/json/pingvin.json @@ -2,7 +2,7 @@ "name": "Pingvin Share", "slug": "pingvin", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/plex.json b/json/plex.json index 2516249de..4f6ec2c3a 100644 --- a/json/plex.json +++ b/json/plex.json @@ -2,7 +2,7 @@ "name": "Plex Media Server", "slug": "plex", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/pocketbase.json b/json/pocketbase.json index 4f447d72e..210b580b4 100644 --- a/json/pocketbase.json +++ b/json/pocketbase.json @@ -2,7 +2,7 @@ "name": "Pocketbase", "slug": "pocketbase", "categories": [ - 5 + 8 ], "date_created": "2024-05-07", "type": "ct", diff --git a/json/pocketid.json b/json/pocketid.json new file mode 100644 index 000000000..2e9880aa9 --- /dev/null +++ b/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://stonith404.github.io/pocket-id/introduction", + "website": "https://github.com/stonith404/pocket-id", + "logo": "https://raw.githubusercontent.com/stonith404/pocket-id/refs/heads/main/docs/static/img/pocket-id.png", + "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/json/podman-homeassistant.json b/json/podman-homeassistant.json index f8b33c19e..65817a45f 100644 --- a/json/podman-homeassistant.json +++ b/json/podman-homeassistant.json @@ -2,7 +2,7 @@ "name": "Podman Home Assistant Container", "slug": "podman-homeassistant", "categories": [ - 2 + 16 ], "date_created": "2024-04-29", "type": "ct", diff --git a/json/podman.json b/json/podman.json index cc2fd82e9..74141f2c2 100644 --- a/json/podman.json +++ b/json/podman.json @@ -2,7 +2,7 @@ "name": "Podman", "slug": "podman", "categories": [ - 8 + 3 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/post-pmg-install.json b/json/post-pmg-install.json new file mode 100644 index 000000000..442a4c9bf --- /dev/null +++ b/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/home-assistant/brands/master/core_integrations/proxmoxve/icon.png", + "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/json/postgresql.json b/json/postgresql.json index 268911902..e258c0b2d 100644 --- a/json/postgresql.json +++ b/json/postgresql.json @@ -2,7 +2,7 @@ "name": "PostgreSQL", "slug": "postgresql", "categories": [ - 5 + 8 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/projectsend.json b/json/projectsend.json new file mode 100644 index 000000000..fe3ab3a20 --- /dev/null +++ b/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://camo.githubusercontent.com/378a455e1cf6f36c5427b2bdfd78b0defd829be9b8c6b073f83931693e1665d5/68747470733a2f2f7777772e70726f6a65637473656e642e6f72672f70726f6a65637473656e642d6c6f676f2d6e65772e706e67", + "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/json/prometheus-alertmanager.json b/json/prometheus-alertmanager.json index 5d073a399..7ae2fd13a 100644 --- a/json/prometheus-alertmanager.json +++ b/json/prometheus-alertmanager.json @@ -2,7 +2,7 @@ "name": "Prometheus Alertmanager", "slug": "prometheus-alertmanager", "categories": [ - 7 + 9 ], "date_created": "2025-01-09", "type": "ct", diff --git a/json/prometheus-pve-exporter.json b/json/prometheus-pve-exporter.json new file mode 100644 index 000000000..cc028b4b3 --- /dev/null +++ b/json/prometheus-pve-exporter.json @@ -0,0 +1,40 @@ +{ + "name": "Prometheus Proxmox VE Exporter", + "slug": "prometheus-proxmox-ve-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/home-assistant/brands/master/core_integrations/proxmoxve/icon.png", + "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": 1024, + "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/json/prometheus.json b/json/prometheus.json index ce41b474b..b66cef993 100644 --- a/json/prometheus.json +++ b/json/prometheus.json @@ -2,7 +2,7 @@ "name": "Prometheus", "slug": "prometheus", "categories": [ - 7 + 9 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/prowlarr.json b/json/prowlarr.json index f65004e3e..0b2717146 100644 --- a/json/prowlarr.json +++ b/json/prowlarr.json @@ -2,7 +2,7 @@ "name": "Prowlarr", "slug": "prowlarr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/ps5-mqtt.json b/json/ps5-mqtt.json index e29aa977e..65b44e30f 100644 --- a/json/ps5-mqtt.json +++ b/json/ps5-mqtt.json @@ -2,7 +2,7 @@ "name": "PS5-MQTT", "slug": "ps5-mqtt", "categories": [ - 3 + 18 ], "date_created": "2025-01-09", "type": "ct", diff --git a/json/qbittorrent.json b/json/qbittorrent.json index c302a5b33..dd56cc108 100644 --- a/json/qbittorrent.json +++ b/json/qbittorrent.json @@ -2,7 +2,7 @@ "name": "qBittorrent", "slug": "qbittorrent", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/rabbitmq.json b/json/rabbitmq.json index 8a91a11e4..5a306f4d1 100644 --- a/json/rabbitmq.json +++ b/json/rabbitmq.json @@ -2,7 +2,7 @@ "name": "RabbitMQ", "slug": "rabbitmq", "categories": [ - 4 + 18 ], "date_created": "2024-06-27", "type": "ct", diff --git a/json/radarr.json b/json/radarr.json index 3f1e37cb5..9d0388e51 100644 --- a/json/radarr.json +++ b/json/radarr.json @@ -2,7 +2,7 @@ "name": "Radarr", "slug": "radarr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/rdtclient.json b/json/rdtclient.json index 81a714daa..a7dc74350 100644 --- a/json/rdtclient.json +++ b/json/rdtclient.json @@ -2,7 +2,7 @@ "name": "Real-Debrid Torrent Client", "slug": "rdtclient", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/readarr.json b/json/readarr.json index 359b4a8ce..269cbaee1 100644 --- a/json/readarr.json +++ b/json/readarr.json @@ -2,7 +2,7 @@ "name": "Readarr", "slug": "readarr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/readeck.json b/json/readeck.json index 298ba8a1b..21bf077cd 100644 --- a/json/readeck.json +++ b/json/readeck.json @@ -2,7 +2,7 @@ "name": "Readeck", "slug": "readeck", "categories": [ - 0 + 12 ], "date_created": "2024-05-02", "type": "ct", @@ -12,7 +12,7 @@ "documentation": null, "website": "https://readeck.org/", "logo": "https://codeberg.org/readeck/readeck/raw/branch/main/web/media/logo-square.svg", - "description": "Readeck helps you keep all that web content you’ll want to revisit in an hour, tomorrow, or in 20 years.", + "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", diff --git a/json/recyclarr.json b/json/recyclarr.json index 604a1a2c0..5f39ae520 100644 --- a/json/recyclarr.json +++ b/json/recyclarr.json @@ -2,7 +2,7 @@ "name": "Recyclarr", "slug": "recyclarr", "categories": [ - 18 + 14 ], "date_created": "2024-11-15", "type": "ct", diff --git a/json/redis.json b/json/redis.json index 9d6d8ef71..ee4f164d2 100644 --- a/json/redis.json +++ b/json/redis.json @@ -2,7 +2,7 @@ "name": "Redis ", "slug": "redis", "categories": [ - 5 + 8 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/rtsptoweb.json b/json/rtsptoweb.json index 513186c16..aa3546b1a 100644 --- a/json/rtsptoweb.json +++ b/json/rtsptoweb.json @@ -2,7 +2,7 @@ "name": "RTSPtoWeb", "slug": "rtsptoweb", "categories": [ - 0 + 24 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/runtipi.json b/json/runtipi.json index 27fafedd9..016886442 100644 --- a/json/runtipi.json +++ b/json/runtipi.json @@ -2,7 +2,7 @@ "name": "Runtipi", "slug": "runtipi", "categories": [ - 8 + 2 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/sabnzbd.json b/json/sabnzbd.json index e43893094..7fcfb00ee 100644 --- a/json/sabnzbd.json +++ b/json/sabnzbd.json @@ -2,7 +2,7 @@ "name": "SABnzbd", "slug": "sabnzbd", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/scaling-governor.json b/json/scaling-governor.json index 601562503..a289d6ba1 100644 --- a/json/scaling-governor.json +++ b/json/scaling-governor.json @@ -37,4 +37,4 @@ } ], "status": "πŸ§ͺ" -} \ No newline at end of file +} diff --git a/json/semaphore.json b/json/semaphore.json index 5cabdb6f5..f792bf720 100644 --- a/json/semaphore.json +++ b/json/semaphore.json @@ -1,44 +1,45 @@ { - "name": "Semaphore", - "slug": "semaphore", - "categories": [ - 7 - ], - "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://docs.semaphoreui.com/favicon.png?x=", - "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 + "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://docs.semaphoreui.com/favicon.png?x=", + "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", + }, - "notes": [ - { - "text": "This instance uses BoltDB", - "type": "info" - }, - { - "text": "Admin password: `cat ~/semaphore.creds`", - "type": "info" - } - ], - "status": "🚧" + { + "text": "Admin password: `cat ~/semaphore.creds`", + "type": "info" + } + ], + "status": "🚧" } \ No newline at end of file diff --git a/json/sftpgo.json b/json/sftpgo.json index 7031db077..8ee62be99 100644 --- a/json/sftpgo.json +++ b/json/sftpgo.json @@ -2,7 +2,7 @@ "name": "SFTPGo", "slug": "sftpgo", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/shinobi.json b/json/shinobi.json index 86049593f..016af2504 100644 --- a/json/shinobi.json +++ b/json/shinobi.json @@ -2,7 +2,7 @@ "name": "Shinobi NVR", "slug": "shinobi", "categories": [ - 17 + 15 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/silverbullet.json b/json/silverbullet.json index 9f6eaf274..f3777db0b 100644 --- a/json/silverbullet.json +++ b/json/silverbullet.json @@ -2,7 +2,7 @@ "name": "Silverbullet", "slug": "silverbullet", "categories": [ - 14 + 12 ], "date_created": "2024-12-03", "type": "ct", diff --git a/json/smokeping.json b/json/smokeping.json index f02fdd5ea..32e0d6313 100644 --- a/json/smokeping.json +++ b/json/smokeping.json @@ -2,7 +2,7 @@ "name": "SmokePing", "slug": "smokeping", "categories": [ - 7 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/snipeit.json b/json/snipeit.json index b925f6855..563e05aa7 100644 --- a/json/snipeit.json +++ b/json/snipeit.json @@ -2,7 +2,7 @@ "name": "SnipeIT", "slug": "snipeit", "categories": [ - 8 + 25 ], "date_created": "2024-12-02", "type": "ct", diff --git a/json/sonarr.json b/json/sonarr.json index c463163b2..d1312674a 100644 --- a/json/sonarr.json +++ b/json/sonarr.json @@ -2,7 +2,7 @@ "name": "Sonarr", "slug": "sonarr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/spoolman.json b/json/spoolman.json index 6bb15d607..5c04e5a1c 100644 --- a/json/spoolman.json +++ b/json/spoolman.json @@ -2,7 +2,7 @@ "name": "Spoolman", "slug": "spoolman", "categories": [ - 0 + 24 ], "date_created": "2024-06-13", "type": "ct", diff --git a/json/sqlserver2022.json b/json/sqlserver2022.json new file mode 100644 index 000000000..818b88c4d --- /dev/null +++ b/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/json/stirling-pdf.json b/json/stirling-pdf.json index 28969df8d..4fddbb783 100644 --- a/json/stirling-pdf.json +++ b/json/stirling-pdf.json @@ -2,7 +2,7 @@ "name": "Stirling-PDF", "slug": "stirling-pdf", "categories": [ - 14 + 12 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/syncthing.json b/json/syncthing.json index 70bb0535a..a450e3959 100644 --- a/json/syncthing.json +++ b/json/syncthing.json @@ -2,7 +2,7 @@ "name": "Syncthing", "slug": "syncthing", "categories": [ - 16 + 12 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/tandoor.json b/json/tandoor.json index fb0bfc554..09319641b 100644 --- a/json/tandoor.json +++ b/json/tandoor.json @@ -2,7 +2,7 @@ "name": "Tandoor Recipes", "slug": "tandoor", "categories": [ - 0 + 24 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/tasmoadmin.json b/json/tasmoadmin.json index 5aa9faf95..50fd57bb3 100644 --- a/json/tasmoadmin.json +++ b/json/tasmoadmin.json @@ -2,7 +2,7 @@ "name": "TasmoAdmin", "slug": "tasmoadmin", "categories": [ - 0 + 16 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/tautulli.json b/json/tautulli.json index 383c807f7..90c353f76 100644 --- a/json/tautulli.json +++ b/json/tautulli.json @@ -2,7 +2,7 @@ "name": "Tautulli", "slug": "tautulli", "categories": [ - 12 + 13 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/tdarr.json b/json/tdarr.json index 34aeee951..65cfb5581 100644 --- a/json/tdarr.json +++ b/json/tdarr.json @@ -2,7 +2,7 @@ "name": "Tdarr", "slug": "tdarr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/technitiumdns.json b/json/technitiumdns.json index 4f76c94e3..507e93fad 100644 --- a/json/technitiumdns.json +++ b/json/technitiumdns.json @@ -2,7 +2,7 @@ "name": "Technitium DNS", "slug": "technitiumdns", "categories": [ - 13 + 5 ], "date_created": "2024-04-28", "type": "ct", diff --git a/json/teddycloud.json b/json/teddycloud.json index f6195adfc..0664cc29d 100644 --- a/json/teddycloud.json +++ b/json/teddycloud.json @@ -2,7 +2,7 @@ "name": "TeddyCloud", "slug": "teddycloud", "categories": [ - 12 + 13 ], "date_created": "2024-12-28", "type": "ct", diff --git a/json/the-lounge.json b/json/the-lounge.json index c59f520f3..8adb24625 100644 --- a/json/the-lounge.json +++ b/json/the-lounge.json @@ -2,7 +2,7 @@ "name": "The Lounge", "slug": "the-lounge", "categories": [ - 0 + 22 ], "date_created": "2024-11-28", "type": "ct", @@ -31,10 +31,10 @@ "password": null }, "notes": [ - { - "text": "The Lounge is running in private mode. Use `sudo -u thelounge thelounge add name` to create users.", - "type": "info" - } + { + "text": "The Lounge is running in private mode. Use `runuser -u thelounge -- thelounge add usernamehere` to create users.", + "type": "info" + } ], "status": "🚧" -} \ No newline at end of file + } diff --git a/json/threadfin.json b/json/threadfin.json index 55470f74c..35fb240f9 100644 --- a/json/threadfin.json +++ b/json/threadfin.json @@ -2,7 +2,7 @@ "name": "Threadfin", "slug": "threadfin", "categories": [ - 12 + 13 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/tianji.json b/json/tianji.json index 30eefbb36..0444772d2 100644 --- a/json/tianji.json +++ b/json/tianji.json @@ -2,7 +2,7 @@ "name": "Tianji", "slug": "tianji", "categories": [ - 7 + 9 ], "date_created": "2024-09-14", "type": "ct", diff --git a/json/traefik.json b/json/traefik.json index 4f14e5c2f..2b13205a7 100644 --- a/json/traefik.json +++ b/json/traefik.json @@ -2,7 +2,7 @@ "name": "Traefik", "slug": "traefik", "categories": [ - 11 + 21 ], "date_created": "2024-05-20", "type": "ct", diff --git a/json/transmission.json b/json/transmission.json index d9b2609b2..10fb0c0db 100644 --- a/json/transmission.json +++ b/json/transmission.json @@ -2,7 +2,7 @@ "name": "Transmission", "slug": "transmission", "categories": [ - 16 + 11 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/trilium.json b/json/trilium.json index 30d818e99..b6d2b32e6 100644 --- a/json/trilium.json +++ b/json/trilium.json @@ -2,7 +2,7 @@ "name": "Trilium", "slug": "trilium", "categories": [ - 14 + 12 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/turnkey.json b/json/turnkey.json index 1df89e872..9290f5d92 100644 --- a/json/turnkey.json +++ b/json/turnkey.json @@ -2,7 +2,7 @@ "name": "TurnKey", "slug": "turnkey", "categories": [ - 10 + 2 ], "date_created": "2024-05-02", "type": "turnkey", diff --git a/json/typesense.json b/json/typesense.json index a25af31e7..b813c0b71 100644 --- a/json/typesense.json +++ b/json/typesense.json @@ -2,7 +2,7 @@ "name": "TypeSense", "slug": "typesense", "categories": [ - 5 + 20 ], "date_created": "2025-01-06", "type": "ct", diff --git a/json/ubuntu.json b/json/ubuntu.json index ac2a46b85..b6fbf5064 100644 --- a/json/ubuntu.json +++ b/json/ubuntu.json @@ -2,7 +2,7 @@ "name": "Ubuntu", "slug": "ubuntu", "categories": [ - 9 + 2 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/ubuntu2204-vm.json b/json/ubuntu2204-vm.json index afbcc3654..401881c76 100644 --- a/json/ubuntu2204-vm.json +++ b/json/ubuntu2204-vm.json @@ -2,7 +2,7 @@ "name": "Ubuntu 22.04", "slug": "ubuntu2204-vm", "categories": [ - 9 + 2 ], "date_created": "2024-05-02", "type": "vm", @@ -20,7 +20,7 @@ "resources": { "cpu": 2, "ram": 2048, - "hdd": 2, + "hdd": 5, "os": null, "version": null } @@ -32,4 +32,4 @@ }, "notes": [], "status": "πŸ§ͺ" -} \ No newline at end of file +} diff --git a/json/ubuntu2404-vm.json b/json/ubuntu2404-vm.json index 012ce4eab..e6c967dd1 100644 --- a/json/ubuntu2404-vm.json +++ b/json/ubuntu2404-vm.json @@ -2,7 +2,7 @@ "name": "Ubuntu 24.04", "slug": "ubuntu2404-vm", "categories": [ - 9 + 2 ], "date_created": "2024-05-02", "type": "vm", @@ -20,7 +20,7 @@ "resources": { "cpu": 2, "ram": 2048, - "hdd": 2, + "hdd": 7, "os": null, "version": null } @@ -32,4 +32,4 @@ }, "notes": [], "status": "πŸ§ͺ" -} \ No newline at end of file +} diff --git a/json/ubuntu2410-vm.json b/json/ubuntu2410-vm.json new file mode 100644 index 000000000..a1715368a --- /dev/null +++ b/json/ubuntu2410-vm.json @@ -0,0 +1,34 @@ +{ + "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://assets.ubuntu.com/v1/29985a98-ubuntu-logo32.png", + "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": [] +} diff --git a/json/umami.json b/json/umami.json index ebb878bd1..db38f1041 100644 --- a/json/umami.json +++ b/json/umami.json @@ -2,7 +2,7 @@ "name": "Umami", "slug": "umami", "categories": [ - 7 + 9 ], "date_created": "2024-05-09", "type": "ct", diff --git a/json/unbound.json b/json/unbound.json index 0e2b8766f..58b228397 100644 --- a/json/unbound.json +++ b/json/unbound.json @@ -2,7 +2,7 @@ "name": "Unbound", "slug": "unbound", "categories": [ - 13 + 5 ], "date_created": "2024-12-02", "type": "ct", diff --git a/json/unifi.json b/json/unifi.json index a78af0eed..a68854e35 100644 --- a/json/unifi.json +++ b/json/unifi.json @@ -2,7 +2,7 @@ "name": "UniFi Network Server", "slug": "unifi", "categories": [ - 11 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/unmanic.json b/json/unmanic.json index 46baf26ab..fb6ee683f 100644 --- a/json/unmanic.json +++ b/json/unmanic.json @@ -2,7 +2,7 @@ "name": "Unmanic", "slug": "unmanic", "categories": [ - 12 + 0 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/uptimekuma.json b/json/uptimekuma.json index 59505c409..2e4dde7b8 100644 --- a/json/uptimekuma.json +++ b/json/uptimekuma.json @@ -2,7 +2,7 @@ "name": "Uptime Kuma", "slug": "uptimekuma", "categories": [ - 7 + 9 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/urbackupserver.json b/json/urbackupserver.json new file mode 100644 index 000000000..14c35bfba --- /dev/null +++ b/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://forums.urbackup.org/uploads/default/original/2X/1/1051fd74d1dcbc3ad4220b43007fcab5287272b0.png", + "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/json/vaultwarden.json b/json/vaultwarden.json index 0419c6ab7..26e1d904e 100644 --- a/json/vaultwarden.json +++ b/json/vaultwarden.json @@ -2,7 +2,7 @@ "name": "Vaultwarden", "slug": "vaultwarden", "categories": [ - 0 + 6 ], "date_created": "2024-05-02", "type": "ct", @@ -31,9 +31,9 @@ "resources": { "cpu": 1, "ram": 256, - "hdd": 0.3, + "hdd": 0.5, "os": "alpine", - "version": "3.19" + "version": "3.21" } } ], diff --git a/json/vikunja.json b/json/vikunja.json index df8928d9b..645f9f661 100644 --- a/json/vikunja.json +++ b/json/vikunja.json @@ -2,7 +2,7 @@ "name": "Vikunja", "slug": "vikunja", "categories": [ - 14 + 12 ], "date_created": "2024-11-05", "type": "ct", diff --git a/json/wallos.json b/json/wallos.json index f87b3268a..83fdd8d37 100644 --- a/json/wallos.json +++ b/json/wallos.json @@ -30,6 +30,5 @@ "username": null, "password": null }, - "notes": [], - "status": "🚧" -} \ No newline at end of file + "notes": [] +} diff --git a/json/wastebin.json b/json/wastebin.json index 35b22baf8..51291a1da 100644 --- a/json/wastebin.json +++ b/json/wastebin.json @@ -2,7 +2,7 @@ "name": "Wastebin", "slug": "wastebin", "categories": [ - 0 + 12 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/watchyourlan.json b/json/watchyourlan.json index e065dfe1d..edc36cc64 100644 --- a/json/watchyourlan.json +++ b/json/watchyourlan.json @@ -2,7 +2,7 @@ "name": "WatchYourLAN", "slug": "watchyourlan", "categories": [ - 7 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/wavelog.json b/json/wavelog.json index 1d97e92fd..e4d173e66 100644 --- a/json/wavelog.json +++ b/json/wavelog.json @@ -2,7 +2,7 @@ "name": "Wavelog", "slug": "wavelog", "categories": [ - 0 + 24 ], "date_created": "2024-11-12", "type": "ct", diff --git a/json/webmin.json b/json/webmin.json index 21715efa6..524d10e71 100644 --- a/json/webmin.json +++ b/json/webmin.json @@ -2,7 +2,7 @@ "name": "Webmin System Administration", "slug": "webmin", "categories": [ - 11 + 1 ], "date_created": "2024-05-02", "type": "misc", diff --git a/json/whisparr.json b/json/whisparr.json index d65d3df5f..cc82644fe 100644 --- a/json/whisparr.json +++ b/json/whisparr.json @@ -2,7 +2,7 @@ "name": "Whisparr", "slug": "whisparr", "categories": [ - 18 + 14 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/wikijs.json b/json/wikijs.json index c690d2ffd..6bad2d320 100644 --- a/json/wikijs.json +++ b/json/wikijs.json @@ -2,7 +2,7 @@ "name": "Wiki.js", "slug": "wikijs", "categories": [ - 14 + 12 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/wireguard.json b/json/wireguard.json index 50fba321e..49192bd2f 100644 --- a/json/wireguard.json +++ b/json/wireguard.json @@ -2,7 +2,7 @@ "name": "WireGuard", "slug": "wireguard", "categories": [ - 11 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/wordpress.json b/json/wordpress.json index fcf3ca039..188b493b8 100644 --- a/json/wordpress.json +++ b/json/wordpress.json @@ -2,7 +2,7 @@ "name": "Wordpress", "slug": "wordpress", "categories": [ - 14 + 21 ], "date_created": "2025-01-14", "type": "ct", diff --git a/json/yunohost.json b/json/yunohost.json index 9cc90d0f8..0570f4926 100644 --- a/json/yunohost.json +++ b/json/yunohost.json @@ -2,7 +2,7 @@ "name": "YunoHost", "slug": "yunohost", "categories": [ - 11 + 2 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/zabbix.json b/json/zabbix.json index 7319ac567..6b95be7c0 100644 --- a/json/zabbix.json +++ b/json/zabbix.json @@ -2,7 +2,7 @@ "name": "Zabbix", "slug": "zabbix", "categories": [ - 7 + 9 ], "date_created": "2024-06-12", "type": "ct", diff --git a/json/zammad.json b/json/zammad.json index d32e2b099..4537a740e 100644 --- a/json/zammad.json +++ b/json/zammad.json @@ -1,35 +1,35 @@ { - "name": "Zammad", - "slug": "zammad", - "categories": [ - 11 - ], - "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/zammad/zammad/refs/heads/develop/public/assets/images/logo.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": [], - "status": "🚧" -} \ No newline at end of file + "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/zammad/zammad/refs/heads/develop/public/assets/images/logo.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": [], + "status": "🚧" +} diff --git a/json/zigbee2mqtt.json b/json/zigbee2mqtt.json index aee10ccfe..30b2bdf68 100644 --- a/json/zigbee2mqtt.json +++ b/json/zigbee2mqtt.json @@ -2,7 +2,7 @@ "name": "Zigbee2MQTT", "slug": "zigbee2mqtt", "categories": [ - 6 + 17 ], "date_created": "2024-05-02", "type": "ct", @@ -33,7 +33,7 @@ "ram": 256, "hdd": 0.3, "os": "alpine", - "version": "3.19" + "version": "3.21" } } ], diff --git a/json/zipline.json b/json/zipline.json index 1127ab03d..dc5ac62f2 100644 --- a/json/zipline.json +++ b/json/zipline.json @@ -2,7 +2,7 @@ "name": "Zipline", "slug": "zipline", "categories": [ - 16 + 11 ], "date_created": "2024-09-16", "type": "ct", diff --git a/json/zoraxy.json b/json/zoraxy.json index a7d2bf8ae..32fa62742 100644 --- a/json/zoraxy.json +++ b/json/zoraxy.json @@ -2,7 +2,7 @@ "name": "Zoraxy", "slug": "zoraxy", "categories": [ - 11 + 4 ], "date_created": "2024-05-02", "type": "ct", diff --git a/json/zwave-js-ui.json b/json/zwave-js-ui.json index db0ef066e..94a5ee23e 100644 --- a/json/zwave-js-ui.json +++ b/json/zwave-js-ui.json @@ -2,7 +2,7 @@ "name": "Z-Wave JS UI", "slug": "zwave-js-ui", "categories": [ - 6 + 17 ], "date_created": "2024-05-02", "type": "ct", diff --git a/misc/.app-headers b/misc/.app-headers index 642c14ae0..ebdb0ed60 100644 --- a/misc/.app-headers +++ b/misc/.app-headers @@ -1,4 +1,4 @@ -### Generated on 01-18-2025 +### Generated on 01-24-2025 ################################################## ### 2fauth.sh @@ -235,6 +235,15 @@ APP=Bazarr /_____/\__,_/ /___/\__,_/_/ /_/ +### beszel.sh +APP=Beszel + ____ __ + / __ )___ _________ ___ / / + / __ / _ \/ ___/_ / / _ \/ / + / /_/ / __(__ ) / /_/ __/ / +/_____/\___/____/ /___/\___/_/ + + ### blocky.sh APP=Blocky ____ __ __ @@ -1459,6 +1468,15 @@ APP=PostgreSQL /_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/ /____/ +### projectsend.sh +APP=ProjectSend + ____ _ __ _____ __ + / __ \_________ (_)__ _____/ /_/ ___/___ ____ ____/ / + / /_/ / ___/ __ \ / / _ \/ ___/ __/\__ \/ _ \/ __ \/ __ / + / ____/ / / /_/ / / / __/ /__/ /_ ___/ / __/ / / / /_/ / +/_/ /_/ \____/_/ /\___/\___/\__//____/\___/_/ /_/\__,_/ + /___/ + ### prometheus-alertmanager.sh APP=Prometheus-Alertmanager ____ __ __ ___ __ @@ -1693,6 +1711,21 @@ APP=Spoolman /____/ .___/\____/\____/_/_/ /_/ /_/\__,_/_/ /_/ /_/ +### sqlserver2022.sh +APP=SQL Server 2022 + _____ ____ __ _____ + / ___// __ \ / / / ___/___ ______ _____ _____ + \__ \/ / / / / / \__ \/ _ \/ ___/ | / / _ \/ ___/ + ___/ / /_/ / / /___ ___/ / __/ / | |/ / __/ / +/____/\___\_\/_____/ /____/\___/_/ |___/\___/_/ + + ___ ____ ___ ___ + |__ \ / __ \__ \|__ \ + __/ // / / /_/ /__/ / + / __// /_/ / __// __/ +/____/\____/____/____/ + + ### stirling-pdf.sh APP=Stirling-PDF _____ __ _ ___ ____ ____ ______ @@ -1900,6 +1933,21 @@ APP=Uptime Kuma \____/ .___/\__/_/_/ /_/ /_/\___/ /_/ |_\__,_/_/ /_/ /_/\__,_/ /_/ +### urbackupserver.sh +APP=UrBackup Server + __ __ ____ __ + / / / /____/ __ )____ ______/ /____ ______ + / / / / ___/ __ / __ `/ ___/ //_/ / / / __ \ +/ /_/ / / / /_/ / /_/ / /__/ ,< / /_/ / /_/ / +\____/_/ /_____/\__,_/\___/_/|_|\__,_/ .___/ + /_/ + _____ + / ___/___ ______ _____ _____ + \__ \/ _ \/ ___/ | / / _ \/ ___/ + ___/ / __/ / | |/ / __/ / +/____/\___/_/ |___/\___/_/ + + ### vaultwarden.sh APP=Vaultwarden _ __ ____ __ diff --git a/misc/alpine-install.func b/misc/alpine-install.func index 25922b386..b727b8eca 100644 --- a/misc/alpine-install.func +++ b/misc/alpine-install.func @@ -145,17 +145,16 @@ motd_ssh() { OS_NAME="Alpine Linux" OS_VERSION="Unknown" fi - # Set MOTD with application info and system details - MOTD_FILE="/etc/motd" - if [ -f "$MOTD_FILE" ]; then - echo -e "\n${BOLD}${APPLICATION} LXC Container${CL}" > "$MOTD_FILE" - echo -e "${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| Project: ${GN}ProxmoxVE ${YW}| GitHub: ${GN}https://github.com/asylumexp/Proxmox${CL}\n" >> "$MOTD_FILE" - echo -e "${TAB}${OS}${YW} OS: ${GN}${OS_NAME} ${OS_VERSION}${CL}" >> "$MOTD_FILE" - echo -e "${TAB}${HOSTNAME}${YW} Hostname: ${GN}$(hostname)${CL}" >> "$MOTD_FILE" - echo -e "${TAB}${INFO}${YW} IP Address: ${GN}${IP}${CL}" >> "$MOTD_FILE" - else - echo -e "${RD}[WARNING] MOTD file does not exist!${CL}" >&2 - fi + + PROFILE_FILE="/etc/profile.d/00_lxc-details.sh" + echo "echo -e \"\"" > "$PROFILE_FILE" + echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >> "$PROFILE_FILE" + echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts & pimox-scripts ${YW}| GitHub: ${GN}https://github.com/asylumexp/Proxmox${CL}\"" >> "$PROFILE_FILE" + echo "echo \"\"" >> "$PROFILE_FILE" + echo -e "echo -e \"${TAB}${OS}${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}\"" >> "$PROFILE_FILE" + echo -e "echo -e \"${TAB}${HOSTNAME}${YW} Hostname: ${GN}\$(hostname)${CL}\"" >> "$PROFILE_FILE" + echo -e "echo -e \"${TAB}${INFO}${YW} IP Address: ${GN}\$(ip -4 addr show eth0 | awk '/inet / {print \$2}' | cut -d/ -f1 | head -n 1)${CL}\"" >> "$PROFILE_FILE" + # Configure SSH if enabled if [[ "${SSH_ROOT}" == "yes" ]]; then # Enable sshd service diff --git a/misc/build.func b/misc/build.func index ed5879673..5936ebd36 100644 --- a/misc/build.func +++ b/misc/build.func @@ -7,7 +7,9 @@ variables() { NSAPP=$(echo ${APP,,} | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces. var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP. INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern. - PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase + PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase + DIAGNOSTICS="yes" # sets the DIAGNOSTICS variable to "yes", used for the API call. + METHOD="default" # sets the METHOD variable to "default", used for the API call. } # This function sets various color variables using ANSI escape codes for formatting text in the terminal. @@ -142,7 +144,53 @@ pve_check() { echo -e "Exiting..." sleep 2 exit -fi + fi +} + +# When a node is running tens of containers, it's possible to exceed the kernel's cryptographic key storage allocations. +# These are tuneable, so verify if the currently deployment is approaching the limits, advise the user on how to tune the limits, and exit the script. +# https://cleveruptime.com/docs/files/proc-key-users | https://docs.kernel.org/security/keys/core.html +maxkeys_check() { + # Read kernel parameters + per_user_maxkeys=$(cat /proc/sys/kernel/keys/maxkeys 2>/dev/null || echo 0) + per_user_maxbytes=$(cat /proc/sys/kernel/keys/maxbytes 2>/dev/null || echo 0) + + # Exit if kernel parameters are unavailable + if [[ "$per_user_maxkeys" -eq 0 || "$per_user_maxbytes" -eq 0 ]]; then + echo -e "${CROSS}${RD} Error: Unable to read kernel parameters. Ensure proper permissions.${CL}" + exit 1 + fi + + # Fetch key usage for user ID 100000 (typical for containers) + used_lxc_keys=$(awk '/100000:/ {print $2}' /proc/key-users 2>/dev/null || echo 0) + used_lxc_bytes=$(awk '/100000:/ {split($5, a, "/"); print a[1]}' /proc/key-users 2>/dev/null || echo 0) + + # Calculate thresholds and suggested new limits + threshold_keys=$((per_user_maxkeys - 100)) + threshold_bytes=$((per_user_maxbytes - 1000)) + new_limit_keys=$((per_user_maxkeys * 2)) + new_limit_bytes=$((per_user_maxbytes * 2)) + + # Check if key or byte usage is near limits + failure=0 + if [[ "$used_lxc_keys" -gt "$threshold_keys" ]]; then + echo -e "${CROSS}${RD} Warning: Key usage is near the limit (${used_lxc_keys}/${per_user_maxkeys}).${CL}" + echo -e "${INFO} Suggested action: Set ${GN}kernel.keys.maxkeys=${new_limit_keys}${CL} in ${BOLD}/etc/sysctl.d/98-community-scripts.conf${CL}." + failure=1 + fi + if [[ "$used_lxc_bytes" -gt "$threshold_bytes" ]]; then + echo -e "${CROSS}${RD} Warning: Key byte usage is near the limit (${used_lxc_bytes}/${per_user_maxbytes}).${CL}" + echo -e "${INFO} Suggested action: Set ${GN}kernel.keys.maxbytes=${new_limit_bytes}${CL} in ${BOLD}/etc/sysctl.d/98-community-scripts.conf${CL}." + failure=1 + fi + + # Provide next steps if issues are detected + if [[ "$failure" -eq 1 ]]; then + echo -e "${INFO} To apply changes, run: ${BOLD}service procps force-reload${CL}" + exit 1 + fi + + echo -e "${CM}${GN} All kernel key limits are within safe thresholds.${CL}" } # This function checks the system architecture and exits if it's not "amd64". @@ -175,76 +223,52 @@ get_current_ip() { # Function to update the IP address in the MOTD file update_motd_ip() { MOTD_FILE="/etc/motd" - + if [ -f "$MOTD_FILE" ]; then # Remove existing IP Address lines to prevent duplication sed -i '/IP Address:/d' "$MOTD_FILE" - + IP=$(get_current_ip) # Add the new IP address echo -e "${TAB}${NETWORK}${YW} IP Address: ${GN}${IP}${CL}" >> "$MOTD_FILE" fi } -# This function sets the APP-Name into an ASCII Header in Slant, figlet needed on proxmox main node. -header_info() { - # Helper function: Install FIGlet and download fonts - install_figlet() { - echo -e "${INFO}${BOLD}${DGN}Installing FIGlet...${CL}" +# Function to download & save header files +get_header() { + local app_name=$(echo ${APP,,} | tr -d ' ') + local header_url="https://github.com/community-scripts/ProxmoxVE/raw/main/ct/headers/${app_name}" + local local_header_path="/usr/local/community-scripts/headers/${app_name}" - temp_dir=$(mktemp -d) - curl -sL https://github.com/asylumexp/Proxmox/raw/refs/heads/main/misc/figlet.tar.xz -o "$temp_dir/figlet.tar.xz" - mkdir -p /tmp/figlet - tar -xf "$temp_dir/figlet.tar.xz" -C /tmp/figlet --strip-components=1 - cd /tmp/figlet - make >/dev/null + mkdir -p "/usr/local/community-scripts/headers" - if [ -f "figlet" ]; then - chmod +x figlet - mv figlet /usr/local/bin/ - mkdir -p /usr/local/share/figlet - cp -r /tmp/figlet/fonts/*.flf /usr/local/share/figlet/ - echo -e "${CM}${BOLD}${DGN}FIGlet successfully installed.${CL}" - else - echo -e "${ERR}${BOLD}${RED}Failed to install FIGlet.${CL}" + # Check if local file already present + if [ ! -f "$local_header_path" ]; then + wget -qO "$local_header_path" "$header_url" + if [ $? -ne 0 ]; then + echo -e "${WARN}${BOLD}${YLW}Failed to download header for ${app_name}. No header will be displayed.${CL}" return 1 fi - rm -rf "$temp_dir" - } - - # Check if figlet and the slant font are available - if ! figlet -f slant "Test" &>/dev/null; then - echo -e "${INFO}${BOLD}${DGN}FIGlet or the slant font is missing. Installing...${CL}" - - if [ -f /etc/debian_version ] || [ -f /etc/lsb-release ]; then - # Debian/Ubuntu-based systems - apt-get update -y &>/dev/null - apt-get install -y wget build-essential &>/dev/null - install_figlet - - elif [ -f /etc/alpine-release ]; then - # Alpine-based systems - apk add --no-cache tar xz build-base wget &>/dev/null - export TERM=xterm - install_figlet - - else - echo -e "${ERR}${BOLD}${RED}Unsupported operating system.${CL}" - return 1 - fi - - # Ensure the slant font is available - if [ ! -f "/usr/share/figlet/slant.flf" ]; then - echo -e "${INFO}${BOLD}${DGN}Downloading slant font...${CL}" - wget -qO /usr/share/figlet/slant.flf "http://www.figlet.org/fonts/slant.flf" - fi fi + cat "$local_header_path" +} - # Display ASCII header +# This function sets the APP-Name into an ASCII Header in Slant, figlet needed on proxmox main node. +header_info() { + local app_name=$(echo ${APP,,} | tr -d ' ') + local header_content + + # Download & save Header-File locally + header_content=$(get_header "$app_name") + if [ $? -ne 0 ]; then + # Fallback: Doesn't show Header + return 0 + fi + + # Show ASCII-Header term_width=$(tput cols 2>/dev/null || echo 120) - ascii_art=$(figlet -f slant -w "$term_width" "$APP") clear - echo "$ascii_art" + echo "$header_content" } # This function checks if the script is running through SSH and prompts the user to confirm if they want to proceed or exit. @@ -335,74 +359,164 @@ exit_script() { # This function allows the user to configure advanced settings for the script. advanced_settings() { whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Here is an instructional tip:" "To make a selection, use the Spacebar." 8 58 - whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Default distribution for $APP" "${var_os} ${var_version} \n \nIf the default Linux distribution is not adhered to, script support will be discontinued. \n" 10 58 + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Default distribution for $APP" "Default is: ${var_os} ${var_version} \n \nIf the default Linux distribution is not adhered to, script support will be discontinued. \n" 10 58 if [ "$var_os" != "alpine" ]; then + var_default_os="${var_os}" var_os="" while [ -z "$var_os" ]; do - if var_os=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISTRIBUTION" --radiolist "Choose Distribution:" 10 58 2 \ - "debian" "" OFF \ - "ubuntu" "" OFF \ - 3>&1 1>&2 2>&3); then - if [ -n "$var_os" ]; then - echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}" + if [ "$var_default_os" == "debian" ]; then + if var_os=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISTRIBUTION" --radiolist "Choose Distribution" 10 58 2 \ + "debian" "" ON \ + "ubuntu" "" OFF \ + 3>&1 1>&2 2>&3); then + if [ -n "$var_os" ]; then + echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}" + fi + else + exit_script + fi + fi + if [ "$var_default_os" == "ubuntu" ]; then + if var_os=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISTRIBUTION" --radiolist "Choose Distribution" 10 58 2 \ + "debian" "" OFF \ + "ubuntu" "" ON \ + 3>&1 1>&2 2>&3); then + if [ -n "$var_os" ]; then + echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}" + fi + else + exit_script fi - else - exit_script fi done fi if [ "$var_os" == "debian" ]; then + var_default_version="${var_version}" var_version="" while [ -z "$var_version" ]; do - if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DEBIAN VERSION" --radiolist "Choose Version" 10 58 2 \ - "11" "Bullseye" OFF \ - "12" "Bookworm" OFF \ - 3>&1 1>&2 2>&3); then - if [ -n "$var_version" ]; then - echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}" + if [ "$var_default_version" == "11" ]; then + if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DEBIAN VERSION" --radiolist "Choose Version" 10 58 2 \ + "11" "Bullseye" ON \ + "12" "Bookworm" OFF \ + 3>&1 1>&2 2>&3); then + if [ -n "$var_version" ]; then + echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}" + fi + else + exit_script + fi + fi + if [ "$var_default_version" == "12" ]; then + if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DEBIAN VERSION" --radiolist "Choose Version" 10 58 2 \ + "11" "Bullseye" OFF \ + "12" "Bookworm" ON \ + 3>&1 1>&2 2>&3); then + if [ -n "$var_version" ]; then + echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}" + fi + else + exit_script fi - else - exit_script fi done fi if [ "$var_os" == "ubuntu" ]; then + var_default_version="${var_version}" var_version="" while [ -z "$var_version" ]; do - if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \ - "20.04" "Focal" OFF \ - "22.04" "Jammy" OFF \ - "24.04" "Noble" OFF \ - "24.10" "Oracular" OFF \ - 3>&1 1>&2 2>&3); then - if [ -n "$var_version" ]; then - echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}" + if [ "$var_default_version" == "20.04" ]; then + if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \ + "20.04" "Focal" ON \ + "22.04" "Jammy" OFF \ + "24.04" "Noble" OFF \ + "24.10" "Oracular" OFF \ + 3>&1 1>&2 2>&3); then + if [ -n "$var_version" ]; then + echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}" + fi + else + exit_script + fi + elif [ "$var_default_version" == "22.04" ]; then + if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \ + "20.04" "Focal" OFF \ + "22.04" "Jammy" ON \ + "24.04" "Noble" OFF \ + "24.10" "Oracular" OFF \ + 3>&1 1>&2 2>&3); then + if [ -n "$var_version" ]; then + echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}" + fi + else + exit_script + fi + elif [ "$var_default_version" == "24.04" ]; then + if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \ + "20.04" "Focal" OFF \ + "22.04" "Jammy" OFF \ + "24.04" "Noble" ON \ + "24.10" "Oracular" OFF \ + 3>&1 1>&2 2>&3); then + if [ -n "$var_version" ]; then + echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}" + fi + else + exit_script fi else - exit_script + if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \ + "20.04" "Focal" OFF \ + "22.04" "Jammy" OFF \ + "24.04" "Noble" OFF \ + "24.10" "Oracular" ON \ + 3>&1 1>&2 2>&3); then + if [ -n "$var_version" ]; then + echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}" + fi + else + exit_script + fi fi done fi # Setting Default Tag for Advanced Settings TAGS="community-script;${var_tags:-}" - + CT_DEFAULT_TYPE="${CT_TYPE}" CT_TYPE="" while [ -z "$CT_TYPE" ]; do - if CT_TYPE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \ - "1" "Unprivileged" OFF \ - "0" "Privileged" OFF \ - 3>&1 1>&2 2>&3); then - if [ -n "$CT_TYPE" ]; then - CT_TYPE_DESC="Unprivileged" - if [ "$CT_TYPE" -eq 0 ]; then - CT_TYPE_DESC="Privileged" + if [ "$CT_DEFAULT_TYPE" == "1" ]; then + if CT_TYPE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \ + "1" "Unprivileged" ON \ + "0" "Privileged" OFF \ + 3>&1 1>&2 2>&3); then + if [ -n "$CT_TYPE" ]; then + CT_TYPE_DESC="Unprivileged" + if [ "$CT_TYPE" -eq 0 ]; then + CT_TYPE_DESC="Privileged" + fi + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Container Type: ${BGN}$CT_TYPE_DESC${CL}" fi - echo -e "${CONTAINERTYPE}${BOLD}${DGN}Container Type: ${BGN}$CT_TYPE_DESC${CL}" + else + exit_script + fi + fi + if [ "$CT_DEFAULT_TYPE" == "0" ]; then + if CT_TYPE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \ + "1" "Unprivileged" OFF \ + "0" "Privileged" ON \ + 3>&1 1>&2 2>&3); then + if [ -n "$CT_TYPE" ]; then + CT_TYPE_DESC="Unprivileged" + if [ "$CT_TYPE" -eq 0 ]; then + CT_TYPE_DESC="Privileged" + fi + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Container Type: ${BGN}$CT_TYPE_DESC${CL}" + fi + else + exit_script fi - else - exit_script fi done @@ -437,7 +551,6 @@ advanced_settings() { fi done - if CT_ID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then if [ -z "$CT_ID" ]; then CT_ID="$NEXTID" @@ -550,7 +663,7 @@ advanced_settings() { APT_CACHER="" APT_CACHER_IP="" else - if APT_CACHER_IP=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set APT-Cacher IP (leave blank for default)" 8 58 --title "APT-Cacher IP" 3>&1 1>&2 2>&3); then + if APT_CACHER_IP=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set APT-Cacher IP (leave blank for none)" 8 58 --title "APT-Cacher IP" 3>&1 1>&2 2>&3); then APT_CACHER="${APT_CACHER_IP:+yes}" echo -e "${NETWORK}${BOLD}${DGN}APT-Cacher IP Address: ${BGN}${APT_CACHER_IP:-Default}${CL}" else @@ -565,7 +678,7 @@ advanced_settings() { fi echo -e "${DISABLEIPV6}${BOLD}${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}" - if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default [1500])" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then if [ -z $MTU1 ]; then MTU1="Default" MTU="" @@ -602,7 +715,7 @@ advanced_settings() { exit_script fi - if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address(leave blank for generated MAC)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then if [ -z $MAC1 ]; then MAC1="Default" MAC="" @@ -614,7 +727,7 @@ advanced_settings() { exit_script fi - if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for no VLAN)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then if [ -z $VLAN1 ]; then VLAN1="Default" VLAN="" @@ -628,18 +741,14 @@ advanced_settings() { if ADV_TAGS=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Custom Tags?[If you remove all, there will be no tags!]" 8 58 ${TAGS} --title "Advanced Tags" 3>&1 1>&2 2>&3); then if [ -n "${ADV_TAGS}" ]; then - ADV_TAGS=$(echo "$ADV_TAGS" | tr -d '[:space:]') # Remove whitespace from ADV_TAGS - if [[ "$ADV_TAGS" != *"community-script"* ]]; then - TAGS="community-script;${ADV_TAGS}" - else - TAGS="${ADV_TAGS}" # ADV_TAGS already contains "community-script" - fi + ADV_TAGS=$(echo "$ADV_TAGS" | tr -d '[:space:]') + TAGS="${ADV_TAGS}" else - TAGS="community-script;" + TAGS=";" fi - echo -e "${NETWORK}${BOLD}${DGN}Tags: ${BGN}$TAGS${CL}" - else - exit_script + echo -e "${NETWORK}${BOLD}${DGN}Tags: ${BGN}$TAGS${CL}" + else + exit_script fi if [[ "$PW" == -password* ]]; then @@ -662,7 +771,7 @@ advanced_settings() { fi else SSH_AUTHORIZED_KEY="" - fi + fi if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then VERB="yes" else @@ -680,11 +789,123 @@ advanced_settings() { fi } +post_to_api() { + local API_URL="http://api.community-scripts.org/upload" + local pve_version="not found" + pve_version=$(pveversion | awk -F'[/ ]' '{print $2}') + + JSON_PAYLOAD=$( + cat </usr/local/community-scripts/diagnostics +DIAGNOSTICS=yes + +#This file is used to store the diagnostics settings for the Community-Scripts API. +#https://github.com/community-scripts/ProxmoxVE/discussions/1836 +#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes. +#You can review the data at https://community-scripts.github.io/ProxmoxVE/data +#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue. +#This will disable the diagnostics feature. +#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue. +#This will enable the diagnostics feature. +#The following information will be sent: +#"ct_type" +#"disk_size" +#"core_count" +#"ram_size" +#"verbose" +#"os_type" +#"os_version" +#"hn" +#"disableip6" +#"ssh" +#"tags" +#"nsapp" +#"method" +#"pve_version" +#If you have any concerns, please review the source code at /misc/build.func +EOF + DIAGNOSTICS="yes" + else + cat </usr/local/community-scripts/diagnostics +DIAGNOSTICS=no + +#This file is used to store the diagnostics settings for the Community-Scripts API. +#https://github.com/community-scripts/ProxmoxVE/discussions/1836 +#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes. +#You can review the data at https://community-scripts.github.io/ProxmoxVE/data +#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue. +#This will disable the diagnostics feature. +#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue. +#This will enable the diagnostics feature. +#The following information will be sent: +#"ct_type" +#"disk_size" +#"core_count" +#"ram_size" +#"verbose" +#"os_type" +#"os_version" +#"hn" +#"disableip6" +#"ssh" +#"tags" +#"nsapp" +#"method" +#"pve_version" +#If you have any concerns, please review the source code at /misc/build.func +EOF + DIAGNOSTICS="no" + fi + else + DIAGNOSTICS=$(awk -F '=' '/^DIAGNOSTICS/ {print $2}' /usr/local/community-scripts/diagnostics) + + fi + +} + install_script() { pve_check shell_check root_check ssh_check + maxkeys_check + diagnostics_check if systemctl is-active -q ping-instances.service; then systemctl -q stop ping-instances.service @@ -693,12 +914,14 @@ install_script() { timezone=$(cat /etc/timezone) header_info while true; do + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --menu "Choose an option:" \ - 12 50 4 \ + 12 50 5 \ "1" "Default Settings" \ "2" "Default Settings (with verbose)" \ "3" "Advanced Settings" \ - "4" "Exit" --nocancel --default-item "1" 3>&1 1>&2 2>&3) + "4" "Diagnostic Settings" \ + "5" "Exit" --nocancel --default-item "1" 3>&1 1>&2 2>&3) if [ $? -ne 0 ]; then echo -e "${CROSS}${RD} Menu canceled. Exiting.${CL}" @@ -706,35 +929,55 @@ install_script() { fi case $CHOICE in - 1) - header_info - echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME${CL}" - VERB="no" - base_settings "$VERB" - echo_default - break - ;; - 2) - header_info - echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME (${SEARCH}Verbose)${CL}" - VERB="yes" - base_settings "$VERB" - echo_default - break - ;; - 3) - header_info - echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings on node $PVEHOST_NAME${CL}" - advanced_settings - break - ;; - 4) - echo -e "${CROSS}${RD}Exiting.${CL}" - exit 0 - ;; - *) - echo -e "${CROSS}${RD}Invalid option, please try again.${CL}" + 1) + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME${CL}" + VERB="no" + METHOD="default" + base_settings "$VERB" + echo_default + break + ;; + 2) + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME (${SEARCH}Verbose)${CL}" + VERB="yes" + METHOD="default" + base_settings "$VERB" + echo_default + break + ;; + 3) + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings on node $PVEHOST_NAME${CL}" + METHOD="advanced" + advanced_settings + break + ;; + 4) + if [[ $DIAGNOSTICS == "yes" ]]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --yesno "Send Diagnostics of LXC Installation?\n\nCurrent setting: ${DIAGNOSTICS}" 10 58 \ + --yes-button "No" --no-button "Back" ; then + DIAGNOSTICS="no" + sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics + whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --msgbox "Diagnostics settings changed to ${DIAGNOSTICS}." 8 58 + fi + else + if whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --yesno "Send Diagnostics of LXC Installation?\n\nCurrent setting: ${DIAGNOSTICS}" 10 58 \ + --yes-button "Yes" --no-button "Back" ; then + DIAGNOSTICS="yes" + sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics + whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --msgbox "Diagnostics settings changed to ${DIAGNOSTICS}." 8 58 + fi + fi ;; + 5) + echo -e "${CROSS}${RD}Exiting.${CL}" + exit 0 + ;; + *) + echo -e "${CROSS}${RD}Invalid option, please try again.${CL}" + ;; esac done } @@ -805,7 +1048,7 @@ start() { # This function collects user settings and integrates all the collected information. build_container() { -# if [ "$VERB" == "yes" ]; then set -x; fi + # if [ "$VERB" == "yes" ]; then set -x; fi if [ "$CT_TYPE" == "1" ]; then FEATURES="keyctl=1,nesting=1" @@ -813,6 +1056,9 @@ build_container() { FEATURES="nesting=1" fi + if [[ $DIAGNOSTICS == "yes" ]]; then + post_to_api + fi TEMP_DIR=$(mktemp -d) pushd $TEMP_DIR >/dev/null @@ -906,7 +1152,7 @@ EOF msg_ok "Started LXC Container" if [ "$var_os" == "alpine" ]; then sleep 3 - pct exec "$CTID" -- /bin/sh -c 'cat </etc/apk/repositories + pct exec "$CTID" -- /bin/sh -c 'cat </etc/apk/repositories http://dl-cdn.alpinelinux.org/alpine/latest-stable/main http://dl-cdn.alpinelinux.org/alpine/latest-stable/community EOF' @@ -921,7 +1167,8 @@ description() { IP=$(pct exec "$CTID" ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) # Generate LXC Description - DESCRIPTION=$(cat < Logo @@ -949,7 +1196,7 @@ description() {
EOF -) + ) # Set Description in LXC pct set "$CTID" -description "$DESCRIPTION" diff --git a/misc/clean-orphaned-lvm.sh b/misc/clean-orphaned-lvm.sh new file mode 100644 index 000000000..d8ad78207 --- /dev/null +++ b/misc/clean-orphaned-lvm.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info { + clear + cat <<"EOF" + ____ ________ ____ __ __ __ _ ____ ___ + / __ \_________ _ ______ ___ ____ _ __ / ____/ /__ ____ _____ / __ \_________ / /_ ____ _____ ___ ____/ / / /| | / / |/ /____ + / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / / / / _ \/ __ `/ __ \ / / / / ___/ __ \/ __ \/ __ `/ __ \/ _ \/ __ / / / | | / / /|_/ / ___/ + / ____/ / / /_/ /> < / /___/ / __/ /_/ / / / / / /_/ / / / /_/ / / / / /_/ / / / / __/ /_/ / / /__| |/ / / / (__ ) +/_/ /_/ \____/_/|_/_/ /_/ /_/\____/_/|_| \____/_/\___/\__,_/_/ /_/ \____/_/ / .___/_/ /_/\__,_/_/ /_/\___/\__,_/ /_____/___/_/ /_/____/ + /_/ +EOF +} + +# Function to check for orphaned LVM volumes +function find_orphaned_lvm { + echo -e "\nπŸ” Scanning for orphaned LVM volumes...\n" + + orphaned_volumes=() + while read -r lv vg size; do + container_id=$(echo "$lv" | grep -oE "[0-9]+" | head -1) + + # Exclude system-critical LVs + if [[ "$lv" == "data" || "$lv" == "root" || "$lv" == "swap" ]]; then + continue + fi + + # Check if the ID exists as a VM or LXC container + if [ -f "/etc/pve/lxc/${container_id}.conf" ] || [ -f "/etc/pve/qemu-server/${container_id}.conf" ]; then + continue + fi + + orphaned_volumes+=("$lv" "$vg" "$size") + done < <(lvs --noheadings -o lv_name,vg_name,lv_size --separator ' ' | awk '{print $1, $2, $3}') + + if [ ${#orphaned_volumes[@]} -eq 0 ]; then + echo -e "βœ… No orphaned LVM volumes found.\n" + exit 0 + fi + + # Display orphaned volumes + echo -e "❗ The following orphaned LVM volumes were found:\n" + printf "%-25s %-10s %-10s\n" "LV Name" "VG" "Size" + printf "%-25s %-10s %-10s\n" "-------------------------" "----------" "----------" + + for ((i = 0; i < ${#orphaned_volumes[@]}; i+=3)); do + printf "%-25s %-10s %-10s\n" "${orphaned_volumes[i]}" "${orphaned_volumes[i+1]}" "${orphaned_volumes[i+2]}" + done + echo "" +} + +# Function to delete selected volumes +function delete_orphaned_lvm { + for ((i = 0; i < ${#orphaned_volumes[@]}; i+=3)); do + lv="${orphaned_volumes[i]}" + vg="${orphaned_volumes[i+1]}" + size="${orphaned_volumes[i+2]}" + + read -p "❓ Do you want to delete $lv (VG: $vg, Size: $size)? [y/N]: " confirm + if [[ "$confirm" =~ ^[Yy]$ ]]; then + echo -e "πŸ—‘οΈ Deleting $lv from $vg..." + lvremove -f "$vg/$lv" + if [ $? -eq 0 ]; then + echo -e "βœ… Successfully deleted $lv.\n" + else + echo -e "❌ Failed to delete $lv.\n" + fi + else + echo -e "⚠️ Skipping $lv.\n" + fi + done +} + +# Run script +header_info +find_orphaned_lvm +delete_orphaned_lvm + +echo -e "βœ… Cleanup process completed!\n" diff --git a/misc/filebrowser.sh b/misc/filebrowser.sh index c1e3e858f..a9ea1186b 100644 --- a/misc/filebrowser.sh +++ b/misc/filebrowser.sh @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2025 tteck -# Author: tteck (tteckster) -# License: MIT -# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tteck (tteckster) | Co-Author: MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE function header_info { clear @@ -11,79 +10,88 @@ function header_info { _______ __ ____ / ____(_) /__ / __ )_________ _ __________ _____ / /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/ - / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ / -/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/ - + / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ / +/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/ EOF } -IP=$(hostname -I | awk '{print $1}') YW=$(echo "\033[33m") -BL=$(echo "\033[36m") -RD=$(echo "\033[01;31m") -BGN=$(echo "\033[4;92m") GN=$(echo "\033[1;92m") -DGN=$(echo "\033[32m") +RD=$(echo "\033[01;31m") +BL=$(echo "\033[36m") CL=$(echo "\033[m") -BFR="\\r\\033[K" -HOLD="-" -CM="${GN}βœ“${CL}" +CM="${GN}βœ”οΈ${CL}" +CROSS="${RD}βœ–οΈ${CL}" +INFO="${BL}ℹ️${CL}" + APP="FileBrowser" -hostname="$(hostname)" -header_info -if [ -f /root/filebrowser.db ]; then - read -r -p "Would you like to uninstall ${APP} on $hostname.? " prompt - if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then - systemctl disable -q --now filebrowser.service - rm -rf /usr/local/bin/filebrowser /root/filebrowser.db /etc/systemd/system/filebrowser.service - echo "$APP Removed" - sleep 2 - clear - exit - else - clear - exit - fi -fi -while true; do - read -p "This will Install ${APP} on $hostname. Proceed(y/n)?" yn - case $yn in - [Yy]*) break ;; - [Nn]*) exit ;; - *) echo "Please answer yes or no." ;; - esac -done +INSTALL_PATH="/usr/local/bin/filebrowser" +SERVICE_PATH="/etc/systemd/system/filebrowser.service" +DB_PATH="/root/filebrowser.db" +IP=$(hostname -I | awk '{print $1}') header_info + function msg_info() { local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." + echo -e "${INFO} ${YW}${msg}...${CL}" } function msg_ok() { local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" + echo -e "${CM} ${GN}${msg}${CL}" } -read -r -p "Would you like to use No Authentication? " prompt -msg_info "Installing ${APP}" -apt-get install -y curl &>/dev/null -RELEASE=$(curl -fsSL https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g') -curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/$RELEASE/linux-arm64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null +function msg_error() { + local msg="$1" + echo -e "${CROSS} ${RD}${msg}${CL}" +} -if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then - filebrowser config init -a '0.0.0.0' &>/dev/null - filebrowser config set -a '0.0.0.0' &>/dev/null - filebrowser config init --auth.method=noauth &>/dev/null - filebrowser config set --auth.method=noauth &>/dev/null - filebrowser users add ID 1 --perm.admin &>/dev/null -else - filebrowser config init -a '0.0.0.0' &>/dev/null - filebrowser config set -a '0.0.0.0' &>/dev/null - filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null +if [ -f "$INSTALL_PATH" ]; then + echo -e "${YW}⚠️ ${APP} is already installed.${CL}" + read -r -p "Would you like to uninstall ${APP}? (y/N): " uninstall_prompt + if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_info "Uninstalling ${APP}" + systemctl disable -q --now filebrowser.service + rm -f "$INSTALL_PATH" "$DB_PATH" "$SERVICE_PATH" + msg_ok "${APP} has been uninstalled." + exit 0 + fi + + read -r -p "Would you like to update ${APP}? (y/N): " update_prompt + if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_info "Updating ${APP}" + curl -fsSL https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null + msg_ok "Updated ${APP}" + exit 0 + else + echo -e "${YW}⚠️ Update skipped. Exiting.${CL}" + exit 0 + fi fi -msg_ok "Installed ${APP} on $hostname" -msg_info "Creating Service" -cat </etc/systemd/system/filebrowser.service +echo -e "${YW}⚠️ ${APP} is not installed.${CL}" +read -r -p "Would you like to install ${APP}? (y/n): " install_prompt +if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_info "Installing ${APP}" + apt-get install -y curl &>/dev/null + curl -fsSL https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null + msg_ok "Installed ${APP}" + + read -r -p "Would you like to use No Authentication? (y/N): " auth_prompt + if [[ "${auth_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_info "Configuring No Authentication" + filebrowser config init -a '0.0.0.0' &>/dev/null + filebrowser config set -a '0.0.0.0' --auth.method=noauth &>/dev/null + msg_ok "No Authentication configured" + else + msg_info "Setting up default authentication" + filebrowser config init -a '0.0.0.0' &>/dev/null + filebrowser config set -a '0.0.0.0' &>/dev/null + filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null + msg_ok "Default authentication configured (admin:helper-scripts.com)" + fi + + msg_info "Creating service" + cat </etc/systemd/system/filebrowser.service [Unit] Description=Filebrowser After=network-online.target @@ -96,9 +104,11 @@ ExecStart=/usr/local/bin/filebrowser -r / [Install] WantedBy=default.target EOF -systemctl enable -q --now filebrowser.service -msg_ok "Created Service" + systemctl enable -q --now filebrowser.service + msg_ok "Service created successfully" -msg_ok "Completed Successfully!\n" -echo -e "${APP} should be reachable by going to the following URL. - ${BL}http://$IP:8080${CL} \n" + echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:8080${CL}" +else + echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}" + exit 0 +fi diff --git a/misc/install.func b/misc/install.func index df5f2629e..2ab1dca71 100644 --- a/misc/install.func +++ b/misc/install.func @@ -201,9 +201,6 @@ motd_ssh() { # Set terminal to 256-color mode grep -qxF "export TERM='xterm-256color'" /root/.bashrc || echo "export TERM='xterm-256color'" >> /root/.bashrc - # Get the current private IP address - IP=$(hostname -I | awk '{print $1}') # Private IP - # Get OS information (Debian / Ubuntu) if [ -f "/etc/os-release" ]; then OS_NAME=$(grep ^NAME /etc/os-release | cut -d= -f2 | tr -d '"') @@ -213,20 +210,14 @@ motd_ssh() { OS_VERSION=$(cat /etc/debian_version) fi - # Set MOTD with application info, system details - MOTD_FILE="/etc/motd" - if [ -f "$MOTD_FILE" ]; then - # Start MOTD with application info and link - echo -e "\n${BOLD}${APPLICATION} LXC Container${CL}" > "$MOTD_FILE" - echo -e "${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts & Pimox Scripts ${YW}| GitHub: ${GN}https://github.com/asylumexp/Proxmox${CL}\n" >> "$MOTD_FILE" - - # Add system information with icons - echo -e "${TAB}${OS}${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}" >> "$MOTD_FILE" - echo -e "${TAB}${HOSTNAME}${YW} Hostname: ${GN}$(hostname)${CL}" >> "$MOTD_FILE" - echo -e "${TAB}${INFO}${YW} IP Address: ${GN}${IP}${CL}" >> "$MOTD_FILE" - else - echo "MotD file does not exist!" >&2 - fi + PROFILE_FILE="/etc/profile.d/00_lxc-details.sh" + echo "echo -e \"\"" > "$PROFILE_FILE" + echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >> "$PROFILE_FILE" + echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts & pimox-scripts ${YW}| GitHub: ${GN}https://github.com/asylumexp/Proxmox${CL}\"" >> "$PROFILE_FILE" + echo "echo \"\"" >> "$PROFILE_FILE" + echo -e "echo -e \"${TAB}${OS}${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}\"" >> "$PROFILE_FILE" + echo -e "echo -e \"${TAB}${HOSTNAME}${YW} Hostname: ${GN}\$(hostname)${CL}\"" >> "$PROFILE_FILE" + echo -e "echo -e \"${TAB}${INFO}${YW} IP Address: ${GN}\$(hostname -I | awk '{print \$1}')${CL}\"" >> "$PROFILE_FILE" # Disable default MOTD scripts chmod -x /etc/update-motd.d/* diff --git a/misc/lxc-delete.sh b/misc/lxc-delete.sh new file mode 100644 index 000000000..2e76d5963 --- /dev/null +++ b/misc/lxc-delete.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info { + clear + cat <<"EOF" + ____ ____ ____ _ __ __ _______ _ __ __ _ ________ ____ ________ __________________ + / __ \/ __ \/ __ \ |/ // |/ / __ \ |/ / / / | |/ / ____/ / __ \/ ____/ / / ____/_ __/ ____/ + / /_/ / /_/ / / / / // /|_/ / / / / / / / | / / / / / / __/ / / / __/ / / / __/ + / ____/ _, _/ /_/ / |/ / / / /_/ / | / /___/ / /___ / /_/ / /___/ /___/ /___ / / / /___ +/_/ /_/ |_|\____/_/|_/_/ /_/\____/_/|_| /_____/_/|_\____/ /_____/_____/_____/_____/ /_/ /_____/ + +EOF +} + +spinner() { + local pid=$1 + local delay=0.1 + local spinstr='|/-\' + while ps -p $pid > /dev/null; do + printf " [%c] " "$spinstr" + spinstr=${spinstr#?}${spinstr%"${spinstr#?}"} + sleep $delay + printf "\r" + done + printf " \r" +} + +set -eEuo pipefail +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +CM='\xE2\x9C\x94\033' +GN=$(echo "\033[1;92m") +CL=$(echo "\033[m") + +header_info +echo "Loading..." +whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This Will Delete LXC Containers. Proceed?" 10 58 || exit + +NODE=$(hostname) + +# Get list of containers with ID and hostname +containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}') + +# Exit if no containers are found +if [ -z "$containers" ]; then + whiptail --title "LXC Container Delete" --msgbox "There are no LXC Container available!" 10 60 + exit 1 +fi + +menu_items=() +FORMAT="%-10s %-15s %-10s" + +# Format container data for menu display +while read -r container; do + container_id=$(echo $container | awk '{print $1}') + container_name=$(echo $container | awk '{print $2}') + container_status=$(echo $container | awk '{print $3}') + formatted_line=$(printf "$FORMAT" "$container_name" "$container_status") + menu_items+=("$container_id" "$formatted_line" "OFF") +done <<< "$containers" + +# Display selection menu +CHOICES=$(whiptail --title "LXC Container Delete" \ + --checklist "Choose LXC container to delete:" 25 60 13 \ + "${menu_items[@]}" 3>&2 2>&1 1>&3) + +if [ -z "$CHOICES" ]; then + whiptail --title "LXC Container Delete" \ + --msgbox "No containers have been selected!" 10 60 + exit 1 +fi + +# Process selected containers +selected_ids=$(echo "$CHOICES" | tr -d '"' | tr -s ' ' '\n') + +for container_id in $selected_ids; do + status=$(pct status $container_id) + + # Stop container if running + if [ "$status" == "status: running" ]; then + echo -e "${BL}[Info]${GN} Stop container $container_id...${CL}" + pct stop $container_id & + sleep 5 + echo -e "${BL}[Info]${GN} Container $container_id stopped.${CL}" + fi + + # Confirm deletion + read -p "Are you sure you want to delete Container $container_id? (y/N): " CONFIRM + if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then + echo -e "${BL}[Info]${GN} Deleting container $container_id...${CL}" + pct destroy "$container_id" -f & + pid=$! + spinner $pid + if [ $? -eq 0 ]; then + echo "Container $container_id was successfully deleted." + else + whiptail --title "Error" --msgbox "Error deleting container $container_id." 10 60 + fi + elif [[ "$CONFIRM" =~ ^[Nn]$ ]]; then + echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}" + else + echo -e "${RD}[Error]${CL} Invalid input, skipping container $container_id." + fi +done + +header_info +echo -e "${GN}The deletion process has been completed.${CL}\n" diff --git a/misc/post-pmg-install.sh b/misc/post-pmg-install.sh new file mode 100644 index 000000000..c5f4ed302 --- /dev/null +++ b/misc/post-pmg-install.sh @@ -0,0 +1,180 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: thost96 (thost96) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +header_info() { + clear + cat <<"EOF" + ____ __ _________ ____ __ ____ __ ____ + / __ \/ |/ / ____/ / __ \____ _____/ /_ / _/___ _____/ /_____ _/ / / + / /_/ / /|_/ / / __ / /_/ / __ \/ ___/ __/ / // __ \/ ___/ __/ __ `/ / / + / ____/ / / / /_/ / / ____/ /_/ (__ ) /_ _/ // / / (__ ) /_/ /_/ / / / +/_/ /_/ /_/\____/ /_/ \____/____/\__/ /___/_/ /_/____/\__/\__,_/_/_/ + +EOF +} + +RD=$(echo "\033[01;31m") +YW=$(echo "\033[33m") +GN=$(echo "\033[1;92m") +CL=$(echo "\033[m") +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}βœ“${CL}" +CROSS="${RD}βœ—${CL}" + +set -euo pipefail +shopt -s inherit_errexit nullglob + +msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +msg_error() { + local msg="$1" + echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" +} + +start_routines() { + header_info + VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PMG SOURCES" --menu "This will set the correct sources to update and install Proxmox Mail Gateway.\n \nChange to Proxmox Mail Gateway sources?" 14 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Changing to Proxmox Mail Gateway Sources" + cat </etc/apt/sources.list +deb http://deb.debian.org/debian ${VERSION} main contrib +deb http://deb.debian.org/debian ${VERSION}-updates main contrib +deb http://security.debian.org/debian-security ${VERSION}-security main contrib +EOF + msg_ok "Changed to Proxmox Mail Gateway Sources" + ;; + no) + msg_error "Selected no to Correcting Proxmox Mail Gateway Sources" + ;; + esac + + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PMG-ENTERPRISE" --menu "The 'pmg-enterprise' repository is only available to users who have purchased a Proxmox Mail Gateway subscription.\n \nDisable 'pmg-enterprise' repository?" 14 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Disabling 'pmg-enterprise' repository" + cat </etc/apt/sources.list.d/pmg-enterprise.list +# deb https://enterprise.proxmox.com/debian/pmg ${VERSION} pmg-enterprise +EOF + msg_ok "Disabled 'pmg-enterprise' repository" + ;; + no) + msg_error "Selected no to disabling 'pmg-enterprise' repository" + ;; + esac + + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PMG-NO-SUBSCRIPTION" --menu "The 'pmg-no-subscription' repository provides access to all of the open-source components of Proxmox Mail Gateway.\n \nEnable 'pmg-no-subscription' repository?" 14 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Enabling 'pmg-no-subscription' repository" + cat </etc/apt/sources.list.d/pmg-install-repo.list +deb http://download.proxmox.com/debian/pmg ${VERSION} pmg-no-subscription +EOF + msg_ok "Enabled 'pmg-no-subscription' repository" + ;; + no) + msg_error "Selected no to enabling 'pmg-no-subscription' repository" + ;; + esac + + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PMG TEST" --menu "The 'pmgtest' repository can give advanced users access to new features and updates before they are officially released.\n \nAdd (Disabled) 'pmgtest' repository?" 14 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Adding 'pmgtest' repository and set disabled" + cat </etc/apt/sources.list.d/pmgtest-for-beta.list +# deb http://download.proxmox.com/debian/pmg ${VERSION} pmgtest +EOF + msg_ok "Added 'pmgtest' repository" + ;; + no) + msg_error "Selected no to adding 'pmgtest' repository" + ;; + esac + + if [[ ! -f /etc/apt/apt.conf.d/no-nag-script ]]; then + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58 + msg_info "Disabling subscription nag" + # Normal GUI: + echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script + # JS-Library used when accessing via mobile device browser + echo "DPkg::Post-Invoke { \"dpkg -V pmg-gui | grep -q '/pmgmanagerlib-mobile\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from Mobile UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script + apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null + msg_ok "Disabled subscription nag (Delete browser cache)" + ;; + no) + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58 + msg_error "Selected no to disabling subscription nag" + ;; + esac + fi + + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox Mail Gateway now?" 11 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Updating Proxmox Mail Gateway (Patience)" + apt-get update &>/dev/null + apt-get -y dist-upgrade &>/dev/null + msg_ok "Updated Proxmox Mail Gateway" + ;; + no) + msg_error "Selected no to updating Proxmox Mail Gateway" + ;; + esac + + CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "REBOOT" --menu "\nReboot Proxmox Mail Gateway now? (recommended)" 11 58 2 \ + "yes" " " \ + "no" " " 3>&2 2>&1 1>&3) + case $CHOICE in + yes) + msg_info "Rebooting Proxmox Mail Gateway" + sleep 2 + msg_ok "Completed Post Install Routines" + reboot + ;; + no) + msg_error "Selected no to reboot Proxmox Mail Gateway (Reboot recommended)" + msg_ok "Completed Post Install Routines" + ;; + esac +} + +header_info +echo -e "\nThis script will Perform Post Install Routines.\n" +while true; do + read -p "Start the Proxmox Mail Gateway Post Install Script (y/n)?" yn + case $yn in + [Yy]*) break ;; + [Nn]*) clear; exit ;; + *) echo "Please answer yes or no." ;; + esac +done + +start_routines diff --git a/vm/archlinux-vm.sh b/vm/archlinux-vm.sh new file mode 100644 index 000000000..6f08a0023 --- /dev/null +++ b/vm/archlinux-vm.sh @@ -0,0 +1,497 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info { + clear + cat <<"EOF" + ___ __ __ _ _ ____ ___ + / | __________/ /_ / / (_)___ __ ___ __ | | / / |/ / + / /| | / ___/ ___/ __ \ / / / / __ \/ / / / |/_/ | | / / /|_/ / + / ___ |/ / / /__/ / / / / /___/ / / / / /_/ /> < | |/ / / / / +/_/ |_/_/ \___/_/ /_/ /_____/_/_/ /_/\__,_/_/|_| |___/_/ /_/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +NEXTID=$(pvesh get /cluster/nextid) + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}βœ”οΈ${TAB}${CL}" +CROSS="${TAB}βœ–οΈ${TAB}${CL}" +INFO="${TAB}πŸ’‘${TAB}${CL}" +OS="${TAB}πŸ–₯️${TAB}${CL}" +CONTAINERTYPE="${TAB}πŸ“¦${TAB}${CL}" +DISKSIZE="${TAB}πŸ’Ύ${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}πŸ› οΈ${TAB}${CL}" +CONTAINERID="${TAB}πŸ†”${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}πŸŒ‰${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}βš™οΈ${TAB}${CL}" +MACADDRESS="${TAB}πŸ”—${TAB}${CL}" +VLANTAG="${TAB}🏷️${TAB}${CL}" +CREATING="${TAB}πŸš€${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +function error_handler() { + 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" + cleanup_vmid +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + popd >/dev/null + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Arch Linux VM" --yesno "This will create a New Arch Linux VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +function pve_check() { + if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then + msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" + echo -e "Requires Proxmox Virtual Environment Version 8.1 or later." + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID="$NEXTID" + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="4G" + DISK_CACHE="" + HN="arch-linux" + CPU_TYPE="" + CORE_COUNT="1" + RAM_SIZE="1024" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Arch Linux VM using the above default settings${CL}" +} + +function advanced_settings() { + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID="$NEXTID" + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 arch-linux --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="arch-linux" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Arch Linux VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Arch Linux VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + 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 ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Arch Linux .iso File" +URL=https://geo.mirror.pkgbuild.com/iso/latest/archlinux-x86_64.iso +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +wget -q --show-progress $URL +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir | cifs) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a Arch Linux VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags community-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -ide2 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +DESCRIPTION=$( + cat < + + Logo + + +

Arch Linux VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + +
+EOF +) +qm set "$VMID" -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Arch Linux VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Arch Linux VM" + qm start $VMID + msg_ok "Started Arch Linux VM" +fi + +msg_ok "Completed Successfully!\n" diff --git a/vm/debian-vm.sh b/vm/debian-vm.sh index 57d373fd9..857c0ad60 100644 --- a/vm/debian-vm.sh +++ b/vm/debian-vm.sh @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2025 tteck -# Author: tteck (tteckster) -# License: MIT -# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE function header_info { clear @@ -23,16 +22,36 @@ NEXTID=$(pvesh get /cluster/nextid) YW=$(echo "\033[33m") BL=$(echo "\033[36m") -HA=$(echo "\033[1;34m") RD=$(echo "\033[01;31m") BGN=$(echo "\033[4;92m") GN=$(echo "\033[1;92m") DGN=$(echo "\033[32m") CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") BFR="\\r\\033[K" -HOLD="-" -CM="${GN}βœ“${CL}" -CROSS="${RD}βœ—${CL}" +HOLD=" " +TAB=" " + +CM="${TAB}βœ”οΈ${TAB}${CL}" +CROSS="${TAB}βœ–οΈ${TAB}${CL}" +INFO="${TAB}πŸ’‘${TAB}${CL}" +OS="${TAB}πŸ–₯️${TAB}${CL}" +CONTAINERTYPE="${TAB}πŸ“¦${TAB}${CL}" +DISKSIZE="${TAB}πŸ’Ύ${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}πŸ› οΈ${TAB}${CL}" +CONTAINERID="${TAB}πŸ†”${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}πŸŒ‰${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}βš™οΈ${TAB}${CL}" +MACADDRESS="${TAB}πŸ”—${TAB}${CL}" +VLANTAG="${TAB}🏷️${TAB}${CL}" +CREATING="${TAB}πŸš€${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR @@ -63,22 +82,22 @@ pushd $TEMP_DIR >/dev/null if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Debian 12 VM" --yesno "This will create a New Debian 12 VM. Proceed?" 10 58; then : else - header_info && echo -e "⚠ User exited script \n" && exit + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit fi function msg_info() { local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" } function msg_ok() { local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" + echo -e "${BFR}${CM}${GN}${msg}${CL}" } function msg_error() { local msg="$1" - echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" } function check_root() { @@ -93,17 +112,18 @@ function check_root() { function pve_check() { if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then - msg_error "This version of Proxmox Virtual Environment is not supported" + msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" echo -e "Requires Proxmox Virtual Environment Version 8.1 or later." echo -e "Exiting..." sleep 2 exit -fi + fi } function arch_check() { if [ "$(dpkg --print-architecture)" != "amd64" ]; then - msg_error "This script will not work with PiMox! \n" + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" echo -e "Exiting..." sleep 2 exit @@ -125,7 +145,7 @@ function ssh_check() { function exit-script() { clear - echo -e "⚠ User exited script \n" + echo -e "\n${CROSS}${RD}User exited script${CL}\n" exit } @@ -133,6 +153,7 @@ function default_settings() { VMID="$NEXTID" FORMAT=",efitype=4m" MACHINE="" + DISK_SIZE="8G" DISK_CACHE="" HN="debian" CPU_TYPE="" @@ -143,19 +164,20 @@ function default_settings() { VLAN="" MTU="" START_VM="yes" - echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}" - echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}" - echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" - echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}" - echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" - echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}" - echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}" - echo -e "${DGN}Using Bridge: ${BGN}${BRG}${CL}" - echo -e "${DGN}Using MAC Address: ${BGN}${MAC}${CL}" - echo -e "${DGN}Using VLAN: ${BGN}Default${CL}" - echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}" - echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" - echo -e "${BL}Creating a Debian 12 VM using the above default settings${CL}" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above default settings${CL}" } function advanced_settings() { @@ -169,7 +191,7 @@ function advanced_settings() { sleep 2 continue fi - echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" break else exit-script @@ -181,27 +203,42 @@ function advanced_settings() { "q35" "Machine q35" OFF \ 3>&1 1>&2 2>&3); then if [ $MACH = q35 ]; then - echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" FORMAT="" MACHINE=" -machine q35" else - echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" FORMAT=",efitype=4m" MACHINE="" fi else exit-script fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ "0" "None (Default)" ON \ "1" "Write Through" OFF \ 3>&1 1>&2 2>&3); then if [ $DISK_CACHE = "1" ]; then - echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" DISK_CACHE="cache=writethrough," else - echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" DISK_CACHE="" fi else @@ -211,10 +248,10 @@ function advanced_settings() { if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 debian --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $VM_NAME ]; then HN="debian" - echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" else HN=$(echo ${VM_NAME,,} | tr -d ' ') - echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" fi else exit-script @@ -225,10 +262,10 @@ function advanced_settings() { "1" "Host" OFF \ 3>&1 1>&2 2>&3); then if [ $CPU_TYPE1 = "1" ]; then - echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" CPU_TYPE=" -cpu host" else - echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" CPU_TYPE="" fi else @@ -238,9 +275,9 @@ function advanced_settings() { if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $CORE_COUNT ]; then CORE_COUNT="2" - echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" else - echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" fi else exit-script @@ -249,9 +286,9 @@ function advanced_settings() { if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $RAM_SIZE ]; then RAM_SIZE="2048" - echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" else - echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" fi else exit-script @@ -260,9 +297,9 @@ function advanced_settings() { if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $BRG ]; then BRG="vmbr0" - echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" else - echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" fi else exit-script @@ -271,10 +308,10 @@ function advanced_settings() { if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $MAC1 ]; then MAC="$GEN_MAC" - echo -e "${DGN}Using MAC Address: ${BGN}$MAC${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" else MAC="$MAC1" - echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" fi else exit-script @@ -284,10 +321,10 @@ function advanced_settings() { if [ -z $VLAN1 ]; then VLAN1="Default" VLAN="" - echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" else VLAN=",tag=$VLAN1" - echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" fi else exit-script @@ -297,28 +334,28 @@ function advanced_settings() { if [ -z $MTU1 ]; then MTU1="Default" MTU="" - echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" else MTU=",mtu=$MTU1" - echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" fi else exit-script fi if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then - echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" START_VM="yes" else - echo -e "${DGN}Start VM when completed: ${BGN}no${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" START_VM="no" fi if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Debian 12 VM?" --no-button Do-Over 10 58); then - echo -e "${RD}Creating a Debian 12 VM using the above advanced settings${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above advanced settings${CL}" else header_info - echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" advanced_settings fi } @@ -326,11 +363,11 @@ function advanced_settings() { function start_script() { if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then header_info - echo -e "${BL}Using Default Settings${CL}" + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" default_settings else header_info - echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" advanced_settings fi } @@ -402,16 +439,16 @@ done msg_info "Creating a Debian 12 VM" qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ - -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci + -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null qm set $VMID \ -efidisk0 ${DISK0_REF}${FORMAT} \ - -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ -boot order=scsi0 \ -serial0 socket >/dev/null -qm resize $VMID scsi0 4G >/dev/null - DESCRIPTION=$(cat < Logo @@ -440,13 +477,21 @@ qm resize $VMID scsi0 4G >/dev/null
EOF ) - qm set "$VMID" -description "$DESCRIPTION" >/dev/null - +qm set "$VMID" -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + msg_ok "Created a Debian 12 VM ${CL}${BL}(${HN})" if [ "$START_VM" == "yes" ]; then msg_info "Starting Debian 12 VM" qm start $VMID msg_ok "Started Debian 12 VM" fi + msg_ok "Completed Successfully!\n" echo "More Info at https://github.com/community-scripts/ProxmoxVE/discussions/836" diff --git a/vm/docker-vm.sh b/vm/docker-vm.sh new file mode 100644 index 000000000..db855d504 --- /dev/null +++ b/vm/docker-vm.sh @@ -0,0 +1,468 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: thost96 (thost96) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info { + clear + cat <<"EOF" + ____ __ _ ____ ___ + / __ \____ _____/ /_____ _____ | | / / |/ / + / / / / __ \/ ___/ //_/ _ \/ ___/ | | / / /|_/ / + / /_/ / /_/ / /__/ ,< / __/ / | |/ / / / / +/_____/\____/\___/_/|_|\___/_/ |___/_/ /_/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +NEXTID=$(pvesh get /cluster/nextid) + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +HA=$(echo "\033[1;34m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}βœ“${CL}" +CROSS="${RD}βœ—${CL}" +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +function error_handler() { + 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" + cleanup_vmid +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + popd >/dev/null + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Docker VM" --yesno "This will create a New Docker VM. Proceed?" 10 58; then + : +else + header_info && echo -e "⚠ User exited script \n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +function pve_check() { + if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then + msg_error "This version of Proxmox Virtual Environment is not supported" + echo -e "Requires Proxmox Virtual Environment Version 8.1 or later." + echo -e "Exiting..." + sleep 2 + exit +fi +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + if [ "$(dpkg --print-architecture)" != "arm64" ]; then + msg_error "This script will not work with your CPU Architekture \n" + echo -e "Exiting..." + sleep 2 + exit + fi + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "⚠ User exited script \n" + exit +} + +function default_settings() { + VMID="$NEXTID" + FORMAT=",efitype=4m" + MACHINE="" + DISK_CACHE="" + HN="docker" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="4096" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}" + echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" + echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}" + echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" + echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}" + echo -e "${DGN}Using Bridge: ${BGN}${BRG}${CL}" + echo -e "${DGN}Using MAC Address: ${BGN}${MAC}${CL}" + echo -e "${DGN}Using VLAN: ${BGN}Default${CL}" + echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}" + echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${BL}Creating a Docker VM using the above default settings${CL}" +} + +function advanced_settings() { + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID="$NEXTID" + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 docker --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="docker" + echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 4096 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="4096" + echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + else + echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${DGN}Using MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Docker VM?" --no-button Do-Over 10 58); then + echo -e "${RD}Creating a Docker VM using the above advanced settings${CL}" + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + 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 ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Debian 12 Qcow2 Disk Image" +URL="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-nocloud-$(dpkg --print-architecture).qcow2" +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +wget -q --show-progress $URL +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Installing Pre-Requisite libguestfs-tools onto Host" +apt-get -qq update && apt-get -qq install libguestfs-tools lsb-release -y >/dev/null +msg_ok "Installed libguestfs-tools successfully" + +msg_info "Adding Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image" +virt-customize -q -a "${FILE}" --install qemu-guest-agent,apt-transport-https,ca-certificates,curl,gnupg,software-properties-common,lsb-release >/dev/null && +virt-customize -q -a "${FILE}" --run-command "mkdir -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg" >/dev/null && +virt-customize -q -a "${FILE}" --run-command "echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable' > /etc/apt/sources.list.d/docker.list" >/dev/null && +virt-customize -q -a "${FILE}" --run-command "apt-get update -qq && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin" >/dev/null && +virt-customize -q -a "${FILE}" --run-command "systemctl enable docker" >/dev/null && +virt-customize -q -a "${FILE}" --run-command "echo -n > /etc/machine-id" >/dev/null +msg_ok "Added Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image successfully" + + +msg_info "Creating a Docker VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags proxmox-helper-scripts,debian12,docker -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +qm resize $VMID scsi0 8G >/dev/null +qm set $VMID --agent enabled=1 >/dev/null + + DESCRIPTION=$(cat < + + Logo + + +

Docker VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + +
+EOF +) +qm set "$VMID" -description "$DESCRIPTION" >/dev/null + +msg_ok "Created a Docker VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Docker VM" + qm start $VMID + msg_ok "Started Docker VM" +fi +msg_ok "Completed Successfully!\n" diff --git a/vm/ubuntu2204-vm.sh b/vm/ubuntu2204-vm.sh index f20ca100e..501321973 100644 --- a/vm/ubuntu2204-vm.sh +++ b/vm/ubuntu2204-vm.sh @@ -1,9 +1,8 @@ #!/usr/bin/env bash -# Copyright (c) 2021-2025 tteck -# Author: tteck (tteckster) -# License: MIT -# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE function header_info { clear @@ -23,16 +22,36 @@ NEXTID=$(pvesh get /cluster/nextid) YW=$(echo "\033[33m") BL=$(echo "\033[36m") -HA=$(echo "\033[1;34m") RD=$(echo "\033[01;31m") BGN=$(echo "\033[4;92m") GN=$(echo "\033[1;92m") DGN=$(echo "\033[32m") CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") BFR="\\r\\033[K" -HOLD="-" -CM="${GN}βœ“${CL}" -CROSS="${RD}βœ—${CL}" +HOLD=" " +TAB=" " + +CM="${TAB}βœ”οΈ${TAB}${CL}" +CROSS="${TAB}βœ–οΈ${TAB}${CL}" +INFO="${TAB}πŸ’‘${TAB}${CL}" +OS="${TAB}πŸ–₯️${TAB}${CL}" +CONTAINERTYPE="${TAB}πŸ“¦${TAB}${CL}" +DISKSIZE="${TAB}πŸ’Ύ${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}πŸ› οΈ${TAB}${CL}" +CONTAINERID="${TAB}πŸ†”${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}πŸŒ‰${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}βš™οΈ${TAB}${CL}" +MACADDRESS="${TAB}πŸ”—${TAB}${CL}" +VLANTAG="${TAB}🏷️${TAB}${CL}" +CREATING="${TAB}πŸš€${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR @@ -63,22 +82,22 @@ pushd $TEMP_DIR >/dev/null if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 22.04 VM" --yesno "This will create a New Ubuntu 22.04 VM. Proceed?" 10 58; then : else - header_info && echo -e "⚠ User exited script \n" && exit + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit fi function msg_info() { local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" } function msg_ok() { local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" + echo -e "${BFR}${CM}${GN}${msg}${CL}" } function msg_error() { local msg="$1" - echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" } function check_root() { @@ -93,17 +112,18 @@ function check_root() { function pve_check() { if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then - msg_error "This version of Proxmox Virtual Environment is not supported" + msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" echo -e "Requires Proxmox Virtual Environment Version 8.1 or later." echo -e "Exiting..." sleep 2 exit -fi + fi } function arch_check() { if [ "$(dpkg --print-architecture)" != "amd64" ]; then - msg_error "This script will not work with PiMox! \n" + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" echo -e "Exiting..." sleep 2 exit @@ -125,7 +145,7 @@ function ssh_check() { function exit-script() { clear - echo -e "⚠ User exited script \n" + echo -e "\n${CROSS}${RD}User exited script${CL}\n" exit } @@ -133,6 +153,7 @@ function default_settings() { VMID="$NEXTID" FORMAT=",efitype=4m" MACHINE="" + DISK_SIZE="5G" DISK_CACHE="" HN="ubuntu" CPU_TYPE="" @@ -142,20 +163,21 @@ function default_settings() { MAC="$GEN_MAC" VLAN="" MTU="" - START_VM="no" - echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}" - echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}" - echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" - echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}" - echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" - echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}" - echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}" - echo -e "${DGN}Using Bridge: ${BGN}${BRG}${CL}" - echo -e "${DGN}Using MAC Address: ${BGN}${MAC}${CL}" - echo -e "${DGN}Using VLAN: ${BGN}Default${CL}" - echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}" - echo -e "${DGN}Start VM when completed: ${BGN}no${CL}" - echo -e "${BL}Creating an Ubuntu 22.04 VM using the above default settings${CL}" + START_VM="yes" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 22.04 VM using the above default settings${CL}" } function advanced_settings() { @@ -169,7 +191,7 @@ function advanced_settings() { sleep 2 continue fi - echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" break else exit-script @@ -181,27 +203,42 @@ function advanced_settings() { "q35" "Machine q35" OFF \ 3>&1 1>&2 2>&3); then if [ $MACH = q35 ]; then - echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" FORMAT="" MACHINE=" -machine q35" else - echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" FORMAT=",efitype=4m" MACHINE="" fi else exit-script fi - + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ "0" "None (Default)" ON \ "1" "Write Through" OFF \ 3>&1 1>&2 2>&3); then if [ $DISK_CACHE = "1" ]; then - echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" DISK_CACHE="cache=writethrough," else - echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" DISK_CACHE="" fi else @@ -211,10 +248,10 @@ function advanced_settings() { if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 ubuntu --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $VM_NAME ]; then HN="ubuntu" - echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" else HN=$(echo ${VM_NAME,,} | tr -d ' ') - echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" fi else exit-script @@ -225,10 +262,10 @@ function advanced_settings() { "1" "Host" OFF \ 3>&1 1>&2 2>&3); then if [ $CPU_TYPE1 = "1" ]; then - echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" CPU_TYPE=" -cpu host" else - echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" CPU_TYPE="" fi else @@ -238,9 +275,9 @@ function advanced_settings() { if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $CORE_COUNT ]; then CORE_COUNT="2" - echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" else - echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" fi else exit-script @@ -249,9 +286,9 @@ function advanced_settings() { if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $RAM_SIZE ]; then RAM_SIZE="2048" - echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" else - echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" fi else exit-script @@ -260,9 +297,9 @@ function advanced_settings() { if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $BRG ]; then BRG="vmbr0" - echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" else - echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" fi else exit-script @@ -271,10 +308,10 @@ function advanced_settings() { if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $MAC1 ]; then MAC="$GEN_MAC" - echo -e "${DGN}Using MAC Address: ${BGN}$MAC${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" else MAC="$MAC1" - echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" fi else exit-script @@ -284,10 +321,10 @@ function advanced_settings() { if [ -z $VLAN1 ]; then VLAN1="Default" VLAN="" - echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" else VLAN=",tag=$VLAN1" - echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" fi else exit-script @@ -297,28 +334,28 @@ function advanced_settings() { if [ -z $MTU1 ]; then MTU1="Default" MTU="" - echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" else MTU=",mtu=$MTU1" - echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" fi else exit-script fi if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then - echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" START_VM="yes" else - echo -e "${DGN}Start VM when completed: ${BGN}no${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" START_VM="no" fi - if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create an Ubuntu 22.04 VM?" --no-button Do-Over 10 58); then - echo -e "${RD}Creating an Ubuntu 22.04 VM using the above advanced settings${CL}" + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Ubuntu 22.04 VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 22.04 VM using the above advanced settings${CL}" else header_info - echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" advanced_settings fi } @@ -326,11 +363,11 @@ function advanced_settings() { function start_script() { if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then header_info - echo -e "${BL}Using Default Settings${CL}" + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" default_settings else header_info - echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" advanced_settings fi } @@ -380,7 +417,7 @@ msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') case $STORAGE_TYPE in -nfs | dir) +nfs | dir | cifs) DISK_EXT=".qcow2" DISK_REF="$VMID/" DISK_IMPORT="-format qcow2" @@ -402,27 +439,61 @@ done msg_info "Creating a Ubuntu 22.04 VM" qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ - -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci + -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null qm set $VMID \ -efidisk0 ${DISK0_REF}${FORMAT} \ - -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ -ide2 ${STORAGE}:cloudinit \ -boot order=scsi0 \ - -serial0 socket \ - -description "
+ -serial0 socket >/dev/null +DESCRIPTION=$( + cat < + + Logo + - # Ubuntu 22.04 VM +

ubuntu VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + +
+EOF +) +qm set "$VMID" -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi - -
" >/dev/null msg_ok "Created a Ubuntu 22.04 VM ${CL}${BL}(${HN})" if [ "$START_VM" == "yes" ]; then msg_info "Starting Ubuntu 22.04 VM" qm start $VMID msg_ok "Started Ubuntu 22.04 VM" fi + msg_ok "Completed Successfully!\n" echo -e "Setup Cloud-Init before starting \n -More info at https://github.com/tteck/Proxmox/discussions/2072 \n" +More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n" diff --git a/vm/ubuntu2404-vm.sh b/vm/ubuntu2404-vm.sh index c789ecc9b..b6b18809b 100644 --- a/vm/ubuntu2404-vm.sh +++ b/vm/ubuntu2404-vm.sh @@ -22,17 +22,37 @@ GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1: NEXTID=$(pvesh get /cluster/nextid) YW=$(echo "\033[33m") -BL=$(echo "\033[36m") -HA=$(echo "\033[1;34m") +BL=$(echo "\033[36m") RD=$(echo "\033[01;31m") BGN=$(echo "\033[4;92m") GN=$(echo "\033[1;92m") DGN=$(echo "\033[32m") CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") BFR="\\r\\033[K" -HOLD="-" -CM="${GN}βœ“${CL}" -CROSS="${RD}βœ—${CL}" +HOLD=" " +TAB=" " + +CM="${TAB}βœ”οΈ${TAB}${CL}" +CROSS="${TAB}βœ–οΈ${TAB}${CL}" +INFO="${TAB}πŸ’‘${TAB}${CL}" +OS="${TAB}πŸ–₯️${TAB}${CL}" +CONTAINERTYPE="${TAB}πŸ“¦${TAB}${CL}" +DISKSIZE="${TAB}πŸ’Ύ${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}πŸ› οΈ${TAB}${CL}" +CONTAINERID="${TAB}πŸ†”${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}πŸŒ‰${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}βš™οΈ${TAB}${CL}" +MACADDRESS="${TAB}πŸ”—${TAB}${CL}" +VLANTAG="${TAB}🏷️${TAB}${CL}" +CREATING="${TAB}πŸš€${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + THIN="discard=on,ssd=1," set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR @@ -63,22 +83,22 @@ pushd $TEMP_DIR >/dev/null if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 24.04 VM" --yesno "This will create a New Ubuntu 24.04 VM. Proceed?" 10 58; then : else - header_info && echo -e "⚠ User exited script \n" && exit + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit fi function msg_info() { local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" } function msg_ok() { local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" + echo -e "${BFR}${CM}${GN}${msg}${CL}" } function msg_error() { local msg="$1" - echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" } function check_root() { @@ -93,17 +113,18 @@ function check_root() { function pve_check() { if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then - msg_error "This version of Proxmox Virtual Environment is not supported" + msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" echo -e "Requires Proxmox Virtual Environment Version 8.1 or later." echo -e "Exiting..." sleep 2 exit -fi + fi } function arch_check() { if [ "$(dpkg --print-architecture)" != "amd64" ]; then - msg_error "This script will not work with PiMox! \n" + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" echo -e "Exiting..." sleep 2 exit @@ -125,7 +146,7 @@ function ssh_check() { function exit-script() { clear - echo -e "⚠ User exited script \n" + echo -e "\n${CROSS}${RD}User exited script${CL}\n" exit } @@ -133,6 +154,7 @@ function default_settings() { VMID="$NEXTID" FORMAT=",efitype=4m" MACHINE="" + DISK_SIZE="7G" DISK_CACHE="" HN="ubuntu" CPU_TYPE="" @@ -142,18 +164,21 @@ function default_settings() { MAC="$GEN_MAC" VLAN="" MTU="" - echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}" - echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}" - echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" - echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}" - echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" - echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}" - echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}" - echo -e "${DGN}Using Bridge: ${BGN}${BRG}${CL}" - echo -e "${DGN}Using MAC Address: ${BGN}${MAC}${CL}" - echo -e "${DGN}Using VLAN: ${BGN}Default${CL}" - echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}" - echo -e "${BL}Creating an Ubuntu 24.04 VM using the above default settings${CL}" + START_VM="yes" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 24.04 VM using the above default settings${CL}" } function advanced_settings() { @@ -167,7 +192,7 @@ function advanced_settings() { sleep 2 continue fi - echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" break else exit-script @@ -179,27 +204,42 @@ function advanced_settings() { "q35" "Machine q35" OFF \ 3>&1 1>&2 2>&3); then if [ $MACH = q35 ]; then - echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" FORMAT="" MACHINE=" -machine q35" else - echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" FORMAT=",efitype=4m" MACHINE="" fi else exit-script fi - + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ "0" "None (Default)" ON \ "1" "Write Through" OFF \ 3>&1 1>&2 2>&3); then if [ $DISK_CACHE = "1" ]; then - echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" DISK_CACHE="cache=writethrough," else - echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" DISK_CACHE="" fi else @@ -209,10 +249,10 @@ function advanced_settings() { if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 ubuntu --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $VM_NAME ]; then HN="ubuntu" - echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" else HN=$(echo ${VM_NAME,,} | tr -d ' ') - echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" fi else exit-script @@ -223,10 +263,10 @@ function advanced_settings() { "1" "Host" OFF \ 3>&1 1>&2 2>&3); then if [ $CPU_TYPE1 = "1" ]; then - echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" CPU_TYPE=" -cpu host" else - echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" CPU_TYPE="" fi else @@ -236,9 +276,9 @@ function advanced_settings() { if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $CORE_COUNT ]; then CORE_COUNT="2" - echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" else - echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" fi else exit-script @@ -247,9 +287,9 @@ function advanced_settings() { if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $RAM_SIZE ]; then RAM_SIZE="2048" - echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" else - echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" fi else exit-script @@ -258,9 +298,9 @@ function advanced_settings() { if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $BRG ]; then BRG="vmbr0" - echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" else - echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" fi else exit-script @@ -269,10 +309,10 @@ function advanced_settings() { if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $MAC1 ]; then MAC="$GEN_MAC" - echo -e "${DGN}Using MAC Address: ${BGN}$MAC${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" else MAC="$MAC1" - echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" fi else exit-script @@ -282,10 +322,10 @@ function advanced_settings() { if [ -z $VLAN1 ]; then VLAN1="Default" VLAN="" - echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" else VLAN=",tag=$VLAN1" - echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" fi else exit-script @@ -295,20 +335,28 @@ function advanced_settings() { if [ -z $MTU1 ]; then MTU1="Default" MTU="" - echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" else MTU=",mtu=$MTU1" - echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" fi else exit-script fi - if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create an Ubuntu 24.04 VM?" --no-button Do-Over 10 58); then - echo -e "${RD}Creating an Ubuntu 24.04 VM using the above advanced settings${CL}" + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Ubuntu 24.04 VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 24.04 VM using the above advanced settings${CL}" else header_info - echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" advanced_settings fi } @@ -316,15 +364,14 @@ function advanced_settings() { function start_script() { if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then header_info - echo -e "${BL}Using Default Settings${CL}" + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" default_settings else header_info - echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" advanced_settings fi } - check_root arch_check pve_check @@ -392,22 +439,61 @@ done msg_info "Creating a Ubuntu 24.04 VM" qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ - -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci + -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null qm set $VMID \ -efidisk0 ${DISK0_REF}${FORMAT} \ - -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ -ide2 ${STORAGE}:cloudinit \ -boot order=scsi0 \ - -serial0 socket \ - -description "
+ -serial0 socket >/dev/null +DESCRIPTION=$( + cat < + + Logo + - # Ubuntu 24.04 VM +

ubuntu VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + +
+EOF +) +qm set "$VMID" -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi - -
" >/dev/null msg_ok "Created a Ubuntu 24.04 VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Ubuntu 24.04 VM" + qm start $VMID + msg_ok "Started Ubuntu 24.04 VM" +fi + msg_ok "Completed Successfully!\n" echo -e "Setup Cloud-Init before starting \n -More info at https://github.com/tteck/Proxmox/discussions/2072 \n" +More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n" diff --git a/vm/ubuntu2410-vm.sh b/vm/ubuntu2410-vm.sh new file mode 100644 index 000000000..a512d81d6 --- /dev/null +++ b/vm/ubuntu2410-vm.sh @@ -0,0 +1,499 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +function header_info { + clear + cat <<"EOF" + __ ____ __ ___ __ __ _______ _ ____ ___ + / / / / /_ __ ______ / /___ __ |__ \/ // / < / __ \ | | / / |/ / + / / / / __ \/ / / / __ \/ __/ / / / __/ / // /_ / / / / / | | / / /|_/ / +/ /_/ / /_/ / /_/ / / / / /_/ /_/ / / __/__ __/ / / /_/ / | |/ / / / / +\____/_.___/\__,_/_/ /_/\__/\__,_/ /____/ /_/ (_)_/\____/ |___/_/ /_/ + +EOF +} +header_info +echo -e "\n Loading..." +GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') +NEXTID=$(pvesh get /cluster/nextid) + +YW=$(echo "\033[33m") +BL=$(echo "\033[36m") +RD=$(echo "\033[01;31m") +BGN=$(echo "\033[4;92m") +GN=$(echo "\033[1;92m") +DGN=$(echo "\033[32m") +CL=$(echo "\033[m") + +CL=$(echo "\033[m") +BOLD=$(echo "\033[1m") +BFR="\\r\\033[K" +HOLD=" " +TAB=" " + +CM="${TAB}βœ”οΈ${TAB}${CL}" +CROSS="${TAB}βœ–οΈ${TAB}${CL}" +INFO="${TAB}πŸ’‘${TAB}${CL}" +OS="${TAB}πŸ–₯️${TAB}${CL}" +CONTAINERTYPE="${TAB}πŸ“¦${TAB}${CL}" +DISKSIZE="${TAB}πŸ’Ύ${TAB}${CL}" +CPUCORE="${TAB}🧠${TAB}${CL}" +RAMSIZE="${TAB}πŸ› οΈ${TAB}${CL}" +CONTAINERID="${TAB}πŸ†”${TAB}${CL}" +HOSTNAME="${TAB}🏠${TAB}${CL}" +BRIDGE="${TAB}πŸŒ‰${TAB}${CL}" +GATEWAY="${TAB}🌐${TAB}${CL}" +DEFAULT="${TAB}βš™οΈ${TAB}${CL}" +MACADDRESS="${TAB}πŸ”—${TAB}${CL}" +VLANTAG="${TAB}🏷️${TAB}${CL}" +CREATING="${TAB}πŸš€${TAB}${CL}" +ADVANCED="${TAB}🧩${TAB}${CL}" + +THIN="discard=on,ssd=1," +set -e +trap 'error_handler $LINENO "$BASH_COMMAND"' ERR +trap cleanup EXIT +function error_handler() { + 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" + cleanup_vmid +} + +function cleanup_vmid() { + if qm status $VMID &>/dev/null; then + qm stop $VMID &>/dev/null + qm destroy $VMID &>/dev/null + fi +} + +function cleanup() { + popd >/dev/null + rm -rf $TEMP_DIR +} + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Ubuntu 24.10 VM" --yesno "This will create a New Ubuntu 24.10 VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + +function msg_info() { + local msg="$1" + echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR}${CM}${GN}${msg}${CL}" +} + +function msg_error() { + local msg="$1" + echo -e "${BFR}${CROSS}${RD}${msg}${CL}" +} + +function check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +function pve_check() { + if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then + msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" + echo -e "Requires Proxmox Virtual Environment Version 8.1 or later." + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function ssh_check() { + if command -v pveversion >/dev/null 2>&1; then + if [ -n "${SSH_CLIENT:+x}" ]; then + if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then + echo "you've been warned" + else + clear + exit + fi + fi + fi +} + +function exit-script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +function default_settings() { + VMID="$NEXTID" + FORMAT=",efitype=4m" + MACHINE="" + DISK_SIZE="8G" + DISK_CACHE="" + HN="ubuntu" + CPU_TYPE="" + CORE_COUNT="2" + RAM_SIZE="2048" + BRG="vmbr0" + MAC="$GEN_MAC" + VLAN="" + MTU="" + START_VM="yes" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 24.10 VM using the above default settings${CL}" +} + +function advanced_settings() { + while true; do + if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z "$VMID" ]; then + VMID="$NEXTID" + fi + if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then + echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" + sleep 2 + continue + fi + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" + break + else + exit-script + fi + done + + if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + "i440fx" "Machine i440fx" ON \ + "q35" "Machine q35" OFF \ + 3>&1 1>&2 2>&3); then + if [ $MACH = q35 ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT="" + MACHINE=" -machine q35" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + FORMAT=",efitype=4m" + MACHINE="" + fi + else + exit-script + fi + + if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') + if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then + DISK_SIZE="${DISK_SIZE}G" + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" + else + echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" + exit-script + fi + else + exit-script + fi + + if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "None (Default)" ON \ + "1" "Write Through" OFF \ + 3>&1 1>&2 2>&3); then + if [ $DISK_CACHE = "1" ]; then + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}" + DISK_CACHE="cache=writethrough," + else + echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" + DISK_CACHE="" + fi + else + exit-script + fi + + if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 ubuntu --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VM_NAME ]; then + HN="ubuntu" + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + else + HN=$(echo ${VM_NAME,,} | tr -d ' ') + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" + fi + else + exit-script + fi + + if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + "0" "KVM64 (Default)" ON \ + "1" "Host" OFF \ + 3>&1 1>&2 2>&3); then + if [ $CPU_TYPE1 = "1" ]; then + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + CPU_TYPE=" -cpu host" + else + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + CPU_TYPE="" + fi + else + exit-script + fi + + if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $CORE_COUNT ]; then + CORE_COUNT="2" + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + else + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" + fi + else + exit-script + fi + + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $RAM_SIZE ]; then + RAM_SIZE="2048" + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + else + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + fi + else + exit-script + fi + + if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $BRG ]; then + BRG="vmbr0" + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + else + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" + fi + else + exit-script + fi + + if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MAC1 ]; then + MAC="$GEN_MAC" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" + else + MAC="$MAC1" + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" + fi + else + exit-script + fi + + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $VLAN1 ]; then + VLAN1="Default" + VLAN="" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + else + VLAN=",tag=$VLAN1" + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" + fi + else + exit-script + fi + + if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if [ -z $MTU1 ]; then + MTU1="Default" + MTU="" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + else + MTU=",mtu=$MTU1" + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" + fi + else + exit-script + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" + START_VM="yes" + else + echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}" + START_VM="no" + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Ubuntu 24.10 VM?" --no-button Do-Over 10 58); then + echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 24.10 VM using the above advanced settings${CL}" + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +function start_script() { + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}" + default_settings + else + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}" + advanced_settings + fi +} + +check_root +arch_check +pve_check +ssh_check +start_script + +msg_info "Validating Storage" +while read -r line; do + TAG=$(echo $line | awk '{print $1}') + TYPE=$(echo $line | awk '{printf "%-10s", $2}') + FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') + ITEM=" Type: $TYPE Free: $FREE " + OFFSET=2 + if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then + MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) + fi + STORAGE_MENU+=("$TAG" "$ITEM" "OFF") +done < <(pvesm status -content images | awk 'NR>1') +VALID=$(pvesm status -content images | awk 'NR>1') +if [ -z "$VALID" ]; then + msg_error "Unable to detect a valid storage location." + exit +elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then + STORAGE=${STORAGE_MENU[0]} +else + 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 ${HN}?\nTo make a selection, use the Spacebar.\n" \ + 16 $(($MSG_MAX_LENGTH + 23)) 6 \ + "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit + done +fi +msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." +msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." +msg_info "Retrieving the URL for the Ubuntu 24.0 Disk Image" +URL=https://cloud-images.ubuntu.com/oracular/current/oracular-server-cloudimg-amd64.img +sleep 2 +msg_ok "${CL}${BL}${URL}${CL}" +wget -q --show-progress $URL +echo -en "\e[1A\e[0K" +FILE=$(basename $URL) +msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" + +STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') +case $STORAGE_TYPE in +nfs | dir | cifs) + DISK_EXT=".qcow2" + DISK_REF="$VMID/" + DISK_IMPORT="-format qcow2" + THIN="" + ;; +btrfs) + DISK_EXT=".raw" + DISK_REF="$VMID/" + DISK_IMPORT="-format raw" + FORMAT=",efitype=4m" + THIN="" + ;; +esac +for i in {0,1}; do + disk="DISK$i" + eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} + eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} +done + +msg_info "Creating a Ubuntu 24.10 VM" +qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ + -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci +pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null +qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null +qm set $VMID \ + -efidisk0 ${DISK0_REF}${FORMAT} \ + -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ + -ide2 ${STORAGE}:cloudinit \ + -boot order=scsi0 \ + -serial0 socket >/dev/null +DESCRIPTION=$( + cat < + + Logo + + +

Ubuntu 24.10 VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + +
+EOF +) +qm set "$VMID" -description "$DESCRIPTION" >/dev/null +if [ -n "$DISK_SIZE" ]; then + msg_info "Resizing disk to $DISK_SIZE GB" + qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null +else + msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB" + qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null +fi + +msg_ok "Created a Ubuntu 24.10 VM ${CL}${BL}(${HN})" +if [ "$START_VM" == "yes" ]; then + msg_info "Starting Ubuntu 24.10 VM" + qm start $VMID + msg_ok "Started Ubuntu 24.10 VM" +fi + +msg_ok "Completed Successfully!\n" +echo -e "Setup Cloud-Init before starting \n +More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n"