Compare commits

..

3 Commits

Author SHA1 Message Date
ab839fba07 Aktualisieren von pihole-exporter.sh 2025-12-18 22:09:58 +01:00
def4e550b8 Aktualisieren von pihole-exporter.sh 2025-12-18 17:11:22 +01:00
9d55327901 Add pihole-exporter (addon) 2025-12-17 20:41:04 +00:00
22 changed files with 409 additions and 484 deletions

View File

@ -10,51 +10,6 @@
> [!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-19
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- InfluxDB: Fix update function [@Liganic](https://github.com/Liganic) ([#10151](https://github.com/community-scripts/ProxmoxVE/pull/10151))
- #### 🔧 Refactor
- Refactor: Proxmox-Mail-Gateway [@tremor021](https://github.com/tremor021) ([#10070](https://github.com/community-scripts/ProxmoxVE/pull/10070))
### ❔ Uncategorized
- Update paymenter.json(#10133) [@DragoQC](https://github.com/DragoQC) ([#10134](https://github.com/community-scripts/ProxmoxVE/pull/10134))
## 2025-12-18
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- [HOTFIX] Fix Scanopy release check [@vhsdream](https://github.com/vhsdream) ([#10097](https://github.com/community-scripts/ProxmoxVE/pull/10097))
- 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))
- #### ✨ New Features
- bump pihole to debian 13 [@mschabhuettl](https://github.com/mschabhuettl) ([#10118](https://github.com/community-scripts/ProxmoxVE/pull/10118))
- Immich: v2.4.0 [@vhsdream](https://github.com/vhsdream) ([#10095](https://github.com/community-scripts/ProxmoxVE/pull/10095))
### 💾 Core
- #### 🔧 Refactor
- tools.func: hardening/Improve error handling and cleanup in shell functions [@MickLesk](https://github.com/MickLesk) ([#10116](https://github.com/community-scripts/ProxmoxVE/pull/10116))
### 🧰 Tools
- qbittorrent-exporter ([#10090](https://github.com/community-scripts/ProxmoxVE/pull/10090))
- #### 🐞 Bug Fixes
- Improved error handling when a command does not exist [@wolle604](https://github.com/wolle604) ([#10089](https://github.com/community-scripts/ProxmoxVE/pull/10089))
## 2025-12-17 ## 2025-12-17
### 🚀 Updated Scripts ### 🚀 Updated Scripts

View File

@ -74,28 +74,23 @@ EOF
STAGING_DIR=/opt/staging STAGING_DIR=/opt/staging
BASE_DIR=${STAGING_DIR}/base-images BASE_DIR=${STAGING_DIR}/base-images
SOURCE_DIR=${STAGING_DIR}/image-source SOURCE_DIR=${STAGING_DIR}/image-source
cd /tmp cd /root
if [[ -f ~/.intel_version ]]; then if [[ -f ~/.intel_version ]]; then
curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile curl -fsSLO https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/machine-learning/Dockerfile
readarray -t INTEL_URLS < <( readarray -t INTEL_URLS < <(sed -n "/intel/p" ./Dockerfile | awk '{print $3}')
sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}' INTEL_RELEASE="$(grep "intel-opencl-icd" ./Dockerfile | awk -F '_' '{print $2}')"
sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}'
)
INTEL_RELEASE="$(grep "intel-opencl-icd_" ./Dockerfile | awk -F '_' '{print $2}')"
if [[ "$INTEL_RELEASE" != "$(cat ~/.intel_version)" ]]; then if [[ "$INTEL_RELEASE" != "$(cat ~/.intel_version)" ]]; then
msg_info "Updating Intel iGPU dependencies" msg_info "Updating Intel iGPU dependencies"
for url in "${INTEL_URLS[@]}"; do for url in "${INTEL_URLS[@]}"; do
curl -fsSLO "$url" curl -fsSLO "$url"
done done
$STD apt-mark unhold libigdgmm12 $STD apt-mark unhold libigdgmm12
$STD apt install -y ./libigdgmm12*.deb
rm ./libigdgmm12*.deb
$STD apt install -y ./*.deb $STD apt install -y ./*.deb
rm ./*.deb rm ./*.deb
$STD apt-mark hold libigdgmm12 $STD apt-mark hold libigdgmm12
msg_ok "Intel iGPU dependencies updated" msg_ok "Intel iGPU dependencies updated"
fi fi
rm ./Dockerfile rm ~/Dockerfile
fi fi
if [[ -f ~/.immich_library_revisions ]]; then if [[ -f ~/.immich_library_revisions ]]; then
libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips") libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips")
@ -108,7 +103,7 @@ EOF
msg_ok "Image-processing libraries up to date" msg_ok "Image-processing libraries up to date"
fi fi
RELEASE="2.4.0" RELEASE="2.3.1"
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
msg_info "Stopping Services" msg_info "Stopping Services"
systemctl stop immich-web systemctl stop immich-web

View File

@ -23,7 +23,7 @@ function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -f /usr/bin/influxd ]]; then if [[ ! -f /etc/apt/sources.list.d/influxdata.list ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi

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 rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache ~/.rustup
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

@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}" var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}" var_disk="${var_disk:-2}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-13}" var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"

View File

@ -27,11 +27,10 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
msg_info "Updating ${APP}"
msg_info "Updating Proxmox-Mail-Gateway"
$STD apt update $STD apt update
$STD apt upgrade -y $STD apt -y upgrade
msg_ok "Updated Proxmox-Mail-Gateway" msg_ok "Updated ${APP}"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
exit exit
} }

View File

@ -29,7 +29,7 @@ function update_script() {
exit exit
fi fi
if check_for_gh_release "scanopy" "scanopy/scanopy"; then if check_for_gh_release "scanopy" "scanopy-io/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,18 +67,10 @@ 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"
if [[ "$ZABBIX_VERSION" == "7.0" ]]; then curl -fsSL "$ZABBIX_DEB_URL" -o /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" $STD dpkg -i zabbix-release_latest+debian13_all.deb
ZABBIX_DEB_FILE="zabbix-release_latest_${ZABBIX_VERSION}+debian13_all.deb" rm -rf /tmp/zabbix-release_latest+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

@ -11,7 +11,7 @@
"interface_port": 80, "interface_port": 80,
"documentation": "https://paymenter.org/docs", "documentation": "https://paymenter.org/docs",
"website": "https://paymenter.org/", "website": "https://paymenter.org/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/paymenter.webp", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/paymeter.webp",
"config_path": "/opt/paymenter/.env", "config_path": "/opt/paymenter/.env",
"description": "Paymenter is an open source webshop solution for hosting companies. It's developed to provide an more easy way to manage your hosting company.", "description": "Paymenter is an open source webshop solution for hosting companies. It's developed to provide an more easy way to manage your hosting company.",
"install_methods": [ "install_methods": [

View File

@ -0,0 +1,46 @@
{
"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

@ -23,7 +23,7 @@
"ram": 512, "ram": 512,
"hdd": 2, "hdd": 2,
"os": "debian", "os": "debian",
"version": "13" "version": "12"
} }
} }
], ],

View File

@ -1,46 +0,0 @@
{
"name": "qbittorrent Exporter",
"slug": "qbittorrent-exporter",
"categories": [
9
],
"date_created": "2025-12-18",
"type": "addon",
"updateable": true,
"privileged": false,
"interface_port": 8090,
"documentation": "https://github.com/martabal/qbittorrent-exporter",
"website": "https://github.com/martabal/qbittorrent-exporter",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/qbittorrent.webp",
"config_path": "/opt/qbittorrent-exporter.env",
"description": "A fast and lightweight prometheus exporter for qBittorrent ",
"install_methods": [
{
"type": "default",
"script": "tools/addon/qbittorrent-exporter.sh",
"resources": {
"cpu": null,
"ram": null,
"hdd": null,
"os": null,
"version": null
}
},
{
"type": "alpine",
"script": "tools/addon/qbittorrent-exporter.sh",
"resources": {
"cpu": null,
"ram": null,
"hdd": null,
"os": null,
"version": null
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@ -1,258 +1,33 @@
[ [
{ {
"name": "forgejo/forgejo", "name": "zabbix/zabbix",
"version": "v15.0.0-dev", "version": "7.0.22",
"date": "2025-12-19T11:43:47Z" "date": "2025-12-17T10:10:49Z"
}, },
{ {
"name": "fccview/jotty", "name": "traefik/traefik",
"version": "1.14.2", "version": "v2.11.33",
"date": "2025-12-19T11:25:29Z" "date": "2025-12-17T10:10:19Z"
},
{
"name": "readeck/readeck",
"version": "0.21.5",
"date": "2025-12-19T11:22:20Z"
},
{
"name": "release-argus/Argus",
"version": "0.28.3",
"date": "2025-12-19T11:05:10Z"
},
{
"name": "wazuh/wazuh",
"version": "coverity-w51-4.14.2",
"date": "2025-12-15T12:34:36Z"
},
{
"name": "TuroYT/snowshare",
"version": "v1.2.5",
"date": "2025-12-19T10:47:19Z"
}, },
{ {
"name": "mattermost/mattermost", "name": "mattermost/mattermost",
"version": "v11.1.2", "version": "v11.1.2",
"date": "2025-12-17T09:26:24Z" "date": "2025-12-17T09:26:24Z"
}, },
{
"name": "morpheus65535/bazarr",
"version": "v1.5.3",
"date": "2025-09-20T12:12:33Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.24.487",
"date": "2025-12-19T05:55:55Z"
},
{
"name": "jhuckaby/Cronicle",
"version": "v0.9.102",
"date": "2025-12-19T03:45:13Z"
},
{
"name": "BerriAI/litellm",
"version": "v1.80.10.rc.5",
"date": "2025-12-19T03:38:23Z"
},
{
"name": "javedh-dev/tracktor",
"version": "1.0.1",
"date": "2025-12-17T23:14:39Z"
},
{
"name": "mealie-recipes/mealie",
"version": "v3.8.0",
"date": "2025-12-19T01:37:16Z"
},
{
"name": "jeedom/core",
"version": "4.5.1",
"date": "2025-12-19T00:27:05Z"
},
{
"name": "steveiliop56/tinyauth",
"version": "v4.1.0",
"date": "2025-11-23T12:13:34Z"
},
{
"name": "moghtech/komodo",
"version": "v1.19.5",
"date": "2025-09-27T20:59:46Z"
},
{
"name": "metabase/metabase",
"version": "v0.57.x",
"date": "2025-12-18T22:02:32Z"
},
{
"name": "chrisbenincasa/tunarr",
"version": "v1.0.7",
"date": "2025-12-18T21:27:26Z"
},
{
"name": "Stirling-Tools/Stirling-PDF",
"version": "v2.1.5",
"date": "2025-12-18T20:48:01Z"
},
{
"name": "scanopy/scanopy",
"version": "v0.12.4",
"date": "2025-12-18T19:25:47Z"
},
{
"name": "rcourtman/Pulse",
"version": "v4.36.2",
"date": "2025-12-03T22:46:29Z"
},
{
"name": "saltstack/salt",
"version": "v3007.10",
"date": "2025-12-18T18:14:16Z"
},
{
"name": "go-gitea/gitea",
"version": "v1.25.3",
"date": "2025-12-18T18:11:48Z"
},
{
"name": "karlomikus/bar-assistant",
"version": "v5.11.0",
"date": "2025-12-18T18:06:05Z"
},
{
"name": "msgbyte/tianji",
"version": "v1.30.23",
"date": "2025-12-18T16:55:01Z"
},
{
"name": "YunoHost/yunohost",
"version": "debian/12.1.37",
"date": "2025-12-18T16:43:23Z"
},
{
"name": "ollama/ollama",
"version": "v0.13.5",
"date": "2025-12-18T16:39:08Z"
},
{
"name": "meilisearch/meilisearch",
"version": "latest",
"date": "2025-12-18T16:38:45Z"
},
{
"name": "keycloak/keycloak",
"version": "26.4.7",
"date": "2025-12-01T08:14:11Z"
},
{
"name": "paperless-ngx/paperless-ngx",
"version": "v2.20.3",
"date": "2025-12-18T16:10:13Z"
},
{
"name": "n8n-io/n8n",
"version": "n8n@1.123.7",
"date": "2025-12-17T14:01:25Z"
},
{
"name": "immich-app/immich",
"version": "v2.4.0",
"date": "2025-12-18T14:51:33Z"
},
{
"name": "docker/compose",
"version": "v5.0.1",
"date": "2025-12-18T14:22:38Z"
},
{ {
"name": "coollabsio/coolify", "name": "coollabsio/coolify",
"version": "v4.0.0-beta.458", "version": "v4.0.0-beta.455",
"date": "2025-12-18T12:23:23Z" "date": "2025-12-17T09:24:10Z"
}, },
{ {
"name": "juanfont/headscale", "name": "TuroYT/snowshare",
"version": "v0.27.1", "version": "v1.2.2",
"date": "2025-11-11T19:32:29Z" "date": "2025-12-17T09:07:12Z"
},
{
"name": "tailscale/tailscale",
"version": "v1.92.4",
"date": "2025-12-18T10:32:44Z"
},
{
"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": "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": "openobserve/openobserve",
"version": "v0.30.1",
"date": "2025-12-18T02:41:34Z"
},
{
"name": "goauthentik/authentik",
"version": "version/2025.10.3",
"date": "2025-12-16T18:00:53Z"
},
{
"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": "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": "bunkerity/bunkerweb", "name": "bunkerity/bunkerweb",
"version": "testing", "version": "v1.6.7-rc1",
"date": "2025-12-16T11:13:20Z" "date": "2025-12-17T08:57:07Z"
},
{
"name": "traefik/traefik",
"version": "v2.11.33",
"date": "2025-12-17T10:10:19Z"
}, },
{ {
"name": "zitadel/zitadel", "name": "zitadel/zitadel",
@ -264,6 +39,11 @@
"version": "v0.105.1", "version": "v0.105.1",
"date": "2025-12-17T08:48:52Z" "date": "2025-12-17T08:48:52Z"
}, },
{
"name": "comfyanonymous/ComfyUI",
"version": "v0.5.0",
"date": "2025-12-17T08:46:11Z"
},
{ {
"name": "passbolt/passbolt_api", "name": "passbolt/passbolt_api",
"version": "v5.8.0-test.3", "version": "v5.8.0-test.3",
@ -279,6 +59,11 @@
"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",
@ -289,16 +74,36 @@
"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",
@ -314,6 +119,16 @@
"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",
@ -324,31 +139,86 @@
"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",
"date": "2025-12-16T13:49:44Z" "date": "2025-12-16T13:49:44Z"
}, },
{
"name": "release-argus/Argus",
"version": "0.28.2",
"date": "2025-12-16T12:36:26Z"
},
{ {
"name": "prometheus/prometheus", "name": "prometheus/prometheus",
"version": "v3.8.1", "version": "v3.8.1",
"date": "2025-12-16T09:59:22Z" "date": "2025-12-16T09:59:22Z"
}, },
{
"name": "rcourtman/Pulse",
"version": "v4.36.2",
"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",
"date": "2025-10-24T11:12:22Z" "date": "2025-10-24T11:12:22Z"
}, },
{
"name": "morpheus65535/bazarr",
"version": "v1.5.3",
"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",
"version": "v2.1.4",
"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",
@ -394,6 +264,11 @@
"version": "v0.16.3", "version": "v0.16.3",
"date": "2025-12-15T12:56:50Z" "date": "2025-12-15T12:56:50Z"
}, },
{
"name": "wazuh/wazuh",
"version": "coverity-w51-4.14.2",
"date": "2025-12-15T12:34:36Z"
},
{ {
"name": "LimeSurvey/LimeSurvey", "name": "LimeSurvey/LimeSurvey",
"version": "6.16.2+251209", "version": "6.16.2+251209",
@ -489,6 +364,11 @@
"version": "v4.4.0", "version": "v4.4.0",
"date": "2025-12-13T22:49:07Z" "date": "2025-12-13T22:49:07Z"
}, },
{
"name": "karlomikus/bar-assistant",
"version": "v5.10.0",
"date": "2025-12-13T20:17:27Z"
},
{ {
"name": "fosrl/pangolin", "name": "fosrl/pangolin",
"version": "1.13.1", "version": "1.13.1",
@ -524,16 +404,41 @@
"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",
"date": "2025-12-13T07:48:09Z" "date": "2025-12-13T07:48:09Z"
}, },
{
"name": "mealie-recipes/mealie",
"version": "v3.7.0",
"date": "2025-12-13T01:20:58Z"
},
{
"name": "paperless-ngx/paperless-ngx",
"version": "v2.20.2",
"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",
@ -554,6 +459,11 @@
"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",
@ -574,6 +484,11 @@
"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",
@ -589,6 +504,11 @@
"version": "0.43.1", "version": "0.43.1",
"date": "2025-12-11T22:45:52Z" "date": "2025-12-11T22:45:52Z"
}, },
{
"name": "msgbyte/tianji",
"version": "v1.30.22",
"date": "2025-12-11T18:02:06Z"
},
{ {
"name": "pommee/goaway", "name": "pommee/goaway",
"version": "v0.62.24", "version": "v0.62.24",
@ -599,6 +519,11 @@
"version": "v2.13.2", "version": "v2.13.2",
"date": "2025-12-11T06:31:24Z" "date": "2025-12-11T06:31:24Z"
}, },
{
"name": "moghtech/komodo",
"version": "v1.19.5",
"date": "2025-09-27T20:59:46Z"
},
{ {
"name": "TwiN/gatus", "name": "TwiN/gatus",
"version": "v5.33.1", "version": "v5.33.1",
@ -659,6 +584,11 @@
"version": "v1.144.0", "version": "v1.144.0",
"date": "2025-12-09T16:29:00Z" "date": "2025-12-09T16:29:00Z"
}, },
{
"name": "readeck/readeck",
"version": "0.21.4",
"date": "2025-12-09T15:25:28Z"
},
{ {
"name": "gelbphoenix/autocaliweb", "name": "gelbphoenix/autocaliweb",
"version": "v0.11.3", "version": "v0.11.3",
@ -754,6 +684,11 @@
"version": "v0.28.0", "version": "v0.28.0",
"date": "2025-12-06T13:32:18Z" "date": "2025-12-06T13:32:18Z"
}, },
{
"name": "YunoHost/yunohost",
"version": "debian/13.0.2",
"date": "2025-12-06T10:46:12Z"
},
{ {
"name": "toniebox-reverse-engineering/teddycloud", "name": "toniebox-reverse-engineering/teddycloud",
"version": "tc_v0.6.5", "version": "tc_v0.6.5",
@ -769,6 +704,11 @@
"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",
@ -779,6 +719,11 @@
"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",
@ -854,6 +799,16 @@
"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",
@ -894,6 +849,11 @@
"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",
@ -919,6 +879,11 @@
"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",
@ -964,6 +929,16 @@
"version": "v1.7.8", "version": "v1.7.8",
"date": "2025-11-26T22:35:03Z" "date": "2025-11-26T22:35:03Z"
}, },
{
"name": "jhuckaby/Cronicle",
"version": "v0.9.101",
"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",
@ -1004,6 +979,11 @@
"version": "v2.5.0", "version": "v2.5.0",
"date": "2025-11-23T12:49:50Z" "date": "2025-11-23T12:49:50Z"
}, },
{
"name": "go-gitea/gitea",
"version": "v1.25.2",
"date": "2025-11-22T19:37:02Z"
},
{ {
"name": "TechnitiumSoftware/DnsServer", "name": "TechnitiumSoftware/DnsServer",
"version": "v14.2.0", "version": "v14.2.0",
@ -1014,6 +994,11 @@
"version": "v5.6.1", "version": "v5.6.1",
"date": "2025-11-21T16:51:21Z" "date": "2025-11-21T16:51:21Z"
}, },
{
"name": "forgejo/forgejo",
"version": "v13.0.3",
"date": "2025-11-21T12:43:04Z"
},
{ {
"name": "seriousm4x/UpSnap", "name": "seriousm4x/UpSnap",
"version": "5.2.4", "version": "5.2.4",
@ -1034,6 +1019,11 @@
"version": "v2.1.11", "version": "v2.1.11",
"date": "2025-11-20T20:14:44Z" "date": "2025-11-20T20:14:44Z"
}, },
{
"name": "saltstack/salt",
"version": "v3007.9",
"date": "2025-11-20T17:58:32Z"
},
{ {
"name": "kimai/kimai", "name": "kimai/kimai",
"version": "2.44.0", "version": "2.44.0",
@ -1049,6 +1039,11 @@
"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",
@ -1184,6 +1179,11 @@
"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

@ -99,15 +99,10 @@ if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
$STD apt install -y --no-install-recommends patchelf $STD apt install -y --no-install-recommends patchelf
tmp_dir=$(mktemp -d) tmp_dir=$(mktemp -d)
$STD pushd "$tmp_dir" $STD pushd "$tmp_dir"
curl -fsSLZ -O "https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.24/intel-igc-core_1.0.17537.24_amd64.deb" \ curl -fsSLO https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17384.11/intel-igc-core_1.0.17384.11_amd64.deb
-O "https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17537.24/intel-igc-opencl_1.0.17537.24_amd64.deb" \ curl -fsSLO https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17384.11/intel-igc-opencl_1.0.17384.11_amd64.deb
-O "https://github.com/intel/compute-runtime/releases/download/24.35.30872.36/intel-opencl-icd-legacy1_24.35.30872.36_amd64.deb" \ curl -fsSLO https://github.com/intel/compute-runtime/releases/download/24.31.30508.7/intel-opencl-icd_24.31.30508.7_amd64.deb
-O "https://github.com/intel/intel-graphics-compiler/releases/download/v2.22.2/intel-igc-core-2_2.22.2+20121_amd64.deb" \ curl -fsSLO https://github.com/intel/compute-runtime/releases/download/24.31.30508.7/libigdgmm12_22.4.1_amd64.deb
-O "https://github.com/intel/intel-graphics-compiler/releases/download/v2.22.2/intel-igc-opencl-2_2.22.2+20121_amd64.deb" \
-O "https://github.com/intel/compute-runtime/releases/download/25.44.36015.5/intel-opencl-icd_25.44.36015.5-0_amd64.deb" \
-O "https://github.com/intel/compute-runtime/releases/download/25.44.36015.5/libigdgmm12_22.8.2_amd64.deb"
$STD apt install -y ./libigdgmm12*.deb
rm ./libigdgmm12*.deb
$STD apt install -y ./*.deb $STD apt install -y ./*.deb
$STD apt-mark hold libigdgmm12 $STD apt-mark hold libigdgmm12
$STD popd $STD popd
@ -296,7 +291,7 @@ GEO_DIR="${INSTALL_DIR}/geodata"
mkdir -p "$INSTALL_DIR" mkdir -p "$INSTALL_DIR"
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache} mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache}
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.4.0" "$SRC_DIR" fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.3.1" "$SRC_DIR"
msg_info "Installing ${APPLICATION} (patience)" msg_info "Installing ${APPLICATION} (patience)"

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 rm -rf ~/.cargo/registry ~/.cargo/git ~/.cargo/.package-cache ~/.rustup
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

@ -14,13 +14,16 @@ network_check
update_os update_os
msg_info "Installing Proxmox Mail Gateway" msg_info "Installing Proxmox Mail Gateway"
setup_deb822_repo \ curl -fsSL "https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg" -o "/usr/share/keyrings/proxmox-release-trixie.gpg"
"pmg" \ cat <<EOF >/etc/apt/sources.list.d/pmg.sources
"https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg" \ Types: deb
"http://download.proxmox.com/debian/pmg" \ URIs: http://download.proxmox.com/debian/pmg
"trixie" \ Suites: trixie
"pmg-no-subscription" Components: pmg-no-subscription
$STD apt install -y proxmox-mailgateway-container Signed-By: /usr/share/keyrings/proxmox-release-trixie.gpg
EOF
$STD apt update
$STD apt -y install proxmox-mailgateway-container
msg_ok "Installed Proxmox Mail Gateway" msg_ok "Installed Proxmox Mail Gateway"
motd_ssh motd_ssh

View File

@ -31,17 +31,9 @@ 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"
if [[ "$ZABBIX_VERSION" == "7.0" ]]; then curl -fsSL "$ZABBIX_DEB_URL" -o /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" $STD dpkg -i /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"
$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
@ -112,7 +104,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_*.deb rm -rf /tmp/zabbix-release_latest+debian13_all.deb
msg_ok "Started Services" msg_ok "Started Services"
motd_ssh motd_ssh

View File

@ -815,11 +815,8 @@ 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 - directly remove cache directory # Node.js npm
# npm cache clean/verify can fail with ENOTEMPTY errors, so we skip them if command -v npm &>/dev/null; then $STD npm cache clean --force || true; fi
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}' 2>/dev/null | while read -r module; do npm list -g 2>/dev/null | grep -oE '^ \S+' | awk '{print $1}' | while read -r module; do
npm uninstall -g "$module" >/dev/null 2>&1 || true npm uninstall -g "$module" >/dev/null 2>&1 || true
done || true done
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}' 2>/dev/null || true) keyring_path=$(grep -E '^Signed-By:' "$sources_file" 2>/dev/null | awk '{print $2}')
# 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}' 2>/dev/null || echo 'unknown') VERSION=$(dpkg -s adminer 2>/dev/null | grep '^Version:' | awk '{print $2}')
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}' 2>/dev/null || echo "") cpu_vendor=$(lscpu 2>/dev/null | grep -i 'Vendor ID' | awk '{print $3}' || 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="$(npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' 2>/dev/null | tr -d '[:space:]' || echo '')" MODULE_INSTALLED_VERSION="$($STD npm list -g --depth=0 "$MODULE_NAME" 2>&1 | grep "$MODULE_NAME@" | awk -F@ '{print $2}' | tr -d '[:space:]')"
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}' 2>/dev/null | cut -d- -f1 || true) AVAILABLE_PHP_VERSION=$(apt-cache show "php${PHP_VERSION}" 2>/dev/null | grep -m1 "^Version:" | awk '{print $2}' | 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}' 2>/dev/null | tr -d 'v:' || echo '') INSTALLED_VER=$(echo "$CRATE_LIST" | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
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}' 2>/dev/null | tr -d 'v:' || echo 'unknown') local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
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}' 2>/dev/null | tr -d 'v:' || echo 'unknown') local NEW_VER=$(cargo install --list 2>/dev/null | grep "^${NAME} " | head -1 | awk '{print $2}' | tr -d 'v:')
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}' 2>/dev/null | cut -d':' -f2 | cut -d'-' -f1 || echo '') DOCKER_LATEST_VERSION=$(apt-cache policy docker-ce | grep Candidate | awk '{print $2}' | cut -d':' -f2 | cut -d'-' -f1)
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

@ -3,7 +3,7 @@
# Copyright (c) 2021-2025 community-scripts ORG # Copyright (c) 2021-2025 community-scripts ORG
# Author: CrazyWolf13 # Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/martabal/qbittorrent-exporter # 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/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/tools.func)
@ -18,22 +18,23 @@ load_functions
# CONFIGURATION # CONFIGURATION
# ============================================================================== # ==============================================================================
VERBOSE=${var_verbose:-no} VERBOSE=${var_verbose:-no}
APP="qbittorrent-exporter" APP="pihole-exporter"
APP_TYPE="tools" APP_TYPE="tools"
INSTALL_PATH="/opt/qbittorrent-exporter" INSTALL_PATH="/opt/pihole-exporter"
CONFIG_PATH="/opt/qbittorrent-exporter.env" CONFIG_PATH="/opt/pihole-exporter.env"
header_info header_info
ensure_usr_local_bin_persist ensure_usr_local_bin_persist
get_current_ip &>/dev/null
# ============================================================================== # ==============================================================================
# OS DETECTION # OS DETECTION
# ============================================================================== # ==============================================================================
if [[ -f "/etc/alpine-release" ]]; then if [[ -f "/etc/alpine-release" ]]; then
OS="Alpine" OS="Alpine"
SERVICE_PATH="/etc/init.d/qbittorrent-exporter" SERVICE_PATH="/etc/init.d/pihole-exporter"
elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then
OS="Debian" OS="Debian"
SERVICE_PATH="/etc/systemd/system/qbittorrent-exporter.service" SERVICE_PATH="/etc/systemd/system/pihole-exporter.service"
else else
echo -e "${CROSS} Unsupported OS detected. Exiting." echo -e "${CROSS} Unsupported OS detected. Exiting."
exit 1 exit 1
@ -43,47 +44,47 @@ fi
# UNINSTALL # UNINSTALL
# ============================================================================== # ==============================================================================
function uninstall() { function uninstall() {
msg_info "Uninstalling qBittorrent-Exporter" msg_info "Uninstalling Pihole-Exporter"
if [[ "$OS" == "Alpine" ]]; then if [[ "$OS" == "Alpine" ]]; then
rc-service qbittorrent-exporter stop &>/dev/null rc-service pihole-exporter stop &>/dev/null
rc-update del qbittorrent-exporter &>/dev/null rc-update del pihole-exporter &>/dev/null
rm -f "$SERVICE_PATH" rm -f "$SERVICE_PATH"
else else
systemctl disable -q --now qbittorrent-exporter systemctl disable -q --now pihole-exporter
rm -f "$SERVICE_PATH" rm -f "$SERVICE_PATH"
fi fi
rm -rf "$INSTALL_PATH" "$CONFIG_PATH" rm -rf "$INSTALL_PATH" "$CONFIG_PATH"
rm -f "/usr/local/bin/update_qbittorrent-exporter" rm -f "/usr/local/bin/update_pihole-exporter"
rm -f "$HOME/.qbittorrent-exporter" rm -f "$HOME/.pihole-exporter"
msg_ok "qBittorrent-Exporter has been uninstalled" msg_ok "Pihole-Exporter has been uninstalled"
} }
# ============================================================================== # ==============================================================================
# UPDATE # UPDATE
# ============================================================================== # ==============================================================================
function update() { function update() {
if check_for_gh_release "qbittorrent-exporter" "martabal/qbittorrent-exporter"; then if check_for_gh_release "pihole-exporter" "eko/pihole-exporter"; then
msg_info "Stopping service" msg_info "Stopping service"
if [[ "$OS" == "Alpine" ]]; then if [[ "$OS" == "Alpine" ]]; then
rc-service qbittorrent-exporter stop &>/dev/null rc-service pihole-exporter stop &>/dev/null
else else
systemctl stop qbittorrent-exporter systemctl stop pihole-exporter
fi fi
msg_ok "Stopped service" msg_ok "Stopped service"
fetch_and_deploy_gh_release "qbittorrent-exporter" "martabal/qbittorrent-exporter" "tarball" "latest" fetch_and_deploy_gh_release "pihole-exporter" "eko/pihole-exporter" "tarball" "latest"
setup_go setup_go
msg_info "Building qBittorrent-Exporter" msg_info "Building Pihole-Exporter"
cd /opt/qbittorrent-exporter cd /opt/pihole-exporter/
$STD /usr/local/bin/go build -o ./qbittorrent-exporter $STD /usr/local/bin/go build -o ./pihole-exporter
msg_ok "Built qBittorrent-Exporter" msg_ok "Built Pihole-Exporter"
msg_info "Starting service" msg_info "Starting service"
if [[ "$OS" == "Alpine" ]]; then if [[ "$OS" == "Alpine" ]]; then
rc-service qbittorrent-exporter start &>/dev/null rc-service pihole-exporter start &>/dev/null
else else
systemctl start qbittorrent-exporter systemctl start pihole-exporter
fi fi
msg_ok "Started service" msg_ok "Started service"
msg_ok "Updated successfully" msg_ok "Updated successfully"
@ -95,24 +96,31 @@ function update() {
# INSTALL # INSTALL
# ============================================================================== # ==============================================================================
function install() { function install() {
read -erp "Enter URL of qBittorrent, example: (http://127.0.0.1:8080): " QBITTORRENT_BASE_URL read -erp "Enter the protocol to use (http/https), default https: " pihole_PROTOCOL
read -erp "Enter qBittorrent username: " QBITTORRENT_USERNAME read -erp "Enter the hostname of Pihole, example: (127.0.0.1): " pihole_HOSTNAME
read -rsp "Enter qBittorrent password: " QBITTORRENT_PASSWORD read -erp "Enter the port of Pihole, default 443: " pihole_PORT
read -rsp "Enter Pihole password: " pihole_PASSWORD
printf "\n" 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 "qbittorrent-exporter" "martabal/qbittorrent-exporter" "tarball" "latest" fetch_and_deploy_gh_release "pihole-exporter" "eko/pihole-exporter" "tarball" "latest"
setup_go setup_go
msg_info "Building qBittorrent-Exporter on ${OS}" msg_info "Building Pihole-Exporter on ${OS}"
cd /opt/qbittorrent-exporter cd /opt/pihole-exporter/
$STD /usr/local/bin/go build -o ./qbittorrent-exporter $STD /usr/local/bin/go build -o ./pihole-exporter
msg_ok "Built qBittorrent-Exporter" msg_ok "Built Pihole-Exporter"
msg_info "Creating configuration" msg_info "Creating configuration"
cat <<EOF >"$CONFIG_PATH" cat <<EOF >"$CONFIG_PATH"
# https://github.com/martabal/qbittorrent-exporter?tab=readme-ov-file#parameters # https://github.com/eko/pihole-exporter/?tab=readme-ov-file#available-cli-options
QBITTORRENT_BASE_URL="${QBITTORRENT_BASE_URL}" PIHOLE_PASSWORD="${pihole_PASSWORD}"
QBITTORRENT_USERNAME="${QBITTORRENT_USERNAME}" PIHOLE_HOSTNAME="${pihole_HOSTNAME:-127.0.0.1}"
QBITTORRENT_PASSWORD="${QBITTORRENT_PASSWORD}" PIHOLE_PORT="${pihole_PORT:-443}"
SKIP_TLS_VERIFICATION="${pihole_SKIP_TLS:-false}"
PIHOLE_PROTOCOL="${pihole_PROTOCOL:-https}"
EOF EOF
msg_ok "Created configuration" msg_ok "Created configuration"
@ -120,33 +128,33 @@ EOF
if [[ "$OS" == "Debian" ]]; then if [[ "$OS" == "Debian" ]]; then
cat <<EOF >"$SERVICE_PATH" cat <<EOF >"$SERVICE_PATH"
[Unit] [Unit]
Description=qbittorrent-exporter Description=pihole-exporter
After=network.target After=network.target
[Service] [Service]
User=root User=root
WorkingDirectory=/opt/qbittorrent-exporter WorkingDirectory=/opt/pihole-exporter
EnvironmentFile=$CONFIG_PATH EnvironmentFile=$CONFIG_PATH
ExecStart=/opt/qbittorrent-exporter/qbittorrent-exporter ExecStart=/opt/pihole-exporter/pihole-exporter
Restart=always Restart=always
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl daemon-reload systemctl daemon-reload
systemctl enable -q --now qbittorrent-exporter systemctl enable -q --now pihole-exporter
else else
cat <<EOF >"$SERVICE_PATH" cat <<EOF >"$SERVICE_PATH"
#!/sbin/openrc-run #!/sbin/openrc-run
name="qbittorrent-exporter" name="pihole-exporter"
description="qBittorrent Exporter for Prometheus" description="Pi-hole Exporter for Prometheus"
command="${INSTALL_PATH}/qbittorrent-exporter" command="${INSTALL_PATH}/pihole-exporter"
command_background=true command_background=true
directory="/opt/qbittorrent-exporter" directory="/opt/pihole-exporter"
pidfile="/run/\${RC_SVCNAME}.pid" pidfile="/run/\${RC_SVCNAME}.pid"
output_log="/var/log/qbittorrent-exporter.log" output_log="/var/log/pihole-exporter.log"
error_log="/var/log/qbittorrent-exporter.log" error_log="/var/log/pihole-exporter.log"
depend() { depend() {
need net need net
@ -160,25 +168,25 @@ start_pre() {
} }
EOF EOF
chmod +x "$SERVICE_PATH" chmod +x "$SERVICE_PATH"
$STD rc-update add qbittorrent-exporter default $STD rc-update add pihole-exporter default
$STD rc-service qbittorrent-exporter start $STD rc-service pihole-exporter start
fi fi
msg_ok "Created and started service" msg_ok "Created and started service"
# Create update script # Create update script
msg_info "Creating update script" msg_info "Creating update script"
ensure_usr_local_bin_persist ensure_usr_local_bin_persist
cat <<'UPDATEEOF' >/usr/local/bin/update_qbittorrent-exporter cat <<'UPDATEEOF' >/usr/local/bin/update_pihole-exporter
#!/usr/bin/env bash #!/usr/bin/env bash
# qbittorrent-exporter Update Script # pihole-exporter Update Script
type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/qbittorrent-exporter.sh)" type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/pihole-exporter.sh)"
UPDATEEOF UPDATEEOF
chmod +x /usr/local/bin/update_qbittorrent-exporter chmod +x /usr/local/bin/update_pihole-exporter
msg_ok "Created update script (/usr/local/bin/update_qbittorrent-exporter)" msg_ok "Created update script (/usr/local/bin/update_pihole-exporter)"
echo "" echo ""
msg_ok "qBittorrent-Exporter installed successfully" msg_ok "Pihole-Exporter installed successfully"
msg_ok "Metrics: ${BL}http://${LOCAL_IP}:8090/metrics${CL}" msg_ok "Metrics: ${BL}http://${CURRENT_IP}:9617/metrics${CL}"
msg_ok "Config: ${BL}${CONFIG_PATH}${CL}" msg_ok "Config: ${BL}${CONFIG_PATH}${CL}"
} }
@ -187,32 +195,32 @@ UPDATEEOF
# ============================================================================== # ==============================================================================
header_info header_info
ensure_usr_local_bin_persist ensure_usr_local_bin_persist
import_local_ip get_current_ip &>/dev/null
# Handle type=update (called from update script) # Handle type=update (called from update script)
if [[ "${type:-}" == "update" ]]; then if [[ "${type:-}" == "update" ]]; then
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/qbittorrent-exporter" ]]; then if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/pihole-exporter" ]]; then
update update
else else
msg_error "qBittorrent-Exporter is not installed. Nothing to update." msg_error "Pihole-Exporter is not installed. Nothing to update."
exit 1 exit 1
fi fi
exit 0 exit 0
fi fi
# Check if already installed # Check if already installed
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/qbittorrent-exporter" ]]; then if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/pihole-exporter" ]]; then
msg_warn "qBittorrent-Exporter is already installed." msg_warn "Pihole-Exporter is already installed."
echo "" echo ""
echo -n "${TAB}Uninstall qBittorrent-Exporter? (y/N): " echo -n "${TAB}Uninstall Pihole-Exporter? (y/N): "
read -r uninstall_prompt read -r uninstall_prompt
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
uninstall uninstall
exit 0 exit 0
fi fi
echo -n "${TAB}Update qBittorrent-Exporter? (y/N): " echo -n "${TAB}Update Pihole-Exporter? (y/N): "
read -r update_prompt read -r update_prompt
if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
update update
@ -224,14 +232,14 @@ if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/qbittorrent-exporter" ]]; then
fi fi
# Fresh installation # Fresh installation
msg_warn "qBittorrent-Exporter is not installed." msg_warn "Pihole-Exporter is not installed."
echo "" echo ""
echo -e "${TAB}${INFO} This will install:" echo -e "${TAB}${INFO} This will install:"
echo -e "${TAB} - qBittorrent Exporter (Go binary)" echo -e "${TAB} - Pi-hole Exporter (Go binary)"
echo -e "${TAB} - Systemd/OpenRC service" echo -e "${TAB} - Systemd/OpenRC service"
echo "" echo ""
echo -n "${TAB}Install qBittorrent-Exporter? (y/N): " echo -n "${TAB}Install Pihole-Exporter? (y/N): "
read -r install_prompt read -r install_prompt
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
install install

View File

@ -1,6 +0,0 @@
__ _ __ __ __ __
____ _/ /_ (_) /_/ /_____ _____________ ____ / /_ ___ _ ______ ____ _____/ /____ _____
/ __ `/ __ \/ / __/ __/ __ \/ ___/ ___/ _ \/ __ \/ __/_____/ _ \| |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
/ /_/ / /_/ / / /_/ /_/ /_/ / / / / / __/ / / / /_/_____/ __/> </ /_/ / /_/ / / / /_/ __/ /
\__, /_.___/_/\__/\__/\____/_/ /_/ \___/_/ /_/\__/ \___/_/|_/ .___/\____/_/ \__/\___/_/
/_/ /_/

View File

@ -50,12 +50,7 @@ function execute_in() {
container=$1 container=$1
name=$(pct exec "$container" hostname) name=$(pct exec "$container" hostname)
echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}" echo -e "${BL}[Info]${GN} Execute inside${BL} ${name}${GN} with output: ${CL}"
if ! pct exec "$container" -- bash -c "command -v ${custom_command} >/dev/null 2>&1"
then
echo -e "${BL}[Info]${GN} Skipping ${name} ${RD}$container has no command: ${custom_command}"
else
pct exec "$container" -- bash -c "${custom_command}" | tee pct exec "$container" -- bash -c "${custom_command}" | tee
fi
} }
for container in $(pct list | awk '{if(NR>1) print $1}'); do for container in $(pct list | awk '{if(NR>1) print $1}'); do