From e0dd403107250df3a0c6283966d7849c9815bc0c Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 21 Dec 2025 19:55:12 +0100 Subject: [PATCH] nextcloud exporter --- frontend/public/json/nextcloud-exporter.json | 46 ++++ tools/addon/nextcloud-exporter.sh | 258 +++++++++++++++++++ 2 files changed, 304 insertions(+) create mode 100644 frontend/public/json/nextcloud-exporter.json create mode 100644 tools/addon/nextcloud-exporter.sh diff --git a/frontend/public/json/nextcloud-exporter.json b/frontend/public/json/nextcloud-exporter.json new file mode 100644 index 000000000..ed242739f --- /dev/null +++ b/frontend/public/json/nextcloud-exporter.json @@ -0,0 +1,46 @@ +{ + "name": "Nextcloud Exporter", + "slug": "nextcloud-exporter", + "categories": [ + 9 + ], + "date_created": "2025-12-17", + "type": "addon", + "updateable": true, + "privileged": false, + "interface_port": 9025, + "documentation": "https://github.com/xperimental/nextcloud-exporter", + "website": "https://github.com/xperimental/nextcloud-exporter", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/nextcloud.webp", + "config_path": "/opt/nextcloud-exporter.env", + "description": "Prometheus exporter for Nextcloud servers. ", + "install_methods": [ + { + "type": "default", + "script": "tools/addon/nextcloud-exporter.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + }, + { + "type": "alpine", + "script": "tools/addon/nextcloud-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/nextcloud-exporter.sh b/tools/addon/nextcloud-exporter.sh new file mode 100644 index 000000000..1dc457771 --- /dev/null +++ b/tools/addon/nextcloud-exporter.sh @@ -0,0 +1,258 @@ +#!/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/xperimental/nextcloud-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="nextcloud-exporter" +APP_TYPE="tools" +INSTALL_PATH="/opt/nextcloud-exporter" +CONFIG_PATH="/opt/nextcloud-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/nextcloud-exporter" +elif grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then + OS="Debian" + SERVICE_PATH="/etc/systemd/system/nextcloud-exporter.service" +else + echo -e "${CROSS} Unsupported OS detected. Exiting." + exit 1 +fi + +# ============================================================================== +# UNINSTALL +# ============================================================================== +function uninstall() { + msg_info "Uninstalling Nextcloud-Exporter" + if [[ "$OS" == "Alpine" ]]; then + rc-service nextcloud-exporter stop &>/dev/null + rc-update del nextcloud-exporter &>/dev/null + rm -f "$SERVICE_PATH" + else + systemctl disable -q --now nextcloud-exporter + rm -f "$SERVICE_PATH" + fi + rm -rf "$INSTALL_PATH" "$CONFIG_PATH" + rm -f "/usr/local/bin/update_nextcloud-exporter" + rm -f "$HOME/.nextcloud-exporter" + msg_ok "Nextcloud-Exporter has been uninstalled" +} + +# ============================================================================== +# UPDATE +# ============================================================================== +function update() { + if check_for_gh_release "nextcloud-exporter" "xperimental/nextcloud-exporter"; then + msg_info "Stopping service" + if [[ "$OS" == "Alpine" ]]; then + rc-service nextcloud-exporter stop &>/dev/null + else + systemctl stop nextcloud-exporter + fi + msg_ok "Stopped service" + + fetch_and_deploy_gh_release "nextcloud-exporter" "xperimental/nextcloud-exporter" "prebuilt" "latest" "nextcloud-exporter_*_amd64.deb" + setup_go + + msg_info "Starting service" + if [[ "$OS" == "Alpine" ]]; then + rc-service nextcloud-exporter start &>/dev/null + else + systemctl start nextcloud-exporter + fi + msg_ok "Started service" + msg_ok "Updated successfully" + exit + fi +} + +# ============================================================================== +# INSTALL +# ============================================================================== +function install() { + read -erp "Enter URL of Nextcloud, example: (http://127.0.0.1:8080): " NEXTCLOUD_SERVER + read -erp "Enter Nextcloud auth token (press Enter to use username/password instead): " NEXTCLOUD_AUTH_TOKEN + + if [[ -z "$NEXTCLOUD_AUTH_TOKEN" ]]; then + read -erp "Enter Nextcloud username: " NEXTCLOUD_USERNAME + read -rsp "Enter Nextcloud password: " NEXTCLOUD_PASSWORD + printf "\n" + fi + + read -erp "Query additional info for apps? [Y/n]: " QUERY_APPS + if [[ "${QUERY_APPS,,}" =~ ^(n|no)$ ]]; then + NEXTCLOUD_INFO_APPS="false" + fi + + read -erp "Query update information? [Y/n]: " QUERY_UPDATES + if [[ "${QUERY_UPDATES,,}" =~ ^(n|no)$ ]]; then + NEXTCLOUD_INFO_UPDATE="false" + fi + + read -erp "Do you want to skip TLS-Verification (if using a self-signed Certificate on Nextcloud) [y/N]: " SKIP_TLS + if [[ "${SKIP_TLS,,}" =~ ^(y|yes)$ ]]; then + NEXTCLOUD_TLS_SKIP_VERIFY="true" + fi + + fetch_and_deploy_gh_release "nextcloud-exporter" "xperimental/nextcloud-exporter" "prebuilt" "latest" "nextcloud-exporter_*_amd64.deb" + setup_go + + msg_info "Creating configuration" + cat <"$CONFIG_PATH" +# https://github.com/xperimental/nextcloud-exporter +NEXTCLOUD_SERVER="${NEXTCLOUD_SERVER}" +NEXTCLOUD_AUTH_TOKEN="${NEXTCLOUD_AUTH_TOKEN}" +NEXTCLOUD_USERNAME="${NEXTCLOUD_USERNAME}" +NEXTCLOUD_PASSWORD="${NEXTCLOUD_PASSWORD}" +NEXTCLOUD_INFO_UPDATE=${NEXTCLOUD_INFO_UPDATE:-"true"} +NEXTCLOUD_INFO_APPS=${NEXTCLOUD_INFO_APPS:-"true"} +NEXTCLOUD_TLS_SKIP_VERIFY=${NEXTCLOUD_TLS_SKIP_VERIFY:-"false"} +NEXTCLOUD_LISTEN_ADDRESS=":9205" +EOF + msg_ok "Created configuration" + + msg_info "Creating service" + if [[ "$OS" == "Debian" ]]; then + cat <"$SERVICE_PATH" +[Unit] +Description=nextcloud-exporter +After=network.target + +[Service] +User=root +WorkingDirectory=/opt/nextcloud-exporter +EnvironmentFile=$CONFIG_PATH +ExecStart=/opt/nextcloud-exporter/nextcloud-exporter +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + systemctl daemon-reload + systemctl enable -q --now nextcloud-exporter + else + cat <"$SERVICE_PATH" +#!/sbin/openrc-run + +name="nextcloud-exporter" +description="Nextcloud Exporter for Prometheus" +command="${INSTALL_PATH}/nextcloud-exporter" +command_background=true +directory="/opt/nextcloud-exporter" +pidfile="/run/\${RC_SVCNAME}.pid" +output_log="/var/log/nextcloud-exporter.log" +error_log="/var/log/nextcloud-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 nextcloud-exporter default + $STD rc-service nextcloud-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_nextcloud-exporter +#!/usr/bin/env bash +# nextcloud-exporter Update Script +type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/tools/addon/nextcloud-exporter.sh)" +UPDATEEOF + chmod +x /usr/local/bin/update_nextcloud-exporter + msg_ok "Created update script (/usr/local/bin/update_nextcloud-exporter)" + + echo "" + msg_ok "Nextcloud-Exporter installed successfully" + msg_ok "Metrics: ${BL}http://${CURRENT_IP}:9205/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/nextcloud-exporter" ]]; then + update + else + msg_error "Nextcloud-Exporter is not installed. Nothing to update." + exit 1 + fi + exit 0 +fi + +# Check if already installed +if [[ -d "$INSTALL_PATH" && -f "$INSTALL_PATH/nextcloud-exporter" ]]; then + msg_warn "Nextcloud-Exporter is already installed." + echo "" + + echo -n "${TAB}Uninstall Nextcloud-Exporter? (y/N): " + read -r uninstall_prompt + if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then + uninstall + exit 0 + fi + + echo -n "${TAB}Update Nextcloud-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 "Nextcloud-Exporter is not installed." +echo "" +echo -e "${TAB}${INFO} This will install:" +echo -e "${TAB} - Nextcloud Exporter (Go binary)" +echo -e "${TAB} - Systemd/OpenRC service" +echo "" + +echo -n "${TAB}Install Nextcloud-Exporter? (y/N): " +read -r install_prompt +if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then + install +else + msg_warn "Installation cancelled. Exiting." + exit 0 +fi