diff --git a/CHANGELOG.md b/CHANGELOG.md index bc80e0b10..9adf87904 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,8 +14,31 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-07-02 + ## 2025-07-01 +### 🆕 New Scripts + + - Librespeed Rust ([#5614](https://github.com/community-scripts/ProxmoxVE/pull/5614)) +- ITSM-NG ([#5615](https://github.com/community-scripts/ProxmoxVE/pull/5615)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Open WebUI: Fix Ollama update procedure [@tremor021](https://github.com/tremor021) ([#5601](https://github.com/community-scripts/ProxmoxVE/pull/5601)) + + - #### ✨ New Features + + - [tools]: increase fetch_and_deploy with dns pre check [@MickLesk](https://github.com/MickLesk) ([#5608](https://github.com/community-scripts/ProxmoxVE/pull/5608)) + +### 🌐 Website + + - #### 📝 Script Information + + - Jellyfin GPU Passthrough NVIDIA Note [@austinpilz](https://github.com/austinpilz) ([#5625](https://github.com/community-scripts/ProxmoxVE/pull/5625)) + ## 2025-06-30 ### 🆕 New Scripts diff --git a/ct/headers/itsm-ng b/ct/headers/itsm-ng new file mode 100644 index 000000000..3af6235ed --- /dev/null +++ b/ct/headers/itsm-ng @@ -0,0 +1,6 @@ + _______________ __ ___ _ ________ + / _/_ __/ ___// |/ / / | / / ____/ + / / / / \__ \/ /|_/ /_____/ |/ / / __ + _/ / / / ___/ / / / /_____/ /| / /_/ / +/___/ /_/ /____/_/ /_/ /_/ |_/\____/ + diff --git a/ct/headers/librespeed-rust b/ct/headers/librespeed-rust new file mode 100644 index 000000000..d032782ae --- /dev/null +++ b/ct/headers/librespeed-rust @@ -0,0 +1,6 @@ + __ _ __ __ ____ __ + / / (_) /_ ________ _________ ___ ___ ____/ / / __ \__ _______/ /_ + / / / / __ \/ ___/ _ \/ ___/ __ \/ _ \/ _ \/ __ /_____/ /_/ / / / / ___/ __/ + / /___/ / /_/ / / / __(__ ) /_/ / __/ __/ /_/ /_____/ _, _/ /_/ (__ ) /_ +/_____/_/_.___/_/ \___/____/ .___/\___/\___/\__,_/ /_/ |_|\__,_/____/\__/ + /_/ diff --git a/ct/itsm-ng.sh b/ct/itsm-ng.sh new file mode 100644 index 000000000..81195c67d --- /dev/null +++ b/ct/itsm-ng.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Florianb63 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://itsm-ng.com/ + +APP="ITSM-NG" +var_tags="${var_tags:-asset-management;foss}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-10}" +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 /etc/itsm-ng/config_db.php ]]; then + msg_error "No ${APP} Installation Found!" + exit 1 + fi + + msg_info "Updating ${APP} LXC" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "Updated Successfully" + + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/ct/librespeed-rust.sh b/ct/librespeed-rust.sh new file mode 100644 index 000000000..e10a9b679 --- /dev/null +++ b/ct/librespeed-rust.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Joseph Stubberfield (stubbers) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/librespeed/speedtest-rust + +APP="Librespeed-Rust" +var_tags="${var_tags:-network}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /var/lib/librespeed-rs ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -fsSL https://api.github.com/repos/librespeed/speedtest-rust/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "v([^"]+).*/\1/') + if [[ "${RELEASE}" != "$(cat ~/.librespeed 2>/dev/null)" ]] || [[ ! -f ~/.librespeed ]]; then + msg_info "Stopping Services" + systemctl stop librespeed-rs + msg_ok "Services Stopped" + + fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-x86_64-unknown-linux-gnu.deb" + + msg_info "Starting Service" + systemctl start librespeed-rs + msg_ok "Started Service" + else + msg_ok "No update required. ${APP} is already at v${RELEASE}" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/openwebui.sh b/ct/openwebui.sh index b5f937fc3..b25b4915f 100644 --- a/ct/openwebui.sh +++ b/ct/openwebui.sh @@ -30,11 +30,11 @@ function update_script() { if [ -x "/usr/bin/ollama" ]; then msg_info "Updating Ollama" - rm -rf /usr/lib/ollama - rm -rf /usr/bin/ollama OLLAMA_VERSION=$(ollama -v | awk '{print $NF}') RELEASE=$(curl -s https://api.github.com/repos/ollama/ollama/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') if [ "$OLLAMA_VERSION" != "$RELEASE" ]; then + rm -rf /usr/lib/ollama + rm -rf /usr/bin/ollama curl -fsSLO https://ollama.com/download/ollama-linux-amd64.tgz tar -C /usr -xzf ollama-linux-amd64.tgz rm -rf ollama-linux-amd64.tgz diff --git a/frontend/public/json/itsm-ng.json b/frontend/public/json/itsm-ng.json new file mode 100644 index 000000000..6ff7d184c --- /dev/null +++ b/frontend/public/json/itsm-ng.json @@ -0,0 +1,35 @@ +{ + "name": "ITSM-NG", + "slug": "itsm-ng", + "categories": [ + 25 + ], + "date_created": "2025-07-01", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://wiki.itsm-ng.org/en/home", + "website": "https://itsm-ng.com", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/itsm-ng.svg", + "config_path": "/etc/itsm-ng", + "description": "ITSM-NG is a powerful, open-source IT Service Management (ITSM) solution designed for managing IT assets, software, licenses, and support processes in accordance with ITIL best practices. It offers integrated features for asset inventory, incident tracking, problem management, change requests, and service desk workflows.", + "install_methods": [ + { + "type": "default", + "script": "ct/itsm-ng.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "itsm", + "password": "itsm" + }, + "notes": [] +} diff --git a/frontend/public/json/jellyfin.json b/frontend/public/json/jellyfin.json index 8c0429c16..4dedd7103 100644 --- a/frontend/public/json/jellyfin.json +++ b/frontend/public/json/jellyfin.json @@ -39,6 +39,10 @@ { "text": "FFmpeg path: /usr/lib/jellyfin-ffmpeg/ffmpeg", "type": "info" + }, + { + "text": "For NVIDIA graphics cards, you'll need to install the same drivers in the container that you did on the host. In the container, run the driver installation script and add the CLI arg --no-kernel-module", + "type": "info" } ] } diff --git a/frontend/public/json/librespeed-rust.json b/frontend/public/json/librespeed-rust.json new file mode 100644 index 000000000..13c2eaf5e --- /dev/null +++ b/frontend/public/json/librespeed-rust.json @@ -0,0 +1,35 @@ +{ + "name": "Librespeed Rust", + "slug": "librespeed-rust", + "categories": [ + 4 + ], + "date_created": "2025-07-01", + "type": "ct", + "updateable": true, + "privileged": false, + "config_path": "/var/lib/librespeed-rs/configs.toml", + "interface_port": 8080, + "documentation": "https://github.com/librespeed/speedtest-rust", + "website": "https://github.com/librespeed/speedtest-rust", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/librespeed.svg", + "description": "Librespeed is a no flash, no java, no websocket speedtest server. This community script deploys the rust version for simplicity and low resource usage.", + "install_methods": [ + { + "type": "default", + "script": "ct/librespeed-rust.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index fd51efbb8..3f36ef931 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,28 +1,123 @@ [ - { - "name": "MagicMirrorOrg/MagicMirror", - "version": "v2.32.0", - "date": "2025-06-30T22:12:48Z" - }, { "name": "mongodb/mongo", - "version": "r8.0.11", - "date": "2025-06-30T20:30:31Z" + "version": "r8.1.2", + "date": "2025-07-01T22:39:32Z" }, { - "name": "docker/compose", - "version": "v2.38.1", - "date": "2025-06-30T20:07:35Z" + "name": "Threadfin/Threadfin", + "version": "1.2.35", + "date": "2025-07-01T21:37:20Z" + }, + { + "name": "apache/tomcat", + "version": "10.1.43", + "date": "2025-07-01T21:32:34Z" + }, + { + "name": "actualbudget/actual", + "version": "v25.7.0", + "date": "2025-07-01T21:02:27Z" }, { "name": "home-assistant/core", "version": "2025.6.3", "date": "2025-06-24T13:00:12Z" }, + { + "name": "TwiN/gatus", + "version": "v5.19.0", + "date": "2025-07-01T19:59:32Z" + }, + { + "name": "Koenkk/zigbee2mqtt", + "version": "2.5.0", + "date": "2025-07-01T18:28:01Z" + }, + { + "name": "hivemq/hivemq-community-edition", + "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": "jenkinsci/jenkins", + "version": "jenkins-2.517", + "date": "2025-07-01T16:08:23Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.133.0", + "date": "2025-07-01T15:13:42Z" + }, + { + "name": "sysadminsmedia/homebox", + "version": "v0.20.1", + "date": "2025-07-01T14:18:32Z" + }, + { + "name": "keycloak/keycloak", + "version": "26.3.0", + "date": "2025-07-01T13:18:12Z" + }, + { + "name": "syncthing/syncthing", + "version": "v1.30.0", + "date": "2025-07-01T11:29:11Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.2.0p44-rc1", + "date": "2025-07-01T11:10:25Z" + }, { "name": "rcourtman/Pulse", - "version": "v3.33.1", - "date": "2025-06-30T11:29:32Z" + "version": "v99.99.99", + "date": "2025-07-01T08:26:41Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.2101", + "date": "2025-07-01T05:56:59Z" + }, + { + "name": "zabbix/zabbix", + "version": "7.4.0", + "date": "2025-07-01T04:36:51Z" + }, + { + "name": "openobserve/openobserve", + "version": "v0.15.0-rc3", + "date": "2025-07-01T04:09:37Z" + }, + { + "name": "wazuh/wazuh", + "version": "coverity-w27-4.13.0", + "date": "2025-07-01T03:17:32Z" + }, + { + "name": "NginxProxyManager/nginx-proxy-manager", + "version": "v2.12.4", + "date": "2025-07-01T01:45:42Z" + }, + { + "name": "MagicMirrorOrg/MagicMirror", + "version": "v2.32.0", + "date": "2025-06-30T22:12:48Z" + }, + { + "name": "docker/compose", + "version": "v2.38.1", + "date": "2025-06-30T20:07:35Z" }, { "name": "jhuckaby/Cronicle", @@ -31,8 +126,8 @@ }, { "name": "ollama/ollama", - "version": "v0.9.4-rc2", - "date": "2025-06-27T18:45:33Z" + "version": "v0.9.4-rc6", + "date": "2025-06-30T15:59:03Z" }, { "name": "prometheus/prometheus", @@ -49,11 +144,6 @@ "version": "v7.4.4", "date": "2025-06-30T13:04:22Z" }, - { - "name": "keycloak/keycloak", - "version": "26.3.0", - "date": "2025-06-30T12:53:32Z" - }, { "name": "Graylog2/graylog2-server", "version": "6.3.0", @@ -84,11 +174,6 @@ "version": "preview-v0.1", "date": "2025-06-27T14:35:47Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.2097", - "date": "2025-06-30T05:53:30Z" - }, { "name": "typesense/typesense", "version": "v29.0", @@ -99,11 +184,6 @@ "version": "v6.2.19", "date": "2025-06-28T06:53:45Z" }, - { - "name": "sysadminsmedia/homebox", - "version": "v0.20.0", - "date": "2025-06-29T18:50:03Z" - }, { "name": "dgtlmoon/changedetection.io", "version": "0.50.5", @@ -189,11 +269,6 @@ "version": "341.1", "date": "2025-06-27T08:50:16Z" }, - { - "name": "zabbix/zabbix", - "version": "7.2.10", - "date": "2025-06-27T06:40:00Z" - }, { "name": "MediaBrowser/Emby.Releases", "version": "4.9.1.2", @@ -264,11 +339,6 @@ "version": "2.0.5", "date": "2025-06-25T14:53:31Z" }, - { - "name": "jenkinsci/jenkins", - "version": "jenkins-2.504.3", - "date": "2025-06-25T14:43:01Z" - }, { "name": "bunkerity/bunkerweb", "version": "testing", @@ -299,26 +369,11 @@ "version": "v2.18.0", "date": "2025-06-24T08:29:55Z" }, - { - "name": "element-hq/synapse", - "version": "v1.132.0", - "date": "2025-06-17T13:49:30Z" - }, - { - "name": "Checkmk/checkmk", - "version": "v2.4.0p5", - "date": "2025-06-24T13:06:53Z" - }, { "name": "fallenbagel/jellyseerr", "version": "preview-fix-proxy-axios", "date": "2025-06-24T08:50:22Z" }, - { - "name": "wazuh/wazuh", - "version": "coverity-w26-4.13.0", - "date": "2025-06-24T02:02:34Z" - }, { "name": "minio/minio", "version": "RELEASE.2025-06-13T11-33-47Z", @@ -326,8 +381,8 @@ }, { "name": "runtipi/runtipi", - "version": "nightly", - "date": "2025-06-23T19:10:33Z" + "version": "v4.2.1", + "date": "2025-06-03T20:04:28Z" }, { "name": "VictoriaMetrics/VictoriaMetrics", @@ -364,11 +419,6 @@ "version": "0.17.14", "date": "2025-06-21T23:43:04Z" }, - { - "name": "HabitRPG/habitica", - "version": "v5.37.0", - "date": "2025-06-21T14:05:12Z" - }, { "name": "rogerfar/rdt-client", "version": "v2.0.114", @@ -394,11 +444,6 @@ "version": "v4.0.15.2941", "date": "2025-06-20T17:20:54Z" }, - { - "name": "syncthing/syncthing", - "version": "2.0.0-rc.19", - "date": "2025-06-02T17:56:25Z" - }, { "name": "benzino77/tasmocompiler", "version": "v12.7.0", @@ -619,11 +664,6 @@ "version": "v3.4.1", "date": "2025-06-11T07:53:44Z" }, - { - "name": "openobserve/openobserve", - "version": "v0.15.0-rc2", - "date": "2025-06-11T04:29:22Z" - }, { "name": "OctoPrint/OctoPrint", "version": "1.11.2", @@ -684,11 +724,6 @@ "version": "v0.26.1", "date": "2025-06-06T11:22:02Z" }, - { - "name": "apache/tomcat", - "version": "10.1.42", - "date": "2025-06-05T22:39:40Z" - }, { "name": "benjaminjonard/koillection", "version": "1.6.14", @@ -704,11 +739,6 @@ "version": "mariadb-11.8.2", "date": "2025-06-04T13:35:16Z" }, - { - "name": "actualbudget/actual", - "version": "v25.6.1", - "date": "2025-06-04T22:24:31Z" - }, { "name": "rabbitmq/rabbitmq-server", "version": "v4.1.1", @@ -744,16 +774,6 @@ "version": "v1.3.2", "date": "2025-06-01T19:02:46Z" }, - { - "name": "Koenkk/zigbee2mqtt", - "version": "2.4.0", - "date": "2025-06-01T18:08:44Z" - }, - { - "name": "TwiN/gatus", - "version": "v5.18.1", - "date": "2025-05-31T23:06:08Z" - }, { "name": "blakeblackshear/frigate", "version": "v0.14.1", @@ -769,11 +789,6 @@ "version": "0.26.3", "date": "2025-05-29T21:18:15Z" }, - { - "name": "navidrome/navidrome", - "version": "v0.56.1", - "date": "2025-05-29T19:09:16Z" - }, { "name": "readeck/readeck", "version": "0.19.2", @@ -794,11 +809,6 @@ "version": "v1.12.3", "date": "2025-05-27T20:43:10Z" }, - { - "name": "Threadfin/Threadfin", - "version": "1.2.34", - "date": "2025-05-27T18:18:00Z" - }, { "name": "dani-garcia/vaultwarden", "version": "1.34.1", @@ -939,11 +949,6 @@ "version": "6.8.1", "date": "2025-04-30T16:44:16Z" }, - { - "name": "hivemq/hivemq-community-edition", - "version": "2025.3", - "date": "2025-04-30T02:52:28Z" - }, { "name": "hargata/lubelog", "version": "v1.4.7", @@ -1209,11 +1214,6 @@ "version": "v25.2.1", "date": "2025-02-06T20:41:28Z" }, - { - "name": "NginxProxyManager/nginx-proxy-manager", - "version": "v2.12.3", - "date": "2025-02-06T11:07:07Z" - }, { "name": "AmruthPillai/Reactive-Resume", "version": "v4.4.4", diff --git a/install/itsm-ng-install.sh b/install/itsm-ng-install.sh new file mode 100644 index 000000000..4f9697e12 --- /dev/null +++ b/install/itsm-ng-install.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Florianb63 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://itsm-ng.com/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +setup_mariadb + +msg_info "Setting up database" +DB_NAME=itsmng_db +DB_USER=itsmng +DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) +mariadb-tzinfo-to-sql /usr/share/zoneinfo | mariadb mysql +mariadb -u root -e "CREATE DATABASE $DB_NAME;" +mariadb -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';" +mariadb -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';" +mariadb -u root -e "GRANT SELECT ON \`mysql\`.\`time_zone_name\` TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;" +{ + echo "ITSM-NG Database Credentials" + echo "Database: $DB_NAME" + echo "Username: $DB_USER" + echo "Password: $DB_PASS" +} >>~/itsmng_db.creds +msg_ok "Set up database" + +msg_info "Setup ITSM-NG Repository" +curl -fsSL http://deb.itsm-ng.org/pubkey.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/itsm-ng-keyring.gpg +echo "deb http://deb.itsm-ng.org/$(. /etc/os-release && echo "$ID")/ $(. /etc/os-release && echo "$VERSION_CODENAME") main" >/etc/apt/sources.list.d/itsm-ng.list +$STD apt-get update +msg_ok "Setup ITSM-NG Repository" + +msg_info "Installing ITSM-NG" +$STD apt install -y itsm-ng +cd /usr/share/itsm-ng +$STD php bin/console db:install --db-name=$DB_NAME --db-user=$DB_USER --db-password=$DB_PASS --no-interaction +$STD a2dissite 000-default.conf +echo "* * * * * php /usr/share/itsm-ng/front/cron.php" | crontab - +msg_ok "Installed ITSM-NG" + +msg_info "Configuring PHP" +PHP_VERSION=$(ls /etc/php/ | grep -E '^[0-9]+\.[0-9]+$' | head -n 1) +PHP_INI="/etc/php/$PHP_VERSION/apache2/php.ini" +sed -i 's/^upload_max_filesize = .*/upload_max_filesize = 20M/' $PHP_INI +sed -i 's/^post_max_size = .*/post_max_size = 20M/' $PHP_INI +sed -i 's/^max_execution_time = .*/max_execution_time = 60/' $PHP_INI +sed -i 's/^[;]*max_input_vars *=.*/max_input_vars = 5000/' "$PHP_INI" +sed -i 's/^memory_limit = .*/memory_limit = 256M/' $PHP_INI +sed -i 's/^;\?\s*session.cookie_httponly\s*=.*/session.cookie_httponly = On/' $PHP_INI +systemctl restart apache2 +msg_ok "Configured PHP" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -rf /usr/share/itsm-ng/install +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/librespeed-rust-install.sh b/install/librespeed-rust-install.sh new file mode 100644 index 000000000..7013543fc --- /dev/null +++ b/install/librespeed-rust-install.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Joseph Stubberfield (stubbers) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/librespeed/speedtest-rust + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-x86_64-unknown-linux-gnu.deb" + +msg_info "Enabling Service" +systemctl enable -q --now speedtest_rs.service +msg_ok "Enabled Service" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/misc/tools.func b/misc/tools.func index 76e5c666b..65009a92a 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -755,7 +755,7 @@ function fetch_and_deploy_gh_release() { local app_lc=$(echo "${app,,}" | tr -d ' ') local version_file="$HOME/.${app_lc}" - local api_timeout="--connect-timeout 5 --max-time 30" + local api_timeout="--connect-timeout 10 --max-time 60" local download_timeout="--connect-timeout 15 --max-time 900" local current_version="" @@ -770,6 +770,14 @@ function fetch_and_deploy_gh_release() { local header=() [[ -n "${GITHUB_TOKEN:-}" ]] && header=(-H "Authorization: token $GITHUB_TOKEN") + # dns pre check + local gh_host + gh_host=$(awk -F/ '{print $3}' <<<"$api_url") + if ! getent hosts "$gh_host" &>/dev/null; then + msg_error "DNS resolution failed for $gh_host – check /etc/resolv.conf or networking" + return 1 + fi + local max_retries=3 retry_delay=2 attempt=1 success=false resp http_code while ((attempt <= max_retries)); do @@ -779,7 +787,7 @@ function fetch_and_deploy_gh_release() { done if ! $success; then - msg_error "Failed to fetch release metadata after $max_retries attempts" + msg_error "Failed to fetch release metadata from $api_url after $max_retries attempts" return 1 fi @@ -834,14 +842,12 @@ function fetch_and_deploy_gh_release() { local assets url_match="" assets=$(echo "$json" | jq -r '.assets[].browser_download_url') - # If explicit filename pattern is provided (param $6), match that first if [[ -n "$6" ]]; then for u in $assets; do [[ "$u" =~ $6 || "$u" == *"$6" ]] && url_match="$u" && break done fi - # If no match via explicit pattern, fall back to architecture heuristic if [[ -z "$url_match" ]]; then for u in $assets; do if [[ "$u" =~ ($arch|amd64|x86_64|aarch64|arm64).*\.deb$ ]]; then @@ -851,7 +857,6 @@ function fetch_and_deploy_gh_release() { done fi - # Fallback: any .deb file if [[ -z "$url_match" ]]; then for u in $assets; do [[ "$u" =~ \.deb$ ]] && url_match="$u" && break