diff --git a/.github/workflows/frontend-cicd.yml b/.github/workflows/frontend-cicd.yml index c476fe9a6..78dd86ccd 100644 --- a/.github/workflows/frontend-cicd.yml +++ b/.github/workflows/frontend-cicd.yml @@ -28,7 +28,83 @@ jobs: runs-on: ubuntu-latest defaults: run: - working-directory: frontend # Set default working directory for all run steps + working-directory: frontend + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + + - name: Test JSON files + run: | + python3 << 'EOF' + import json + import glob + import os + import sys + + def test_json_files(): + # Change to the correct directory + json_dir = "public/json" + if not os.path.exists(json_dir): + print(f"❌ Directory not found: {json_dir}") + return False + + # Find all JSON files + pattern = os.path.join(json_dir, "*.json") + json_files = glob.glob(pattern) + + if not json_files: + print(f"⚠️ No JSON files found in {json_dir}") + return True + + print(f"Testing {len(json_files)} JSON files for valid syntax...") + + invalid_files = [] + + for file_path in json_files: + try: + with open(file_path, 'r', encoding='utf-8') as f: + json.load(f) + print(f"✅ Valid JSON: {file_path}") + except json.JSONDecodeError as e: + print(f"❌ Invalid JSON syntax in: {file_path}") + print(f" Error: {e}") + invalid_files.append(file_path) + except Exception as e: + print(f"⚠️ Error reading: {file_path}") + print(f" Error: {e}") + invalid_files.append(file_path) + + print("\n=== JSON Validation Summary ===") + print(f"Total files tested: {len(json_files)}") + print(f"Valid files: {len(json_files) - len(invalid_files)}") + print(f"Invalid files: {len(invalid_files)}") + + if invalid_files: + print("\n❌ Found invalid JSON file(s):") + for file_path in invalid_files: + print(f" - {file_path}") + return False + else: + print("\n✅ All JSON files have valid syntax!") + return True + + if __name__ == "__main__": + success = test_json_files() + sys.exit(0 if success else 1) + EOF + + build: + if: github.repository == 'community-scripts/ProxmoxVE' + needs: test-json-files + runs-on: ubuntu-latest + defaults: + run: + working-directory: frontend steps: - name: Checkout uses: actions/checkout@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index a65a53c97..80e234dbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,132 @@ > [!CAUTION] Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes. +## 2025-07-28 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - add 'g++' to actualbudget-install.sh [@saivishnu725](https://github.com/saivishnu725) ([#6293](https://github.com/community-scripts/ProxmoxVE/pull/6293)) + + - #### ✨ New Features + + - ProxmoxVE 9.0 Beta: add BETA Version as test in pve_check [@MickLesk](https://github.com/MickLesk) ([#6295](https://github.com/community-scripts/ProxmoxVE/pull/6295)) + - karakeep: Run workers in prod without tsx [@vhsdream](https://github.com/vhsdream) ([#6285](https://github.com/community-scripts/ProxmoxVE/pull/6285)) + +## 2025-07-27 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - karakeep: export DATA_DIR from user config in update [@vhsdream](https://github.com/vhsdream) ([#6283](https://github.com/community-scripts/ProxmoxVE/pull/6283)) + - go2rtc: Fix release download handling [@tremor021](https://github.com/tremor021) ([#6280](https://github.com/community-scripts/ProxmoxVE/pull/6280)) + +## 2025-07-26 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - PiAlert: Update dependencies [@leiweibau](https://github.com/leiweibau) ([#6251](https://github.com/community-scripts/ProxmoxVE/pull/6251)) + +## 2025-07-25 + +### 🆕 New Scripts + + - Cleanuparr ([#6238](https://github.com/community-scripts/ProxmoxVE/pull/6238)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Immich: fix #6236 [@vhsdream](https://github.com/vhsdream) ([#6243](https://github.com/community-scripts/ProxmoxVE/pull/6243)) + - Wizarr: use absolute path to uv [@vhsdream](https://github.com/vhsdream) ([#6221](https://github.com/community-scripts/ProxmoxVE/pull/6221)) + - Immich v1.136.0 [@vhsdream](https://github.com/vhsdream) ([#6219](https://github.com/community-scripts/ProxmoxVE/pull/6219)) + +## 2025-07-24 + +### 🆕 New Scripts + + - Alpine TeamSpeak Server [@tremor021](https://github.com/tremor021) ([#6201](https://github.com/community-scripts/ProxmoxVE/pull/6201)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Immich: Pin Version to v1.135.3 [@MickLesk](https://github.com/MickLesk) ([#6212](https://github.com/community-scripts/ProxmoxVE/pull/6212)) + - Habitica: force npm to 10 [@MickLesk](https://github.com/MickLesk) ([#6192](https://github.com/community-scripts/ProxmoxVE/pull/6192)) + - sabnzbd: add uv setup in update [@MickLesk](https://github.com/MickLesk) ([#6191](https://github.com/community-scripts/ProxmoxVE/pull/6191)) + + - #### ✨ New Features + + - SnipeIT - Update dependencies [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#6217](https://github.com/community-scripts/ProxmoxVE/pull/6217)) + - Refactor: VictoriaMetrics [@tremor021](https://github.com/tremor021) ([#6210](https://github.com/community-scripts/ProxmoxVE/pull/6210)) + - Headscale: Add headscale-admin UI as option [@tremor021](https://github.com/tremor021) ([#6205](https://github.com/community-scripts/ProxmoxVE/pull/6205)) + + - #### 🔧 Refactor + + - Refactor: Gokapi [@tremor021](https://github.com/tremor021) ([#6197](https://github.com/community-scripts/ProxmoxVE/pull/6197)) + - Refactor: duplicati [@tremor021](https://github.com/tremor021) ([#6202](https://github.com/community-scripts/ProxmoxVE/pull/6202)) + - Refactor: go2rtc [@tremor021](https://github.com/tremor021) ([#6198](https://github.com/community-scripts/ProxmoxVE/pull/6198)) + - Refactor: Headscale [@tremor021](https://github.com/tremor021) ([#6180](https://github.com/community-scripts/ProxmoxVE/pull/6180)) + +## 2025-07-23 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - documenso: remove customerId by creating initial user [@MickLesk](https://github.com/MickLesk) ([#6171](https://github.com/community-scripts/ProxmoxVE/pull/6171)) + +## 2025-07-22 + +### 🆕 New Scripts + + - Salt ([#6116](https://github.com/community-scripts/ProxmoxVE/pull/6116)) +- LinkStack ([#6137](https://github.com/community-scripts/ProxmoxVE/pull/6137)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - tools.func - fix typo for target_file [@tjcomserv](https://github.com/tjcomserv) ([#6156](https://github.com/community-scripts/ProxmoxVE/pull/6156)) + - fix(nginxproxymanager.sh): Set the version number before build. [@JMarcosHP](https://github.com/JMarcosHP) ([#6139](https://github.com/community-scripts/ProxmoxVE/pull/6139)) + + - #### ✨ New Features + + - Fixed the previous fix of the anti-nag hook and propagated fixes everywhere [@imcrazytwkr](https://github.com/imcrazytwkr) ([#6162](https://github.com/community-scripts/ProxmoxVE/pull/6162)) + - [core]: Improved LXC Container Startup Handling [@MickLesk](https://github.com/MickLesk) ([#6142](https://github.com/community-scripts/ProxmoxVE/pull/6142)) + - wallos: add cron in installer for yearly cost [@CrazyWolf13](https://github.com/CrazyWolf13) ([#6133](https://github.com/community-scripts/ProxmoxVE/pull/6133)) + + - #### 💥 Breaking Changes + + - gitea-mirror: add: migration to 3.0 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#6138](https://github.com/community-scripts/ProxmoxVE/pull/6138)) + + - #### 🔧 Refactor + + - [core]: tools.func: increase setup_php function [@MickLesk](https://github.com/MickLesk) ([#6141](https://github.com/community-scripts/ProxmoxVE/pull/6141)) + +### 🌐 Website + + - Bump form-data from 4.0.3 to 4.0.4 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#6150](https://github.com/community-scripts/ProxmoxVE/pull/6150)) + ## 2025-07-21 +### 🆕 New Scripts + + - Teamspeak-Server ([#6121](https://github.com/community-scripts/ProxmoxVE/pull/6121)) + +### 🚀 Updated Scripts + + - pve-post-installer: remove Nag-File if already exist [@luckman212](https://github.com/luckman212) ([#6098](https://github.com/community-scripts/ProxmoxVE/pull/6098)) + + - #### 🐞 Bug Fixes + + - firefly: fix permissions at update [@MickLesk](https://github.com/MickLesk) ([#6119](https://github.com/community-scripts/ProxmoxVE/pull/6119)) + - nginxproxymanager: remove injected footer link (tteck) [@MickLesk](https://github.com/MickLesk) ([#6117](https://github.com/community-scripts/ProxmoxVE/pull/6117)) + ## 2025-07-20 ### 🚀 Updated Scripts diff --git a/ct/alpine-teamspeak-server.sh b/ct/alpine-teamspeak-server.sh new file mode 100644 index 000000000..224e4b147 --- /dev/null +++ b/ct/alpine-teamspeak-server.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 (Slaviša Arežina) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://teamspeak.com/en/ + +APP="Alpine-TeamSpeak-Server" +var_tags="${var_tags:-alpine;communication}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-2}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.22}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + + if [[ ! -d /opt/teamspeak-server ]]; then + msg_error "No ${APP} Installation Found!" + exit 1 + fi + + set +o pipefail && RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.teamspeak3-server_linux_amd64-([0-9]+.[0-9]+.[0-9]+)./\1/p' | head -1) && set -o pipefail + + if [ "${RELEASE}" != "$(cat ~/.teamspeak-server)" ] || [ ! -f ~/.teamspeak-server ]; then + msg_info "Updating ${APP} LXC" + $STD apk -U upgrade + $STD service teamspeak stop + curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2 + tar -xf ./ts3server.tar.bz2 + cp -ru teamspeak3-server_linux_amd64/* /opt/teamspeak-server/ + rm -f ~/ts3server.tar.bz* + rm -rf teamspeak3-server_linux_amd64 + echo "${RELEASE}" >~/.teamspeak-server + $STD service teamspeak start + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + + exit 0 +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following IP:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}${IP}:9987${CL}" diff --git a/ct/cleanuparr.sh b/ct/cleanuparr.sh new file mode 100755 index 000000000..15cc87f35 --- /dev/null +++ b/ct/cleanuparr.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Lucas Zampieri (zampierilucas) | MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Cleanuparr/Cleanuparr + +APP="Cleanuparr" +var_tags="${var_tags:-arr}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -f /opt/cleanuparr/Cleanuparr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/Cleanuparr/Cleanuparr/releases/latest | jq -r '.tag_name' | sed 's/^v//') + if [[ "${RELEASE}" != "$(cat ~/.Cleanuparr 2>/dev/null)" ]] || [[ ! -f ~/.Cleanuparr ]]; then + msg_info "Stopping ${APP}" + systemctl stop cleanuparr + msg_ok "Stopped ${APP}" + + fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "$RELEASE" "/opt/cleanuparr" "*linux-amd64.zip" + + msg_info "Starting ${APP}" + systemctl start cleanuparr + 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}:11011${CL}" diff --git a/ct/duplicati.sh b/ct/duplicati.sh index 81a39e0d7..41b61f131 100644 --- a/ct/duplicati.sh +++ b/ct/duplicati.sh @@ -27,25 +27,19 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + RELEASE=$(curl -fsSL https://api.github.com/repos/duplicati/duplicati/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') - if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + if [[ "${RELEASE}" != "$(cat ~/.duplicati)" ]] || [[ ! -f ~/.duplicati ]]; then msg_info "Stopping $APP" systemctl stop duplicati msg_ok "Stopped $APP" - msg_info "Updating $APP to v${RELEASE}" - curl -fsSL "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb" -o $(basename "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb") - $STD dpkg -i duplicati-${RELEASE}-linux-x64-gui.deb - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated $APP to v${RELEASE}" + + fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "linux-x64-gui.deb" msg_info "Starting $APP" systemctl start duplicati msg_ok "Started $APP" - msg_info "Cleaning Up" - rm -rf ~/duplicati-${RELEASE}-linux-x64-gui.deb - msg_ok "Cleanup Completed" - msg_ok "Update Successful" else msg_ok "No update required. ${APP} is already at v${RELEASE}" diff --git a/ct/firefly.sh b/ct/firefly.sh index 5a7991947..3e94f84d1 100644 --- a/ct/firefly.sh +++ b/ct/firefly.sh @@ -46,9 +46,13 @@ function update_script() { rm -rf /opt/firefly/storage cp /opt/.env /opt/firefly/.env cp -r /opt/storage /opt/firefly/storage - cd /opt/firefly + chown -R www-data:www-data /opt/firefly - chmod -R 775 /opt/firefly/storage + find /opt/firefly/storage -type d -exec chmod 775 {} \; + find /opt/firefly/storage -type f -exec chmod 664 {} \; + mkdir -p /opt/firefly/storage/framework/{cache/data,sessions,views} + $STD sudo -u www-data php /opt/firefly/artisan cache:clear + $STD php artisan migrate --seed --force $STD php artisan cache:clear $STD php artisan view:clear diff --git a/ct/gitea-mirror.sh b/ct/gitea-mirror.sh index fadf6d3ef..5b33c6696 100644 --- a/ct/gitea-mirror.sh +++ b/ct/gitea-mirror.sh @@ -28,6 +28,26 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + + APP_VERSION=$(grep -o '"version": *"[^"]*"' /opt/gitea-mirror/package.json | cut -d'"' -f4) + if [[ $APP_VERSION =~ ^2\. ]]; then + if ! whiptail --backtitle "Gitea Mirror Update" --title "⚠️ VERSION 2.x DETECTED" --yesno \ + "WARNING: Version $APP_VERSION detected!\n\nUpdating from version 2.x will CLEAR ALL CONFIGURATION.\n\nThis includes:\n• API tokens\n• User settings\n• Repository configurations\n• All custom settings\n\nDo you want to continue with the update process?" 15 70 --defaultno + then + exit 0 + fi + + if ! whiptail --backtitle "Gitea Mirror Update" --title "⚠️ FINAL CONFIRMATION" --yesno \ + "FINAL WARNING: This update WILL clear all configuration!\n\nBEFORE PROCEEDING, please:\n\n• Copy API tokens to a safe location\n• Backup any custom configurations\n• Note down repository settings\n\nThis action CANNOT be undone!" 18 70 --defaultno + then + whiptail --backtitle "Gitea Mirror Update" --title "Update Cancelled" --msgbox "Update process cancelled. Please backup your configuration before proceeding." 8 60 + exit 0 + fi + whiptail --backtitle "Gitea Mirror Update" --title "Proceeding with Update" --msgbox \ + "Proceeding with version $APP_VERSION update.\n\nAll configuration will be cleared as warned." 8 50 + rm -rf /opt/gitea-mirror + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/RayLabsHQ/gitea-mirror/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') if [[ "${RELEASE}" != "$(cat ~/.${APP} 2>/dev/null || cat /opt/${APP}_version.txt 2>/dev/null)" ]]; then diff --git a/ct/go2rtc.sh b/ct/go2rtc.sh index d79378e26..6dd8a51d0 100644 --- a/ct/go2rtc.sh +++ b/ct/go2rtc.sh @@ -27,14 +27,23 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating $APP" - systemctl stop go2rtc - cd /opt/go2rtc - rm go2rtc_linux_amd64 - curl -fsSL "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64" -o $(basename "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64") - chmod +x go2rtc_linux_amd64 - systemctl start go2rtc - msg_ok "Updated $APP" + + RELEASE=$(curl -fsSL https://api.github.com/repos/AlexxIT/go2rtc/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.go2rtc 2>/dev/null)" ]] || [[ ! -f ~/.go2rtc ]]; then + msg_info "Stopping service" + systemctl stop go2rtc + msg_ok "Stopped service" + + fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/opt/go2rtc" "go2rtc_linux_amd64" + + msg_info "Starting service" + systemctl start go2rtc + msg_ok "Started service" + + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi exit } diff --git a/ct/gokapi.sh b/ct/gokapi.sh index 474361047..94d2b3c81 100644 --- a/ct/gokapi.sh +++ b/ct/gokapi.sh @@ -27,8 +27,27 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_error "Currently we don't provide an update function for this ${APP}." - exit + if [[ -f /opt/${APP}_version.txt ]]; then + mv /opt/${APP}_version ~/.gokapi + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/Forceu/Gokapi/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.gokapi 2>/dev/null)" ]] || [[ ! -f ~/.gokapi ]]; then + msg_info "Stopping ${APP}" + systemctl stop gokapi + msg_ok "Stopped ${APP}" + + fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "gokapi-linux_amd64.zip" + + msg_info "Starting ${APP}" + systemctl start gokapi + msg_ok "Started ${APP}" + + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit } start diff --git a/ct/headers/alpine-teamspeak-server b/ct/headers/alpine-teamspeak-server new file mode 100644 index 000000000..cfa5aeb9f --- /dev/null +++ b/ct/headers/alpine-teamspeak-server @@ -0,0 +1,6 @@ + ___ __ _ ______ _____ __ _____ + / | / /___ (_)___ ___ /_ __/__ ____ _____ ___ / ___/____ ___ ____ _/ /__ / ___/___ ______ _____ _____ + / /| | / / __ \/ / __ \/ _ \______/ / / _ \/ __ `/ __ `__ \\__ \/ __ \/ _ \/ __ `/ //_/_____\__ \/ _ \/ ___/ | / / _ \/ ___/ + / ___ |/ / /_/ / / / / / __/_____/ / / __/ /_/ / / / / / /__/ / /_/ / __/ /_/ / ,< /_____/__/ / __/ / | |/ / __/ / +/_/ |_/_/ .___/_/_/ /_/\___/ /_/ \___/\__,_/_/ /_/ /_/____/ .___/\___/\__,_/_/|_| /____/\___/_/ |___/\___/_/ + /_/ /_/ diff --git a/ct/headers/cleanuparr b/ct/headers/cleanuparr new file mode 100644 index 000000000..28427b25d --- /dev/null +++ b/ct/headers/cleanuparr @@ -0,0 +1,6 @@ + ________ + / ____/ /__ ____ _____ __ ______ ____ ___________ + / / / / _ \/ __ `/ __ \/ / / / __ \/ __ `/ ___/ ___/ +/ /___/ / __/ /_/ / / / / /_/ / /_/ / /_/ / / / / +\____/_/\___/\__,_/_/ /_/\__,_/ .___/\__,_/_/ /_/ + /_/ diff --git a/ct/headers/linkstack b/ct/headers/linkstack new file mode 100644 index 000000000..c3413d299 --- /dev/null +++ b/ct/headers/linkstack @@ -0,0 +1,6 @@ + __ _ __ _____ __ __ + / / (_)___ / /__/ ___// /_____ ______/ /__ + / / / / __ \/ //_/\__ \/ __/ __ `/ ___/ //_/ + / /___/ / / / / ,< ___/ / /_/ /_/ / /__/ ,< +/_____/_/_/ /_/_/|_|/____/\__/\__,_/\___/_/|_| + diff --git a/ct/headers/salt b/ct/headers/salt new file mode 100644 index 000000000..3b11949de --- /dev/null +++ b/ct/headers/salt @@ -0,0 +1,6 @@ + _____ ____ + / ___/____ _/ / /_ + \__ \/ __ `/ / __/ + ___/ / /_/ / / /_ +/____/\__,_/_/\__/ + diff --git a/ct/headers/teamspeak-server b/ct/headers/teamspeak-server new file mode 100644 index 000000000..92c3a8e42 --- /dev/null +++ b/ct/headers/teamspeak-server @@ -0,0 +1,6 @@ + ______ __ _____ + /_ __/__ ____ _____ ___ _________ ___ ____ _/ /__ / ___/___ ______ _____ _____ + / / / _ \/ __ `/ __ `__ \/ ___/ __ \/ _ \/ __ `/ //_/_____\__ \/ _ \/ ___/ | / / _ \/ ___/ + / / / __/ /_/ / / / / / (__ ) /_/ / __/ /_/ / ,< /_____/__/ / __/ / | |/ / __/ / +/_/ \___/\__,_/_/ /_/ /_/____/ .___/\___/\__,_/_/|_| /____/\___/_/ |___/\___/_/ + /_/ diff --git a/ct/headscale.sh b/ct/headscale.sh index c9ebf37f6..0b2bf0843 100644 --- a/ct/headscale.sh +++ b/ct/headscale.sh @@ -27,18 +27,18 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + if [[ -f /opt/${APP}_version.txt ]]; then + mv /opt/"${APP}_version.txt" ~/.headscale + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/juanfont/headscale/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + if [[ "${RELEASE}" != "$(cat ~/.headscale 2>/dev/null)" ]] || [[ ! -f ~/.headscale ]]; then msg_info "Stopping ${APP}" systemctl stop headscale msg_ok "Stopped ${APP}" - msg_info "Updating $APP to v${RELEASE}" - curl -fsSL "https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_amd64.deb" -o $(basename "https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_amd64.deb") - dpkg -i headscale_${RELEASE}_linux_amd64.deb - rm headscale_${RELEASE}_linux_amd64.deb - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated $APP to ${RELEASE}" + fetch_and_deploy_gh_release "headscale" "juanfont/headscale" "binary" + fetch_and_deploy_gh_release "headscale-admin" "GoodiesHQ/headscale-admin" "prebuild" "latest" "/opt/headscale-admin" "admin.zip" msg_info "Starting ${APP}" # Temporary fix until headscale project resolves service getting disabled on updates. diff --git a/ct/immich.sh b/ct/immich.sh index 6323b5a8e..be85b2d74 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -58,7 +58,8 @@ function update_script() { done msg_ok "Image-processing libraries updated" fi - RELEASE=$(curl -fsSL https://api.github.com/repos/immich-app/immich/releases?per_page=1 | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + RELEASE="1.136.0" + #RELEASE=$(curl -fsSL https://api.github.com/repos/immich-app/immich/releases?per_page=1 | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') if [[ -f ~/.immich && "$RELEASE" == "$(cat ~/.immich)" ]]; then msg_ok "No update required. ${APP} is already at v${RELEASE}" exit @@ -102,7 +103,7 @@ function update_script() { mkdir -p "$ML_DIR" rm -rf "$SRC_DIR" - fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "latest" "$SRC_DIR" + fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.136.0" "$SRC_DIR" msg_info "Updating ${APP} web and microservices" cd "$SRC_DIR"/server @@ -120,7 +121,7 @@ function update_script() { $STD npm ci $STD npm run build cd "$SRC_DIR" - cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,start*.sh} "$APP_DIR"/ + cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,bin/start.sh} "$APP_DIR"/ cp -a web/build "$APP_DIR"/www cp LICENSE "$APP_DIR" cd "$APP_DIR" diff --git a/ct/karakeep.sh b/ct/karakeep.sh index a0bd0288b..5b60db7a5 100644 --- a/ct/karakeep.sh +++ b/ct/karakeep.sh @@ -52,6 +52,10 @@ function update_script() { rm -rf /opt/karakeep msg_ok "Update prepared" + if grep -q "start:prod" /etc/systemd/system/karakeep-workers.service; then + sed -i 's|^ExecStart=.*$|ExecStart=/usr/bin/node dist/index.mjs|' /etc/systemd/system/karakeep-workers.service + systemctl daemon-reload + fi fetch_and_deploy_gh_release "karakeep" "karakeep-app/karakeep" if command -v corepack >/dev/null; then $STD corepack disable @@ -60,6 +64,7 @@ function update_script() { NODE_VERSION="22" NODE_MODULE="pnpm@${MODULE_VERSION}" setup_nodejs msg_info "Updating ${APP} to v${RELEASE}" + corepack enable export PUPPETEER_SKIP_DOWNLOAD="true" export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD="true" export NEXT_TELEMETRY_DISABLED=1 @@ -69,10 +74,12 @@ function update_script() { $STD pnpm build cd /opt/karakeep/apps/workers $STD pnpm install --frozen-lockfile + $STD pnpm build cd /opt/karakeep/apps/cli $STD pnpm install --frozen-lockfile $STD pnpm build - export DATA_DIR=/opt/karakeep_data + DATA_DIR="$(sed -n '/^DATA_DIR/p' /etc/karakeep/karakeep.env | awk -F= '{print $2}')" + export DATA_DIR="${DATA_DIR:-/opt/karakeep_data}" cd /opt/karakeep/packages/db $STD pnpm migrate $STD pnpm store prune diff --git a/ct/linkstack.sh b/ct/linkstack.sh new file mode 100644 index 000000000..f2a7972a8 --- /dev/null +++ b/ct/linkstack.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Omar Minaya | MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://linkstack.org/ + +APP="LinkStack" +var_tags="${var_tags:-os}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-5}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f ~/.linkstack ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + PHP_VERSION="8.3" PHP_MODULE="sqlite3" PHP_APACHE="YES" setup_php + msg_warn "LinkStack should be updated via the user interface." + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/ct/nginxproxymanager.sh b/ct/nginxproxymanager.sh index bd6b6da44..de0e921a0 100644 --- a/ct/nginxproxymanager.sh +++ b/ct/nginxproxymanager.sh @@ -46,6 +46,8 @@ function update_script() { msg_info "Building Frontend" ( + sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json + sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json cd ./frontend || exit $STD pnpm install $STD pnpm upgrade @@ -72,8 +74,6 @@ function update_script() { ln -sf /usr/bin/certbot /opt/certbot/bin/certbot ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx ln -sf /usr/local/openresty/nginx/ /etc/nginx - sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json - sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf") for NGINX_CONF in $NGINX_CONFS; do diff --git a/ct/sabnzbd.sh b/ct/sabnzbd.sh index d0bc60724..54b14ccb1 100644 --- a/ct/sabnzbd.sh +++ b/ct/sabnzbd.sh @@ -34,6 +34,7 @@ function update_script() { msg_ok "No update required. ${APP} is already at ${RELEASE}" exit fi + setup_uv msg_info "Updating $APP to ${RELEASE}" systemctl stop sabnzbd cp -r /opt/sabnzbd /opt/sabnzbd_backup_$(date +%s) diff --git a/ct/salt.sh b/ct/salt.sh new file mode 100644 index 000000000..cfdbb5450 --- /dev/null +++ b/ct/salt.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: bvdberg01 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/saltstack/salt + +APP="Salt" +var_tags="${var_tags:-automations}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-3}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /etc/salt ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/saltstack/salt/releases/latest | jq -r .tag_name | sed 's/^v//') + if [[ ! -f /~.salt ]] || [[ "${RELEASE}" != "$(cat /~.salt)" ]]; then + msg_info "Updating $APP to ${RELEASE}" + sed -i "s/^\(Pin: version \).*/\1${RELEASE}/" /etc/apt/preferences.d/salt-pin-1001 + $STD apt-get update + $STD apt-get upgrade -y + echo "${RELEASE}" >/~.salt + msg_ok "Updated ${APP} to ${RELEASE}" + else + msg_ok "${APP} is already up to date (${RELEASE})" + fi +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" diff --git a/ct/teamspeak-server.sh b/ct/teamspeak-server.sh new file mode 100644 index 000000000..d71aa8680 --- /dev/null +++ b/ct/teamspeak-server.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 (Slaviša Arežina) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://teamspeak.com/en/ + +APP="Teamspeak-Server" +var_tags="${var_tags:-voice;communication}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-2}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/teamspeak-server ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | grep -oP 'teamspeak3-server_linux_amd64-\K[0-9]+\.[0-9]+\.[0-9]+' | head -1) + if [[ "${RELEASE}" != "$(cat ~/.teamspeak-server 2>/dev/null)" ]] || [[ ! -f ~/.teamspeak-server ]]; then + msg_info "Stopping Service" + systemctl stop teamspeak-server + msg_ok "Stopped Service" + + msg_info "Updating ${APP}" + curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2 + tar -xf ./ts3server.tar.bz2 + cp -ru teamspeak3-server_linux_amd64/* /opt/teamspeak-server/ + rm -f ~/ts3server.tar.bz* + echo "${RELEASE}" >~/.teamspeak-server + msg_ok "Updated $APP" + + msg_info "Starting Service" + systemctl start teamspeak-server + msg_ok "Started Service" + + msg_ok "Updated Successfully" + else + msg_ok "Already up to date" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}${IP}:9987${CL}" diff --git a/ct/victoriametrics.sh b/ct/victoriametrics.sh index 6db9f1537..0311bfe3e 100644 --- a/ct/victoriametrics.sh +++ b/ct/victoriametrics.sh @@ -27,31 +27,25 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + RELEASE=$(curl -fsSL https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ ! -f ~/.victoriametrics ]] || [[ "${RELEASE}" != "$(cat ~/.victoriametrics)" ]]; then msg_info "Stopping $APP" systemctl stop victoriametrics + [[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl stop victoriametrics-logs msg_ok "Stopped $APP" - msg_info "Updating ${APP} to v${RELEASE}" - temp_dir=$(mktemp -d) - cd $temp_dir - curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/victoria-metrics-linux-arm64-v${RELEASE}.tar.gz" -o $(basename "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/victoria-metrics-linux-arm64-v${RELEASE}.tar.gz") - curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/vmutils-linux-arm64-v${RELEASE}.tar.gz" -o $(basename "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/vmutils-linux-arm64-v${RELEASE}.tar.gz") - find /opt/victoriametrics -maxdepth 1 -type f -executable -delete - tar -xf victoria-metrics-linux-arm64-v${RELEASE}.tar.gz -C /opt/victoriametrics - tar -xf vmutils-linux-arm64-v${RELEASE}.tar.gz -C /opt/victoriametrics + fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-arm64-v+([0-9.]).tar.gz" + fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-arm64-v+([0-9.]).tar.gz" + fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-arm64*.tar.gz" + fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-arm64*.tar.gz" chmod +x /opt/victoriametrics/* - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated $APP to v${RELEASE}" msg_info "Starting $APP" systemctl start victoriametrics + [[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl start victoriametrics-logs msg_ok "Started $APP" - msg_info "Cleaning Up" - rm -rf $temp_dir - msg_ok "Cleaned" msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at ${RELEASE}" diff --git a/ct/wallos.sh b/ct/wallos.sh index 00171d2b5..b2de579b5 100644 --- a/ct/wallos.sh +++ b/ct/wallos.sh @@ -41,6 +41,9 @@ function update_script() { rm -rf /opt/wallos/db/wallos.empty.db mv /opt/wallos.db /opt/wallos/db/wallos.db mv /opt/logos/* /opt/wallos/images/uploads/logos + if ! grep -q "storetotalyearlycost.php" /opt/wallos.cron; then + echo "30 1 * * 1 php /opt/wallos/endpoints/cronjobs/storetotalyearlycost.php >> /var/log/cron/storetotalyearlycost.log 2>&1" >> /opt/wallos.cron + fi chown -R www-data:www-data /opt/wallos chmod -R 755 /opt/wallos mkdir -p /var/log/cron diff --git a/ct/wizarr.sh b/ct/wizarr.sh index 4d3e1b371..98dff1661 100644 --- a/ct/wizarr.sh +++ b/ct/wizarr.sh @@ -45,13 +45,13 @@ function update_script() { msg_info "Updating $APP to v${RELEASE}" cd /opt/wizarr - uv -q sync --locked - $STD uv -q run pybabel compile -d app/translations + /usr/local/bin/uv -q sync --locked + $STD /usr/local/bin/uv -q run pybabel compile -d app/translations $STD npm --prefix app/static install $STD npm --prefix app/static run build:css mkdir -p ./.cache $STD tar -xf "$BACKUP_FILE" --directory=/ - $STD uv -q run flask db upgrade + $STD /usr/local/bin/uv -q run flask db upgrade msg_ok "Updated $APP to v${RELEASE}" msg_info "Starting $APP" diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d2d681f88..8f543dca7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7749,9 +7749,9 @@ } }, "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend/public/json/calibre-web.json b/frontend/public/json/calibre-web.json deleted file mode 100644 index f6a15a79c..000000000 --- a/frontend/public/json/calibre-web.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "Calibre-Web", - "slug": "calibre-web", - "categories": [ - 11 - ], - "date_created": "2024-05-02", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 8083, - "documentation": "https://github.com/janeczku/calibre-web/wiki", - "website": "https://github.com/janeczku/calibre-web", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/calibre-web.webp", - "config_path": "", - "description": "Calibre-Web is a web app for browsing, reading and downloading eBooks stored in a Calibre database.", - "install_methods": [ - { - "type": "default", - "script": "ct/calibre-web.sh", - "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 4, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": "admin", - "password": "admin123" - }, - "notes": [ - { - "text": "Add Calibre-Web Extras via `update`", - "type": "info" - } - ] -} diff --git a/frontend/public/json/cleanuparr.json b/frontend/public/json/cleanuparr.json new file mode 100644 index 000000000..bac2e3399 --- /dev/null +++ b/frontend/public/json/cleanuparr.json @@ -0,0 +1,35 @@ +{ + "name": "Cleanuparr", + "slug": "cleanuparr", + "categories": [ + 14 + ], + "date_created": "2025-07-25", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 11011, + "documentation": "https://cleanuparr.github.io/Cleanuparr/docs/", + "website": "https://github.com/Cleanuparr/Cleanuparr", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/cleanuparr.webp", + "config_path": "/opt/cleanuparr/config", + "description": "Cleanuparr is a tool for automating the cleanup of unwanted or blocked files in Sonarr, Radarr, and supported download clients like qBittorrent, Transmission, and Deluge. It removes incomplete, blocked, or malicious downloads and can trigger replacement searches to ensure your media library stays complete and up-to-date.", + "install_methods": [ + { + "type": "default", + "script": "ct/cleanuparr.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/headscale.json b/frontend/public/json/headscale.json index 323edb61b..4bca10f86 100644 --- a/frontend/public/json/headscale.json +++ b/frontend/public/json/headscale.json @@ -35,6 +35,10 @@ { "text": "Configuration settings: `/etc/headscale/config.yaml`", "type": "info" + }, + { + "text": "Access headscale-admin UI via `http:///admin/`", + "type": "info" } ] } diff --git a/frontend/public/json/linkstack.json b/frontend/public/json/linkstack.json new file mode 100644 index 000000000..ae369b644 --- /dev/null +++ b/frontend/public/json/linkstack.json @@ -0,0 +1,44 @@ +{ + "name": "LinkStack", + "slug": "linkstack", + "categories": [ + 9 + ], + "date_created": "2025-07-22", + "type": "ct", + "updateable": true, + "privileged": false, + "config_path": "/var/www/html/linkstack/.env", + "interface_port": 80, + "documentation": "https://docs.linkstack.org/", + "website": "https://linkstack.org/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/linkstack.webp", + "description": "LinkStack is an open-source, self-hosted alternative to Linktree, allowing users to create a customizable profile page to share multiple links, hosted on their own server.", + "install_methods": [ + { + "type": "default", + "script": "ct/linkstack.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 5, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "LinkStack can be updated via the user interface.", + "type": "info" + }, + { + "text": "Complete setup via the web interface at http:///. Check installation logs: `cat ~/linkstack-install.log`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/onlyoffice.json b/frontend/public/json/onlyoffice.json index 368943d7f..633c3cac0 100644 --- a/frontend/public/json/onlyoffice.json +++ b/frontend/public/json/onlyoffice.json @@ -2,7 +2,7 @@ "name": "ONLYOFFICE Docs", "slug": "onlyoffice", "categories": [ - 9 + 12 ], "date_created": "2025-06-24", "type": "ct", diff --git a/frontend/public/json/opnsense-vm.json b/frontend/public/json/opnsense-vm.json deleted file mode 100644 index aa5d35516..000000000 --- a/frontend/public/json/opnsense-vm.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "OPNsense", - "slug": "opnsense-vm", - "categories": [ - 4, - 2 - ], - "date_created": "2025-02-11", - "type": "vm", - "updateable": true, - "privileged": false, - "interface_port": 443, - "documentation": "https://docs.opnsense.org/", - "website": "https://opnsense.org/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/opnsense.webp", - "config_path": "", - "description": "OPNsense is an open-source firewall and routing platform based on FreeBSD. It provides advanced security features, including intrusion detection, VPN support, traffic shaping, and web filtering, with an intuitive web interface for easy management. Known for its reliability and regular updates, OPNsense is a popular choice for both businesses and home networks.", - "install_methods": [ - { - "type": "default", - "script": "vm/opnsense-vm.sh", - "resources": { - "cpu": 4, - "ram": 8192, - "hdd": 10, - "os": "FreeBSD", - "version": "latest" - } - } - ], - "default_credentials": { - "username": "root", - "password": "opnsense" - }, - "notes": [ - { - "text": "It will fail with default settings if there is no vmbr0 and vmbr1 on your node. Use advanced settings in this case.", - "type": "warning" - } - ] -} diff --git a/frontend/public/json/pulse.json b/frontend/public/json/pulse.json index db2da7d02..b92c6bf58 100644 --- a/frontend/public/json/pulse.json +++ b/frontend/public/json/pulse.json @@ -33,7 +33,7 @@ }, "notes": [ { - "text": "Create Proxmox-API-Token first: `https://github.com/rcourtman/Pulse?tab=readme-ov-file#creating-a-proxmox-api-token`", + "text": "Create Proxmox-API-Token first: `https://github.com/rcourtman/Pulse?tab=readme-ov-file#creating-api-token`", "type": "Info" }, { diff --git a/frontend/public/json/salt.json b/frontend/public/json/salt.json new file mode 100644 index 000000000..3f056a396 --- /dev/null +++ b/frontend/public/json/salt.json @@ -0,0 +1,35 @@ +{ + "name": "Salt", + "slug": "salt", + "categories": [ + 19 + ], + "date_created": "2025-07-22", + "type": "ct", + "updateable": true, + "privileged": false, + "config_path": "/opt/salt/.env", + "interface_port": 3000, + "documentation": "https://docs.saltproject.io/salt/install-guide/en/latest/", + "website": "https://saltproject.io/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/salt.webp", + "description": "SaltStack Salt is a software for automating the management and configuration of IT infrastructure and applications. It is an event-driven automation tool and framework used to deploy, configure, and manage complex IT systems. Its primary functions include configuration management, where it ensures consistent configurations and manages operating system deployment and software installation. It also automates and orchestrates routine IT processes and can create self-aware, self-healing systems.", + "install_methods": [ + { + "type": "default", + "script": "ct/salt.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 3, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/teamspeak-server.json b/frontend/public/json/teamspeak-server.json new file mode 100644 index 000000000..8944f2ff3 --- /dev/null +++ b/frontend/public/json/teamspeak-server.json @@ -0,0 +1,55 @@ +{ + "name": "Teamspeak-Server", + "slug": "teamspeak-server", + "categories": [ + 24 + ], + "date_created": "2025-07-21", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9987, + "documentation": "https://support.teamspeak.com/hc/en-us/categories/360000302017-TeamSpeak-3", + "website": "https://teamspeak.com/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/teamspeak-light.webp", + "config_path": "", + "description": "TeamSpeak is a voice over IP (VoIP) application, primarily used by gamers and teams to chat in real time on dedicated servers. It delivers crystal‑clear, low‑latency voice communication.", + "install_methods": [ + { + "type": "default", + "script": "ct/teamspeak-server.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-teamspeak-server.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 2, + "os": "alpine", + "version": "3.22" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Use `journalctl -u teamspeak-server.service` inside Debian LXC console to check for admin credentials!", + "type": "info" + }, + { + "text": "Use `cat /var/log/teamspeak.err.log` inside Alpine LXC console to check for admin credentials!", + "type": "info" + } + ] +} diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index cd4c83daf..c0c787cab 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,13 +1,193 @@ [ { - "name": "fallenbagel/jellyseerr", - "version": "preview-seerr", - "date": "2025-07-20T22:47:08Z" + "name": "umami-software/umami", + "version": "v2.19.0", + "date": "2025-07-27T22:25:00Z" }, { - "name": "Dolibarr/dolibarr", - "version": "21.0.2", - "date": "2025-07-20T17:02:07Z" + "name": "moghtech/komodo", + "version": "v1.18.4", + "date": "2025-06-25T00:06:56Z" + }, + { + "name": "dani-garcia/vaultwarden", + "version": "1.34.2", + "date": "2025-07-27T18:49:05Z" + }, + { + "name": "msgbyte/tianji", + "version": "v1.24.7", + "date": "2025-07-27T18:34:18Z" + }, + { + "name": "benjaminjonard/koillection", + "version": "1.6.16", + "date": "2025-07-27T14:48:37Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.2200", + "date": "2025-07-27T05:52:33Z" + }, + { + "name": "project-zot/zot", + "version": "v2.1.6", + "date": "2025-07-27T01:14:14Z" + }, + { + "name": "steveiliop56/tinyauth", + "version": "v3.6.2", + "date": "2025-07-17T12:08:03Z" + }, + { + "name": "aceberg/WatchYourLAN", + "version": "2.1.3", + "date": "2025-07-26T14:19:00Z" + }, + { + "name": "blakeblackshear/frigate", + "version": "v0.14.1", + "date": "2024-08-29T22:32:51Z" + }, + { + "name": "keycloak/keycloak", + "version": "26.3.2", + "date": "2025-07-24T10:14:27Z" + }, + { + "name": "MediaBrowser/Emby.Releases", + "version": "4.9.1.2", + "date": "2025-06-26T22:08:00Z" + }, + { + "name": "henrygd/beszel", + "version": "v0.12.1", + "date": "2025-07-25T23:53:12Z" + }, + { + "name": "gtsteffaniak/filebrowser", + "version": "v0.7.17-beta", + "date": "2025-07-25T22:03:43Z" + }, + { + "name": "ollama/ollama", + "version": "v0.10.0-rc2", + "date": "2025-07-25T21:24:06Z" + }, + { + "name": "homarr-labs/homarr", + "version": "v1.30.1", + "date": "2025-07-25T19:18:09Z" + }, + { + "name": "tailscale/tailscale", + "version": "v1.86.1", + "date": "2025-07-25T17:55:38Z" + }, + { + "name": "openobserve/openobserve", + "version": "v0.15.0-rc4", + "date": "2025-07-25T16:50:34Z" + }, + { + "name": "fuma-nama/fumadocs", + "version": "fumadocs-openapi@9.1.5", + "date": "2025-07-25T16:20:20Z" + }, + { + "name": "heiher/hev-socks5-server", + "version": "2.9.0", + "date": "2025-07-25T14:20:25Z" + }, + { + "name": "forgejo/forgejo", + "version": "v12.0.1", + "date": "2025-07-25T11:54:30Z" + }, + { + "name": "Luligu/matterbridge", + "version": "3.1.7", + "date": "2025-07-25T10:19:56Z" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.3-beta.10", + "date": "2025-07-15T06:07:03Z" + }, + { + "name": "ErsatzTV/ErsatzTV", + "version": "v25.3.1", + "date": "2025-07-25T03:39:31Z" + }, + { + "name": "TryGhost/Ghost-CLI", + "version": "v1.28.0", + "date": "2025-07-25T01:21:13Z" + }, + { + "name": "Brandawg93/PeaNUT", + "version": "v5.10.0", + "date": "2025-07-24T23:33:09Z" + }, + { + "name": "coder/code-server", + "version": "v4.102.2", + "date": "2025-07-24T22:42:01Z" + }, + { + "name": "linuxserver/Heimdall", + "version": "v2.7.3", + "date": "2025-07-24T18:07:21Z" + }, + { + "name": "docker/compose", + "version": "v2.39.1", + "date": "2025-07-24T17:02:01Z" + }, + { + "name": "wizarrrr/wizarr", + "version": "2025.7.7", + "date": "2025-07-24T16:44:19Z" + }, + { + "name": "immich-app/immich", + "version": "v1.136.0", + "date": "2025-07-24T16:42:30Z" + }, + { + "name": "meilisearch/meilisearch", + "version": "prototype-cellulite-1", + "date": "2025-07-24T16:32:57Z" + }, + { + "name": "grokability/snipe-it", + "version": "v8.2.1", + "date": "2025-07-24T14:37:54Z" + }, + { + "name": "Stirling-Tools/Stirling-PDF", + "version": "v1.1.0", + "date": "2025-07-24T14:08:58Z" + }, + { + "name": "glpi-project/glpi", + "version": "10.0.19", + "date": "2025-07-16T09:45:14Z" + }, + { + "name": "Paymenter/Paymenter", + "version": "v1.2.5", + "date": "2025-07-24T11:52:16Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.3.0p35-rc2", + "date": "2025-07-24T07:00:54Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.10.0", + "date": "2025-07-24T06:15:19Z" }, { "name": "firefly-iii/firefly-iii", @@ -15,14 +195,189 @@ "date": "2025-07-17T04:46:25Z" }, { - "name": "msgbyte/tianji", - "version": "v1.24.4", - "date": "2025-07-20T16:35:14Z" + "name": "advplyr/audiobookshelf", + "version": "v2.26.3", + "date": "2025-07-23T23:16:46Z" }, { - "name": "fuma-nama/fumadocs", - "version": "fumadocs-openapi@9.1.4", - "date": "2025-07-20T13:38:10Z" + "name": "minio/minio", + "version": "RELEASE.2025-07-23T15-54-02Z", + "date": "2025-07-23T20:35:39Z" + }, + { + "name": "grafana/grafana", + "version": "v12.1.0", + "date": "2025-07-23T19:35:52Z" + }, + { + "name": "semaphoreui/semaphore", + "version": "v2.16.0-beta6", + "date": "2025-07-23T19:18:14Z" + }, + { + "name": "fallenbagel/jellyseerr", + "version": "preview-plex-home-profile", + "date": "2025-07-23T16:40:31Z" + }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.516.1", + "date": "2025-07-23T14:16:23Z" + }, + { + "name": "traefik/traefik", + "version": "v3.5.0", + "date": "2025-07-23T14:06:54Z" + }, + { + "name": "Radarr/Radarr", + "version": "v5.26.2.10099", + "date": "2025-06-11T20:10:39Z" + }, + { + "name": "Prowlarr/Prowlarr", + "version": "v1.37.0.5076", + "date": "2025-06-04T11:04:53Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.103.2", + "date": "2025-07-22T11:22:26Z" + }, + { + "name": "zabbix/zabbix", + "version": "7.4.1rc1", + "date": "2025-07-23T11:54:39Z" + }, + { + "name": "cockpit-project/cockpit", + "version": "343", + "date": "2025-07-23T11:21:34Z" + }, + { + "name": "jhuckaby/Cronicle", + "version": "v0.9.85", + "date": "2025-07-22T23:49:53Z" + }, + { + "name": "raydak-labs/configarr", + "version": "v1.13.7", + "date": "2025-07-22T20:41:45Z" + }, + { + "name": "TasmoAdmin/TasmoAdmin", + "version": "v4.3.1", + "date": "2025-07-22T20:10:08Z" + }, + { + "name": "esphome/esphome", + "version": "2025.7.3", + "date": "2025-07-22T20:09:49Z" + }, + { + "name": "rcourtman/Pulse", + "version": "v3.42.0", + "date": "2025-07-14T22:07:28Z" + }, + { + "name": "Dolibarr/dolibarr", + "version": "21.0.2", + "date": "2025-07-22T16:58:05Z" + }, + { + "name": "PCJones/UmlautAdaptarr", + "version": "v0.7.3", + "date": "2025-07-22T14:39:54Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.134.0", + "date": "2025-07-15T13:43:39Z" + }, + { + "name": "goauthentik/authentik", + "version": "version/2025.4.4", + "date": "2025-07-22T13:08:15Z" + }, + { + "name": "crowdsecurity/crowdsec", + "version": "v1.6.11", + "date": "2025-07-22T12:11:38Z" + }, + { + "name": "home-assistant/core", + "version": "2025.7.3", + "date": "2025-07-22T08:30:59Z" + }, + { + "name": "mattermost/mattermost", + "version": "v9.11.18", + "date": "2025-07-22T06:18:08Z" + }, + { + "name": "adityachandelgit/BookLore", + "version": "v0.34.1", + "date": "2025-07-22T05:57:50Z" + }, + { + "name": "lazy-media/Reactive-Resume", + "version": "v1.2.2", + "date": "2025-07-22T03:12:54Z" + }, + { + "name": "ellite/Wallos", + "version": "v4.0.0", + "date": "2025-07-21T21:05:02Z" + }, + { + "name": "autobrr/autobrr", + "version": "v1.64.0", + "date": "2025-07-21T20:56:33Z" + }, + { + "name": "mongodb/mongo", + "version": "r8.2.0-rc0", + "date": "2025-07-21T19:07:52Z" + }, + { + "name": "HabitRPG/habitica", + "version": "v5.37.2", + "date": "2025-07-21T14:08:35Z" + }, + { + "name": "tobychui/zoraxy", + "version": "v3.2.5r2", + "date": "2025-07-21T12:52:26Z" + }, + { + "name": "mealie-recipes/mealie", + "version": "v3.0.2", + "date": "2025-07-21T12:33:19Z" + }, + { + "name": "bluenviron/mediamtx", + "version": "v1.13.1", + "date": "2025-07-21T11:57:03Z" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "pmm-6401-v1.122.0", + "date": "2025-07-21T10:40:07Z" + }, + { + "name": "nzbgetcom/nzbget", + "version": "v25.2", + "date": "2025-07-04T08:21:42Z" + }, + { + "name": "openhab/openhab-core", + "version": "5.0.0", + "date": "2025-07-21T07:16:58Z" + }, + { + "name": "pocket-id/pocket-id", + "version": "v1.6.4", + "date": "2025-07-21T05:53:30Z" }, { "name": "karakeep-app/karakeep", @@ -34,51 +389,16 @@ "version": "2025.7.19", "date": "2025-07-20T09:44:35Z" }, - { - "name": "semaphoreui/semaphore", - "version": "v2.16.0-beta1", - "date": "2025-07-20T09:43:36Z" - }, - { - "name": "tobychui/zoraxy", - "version": "v3.2.5", - "date": "2025-07-20T07:28:22Z" - }, { "name": "documenso/documenso", "version": "v1.12.2-rc.2", "date": "2025-07-20T07:05:19Z" }, - { - "name": "morpheus65535/bazarr", - "version": "v1.5.3-beta.10", - "date": "2025-07-15T06:07:03Z" - }, - { - "name": "Jackett/Jackett", - "version": "v0.22.2174", - "date": "2025-07-20T05:56:23Z" - }, { "name": "linkwarden/linkwarden", "version": "v2.11.5", "date": "2025-07-20T03:14:42Z" }, - { - "name": "steveiliop56/tinyauth", - "version": "v3.6.2", - "date": "2025-07-17T12:08:03Z" - }, - { - "name": "Luligu/matterbridge", - "version": "3.1.5", - "date": "2025-07-19T21:50:47Z" - }, - { - "name": "ellite/Wallos", - "version": "v3.3.1", - "date": "2025-07-19T20:51:00Z" - }, { "name": "pelican-dev/panel", "version": "v1.0.0-beta23", @@ -89,16 +409,16 @@ "version": "v1.0.0-beta15", "date": "2025-07-19T19:46:52Z" }, - { - "name": "MediaBrowser/Emby.Releases", - "version": "4.9.1.2", - "date": "2025-06-26T22:08:00Z" - }, { "name": "open-webui/open-webui", "version": "v0.6.18", "date": "2025-07-19T19:26:14Z" }, + { + "name": "karlomikus/bar-assistant", + "version": "v5.6.0", + "date": "2025-07-19T13:34:36Z" + }, { "name": "bunkerity/bunkerweb", "version": "v1.6.2", @@ -109,41 +429,6 @@ "version": "v0.29.0", "date": "2025-07-19T08:54:54Z" }, - { - "name": "Paymenter/Paymenter", - "version": "v1.2.4", - "date": "2025-07-19T07:42:25Z" - }, - { - "name": "esphome/esphome", - "version": "2025.7.2", - "date": "2025-07-19T00:05:00Z" - }, - { - "name": "minio/minio", - "version": "RELEASE.2025-07-18T21-56-31Z", - "date": "2025-07-18T23:56:46Z" - }, - { - "name": "Brandawg93/PeaNUT", - "version": "v5.9.4", - "date": "2025-07-18T21:50:31Z" - }, - { - "name": "rcourtman/Pulse", - "version": "v3.42.0", - "date": "2025-07-14T22:07:28Z" - }, - { - "name": "keycloak/keycloak", - "version": "26.2.6", - "date": "2025-07-17T11:16:34Z" - }, - { - "name": "homarr-labs/homarr", - "version": "v1.29.0", - "date": "2025-07-18T19:17:21Z" - }, { "name": "theonedev/onedev", "version": "v12.0.1", @@ -154,81 +439,31 @@ "version": "1.5.35", "date": "2025-06-22T08:30:10Z" }, - { - "name": "openhab/openhab-core", - "version": "5.0.0.RC1", - "date": "2025-07-18T13:17:28Z" - }, { "name": "wazuh/wazuh", - "version": "coverity-w29-4.13.0", - "date": "2025-07-16T12:35:22Z" - }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.102.4", - "date": "2025-07-17T11:27:58Z" + "version": "coverity-w30-4.13.0", + "date": "2025-07-18T12:05:26Z" }, { "name": "emqx/emqx", "version": "e6.0.0-M1.202507-rc.1", "date": "2025-07-18T07:48:52Z" }, - { - "name": "meilisearch/meilisearch", - "version": "prototype-chat-completions-with-filters-0", - "date": "2025-07-16T08:54:57Z" - }, - { - "name": "ollama/ollama", - "version": "v0.9.7-rc1", - "date": "2025-07-11T22:15:00Z" - }, { "name": "cross-seed/cross-seed", "version": "v6.13.1", "date": "2025-07-17T21:36:42Z" }, - { - "name": "coder/code-server", - "version": "v4.102.1", - "date": "2025-07-17T21:20:36Z" - }, { "name": "duplicati/duplicati", "version": "v2.1.1.0-2.1.1.0_experimental_2025-07-17", "date": "2025-07-17T20:11:33Z" }, - { - "name": "grafana/grafana", - "version": "v12.0.2+security-01", - "date": "2025-07-17T19:13:19Z" - }, - { - "name": "jhuckaby/Cronicle", - "version": "v0.9.83", - "date": "2025-07-17T17:48:01Z" - }, - { - "name": "mongodb/mongo", - "version": "r8.0.12", - "date": "2025-07-17T17:43:01Z" - }, { "name": "wavelog/wavelog", "version": "2.0.7", "date": "2025-07-17T15:33:14Z" }, - { - "name": "forgejo/forgejo", - "version": "v12.0.0", - "date": "2025-07-17T14:38:30Z" - }, - { - "name": "linuxserver/Heimdall", - "version": "v2.7.0", - "date": "2025-07-17T14:08:16Z" - }, { "name": "oauth2-proxy/oauth2-proxy", "version": "v7.10.0", @@ -239,41 +474,16 @@ "version": "v0.22.0", "date": "2025-07-17T06:35:43Z" }, - { - "name": "advplyr/audiobookshelf", - "version": "v2.26.1", - "date": "2025-07-16T22:48:43Z" - }, { "name": "plexguide/Huntarr.io", "version": "8.1.15", "date": "2025-07-16T18:06:03Z" }, - { - "name": "benjaminjonard/koillection", - "version": "1.6.15", - "date": "2025-07-16T16:47:57Z" - }, { "name": "usememos/memos", "version": "v0.25.0", "date": "2025-07-16T14:57:02Z" }, - { - "name": "TryGhost/Ghost-CLI", - "version": "v1.27.1", - "date": "2025-07-16T13:29:00Z" - }, - { - "name": "Checkmk/checkmk", - "version": "v2.4.0p8-rc2", - "date": "2025-07-16T13:21:20Z" - }, - { - "name": "glpi-project/glpi", - "version": "10.0.19", - "date": "2025-07-16T09:45:14Z" - }, { "name": "NLnetLabs/unbound", "version": "release-1.23.1", @@ -304,26 +514,16 @@ "version": "6.8.2", "date": "2025-07-15T15:14:16Z" }, - { - "name": "jenkinsci/jenkins", - "version": "jenkins-2.519", - "date": "2025-07-15T14:43:59Z" - }, - { - "name": "element-hq/synapse", - "version": "v1.134.0", - "date": "2025-07-15T13:43:39Z" - }, - { - "name": "zabbix/zabbix", - "version": "7.2.11rc1", - "date": "2025-07-15T11:47:53Z" - }, { "name": "dgtlmoon/changedetection.io", "version": "0.50.7", "date": "2025-07-15T11:29:29Z" }, + { + "name": "cloudreve/cloudreve", + "version": "4.3.0", + "date": "2025-07-15T09:54:38Z" + }, { "name": "gotson/komga", "version": "1.22.1", @@ -354,11 +554,6 @@ "version": "v3.5.0", "date": "2025-07-14T16:54:21Z" }, - { - "name": "home-assistant/core", - "version": "2025.7.2", - "date": "2025-07-14T11:29:58Z" - }, { "name": "homebridge/homebridge", "version": "v1.11.0", @@ -379,11 +574,6 @@ "version": "v4.39.5", "date": "2025-07-13T06:12:47Z" }, - { - "name": "henrygd/beszel", - "version": "v0.11.1", - "date": "2025-04-29T01:14:35Z" - }, { "name": "Ombi-app/Ombi", "version": "v4.47.1", @@ -394,11 +584,6 @@ "version": "v10.10.7", "date": "2025-04-05T19:14:59Z" }, - { - "name": "blakeblackshear/frigate", - "version": "v0.14.1", - "date": "2024-08-29T22:32:51Z" - }, { "name": "leiweibau/Pi.Alert", "version": "v2025-07-12", @@ -419,21 +604,6 @@ "version": "flowise@3.0.4", "date": "2025-07-11T13:26:54Z" }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.9.0", - "date": "2025-07-11T12:57:54Z" - }, - { - "name": "traefik/traefik", - "version": "v3.4.4", - "date": "2025-07-11T08:41:34Z" - }, - { - "name": "mattermost/mattermost", - "version": "preview-v0.1", - "date": "2025-06-27T14:35:47Z" - }, { "name": "outline/outline", "version": "v0.85.1", @@ -449,16 +619,6 @@ "version": "v2.13.0", "date": "2025-07-10T19:27:54Z" }, - { - "name": "crowdsecurity/crowdsec", - "version": "v1.6.10", - "date": "2025-07-10T12:04:30Z" - }, - { - "name": "pocket-id/pocket-id", - "version": "v1.6.2", - "date": "2025-07-09T22:14:10Z" - }, { "name": "NginxProxyManager/nginx-proxy-manager", "version": "v2.12.6", @@ -474,11 +634,6 @@ "version": "4.5.2", "date": "2025-07-09T19:08:28Z" }, - { - "name": "raydak-labs/configarr", - "version": "v1.13.6", - "date": "2025-07-09T17:23:01Z" - }, { "name": "hargata/lubelog", "version": "v1.4.9", @@ -505,45 +660,15 @@ "date": "2025-06-26T14:34:19Z" }, { - "name": "cockpit-project/cockpit", - "version": "342", - "date": "2025-07-09T08:48:21Z" - }, - { - "name": "Prowlarr/Prowlarr", - "version": "v1.37.0.5076", - "date": "2025-06-04T11:04:53Z" - }, - { - "name": "Radarr/Radarr", - "version": "v5.26.2.10099", - "date": "2025-06-11T20:10:39Z" - }, - { - "name": "grokability/snipe-it", - "version": "v8.1.18", - "date": "2025-07-08T20:36:37Z" - }, - { - "name": "Stirling-Tools/Stirling-PDF", - "version": "v1.0.2", - "date": "2025-07-08T19:14:31Z" + "name": "mysql/mysql-server", + "version": "mysql-cluster-9.4.0", + "date": "2025-07-09T08:35:30Z" }, { "name": "TwiN/gatus", "version": "v5.20.0", "date": "2025-07-08T16:27:11Z" }, - { - "name": "docker/compose", - "version": "v2.38.2", - "date": "2025-07-08T09:35:14Z" - }, - { - "name": "VictoriaMetrics/VictoriaMetrics", - "version": "pmm-6401-v1.121.0", - "date": "2025-07-07T16:16:13Z" - }, { "name": "photoprism/photoprism", "version": "250707-d28b3101e", @@ -559,21 +684,11 @@ "version": "v25.05.2", "date": "2025-07-07T14:08:25Z" }, - { - "name": "nzbgetcom/nzbget", - "version": "v25.2", - "date": "2025-07-04T08:21:42Z" - }, { "name": "slskd/slskd", "version": "0.23.1", "date": "2025-07-06T23:57:52Z" }, - { - "name": "bluenviron/mediamtx", - "version": "v1.13.0", - "date": "2025-07-06T19:23:55Z" - }, { "name": "syncthing/syncthing", "version": "v1.30.0", @@ -669,21 +784,11 @@ "version": "2025.4", "date": "2025-07-01T18:01:37Z" }, - { - "name": "HabitRPG/habitica", - "version": "v5.37.1", - "date": "2025-07-01T16:57:43Z" - }, { "name": "navidrome/navidrome", "version": "v0.57.0", "date": "2025-07-01T16:47:46Z" }, - { - "name": "openobserve/openobserve", - "version": "v0.15.0-rc3", - "date": "2025-07-01T04:09:37Z" - }, { "name": "MagicMirrorOrg/MagicMirror", "version": "v2.32.0", @@ -705,14 +810,9 @@ "date": "2025-06-30T03:52:33Z" }, { - "name": "goauthentik/authentik", - "version": "version/2025.6.3", - "date": "2025-06-27T14:01:06Z" - }, - { - "name": "tailscale/tailscale", - "version": "v1.84.3", - "date": "2025-06-26T16:31:57Z" + "name": "librespeed/speedtest-rust", + "version": "v1.3.8", + "date": "2025-06-29T07:41:53Z" }, { "name": "node-red/node-red", @@ -724,21 +824,16 @@ "version": "v1.6.1", "date": "2025-06-25T21:19:25Z" }, - { - "name": "moghtech/komodo", - "version": "v1.18.4", - "date": "2025-06-25T00:06:56Z" - }, - { - "name": "ErsatzTV/ErsatzTV", - "version": "v25.2.0", - "date": "2025-06-24T17:06:31Z" - }, { "name": "arunavo4/gitea-mirror", "version": "v2.18.0", "date": "2025-06-24T08:29:55Z" }, + { + "name": "itsmng/itsm-ng", + "version": "v2.0.7", + "date": "2025-06-23T14:35:40Z" + }, { "name": "clusterzx/paperless-ai", "version": "v3.0.7", @@ -754,11 +849,6 @@ "version": "v2.0.114", "date": "2025-06-21T11:20:21Z" }, - { - "name": "immich-app/immich", - "version": "v1.135.3", - "date": "2025-06-20T20:19:20Z" - }, { "name": "Sonarr/Sonarr", "version": "v4.0.15.2941", @@ -804,11 +894,6 @@ "version": "2.0.0-pre3", "date": "2025-06-18T08:01:24Z" }, - { - "name": "project-zot/zot", - "version": "v2.1.5", - "date": "2025-06-17T18:04:11Z" - }, { "name": "donaldzou/WGDashboard", "version": "v4.2.4", @@ -844,11 +929,6 @@ "version": "v3.3.25", "date": "2025-06-14T02:52:44Z" }, - { - "name": "autobrr/autobrr", - "version": "v1.63.1", - "date": "2025-06-11T11:05:42Z" - }, { "name": "OctoPrint/OctoPrint", "version": "1.11.2", @@ -894,6 +974,16 @@ "version": "mariadb-11.8.2", "date": "2025-06-04T13:35:16Z" }, + { + "name": "plankanban/planka", + "version": "planka-1.0.3", + "date": "2025-06-04T10:26:07Z" + }, + { + "name": "C4illin/ConvertX", + "version": "v0.14.1", + "date": "2025-06-04T08:57:15Z" + }, { "name": "intri-in/manage-my-damn-life-nextjs", "version": "v0.7.1", @@ -934,11 +1024,6 @@ "version": "5.10.0", "date": "2025-05-28T05:48:20Z" }, - { - "name": "dani-garcia/vaultwarden", - "version": "1.34.1", - "date": "2025-05-26T21:40:54Z" - }, { "name": "stonith404/pingvin-share", "version": "v1.13.0", @@ -984,11 +1069,6 @@ "version": "1.0.0", "date": "2025-05-12T07:39:23Z" }, - { - "name": "umami-software/umami", - "version": "v2.18.1", - "date": "2025-05-12T07:16:12Z" - }, { "name": "owncast/owncast", "version": "v0.2.3", @@ -1044,11 +1124,6 @@ "version": "v2.0.1727", "date": "2025-04-21T17:53:05Z" }, - { - "name": "TasmoAdmin/TasmoAdmin", - "version": "v4.3.0", - "date": "2025-04-21T17:44:40Z" - }, { "name": "caddyserver/caddy", "version": "v2.10.0", @@ -1059,6 +1134,11 @@ "version": "v0.4.15", "date": "2024-12-19T03:19:49Z" }, + { + "name": "Casvt/Kapowarr", + "version": "V1.2.0", + "date": "2025-04-16T14:55:28Z" + }, { "name": "Tautulli/Tautulli", "version": "v2.15.2", @@ -1089,21 +1169,11 @@ "version": "v2.2.0", "date": "2025-03-31T21:31:48Z" }, - { - "name": "mysql/mysql-server", - "version": "mysql-cluster-9.3.0", - "date": "2025-03-31T07:42:45Z" - }, { "name": "louislam/dockge", "version": "1.5.0", "date": "2025-03-30T17:42:59Z" }, - { - "name": "aceberg/WatchYourLAN", - "version": "2.1.2-alpine", - "date": "2025-03-30T06:25:22Z" - }, { "name": "inspircd/inspircd", "version": "v4.7.0", @@ -1184,11 +1254,6 @@ "version": "v0.10.0", "date": "2025-03-02T15:13:47Z" }, - { - "name": "heiher/hev-socks5-server", - "version": "2.8.0", - "date": "2025-03-02T04:30:50Z" - }, { "name": "schlagmichdoch/PairDrop", "version": "v1.11.2", @@ -1219,11 +1284,6 @@ "version": "v25.2.1", "date": "2025-02-06T20:41:28Z" }, - { - "name": "AmruthPillai/Reactive-Resume", - "version": "v4.4.4", - "date": "2025-01-30T16:57:47Z" - }, { "name": "rustdesk/rustdesk-server", "version": "1.1.14", @@ -1234,11 +1294,6 @@ "version": "v0.5.7", "date": "2025-01-17T15:57:17Z" }, - { - "name": "PCJones/UmlautAdaptarr", - "version": "0.7.2", - "date": "2025-01-13T22:17:18Z" - }, { "name": "go-vikunja/vikunja", "version": "v0.24.6", @@ -1343,10 +1398,5 @@ "name": "CrazyWolf13/web-check", "version": "1.0.0", "date": "2024-05-05T02:01:51Z" - }, - { - "name": "thelounge/thelounge-deb", - "version": "v4.4.3", - "date": "2024-04-06T12:24:35Z" } ] diff --git a/install/actualbudget-install.sh b/install/actualbudget-install.sh index beb10bf4d..3facf80f8 100644 --- a/install/actualbudget-install.sh +++ b/install/actualbudget-install.sh @@ -15,7 +15,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - make + make \ + g++ msg_ok "Installed Dependencies" msg_info "Installing Actual Budget" diff --git a/install/alpine-teamspeak-server-install.sh b/install/alpine-teamspeak-server-install.sh new file mode 100644 index 000000000..c2cdc3489 --- /dev/null +++ b/install/alpine-teamspeak-server-install.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 (Slaviša Arežina) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://teamspeak.com/en/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing dependencies" +$STD apk add --no-cache \ + ca-certificates \ + libstdc++ \ + libc6-compat +msg_ok "Installed dependencies" + +RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]\+\).*/\1/p' | head -1) +msg_info "Installing Teamspeak Server v${RELEASE}" +mkdir -p /opt/teamspeak-server +cd /opt/teamspeak-server +curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2 +tar xf ts3server.tar.bz2 --strip-components=1 +mkdir -p logs data lib +mv *.so lib +touch data/ts3server.sqlitedb data/query_ip_blacklist.txt data/query_ip_whitelist.txt .ts3server_license_accepted +echo "${RELEASE}" >~/.teamspeak-server +msg_ok "Installed TeamSpeak Server v${RELEASE}" + +msg_info "Enabling TeamSpeak Server Service" +cat </etc/init.d/teamspeak +#!/sbin/openrc-run + +name="TeamSpeak Server" +description="TeamSpeak 3 Server" +command="/opt/teamspeak-server/ts3server_startscript.sh" +command_args="start" +output_log="/var/log/teamspeak.out.log" +error_log="/var/log/teamspeak.err.log" +command_background=true +pidfile="/run/teamspeak-server.pid" +directory="/opt/teamspeak-server" + +depend() { + need net + use dns +} +EOF +chmod +x /etc/init.d/teamspeak +$STD rc-update add teamspeak default +msg_ok "Enabled TeamSpeak Server Service" + +msg_info "Starting TeamSpeak Server" +$STD service teamspeak start +msg_ok "Started TeamSpeak Server" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -r ts3server.tar.bz* LICENSE* CHANGELOG doc serverquerydocs tsdns redist +$STD apk cache clean +msg_ok "Cleaned" diff --git a/install/calibre-web-install.sh b/install/calibre-web-install.sh deleted file mode 100644 index 2e49d697a..000000000 --- a/install/calibre-web-install.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2024 tteck -# Author: tteck (tteckster) -# Co-Author: remz1337 -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/janeczku/calibre-web - -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 imagemagick -msg_ok "Installed Dependencies" - -msg_info "Installing Python Dependencies" -$STD apt-get -y install python3-pip -rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Installed Python Dependencies" - -msg_info "Installing Kepubify" -mkdir -p /opt/kepubify -cd /opt/kepubify -curl -fsSLO https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-64bit &>/dev/null -chmod +x kepubify-linux-64bit -msg_ok "Installed Kepubify" - -msg_info "Installing Calibre-Web" -mkdir -p /opt/calibre-web -$STD apt-get install -y calibre -$STD curl -fsSL https://github.com/janeczku/calibre-web/raw/master/library/metadata.db -o /opt/calibre-web/metadata.db -$STD pip install calibreweb -$STD pip install jsonschema -msg_ok "Installed Calibre-Web" - -msg_info "Creating Service" -cat </etc/systemd/system/cps.service -[Unit] -Description=Calibre-Web Server -After=network.target - -[Service] -Type=simple -WorkingDirectory=/opt/calibre-web -ExecStart=/usr/local/bin/cps -TimeoutStopSec=20 -KillMode=process -Restart=on-failure - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now cps -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/cleanuparr-install.sh b/install/cleanuparr-install.sh new file mode 100755 index 000000000..06903aa10 --- /dev/null +++ b/install/cleanuparr-install.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Lucas Zampieri (zampierilucas) | MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Cleanuparr/Cleanuparr + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "latest" "/opt/cleanuparr" "*linux-amd64.zip" + +msg_info "Creating Service" +cat </etc/systemd/system/cleanuparr.service +[Unit] +Description=Cleanuparr Daemon +After=syslog.target network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/cleanuparr +ExecStart=/opt/cleanuparr/Cleanuparr +Restart=on-failure +RestartSec=5 +Environment="PORT=11011" +Environment="CONFIG_DIR=/opt/cleanuparr/config" + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now cleanuparr +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/documenso-install.sh b/install/documenso-install.sh index fb08f35e8..d00fac243 100644 --- a/install/documenso-install.sh +++ b/install/documenso-install.sh @@ -80,7 +80,7 @@ msg_ok "Installed Documenso" msg_info "Create User" PASSWORD_HASH=$(python3 -c "import bcrypt; print(bcrypt.hashpw(b'helper-scripts', bcrypt.gensalt(rounds=12)).decode())") -$STD sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\", \"customerId\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25', NULL) RETURNING id;" +$STD sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25') RETURNING id;" $STD npm run prisma:migrate-deploy msg_ok "User created" diff --git a/install/duplicati-install.sh b/install/duplicati-install.sh index 9cfda6f19..b4714d851 100644 --- a/install/duplicati-install.sh +++ b/install/duplicati-install.sh @@ -20,19 +20,16 @@ $STD apt-get install -y \ libfontconfig1 msg_ok "Installed Dependencies" -msg_info "Setting up Duplicati" -RELEASE=$(curl -fsSL https://api.github.com/repos/duplicati/duplicati/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') -curl -fsSL "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-arm64-gui.deb" -o "duplicati-${RELEASE}-linux-arm64-gui.deb" -$STD dpkg -i duplicati-${RELEASE}-linux-arm64-gui.deb -echo "${RELEASE}" >/opt/Duplicati_version.txt -msg_ok "Finished setting up Duplicati" +fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "linux-arm64-gui.deb" +msg_info "Configuring duplicati" DECRYPTKEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) ADMINPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) { echo "Admin password = ${ADMINPASS}" echo "Database encryption key = ${DECRYPTKEY}" } >>~/duplicati.creds +msg_ok "Configured duplicati" msg_info "Creating Service" cat </etc/systemd/system/duplicati.service @@ -54,10 +51,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -f duplicati-${RELEASE}-linux-arm64-gui.deb $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" - -motd_ssh -customize diff --git a/install/frigate-install.sh b/install/frigate-install.sh index da47f08bf..fdbad97aa 100644 --- a/install/frigate-install.sh +++ b/install/frigate-install.sh @@ -43,10 +43,7 @@ if [[ "$CTTYPE" == "0" ]]; then fi msg_ok "Set Up Hardware Acceleration" -#RELEASE=$(curl -fsSL https://api.github.com/repos/blakeblackshear/frigate/releases/latest | jq -r '.tag_name') -msg_ok "Stop spinner to prevent segmentation fault" msg_info "Installing Frigate v0.14.1 (Perseverance)" -if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi cd ~ mkdir -p /opt/frigate/models curl -fsSL "https://github.com/blakeblackshear/frigate/archive/refs/tags/v0.14.1.tar.gz" -o "frigate.tar.gz" diff --git a/install/go2rtc-install.sh b/install/go2rtc-install.sh index 08304e5ee..4c0fae47f 100644 --- a/install/go2rtc-install.sh +++ b/install/go2rtc-install.sh @@ -13,15 +13,10 @@ setting_up_container network_check update_os -msg_info "Installing go2rtc" -mkdir -p /opt/go2rtc -cd /opt/go2rtc -curl -fsSL "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_arm64" -o "go2rtc_linux_arm64" -chmod +x go2rtc_linux_arm64 -msg_ok "Installed go2rtc" +USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "latest" "/opt/go2rtc" "go2rtc_linux_arm64" msg_info "Creating Service" -service_path="/etc/systemd/system/go2rtc.service" +cat </etc/systemd/system/go2rtc.service echo "[Unit] Description=go2rtc service After=network.target @@ -32,7 +27,8 @@ User=root ExecStart=/opt/go2rtc/go2rtc_linux_arm64 [Install] -WantedBy=multi-user.target" >$service_path +WantedBy=multi-user.target +EOF systemctl enable -q --now go2rtc msg_ok "Created Service" diff --git a/install/gokapi-install.sh b/install/gokapi-install.sh index 3848f3acf..4bd4b68d7 100644 --- a/install/gokapi-install.sh +++ b/install/gokapi-install.sh @@ -13,14 +13,12 @@ setting_up_container network_check update_os -msg_info "Installing Gokapi" -LATEST=$(curl -fsSL https://api.github.com/repos/Forceu/Gokapi/releases/latest | grep '"tag_name":' | cut -d'"' -f4) +fetch_and_deploy_gh_release "gokapi" "Forceu/Gokapi" "prebuild" "latest" "/opt/gokapi" "gokapi-linux_arm64.zip" + +msg_info "Configuring Gokapi" mkdir -p /opt/gokapi/{data,config} -curl -fsSL "https://github.com/Forceu/Gokapi/releases/download/$LATEST/gokapi-linux_arm64.zip" -o "gokapi-linux_arm64.zip" -$STD unzip gokapi-linux_arm64.zip -d /opt/gokapi -rm gokapi-linux_arm64.zip chmod +x /opt/gokapi/gokapi-linux_arm64 -msg_ok "Installed Gokapi" +msg_ok "Configured Gokapi" msg_info "Creating Service" cat </etc/systemd/system/gokapi.service diff --git a/install/habitica-install.sh b/install/habitica-install.sh index aea4c4c59..10acf4d5d 100644 --- a/install/habitica-install.sh +++ b/install/habitica-install.sh @@ -22,16 +22,17 @@ curl -fsSL "http://ports.ubuntu.com/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu $STD dpkg -i libssl1.1_1.1.1f-1ubuntu2_arm64.deb msg_ok "Installed Dependencies" -NODE_VERSION="20" NODE_MODULE="gulp-cli,mocha" setup_nodejs +NODE_VERSION="20" NODE_MODULE="gulp-cli,mocha,npm@10" setup_nodejs fetch_and_deploy_gh_release "habitica" "HabitRPG/habitica" "tarball" "latest" "/opt/habitica" msg_info "Setup ${APPLICATION}" cd /opt/habitica $STD npm i $STD npm run postinstall +cp config.json.example config.json $STD npm run client:build $STD gulp build:prod -cp config.json.example config.json + msg_ok "Setup ${APPLICATION}" msg_info "Creating Service" diff --git a/install/headscale-install.sh b/install/headscale-install.sh index 740fa401a..1a5b44c27 100644 --- a/install/headscale-install.sh +++ b/install/headscale-install.sh @@ -13,19 +13,53 @@ setting_up_container network_check update_os -RELEASE=$(curl -fsSL https://api.github.com/repos/juanfont/headscale/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -msg_info "Installing ${APPLICATION} v${RELEASE}" -curl -fsSL "https://github.com/juanfont/headscale/releases/download/v${RELEASE}/headscale_${RELEASE}_linux_arm64.deb" -o "headscale_${RELEASE}_linux_arm64.deb" -$STD dpkg -i headscale_${RELEASE}_linux_arm64.deb +fetch_and_deploy_gh_release "headscale" "juanfont/headscale" "binary" + +read -r -p "${TAB3}Would you like to add headscale-admin UI? " prompt +if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then + fetch_and_deploy_gh_release "headscale-admin" "GoodiesHQ/headscale-admin" "prebuild" "latest" "/opt/headscale-admin" "admin.zip" + + msg_info "Configuring headscale-admin" + $STD apt-get install -y caddy + $STD caddy stop + rm /etc/caddy/Caddyfile + cat <<'EOF' >/etc/caddy/Caddyfile +:{$PORT:80} + +handle_path /admin* { + root * /opt/headscale-admin + encode gzip zstd + + # Correct MIME types for JS/WASM + header { + @js_files path *.js + @wasm_files path *.wasm + + Content-Type @js_files application/javascript + Content-Type @wasm_files application/wasm + + X-Content-Type-Options nosniff + } + + # Fallback for SPA routing + try_files {path} {path}/ index.html + file_server +} + +EOF + caddy fmt --overwrite /etc/caddy/Caddyfile + systemctl start caddy + msg_ok "Configured headscale-admin" +fi + +msg_info "Starting service" systemctl enable -q --now headscale -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -msg_ok "Installed ${APPLICATION} v${RELEASE}" +msg_ok "Service started" motd_ssh customize msg_info "Cleaning up" -rm headscale_${RELEASE}_linux_arm64.deb $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/immich-install.sh b/install/immich-install.sh index 26c39994e..e51b449f8 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -266,7 +266,7 @@ GEO_DIR="${INSTALL_DIR}/geodata" mkdir -p "$INSTALL_DIR" mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${ML_DIR}","${INSTALL_DIR}"/cache} -fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "latest" "$SRC_DIR" +fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.136.0" "$SRC_DIR" msg_info "Installing ${APPLICATION} (more patience please)" @@ -282,7 +282,7 @@ cd "$SRC_DIR"/web $STD npm ci $STD npm run build cd "$SRC_DIR" -cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,start*.sh} "$APP_DIR"/ +cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,bin/start.sh} "$APP_DIR"/ cp -a web/build "$APP_DIR"/www cp LICENSE "$APP_DIR" cd "$APP_DIR" diff --git a/install/karakeep-install.sh b/install/karakeep-install.sh index 3f715a3d1..95dc0c25f 100644 --- a/install/karakeep-install.sh +++ b/install/karakeep-install.sh @@ -64,6 +64,7 @@ $STD pnpm install --frozen-lockfile $STD pnpm build cd /opt/karakeep/apps/workers $STD pnpm install --frozen-lockfile +$STD pnpm build cd /opt/karakeep/apps/cli $STD pnpm install --frozen-lockfile $STD pnpm build @@ -167,7 +168,7 @@ Wants=network.target karakeep-browser.service meilisearch.service After=network.target karakeep-browser.service meilisearch.service [Service] -ExecStart=pnpm start:prod +ExecStart=/usr/bin/node dist/index.mjs WorkingDirectory=/opt/karakeep/apps/workers EnvironmentFile=/etc/karakeep/karakeep.env Restart=always diff --git a/install/linkstack-install.sh b/install/linkstack-install.sh new file mode 100644 index 000000000..95105bbf8 --- /dev/null +++ b/install/linkstack-install.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Omar Minaya | MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://linkstack.org/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +PHP_VERSION="8.3" PHP_MODULE="sqlite3" PHP_APACHE="YES" setup_php +fetch_and_deploy_gh_release "linkstack" "linkstackorg/linkstack" "prebuild" "latest" "/var/www/html/linkstack" "linkstack.zip" + +msg_info "Configuring LinkStack" +$STD a2enmod rewrite +chown -R www-data:www-data /var/www/html/linkstack +chmod -R 755 /var/www/html/linkstack + +cat </etc/apache2/sites-available/linkstack.conf + + ServerAdmin webmaster@localhost + DocumentRoot /var/www/html/linkstack + ErrorLog /var/log/apache2/linkstack-error.log + CustomLog /var/log/apache2/linkstack-access.log combined + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + +EOF +$STD a2dissite 000-default.conf +$STD a2ensite linkstack.conf +$STD systemctl restart apache2 +msg_ok "Configured LinkStack" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/nginxproxymanager-install.sh b/install/nginxproxymanager-install.sh index b8f680ab5..ad3468836 100644 --- a/install/nginxproxymanager-install.sh +++ b/install/nginxproxymanager-install.sh @@ -86,8 +86,6 @@ else sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" backend/package.json sed -i "s|\"version\": \"0.0.0\"|\"version\": \"$RELEASE\"|" frontend/package.json fi -sed -i 's|"fork-me": ".*"|"fork-me": "Proxmox VE Helper-Scripts"|' frontend/js/i18n/messages.json -sed -i "s|https://github.com.*source=nginx-proxy-manager|https://helper-scripts.com|g" frontend/js/app/ui/footer/main.ejs sed -i 's+^daemon+#daemon+g' docker/rootfs/etc/nginx/nginx.conf NGINX_CONFS=$(find "$(pwd)" -type f -name "*.conf") for NGINX_CONF in $NGINX_CONFS; do diff --git a/install/pialert-install.sh b/install/pialert-install.sh index a375f9b1c..1e97cd5b3 100644 --- a/install/pialert-install.sh +++ b/install/pialert-install.sh @@ -28,7 +28,9 @@ $STD apt-get -y install \ nmap \ aria2 \ wakeonlan \ - cron + fping \ + zip \ + cron msg_ok "Installed Dependencies" msg_info "Installing PHP Dependencies" @@ -48,12 +50,15 @@ $STD apt-get -y install \ python3-pip \ python3-requests \ python3-tz \ - python3-tzlocal + python3-tzlocal \ + python3-aiohttp rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED $STD pip3 install mac-vendor-lookup $STD pip3 install fritzconnection $STD pip3 install cryptography $STD pip3 install pyunifi +$STD pip3 install openwrt-luci-rpc +$STD pip3 install asusrouter msg_ok "Installed Python Dependencies" msg_info "Installing Pi.Alert" diff --git a/install/salt-install.sh b/install/salt-install.sh new file mode 100644 index 000000000..4fe29a824 --- /dev/null +++ b/install/salt-install.sh @@ -0,0 +1,44 @@ +#!/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: https://github.com/saltstack/salt + +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 jq +msg_ok "Installed Dependencies" + +msg_info "Setup Salt Repo" +mkdir -p /etc/apt/keyrings +curl -fsSL https://packages.broadcom.com/artifactory/api/security/keypair/SaltProjectKey/public -o /etc/apt/keyrings/salt-archive-keyring.pgp +curl -fsSL https://github.com/saltstack/salt-install-guide/releases/latest/download/salt.sources -o /etc/apt/sources.list.d/salt.sources +$STD apt-get update +msg_ok "Setup Salt Repo" + +msg_info "Installing Salt" +RELEASE=$(curl -fsSL https://api.github.com/repos/saltstack/salt/releases/latest | jq -r .tag_name | sed 's/^v//') +cat </etc/apt/preferences.d/salt-pin-1001 +Package: salt-* +Pin: version ${RELEASE} +Pin-Priority: 1001 +EOF +$STD apt-get install -y salt-master +echo "${RELEASE}" >/~.salt +msg_ok "Installed Salt" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/snipeit-install.sh b/install/snipeit-install.sh index ab0c6d87d..cd555e06c 100644 --- a/install/snipeit-install.sh +++ b/install/snipeit-install.sh @@ -18,7 +18,7 @@ $STD apt-get install -y \ composer \ git \ nginx \ - php8.2-{bcmath,common,ctype,curl,fileinfo,fpm,gd,iconv,intl,mbstring,mysql,soap,xml,xsl,zip,cli} + php8.2-{bcmath,common,ctype,ldap,curl,fileinfo,fpm,gd,iconv,intl,mbstring,mysql,soap,xml,xsl,zip,cli} msg_ok "Installed Dependencies" setup_mariadb diff --git a/install/teamspeak-server-install.sh b/install/teamspeak-server-install.sh new file mode 100644 index 000000000..bd280765f --- /dev/null +++ b/install/teamspeak-server-install.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: tremor021 (Slaviša Arežina) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://teamspeak.com/en/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | grep -oP 'teamspeak3-server_linux_amd64-\K[0-9]+\.[0-9]+\.[0-9]+' | head -1) + +msg_info "Setting up Teamspeak Server" +curl -fsSL "https://files.teamspeak-services.com/releases/server/${RELEASE}/teamspeak3-server_linux_amd64-${RELEASE}.tar.bz2" -o ts3server.tar.bz2 +tar -xf ./ts3server.tar.bz2 +mv teamspeak3-server_linux_amd64/ /opt/teamspeak-server/ +touch /opt/teamspeak-server/.ts3server_license_accepted +echo "${RELEASE}" >~/.teamspeak-server +msg_ok "Setup Teamspeak Server" + +msg_info "Creating service" +cat </etc/systemd/system/teamspeak-server.service +[Unit] +Description=TeamSpeak3 Server +Wants=network-online.target +After=network.target + +[Service] +WorkingDirectory=/opt/teamspeak-server +User=root +Type=forking +ExecStart=/opt/teamspeak-server/ts3server_startscript.sh start +ExecStop=/opt/teamspeak-server/ts3server_startscript.sh stop +ExecReload=/opt/teamspeak-server/ts3server_startscript.sh restart +Restart=always +RestartSec=15 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now teamspeak-server +msg_ok "Created service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f ~/ts3server.tar.bz* +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/victoriametrics-install.sh b/install/victoriametrics-install.sh index ff2d95270..ab2fc8da5 100644 --- a/install/victoriametrics-install.sh +++ b/install/victoriametrics-install.sh @@ -13,15 +13,13 @@ setting_up_container network_check update_os +fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-arm64-v+([0-9.]).tar.gz" +fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-arm64-v+([0-9.]).tar.gz" +fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-arm64*.tar.gz" +fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-arm64*.tar.gz" + msg_info "Setup VictoriaMetrics" -temp_dir=$(mktemp -d) -cd $temp_dir mkdir -p /opt/victoriametrics/data -RELEASE=$(curl -fsSL https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/victoria-metrics-linux-arm64-v${RELEASE}.tar.gz" -o "victoria-metrics-linux-arm64-v${RELEASE}.tar.gz" -curl -fsSL "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${RELEASE}/vmutils-linux-arm64-v${RELEASE}.tar.gz" -o "vmutils-linux-arm64-v${RELEASE}.tar.gz" -tar -xf victoria-metrics-linux-arm64-v${RELEASE}.tar.gz -C /opt/victoriametrics -tar -xf vmutils-linux-arm64-v${RELEASE}.tar.gz -C /opt/victoriametrics chmod +x /opt/victoriametrics/* msg_ok "Setup VictoriaMetrics" @@ -37,10 +35,26 @@ User=root WorkingDirectory=/opt/victoriametrics ExecStart=/opt/victoriametrics/victoria-metrics-prod --storageDataPath="/opt/victoriametrics/data" +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/victoriametrics-logs.service +[Unit] +Description=VictoriaMetrics Service + +[Service] +Type=simple +Restart=always +User=root +WorkingDirectory=/opt/victoriametrics +ExecStart=/opt/victoriametrics/victoria-logs-prod + [Install] WantedBy=multi-user.target EOF systemctl enable -q --now victoriametrics +systemctl enable -q --now victoriametrics-logs msg_ok "Created Service" motd_ssh diff --git a/install/wallos-install.sh b/install/wallos-install.sh index e3da0a463..7e004b68c 100644 --- a/install/wallos-install.sh +++ b/install/wallos-install.sh @@ -65,6 +65,7 @@ cat </opt/wallos.cron */2 * * * * php /opt/wallos/endpoints/cronjobs/sendverificationemails.php >> /var/log/cron/sendverificationemail.log 2>&1 */2 * * * * php /opt/wallos/endpoints/cronjobs/sendresetpasswordemails.php >> /var/log/cron/sendresetpasswordemails.log 2>&1 0 */6 * * * php /opt/wallos/endpoints/cronjobs/checkforupdates.php >> /var/log/cron/checkforupdates.log 2>&1 +30 1 * * 1 php /opt/wallos/endpoints/cronjobs/storetotalyearlycost.php >> /var/log/cron/storetotalyearlycost.log 2>&1 EOF crontab /opt/wallos.cron msg_ok "Crontabs setup" diff --git a/install/wizarr-install.sh b/install/wizarr-install.sh index df6e808da..095207935 100644 --- a/install/wizarr-install.sh +++ b/install/wizarr-install.sh @@ -23,12 +23,12 @@ fetch_and_deploy_gh_release "wizarr" "wizarrrr/wizarr" msg_info "Configure ${APPLICATION}" cd /opt/wizarr -uv -q sync --locked -$STD uv -q run pybabel compile -d app/translations +/usr/local/bin/uv -q sync --locked +$STD /usr/local/bin/uv -q run pybabel compile -d app/translations $STD npm --prefix app/static install $STD npm --prefix app/static run build:css mkdir -p ./.cache -$STD uv -q run flask db upgrade +$STD /usr/local/bin/uv -q run flask db upgrade msg_ok "Configure ${APPLICATION}" msg_info "Creating env, start script and service" diff --git a/misc/build.func b/misc/build.func index 1ff5b8f0c..96e6c3e3f 100644 --- a/misc/build.func +++ b/misc/build.func @@ -65,13 +65,36 @@ root_check() { # This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*"; 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 + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } # When a node is running tens of containers, it's possible to exceed the kernel's cryptographic key storage allocations. @@ -1207,7 +1230,52 @@ EOF # This starts the container and executes -install.sh msg_info "Starting LXC Container" pct start "$CTID" - msg_ok "Started LXC Container" + + # wait for status 'running' + for i in {1..10}; do + if pct status "$CTID" | grep -q "status: running"; then + msg_ok "Started LXC Container" + break + fi + sleep 1 + if [ "$i" -eq 10 ]; then + msg_error "LXC Container did not reach running state" + exit 1 + fi + done + + if [ "$var_os" != "alpine" ]; then + msg_info "Waiting for network in LXC container" + for i in {1..10}; do + if pct exec "$CTID" -- ping -c1 -W1 deb.debian.org >/dev/null 2>&1; then + msg_ok "Network in LXC is reachable" + break + fi + if [ "$i" -lt 10 ]; then + msg_warn "No network yet in LXC (try $i/10) – waiting..." + sleep 3 + else + msg_error "No network in LXC after waiting." + read -r -p "Set fallback DNS (1.1.1.1/8.8.8.8)? [y/N]: " choice + case "$choice" in + [yY]*) + pct set "$CTID" --nameserver 1.1.1.1 + pct set "$CTID" --nameserver 8.8.8.8 + if pct exec "$CTID" -- ping -c1 -W1 deb.debian.org >/dev/null 2>&1; then + msg_ok "Network reachable after DNS fallback" + else + msg_error "Still no network/DNS in LXC! Aborting customization." + exit 1 + fi + ;; + *) + msg_error "Aborted by user – no DNS fallback set." + exit 1 + ;; + esac + fi + done + fi msg_info "Customizing LXC Container" : "${tz:=Etc/UTC}" @@ -1217,7 +1285,7 @@ EOF http://dl-cdn.alpinelinux.org/alpine/latest-stable/main http://dl-cdn.alpinelinux.org/alpine/latest-stable/community EOF' - pct exec "$CTID" -- ash -c "apk add bash newt curl openssh nano mc ncurses >/dev/null" + pct exec "$CTID" -- ash -c "apk add bash newt curl openssh nano mc ncurses jq >/dev/null" else sleep 3 pct exec "$CTID" -- bash -c "sed -i '/$LANG/ s/^# //' /etc/locale.gen" @@ -1235,7 +1303,7 @@ EOF' msg_warn "Skipping timezone setup – zone '$tz' not found in container" fi - pct exec "$CTID" -- bash -c "apt-get update >/dev/null && apt-get install -y sudo curl mc gnupg2 >/dev/null" + pct exec "$CTID" -- bash -c "apt-get update >/dev/null && apt-get install -y sudo curl mc gnupg2 jq >/dev/null" fi msg_ok "Customized LXC Container" diff --git a/misc/tools.func b/misc/tools.func index 17a0aa101..5f7b429e7 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -396,9 +396,10 @@ function setup_php() { COMBINED_MODULES="${DEFAULT_MODULES}" fi - # Deduplicate modules + # Deduplicate COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -) + # Get current PHP-CLI version local CURRENT_PHP="" if command -v php >/dev/null 2>&1; then CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) @@ -420,53 +421,44 @@ function setup_php() { $STD apt-get update fi + # Build module list local MODULE_LIST="php${PHP_VERSION}" - for pkg in $MODULE_LIST; do - if ! apt-cache show "$pkg" >/dev/null 2>&1; then - msg_error "Package not found: $pkg" - exit 1 - fi - done - IFS=',' read -ra MODULES <<<"$COMBINED_MODULES" for mod in "${MODULES[@]}"; do - MODULE_LIST+=" php${PHP_VERSION}-${mod}" + if apt-cache show "php${PHP_VERSION}-${mod}" >/dev/null 2>&1; then + MODULE_LIST+=" php${PHP_VERSION}-${mod}" + else + msg_warn "PHP-Module ${mod} for PHP ${PHP_VERSION} not found – skipping" + fi done - if [[ "$PHP_FPM" == "YES" ]]; then MODULE_LIST+=" php${PHP_VERSION}-fpm" fi + + # install apache2 with PHP support if requested if [[ "$PHP_APACHE" == "YES" ]]; then - $STD apt-get install -y apache2 libapache2-mod-php${PHP_VERSION} - $STD systemctl restart apache2 || true - fi - - if [[ "$PHP_APACHE" == "YES" ]] && [[ -n "$CURRENT_PHP" ]]; then - if [[ -f /etc/apache2/mods-enabled/php${CURRENT_PHP}.load ]]; then - $STD a2dismod php${CURRENT_PHP} || true + if ! dpkg -l | grep -q "libapache2-mod-php${PHP_VERSION}"; then + msg_info "Installing Apache with PHP${PHP_VERSION} support" + $STD apt-get install -y apache2 libapache2-mod-php${PHP_VERSION} + else + msg_info "Apache with PHP${PHP_VERSION} already installed – skipping install" fi - $STD a2enmod php${PHP_VERSION} - $STD systemctl restart apache2 || true - fi - - if [[ "$PHP_FPM" == "YES" ]] && [[ -n "$CURRENT_PHP" ]]; then - $STD systemctl stop php${CURRENT_PHP}-fpm || true - $STD systemctl disable php${CURRENT_PHP}-fpm || true fi + # setup / update PHP modules $STD apt-get install -y $MODULE_LIST msg_ok "Setup PHP $PHP_VERSION" - if [[ "$PHP_FPM" == "YES" ]]; then - $STD systemctl enable php${PHP_VERSION}-fpm - $STD systemctl restart php${PHP_VERSION}-fpm + # optional stop old PHP-FPM service + if [[ "$PHP_FPM" == "YES" && -n "$CURRENT_PHP" && "$CURRENT_PHP" != "$PHP_VERSION" ]]; then + $STD systemctl stop php"${CURRENT_PHP}"-fpm || true + $STD systemctl disable php"${CURRENT_PHP}"-fpm || true fi # Patch all relevant php.ini files local PHP_INI_PATHS=("/etc/php/${PHP_VERSION}/cli/php.ini") [[ "$PHP_FPM" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/fpm/php.ini") [[ "$PHP_APACHE" == "YES" ]] && PHP_INI_PATHS+=("/etc/php/${PHP_VERSION}/apache2/php.ini") - for ini in "${PHP_INI_PATHS[@]}"; do if [[ -f "$ini" ]]; then $STD msg_info "Patching $ini" @@ -477,8 +469,29 @@ function setup_php() { $STD msg_ok "Patched $ini" fi done -} + # patch Apache configuration if needed + if [[ "$PHP_APACHE" == "YES" ]]; then + for mod in $(ls /etc/apache2/mods-enabled/ 2>/dev/null | grep -E '^php[0-9]\.[0-9]\.conf$' | sed 's/\.conf//'); do + if [[ "$mod" != "php${PHP_VERSION}" ]]; then + $STD a2dismod "$mod" || true + fi + done + $STD a2enmod mpm_prefork + $STD a2enmod "php${PHP_VERSION}" + $STD systemctl restart apache2 || true + fi + + # enable and restart PHP-FPM if requested + if [[ "$PHP_FPM" == "YES" ]]; then + if systemctl list-unit-files | grep -q "php${PHP_VERSION}-fpm.service"; then + $STD systemctl enable php${PHP_VERSION}-fpm + $STD systemctl restart php${PHP_VERSION}-fpm + else + msg_warn "FPM requested but service php${PHP_VERSION}-fpm not found" + fi + fi +} # ------------------------------------------------------------------------------ # Installs or updates Composer globally. # diff --git a/tools/pve/post-pbs-install.sh b/tools/pve/post-pbs-install.sh index c564be1c0..4f431f015 100644 --- a/tools/pve/post-pbs-install.sh +++ b/tools/pve/post-pbs-install.sh @@ -113,24 +113,22 @@ EOF ;; 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" - 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 - apt --reinstall install proxmox-widget-toolkit &>/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 "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" + echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; 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 + 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 + apt --reinstall install proxmox-widget-toolkit &>/dev/null CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox Backup Server now?" 11 58 2 \ "yes" " " \ diff --git a/tools/pve/post-pmg-install.sh b/tools/pve/post-pmg-install.sh index 6a94d2cb7..9b2d026fc 100644 --- a/tools/pve/post-pmg-install.sh +++ b/tools/pve/post-pmg-install.sh @@ -9,10 +9,10 @@ header_info() { cat <<"EOF" ____ __ _________ ____ __ ____ __ ____ / __ \/ |/ / ____/ / __ \____ _____/ /_ / _/___ _____/ /_____ _/ / / - / /_/ / /|_/ / / __ / /_/ / __ \/ ___/ __/ / // __ \/ ___/ __/ __ `/ / / - / ____/ / / / /_/ / / ____/ /_/ (__ ) /_ _/ // / / (__ ) /_/ /_/ / / / -/_/ /_/ /_/\____/ /_/ \____/____/\__/ /___/_/ /_/____/\__/\__,_/_/_/ - + / /_/ / /|_/ / / __ / /_/ / __ \/ ___/ __/ / // __ \/ ___/ __/ __ `/ / / + / ____/ / / / /_/ / / ____/ /_/ (__ ) /_ _/ // / / (__ ) /_/ /_/ / / / +/_/ /_/ /_/\____/ /_/ \____/____/\__/ /___/_/ /_/____/\__/\__,_/_/_/ + EOF } @@ -112,27 +112,25 @@ EOF ;; 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 "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 (proxmox-widget-toolkit) + echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; 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 { \"if [ -s /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; 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-pmgmanagerlib-mobile + 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 + apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox Mail Gateway now?" 11 58 2 \ "yes" " " \ diff --git a/tools/pve/post-pve-install.sh b/tools/pve/post-pve-install.sh index 79a5f8092..d62e22bf2 100644 --- a/tools/pve/post-pve-install.sh +++ b/tools/pve/post-pve-install.sh @@ -133,24 +133,23 @@ EOF ;; 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" - echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit 2>/dev/null && [ -f /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && echo 'Removing subscription nag from UI...' && sed -i '/data\.status/{s/\!/=/;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js\"; };" >/etc/apt/apt.conf.d/no-nag-script - apt --reinstall install proxmox-widget-toolkit &>/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 "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" + echo "DPkg::Post-Invoke { \"if [ -s /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js ] && ! grep -q -F 'NoMoreNagging' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; 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 + 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" + rm /etc/apt/apt.conf.d/no-nag-script 2>/dev/null + ;; + esac + apt --reinstall install proxmox-widget-toolkit &>/dev/null if ! systemctl is-active --quiet pve-ha-lrm; then CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HIGH AVAILABILITY" --menu "Enable high availability?" 10 58 2 \ diff --git a/vm/archlinux-vm.sh b/vm/archlinux-vm.sh index 05ca4e99f..3114db78e 100644 --- a/vm/archlinux-vm.sh +++ b/vm/archlinux-vm.sh @@ -138,14 +138,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/debian-vm.sh b/vm/debian-vm.sh index b16d03d27..a3e6f1611 100644 --- a/vm/debian-vm.sh +++ b/vm/debian-vm.sh @@ -138,14 +138,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/docker-vm.sh b/vm/docker-vm.sh index 4995fc940..ea6cc8d66 100644 --- a/vm/docker-vm.sh +++ b/vm/docker-vm.sh @@ -139,14 +139,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/haos-vm.sh b/vm/haos-vm.sh index 5a1cca95c..745f9faa9 100644 --- a/vm/haos-vm.sh +++ b/vm/haos-vm.sh @@ -142,14 +142,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/mikrotik-routeros.sh b/vm/mikrotik-routeros.sh index 3a4f91d0a..21b5a3007 100644 --- a/vm/mikrotik-routeros.sh +++ b/vm/mikrotik-routeros.sh @@ -139,14 +139,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/nextcloud-vm.sh b/vm/nextcloud-vm.sh index 8d6c0fe3b..62ad1ea56 100644 --- a/vm/nextcloud-vm.sh +++ b/vm/nextcloud-vm.sh @@ -138,14 +138,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/openwrt.sh b/vm/openwrt.sh index 84660e19c..aad2fc08f 100644 --- a/vm/openwrt.sh +++ b/vm/openwrt.sh @@ -184,14 +184,37 @@ function msg_error() { echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/opnsense-vm.sh b/vm/opnsense-vm.sh index e19904ee9..3324b88b1 100644 --- a/vm/opnsense-vm.sh +++ b/vm/opnsense-vm.sh @@ -180,14 +180,37 @@ function msg_error() { echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/owncloud-vm.sh b/vm/owncloud-vm.sh index 536ee3d82..689d7b23c 100644 --- a/vm/owncloud-vm.sh +++ b/vm/owncloud-vm.sh @@ -139,14 +139,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/pimox-haos-vm.sh b/vm/pimox-haos-vm.sh index 43efdcac1..aebc39f6c 100644 --- a/vm/pimox-haos-vm.sh +++ b/vm/pimox-haos-vm.sh @@ -147,14 +147,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/ubuntu2204-vm.sh b/vm/ubuntu2204-vm.sh index b40c6256d..738b8abca 100644 --- a/vm/ubuntu2204-vm.sh +++ b/vm/ubuntu2204-vm.sh @@ -134,14 +134,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/ubuntu2404-vm.sh b/vm/ubuntu2404-vm.sh index de6499259..09b71d9b4 100644 --- a/vm/ubuntu2404-vm.sh +++ b/vm/ubuntu2404-vm.sh @@ -137,14 +137,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/ubuntu2410-vm.sh b/vm/ubuntu2410-vm.sh index 3aa1c97c5..be5bde37f 100644 --- a/vm/ubuntu2410-vm.sh +++ b/vm/ubuntu2410-vm.sh @@ -136,14 +136,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/ubuntu2504-vm.sh b/vm/ubuntu2504-vm.sh index 410d0e6e2..37777423f 100644 --- a/vm/ubuntu2504-vm.sh +++ b/vm/ubuntu2504-vm.sh @@ -136,14 +136,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() { diff --git a/vm/umbrel-os-vm.sh b/vm/umbrel-os-vm.sh index da4a2f9ae..31d9aea9c 100644 --- a/vm/umbrel-os-vm.sh +++ b/vm/umbrel-os-vm.sh @@ -138,14 +138,37 @@ function check_root() { fi } -function pve_check() { - if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; 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 +pve_check() { + local PVE_VER + PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" + + # Check for Proxmox VE 8.x + if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then + local MINOR="${BASH_REMATCH[1]}" + if ((MINOR < 1 || MINOR > 4)); then + msg_error "This version of Proxmox VE is not supported." + echo -e "Required: Proxmox VE version 8.1 – 8.4" + exit 1 + fi + return 0 fi + + # Check for Proxmox VE 9.x (Beta) — require confirmation + if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then + if whiptail --title "Proxmox 9.x Detected (Beta)" \ + --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then + msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER" + return 0 + else + msg_error "Aborted by user: Proxmox VE 9.x was not confirmed." + exit 1 + fi + fi + + # All other unsupported versions + msg_error "This version of Proxmox VE is not supported." + echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)" + exit 1 } function arch_check() {