Compare commits

..

10 Commits

Author SHA1 Message Date
8c0319a42b Improve error handling and cleanup in shell functions
Refactored various shell functions to add more robust error handling by redirecting stderr to /dev/null and using '|| true' to prevent script failures. Enhanced npm cache cleanup to remove both _cacache and _logs directories, and improved reliability of version and keyring extraction commands. These changes increase script resilience and prevent unnecessary errors from halting execution.
2025-12-18 15:55:29 +01:00
ab4a4709a1 Merge branch 'main' of https://github.com/community-scripts/ProxmoxVE 2025-12-18 15:01:45 +01:00
503fc0e6e2 npm clean dont forward to std 2025-12-18 15:01:39 +01:00
bd3a5c98cf Update versions.json (#10111)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 13:07:17 +01:00
0e8d053ba0 Simplify npm cache cleanup logic in cleanup_lxc
Replaced the if-statement for npm cache cleaning with a single command using '||' to fall back to manual cache removal if 'npm cache clean' fails. This streamlines the cleanup process.
2025-12-18 12:28:04 +01:00
f0f0a63f6c Improve npm cache cleanup fallback logic
Adds a fallback to manually remove the npm cache directory if 'npm cache clean --force' fails during cleanup. This ensures the cache is cleared even if the npm command encounters an error.
2025-12-18 12:09:52 +01:00
7d865172ae Update CHANGELOG.md (#10110)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 10:32:59 +00:00
21e0a8fced Fix cleanup issues in npm cache and rustup toolchain (#10107)
Issue 1 - BentoPDF (npm cache clean failure):
- npm cache clean --force can fail with ENOTEMPTY on corrupted caches
- Added npm cache verify before clean to detect/fix corruption
- Explicitly redirect stderr to suppress error noise

Issue 2 - Linkwarden (rustup toolchain removed too early):
- Script deleted ~/.rustup during build cleanup
- Later cleanup_lxc() tried to run 'cargo clean' without toolchain
- Now only remove cargo cache dirs, preserve ~/.rustup toolchain

Files changed:
- misc/core.func (cleanup_lxc function)
- install/linkwarden-install.sh (install script)
- ct/linkwarden.sh (update function)

Both changes improve reliability of container cleanup process.
2025-12-18 11:32:30 +01:00
fdb722fae3 Update CHANGELOG.md (#10108)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 08:57:15 +00:00
d86815d01d Fix Zabbix 7.0 repository URL structure (#10106)
- Zabbix 7.0 uses different repository layout without release/ directory
- Package name includes version suffix for 7.0: zabbix-release_latest_7.0+debian13_all.deb
- Zabbix 7.4+ uses release/ directory with no version suffix
- Applied fix to both ct/zabbix.sh and install/zabbix-install.sh
2025-12-18 09:56:54 +01:00
6 changed files with 129 additions and 111 deletions

View File

@ -16,6 +16,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### 🐞 Bug Fixes
- Fix cleanup issues in npm cache and rustup toolchain [@MickLesk](https://github.com/MickLesk) ([#10107](https://github.com/community-scripts/ProxmoxVE/pull/10107))
- Fix Zabbix 7.0 repository URL structure [@MickLesk](https://github.com/MickLesk) ([#10106](https://github.com/community-scripts/ProxmoxVE/pull/10106))
- [HOTFIX] Fix Scanopy release check [@vhsdream](https://github.com/vhsdream) ([#10097](https://github.com/community-scripts/ProxmoxVE/pull/10097))
## 2025-12-17

View File

@ -67,10 +67,18 @@ function update_script() {
rm -Rf /etc/apt/sources.list.d/zabbix.list
cd /tmp
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/zabbix-release_latest+debian13_all.deb
$STD dpkg -i zabbix-release_latest+debian13_all.deb
rm -rf /tmp/zabbix-release_latest+debian13_all.deb
if [[ "$ZABBIX_VERSION" == "7.0" ]]; then
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/debian/pool/main/z/zabbix-release/zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb"
ZABBIX_DEB_FILE="zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb"
else
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
ZABBIX_DEB_FILE="zabbix-release_latest+debian13_all.deb"
fi
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/"$ZABBIX_DEB_FILE"
$STD dpkg -i /tmp/"$ZABBIX_DEB_FILE"
rm -rf /tmp/zabbix-release_*.deb
$STD apt update
$STD apt install --only-upgrade zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql

View File

@ -1,13 +1,88 @@
[
{
"name": "javedh-dev/tracktor",
"version": "1.0.1",
"date": "2025-12-17T23:14:39Z"
"name": "juanfont/headscale",
"version": "v0.27.1",
"date": "2025-11-11T19:32:29Z"
},
{
"name": "docker/compose",
"version": "v5.0.1",
"date": "2025-12-18T10:35:33Z"
},
{
"name": "tailscale/tailscale",
"version": "v1.92.4",
"date": "2025-12-18T10:32:44Z"
},
{
"name": "TuroYT/snowshare",
"version": "v1.2.3",
"date": "2025-12-18T10:06:45Z"
},
{
"name": "coollabsio/coolify",
"version": "v4.0.0-beta.456",
"date": "2025-12-18T08:59:27Z"
},
{
"name": "Kozea/Radicale",
"version": "v3.5.10",
"date": "2025-12-18T07:14:13Z"
},
{
"name": "zabbix/zabbix",
"version": "7.4.6",
"date": "2025-12-18T07:00:26Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.478",
"date": "2025-12-18T05:55:21Z"
},
{
"name": "chrisvel/tududi",
"version": "v0.88.1",
"date": "2025-12-18T05:01:07Z"
},
{
"name": "comfyanonymous/ComfyUI",
"version": "v0.5.1",
"date": "2025-12-18T03:08:43Z"
},
{
"name": "scanopy/scanopy",
"version": "v0.12.3",
"date": "2025-12-18T02:48:06Z"
},
{
"name": "openobserve/openobserve",
"version": "v0.30.1",
"date": "2025-12-18T02:41:34Z"
},
{
"name": "chrisbenincasa/tunarr",
"version": "v1.0.6",
"date": "2025-12-18T01:28:04Z"
},
{
"name": "jeedom/core",
"version": "4.5.1",
"date": "2025-12-18T00:27:07Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.1.0",
"date": "2025-11-23T12:13:34Z"
},
{
"name": "goauthentik/authentik",
"version": "version/2025.12.0-rc2",
"date": "2025-12-17T22:03:04Z"
"version": "version/2025.10.3",
"date": "2025-12-16T18:00:53Z"
},
{
"name": "javedh-dev/tracktor",
"version": "1.0.1",
"date": "2025-12-17T11:31:03Z"
},
{
"name": "ollama/ollama",
@ -39,6 +114,11 @@
"version": "v4.107.0",
"date": "2025-12-17T18:59:21Z"
},
{
"name": "neo4j/neo4j",
"version": "5.26.19",
"date": "2025-12-17T18:17:55Z"
},
{
"name": "metabase/metabase",
"version": "v0.57.7",
@ -55,19 +135,9 @@
"date": "2025-12-17T17:43:28Z"
},
{
"name": "openobserve/openobserve",
"version": "v0.30.1",
"date": "2025-12-17T17:34:52Z"
},
{
"name": "comfyanonymous/ComfyUI",
"version": "v0.5.0",
"date": "2025-12-17T16:48:33Z"
},
{
"name": "scanopy/scanopy",
"version": "v0.12.2",
"date": "2025-12-17T16:01:43Z"
"name": "keycloak/keycloak",
"version": "26.4.7",
"date": "2025-12-01T08:14:11Z"
},
{
"name": "semaphoreui/semaphore",
@ -84,16 +154,6 @@
"version": "n8n@1.123.7",
"date": "2025-12-17T14:01:25Z"
},
{
"name": "zabbix/zabbix",
"version": "7.2.15",
"date": "2025-12-17T13:25:42Z"
},
{
"name": "chrisbenincasa/tunarr",
"version": "v1.0.5",
"date": "2025-12-17T12:48:30Z"
},
{
"name": "bunkerity/bunkerweb",
"version": "testing",
@ -109,16 +169,6 @@
"version": "v11.1.2",
"date": "2025-12-17T09:26:24Z"
},
{
"name": "coollabsio/coolify",
"version": "v4.0.0-beta.455",
"date": "2025-12-17T09:24:10Z"
},
{
"name": "TuroYT/snowshare",
"version": "v1.2.2",
"date": "2025-12-17T09:07:12Z"
},
{
"name": "zitadel/zitadel",
"version": "v4.7.6",
@ -159,11 +209,6 @@
"version": "v25.4",
"date": "2025-10-09T10:27:01Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.468",
"date": "2025-12-17T05:55:30Z"
},
{
"name": "nickheyer/discopanel",
"version": "v1.0.16",
@ -174,16 +219,6 @@
"version": "v1.19.23",
"date": "2025-12-17T00:51:11Z"
},
{
"name": "jeedom/core",
"version": "4.5",
"date": "2025-12-17T00:27:05Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.1.0",
"date": "2025-11-23T12:13:34Z"
},
{
"name": "esphome/esphome",
"version": "2025.12.0",
@ -199,16 +234,6 @@
"version": "1.1.7",
"date": "2025-12-16T21:44:58Z"
},
{
"name": "tailscale/tailscale",
"version": "v1.92.3",
"date": "2025-12-16T21:19:10Z"
},
{
"name": "keycloak/keycloak",
"version": "26.4.7",
"date": "2025-12-01T08:14:11Z"
},
{
"name": "prometheus-pve/prometheus-pve-exporter",
"version": "v3.7.0",
@ -449,11 +474,6 @@
"version": "cli/v0.29.1",
"date": "2025-12-13T13:55:51Z"
},
{
"name": "chrisvel/tududi",
"version": "v0.88.0",
"date": "2025-12-13T09:36:24Z"
},
{
"name": "Dokploy/dokploy",
"version": "v0.26.2",
@ -462,7 +482,7 @@
{
"name": "mealie-recipes/mealie",
"version": "v3.7.0",
"date": "2025-12-13T01:21:07Z"
"date": "2025-12-13T01:20:58Z"
},
{
"name": "paperless-ngx/paperless-ngx",
@ -814,16 +834,6 @@
"version": "v6.2.4",
"date": "2025-12-02T17:47:52Z"
},
{
"name": "docker/compose",
"version": "v5.0.0",
"date": "2025-12-02T10:33:31Z"
},
{
"name": "neo4j/neo4j",
"version": "5.26.18",
"date": "2025-12-02T09:25:19Z"
},
{
"name": "syncthing/syncthing",
"version": "v2.0.12",
@ -864,11 +874,6 @@
"version": "v2.4.7",
"date": "2025-11-30T20:59:51Z"
},
{
"name": "juanfont/headscale",
"version": "v0.27.1",
"date": "2025-11-11T19:32:29Z"
},
{
"name": "hargata/lubelog",
"version": "v1.5.5",
@ -894,11 +899,6 @@
"version": "v25.9.0",
"date": "2025-11-29T16:37:28Z"
},
{
"name": "Kozea/Radicale",
"version": "v3.5.9",
"date": "2025-11-29T14:35:45Z"
},
{
"name": "authelia/authelia",
"version": "v4.39.15",

View File

@ -31,9 +31,17 @@ esac
msg_info "Installing Zabbix $ZABBIX_VERSION"
cd /tmp
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/zabbix-release_latest+debian13_all.deb
$STD dpkg -i /tmp/zabbix-release_latest+debian13_all.deb
if [[ "$ZABBIX_VERSION" == "7.0" ]]; then
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/debian/pool/main/z/zabbix-release/zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb"
ZABBIX_DEB_FILE="zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb"
else
ZABBIX_DEB_URL="https://repo.zabbix.com/zabbix/${ZABBIX_VERSION}/release/debian/pool/main/z/zabbix-release/zabbix-release_latest+debian13_all.deb"
ZABBIX_DEB_FILE="zabbix-release_latest+debian13_all.deb"
fi
curl -fsSL "$ZABBIX_DEB_URL" -o /tmp/"$ZABBIX_DEB_FILE"
$STD dpkg -i /tmp/"$ZABBIX_DEB_FILE"
$STD apt update
$STD apt install -y zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql zabbix-apache-conf zabbix-sql-scripts
zcat /usr/share/zabbix/sql-scripts/postgresql/server.sql.gz | sudo -u "$PG_DB_USER" psql "$PG_DB_NAME" &>/dev/null
@ -104,7 +112,7 @@ fi
systemctl restart zabbix-server apache2
systemctl enable -q --now zabbix-server $AGENT_SERVICE apache2
rm -rf /tmp/zabbix-release_latest+debian13_all.deb
rm -rf /tmp/zabbix-release_*.deb
msg_ok "Started Services"
motd_ssh

View File

@ -815,10 +815,10 @@ cleanup_lxc() {
xargs -0 -n1 truncate -s 0 2>/dev/null || true
fi
# Node.js npm
# Node.js npm - directly remove cache directory
# npm cache clean/verify can fail with ENOTEMPTY errors, so we skip them
if command -v npm &>/dev/null; then
$STD npm cache verify 2>/dev/null || true
$STD npm cache clean --force 2>/dev/null || true
rm -rf /root/.npm/_cacache /root/.npm/_logs 2>/dev/null || true
fi
# Node.js yarn
if command -v yarn &>/dev/null; then $STD yarn cache clean || true; fi

View File

@ -334,9 +334,9 @@ remove_old_tool_version() {
$STD apt purge -y nodejs npm >/dev/null 2>&1 || true
# Clean up npm global modules
if command -v npm >/dev/null 2>&1; then
npm list -g 2>/dev/null | grep -oE '^ \S+' | awk '{print $1}' | while read -r module; do
npm list -g 2>/dev/null | grep -oE '^ \S+' | awk '{print $1}' 2>/dev/null | while read -r module; do
npm uninstall -g "$module" >/dev/null 2>&1 || true
done
done || true
fi
cleanup_legacy_install "nodejs"
cleanup_tool_keyrings "nodesource"
@ -1167,7 +1167,7 @@ cleanup_orphaned_sources() {
# Extract Signed-By path from .sources file
local keyring_path
keyring_path=$(grep -E '^Signed-By:' "$sources_file" 2>/dev/null | awk '{print $2}')
keyring_path=$(grep -E '^Signed-By:' "$sources_file" 2>/dev/null | awk '{print $2}' 2>/dev/null || true)
# If keyring doesn't exist, remove the .sources file
if [[ -n "$keyring_path" ]] && [[ ! -f "$keyring_path" ]]; then
@ -2073,7 +2073,7 @@ function setup_adminer() {
return 1
}
local VERSION
VERSION=$(dpkg -s adminer 2>/dev/null | grep '^Version:' | awk '{print $2}')
VERSION=$(dpkg -s adminer 2>/dev/null | grep '^Version:' | awk '{print $2}' 2>/dev/null || echo 'unknown')
cache_installed_version "adminer" "${VERSION:-unknown}"
msg_ok "Setup Adminer (Debian/Ubuntu)"
fi
@ -2591,7 +2591,7 @@ function setup_hwaccel() {
# Detect CPU vendor (relevant for AMD APUs)
local cpu_vendor
cpu_vendor=$(lscpu 2>/dev/null | grep -i 'Vendor ID' | awk '{print $3}' || echo "")
cpu_vendor=$(lscpu 2>/dev/null | grep -i 'Vendor ID' | awk '{print $3}' 2>/dev/null || echo "")
if [[ -z "$gpu_vendor" && -z "$cpu_vendor" ]]; then
msg_warn "No GPU or CPU vendor detected - skipping hardware acceleration setup"
@ -3699,7 +3699,7 @@ function setup_nodejs() {
# Check if the module is already installed
if $STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep -q "$MODULE_NAME@"; then
MODULE_INSTALLED_VERSION="$($STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' | tr -d '[:space:]')"
MODULE_INSTALLED_VERSION="$(npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' 2>/dev/null | tr -d '[:space:]' || echo '')"
if [[ "$MODULE_REQ_VERSION" != "latest" && "$MODULE_REQ_VERSION" != "$MODULE_INSTALLED_VERSION" ]]; then
msg_info "Updating $MODULE_NAME from v$MODULE_INSTALLED_VERSION to v$MODULE_REQ_VERSION"
if ! $STD npm install -g "${MODULE_NAME}@${MODULE_REQ_VERSION}" 2>/dev/null; then
@ -3818,7 +3818,7 @@ EOF
# Get available PHP version from repository
local AVAILABLE_PHP_VERSION=""
AVAILABLE_PHP_VERSION=$(apt-cache show "php${PHP_VERSION}" 2>/dev/null | grep -m1 "^Version:" | awk '{print $2}' | cut -d- -f1) || true
AVAILABLE_PHP_VERSION=$(apt-cache show "php${PHP_VERSION}" 2>/dev/null | grep -m1 "^Version:" | awk '{print $2}' 2>/dev/null | cut -d- -f1 || true)
if [[ -z "$AVAILABLE_PHP_VERSION" ]]; then
msg_error "PHP ${PHP_VERSION} not found in configured repositories"
@ -4620,7 +4620,7 @@ function setup_rust() {
# Check if already installed
if echo "$CRATE_LIST" | grep -q "^${NAME} "; then
INSTALLED_VER=$(echo "$CRATE_LIST" | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
INSTALLED_VER=$(echo "$CRATE_LIST" | grep "^${NAME} " | head -1 | awk '{print $2}' 2>/dev/null | tr -d 'v:' || echo '')
if [[ -n "$VER" && "$VER" != "$INSTALLED_VER" ]]; then
msg_info "Upgrading $NAME from v$INSTALLED_VER to v$VER"
@ -4635,7 +4635,7 @@ function setup_rust() {
msg_error "Failed to upgrade $NAME"
return 1
}
local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' 2>/dev/null | tr -d 'v:' || echo 'unknown')
msg_ok "Upgraded $NAME to v$NEW_VER"
else
msg_ok "$NAME v$INSTALLED_VER already installed"
@ -4653,7 +4653,7 @@ function setup_rust() {
msg_error "Failed to install $NAME"
return 1
}
local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' 2>/dev/null | tr -d 'v:' || echo 'unknown')
msg_ok "Installed $NAME v$NEW_VER"
fi
fi
@ -4975,7 +4975,7 @@ function setup_docker() {
# Install or upgrade Docker
if [ "$docker_installed" = true ]; then
msg_info "Checking for Docker updates"
DOCKER_LATEST_VERSION=$(apt-cache policy docker-ce | grep Candidate | awk '{print $2}' | cut -d':' -f2 | cut -d'-' -f1)
DOCKER_LATEST_VERSION=$(apt-cache policy docker-ce | grep Candidate | awk '{print $2}' 2>/dev/null | cut -d':' -f2 | cut -d'-' -f1 || echo '')
if [ "$DOCKER_CURRENT_VERSION" != "$DOCKER_LATEST_VERSION" ]; then
msg_info "Updating Docker $DOCKER_CURRENT_VERSION$DOCKER_LATEST_VERSION"