Compare commits

..

32 Commits

Author SHA1 Message Date
2a0b061c34 Merge branch 'refactor-cosmos-debian13' of https://github.com/community-scripts/ProxmoxVE into refactor-cosmos-debian13 2025-12-19 13:45:40 +01:00
908daaefee [Refactor] Cosmos: Upgrade to Debian 13 and modernize with tools.func
Major refactoring to fix mergerfs dependency issues and modernize the installation:

Changes in ct/cosmos.sh:
- Updated from Debian 12 to Debian 13 (Trixie)
- Fixed APP name capitalization: cosmos  Cosmos
- Improved tags formatting: os,docker  cloud;docker

Changes in install/cosmos-install.sh:
- Install mergerfs via apt (available in Debian 13 repos)
  * Automatically handles fuse dependencies
  * Removes need for manual .deb installation
  * No more hardcoded Bullseye package
- Added ca-certificates and openssl (per official Dockerfile)
- Replaced manual Docker installation with setup_docker helper
- Replaced manual GitHub release download with fetch_and_deploy_gh_release
  * Uses prebuild mode with cosmos-cloud-*-amd64.zip pattern
  * Automatic version detection and extraction
  * Proper error handling and retry logic
- Standardized apt-get  apt usage
- Added unzip to dependencies (required by fetch_and_deploy_gh_release)

Benefits:
- Fixes mergerfs dependency errors (issue #TMD44)
- More maintainable (uses helper functions instead of manual curl/unzip)
- Better error handling and version tracking
- Automatic architecture detection via apt
- Matches official Cosmos Dockerfile dependency list
- Future-proof for Debian version changes

Fixes dependency issues where mergerfs failed to install due to missing fuse
package. In Debian 13, mergerfs is available via apt and properly declares its
dependencies, so apt handles everything automatically.
2025-12-19 13:45:26 +01:00
38a2fec5d3 [Refactor] Cosmos: Upgrade to Debian 13 and modernize with tools.func
Major refactoring to fix mergerfs dependency issues and modernize the installation:

Changes in ct/cosmos.sh:
- Updated from Debian 12 to Debian 13 (Trixie)
- Fixed APP name capitalization: cosmos  Cosmos
- Improved tags formatting: os,docker  cloud;docker

Changes in install/cosmos-install.sh:
- Install mergerfs via apt (available in Debian 13 repos)
  * Automatically handles fuse dependencies
  * Removes need for manual .deb installation
  * No more hardcoded Bullseye package
- Added ca-certificates and openssl (per official Dockerfile)
- Replaced manual Docker installation with setup_docker helper
- Replaced manual GitHub release download with fetch_and_deploy_gh_release
  * Uses prebuild mode with cosmos-cloud-*-amd64.zip pattern
  * Automatic version detection and extraction
  * Proper error handling and retry logic
- Standardized apt-get  apt usage
- Added unzip to dependencies (required by fetch_and_deploy_gh_release)

Benefits:
- Fixes mergerfs dependency errors (issue #TMD44)
- More maintainable (uses helper functions instead of manual curl/unzip)
- Better error handling and version tracking
- Automatic architecture detection via apt
- Matches official Cosmos Dockerfile dependency list
- Future-proof for Debian version changes

Fixes dependency issues where mergerfs failed to install due to missing fuse
package. In Debian 13, mergerfs is available via apt and properly declares its
dependencies, so apt handles everything automatically.
2025-12-19 13:43:16 +01:00
00137d4441 Update .app files (#10140)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-12-19 13:25:23 +01:00
159b5ee22e Update CHANGELOG.md (#10139)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-19 12:22:30 +00:00
5beb983b7f Refactor (#10070) 2025-12-19 13:22:07 +01:00
13c29e5c51 Update versions.json (#10137)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-19 13:07:20 +01:00
69d17046aa Update CHANGELOG.md (#10135)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-19 08:03:54 +00:00
04f4727de3 Update paymenter.json(#10133) (#10134) 2025-12-19 09:03:30 +01:00
c1445f30bf Update CHANGELOG.md (#10132)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-19 00:14:31 +00:00
891caa7c94 Update versions.json (#10131)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-19 01:14:06 +01:00
17ff4078bb Update CHANGELOG.md (#10127)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 21:36:02 +00:00
9022ab0e5f Update CHANGELOG.md (#10126)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 21:35:44 +00:00
e646522095 Update date in json (#10125)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-12-18 21:35:39 +00:00
1a567facfa qbittorrent-exporter (#10090)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
2025-12-18 22:35:22 +01:00
2c2a062b6a Update CHANGELOG.md (#10123)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 20:32:14 +00:00
8b767ec68a bump pihole to debian 13 (#10118)
* Update debian to version 13

* Update debian version from 12 to 13
2025-12-18 21:31:53 +01:00
f334fda317 Update CHANGELOG.md (#10122)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 18:41:53 +00:00
510278960b feat: excecute command in LXC: Script exited, when command isn't available in LXC. Added check if command exists in container, otherwise script will skip the container. (#10089) 2025-12-18 19:41:31 +01:00
0a276749d7 Update CHANGELOG.md (#10120)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 17:38:34 +00:00
c1ef6d7c51 Improve error handling and cleanup in shell functions (#10116)
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 18:38:08 +01:00
e0e7aa94e8 Update CHANGELOG.md (#10119)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-12-18 16:54:06 +00:00
b829dcc849 Immich: v2.4.0 (#10095)
* [ENHANCEMENT] Immich: Support for newer Intel GPUs

- Add support for newer Intel GPUs: Battlemage, Arrow Lake and Panther
Lake by adding v2.22.2 Intel IGC packages
- Fix: ensure libigdgmm12 is installed before other packages during
update
- Fix: Download and install Intel packages in `/tmp` to allow apt to
drop root privileges during installation

* Bump Immich to v2.4.0
2025-12-18 17:53:41 +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
20 changed files with 605 additions and 273 deletions

View File

@ -10,6 +10,18 @@
> [!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
- #### 🔧 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 ## 2025-12-18
### 🚀 Updated Scripts ### 🚀 Updated Scripts
@ -17,6 +29,27 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### 🐞 Bug Fixes - #### 🐞 Bug Fixes
- [HOTFIX] Fix Scanopy release check [@vhsdream](https://github.com/vhsdream) ([#10097](https://github.com/community-scripts/ProxmoxVE/pull/10097)) - [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

View File

@ -5,14 +5,15 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://https://cosmos-cloud.io/ # Source: https://https://cosmos-cloud.io/
APP="cosmos" APP="Cosmos"
var_tags="${var_tags:-os,docker}" var_tags="${var_tags:-cloud;docker}"
var_cpu="${var_cpu:-2}" var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}" var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}" var_disk="${var_disk:-8}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
var_fuse="${var_fuse:-yes}"
header_info "$APP" header_info "$APP"
variables variables

View File

@ -74,23 +74,28 @@ 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 /root cd /tmp
if [[ -f ~/.intel_version ]]; then if [[ -f ~/.intel_version ]]; then
curl -fsSLO https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/machine-learning/Dockerfile curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile
readarray -t INTEL_URLS < <(sed -n "/intel/p" ./Dockerfile | awk '{print $3}') readarray -t INTEL_URLS < <(
INTEL_RELEASE="$(grep "intel-opencl-icd" ./Dockerfile | awk -F '_' '{print $2}')" sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{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")
@ -103,7 +108,7 @@ EOF
msg_ok "Image-processing libraries up to date" msg_ok "Image-processing libraries up to date"
fi fi
RELEASE="2.3.1" RELEASE="2.4.0"
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

@ -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

@ -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:-12}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
header_info "$APP" header_info "$APP"

View File

@ -27,10 +27,11 @@ 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 -y upgrade $STD apt upgrade -y
msg_ok "Updated ${APP}" msg_ok "Updated Proxmox-Mail-Gateway"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
exit exit
} }

View File

@ -24,7 +24,7 @@
"ram": 2048, "ram": 2048,
"hdd": 8, "hdd": 8,
"os": "debian", "os": "debian",
"version": "12" "version": "13"
} }
} }
], ],
@ -36,6 +36,10 @@
{ {
"type": "info", "type": "info",
"text": "The file `/etc/sysconfig/CosmosCloud` is optional. If you need custom settings, you can create it yourself." "text": "The file `/etc/sysconfig/CosmosCloud` is optional. If you need custom settings, you can create it yourself."
},
{
"type": "warning",
"text": "Requires FUSE support for mergerfs functionality. FUSE is enabled by default during installation."
} }
] ]
} }

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/paymeter.webp", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/paymenter.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

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

View File

@ -0,0 +1,46 @@
{
"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,23 +1,213 @@
[ [
{
"name": "forgejo/forgejo",
"version": "v15.0.0-dev",
"date": "2025-12-19T11:43:47Z"
},
{
"name": "fccview/jotty",
"version": "1.14.2",
"date": "2025-12-19T11:25:29Z"
},
{
"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",
"version": "v11.1.2",
"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", "name": "javedh-dev/tracktor",
"version": "1.0.1", "version": "1.0.1",
"date": "2025-12-17T23:14:39Z" "date": "2025-12-17T23:14:39Z"
}, },
{ {
"name": "goauthentik/authentik", "name": "mealie-recipes/mealie",
"version": "version/2025.12.0-rc2", "version": "v3.8.0",
"date": "2025-12-17T22:03:04Z" "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", "name": "ollama/ollama",
"version": "v0.13.5-rc0", "version": "v0.13.5",
"date": "2025-12-17T21:13:55Z" "date": "2025-12-18T16:39:08Z"
}, },
{ {
"name": "fccview/jotty", "name": "meilisearch/meilisearch",
"version": "1.14.0", "version": "latest",
"date": "2025-12-17T20:26:22Z" "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",
"version": "v4.0.0-beta.458",
"date": "2025-12-18T12:23:23Z"
},
{
"name": "juanfont/headscale",
"version": "v0.27.1",
"date": "2025-11-11T19:32:29Z"
},
{
"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", "name": "emqx/emqx",
@ -40,34 +230,9 @@
"date": "2025-12-17T18:59:21Z" "date": "2025-12-17T18:59:21Z"
}, },
{ {
"name": "metabase/metabase", "name": "neo4j/neo4j",
"version": "v0.57.7", "version": "5.26.19",
"date": "2025-12-17T18:16:59Z" "date": "2025-12-17T18:17:55Z"
},
{
"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": "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": "semaphoreui/semaphore", "name": "semaphoreui/semaphore",
@ -79,21 +244,6 @@
"version": "v4.7.1", "version": "v4.7.1",
"date": "2025-12-17T15:18:55Z" "date": "2025-12-17T15:18:55Z"
}, },
{
"name": "n8n-io/n8n",
"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", "name": "bunkerity/bunkerweb",
"version": "testing", "version": "testing",
@ -104,21 +254,6 @@
"version": "v2.11.33", "version": "v2.11.33",
"date": "2025-12-17T10:10:19Z" "date": "2025-12-17T10:10:19Z"
}, },
{
"name": "mattermost/mattermost",
"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", "name": "zitadel/zitadel",
"version": "v4.7.6", "version": "v4.7.6",
@ -129,11 +264,6 @@
"version": "v0.105.1", "version": "v0.105.1",
"date": "2025-12-17T08:48:52Z" "date": "2025-12-17T08:48:52Z"
}, },
{
"name": "meilisearch/meilisearch",
"version": "prototype-v1.30.1-rebuild-hannoy-graph.0",
"date": "2025-12-17T08:38:38Z"
},
{ {
"name": "passbolt/passbolt_api", "name": "passbolt/passbolt_api",
"version": "v5.8.0-test.3", "version": "v5.8.0-test.3",
@ -159,11 +289,6 @@
"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",
@ -174,16 +299,6 @@
"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",
@ -199,16 +314,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",
@ -234,36 +339,16 @@
"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": "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": "Stirling-Tools/Stirling-PDF",
"version": "v2.1.4",
"date": "2025-12-16T00:02:18Z"
},
{ {
"name": "azukaar/Cosmos-Server", "name": "azukaar/Cosmos-Server",
"version": "v0.19.0", "version": "v0.19.0",
@ -309,11 +394,6 @@
"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",
@ -409,11 +489,6 @@
"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",
@ -449,26 +524,11 @@
"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:21:07Z"
},
{
"name": "paperless-ngx/paperless-ngx",
"version": "v2.20.2",
"date": "2025-12-12T23:47:48Z"
},
{ {
"name": "mongodb/mongo", "name": "mongodb/mongo",
"version": "r7.0.27", "version": "r7.0.27",
@ -529,11 +589,6 @@
"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",
@ -544,11 +599,6 @@
"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",
@ -609,11 +659,6 @@
"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",
@ -709,11 +754,6 @@
"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",
@ -814,16 +854,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",
@ -864,11 +894,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",
@ -894,11 +919,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",
@ -944,11 +964,6 @@
"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": "NLnetLabs/unbound", "name": "NLnetLabs/unbound",
"version": "release-1.24.2", "version": "release-1.24.2",
@ -989,11 +1004,6 @@
"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",
@ -1004,11 +1014,6 @@
"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",
@ -1029,11 +1034,6 @@
"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",

View File

@ -14,38 +14,23 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt install -y \
ca-certificates \
openssl \
snapraid \ snapraid \
avahi-daemon \ avahi-daemon \
fdisk fdisk \
mergerfs \
unzip
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Install mergerfs" setup_docker
MERGERFS_VERSION="2.40.2" fetch_and_deploy_gh_release "cosmos" "azukaar/Cosmos-Server" "prebuild" "latest" "/opt/cosmos" "cosmos-cloud-*-amd64.zip"
curl -fsSL "https://github.com/trapexit/mergerfs/releases/download/${MERGERFS_VERSION}/mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb" -o "mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb"
$STD dpkg -i "mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb" || $STD apt-get install -f -y
rm "mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb"
msg_ok "Installed mergerfs"
msg_info "Install Docker" msg_info "Setting up Cosmos"
curl -fsSL https://get.docker.com -o get-docker.sh
$STD sh get-docker.sh
rm get-docker.sh
msg_ok "Installed Docker"
msg_info "Install Cosmos"
mkdir -p /opt/cosmos
LATEST_RELEASE=$(curl -fsSL https://api.github.com/repos/azukaar/Cosmos-Server/releases/latest | grep "tag_name" | cut -d '"' -f 4)
ZIP_FILE="cosmos-cloud-${LATEST_RELEASE#v}-amd64.zip"
curl -fsSL "https://github.com/azukaar/Cosmos-Server/releases/download/${LATEST_RELEASE}/${ZIP_FILE}" -o "/opt/cosmos/${ZIP_FILE}"
cd /opt/cosmos cd /opt/cosmos
$STD unzip -o -q "${ZIP_FILE}"
LATEST_RELEASE_NO_V=${LATEST_RELEASE#v}
mv /opt/cosmos/cosmos-cloud-${LATEST_RELEASE_NO_V}/* /opt/cosmos/
rmdir /opt/cosmos/cosmos-cloud-${LATEST_RELEASE_NO_V}
chmod +x /opt/cosmos/cosmos chmod +x /opt/cosmos/cosmos
rm -f "/opt/cosmos/cosmos-cloud-${LATEST_RELEASE#v}-amd64.zip" msg_ok "Set up Cosmos"
msg_ok "Installed Cosmos"
msg_info "Creating Service" msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/cosmos.service cat <<EOF >/etc/systemd/system/cosmos.service

View File

@ -99,10 +99,15 @@ 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 -fsSLO https://github.com/intel/intel-graphics-compiler/releases/download/igc-1.0.17384.11/intel-igc-core_1.0.17384.11_amd64.deb 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-opencl_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/compute-runtime/releases/download/24.31.30508.7/intel-opencl-icd_24.31.30508.7_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/libigdgmm12_22.4.1_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" \
-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
@ -291,7 +296,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.3.1" "$SRC_DIR" fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.4.0" "$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 ~/.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

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

@ -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

@ -0,0 +1,241 @@
#!/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/martabal/qbittorrent-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="qbittorrent-exporter"
APP_TYPE="tools"
INSTALL_PATH="/opt/qbittorrent-exporter"
CONFIG_PATH="/opt/qbittorrent-exporter.env"
header_info
ensure_usr_local_bin_persist
# ==============================================================================
# OS DETECTION
# ==============================================================================
if [[ -f "/etc/alpine-release" ]]; then
OS="Alpine"
SERVICE_PATH="/etc/init.d/qbittorrent-exporter"
elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then
OS="Debian"
SERVICE_PATH="/etc/systemd/system/qbittorrent-exporter.service"
else
echo -e "${CROSS} Unsupported OS detected. Exiting."
exit 1
fi
# ==============================================================================
# UNINSTALL
# ==============================================================================
function uninstall() {
msg_info "Uninstalling qBittorrent-Exporter"
if [[ "$OS" == "Alpine" ]]; then
rc-service qbittorrent-exporter stop &>/dev/null
rc-update del qbittorrent-exporter &>/dev/null
rm -f "$SERVICE_PATH"
else
systemctl disable -q --now qbittorrent-exporter
rm -f "$SERVICE_PATH"
fi
rm -rf "$INSTALL_PATH" "$CONFIG_PATH"
rm -f "/usr/local/bin/update_qbittorrent-exporter"
rm -f "$HOME/.qbittorrent-exporter"
msg_ok "qBittorrent-Exporter has been uninstalled"
}
# ==============================================================================
# UPDATE
# ==============================================================================
function update() {
if check_for_gh_release "qbittorrent-exporter" "martabal/qbittorrent-exporter"; then
msg_info "Stopping service"
if [[ "$OS" == "Alpine" ]]; then
rc-service qbittorrent-exporter stop &>/dev/null
else
systemctl stop qbittorrent-exporter
fi
msg_ok "Stopped service"
fetch_and_deploy_gh_release "qbittorrent-exporter" "martabal/qbittorrent-exporter" "tarball" "latest"
setup_go
msg_info "Building qBittorrent-Exporter"
cd /opt/qbittorrent-exporter
$STD /usr/local/bin/go build -o ./qbittorrent-exporter
msg_ok "Built qBittorrent-Exporter"
msg_info "Starting service"
if [[ "$OS" == "Alpine" ]]; then
rc-service qbittorrent-exporter start &>/dev/null
else
systemctl start qbittorrent-exporter
fi
msg_ok "Started service"
msg_ok "Updated successfully"
exit
fi
}
# ==============================================================================
# INSTALL
# ==============================================================================
function install() {
read -erp "Enter URL of qBittorrent, example: (http://127.0.0.1:8080): " QBITTORRENT_BASE_URL
read -erp "Enter qBittorrent username: " QBITTORRENT_USERNAME
read -rsp "Enter qBittorrent password: " QBITTORRENT_PASSWORD
printf "\n"
fetch_and_deploy_gh_release "qbittorrent-exporter" "martabal/qbittorrent-exporter" "tarball" "latest"
setup_go
msg_info "Building qBittorrent-Exporter on ${OS}"
cd /opt/qbittorrent-exporter
$STD /usr/local/bin/go build -o ./qbittorrent-exporter
msg_ok "Built qBittorrent-Exporter"
msg_info "Creating configuration"
cat <<EOF >"$CONFIG_PATH"
# https://github.com/martabal/qbittorrent-exporter?tab=readme-ov-file#parameters
QBITTORRENT_BASE_URL="${QBITTORRENT_BASE_URL}"
QBITTORRENT_USERNAME="${QBITTORRENT_USERNAME}"
QBITTORRENT_PASSWORD="${QBITTORRENT_PASSWORD}"
EOF
msg_ok "Created configuration"
msg_info "Creating service"
if [[ "$OS" == "Debian" ]]; then
cat <<EOF >"$SERVICE_PATH"
[Unit]
Description=qbittorrent-exporter
After=network.target
[Service]
User=root
WorkingDirectory=/opt/qbittorrent-exporter
EnvironmentFile=$CONFIG_PATH
ExecStart=/opt/qbittorrent-exporter/qbittorrent-exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable -q --now qbittorrent-exporter
else
cat <<EOF >"$SERVICE_PATH"
#!/sbin/openrc-run
name="qbittorrent-exporter"
description="qBittorrent Exporter for Prometheus"
command="${INSTALL_PATH}/qbittorrent-exporter"
command_background=true
directory="/opt/qbittorrent-exporter"
pidfile="/run/\${RC_SVCNAME}.pid"
output_log="/var/log/qbittorrent-exporter.log"
error_log="/var/log/qbittorrent-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 qbittorrent-exporter default
$STD rc-service qbittorrent-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_qbittorrent-exporter
#!/usr/bin/env bash
# qbittorrent-exporter Update Script
type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/qbittorrent-exporter.sh)"
UPDATEEOF
chmod +x /usr/local/bin/update_qbittorrent-exporter
msg_ok "Created update script (/usr/local/bin/update_qbittorrent-exporter)"
echo ""
msg_ok "qBittorrent-Exporter installed successfully"
msg_ok "Metrics: ${BL}http://${LOCAL_IP}:8090/metrics${CL}"
msg_ok "Config: ${BL}${CONFIG_PATH}${CL}"
}
# ==============================================================================
# MAIN
# ==============================================================================
header_info
ensure_usr_local_bin_persist
import_local_ip
# Handle type=update (called from update script)
if [[ "${type:-}" == "update" ]]; then
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/qbittorrent-exporter" ]]; then
update
else
msg_error "qBittorrent-Exporter is not installed. Nothing to update."
exit 1
fi
exit 0
fi
# Check if already installed
if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/qbittorrent-exporter" ]]; then
msg_warn "qBittorrent-Exporter is already installed."
echo ""
echo -n "${TAB}Uninstall qBittorrent-Exporter? (y/N): "
read -r uninstall_prompt
if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
uninstall
exit 0
fi
echo -n "${TAB}Update qBittorrent-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 "qBittorrent-Exporter is not installed."
echo ""
echo -e "${TAB}${INFO} This will install:"
echo -e "${TAB} - qBittorrent Exporter (Go binary)"
echo -e "${TAB} - Systemd/OpenRC service"
echo ""
echo -n "${TAB}Install qBittorrent-Exporter? (y/N): "
read -r install_prompt
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
install
else
msg_warn "Installation cancelled. Exiting."
exit 0
fi

View File

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

View File

@ -50,7 +50,12 @@ 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