From 43f75512e6f85906ea691f340883be5c7d891c77 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 21:35:49 +0000 Subject: [PATCH 1/6] Delete qbittorrent-exporter (addon) after migration to ProxmoxVE (#1221) Co-authored-by: github-actions[bot] --- .../public/json/qbittorrent-exporter.json | 46 ---- tools/addon/qbittorrent-exporter.sh | 243 ------------------ 2 files changed, 289 deletions(-) delete mode 100644 frontend/public/json/qbittorrent-exporter.json delete mode 100644 tools/addon/qbittorrent-exporter.sh diff --git a/frontend/public/json/qbittorrent-exporter.json b/frontend/public/json/qbittorrent-exporter.json deleted file mode 100644 index dba785b6f..000000000 --- a/frontend/public/json/qbittorrent-exporter.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "qbittorrent Exporter", - "slug": "qbittorrent-exporter", - "categories": [ - 9 - ], - "date_created": "2025-11-21", - "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": [] -} diff --git a/tools/addon/qbittorrent-exporter.sh b/tools/addon/qbittorrent-exporter.sh deleted file mode 100644 index d40a4ce15..000000000 --- a/tools/addon/qbittorrent-exporter.sh +++ /dev/null @@ -1,243 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2025 community-scripts ORG -# Author: CrazyWolf13 -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/martabal/qbittorrent-exporter - -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/core.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/error_handler.func) -load_functions - -# Enable error handling -set -Eeuo pipefail -trap 'error_handler' ERR - -# ============================================================================== -# 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 -get_current_ip &>/dev/null - -# ============================================================================== -# 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 <"$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 <"$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 <"$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/ProxmoxVED/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://${CURRENT_IP}:8090/metrics${CL}" - msg_ok "Config: ${BL}${CONFIG_PATH}${CL}" -} - -# ============================================================================== -# MAIN -# ============================================================================== -header_info -ensure_usr_local_bin_persist -get_current_ip &>/dev/null - -# Handle type=update (called from update script) -if [[ "${type:-}" == "update" ]]; then - if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/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 From 786be2d8c8137c5c2f537340a94dc1fe857ba940 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:40:29 +0100 Subject: [PATCH 2/6] test unifi --- vm/unifi-os-server-vm.sh | 274 ++++++++++++++++++--------------------- 1 file changed, 127 insertions(+), 147 deletions(-) diff --git a/vm/unifi-os-server-vm.sh b/vm/unifi-os-server-vm.sh index 5e356349b..524896c81 100644 --- a/vm/unifi-os-server-vm.sh +++ b/vm/unifi-os-server-vm.sh @@ -588,96 +588,17 @@ echo -en "\e[1A\e[0K" FILE=$(basename $URL) msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" -# --- Inject UniFi Installer via Cloud-Init --- -msg_info "Preparing ${OS_DISPLAY} Cloud Image for UniFi OS" +msg_ok "Downloaded ${OS_DISPLAY} Cloud Image" -# Install virt-customize if not available -if ! command -v virt-customize &>/dev/null; then +# Expand root partition to use full disk space +msg_info "Expanding disk image to ${DISK_SIZE}" + +# Install virt-resize if not available +if ! command -v virt-resize &>/dev/null; then apt-get -qq update >/dev/null apt-get -qq install libguestfs-tools -y >/dev/null fi -# Create UniFi OS installation script and inject it into the image -virt-customize -a "${FILE}" --run-command "cat > /root/install-unifi-os.sh << 'INSTALLSCRIPT' -#!/bin/bash -set -x -exec > /var/log/unifi-install.log 2>&1 - -echo \"=== UniFi OS Installation Started at \$(date) ===\" - -# Wait for cloud-init to complete -if command -v cloud-init >/dev/null 2>&1; then - echo \"Waiting for cloud-init to complete...\" - cloud-init status --wait 2>/dev/null || true -fi - -# Install required packages -echo \"Installing required packages...\" -export DEBIAN_FRONTEND=noninteractive -apt-get update -apt-get install -y curl wget ca-certificates podman uidmap slirp4netns iptables - -# Configure Podman -echo \"Configuring Podman...\" -loginctl enable-linger root - -# Download UniFi OS Server -echo \"Downloading UniFi OS Server ${UOS_VERSION}...\" -cd /root -curl -fsSL '${UOS_URL}' -o unifi-installer.bin -chmod +x unifi-installer.bin - -# Install UniFi OS Server -echo \"Installing UniFi OS Server (this takes 3-5 minutes)...\" -./unifi-installer.bin install - -echo \"Waiting for services to start...\" -sleep 15 - -# Start UniFi OS Server -if systemctl list-unit-files | grep -q unifi-os-server; then - echo \"Starting UniFi OS Server service...\" - systemctl enable unifi-os-server - systemctl start unifi-os-server - sleep 10 - - if systemctl is-active --quiet unifi-os-server; then - echo \"SUCCESS: UniFi OS Server is running\" - else - echo \"WARNING: Checking service status...\" - systemctl status unifi-os-server --no-pager - fi -fi - -touch /root/.unifi-installed -echo \"=== Installation completed at \$(date) ===\" -INSTALLSCRIPT" >/dev/null 2>&1 - -virt-customize -a "${FILE}" --chmod 0755:/root/install-unifi-os.sh >/dev/null 2>&1 - -# Create systemd service for first-boot installation -virt-customize -a "${FILE}" --run-command "cat > /etc/systemd/system/unifi-firstboot.service << 'SVCFILE' -[Unit] -Description=UniFi OS First Boot Installation -After=cloud-init.service network-online.target -Wants=network-online.target -ConditionPathExists=!/root/.unifi-installed - -[Service] -Type=oneshot -ExecStart=/root/install-unifi-os.sh -RemainAfterExit=yes - -[Install] -WantedBy=multi-user.target -SVCFILE" >/dev/null 2>&1 - -virt-customize -a "${FILE}" --run-command "systemctl enable unifi-firstboot.service" >/dev/null 2>&1 - -msg_ok "Prepared ${OS_DISPLAY} image with UniFi OS installer" - -# Expand root partition to use full disk space -msg_info "Expanding disk image to ${DISK_SIZE}" qemu-img create -f qcow2 expanded.qcow2 ${DISK_SIZE} >/dev/null 2>&1 # Detect partition device (sda1 for Ubuntu, vda1 for Debian) @@ -712,21 +633,10 @@ qm set "$VMID" \ qm resize "$VMID" scsi0 "$DISK_SIZE" >/dev/null qm set "$VMID" --agent enabled=1 >/dev/null -# Add Cloud-Init drive (standard Cloud-Init, no custom user-data) +# Add Cloud-Init drive msg_info "Configuring Cloud-Init" setup_cloud_init "$VMID" "$STORAGE" "$HN" "yes" >/dev/null 2>&1 -msg_ok "Cloud-Init configured (UniFi OS installs via systemd service on first boot)" - -# Display credentials immediately so user can login -if [ -n "$CLOUDINIT_CRED_FILE" ] && [ -f "$CLOUDINIT_CRED_FILE" ]; then - echo "" - echo -e "${INFO}${BOLD}${GN}Cloud-Init Credentials (save these now!):${CL}" - echo -e "${TAB}${DGN}User: ${BGN}${CLOUDINIT_USER:-root}${CL}" - echo -e "${TAB}${DGN}Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}" - echo -e "${TAB}${RD}⚠️ UniFi OS installation runs automatically on first boot${CL}" - echo -e "${TAB}${INFO}Monitor: ${BL}tail -f /var/log/unifi-install.log${CL}" - echo "" -fi +msg_ok "Cloud-Init configured" DESCRIPTION=$( cat </dev/null | jq -r '.[1]["ip-addresses"][]? | select(.["ip-address-type"] == "ipv4") | .["ip-address"]' 2>/dev/null | grep -v "127.0.0.1" | head -1 || echo "") if [ -n "$VM_IP" ]; then - msg_ok "VM IP Address detected: ${VM_IP}" + msg_ok "VM IP Address: ${VM_IP}" break fi sleep 2 done - if [ -n "$VM_IP" ]; then - msg_info "Waiting for UniFi OS installation (via Cloud-Init, takes 5-8 minutes)" - - WAIT_COUNT=0 - MAX_WAIT=600 # 10 minutes max for Cloud-Init installation - PORT_OPEN=0 - LAST_MSG_TIME=0 - - while [ $WAIT_COUNT -lt $MAX_WAIT ]; do - if timeout 2 bash -c ">/dev/tcp/${VM_IP}/11443" 2>/dev/null; then - PORT_OPEN=1 - msg_ok "UniFi OS Server is ready!" - break - fi - - sleep 10 - WAIT_COUNT=$((WAIT_COUNT + 10)) - - # Update message every 30 seconds - if [ $((WAIT_COUNT - LAST_MSG_TIME)) -ge 30 ]; then - echo -e "${BFR}${TAB}${YW}${HOLD}Installation in progress... ${WAIT_COUNT}s elapsed${CL}" - echo -e "${TAB}${INFO}${YW}Monitor: ${BL}ssh ${CLOUDINIT_USER:-root}@${VM_IP} 'tail -f /var/log/unifi-install.log'${CL}" - LAST_MSG_TIME=$WAIT_COUNT - fi - done - - if [ $PORT_OPEN -eq 1 ]; then - echo -e "\n${TAB}${GATEWAY}${BOLD}${GN}✓ UniFi OS Server is ready!${CL}" - echo -e "${TAB}${GATEWAY}${BOLD}${GN}✓ Access at: ${BGN}https://${VM_IP}:11443${CL}\n" - else - msg_ok "VM is running, UniFi OS installation in progress" - echo -e "${TAB}${INFO}${YW}Installation runs via systemd service on first boot${CL}" - echo -e "${TAB}${INFO}${YW}This takes 5-8 minutes${CL}" - if [ "$USE_CLOUD_INIT" = "yes" ]; then - echo -e "${TAB}${INFO}${YW}SSH: ${BL}ssh ${CLOUDINIT_USER:-root}@${VM_IP}${CL}" - echo -e "${TAB}${INFO}${YW}Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}" - echo -e "${TAB}${INFO}${YW}Monitor: ${BL}tail -f /var/log/unifi-install.log${CL}" - fi - echo -e "${TAB}${INFO}${YW}UniFi OS will be at: ${BGN}https://${VM_IP}:11443${CL}" - fi - else - msg_ok "VM is running (ID: ${VMID})" - echo -e "${TAB}${INFO}${YW}Could not auto-detect IP address${CL}" + if [ -z "$VM_IP" ]; then + msg_error "Could not detect VM IP address" echo -e "${TAB}${INFO}${YW}Use Proxmox Console to login with Cloud-Init credentials${CL}" echo -e "${TAB}${INFO}${YW}User: ${BGN}${CLOUDINIT_USER:-root}${CL} / Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}" - echo -e "${TAB}${INFO}${YW}Monitor installation: ${BL}tail -f /var/log/unifi-install.log${CL}" + exit 1 fi + + # Wait for SSH to be ready + msg_info "Waiting for SSH to be ready" + SSH_READY=0 + for i in {1..30}; do + if timeout 5 sshpass -p "${CLOUDINIT_PASSWORD}" ssh -o ConnectTimeout=3 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ + "${CLOUDINIT_USER:-root}@${VM_IP}" "echo 'SSH Ready'" >/dev/null 2>&1; then + SSH_READY=1 + msg_ok "SSH connection ready" + break + fi + sleep 2 + done + + if [ $SSH_READY -eq 0 ]; then + msg_error "SSH connection failed" + echo -e "${TAB}${INFO}${YW}Manual login - User: ${BGN}${CLOUDINIT_USER:-root}${CL} / Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}" + exit 1 + fi + + # Check if sshpass is installed + if ! command -v sshpass &>/dev/null; then + msg_info "Installing sshpass for automated SSH" + apt-get update -qq >/dev/null 2>&1 + apt-get install -y sshpass -qq >/dev/null 2>&1 + fi + + # Execute UniFi OS installation directly via SSH + msg_info "Installing UniFi OS Server ${UOS_VERSION} (takes 4-6 minutes)" + + # Create installation script + INSTALL_SCRIPT=$( + cat <<'EOFINSTALL' +#!/bin/bash +set -e +export DEBIAN_FRONTEND=noninteractive + +echo "[1/5] Updating system packages..." +apt-get update -qq +apt-get install -y curl wget ca-certificates podman uidmap slirp4netns iptables -qq + +echo "[2/5] Configuring Podman..." +loginctl enable-linger root + +echo "[3/5] Downloading UniFi OS Server installer..." +cd /root +curl -fsSL "UNIFI_URL" -o unifi-installer.bin +chmod +x unifi-installer.bin + +echo "[4/5] Installing UniFi OS Server (this takes 3-5 minutes)..." +./unifi-installer.bin install + +echo "[5/5] Starting UniFi OS Server..." +sleep 15 + +if systemctl list-unit-files | grep -q unifi-os-server; then + systemctl enable unifi-os-server + systemctl start unifi-os-server + sleep 10 + + if systemctl is-active --quiet unifi-os-server; then + echo "✓ UniFi OS Server is running" + else + echo "⚠ Service status:" + systemctl status unifi-os-server --no-pager || true + fi +fi + +echo "Installation completed!" +EOFINSTALL + ) + + # Replace URL placeholder + INSTALL_SCRIPT="${INSTALL_SCRIPT//UNIFI_URL/$UOS_URL}" + + # Execute installation via SSH (with output streaming) + if sshpass -p "${CLOUDINIT_PASSWORD}" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ + "${CLOUDINIT_USER:-root}@${VM_IP}" "bash -s" <<<"$INSTALL_SCRIPT" 2>&1 | while IFS= read -r line; do + echo -e "${TAB}${DGN}${line}${CL}" + done; then + msg_ok "UniFi OS Server installed successfully" + else + msg_error "Installation failed" + echo -e "${TAB}${INFO}${YW}Check logs: ${BL}ssh ${CLOUDINIT_USER:-root}@${VM_IP}${CL}" + exit 1 + fi + + # Wait for UniFi OS web interface + msg_info "Waiting for UniFi OS web interface (port 11443)" + PORT_OPEN=0 + for i in {1..60}; do + if timeout 2 bash -c ">/dev/tcp/${VM_IP}/11443" 2>/dev/null; then + PORT_OPEN=1 + msg_ok "UniFi OS Server web interface is ready" + break + fi + sleep 2 + done + + echo "" + if [ $PORT_OPEN -eq 1 ]; then + echo -e "${TAB}${GATEWAY}${BOLD}${GN}✓ UniFi OS Server is ready!${CL}" + echo -e "${TAB}${GATEWAY}${BOLD}${GN}✓ Access at: ${BGN}https://${VM_IP}:11443${CL}" + else + echo -e "${TAB}${INFO}${YW}UniFi OS is installed but web interface not yet available${CL}" + echo -e "${TAB}${INFO}${YW}Access at: ${BGN}https://${VM_IP}:11443${CL} ${YW}(may take 1-2 more minutes)${CL}" + fi + + echo -e "${TAB}${INFO}${DGN}SSH Access: ${BL}ssh ${CLOUDINIT_USER:-root}@${VM_IP}${CL}" + echo -e "${TAB}${INFO}${DGN}Password: ${BGN}${CLOUDINIT_PASSWORD}${CL}" + echo "" fi post_update_to_api "done" "none" From e33a70571069dcd0d5dd2bc160ace6ed9c8fa9de Mon Sep 17 00:00:00 2001 From: vhsdream Date: Sat, 20 Dec 2025 08:42:45 -0500 Subject: [PATCH 3/6] OpenCloud: bump to v4.1.0 --- ct/opencloud.sh | 2 +- install/opencloud-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/opencloud.sh b/ct/opencloud.sh index 78aadba47..acd52b37d 100644 --- a/ct/opencloud.sh +++ b/ct/opencloud.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - RELEASE="v4.0.0" + RELEASE="v4.1.0" if check_for_gh_release "opencloud" "opencloud-eu/opencloud" "${RELEASE}"; then msg_info "Stopping services" systemctl stop opencloud opencloud-wopi diff --git a/install/opencloud-install.sh b/install/opencloud-install.sh index 92b4e55c8..4e406c6f8 100644 --- a/install/opencloud-install.sh +++ b/install/opencloud-install.sh @@ -57,7 +57,7 @@ echo "$COOLPASS" >~/.coolpass msg_ok "Installed Collabora Online" # OpenCloud -fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v4.0.0" "/usr/bin" "opencloud-*-linux-amd64" +fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v4.1.0" "/usr/bin" "opencloud-*-linux-amd64" msg_info "Configuring OpenCloud" DATA_DIR="/var/lib/opencloud/" From 9ed0d3b9bc921e0f70afe088e668c3f7daf125c7 Mon Sep 17 00:00:00 2001 From: vhsdream Date: Sat, 20 Dec 2025 08:46:08 -0500 Subject: [PATCH 4/6] nextExplorer: add new OIDC env var --- install/nextexplorer-install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/install/nextexplorer-install.sh b/install/nextexplorer-install.sh index a1f15a7d7..d39598f18 100644 --- a/install/nextexplorer-install.sh +++ b/install/nextexplorer-install.sh @@ -79,6 +79,7 @@ SESSION_SECRET="${SECRET}" # OIDC_CLIENT_SECRET= # OIDC_CALLBACK_URL= # OIDC_SCOPES= +# OIDC_AUTO_CREATE_USERS=true # SEARCH_DEEP= # SEARCH_RIPGREP= From 15ed608b3f96d3ccfef662eacac851a3bd4df692 Mon Sep 17 00:00:00 2001 From: vhsdream Date: Sat, 20 Dec 2025 08:50:17 -0500 Subject: [PATCH 5/6] OpenCloud: properly update pkgs --- ct/opencloud.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/opencloud.sh b/ct/opencloud.sh index acd52b37d..37396bc75 100644 --- a/ct/opencloud.sh +++ b/ct/opencloud.sh @@ -37,7 +37,7 @@ function update_script() { msg_info "Updating packages" $STD apt-get update - $STD apt-get dist-upgrade + $STD apt-get dist-upgrade -y msg_ok "Updated packages" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-amd64" From 472050a4b5fcd9f93fa8e7f7a0798a96ab026bb7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 21 Dec 2025 08:16:03 +0000 Subject: [PATCH 6/6] Delete pihole-exporter (addon) after migration to ProxmoxVE (#1225) Co-authored-by: github-actions[bot] --- frontend/public/json/pihole-exporter.json | 46 ---- tools/addon/pihole-exporter.sh | 250 ---------------------- 2 files changed, 296 deletions(-) delete mode 100644 frontend/public/json/pihole-exporter.json delete mode 100644 tools/addon/pihole-exporter.sh diff --git a/frontend/public/json/pihole-exporter.json b/frontend/public/json/pihole-exporter.json deleted file mode 100644 index c27945d03..000000000 --- a/frontend/public/json/pihole-exporter.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "Pi-Hole Exporter", - "slug": "pihole-exporter", - "categories": [ - 9 - ], - "date_created": "2025-12-08", - "type": "addon", - "updateable": true, - "privileged": false, - "interface_port": 9617, - "documentation": "https://github.com/eko/pihole-exporter", - "website": "https://github.com/eko/pihole-exporter", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/pi-hole.webp", - "config_path": "/opt/pihole-exporter.env", - "description": "A Prometheus exporter for PI-Hole's Raspberry PI ad blocker", - "install_methods": [ - { - "type": "default", - "script": "tools/addon/pihole-exporter.sh", - "resources": { - "cpu": null, - "ram": null, - "hdd": null, - "os": null, - "version": null - } - }, - { - "type": "alpine", - "script": "tools/addon/pihole-exporter.sh", - "resources": { - "cpu": null, - "ram": null, - "hdd": null, - "os": null, - "version": null - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [] -} diff --git a/tools/addon/pihole-exporter.sh b/tools/addon/pihole-exporter.sh deleted file mode 100644 index 73282c18d..000000000 --- a/tools/addon/pihole-exporter.sh +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2025 community-scripts ORG -# Author: CrazyWolf13 -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/eko/pihole-exporter/ - -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/core.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/error_handler.func) -load_functions - -# Enable error handling -set -Eeuo pipefail -trap 'error_handler' ERR - -# ============================================================================== -# CONFIGURATION -# ============================================================================== -VERBOSE=${var_verbose:-no} -APP="pihole-exporter" -APP_TYPE="tools" -INSTALL_PATH="/opt/pihole-exporter" -CONFIG_PATH="/opt/pihole-exporter.env" -header_info -ensure_usr_local_bin_persist -get_current_ip &>/dev/null - -# ============================================================================== -# OS DETECTION -# ============================================================================== -if [[ -f "/etc/alpine-release" ]]; then - OS="Alpine" - SERVICE_PATH="/etc/init.d/pihole-exporter" -elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then - OS="Debian" - SERVICE_PATH="/etc/systemd/system/pihole-exporter.service" -else - echo -e "${CROSS} Unsupported OS detected. Exiting." - exit 1 -fi - -# ============================================================================== -# UNINSTALL -# ============================================================================== -function uninstall() { - msg_info "Uninstalling Pihole-Exporter" - if [[ "$OS" == "Alpine" ]]; then - rc-service pihole-exporter stop &>/dev/null - rc-update del pihole-exporter &>/dev/null - rm -f "$SERVICE_PATH" - else - systemctl disable -q --now pihole-exporter - rm -f "$SERVICE_PATH" - fi - rm -rf "$INSTALL_PATH" "$CONFIG_PATH" - rm -f "/usr/local/bin/update_pihole-exporter" - rm -f "$HOME/.pihole-exporter" - msg_ok "Pihole-Exporter has been uninstalled" -} - -# ============================================================================== -# UPDATE -# ============================================================================== -function update() { - if check_for_gh_release "pihole-exporter" "eko/pihole-exporter"; then - msg_info "Stopping service" - if [[ "$OS" == "Alpine" ]]; then - rc-service pihole-exporter stop &>/dev/null - else - systemctl stop pihole-exporter - fi - msg_ok "Stopped service" - - fetch_and_deploy_gh_release "pihole-exporter" "eko/pihole-exporter" "tarball" "latest" - setup_go - - msg_info "Building Pihole-Exporter" - cd /opt/pihole-exporter/ - $STD /usr/local/bin/go build -o ./pihole-exporter - msg_ok "Built Pihole-Exporter" - - msg_info "Starting service" - if [[ "$OS" == "Alpine" ]]; then - rc-service pihole-exporter start &>/dev/null - else - systemctl start pihole-exporter - fi - msg_ok "Started service" - msg_ok "Updated successfully" - exit - fi -} - -# ============================================================================== -# INSTALL -# ============================================================================== -function install() { - read -erp "Enter the protocol to use (http/https), default https: " pihole_PROTOCOL - read -erp "Enter the hostname of Pihole, example: (127.0.0.1): " pihole_HOSTNAME - read -erp "Enter the port of Pihole, default 443: " pihole_PORT - read -rsp "Enter Pihole password: " pihole_PASSWORD - printf "\n" - read -erp "Do you want to skip TLS-Verification (if using a self-signed Certificate on Pi-Hole) [y/N]: " SKIP_TLS - if [[ "${SKIP_TLS,,}" =~ ^(y|yes)$ ]]; then - pihole_SKIP_TLS="true" - fi - - fetch_and_deploy_gh_release "pihole-exporter" "eko/pihole-exporter" "tarball" "latest" - setup_go - msg_info "Building Pihole-Exporter on ${OS}" - cd /opt/pihole-exporter/ - $STD /usr/local/bin/go build -o ./pihole-exporter - msg_ok "Built Pihole-Exporter" - - msg_info "Creating configuration" - cat <"$CONFIG_PATH" -# https://github.com/eko/pihole-exporter/?tab=readme-ov-file#available-cli-options -PIHOLE_PASSWORD="${pihole_PASSWORD}" -PIHOLE_HOSTNAME="${pihole_HOSTNAME:-127.0.0.1}" -PIHOLE_PORT="${pihole_PORT:-443}" -SKIP_TLS_VERIFICATION="${pihole_SKIP_TLS:-false}" -PIHOLE_PROTOCOL="${pihole_PROTOCOL:-https}" -EOF - msg_ok "Created configuration" - - msg_info "Creating service" - if [[ "$OS" == "Debian" ]]; then - cat <"$SERVICE_PATH" -[Unit] -Description=pihole-exporter -After=network.target - -[Service] -User=root -WorkingDirectory=/opt/pihole-exporter -EnvironmentFile=$CONFIG_PATH -ExecStart=/opt/pihole-exporter/pihole-exporter -Restart=always - -[Install] -WantedBy=multi-user.target -EOF - systemctl daemon-reload - systemctl enable -q --now pihole-exporter - else - cat <"$SERVICE_PATH" -#!/sbin/openrc-run - -name="pihole-exporter" -description="Pi-hole Exporter for Prometheus" -command="${INSTALL_PATH}/pihole-exporter" -command_background=true -directory="/opt/pihole-exporter" -pidfile="/run/\${RC_SVCNAME}.pid" -output_log="/var/log/pihole-exporter.log" -error_log="/var/log/pihole-exporter.log" - -depend() { - need net - after firewall -} - -start_pre() { - if [ -f "$CONFIG_PATH" ]; then - export \$(grep -v '^#' $CONFIG_PATH | xargs) - fi -} -EOF - chmod +x "$SERVICE_PATH" - $STD rc-update add pihole-exporter default - $STD rc-service pihole-exporter start - fi - msg_ok "Created and started service" - - # Create update script - msg_info "Creating update script" - ensure_usr_local_bin_persist - cat <<'UPDATEEOF' >/usr/local/bin/update_pihole-exporter -#!/usr/bin/env bash -# pihole-exporter Update Script -type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/tools/addon/pihole-exporter.sh)" -UPDATEEOF - chmod +x /usr/local/bin/update_pihole-exporter - msg_ok "Created update script (/usr/local/bin/update_pihole-exporter)" - - echo "" - msg_ok "Pihole-Exporter installed successfully" - msg_ok "Metrics: ${BL}http://${CURRENT_IP}:9617/metrics${CL}" - msg_ok "Config: ${BL}${CONFIG_PATH}${CL}" -} - -# ============================================================================== -# MAIN -# ============================================================================== -header_info -ensure_usr_local_bin_persist -get_current_ip &>/dev/null - -# Handle type=update (called from update script) -if [[ "${type:-}" == "update" ]]; then - if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/pihole-exporter" ]]; then - update - else - msg_error "Pihole-Exporter is not installed. Nothing to update." - exit 1 - fi - exit 0 -fi - -# Check if already installed -if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/pihole-exporter" ]]; then - msg_warn "Pihole-Exporter is already installed." - echo "" - - echo -n "${TAB}Uninstall Pihole-Exporter? (y/N): " - read -r uninstall_prompt - if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then - uninstall - exit 0 - fi - - echo -n "${TAB}Update Pihole-Exporter? (y/N): " - read -r update_prompt - if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then - update - exit 0 - fi - - msg_warn "No action selected. Exiting." - exit 0 -fi - -# Fresh installation -msg_warn "Pihole-Exporter is not installed." -echo "" -echo -e "${TAB}${INFO} This will install:" -echo -e "${TAB} - Pi-hole Exporter (Go binary)" -echo -e "${TAB} - Systemd/OpenRC service" -echo "" - -echo -n "${TAB}Install Pihole-Exporter? (y/N): " -read -r install_prompt -if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then - install -else - msg_warn "Installation cancelled. Exiting." - exit 0 -fi