Compare commits

..

14 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
84d9a2957b Update CHANGELOG.md (#10101)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 01:31:50 +00:00
5e3eca2832 Fix release check (#10097) 2025-12-18 02:31:28 +01:00
bc479d7ffe Update CHANGELOG.md (#10100)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 00:12:03 +00:00
610ec3d157 Update versions.json (#10099)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 01:11:39 +01:00
11 changed files with 213 additions and 479 deletions

View File

@ -10,6 +10,16 @@
> [!CAUTION] > [!CAUTION]
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes. Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
## 2025-12-18
### 🚀 Updated Scripts
- #### 🐞 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 ## 2025-12-17
### 🚀 Updated Scripts ### 🚀 Updated Scripts

View File

@ -52,7 +52,7 @@ function update_script() {
$STD yarn web:build $STD yarn web:build
$STD yarn prisma:deploy $STD yarn prisma:deploy
[ -d /opt/data.bak ] && mv /opt/data.bak /opt/linkwarden/data [ -d /opt/data.bak ] && mv /opt/data.bak /opt/linkwarden/data
rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache ~/.rustup rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache
rm -rf /root/.cache/yarn rm -rf /root/.cache/yarn
rm -rf /opt/linkwarden/.next/cache rm -rf /opt/linkwarden/.next/cache
msg_ok "Updated ${APP}" msg_ok "Updated ${APP}"

View File

@ -29,7 +29,7 @@ function update_script() {
exit exit
fi fi
if check_for_gh_release "scanopy" "scanopy-io/scanopy"; then if check_for_gh_release "scanopy" "scanopy/scanopy"; then
msg_info "Stopping services" msg_info "Stopping services"
systemctl stop scanopy-daemon scanopy-server systemctl stop scanopy-daemon scanopy-server
msg_ok "Stopped services" msg_ok "Stopped services"

View File

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

View File

@ -1,46 +0,0 @@
{
"name": "Pi-Hole Exporter",
"slug": "pihole-exporter",
"categories": [
9
],
"date_created": "2025-12-08",
"type": "addon",
"updateable": true,
"privileged": false,
"interface_port": 9617,
"documentation": "https://github.com/eko/pihole-exporter",
"website": "https://github.com/eko/pihole-exporter",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/pi-hole.webp",
"config_path": "/opt/pihole-exporter.env",
"description": "A Prometheus exporter for PI-Hole's Raspberry PI ad blocker",
"install_methods": [
{
"type": "default",
"script": "tools/addon/pihole-exporter.sh",
"resources": {
"cpu": null,
"ram": null,
"hdd": null,
"os": null,
"version": null
}
},
{
"type": "alpine",
"script": "tools/addon/pihole-exporter.sh",
"resources": {
"cpu": null,
"ram": null,
"hdd": null,
"os": null,
"version": null
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@ -1,8 +1,163 @@
[ [
{
"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", "name": "zabbix/zabbix",
"version": "7.0.22", "version": "7.4.6",
"date": "2025-12-17T10:10:49Z" "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.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",
"version": "v0.13.5-rc0",
"date": "2025-12-17T21:13:55Z"
},
{
"name": "fccview/jotty",
"version": "1.14.0",
"date": "2025-12-17T20:26:22Z"
},
{
"name": "emqx/emqx",
"version": "6.1.0-alpha.2",
"date": "2025-12-17T20:15:23Z"
},
{
"name": "influxdata/influxdb",
"version": "v2.8.0",
"date": "2025-12-12T20:25:00Z"
},
{
"name": "HydroshieldMKII/Guardian",
"version": "v1.3.2",
"date": "2025-12-17T19:31:10Z"
},
{
"name": "coder/code-server",
"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",
"date": "2025-12-17T18:16:59Z"
},
{
"name": "immich-app/immich",
"version": "v2.4.0",
"date": "2025-12-17T17:44:24Z"
},
{
"name": "BerriAI/litellm",
"version": "v1.80.10.rc.4",
"date": "2025-12-17T17:43:28Z"
},
{
"name": "keycloak/keycloak",
"version": "26.4.7",
"date": "2025-12-01T08:14:11Z"
},
{
"name": "semaphoreui/semaphore",
"version": "v2.16.47",
"date": "2025-12-17T15:36:28Z"
},
{
"name": "NodeBB/NodeBB",
"version": "v4.7.1",
"date": "2025-12-17T15:18:55Z"
},
{
"name": "n8n-io/n8n",
"version": "n8n@1.123.7",
"date": "2025-12-17T14:01:25Z"
},
{
"name": "bunkerity/bunkerweb",
"version": "testing",
"date": "2025-12-16T11:13:20Z"
}, },
{ {
"name": "traefik/traefik", "name": "traefik/traefik",
@ -14,21 +169,6 @@
"version": "v11.1.2", "version": "v11.1.2",
"date": "2025-12-17T09:26:24Z" "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": "bunkerity/bunkerweb",
"version": "v1.6.7-rc1",
"date": "2025-12-17T08:57:07Z"
},
{ {
"name": "zitadel/zitadel", "name": "zitadel/zitadel",
"version": "v4.7.6", "version": "v4.7.6",
@ -40,9 +180,9 @@
"date": "2025-12-17T08:48:52Z" "date": "2025-12-17T08:48:52Z"
}, },
{ {
"name": "comfyanonymous/ComfyUI", "name": "meilisearch/meilisearch",
"version": "v0.5.0", "version": "prototype-v1.30.1-rebuild-hannoy-graph.0",
"date": "2025-12-17T08:46:11Z" "date": "2025-12-17T08:38:38Z"
}, },
{ {
"name": "passbolt/passbolt_api", "name": "passbolt/passbolt_api",
@ -59,11 +199,6 @@
"version": "v11.9.0", "version": "v11.9.0",
"date": "2025-12-17T08:26:50Z" "date": "2025-12-17T08:26:50Z"
}, },
{
"name": "BerriAI/litellm",
"version": "v1.80.10.rc.3",
"date": "2025-12-17T07:48:43Z"
},
{ {
"name": "firefly-iii/firefly-iii", "name": "firefly-iii/firefly-iii",
"version": "v6.4.14", "version": "v6.4.14",
@ -74,36 +209,16 @@
"version": "v25.4", "version": "v25.4",
"date": "2025-10-09T10:27:01Z" "date": "2025-10-09T10:27:01Z"
}, },
{
"name": "Jackett/Jackett",
"version": "v0.24.468",
"date": "2025-12-17T05:55:30Z"
},
{ {
"name": "nickheyer/discopanel", "name": "nickheyer/discopanel",
"version": "v1.0.16", "version": "v1.0.16",
"date": "2025-12-17T04:47:13Z" "date": "2025-12-17T04:47:13Z"
}, },
{
"name": "metabase/metabase",
"version": "v0.58.0-beta",
"date": "2025-12-17T03:57:33Z"
},
{ {
"name": "9001/copyparty", "name": "9001/copyparty",
"version": "v1.19.23", "version": "v1.19.23",
"date": "2025-12-17T00:51:11Z" "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", "name": "esphome/esphome",
"version": "2025.12.0", "version": "2025.12.0",
@ -119,16 +234,6 @@
"version": "1.1.7", "version": "1.1.7",
"date": "2025-12-16T21:44:58Z" "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", "name": "prometheus-pve/prometheus-pve-exporter",
"version": "v3.7.0", "version": "v3.7.0",
@ -139,31 +244,16 @@
"version": "v4.4.8", "version": "v4.4.8",
"date": "2025-12-09T16:29:50Z" "date": "2025-12-09T16:29:50Z"
}, },
{
"name": "goauthentik/authentik",
"version": "version/2025.10.3",
"date": "2025-12-16T18:00:53Z"
},
{ {
"name": "crafty-controller/crafty-4", "name": "crafty-controller/crafty-4",
"version": "v4.6.2", "version": "v4.6.2",
"date": "2025-12-16T17:54:19Z" "date": "2025-12-16T17:54:19Z"
}, },
{
"name": "chrisbenincasa/tunarr",
"version": "v1.0.4",
"date": "2025-12-16T17:31:11Z"
},
{ {
"name": "fuma-nama/fumadocs", "name": "fuma-nama/fumadocs",
"version": "fumadocs-mdx@14.1.1", "version": "fumadocs-mdx@14.1.1",
"date": "2025-12-16T15:32:59Z" "date": "2025-12-16T15:32:59Z"
}, },
{
"name": "meilisearch/meilisearch",
"version": "prototype-v1.30.0-support-aws-irsa.2",
"date": "2025-12-16T14:35:14Z"
},
{ {
"name": "jenkinsci/jenkins", "name": "jenkinsci/jenkins",
"version": "jenkins-2.542", "version": "jenkins-2.542",
@ -184,11 +274,6 @@
"version": "v4.36.2", "version": "v4.36.2",
"date": "2025-12-03T22:46:29Z" "date": "2025-12-03T22:46:29Z"
}, },
{
"name": "n8n-io/n8n",
"version": "n8n@1.123.6",
"date": "2025-12-15T14:22:59Z"
},
{ {
"name": "sabnzbd/sabnzbd", "name": "sabnzbd/sabnzbd",
"version": "4.5.5", "version": "4.5.5",
@ -199,26 +284,11 @@
"version": "v1.5.3", "version": "v1.5.3",
"date": "2025-09-20T12:12:33Z" "date": "2025-09-20T12:12:33Z"
}, },
{
"name": "ollama/ollama",
"version": "v0.13.4-rc2",
"date": "2025-12-16T02:57:20Z"
},
{ {
"name": "Stirling-Tools/Stirling-PDF", "name": "Stirling-Tools/Stirling-PDF",
"version": "v2.1.4", "version": "v2.1.4",
"date": "2025-12-16T00:02:18Z" "date": "2025-12-16T00:02:18Z"
}, },
{
"name": "scanopy/scanopy",
"version": "v0.12.1",
"date": "2025-12-15T22:21:36Z"
},
{
"name": "semaphoreui/semaphore",
"version": "v2.16.46",
"date": "2025-12-15T22:07:08Z"
},
{ {
"name": "azukaar/Cosmos-Server", "name": "azukaar/Cosmos-Server",
"version": "v0.19.0", "version": "v0.19.0",
@ -404,11 +474,6 @@
"version": "cli/v0.29.1", "version": "cli/v0.29.1",
"date": "2025-12-13T13:55:51Z" "date": "2025-12-13T13:55:51Z"
}, },
{
"name": "chrisvel/tududi",
"version": "v0.88.0",
"date": "2025-12-13T09:36:24Z"
},
{ {
"name": "Dokploy/dokploy", "name": "Dokploy/dokploy",
"version": "v0.26.2", "version": "v0.26.2",
@ -424,21 +489,11 @@
"version": "v2.20.2", "version": "v2.20.2",
"date": "2025-12-12T23:47:48Z" "date": "2025-12-12T23:47:48Z"
}, },
{
"name": "fccview/jotty",
"version": "1.13.1",
"date": "2025-12-12T21:34:22Z"
},
{ {
"name": "mongodb/mongo", "name": "mongodb/mongo",
"version": "r7.0.27", "version": "r7.0.27",
"date": "2025-12-12T20:54:32Z" "date": "2025-12-12T20:54:32Z"
}, },
{
"name": "influxdata/influxdb",
"version": "v2.8.0",
"date": "2025-12-12T20:25:00Z"
},
{ {
"name": "homarr-labs/homarr", "name": "homarr-labs/homarr",
"version": "v1.46.0", "version": "v1.46.0",
@ -459,11 +514,6 @@
"version": "4.1.2", "version": "4.1.2",
"date": "2025-12-03T16:12:05Z" "date": "2025-12-03T16:12:05Z"
}, },
{
"name": "openobserve/openobserve",
"version": "v0.30.0",
"date": "2025-12-12T14:03:52Z"
},
{ {
"name": "ventoy/Ventoy", "name": "ventoy/Ventoy",
"version": "v1.1.09", "version": "v1.1.09",
@ -484,11 +534,6 @@
"version": "v8.3.7", "version": "v8.3.7",
"date": "2025-12-12T09:13:40Z" "date": "2025-12-12T09:13:40Z"
}, },
{
"name": "coder/code-server",
"version": "v4.106.3",
"date": "2025-12-01T22:06:12Z"
},
{ {
"name": "theonedev/onedev", "name": "theonedev/onedev",
"version": "v13.1.5", "version": "v13.1.5",
@ -704,11 +749,6 @@
"version": "v3.3.0", "version": "v3.3.0",
"date": "2025-12-06T06:18:23Z" "date": "2025-12-06T06:18:23Z"
}, },
{
"name": "HydroshieldMKII/Guardian",
"version": "v1.3.1",
"date": "2025-12-05T19:12:48Z"
},
{ {
"name": "community-scripts/ProxmoxVE-Local", "name": "community-scripts/ProxmoxVE-Local",
"version": "v0.5.2", "version": "v0.5.2",
@ -719,11 +759,6 @@
"version": "flowise@3.0.12", "version": "flowise@3.0.12",
"date": "2025-12-05T15:02:01Z" "date": "2025-12-05T15:02:01Z"
}, },
{
"name": "emqx/emqx",
"version": "e6.1.0-streams.1",
"date": "2025-12-05T12:27:36Z"
},
{ {
"name": "transmission/transmission", "name": "transmission/transmission",
"version": "4.0.1-beta.1", "version": "4.0.1-beta.1",
@ -799,16 +834,6 @@
"version": "v6.2.4", "version": "v6.2.4",
"date": "2025-12-02T17:47:52Z" "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", "name": "syncthing/syncthing",
"version": "v2.0.12", "version": "v2.0.12",
@ -849,11 +874,6 @@
"version": "v2.4.7", "version": "v2.4.7",
"date": "2025-11-30T20:59:51Z" "date": "2025-11-30T20:59:51Z"
}, },
{
"name": "juanfont/headscale",
"version": "v0.27.1",
"date": "2025-11-11T19:32:29Z"
},
{ {
"name": "hargata/lubelog", "name": "hargata/lubelog",
"version": "v1.5.5", "version": "v1.5.5",
@ -879,11 +899,6 @@
"version": "v25.9.0", "version": "v25.9.0",
"date": "2025-11-29T16:37:28Z" "date": "2025-11-29T16:37:28Z"
}, },
{
"name": "Kozea/Radicale",
"version": "v3.5.9",
"date": "2025-11-29T14:35:45Z"
},
{ {
"name": "authelia/authelia", "name": "authelia/authelia",
"version": "v4.39.15", "version": "v4.39.15",
@ -934,11 +949,6 @@
"version": "v0.9.101", "version": "v0.9.101",
"date": "2025-11-26T17:14:35Z" "date": "2025-11-26T17:14:35Z"
}, },
{
"name": "NodeBB/NodeBB",
"version": "v4.7.0",
"date": "2025-11-26T16:59:45Z"
},
{ {
"name": "NLnetLabs/unbound", "name": "NLnetLabs/unbound",
"version": "release-1.24.2", "version": "release-1.24.2",
@ -1039,11 +1049,6 @@
"version": "5.12.0", "version": "5.12.0",
"date": "2025-11-20T06:18:58Z" "date": "2025-11-20T06:18:58Z"
}, },
{
"name": "immich-app/immich",
"version": "v2.3.1",
"date": "2025-11-20T03:10:27Z"
},
{ {
"name": "nextcloud/nextcloudpi", "name": "nextcloud/nextcloudpi",
"version": "v1.56.0", "version": "v1.56.0",
@ -1179,11 +1184,6 @@
"version": "v0.9.1", "version": "v0.9.1",
"date": "2025-11-06T02:26:53Z" "date": "2025-11-06T02:26:53Z"
}, },
{
"name": "javedh-dev/tracktor",
"version": "0.5.1",
"date": "2025-11-05T16:14:37Z"
},
{ {
"name": "getumbrel/umbrel", "name": "getumbrel/umbrel",
"version": "1.5.0", "version": "1.5.0",

View File

@ -62,7 +62,7 @@ EOF
$STD yarn prisma:generate $STD yarn prisma:generate
$STD yarn web:build $STD yarn web:build
$STD yarn prisma:deploy $STD yarn prisma:deploy
rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache ~/.rustup rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache
rm -rf /root/.cache/yarn rm -rf /root/.cache/yarn
rm -rf /opt/linkwarden/.next/cache rm -rf /opt/linkwarden/.next/cache
msg_ok "Installed Linkwarden" msg_ok "Installed Linkwarden"

View File

@ -31,9 +31,17 @@ esac
msg_info "Installing Zabbix $ZABBIX_VERSION" msg_info "Installing Zabbix $ZABBIX_VERSION"
cd /tmp 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 if [[ "$ZABBIX_VERSION" == "7.0" ]]; then
$STD dpkg -i /tmp/zabbix-release_latest+debian13_all.deb 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 update
$STD apt install -y zabbix-server-pgsql zabbix-frontend-php php8.4-pgsql zabbix-apache-conf zabbix-sql-scripts $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 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 restart zabbix-server apache2
systemctl enable -q --now zabbix-server $AGENT_SERVICE 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" msg_ok "Started Services"
motd_ssh motd_ssh

View File

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

View File

@ -334,9 +334,9 @@ remove_old_tool_version() {
$STD apt purge -y nodejs npm >/dev/null 2>&1 || true $STD apt purge -y nodejs npm >/dev/null 2>&1 || true
# Clean up npm global modules # Clean up npm global modules
if command -v npm >/dev/null 2>&1; then 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 npm uninstall -g "$module" >/dev/null 2>&1 || true
done done || true
fi fi
cleanup_legacy_install "nodejs" cleanup_legacy_install "nodejs"
cleanup_tool_keyrings "nodesource" cleanup_tool_keyrings "nodesource"
@ -1167,7 +1167,7 @@ cleanup_orphaned_sources() {
# Extract Signed-By path from .sources file # Extract Signed-By path from .sources file
local keyring_path 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 keyring doesn't exist, remove the .sources file
if [[ -n "$keyring_path" ]] && [[ ! -f "$keyring_path" ]]; then if [[ -n "$keyring_path" ]] && [[ ! -f "$keyring_path" ]]; then
@ -2073,7 +2073,7 @@ function setup_adminer() {
return 1 return 1
} }
local VERSION 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}" cache_installed_version "adminer" "${VERSION:-unknown}"
msg_ok "Setup Adminer (Debian/Ubuntu)" msg_ok "Setup Adminer (Debian/Ubuntu)"
fi fi
@ -2591,7 +2591,7 @@ function setup_hwaccel() {
# Detect CPU vendor (relevant for AMD APUs) # Detect CPU vendor (relevant for AMD APUs)
local cpu_vendor 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 if [[ -z "$gpu_vendor" && -z "$cpu_vendor" ]]; then
msg_warn "No GPU or CPU vendor detected - skipping hardware acceleration setup" 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 # Check if the module is already installed
if $STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep -q "$MODULE_NAME@"; then 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 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" 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 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 # Get available PHP version from repository
local AVAILABLE_PHP_VERSION="" 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 if [[ -z "$AVAILABLE_PHP_VERSION" ]]; then
msg_error "PHP ${PHP_VERSION} not found in configured repositories" msg_error "PHP ${PHP_VERSION} not found in configured repositories"
@ -4620,7 +4620,7 @@ function setup_rust() {
# Check if already installed # Check if already installed
if echo "$CRATE_LIST" | grep -q "^${NAME} "; then 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 if [[ -n "$VER" && "$VER" != "$INSTALLED_VER" ]]; then
msg_info "Upgrading $NAME from v$INSTALLED_VER to v$VER" msg_info "Upgrading $NAME from v$INSTALLED_VER to v$VER"
@ -4635,7 +4635,7 @@ function setup_rust() {
msg_error "Failed to upgrade $NAME" msg_error "Failed to upgrade $NAME"
return 1 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" msg_ok "Upgraded $NAME to v$NEW_VER"
else else
msg_ok "$NAME v$INSTALLED_VER already installed" msg_ok "$NAME v$INSTALLED_VER already installed"
@ -4653,7 +4653,7 @@ function setup_rust() {
msg_error "Failed to install $NAME" msg_error "Failed to install $NAME"
return 1 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" msg_ok "Installed $NAME v$NEW_VER"
fi fi
fi fi
@ -4975,7 +4975,7 @@ function setup_docker() {
# Install or upgrade Docker # Install or upgrade Docker
if [ "$docker_installed" = true ]; then if [ "$docker_installed" = true ]; then
msg_info "Checking for Docker updates" 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 if [ "$DOCKER_CURRENT_VERSION" != "$DOCKER_LATEST_VERSION" ]; then
msg_info "Updating Docker $DOCKER_CURRENT_VERSION$DOCKER_LATEST_VERSION" msg_info "Updating Docker $DOCKER_CURRENT_VERSION$DOCKER_LATEST_VERSION"

View File

@ -1,249 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/eko/pihole-exporter/
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func)
# Enable error handling
set -Eeuo pipefail
trap 'error_handler' ERR
load_functions
# ==============================================================================
# CONFIGURATION
# ==============================================================================
VERBOSE=${var_verbose:-no}
APP="pihole-exporter"
APP_TYPE="tools"
INSTALL_PATH="/opt/pihole-exporter"
CONFIG_PATH="/opt/pihole-exporter.env"
header_info
ensure_usr_local_bin_persist
get_current_ip &>/dev/null
# ==============================================================================
# OS DETECTION
# ==============================================================================
if [[ -f "/etc/alpine-release" ]]; then
OS="Alpine"
SERVICE_PATH="/etc/init.d/pihole-exporter"
elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then
OS="Debian"
SERVICE_PATH="/etc/systemd/system/pihole-exporter.service"
else
echo -e "${CROSS} Unsupported OS detected. Exiting."
exit 1
fi
# ==============================================================================
# UNINSTALL
# ==============================================================================
function uninstall() {
msg_info "Uninstalling Pihole-Exporter"
if [[ "$OS" == "Alpine" ]]; then
rc-service pihole-exporter stop &>/dev/null
rc-update del pihole-exporter &>/dev/null
rm -f "$SERVICE_PATH"
else
systemctl disable -q --now pihole-exporter
rm -f "$SERVICE_PATH"
fi
rm -rf "$INSTALL_PATH" "$CONFIG_PATH"
rm -f "/usr/local/bin/update_pihole-exporter"
rm -f "$HOME/.pihole-exporter"
msg_ok "Pihole-Exporter has been uninstalled"
}
# ==============================================================================
# UPDATE
# ==============================================================================
function update() {
if check_for_gh_release "pihole-exporter" "eko/pihole-exporter"; then
msg_info "Stopping service"
if [[ "$OS" == "Alpine" ]]; then
rc-service pihole-exporter stop &>/dev/null
else
systemctl stop pihole-exporter
fi
msg_ok "Stopped service"
fetch_and_deploy_gh_release "pihole-exporter" "eko/pihole-exporter" "tarball" "latest"
setup_go
msg_info "Building Pihole-Exporter"
cd /opt/pihole-exporter/
$STD /usr/local/bin/go build -o ./pihole-exporter
msg_ok "Built Pihole-Exporter"
msg_info "Starting service"
if [[ "$OS" == "Alpine" ]]; then
rc-service pihole-exporter start &>/dev/null
else
systemctl start pihole-exporter
fi
msg_ok "Started service"
msg_ok "Updated successfully"
exit
fi
}
# ==============================================================================
# INSTALL
# ==============================================================================
function install() {
read -erp "Enter the protocol to use (http/https), default https: " pihole_PROTOCOL
read -erp "Enter the hostname of Pihole, example: (127.0.0.1): " pihole_HOSTNAME
read -erp "Enter the port of Pihole, default 443: " pihole_PORT
read -rsp "Enter Pihole password: " pihole_PASSWORD
printf "\n"
read -erp "Do you want to skip TLS-Verification (if using a self-signed Certificate on Pi-Hole) [y/N]: " SKIP_TLS
if [[ "${SKIP_TLS,,}" =~ ^(y|yes)$ ]]; then
pihole_SKIP_TLS="true"
fi
fetch_and_deploy_gh_release "pihole-exporter" "eko/pihole-exporter" "tarball" "latest"
setup_go
msg_info "Building Pihole-Exporter on ${OS}"
cd /opt/pihole-exporter/
$STD /usr/local/bin/go build -o ./pihole-exporter
msg_ok "Built Pihole-Exporter"
msg_info "Creating configuration"
cat <<EOF >"$CONFIG_PATH"
# https://github.com/eko/pihole-exporter/?tab=readme-ov-file#available-cli-options
PIHOLE_PASSWORD="${pihole_PASSWORD}"
PIHOLE_HOSTNAME="${pihole_HOSTNAME:-127.0.0.1}"
PIHOLE_PORT="${pihole_PORT:-443}"
SKIP_TLS_VERIFICATION="${pihole_SKIP_TLS:-false}"
PIHOLE_PROTOCOL="${pihole_PROTOCOL:-https}"
EOF
msg_ok "Created configuration"
msg_info "Creating service"
if [[ "$OS" == "Debian" ]]; then
cat <<EOF >"$SERVICE_PATH"
[Unit]
Description=pihole-exporter
After=network.target
[Service]
User=root
WorkingDirectory=/opt/pihole-exporter
EnvironmentFile=$CONFIG_PATH
ExecStart=/opt/pihole-exporter/pihole-exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable -q --now pihole-exporter
else
cat <<EOF >"$SERVICE_PATH"
#!/sbin/openrc-run
name="pihole-exporter"
description="Pi-hole Exporter for Prometheus"
command="${INSTALL_PATH}/pihole-exporter"
command_background=true
directory="/opt/pihole-exporter"
pidfile="/run/\${RC_SVCNAME}.pid"
output_log="/var/log/pihole-exporter.log"
error_log="/var/log/pihole-exporter.log"
depend() {
need net
after firewall
}
start_pre() {
if [ -f "$CONFIG_PATH" ]; then
export \$(grep -v '^#' $CONFIG_PATH | xargs)
fi
}
EOF
chmod +x "$SERVICE_PATH"
$STD rc-update add pihole-exporter default
$STD rc-service pihole-exporter start
fi
msg_ok "Created and started service"
# Create update script
msg_info "Creating update script"
ensure_usr_local_bin_persist
cat <<'UPDATEEOF' >/usr/local/bin/update_pihole-exporter
#!/usr/bin/env bash
# pihole-exporter Update Script
type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/pihole-exporter.sh)"
UPDATEEOF
chmod +x /usr/local/bin/update_pihole-exporter
msg_ok "Created update script (/usr/local/bin/update_pihole-exporter)"
echo ""
msg_ok "Pihole-Exporter installed successfully"
msg_ok "Metrics: ${BL}http://${CURRENT_IP}:9617/metrics${CL}"
msg_ok "Config: ${BL}${CONFIG_PATH}${CL}"
}
# ==============================================================================
# MAIN
# ==============================================================================
header_info
ensure_usr_local_bin_persist
get_current_ip &>/dev/null
# Handle type=update (called from update script)
if [[ "${type:-}" == "update" ]]; then
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/pihole-exporter" ]]; then
update
else
msg_error "Pihole-Exporter is not installed. Nothing to update."
exit 1
fi
exit 0
fi
# Check if already installed
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/pihole-exporter" ]]; then
msg_warn "Pihole-Exporter is already installed."
echo ""
echo -n "${TAB}Uninstall Pihole-Exporter? (y/N): "
read -r uninstall_prompt
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
uninstall
exit 0
fi
echo -n "${TAB}Update Pihole-Exporter? (y/N): "
read -r update_prompt
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
update
exit 0
fi
msg_warn "No action selected. Exiting."
exit 0
fi
# Fresh installation
msg_warn "Pihole-Exporter is not installed."
echo ""
echo -e "${TAB}${INFO} This will install:"
echo -e "${TAB} - Pi-hole Exporter (Go binary)"
echo -e "${TAB} - Systemd/OpenRC service"
echo ""
echo -n "${TAB}Install Pihole-Exporter? (y/N): "
read -r install_prompt
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
install
else
msg_warn "Installation cancelled. Exiting."
exit 0
fi