diff --git a/CHANGELOG.md b/CHANGELOG.md index 417b1fbe3..677fcb368 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,12 +14,83 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-05-15 + +## 2025-05-14 + +### 🆕 New Scripts + + - odoo ([#4477](https://github.com/community-scripts/ProxmoxVE/pull/4477)) +- asterisk ([#4468](https://github.com/community-scripts/ProxmoxVE/pull/4468)) + +### 🚀 Updated Scripts + + - fix: fetch_release_and_deploy function [@CrazyWolf13](https://github.com/CrazyWolf13) ([#4478](https://github.com/community-scripts/ProxmoxVE/pull/4478)) +- Website: re-add documenso & some little bugfixes [@MickLesk](https://github.com/MickLesk) ([#4456](https://github.com/community-scripts/ProxmoxVE/pull/4456)) + + - #### 🐞 Bug Fixes + + - Add make installation dependency to Actual Budget script [@maciejmatczak](https://github.com/maciejmatczak) ([#4485](https://github.com/community-scripts/ProxmoxVE/pull/4485)) + - Bookstack: fix copy of themes/uploads/storage [@MickLesk](https://github.com/MickLesk) ([#4457](https://github.com/community-scripts/ProxmoxVE/pull/4457)) + - Alpine-Rclone: Fix location of passwords file [@tremor021](https://github.com/tremor021) ([#4465](https://github.com/community-scripts/ProxmoxVE/pull/4465)) + + - #### ✨ New Features + + - monitor-all: improvements - tag based filtering [@grizmin](https://github.com/grizmin) ([#4437](https://github.com/community-scripts/ProxmoxVE/pull/4437)) + +### 🧰 Maintenance + + - #### 📂 Github + + - Add Github app for auto PR merge [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4461](https://github.com/community-scripts/ProxmoxVE/pull/4461)) + +## 2025-05-13 + +### 🆕 New Scripts + + - gatus ([#4443](https://github.com/community-scripts/ProxmoxVE/pull/4443)) +- alpine-gatus ([#4442](https://github.com/community-scripts/ProxmoxVE/pull/4442)) + +### 🚀 Updated Scripts + + - update some improvements from dev (tools.func) [@MickLesk](https://github.com/MickLesk) ([#4430](https://github.com/community-scripts/ProxmoxVE/pull/4430)) + + - #### 🐞 Bug Fixes + + - openhab: use zulu17-jdk [@moodyblue](https://github.com/moodyblue) ([#4438](https://github.com/community-scripts/ProxmoxVE/pull/4438)) + + - #### 🔧 Refactor + + - openhab. correct some typos [@moodyblue](https://github.com/moodyblue) ([#4448](https://github.com/community-scripts/ProxmoxVE/pull/4448)) + +### 🧰 Maintenance + + - #### 💾 Core + + - fix: improve bridge detection in all network interface configuration files [@filippolauria](https://github.com/filippolauria) ([#4413](https://github.com/community-scripts/ProxmoxVE/pull/4413)) + +### 🌐 Website + + - #### 📝 Script Information + + - Jellyfin Media Server: Update configuration path [@tremor021](https://github.com/tremor021) ([#4434](https://github.com/community-scripts/ProxmoxVE/pull/4434)) + - Pingvin Share: Added explanation on how to add/edit environment variables [@tremor021](https://github.com/tremor021) ([#4432](https://github.com/community-scripts/ProxmoxVE/pull/4432)) + - pingvin.json: fix typo [@warmbo](https://github.com/warmbo) ([#4426](https://github.com/community-scripts/ProxmoxVE/pull/4426)) + ## 2025-05-12 +### 🆕 New Scripts + + - Alpine-Traefik [@MickLesk](https://github.com/MickLesk) ([#4412](https://github.com/community-scripts/ProxmoxVE/pull/4412)) + ### 🚀 Updated Scripts - Alpine: Use onliner for updates [@tremor021](https://github.com/tremor021) ([#4414](https://github.com/community-scripts/ProxmoxVE/pull/4414)) + - #### 🐞 Bug Fixes + + - homarr: fetch versions dynamically from source repo [@CrazyWolf13](https://github.com/CrazyWolf13) ([#4409](https://github.com/community-scripts/ProxmoxVE/pull/4409)) + - #### ✨ New Features - Feature: LXC-Delete (pve helper): add "all items" [@MickLesk](https://github.com/MickLesk) ([#4296](https://github.com/community-scripts/ProxmoxVE/pull/4296)) diff --git a/ct/alpine-gatus.sh b/ct/alpine-gatus.sh new file mode 100644 index 000000000..abbbc6f54 --- /dev/null +++ b/ct/alpine-gatus.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/TwiN/gatus + +APP="Alpine-gatus" +var_tags="${var_tags:-alpine;monitoring}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-3}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.21}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + + if [[ ! -d /opt/gatus ]]; then + msg_error "No ${APP} Installation Found!" + exit 1 + fi + RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [ "${RELEASE}" != "$(cat /opt/gatus_version.txt)" ] || [ ! -f /opt/gatus_version.txt ]; then + msg_info "Updating ${APP} LXC" + $STD apk -U upgrade + $STD service gatus stop + mv /opt/gatus/config/config.yaml /opt + rm -rf /opt/gatus/* + temp_file=$(mktemp) + curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar zxf "$temp_file" --strip-components=1 -C /opt/gatus + cd /opt/gatus + $STD go mod tidy + CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus . + setcap CAP_NET_RAW+ep gatus + mv /opt/config.yaml config + rm -f "$temp_file" + echo "${RELEASE}" >/opt/gatus_version.txt + $STD service gatus start + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + + exit 0 +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following IP:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/alpine-rclone.sh b/ct/alpine-rclone.sh index 1cfd569c9..e2301c2fd 100644 --- a/ct/alpine-rclone.sh +++ b/ct/alpine-rclone.sh @@ -28,7 +28,6 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit 1 fi - RELEASE=$(curl -s https://api.github.com/repos/rclone/rclone/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') if [ "${RELEASE}" != "$(cat /opt/rclone_version.txt)" ] || [ ! -f /opt/rclone_version.txt ]; then msg_info "Updating ${APP} LXC" diff --git a/ct/alpine-traefik.sh b/ct/alpine-traefik.sh new file mode 100644 index 000000000..f0e312a31 --- /dev/null +++ b/ct/alpine-traefik.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://alpinelinux.org/ + +APP="Alpine-Traefik" +var_tags="${var_tags:-os;alpine}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-1}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.21}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + msg_info "Updating Alpine Packages" + $STD apk -U upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Upgrading traefik from edge" + $STD apk add traefik --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community + msg_ok "Upgraded traefik" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} WebUI Access (if configured) - using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/dashboard${CL}" diff --git a/ct/asterisk.sh b/ct/asterisk.sh new file mode 100644 index 000000000..40fdb64fe --- /dev/null +++ b/ct/asterisk.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: michelroegl-brunner +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://asterisk.org/ + +APP="Asterisk" +var_tags="${var_tags:-telephone;pbx}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + msg_error "No Update function provided for ${APP} LXC" + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" diff --git a/ct/bookstack.sh b/ct/bookstack.sh index 40ff8f808..0388ddf5d 100644 --- a/ct/bookstack.sh +++ b/ct/bookstack.sh @@ -39,9 +39,9 @@ function update_script() { unzip -q "/opt/BookStack-${RELEASE}.zip" -d /opt mv "/opt/BookStack-${RELEASE}" /opt/bookstack cp /opt/bookstack-backup/.env /opt/bookstack/.env - cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ || true - cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ || true - cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ || true + [[ -d /opt/bookstack-backup/public/uploads ]] && cp -a /opt/bookstack-backup/public/uploads/. /opt/bookstack/public/uploads/ + [[ -d /opt/bookstack-backup/storage/uploads ]] && cp -a /opt/bookstack-backup/storage/uploads/. /opt/bookstack/storage/uploads/ + [[ -d /opt/bookstack-backup/themes ]] && cp -a /opt/bookstack-backup/themes/. /opt/bookstack/themes/ cd /opt/bookstack export COMPOSER_ALLOW_SUPERUSER=1 $STD composer install --no-dev diff --git a/ct/gatus.sh b/ct/gatus.sh new file mode 100644 index 000000000..ee361ba17 --- /dev/null +++ b/ct/gatus.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/TwiN/gatus + +APP="gatus" +var_tags="${var_tags:-monitoring}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/gatus ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Updating $APP" + + msg_info "Stopping $APP" + systemctl stop gatus + msg_ok "Stopped $APP" + + msg_info "Updating $APP to v${RELEASE}" + mv /opt/gatus/config/config.yaml /opt + rm -rf /opt/gatus/* + temp_file=$(mktemp) + curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" + tar zxf "$temp_file" --strip-components=1 -C /opt/gatus + cd /opt/gatus + $STD go mod tidy + CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus . + setcap CAP_NET_RAW+ep gatus + mv /opt/config.yaml config + echo "${RELEASE}" >/opt/${APP}_version.txt + msg_ok "Updated $APP to v${RELEASE}" + + msg_info "Starting $APP" + systemctl start gatus + msg_ok "Started $APP" + + msg_info "Cleaning Up" + rm -f "$temp_file" + msg_ok "Cleanup Completed" + + msg_ok "Update Successful" + else + msg_ok "No update required. ${APP} is already at v${RELEASE}" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/headers/alpine-gatus b/ct/headers/alpine-gatus new file mode 100644 index 000000000..0eb5bc4e4 --- /dev/null +++ b/ct/headers/alpine-gatus @@ -0,0 +1,6 @@ + ___ __ _ __ + / | / /___ (_)___ ___ ____ _____ _/ /___ _______ + / /| | / / __ \/ / __ \/ _ \______/ __ `/ __ `/ __/ / / / ___/ + / ___ |/ / /_/ / / / / / __/_____/ /_/ / /_/ / /_/ /_/ (__ ) +/_/ |_/_/ .___/_/_/ /_/\___/ \__, /\__,_/\__/\__,_/____/ + /_/ /____/ diff --git a/ct/headers/alpine-traefik b/ct/headers/alpine-traefik new file mode 100644 index 000000000..0c2f2996c --- /dev/null +++ b/ct/headers/alpine-traefik @@ -0,0 +1,6 @@ + ___ __ _ ______ _____ __ + / | / /___ (_)___ ___ /_ __/________ ____ / __(_) /__ + / /| | / / __ \/ / __ \/ _ \______/ / / ___/ __ `/ _ \/ /_/ / //_/ + / ___ |/ / /_/ / / / / / __/_____/ / / / / /_/ / __/ __/ / ,< +/_/ |_/_/ .___/_/_/ /_/\___/ /_/ /_/ \__,_/\___/_/ /_/_/|_| + /_/ diff --git a/ct/headers/asterisk b/ct/headers/asterisk new file mode 100644 index 000000000..ed4356862 --- /dev/null +++ b/ct/headers/asterisk @@ -0,0 +1,6 @@ + ___ __ _ __ + / | _____/ /____ _____(_)____/ /__ + / /| | / ___/ __/ _ \/ ___/ / ___/ //_/ + / ___ |(__ ) /_/ __/ / / (__ ) ,< +/_/ |_/____/\__/\___/_/ /_/____/_/|_| + diff --git a/ct/headers/gatus b/ct/headers/gatus new file mode 100644 index 000000000..42caf9c6b --- /dev/null +++ b/ct/headers/gatus @@ -0,0 +1,6 @@ + __ + ____ _____ _/ /___ _______ + / __ `/ __ `/ __/ / / / ___/ + / /_/ / /_/ / /_/ /_/ (__ ) + \__, /\__,_/\__/\__,_/____/ +/____/ diff --git a/ct/headers/homarr b/ct/headers/homarr index 1bd7a939e..99bf5100f 100644 --- a/ct/headers/homarr +++ b/ct/headers/homarr @@ -1,6 +1,6 @@ - __ __ - / / / /___ ____ ___ ____ ___________ - / /_/ / __ \/ __ `__ \/ __ `/ ___/ ___/ - / __ / /_/ / / / / / / /_/ / / / / + __ + / /_ ____ ____ ___ ____ ___________ + / __ \/ __ \/ __ `__ \/ __ `/ ___/ ___/ + / / / / /_/ / / / / / / /_/ / / / / /_/ /_/\____/_/ /_/ /_/\__,_/_/ /_/ diff --git a/ct/headers/odoo b/ct/headers/odoo new file mode 100644 index 000000000..e375aea1d --- /dev/null +++ b/ct/headers/odoo @@ -0,0 +1,6 @@ + ____ __ + / __ \____/ /___ ____ + / / / / __ / __ \/ __ \ +/ /_/ / /_/ / /_/ / /_/ / +\____/\__,_/\____/\____/ + diff --git a/ct/homarr.sh b/ct/homarr.sh index a1380610c..4b75b9afe 100644 --- a/ct/homarr.sh +++ b/ct/homarr.sh @@ -5,7 +5,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/mis # License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE # Source: https://homarr.dev/ -APP="Homarr" +APP="homarr" var_tags="${var_tags:-arr;dashboard}" var_cpu="${var_cpu:-2}" var_ram="${var_ram:-4096}" @@ -117,11 +117,12 @@ node apps/nextjs/server.js & PID=$! wait $PID EOF chmod +x /opt/run_homarr.sh -curl -fsSL "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip") - unzip -q v${RELEASE}.zip - rm -rf v${RELEASE}.zip + $STD command -v jq || $STD apt-get update && $STD apt-get install -y jq + NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]') + NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.packageManager | split("@")[1]')" + install_node_and_modules rm -rf /opt/homarr - mv homarr-${RELEASE} /opt/homarr + fetch_and_deploy_gh_release "homarr-labs/homarr" mv /opt/homarr-data-backup/.env /opt/homarr/.env cd /opt/homarr $STD pnpm install diff --git a/ct/odoo.sh b/ct/odoo.sh new file mode 100644 index 000000000..0451c9478 --- /dev/null +++ b/ct/odoo.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/odoo/odoo + +APP="Odoo" +var_tags="${var_tags:-erp}" +var_disk="${var_disk:-6}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /etc/odoo/odoo.conf ]]; then + msg_error "No ${APP} Installation Found!" + exit 1 + fi + RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1) + LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" | + grep -oP "odoo_${RELEASE}\.\d+_all\.deb" | + sed -E "s/odoo_(${RELEASE}\.[0-9]+)_all\.deb/\1/" | + sort -V | + tail -n1) + + if [[ "${LATEST_VERSION}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then + msg_info "Stopping ${APP} service" + systemctl stop odoo + msg_ok "Stopped ${APP}" + + msg_info "Updating ${APP} to ${LATEST_VERSION}" + curl -fsSL https://nightly.odoo.com/${RELEASE}/nightly/deb/odoo_${RELEASE}.latest_all.deb -o /opt/odoo.deb + $STD apt install -y /opt/odoo.deb + echo "$LATEST_VERSION" >/opt/${APP}_version.txt + msg_ok "Updated ${APP} to ${LATEST_VERSION}" + + msg_info "Starting ${APP} service" + systemctl start odoo + msg_ok "Started ${APP}" + + msg_info "Cleaning Up" + rm -f /opt/odoo.deb + msg_ok "Cleaned" + + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${LATEST_VERSION}" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8069${CL}" diff --git a/frontend/public/json/alpine-rclone.json b/frontend/public/json/alpine-rclone.json index 9defea694..7bdc79a37 100644 --- a/frontend/public/json/alpine-rclone.json +++ b/frontend/public/json/alpine-rclone.json @@ -49,7 +49,7 @@ }, { "type": "info", - "text": "`htpasswd -b -B /opt/rclone/login.pwd newuser newuserpassword` to add more users." + "text": "`htpasswd -b -B /opt/login.pwd newuser newuserpassword` to add more users." } ] } diff --git a/frontend/public/json/asterisk.json b/frontend/public/json/asterisk.json new file mode 100644 index 000000000..dc27574f2 --- /dev/null +++ b/frontend/public/json/asterisk.json @@ -0,0 +1,33 @@ +{ + "name": "Asterisk", + "slug": "asterisk", + "categories": [0], + "date_created": "2025-05-14", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": null, + "documentation": "https://docs.asterisk.org/", + "config_path": "/etc/asterisk", + "website": "https://asterisk.org/", + "logo": "https://docs.asterisk.org/favicon.ico", + "description": "Asterisk is an open-source framework for building communications applications, most commonly used as a phone system (PBX). Developed by Digium (now part of Sangoma), it turns a standard computer into a powerful telephony server.", + "install_methods": [ + { + "type": "default", + "script": "ct/asterisk.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 4, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/documenso.json b/frontend/public/json/documenso.json new file mode 100644 index 000000000..98e6fdd51 --- /dev/null +++ b/frontend/public/json/documenso.json @@ -0,0 +1,35 @@ +{ + "name": "Documenso", + "slug": "documenso", + "categories": [ + 12 + ], + "date_created": "2025-05-14", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://documenso.com/", + "website": "https://documenso.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/documenso.svg", + "config_path": "/opt/documenso/.env", + "description": "Signing documents digitally should be fast and easy and should be the best practice for every document signed worldwide. This is technically quite easy today, but it also introduces a new party to every signature: The signing tool providers. While this is not a problem in itself, it should make us think about how we want these providers of trust to work. Documenso aims to be the world's most trusted document-signing tool. This trust is built by empowering you to self-host Documenso and review how it works under the hood.", + "install_methods": [ + { + "type": "default", + "script": "ct/documenso.sh", + "resources": { + "cpu": 4, + "ram": 6144, + "hdd": 10, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "helper-scripts@local.com", + "password": "helper-scripts" + }, + "notes": [] +} diff --git a/frontend/public/json/gatus.json b/frontend/public/json/gatus.json new file mode 100644 index 000000000..35f8e9b84 --- /dev/null +++ b/frontend/public/json/gatus.json @@ -0,0 +1,46 @@ +{ + "name": "gatus", + "slug": "gatus", + "categories": [ + 9 + ], + "date_created": "2025-05-13", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://gatus.io/docs", + "website": "https://gatus.io/", + "logo": "https://raw.githubusercontent.com/TwiN/gatus/refs/heads/master/web/static/img/logo.svg", + "config_path": "/opt/gatus/config/config.yaml", + "description": "Gatus is a developer-oriented health dashboard that gives you the ability to monitor your services using HTTP, ICMP, TCP, and even DNS queries as well as evaluate the result of said queries by using a list of conditions on values like the status code, the response time, the certificate expiration, the body and many others. The icing on top is that each of these health checks can be paired with alerting via Slack, Teams, PagerDuty, Discord, Twilio and many more.", + "install_methods": [ + { + "type": "default", + "script": "ct/gatus.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + }, + { + "type": "alpine", + "script": "ct/alpine-gatus.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 3, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/homeassistant-core.json b/frontend/public/json/homeassistant-core.json index c4c05e241..f157c0385 100644 --- a/frontend/public/json/homeassistant-core.json +++ b/frontend/public/json/homeassistant-core.json @@ -41,7 +41,7 @@ "type": "warning" }, { - "text": "Use Ubuntu 24.10 ONLY", + "text": "Deprecation-Warning: This Core-based setup will be deprecated by August 2025. Use Home Assistant OS is strongly recommended to ensure long-term stability and updates.", "type": "warning" }, { diff --git a/frontend/public/json/jellyfin.json b/frontend/public/json/jellyfin.json index aa0f2854d..71e4f5be0 100644 --- a/frontend/public/json/jellyfin.json +++ b/frontend/public/json/jellyfin.json @@ -12,7 +12,7 @@ "documentation": "https://jellyfin.org/docs/", "website": "https://jellyfin.org/", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/jellyfin.svg", - "config_path": "/root/.config/jellyfin", + "config_path": "/etc/jellyfin/", "description": "Jellyfin is a free and open-source media server and suite of multimedia applications designed to organize, manage, and share digital media files to networked devices.", "install_methods": [ { diff --git a/frontend/public/json/odoo.json b/frontend/public/json/odoo.json new file mode 100644 index 000000000..3c1180456 --- /dev/null +++ b/frontend/public/json/odoo.json @@ -0,0 +1,40 @@ +{ + "name": "Odoo", + "slug": "odoo", + "categories": [ + 25 + ], + "date_created": "2025-05-14", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8069, + "documentation": "https://www.odoo.com/en_EN/page/docs", + "website": "https://www.odoo.com/", + "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/odoo.svg", + "config_path": "/etc/odoo/odoo.conf", + "description": "Odoo is a comprehensive open-source business platform made up of modular apps that cover key areas such as CRM, accounting, inventory, sales, project management, HR, helpdesk, and e-commerce. All modules are tightly integrated, allowing businesses to fully digitize and automate their workflows. Its modular design makes it suitable for both small companies and large enterprises, with flexibility to adapt to different industries. Odoo combines user-friendliness with powerful functionality, offering a unified solution for managing a wide range of business operations.", + "install_methods": [ + { + "type": "default", + "script": "ct/odoo.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 6, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [ + { + "text": "Database Credentials: `cat ~/odoo.creds`", + "type": "info" + } + ] +} diff --git a/frontend/public/json/pingvin.json b/frontend/public/json/pingvin.json index 872c815e0..0f6002dc8 100644 --- a/frontend/public/json/pingvin.json +++ b/frontend/public/json/pingvin.json @@ -12,7 +12,7 @@ "documentation": "https://stonith404.github.io/pingvin-share/introduction", "website": "https://github.com/stonith404/pingvin-share", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pingvin-share.svg", - "config_path": "/opt/pingin-share/config.yaml", + "config_path": "/opt/pingvin-share/config.yaml", "description": "Pingvin Share is self-hosted file sharing platform and an alternative for WeTransfer.", "install_methods": [ { @@ -31,5 +31,10 @@ "username": null, "password": null }, - "notes": [] + "notes": [ + { + "text": "Run `DATA_DIRECTORY=path-to-your-data-directory pm2 restart all --update-env` to update path to your data directory or to update environment variables.", + "type": "info" + } + ] } diff --git a/frontend/public/json/traefik.json b/frontend/public/json/traefik.json index 5655a98a2..c62f08e6f 100644 --- a/frontend/public/json/traefik.json +++ b/frontend/public/json/traefik.json @@ -25,6 +25,17 @@ "os": "debian", "version": "12" } + }, + { + "type": "alpine", + "script": "ct/alpine-traefik.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } } ], "default_credentials": { diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 772f7699a..f3b22aedc 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,19 +1,229 @@ [ { - "name": "mattermost/mattermost", - "version": "v10.7.2", - "date": "2025-05-12T10:42:32Z" + "name": "advplyr/audiobookshelf", + "version": "v2.22.0", + "date": "2025-05-14T22:30:59Z" }, { - "name": "VictoriaMetrics/VictoriaMetrics", - "version": "v1.102.20", - "date": "2025-05-12T10:23:03Z" + "name": "glanceapp/glance", + "version": "v0.8.2", + "date": "2025-05-14T21:34:41Z" + }, + { + "name": "Ombi-app/Ombi", + "version": "v4.47.1", + "date": "2025-01-05T21:14:23Z" + }, + { + "name": "Luligu/matterbridge", + "version": "3.0.2", + "date": "2025-05-14T20:38:06Z" + }, + { + "name": "NodeBB/NodeBB", + "version": "v4.4.0", + "date": "2025-05-14T20:36:37Z" + }, + { + "name": "esphome/esphome", + "version": "2025.4.2", + "date": "2025-05-11T22:18:43Z" + }, + { + "name": "coder/code-server", + "version": "v4.100.1", + "date": "2025-05-14T18:08:16Z" + }, + { + "name": "MediaBrowser/Emby.Releases", + "version": "4.8.11.0", + "date": "2025-03-10T06:39:11Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.3.0p32+security", + "date": "2025-05-14T15:37:55Z" + }, + { + "name": "Athou/commafeed", + "version": "5.9.0", + "date": "2025-05-14T15:29:48Z" + }, + { + "name": "juanfont/headscale", + "version": "v0.26.0", + "date": "2025-05-14T15:12:14Z" + }, + { + "name": "mongodb/mongo", + "version": "r6.0.24-alpha0", + "date": "2025-05-14T14:52:41Z" + }, + { + "name": "motioneye-project/motioneye", + "version": "0.42.1", + "date": "2020-06-07T07:27:04Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v10.5.0", + "date": "2025-05-14T13:21:21Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "v6.2.12", + "date": "2025-04-20T19:22:17Z" + }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.510", + "date": "2025-05-13T18:33:42Z" }, { "name": "nzbgetcom/nzbget", "version": "v25.0", "date": "2025-05-12T09:12:04Z" }, + { + "name": "wazuh/wazuh", + "version": "coverity-w20-4.13.0", + "date": "2025-05-14T12:06:20Z" + }, + { + "name": "blakeblackshear/frigate", + "version": "v0.14.1", + "date": "2024-08-29T22:32:51Z" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.2", + "date": "2025-05-11T16:40:55Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.1895", + "date": "2025-05-14T05:59:00Z" + }, + { + "name": "TandoorRecipes/recipes", + "version": "2.0.0-alpha-4", + "date": "2025-05-14T05:01:45Z" + }, + { + "name": "ollama/ollama", + "version": "v0.6.9-rc0", + "date": "2025-05-10T18:57:30Z" + }, + { + "name": "cross-seed/cross-seed", + "version": "v6.12.4", + "date": "2025-05-11T11:41:32Z" + }, + { + "name": "netbox-community/netbox", + "version": "v4.3.1", + "date": "2025-05-13T19:45:00Z" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.28.1", + "date": "2025-05-13T18:45:47Z" + }, + { + "name": "keycloak/keycloak", + "version": "26.2.4", + "date": "2025-05-08T09:10:10Z" + }, + { + "name": "OctoPrint/OctoPrint", + "version": "1.11.1", + "date": "2025-05-13T13:32:07Z" + }, + { + "name": "redis/redis", + "version": "8.0.1", + "date": "2025-05-13T13:31:53Z" + }, + { + "name": "theonedev/onedev", + "version": "v11.9.6", + "date": "2025-05-13T12:16:17Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.129.0", + "date": "2025-05-06T12:28:54Z" + }, + { + "name": "zabbix/zabbix", + "version": "7.2.7rc1", + "date": "2025-05-13T11:55:32Z" + }, + { + "name": "Graylog2/graylog2-server", + "version": "6.3.0-alpha.4", + "date": "2025-05-13T11:18:29Z" + }, + { + "name": "zitadel/zitadel", + "version": "v2.65.9", + "date": "2025-05-13T05:14:39Z" + }, + { + "name": "go-gitea/gitea", + "version": "v1.23.8", + "date": "2025-05-12T22:40:50Z" + }, + { + "name": "leiweibau/Pi.Alert", + "version": "v2025-05-11", + "date": "2025-05-12T19:14:57Z" + }, + { + "name": "duplicati/duplicati", + "version": "v2.1.0.118-2.1.0.118_canary_2025-05-12", + "date": "2025-05-12T18:50:44Z" + }, + { + "name": "runtipi/runtipi", + "version": "nightly", + "date": "2025-05-12T18:39:33Z" + }, + { + "name": "neo4j/neo4j", + "version": "4.4.43", + "date": "2025-05-12T15:33:17Z" + }, + { + "name": "usememos/memos", + "version": "v0.24.3", + "date": "2025-05-12T15:23:21Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.91.3", + "date": "2025-05-08T12:25:10Z" + }, + { + "name": "Paymenter/Paymenter", + "version": "v1.1.0", + "date": "2025-05-12T14:40:27Z" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "pmm-6401-v1.117.0", + "date": "2025-05-12T13:24:20Z" + }, + { + "name": "apache/tika", + "version": "3.2.0-rc1", + "date": "2025-05-12T13:06:47Z" + }, + { + "name": "mattermost/mattermost", + "version": "v10.7.2", + "date": "2025-05-12T10:42:32Z" + }, { "name": "dgtlmoon/changedetection.io", "version": "0.49.17", @@ -24,36 +234,11 @@ "version": "1.0.0", "date": "2025-05-12T07:39:23Z" }, - { - "name": "firefly-iii/firefly-iii", - "version": "v6.2.12", - "date": "2025-04-20T19:22:17Z" - }, { "name": "umami-software/umami", "version": "v2.18.1", "date": "2025-05-12T07:16:12Z" }, - { - "name": "runtipi/runtipi", - "version": "v4.1.0", - "date": "2025-05-12T07:13:15Z" - }, - { - "name": "Jackett/Jackett", - "version": "v0.22.1891", - "date": "2025-05-12T05:53:07Z" - }, - { - "name": "esphome/esphome", - "version": "2025.4.2", - "date": "2025-05-11T22:18:43Z" - }, - { - "name": "morpheus65535/bazarr", - "version": "v1.5.2", - "date": "2025-05-11T16:40:55Z" - }, { "name": "outline/outline", "version": "v0.84.0", @@ -69,31 +254,16 @@ "version": "v1.35.1.5034", "date": "2025-04-30T11:02:36Z" }, - { - "name": "cross-seed/cross-seed", - "version": "v6.12.4", - "date": "2025-05-11T11:41:32Z" - }, { "name": "authelia/authelia", "version": "v4.39.3", "date": "2025-05-11T11:12:15Z" }, - { - "name": "theonedev/onedev", - "version": "v11.9.5", - "date": "2025-05-11T10:50:37Z" - }, { "name": "Radarr/Radarr", "version": "v5.22.4.9896", "date": "2025-04-23T18:51:12Z" }, - { - "name": "pocketbase/pocketbase", - "version": "v0.28.0", - "date": "2025-05-11T06:25:22Z" - }, { "name": "owncast/owncast", "version": "v0.2.3", @@ -104,21 +274,11 @@ "version": "v0.6.9", "date": "2025-05-10T19:05:02Z" }, - { - "name": "ollama/ollama", - "version": "v0.6.9-rc0", - "date": "2025-05-10T18:57:30Z" - }, { "name": "Stirling-Tools/Stirling-PDF", "version": "v0.46.1", "date": "2025-05-10T15:39:10Z" }, - { - "name": "juanfont/headscale", - "version": "v0.25.1", - "date": "2025-02-25T17:30:48Z" - }, { "name": "pelican-dev/wings", "version": "v1.0.0-beta13", @@ -134,36 +294,16 @@ "version": "v1.19.1", "date": "2025-05-09T19:15:10Z" }, - { - "name": "MediaBrowser/Emby.Releases", - "version": "4.8.11.0", - "date": "2025-03-10T06:39:11Z" - }, { "name": "home-assistant/core", "version": "2025.5.1", "date": "2025-05-09T15:05:54Z" }, - { - "name": "keycloak/keycloak", - "version": "26.2.4", - "date": "2025-05-08T09:10:10Z" - }, { "name": "crowdsecurity/crowdsec", "version": "v1.6.8", "date": "2025-03-25T13:33:10Z" }, - { - "name": "zitadel/zitadel", - "version": "v3.0.4", - "date": "2025-05-09T11:38:33Z" - }, - { - "name": "coder/code-server", - "version": "v4.99.4", - "date": "2025-05-02T18:33:09Z" - }, { "name": "pocket-id/pocket-id", "version": "v0.53.0", @@ -179,26 +319,11 @@ "version": "v25.02.4", "date": "2025-05-08T15:03:17Z" }, - { - "name": "wazuh/wazuh", - "version": "v4.12.0", - "date": "2025-05-08T13:27:46Z" - }, { "name": "apache/tomcat", "version": "10.1.41", "date": "2025-05-08T12:45:44Z" }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.91.3", - "date": "2025-05-08T12:25:10Z" - }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.4.2", - "date": "2025-05-08T08:11:27Z" - }, { "name": "semaphoreui/semaphore", "version": "v2.14.10", @@ -219,11 +344,6 @@ "version": "v0.34.1", "date": "2025-03-25T18:11:12Z" }, - { - "name": "NodeBB/NodeBB", - "version": "v4.3.1", - "date": "2025-05-07T15:38:20Z" - }, { "name": "donaldzou/WGDashboard", "version": "v4.2.3", @@ -239,11 +359,6 @@ "version": "v5.7.5", "date": "2025-05-07T14:01:45Z" }, - { - "name": "Graylog2/graylog2-server", - "version": "6.3.0-alpha.3", - "date": "2025-05-07T13:58:36Z" - }, { "name": "glpi-project/glpi", "version": "10.0.18", @@ -259,11 +374,6 @@ "version": "v2.36.0", "date": "2025-05-07T11:54:14Z" }, - { - "name": "Checkmk/checkmk", - "version": "v2.2.0p42-rc1", - "date": "2025-05-07T11:50:30Z" - }, { "name": "openobserve/openobserve", "version": "v0.14.7", @@ -279,11 +389,6 @@ "version": "338", "date": "2025-05-07T10:43:29Z" }, - { - "name": "zabbix/zabbix", - "version": "7.4.0beta2", - "date": "2025-05-07T10:39:21Z" - }, { "name": "jupyter/notebook", "version": "@jupyter-notebook/ui-components@7.5.0-alpha.0", @@ -294,26 +399,11 @@ "version": "v1.12.1rc0", "date": "2025-05-06T20:56:30Z" }, - { - "name": "redis/redis", - "version": "8.0.1-int", - "date": "2025-05-06T18:40:34Z" - }, - { - "name": "Athou/commafeed", - "version": "5.8.0", - "date": "2025-05-06T18:33:07Z" - }, { "name": "sysadminsmedia/homebox", "version": "v0.19.0", "date": "2025-05-06T18:05:42Z" }, - { - "name": "jenkinsci/jenkins", - "version": "jenkins-2.509", - "date": "2025-05-06T15:37:10Z" - }, { "name": "MariaDB/server", "version": "mariadb-11.4.6", @@ -329,16 +419,6 @@ "version": "v0.107.61", "date": "2025-04-22T12:42:26Z" }, - { - "name": "element-hq/synapse", - "version": "v1.129.0", - "date": "2025-05-06T12:28:54Z" - }, - { - "name": "Luligu/matterbridge", - "version": "3.0.1", - "date": "2025-05-06T10:24:43Z" - }, { "name": "syncthing/syncthing", "version": "v1.29.6", @@ -384,16 +464,6 @@ "version": "v0.18.0", "date": "2025-05-05T15:34:40Z" }, - { - "name": "apache/tika", - "version": "2.9.4", - "date": "2025-05-05T15:17:27Z" - }, - { - "name": "neo4j/neo4j", - "version": "5.26.6", - "date": "2025-05-05T13:59:36Z" - }, { "name": "traefik/traefik", "version": "v3.4.0", @@ -444,11 +514,6 @@ "version": "v2.0.111", "date": "2025-05-03T16:25:30Z" }, - { - "name": "blakeblackshear/frigate", - "version": "v0.14.1", - "date": "2024-08-29T22:32:51Z" - }, { "name": "kimai/kimai", "version": "2.33.0", @@ -479,11 +544,6 @@ "version": "v3.5.4", "date": "2025-05-02T13:42:06Z" }, - { - "name": "motioneye-project/motioneye", - "version": "0.42.1", - "date": "2020-06-07T07:27:04Z" - }, { "name": "emqx/emqx", "version": "e5.9.0", @@ -494,11 +554,6 @@ "version": "2.3.0", "date": "2025-05-01T18:24:31Z" }, - { - "name": "netbox-community/netbox", - "version": "v4.3.0", - "date": "2025-05-01T16:46:17Z" - }, { "name": "WordPress/WordPress", "version": "6.8.1", @@ -524,11 +579,6 @@ "version": "version/2025.4.0", "date": "2025-04-30T12:34:14Z" }, - { - "name": "go-gitea/gitea", - "version": "v1.25.0-dev", - "date": "2025-04-28T22:57:56Z" - }, { "name": "hivemq/hivemq-community-edition", "version": "2025.3", @@ -574,11 +624,6 @@ "version": "v0.24.1", "date": "2025-04-28T08:21:37Z" }, - { - "name": "advplyr/audiobookshelf", - "version": "v2.21.0", - "date": "2025-04-27T16:31:14Z" - }, { "name": "gotify/server", "version": "v2.6.3", @@ -594,16 +639,6 @@ "version": "v3.1.9", "date": "2025-03-01T02:24:33Z" }, - { - "name": "TandoorRecipes/recipes", - "version": "1.5.34", - "date": "2025-03-27T16:17:38Z" - }, - { - "name": "leiweibau/Pi.Alert", - "version": "v2025-04-26", - "date": "2025-04-26T14:16:12Z" - }, { "name": "openhab/openhab-core", "version": "4.3.5", @@ -619,16 +654,6 @@ "version": "v13.6.0", "date": "2025-04-26T10:21:12Z" }, - { - "name": "duplicati/duplicati", - "version": "v2.1.0.117-2.1.0.117_canary_2025-04-25", - "date": "2025-04-25T17:22:12Z" - }, - { - "name": "mongodb/mongo", - "version": "r7.0.19", - "date": "2025-04-24T20:59:43Z" - }, { "name": "dotnetfactory/fluid-calendar", "version": "v1.4.0", @@ -649,21 +674,11 @@ "version": "RELEASE.2025-04-22T22-12-26Z", "date": "2025-04-22T22:44:34Z" }, - { - "name": "glanceapp/glance", - "version": "v0.7.13", - "date": "2025-04-22T22:19:16Z" - }, { "name": "OliveTin/OliveTin", "version": "2025.4.22", "date": "2025-04-22T14:18:11Z" }, - { - "name": "OctoPrint/OctoPrint", - "version": "1.11.0", - "date": "2025-04-22T09:33:46Z" - }, { "name": "monicahq/monica", "version": "v4.1.2", @@ -694,11 +709,6 @@ "version": "v2.10.0", "date": "2025-04-18T20:46:28Z" }, - { - "name": "Paymenter/Paymenter", - "version": "v1.0.4", - "date": "2025-04-18T16:08:02Z" - }, { "name": "tailscale/tailscale", "version": "v1.82.5", @@ -734,11 +744,6 @@ "version": "15.2", "date": "2025-04-14T15:37:12Z" }, - { - "name": "Ombi-app/Ombi", - "version": "v4.47.1", - "date": "2025-01-05T21:14:23Z" - }, { "name": "Tautulli/Tautulli", "version": "v2.15.2", @@ -894,11 +899,6 @@ "version": "v4.3.1", "date": "2025-03-23T09:02:54Z" }, - { - "name": "usememos/memos", - "version": "v0.24.2", - "date": "2025-03-23T04:01:50Z" - }, { "name": "clusterzx/paperless-ai", "version": "v2.7.6", diff --git a/install/actualbudget-install.sh b/install/actualbudget-install.sh index ffecc8889..51843f6c7 100644 --- a/install/actualbudget-install.sh +++ b/install/actualbudget-install.sh @@ -13,6 +13,11 @@ setting_up_container network_check update_os +msg_info "Installing Dependencies" +$STD apt-get install -y \ + make +msg_ok "Installed Dependencies" + msg_info "Installing Actual Budget" cd /opt RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') diff --git a/install/alpine-gatus-install.sh b/install/alpine-gatus-install.sh new file mode 100644 index 000000000..9e479d813 --- /dev/null +++ b/install/alpine-gatus-install.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/TwiN/gatus + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing dependencies" +$STD apk add --no-cache \ + ca-certificates \ + libcap-setcap +$STD apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community go +msg_ok "Installed dependencies" + +RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +msg_info "Installing gatus v${RELEASE}" +temp_file=$(mktemp) +mkdir -p /opt/gatus +curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" +tar zxf "$temp_file" --strip-components=1 -C /opt/gatus +cd /opt/gatus +$STD go mod tidy +CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus . +setcap CAP_NET_RAW+ep gatus +mv config.yaml config +echo "${RELEASE}" >/opt/gatus_version.txt +msg_ok "Installed gatus v${RELEASE}" + +msg_info "Enabling gatus Service" +cat </etc/init.d/gatus +#!/sbin/openrc-run +description="gatus Service" +directory="/opt/gatus" +command="/opt/gatus/gatus" +command_args="" +command_background="true" +command_user="root" +pidfile="/var/run/gatus.pid" + +export GATUS_CONFIG_PATH="" +export GATUS_LOG_LEVEL="INFO" +export PORT="8080" + +depend() { + use net +} +EOF +chmod +x /etc/init.d/gatus +$STD rc-update add gatus default +msg_ok "Enabled gatus Service" + +msg_info "Starting gatus" +$STD service gatus start +msg_ok "Started gatus" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f "$temp_file" +$STD apk cache clean +msg_ok "Cleaned" diff --git a/install/alpine-rclone-install.sh b/install/alpine-rclone-install.sh index 78331880b..59368b973 100644 --- a/install/alpine-rclone-install.sh +++ b/install/alpine-rclone-install.sh @@ -27,7 +27,7 @@ curl -fsSL "https://github.com/rclone/rclone/releases/download/v${RELEASE}/rclon $STD unzip -j "$temp_file" '*/**' -d /opt/rclone cd /opt/rclone RCLONE_PASSWORD=$(head -c 16 /dev/urandom | xxd -p -c 16) -$STD htpasswd -cb -B login.pwd admin "$RCLONE_PASSWORD" +$STD htpasswd -cb -B /opt/login.pwd admin "$RCLONE_PASSWORD" { echo "rclone-Credentials" echo "rclone User Name: admin" @@ -42,7 +42,7 @@ cat </etc/init.d/rclone #!/sbin/openrc-run description="rclone Service" command="/opt/rclone/rclone" -command_args="rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-htpasswd /opt/rclone/login.pwd" +command_args="rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-htpasswd /opt/login.pwd" command_background="true" command_user="root" pidfile="/var/run/rclone.pid" diff --git a/install/alpine-traefik-install.sh b/install/alpine-traefik-install.sh new file mode 100644 index 000000000..cdd2f5b4a --- /dev/null +++ b/install/alpine-traefik-install.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apk add ca-certificates +$STD update-ca-certificates +msg_ok "Installed Dependencies" + +msg_info "Installing Traefik" +$STD apk add traefik --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community +msg_ok "Installed Traefik" + +read -p "Enable Traefik WebUI (Port 8080)? [y/N]: " enable_webui +if [[ "$enable_webui" =~ ^[Yy]$ ]]; then + msg_info "Configuring Traefik WebUI" + mkdir -p /etc/traefik/config + cat </etc/traefik/traefik.yml +entryPoints: + web: + address: ":80" + traefik: + address: ":8080" + +api: + dashboard: true + insecure: true + +log: + level: INFO + +providers: + file: + directory: /etc/traefik/config + watch: true +EOF + msg_ok "Configured Traefik WebUI" +fi + +msg_info "Enabling and starting Traefik service" +$STD rc-update add traefik default +$STD rc-service traefik start +msg_ok "Traefik service started" + +motd_ssh +customize diff --git a/install/asterisk-install.sh b/install/asterisk-install.sh new file mode 100644 index 000000000..adb53406e --- /dev/null +++ b/install/asterisk-install.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: michelroegl-brunner +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://asterisk.org + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + libsrtp2-dev \ + build-essential \ + libedit-dev \ + uuid-dev \ + libjansson-dev \ + libxml2-dev \ + libsqlite3-dev +msg_ok "Installed Dependencies" + +msg_info "Downloading Asterisk" +RELEASE=$(curl -fsSL https://downloads.asterisk.org/pub/telephony/asterisk/ | grep -o 'asterisk-[0-9]\+-current\.tar\.gz' | sort -V | tail -n1) +temp_file=$(mktemp) +curl -fsSL "https://downloads.asterisk.org/pub/telephony/asterisk/${RELEASE}" -o "$temp_file" +mkdir -p /opt/asterisk +tar zxf "$temp_file" --strip-components=1 -C /opt/asterisk +cd /opt/asterisk +msg_ok "Downloaded Asterisk" + +msg_info "Installing Asterisk" +$STD ./contrib/scripts/install_prereq install +$STD ./configure +$STD make -j$(nproc) +$STD make install +$STD make config +$STD make install-logrotate +$STD make samples +mkdir -p /etc/radiusclient-ng/ +ln /etc/radcli/radiusclient.conf /etc/radiusclient-ng/radiusclient.conf +systemctl enable -q --now asterisk +msg_ok "Installed Asterisk" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f "$temp_file" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/documenso-install.sh b/install/documenso-install.sh index 37d658fcb..f2013396a 100644 --- a/install/documenso-install.sh +++ b/install/documenso-install.sh @@ -20,27 +20,16 @@ msg_ok "Setup Functions" msg_info "Installing Dependencies" $STD apt-get install -y \ - gpg \ libc6 \ make \ cmake \ jq \ - postgresql \ python3 \ python3-bcrypt msg_ok "Installed Dependencies" -msg_info "Setting up Node.js Repository" -mkdir -p /etc/apt/keyrings -curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg -echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list -msg_ok "Set up Node.js Repository" - -msg_info "Installing Node.js" -$STD apt-get update -$STD apt-get install -y nodejs -$STD npm install -g turbo@1.9.3 -msg_ok "Installed Node.js" +NODE_VERSION="22" NODE_MODULE="turbo@1.9.3" install_node_and_modules +PG_VERSION="16" install_postgresql msg_info "Setting up PostgreSQL" DB_NAME="documenso_db" @@ -90,7 +79,7 @@ msg_ok "Installed Documenso" msg_info "Create User" PASSWORD_HASH=$(python3 -c "import bcrypt; print(bcrypt.hashpw(b'helper-scripts', bcrypt.gensalt(rounds=12)).decode())") -sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\", \"customerId\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25', NULL) RETURNING id;" +$STD sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\", \"customerId\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25', NULL) RETURNING id;" $STD npm run prisma:migrate-deploy msg_ok "User created" diff --git a/install/gatus-install.sh b/install/gatus-install.sh new file mode 100644 index 000000000..8a2fc7a5c --- /dev/null +++ b/install/gatus-install.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/TwiN/gatus + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + ca-certificates \ + libcap2-bin +msg_ok "Installed Dependencies" + +install_go + +RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +msg_info "Setting up gatus v${RELEASE}" +temp_file=$(mktemp) +mkdir -p /opt/gatus +curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" +tar zxf "$temp_file" --strip-components=1 -C /opt/gatus +cd /opt/gatus +$STD go mod tidy +CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus . +setcap CAP_NET_RAW+ep gatus +mv config.yaml config +echo "${RELEASE}" >/opt/gatus_version.txt +msg_ok "Done setting up gatus" + +msg_info "Creating Service" +cat </etc/systemd/system/gatus.service +[Unit] +Description=gatus Service +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/gatus +ExecStart=/opt/gatus/gatus +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now gatus +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f "$temp_file" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" + +motd_ssh +customize diff --git a/install/homarr-install.sh b/install/homarr-install.sh index efb41c662..fcf7f32f5 100644 --- a/install/homarr-install.sh +++ b/install/homarr-install.sh @@ -23,27 +23,17 @@ $STD apt-get install -y \ build-essential \ nginx \ gettext \ + jq \ openssl msg_ok "Installed Dependencies" -msg_info "Setting up Node.js Repository" -mkdir -p /etc/apt/keyrings -curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg -echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list -msg_ok "Set up Node.js Repository" - -msg_info "Installing Node.js/pnpm" -$STD apt-get update -$STD apt-get install -y nodejs -$STD npm install -g pnpm@latest -msg_ok "Installed Node.js/pnpm" +NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]') +NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.packageManager | split("@")[1]')" +install_node_and_modules +fetch_and_deploy_gh_release "homarr-labs/homarr" msg_info "Installing Homarr (Patience)" cd /opt -RELEASE=$(curl -fsSL https://api.github.com/repos/homarr-labs/homarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip") -unzip -q v${RELEASE}.zip -mv homarr-${RELEASE} /opt/homarr mkdir -p /opt/homarr_db touch /opt/homarr_db/db.sqlite SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)" diff --git a/install/odoo-install.sh b/install/odoo-install.sh new file mode 100644 index 000000000..cf75acf67 --- /dev/null +++ b/install/odoo-install.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/tteck/Proxmox/raw/main/LICENSE +# Source: https://github.com/odoo/odoo + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + build-essential \ + make +msg_ok "Installed Dependencies" + +RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1) +LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" | + grep -oP "odoo_${RELEASE}\.\d+_all\.deb" | + sed -E "s/odoo_(${RELEASE}\.[0-9]+)_all\.deb/\1/" | + sort -V | + tail -n1) + +msg_info "Setup Odoo $RELEASE" +curl -fsSL https://nightly.odoo.com/${RELEASE}/nightly/deb/odoo_${RELEASE}.latest_all.deb -o /opt/odoo.deb +$STD apt install -y /opt/odoo.deb +msg_ok "Setup Odoo $RELEASE" + +msg_info "Setup PostgreSQL Database" +DB_NAME="odoo" +DB_USER="odoo_usr" +DB_PASS="$(openssl rand -base64 18 | cut -c1-13)" +$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;" +$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" +$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" +$STD sudo -u postgres psql -c "ALTER DATABASE $DB_NAME OWNER TO $DB_USER;" +$STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;" +{ + echo "Odoo-Credentials" + echo -e "Odoo Database User: $DB_USER" + echo -e "Odoo Database Password: $DB_PASS" + echo -e "Odoo Database Name: $DB_NAME" +} >>~/odoo.creds +msg_ok "Setup PostgreSQL" + +msg_info "Configuring Odoo" +sed -i \ + -e "s|^;*db_host *=.*|db_host = localhost|" \ + -e "s|^;*db_port *=.*|db_port = 5432|" \ + -e "s|^;*db_user *=.*|db_user = $DB_USER|" \ + -e "s|^;*db_password *=.*|db_password = $DB_PASS|" \ + /etc/odoo/odoo.conf +$STD sudo -u odoo odoo -c /etc/odoo/odoo.conf -d odoo -i base --stop-after-init +systemctl restart odoo +echo "${LATEST_VERSION}" >/opt/${APPLICATION}_version.txt +msg_ok "Configured Odoo" + +msg_info "Restarting Odoo" + +msg_ok "Restarted Odoo" + +motd_ssh +customize + +msg_info "Cleaning up" +rm -f /opt/odoo.deb +$STD apt-get autoremove +$STD apt-get autoclean +msg_ok "Cleaned" diff --git a/install/openhab-install.sh b/install/openhab-install.sh index 4bece4377..822da10ed 100644 --- a/install/openhab-install.sh +++ b/install/openhab-install.sh @@ -16,20 +16,19 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ gnupg \ + ca-certificates \ apt-transport-https msg_ok "Installed Dependencies" -msg_info "Installing Azul Zulu21" -curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9" -o "/etc/apt/trusted.gpg.d/zulu-repo.asc" -curl -fsSL "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb" -o $(basename "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb") -$STD dpkg -i zulu-repo_1.0.0-3_all.deb +msg_info "Installing Azul Zulu17" +curl -fsSL https://repos.azul.com/azul-repo.key | gpg --dearmor -o /usr/share/keyrings/azul.gpg +echo "deb [signed-by=/usr/share/keyrings/azul.gpg] https://repos.azul.com/zulu/deb stable main" >/etc/apt/sources.list.d/zulu.list $STD apt-get update -$STD apt-get -y install zulu21-jdk -msg_ok "Installed Azul Zulu21" +$STD apt-get -y install zulu17-jdk +msg_ok "Installed Azul Zulu17" msg_info "Installing openHAB" -curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor >openhab.gpg -mv openhab.gpg /usr/share/keyrings +curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor -o /usr/share/keyrings/openhab.gpg chmod u=rw,g=r,o=r /usr/share/keyrings/openhab.gpg echo "deb [signed-by=/usr/share/keyrings/openhab.gpg] https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main" >/etc/apt/sources.list.d/openhab.list $STD apt update diff --git a/misc/build.func b/misc/build.func index c96b61bde..55f539c7d 100644 --- a/misc/build.func +++ b/misc/build.func @@ -527,7 +527,37 @@ advanced_settings() { exit_script fi - BRIDGES=$( ip link show | grep -oP '(?<=: )vmbr\d+' | sort) + + BRIDGES="" + IFACE_FILEPATH_LIST="/etc/network/interfaces"$'\n'$(find "/etc/network/interfaces.d/" -type f) + OLD_IFS=$IFS; IFS=$'\n' + + for iface_filepath in ${IFACE_FILEPATH_LIST}; do + iface_indexes_tmpfile=$(mktemp -q -u '.iface-XXXX') + + ( grep -Pn '^\s*iface' "${iface_filepath}" | cut -d':' -f1 && wc -l "${iface_filepath}" | cut -d' ' -f1 ) | \ + awk 'FNR==1 {line=$0; next} {print line":"$0-1; line=$0}' > "${iface_indexes_tmpfile}" + + if [ -f "${iface_indexes_tmpfile}" ]; then + while read -r pair; do + start=$(echo "${pair}" | cut -d':' -f1) + end=$(echo "${pair}" | cut -d':' -f2) + + if awk "NR >= ${start} && NR <= ${end}" "${iface_filepath}" | grep -qP '^\s*bridge[-_](ports|stp|fd|vlan-aware|vids)\s+'; then + iface_name=$(sed "${start}q;d" "${iface_filepath}" | awk '{print $2}') + BRIDGES="${iface_name}"$'\n'"${BRIDGES}" + fi + + done < "${iface_indexes_tmpfile}" + rm -f "${iface_indexes_tmpfile}" + fi + + done + + IFS=$OLD_IFS + + BRIDGES=$(echo "$BRIDGES" | grep -v '^\s*$' | sort | uniq) + if [[ -z "$BRIDGES" ]]; then BRG="vmbr0" echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" @@ -1371,7 +1401,7 @@ description() { spend Coffee

- + GitHub diff --git a/misc/tools.func b/misc/tools.func index 50520ca44..1aa597733 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -55,10 +55,16 @@ install_node_and_modules() { IFS=',' read -ra MODULES <<<"$NODE_MODULE" for mod in "${MODULES[@]}"; do local MODULE_NAME MODULE_REQ_VERSION MODULE_INSTALLED_VERSION - if [[ "$mod" == *"@"* ]]; then + if [[ "$mod" == @*/*@* ]]; then + # Scoped package with version, e.g. @vue/cli-service@latest MODULE_NAME="${mod%@*}" - MODULE_REQ_VERSION="${mod#*@}" + MODULE_REQ_VERSION="${mod##*@}" + elif [[ "$mod" == *"@"* ]]; then + # Unscoped package with version, e.g. yarn@latest + MODULE_NAME="${mod%@*}" + MODULE_REQ_VERSION="${mod##*@}" else + # No version specified MODULE_NAME="$mod" MODULE_REQ_VERSION="latest" fi @@ -101,25 +107,31 @@ install_postgresql() { DISTRO="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" if command -v psql >/dev/null; then - CURRENT_PG_VERSION="$(psql -V | grep -oP '\s\K[0-9]+(?=\.)')" - if [[ "$CURRENT_PG_VERSION" != "$PG_VERSION" ]]; then - msg_info "PostgreSQL Version $CURRENT_PG_VERSION found, replacing with $PG_VERSION" - NEED_PG_INSTALL=true + CURRENT_PG_VERSION="$(psql -V | awk '{print $3}' | cut -d. -f1)" + if [[ "$CURRENT_PG_VERSION" == "$PG_VERSION" ]]; then + msg_ok "PostgreSQL $PG_VERSION is already installed" + return fi + msg_info "Detected PostgreSQL $CURRENT_PG_VERSION, preparing upgrade to $PG_VERSION" + NEED_PG_INSTALL=true else - msg_info "PostgreSQL not found, installing version $PG_VERSION" + msg_info "PostgreSQL not installed, proceeding with fresh install of $PG_VERSION" NEED_PG_INSTALL=true fi if [[ "$NEED_PG_INSTALL" == true ]]; then - msg_info "Stopping PostgreSQL if running" - systemctl stop postgresql >/dev/null 2>&1 || true + if [[ -n "$CURRENT_PG_VERSION" ]]; then + msg_info "Dumping all PostgreSQL data from version $CURRENT_PG_VERSION" + su - postgres -c "pg_dumpall > /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql" + fi - msg_info "Removing conflicting PostgreSQL packages" - $STD apt-get purge -y "postgresql*" + msg_info "Stopping PostgreSQL service" + systemctl stop postgresql || true + + msg_info "Removing pgdg repo and old GPG key" rm -f /etc/apt/sources.list.d/pgdg.list /etc/apt/trusted.gpg.d/postgresql.gpg - msg_info "Setting up PostgreSQL Repository" + msg_info "Adding PostgreSQL PGDG repository" curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg @@ -127,9 +139,24 @@ install_postgresql() { >/etc/apt/sources.list.d/pgdg.list $STD apt-get update - $STD apt-get install -y "postgresql-${PG_VERSION}" - msg_ok "Installed PostgreSQL ${PG_VERSION}" + msg_info "Installing PostgreSQL $PG_VERSION" + $STD apt-get install -y "postgresql-${PG_VERSION}" "postgresql-client-${PG_VERSION}" + + if [[ -n "$CURRENT_PG_VERSION" ]]; then + $STD msg_info "Removing old PostgreSQL $CURRENT_PG_VERSION packages" + $STD apt-get purge -y "postgresql-${CURRENT_PG_VERSION}" "postgresql-client-${CURRENT_PG_VERSION}" || true + fi + + $STD msg_info "Starting PostgreSQL $PG_VERSION" + systemctl enable --now postgresql + + if [[ -n "$CURRENT_PG_VERSION" ]]; then + $STD msg_info "Restoring dumped data" + su - postgres -c "psql < /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql" + fi + + msg_ok "PostgreSQL $PG_VERSION installed" fi } @@ -245,7 +272,11 @@ install_php() { COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -) local CURRENT_PHP - CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) + if command -v php >/dev/null 2>&1; then + CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) + else + CURRENT_PHP="" + fi if [[ "$CURRENT_PHP" != "$PHP_VERSION" ]]; then $STD echo "PHP $CURRENT_PHP detected, migrating to PHP $PHP_VERSION" @@ -352,7 +383,7 @@ install_go() { msg_error "Could not determine latest Go version" return 1 fi - msg_info "Detected latest Go version: $GO_VERSION" + $STD msg_info "Detected latest Go version: $GO_VERSION" fi local GO_BIN="/usr/local/bin/go" @@ -362,10 +393,10 @@ install_go() { local CURRENT_VERSION CURRENT_VERSION=$("$GO_BIN" version | awk '{print $3}' | sed 's/go//') if [[ "$CURRENT_VERSION" == "$GO_VERSION" ]]; then - msg_ok "Go $GO_VERSION already installed" + $STD msg_ok "Go $GO_VERSION already installed" return 0 else - msg_info "Go $CURRENT_VERSION found, upgrading to $GO_VERSION" + $STD msg_info "Go $CURRENT_VERSION found, upgrading to $GO_VERSION" rm -rf "$GO_INSTALL_DIR" fi else @@ -538,6 +569,7 @@ fetch_and_deploy_gh_release() { tag=$(echo "$api_response" | jq -r '.tag_name // .name // empty') [[ "$tag" =~ ^v[0-9] ]] && tag="${tag:1}" + version="${tag#v}" if [[ -z "$tag" ]]; then $STD msg_info "Empty tag received, retrying...\n" @@ -560,7 +592,6 @@ fetch_and_deploy_gh_release() { return 0 fi - local version="$tag" local base_url="https://github.com/$repo/releases/download/v$tag" local tmpdir tmpdir=$(mktemp -d) || return 1 @@ -620,8 +651,15 @@ fetch_and_deploy_gh_release() { # Final fallback to GitHub source tarball if [[ -z "$url" ]]; then - url="https://github.com/$repo/archive/refs/tags/$version.tar.gz" - $STD msg_info "Trying GitHub source tarball fallback: $url" + # Use tarball_url directly from API response instead of constructing our own URL + url=$(echo "$api_response" | jq -r '.tarball_url // empty') + + # If tarball_url is empty for some reason, fall back to a constructed URL as before + if [[ -z "$url" ]]; then + url="https://github.com/$repo/archive/refs/tags/v$version.tar.gz" + fi + + $STD msg_info "Using GitHub source tarball: $url" fi local filename="${url##*/}" @@ -659,8 +697,8 @@ setup_local_ip_helper() { # Install networkd-dispatcher if not present if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then - apt-get update -qq - apt-get install -yq networkd-dispatcher + $STD apt-get update -qq + $STD apt-get install -yq networkd-dispatcher fi # Write update_local_ip.sh @@ -716,7 +754,7 @@ $SCRIPT_PATH EOF chmod +x "$DISPATCHER_SCRIPT" - systemctl enable --now networkd-dispatcher.service + systemctl enable -q --now networkd-dispatcher.service $STD msg_ok "LOCAL_IP helper installed using networkd-dispatcher" } diff --git a/tools/pve/monitor-all.sh b/tools/pve/monitor-all.sh index b0f95786a..30795cce1 100644 --- a/tools/pve/monitor-all.sh +++ b/tools/pve/monitor-all.sh @@ -16,43 +16,52 @@ cat <<"EOF" EOF add() { + echo -e "\n IMPORTANT: Tag-Based Monitoring Enabled" + echo "Only VMs and containers with the tag 'mon-restart' will be automatically restarted by this service." + echo + echo "🔧 How to add the tag:" + echo " → Proxmox Web UI: Go to VM/CT → Options → Tags → Add 'mon-restart'" + echo " → CLI: qm set -tags mon-restart" + echo " pct set -tags mon-restart" + echo + while true; do - read -p "This script will add Monitor All to Proxmox VE. Proceed(y/n)?" yn + read -p "This script will add Monitor All to Proxmox VE. Proceed (y/n)? " yn case $yn in - [Yy]*) break ;; - [Nn]*) exit ;; - *) echo "Please answer yes or no." ;; + [Yy]*) break ;; + [Nn]*) exit ;; + *) echo "Please answer yes or no." ;; esac done - echo '#!/usr/bin/env bash + cat <<'EOF' >/usr/local/bin/ping-instances.sh +#!/usr/bin/env bash + # Read excluded instances from command line arguments excluded_instances=("$@") echo "Excluded instances: ${excluded_instances[@]}" while true; do - for instance in $(pct list | awk '\''{if(NR>1) print $1}'\''; qm list | awk '\''{if(NR>1) print $1}'\''); do + for instance in $(pct list | awk 'NR>1 {print $1}'; qm list | awk 'NR>1 {print $1}'); do # Skip excluded instances if [[ " ${excluded_instances[@]} " =~ " ${instance} " ]]; then echo "Skipping $instance because it is excluded" continue fi - # Determine the type of the instance (container or virtual machine) + # Determine type and set config command if pct status $instance >/dev/null 2>&1; then - # It is a container + type="ct" config_cmd="pct config" - IP=$(pct exec $instance ip a s dev eth0 | awk '\''/inet / {print $2}'\'' | cut -d/ -f1) else - # It is a virtual machine + type="vm" config_cmd="qm config" - IP=$(qm guest cmd $instance network-get-interfaces | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -E "192\.|10\." | head -n 1) fi - # Skip instances based on onboot and templates + # Skip templates and onboot-disabled onboot=$($config_cmd $instance | grep -q "onboot: 0" || ( ! $config_cmd $instance | grep -q "onboot" ) && echo "true" || echo "false") - template=$($config_cmd $instance | grep template | grep -q "template:" && echo "true" || echo "false") + template=$($config_cmd $instance | grep -q "^template:" && echo "true" || echo "false") if [ "$onboot" == "true" ]; then echo "Skipping $instance because it is set not to boot" @@ -62,36 +71,49 @@ while true; do continue fi - # Ping the instance - if ! ping -c 1 $IP >/dev/null 2>&1; then - # If the instance can not be pinged, stop and start it - if pct status $instance >/dev/null 2>&1; then - # It is a container + # Check for mon-restart tag + has_tag=$($config_cmd $instance | grep -q "tags:.*mon-restart" && echo "true" || echo "false") + if [ "$has_tag" != "true" ]; then + echo "Skipping $instance because it does not have 'mon-restart' tag" + continue + fi + + # Responsiveness check and restart if needed + if [ "$type" == "vm" ]; then + # Check if guest agent responds + if qm guest cmd $instance ping >/dev/null 2>&1; then + echo "VM $instance is responsive via guest agent" + else + echo "$(date): VM $instance is not responding to agent ping, restarting..." + if qm status $instance | grep -q "status: running"; then + qm stop $instance >/dev/null 2>&1 + sleep 5 + fi + qm start $instance >/dev/null 2>&1 + fi + else + # Container: get IP and ping + IP=$(pct exec $instance ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) + if ! ping -c 1 $IP >/dev/null 2>&1; then echo "$(date): CT $instance is not responding, restarting..." pct stop $instance >/dev/null 2>&1 sleep 5 pct start $instance >/dev/null 2>&1 else - # It is a virtual machine - if qm status $instance | grep -q "status: running"; then - echo "$(date): VM $instance is not responding, restarting..." - qm stop $instance >/dev/null 2>&1 - sleep 5 - else - echo "$(date): VM $instance is not running, starting..." - fi - qm start $instance >/dev/null 2>&1 + echo "CT $instance is responsive" fi fi done - # Wait for 5 minutes. (Edit to your needs) echo "$(date): Pausing for 5 minutes..." sleep 300 -done >/var/log/ping-instances.log 2>&1' >/usr/local/bin/ping-instances.sh + +done >/var/log/ping-instances.log 2>&1 +EOF + touch /var/log/ping-instances.log - # Change file permissions to executable chmod +x /usr/local/bin/ping-instances.sh + cat </etc/systemd/system/ping-instances.timer [Unit] Description=Delay ping-instances.service by 5 minutes @@ -104,17 +126,17 @@ OnUnitActiveSec=300 WantedBy=timers.target EOF - # Create ping-instances.service cat </etc/systemd/system/ping-instances.service [Unit] -Description=Ping instances every 5 minutes and restarts if necessary +Description=Ping instances every 5 minutes and restart if necessary After=ping-instances.timer Requires=ping-instances.timer + [Service] Type=simple -# To specify which CT/VM should be excluded, add the CT/VM ID at the end of the line where ExecStart=/usr/local/bin/ping-instances.sh is specified. -# For example: ExecStart=/usr/local/bin/ping-instances.sh 100 102 -# Virtual machines without the QEMU guest agent installed must be excluded. +# To exclude specific instances, pass IDs to ExecStart, e.g.: +# ExecStart=/usr/local/bin/ping-instances.sh 100 200 +# Instances must also have the 'mon-restart' tag to be monitored ExecStart=/usr/local/bin/ping-instances.sh Restart=always @@ -125,39 +147,33 @@ StandardError=file:/var/log/ping-instances.log WantedBy=multi-user.target EOF - # Reload daemon, enable and start ping-instances.service systemctl daemon-reload systemctl enable -q --now ping-instances.timer systemctl enable -q --now ping-instances.service clear - echo -e "\n To view Monitor All logs: cat /var/log/ping-instances.log" + echo -e "\n Monitor All installed." + echo "📄 To view logs: cat /var/log/ping-instances.log" + echo "⚙️ Make sure your VMs or containers have the 'mon-restart' tag to be monitored." } remove() { systemctl disable -q --now ping-instances.timer systemctl disable -q --now ping-instances.service - rm /etc/systemd/system/ping-instances.service /etc/systemd/system/ping-instances.timer /usr/local/bin/ping-instances.sh /var/log/ping-instances.log - echo "Removed Monitor All from Proxmox VE" + rm -f /etc/systemd/system/ping-instances.service + rm -f /etc/systemd/system/ping-instances.timer + rm -f /usr/local/bin/ping-instances.sh + rm -f /var/log/ping-instances.log + echo "Monitor All removed from Proxmox VE" } -# Define options for the whiptail menu OPTIONS=(Add "Add Monitor-All to Proxmox VE" Remove "Remove Monitor-All from Proxmox VE") -# Show the whiptail menu and save the user's choice CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Monitor-All for Proxmox VE" --menu "Select an option:" 10 58 2 \ "${OPTIONS[@]}" 3>&1 1>&2 2>&3) -# Check the user's choice and perform the corresponding action case $CHOICE in -"Add") - add - ;; -"Remove") - remove - ;; -*) - echo "Exiting..." - exit 0 - ;; +"Add") add ;; +"Remove") remove ;; +*) echo "Exiting..."; exit 0 ;; esac