diff --git a/CHANGELOG.md b/CHANGELOG.md index 80e234dbc..6b1392df9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,19 +10,151 @@ > [!CAUTION] Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes. -## 2025-07-28 +## 2025-08-03 + +## 2025-08-02 + +### 🚀 Updated Scripts + + - Alternative connectivity checks for LXC [@mariano-dagostino](https://github.com/mariano-dagostino) ([#6472](https://github.com/community-scripts/ProxmoxVE/pull/6472)) + + - #### 🐞 Bug Fixes + + - Immich: fix copy error during install [@vhsdream](https://github.com/vhsdream) ([#6497](https://github.com/community-scripts/ProxmoxVE/pull/6497)) + - MagicMirror: Fix install process [@tremor021](https://github.com/tremor021) ([#6492](https://github.com/community-scripts/ProxmoxVE/pull/6492)) + - chore: BookLore repo change [@vhsdream](https://github.com/vhsdream) ([#6493](https://github.com/community-scripts/ProxmoxVE/pull/6493)) + + - #### ✨ New Features + + - VictoriaMetrics: Make VictoriaLogs optional add-on [@tremor021](https://github.com/tremor021) ([#6489](https://github.com/community-scripts/ProxmoxVE/pull/6489)) + +## 2025-08-01 ### 🚀 Updated Scripts - #### 🐞 Bug Fixes + - Fumadocs: add git as dependency [@MickLesk](https://github.com/MickLesk) ([#6459](https://github.com/community-scripts/ProxmoxVE/pull/6459)) + - Immich: Fix immich-admin script; other fixes | pin to v.137.3 [@vhsdream](https://github.com/vhsdream) ([#6443](https://github.com/community-scripts/ProxmoxVE/pull/6443)) + + - #### ✨ New Features + + - Re-Add: Suwayomi-Server [@MickLesk](https://github.com/MickLesk) ([#6458](https://github.com/community-scripts/ProxmoxVE/pull/6458)) + + - #### 🔧 Refactor + + - Update homepage.sh to use setup_nodejs [@burgerga](https://github.com/burgerga) ([#6462](https://github.com/community-scripts/ProxmoxVE/pull/6462)) + - Refactor: Owncast [@tremor021](https://github.com/tremor021) ([#6434](https://github.com/community-scripts/ProxmoxVE/pull/6434)) + - Refactor: MediaMTX [@tremor021](https://github.com/tremor021) ([#6406](https://github.com/community-scripts/ProxmoxVE/pull/6406)) + - Refactor: LubeLogger [@tremor021](https://github.com/tremor021) ([#6400](https://github.com/community-scripts/ProxmoxVE/pull/6400)) + - Refactor: MagicMirror [@tremor021](https://github.com/tremor021) ([#6402](https://github.com/community-scripts/ProxmoxVE/pull/6402)) + - Refactor: Manage My Damn Life [@tremor021](https://github.com/tremor021) ([#6403](https://github.com/community-scripts/ProxmoxVE/pull/6403)) + - Refactor: Meilisearch [@tremor021](https://github.com/tremor021) ([#6407](https://github.com/community-scripts/ProxmoxVE/pull/6407)) + - Refactor: NodeBB [@tremor021](https://github.com/tremor021) ([#6419](https://github.com/community-scripts/ProxmoxVE/pull/6419)) + - Refactor: oauth2-proxy [@tremor021](https://github.com/tremor021) ([#6421](https://github.com/community-scripts/ProxmoxVE/pull/6421)) + - Refactor: Outline [@tremor021](https://github.com/tremor021) ([#6424](https://github.com/community-scripts/ProxmoxVE/pull/6424)) + - Refactor: Overseerr [@tremor021](https://github.com/tremor021) ([#6425](https://github.com/community-scripts/ProxmoxVE/pull/6425)) + +## 2025-07-31 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - OpenObserve: Fix release fetching [@tremor021](https://github.com/tremor021) ([#6409](https://github.com/community-scripts/ProxmoxVE/pull/6409)) + + - #### 💥 Breaking Changes + + - Remove temp. Tandoor during Install & Update Issues [@MickLesk](https://github.com/MickLesk) ([#6438](https://github.com/community-scripts/ProxmoxVE/pull/6438)) + + - #### 🔧 Refactor + + - Refactor: listmonk [@tremor021](https://github.com/tremor021) ([#6399](https://github.com/community-scripts/ProxmoxVE/pull/6399)) + - Refactor: Neo4j [@tremor021](https://github.com/tremor021) ([#6418](https://github.com/community-scripts/ProxmoxVE/pull/6418)) + - Refactor: Monica [@tremor021](https://github.com/tremor021) ([#6416](https://github.com/community-scripts/ProxmoxVE/pull/6416)) + - Refactor: Memos [@tremor021](https://github.com/tremor021) ([#6415](https://github.com/community-scripts/ProxmoxVE/pull/6415)) + - Refactor: Opengist [@tremor021](https://github.com/tremor021) ([#6423](https://github.com/community-scripts/ProxmoxVE/pull/6423)) + - Refactor: Ombi [@tremor021](https://github.com/tremor021) ([#6422](https://github.com/community-scripts/ProxmoxVE/pull/6422)) + - Refactor: MySpeed [@tremor021](https://github.com/tremor021) ([#6417](https://github.com/community-scripts/ProxmoxVE/pull/6417)) + +## 2025-07-30 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Strip SD and NS prefixes before writing to config file [@mattv8](https://github.com/mattv8) ([#6356](https://github.com/community-scripts/ProxmoxVE/pull/6356)) + - [core] fix: expand $CACHER_IP in apt-proxy-detect.sh (revert quoted heredoc) [@MickLesk](https://github.com/MickLesk) ([#6385](https://github.com/community-scripts/ProxmoxVE/pull/6385)) + - PiAlert: bugfix dependencies [@leiweibau](https://github.com/leiweibau) ([#6396](https://github.com/community-scripts/ProxmoxVE/pull/6396)) + - Librespeed-Rust: Fix service name and RELEASE var fetching [@tremor021](https://github.com/tremor021) ([#6378](https://github.com/community-scripts/ProxmoxVE/pull/6378)) + - n8n: add build-essential as dependency [@MickLesk](https://github.com/MickLesk) ([#6392](https://github.com/community-scripts/ProxmoxVE/pull/6392)) + - Habitica: Fix trusted domains [@tremor021](https://github.com/tremor021) ([#6380](https://github.com/community-scripts/ProxmoxVE/pull/6380)) + - Mafl: Fix undeclared var [@tremor021](https://github.com/tremor021) ([#6371](https://github.com/community-scripts/ProxmoxVE/pull/6371)) + + - #### 🔧 Refactor + + - Refactor: Lidarr [@tremor021](https://github.com/tremor021) ([#6379](https://github.com/community-scripts/ProxmoxVE/pull/6379)) + - Refactor: Kubo [@tremor021](https://github.com/tremor021) ([#6376](https://github.com/community-scripts/ProxmoxVE/pull/6376)) + - Refactor: Komga [@tremor021](https://github.com/tremor021) ([#6374](https://github.com/community-scripts/ProxmoxVE/pull/6374)) + - Refactor: Koillection [@tremor021](https://github.com/tremor021) ([#6373](https://github.com/community-scripts/ProxmoxVE/pull/6373)) + - Refactor: Karakeep [@tremor021](https://github.com/tremor021) ([#6372](https://github.com/community-scripts/ProxmoxVE/pull/6372)) + +## 2025-07-29 + +### 🆕 New Scripts + + - Jeedom ([#6336](https://github.com/community-scripts/ProxmoxVE/pull/6336)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - PiAlert: add new dependencies [@leiweibau](https://github.com/leiweibau) ([#6337](https://github.com/community-scripts/ProxmoxVE/pull/6337)) + - Element Synapse CT RAM increased from 1024 to 2048 [@tjcomserv](https://github.com/tjcomserv) ([#6330](https://github.com/community-scripts/ProxmoxVE/pull/6330)) + + - #### 🔧 Refactor + + - Refactor: HomeBox [@tremor021](https://github.com/tremor021) ([#6338](https://github.com/community-scripts/ProxmoxVE/pull/6338)) + - Refactor: InspIRCd [@tremor021](https://github.com/tremor021) ([#6343](https://github.com/community-scripts/ProxmoxVE/pull/6343)) + - Refactor: Jackett [@tremor021](https://github.com/tremor021) ([#6344](https://github.com/community-scripts/ProxmoxVE/pull/6344)) + - Update keycloak script to support configuration of latest release (v26) [@remz1337](https://github.com/remz1337) ([#6322](https://github.com/community-scripts/ProxmoxVE/pull/6322)) + - Refactor: Photoprism [@MickLesk](https://github.com/MickLesk) ([#6335](https://github.com/community-scripts/ProxmoxVE/pull/6335)) + - Refactor: Autobrr [@tremor021](https://github.com/tremor021) ([#6302](https://github.com/community-scripts/ProxmoxVE/pull/6302)) + +## 2025-07-28 + +### 🚀 Updated Scripts + + - Refactor: Cronicle [@tremor021](https://github.com/tremor021) ([#6314](https://github.com/community-scripts/ProxmoxVE/pull/6314)) +- Refactor: HiveMQ [@tremor021](https://github.com/tremor021) ([#6313](https://github.com/community-scripts/ProxmoxVE/pull/6313)) + + - #### 🐞 Bug Fixes + + - fix: SSH authorized keys not added in Alpine install script [@enihsyou](https://github.com/enihsyou) ([#6316](https://github.com/community-scripts/ProxmoxVE/pull/6316)) + - fix: removing ",gw=" from GATE var when reading/writing from/to config. [@teohz](https://github.com/teohz) ([#6177](https://github.com/community-scripts/ProxmoxVE/pull/6177)) - add 'g++' to actualbudget-install.sh [@saivishnu725](https://github.com/saivishnu725) ([#6293](https://github.com/community-scripts/ProxmoxVE/pull/6293)) - #### ✨ New Features + - [core]: create_lxc: better handling, fix lock handling, improve template validation & storage selection UX [@MickLesk](https://github.com/MickLesk) ([#6296](https://github.com/community-scripts/ProxmoxVE/pull/6296)) - ProxmoxVE 9.0 Beta: add BETA Version as test in pve_check [@MickLesk](https://github.com/MickLesk) ([#6295](https://github.com/community-scripts/ProxmoxVE/pull/6295)) - karakeep: Run workers in prod without tsx [@vhsdream](https://github.com/vhsdream) ([#6285](https://github.com/community-scripts/ProxmoxVE/pull/6285)) + - #### 🔧 Refactor + + - Refactor: grocy [@tremor021](https://github.com/tremor021) ([#6307](https://github.com/community-scripts/ProxmoxVE/pull/6307)) + - Refactor: Navidrome [@tremor021](https://github.com/tremor021) ([#6300](https://github.com/community-scripts/ProxmoxVE/pull/6300)) + - Refactor: Gotify [@tremor021](https://github.com/tremor021) ([#6301](https://github.com/community-scripts/ProxmoxVE/pull/6301)) + - Refactor: Grafana [@tremor021](https://github.com/tremor021) ([#6306](https://github.com/community-scripts/ProxmoxVE/pull/6306)) + - Refactor: Argus [@tremor021](https://github.com/tremor021) ([#6305](https://github.com/community-scripts/ProxmoxVE/pull/6305)) + - n8n: refactor environmentfile [@CrazyWolf13](https://github.com/CrazyWolf13) ([#6297](https://github.com/community-scripts/ProxmoxVE/pull/6297)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - temp change the analytics url to one that works untill community one is fixed [@BramSuurdje](https://github.com/BramSuurdje) ([#6319](https://github.com/community-scripts/ProxmoxVE/pull/6319)) + ## 2025-07-27 ### 🚀 Updated Scripts diff --git a/ct/argus.sh b/ct/argus.sh index 0d8288662..2e81da4c5 100644 --- a/ct/argus.sh +++ b/ct/argus.sh @@ -23,20 +23,23 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -d /opt/argus ]]; then msg_error "No ${APP} Installation Found!" exit fi RELEASE=$(curl -fsSL https://api.github.com/repos/release-argus/Argus/releases/latest | jq -r .tag_name | sed 's/^v//') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then - msg_info "Updating $APP to ${RELEASE}" - rm -f /opt/argus/Argus - curl -fsSL "https://github.com/release-argus/Argus/releases/download/${RELEASE}/Argus-${RELEASE}.linux-arm64" -o /opt/argus/Argus - chmod +x /opt/argus/Argus - systemctl restart argus - echo "${RELEASE}" >/opt/${APP}_version.txt + if [[ "${RELEASE}" != "$(cat ~/.Argus 2>/dev/null)" ]] || [[ ! -f ~/.Argus ]]; then + msg_info "Stopping service" + systemctl stop argus + msg_ok "Service stopped" + + fetch_and_deploy_gh_release "Argus" "release-argus/Argus" "singlefile" "latest" "/opt/argus" "Argus*linux-arm64" + + msg_info "Starting service" + systemctl start argus + msg_ok "Service started" + msg_ok "Updated ${APP} to ${RELEASE}" else msg_ok "${APP} is already up to date (${RELEASE})" diff --git a/ct/autobrr.sh b/ct/autobrr.sh index 925aaf88c..bdf5db4fc 100644 --- a/ct/autobrr.sh +++ b/ct/autobrr.sh @@ -27,22 +27,24 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Stopping ${APP} LXC" - systemctl stop autobrr.service - msg_ok "Stopped ${APP} LXC" - msg_info "Updating ${APP} LXC" - rm -rf /usr/local/bin/* - curl -fsSL "$(curl -fsSL https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4)" -o $(basename "$(curl -fsSL https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4)") - tar -C /usr/local/bin -xzf autobrr*.tar.gz - rm -rf autobrr*.tar.gz - msg_ok "Updated ${APP} LXC" + RELEASE=$(curl -fsSL https://api.github.com/repos/autobrr/autobrr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.autobrr 2>/dev/null)" ]] || [[ ! -f ~/.autobrr ]]; then + msg_info "Stopping ${APP} LXC" + systemctl stop autobrr + msg_ok "Stopped ${APP} LXC" - msg_info "Starting ${APP} LXC" - systemctl start autobrr.service - msg_ok "Started ${APP} LXC" - msg_ok "Updated Successfully" - exit + fetch_and_deploy_gh_release "autobrr" "autobrr/autobrr" "prebuild" "latest" "/usr/local/bin" "autobrr_*_linux_x86_64.tar.gz" + + msg_info "Starting ${APP} LXC" + systemctl start autobrr + msg_ok "Started ${APP} LXC" + + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit } start diff --git a/ct/booklore.sh b/ct/booklore.sh index ebc2cb30e..ca8140c71 100644 --- a/ct/booklore.sh +++ b/ct/booklore.sh @@ -3,7 +3,8 @@ source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/mis # Copyright (c) 2021-2025 community-scripts ORG # Author: MickLesk (CanbiZ) # License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/adityachandelgit/BookLore +# Source: https://github.com/booklore-app/BookLore======= + APP="BookLore" var_tags="${var_tags:-books;library}" @@ -29,13 +30,13 @@ function update_script() { exit fi - RELEASE=$(curl -fsSL https://api.github.com/repos/adityachandelgit/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//') + RELEASE=$(curl -fsSL https://api.github.com/repos/booklore-app/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//') if [[ "${RELEASE}" != "$(cat ~/.booklore 2>/dev/null)" ]] || [[ ! -f ~/.booklore ]]; then msg_info "Stopping $APP" systemctl stop booklore msg_ok "Stopped $APP" - fetch_and_deploy_gh_release "booklore" "adityachandelgit/BookLore" + fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore" msg_info "Building Frontend" cd /opt/booklore/booklore-ui @@ -45,7 +46,7 @@ function update_script() { msg_info "Building Backend" cd /opt/booklore/booklore-api - APP_VERSION=$(curl -fsSL https://api.github.com/repos/adityachandelgit/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//') + APP_VERSION=$(curl -fsSL https://api.github.com/repos/booklore-app/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//') yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml $STD ./gradlew clean build --no-daemon mkdir -p /opt/booklore/dist diff --git a/ct/cronicle.sh b/ct/cronicle.sh index c02acd75b..75b920ac2 100644 --- a/ct/cronicle.sh +++ b/ct/cronicle.sh @@ -56,30 +56,18 @@ function update_script() { LATEST=$(curl -fsSL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4) IP=$(hostname -I | awk '{print $1}') msg_info "Installing Dependencies" - - $STD apt-get install -y git - $STD apt-get install -y make - $STD apt-get install -y g++ - $STD apt-get install -y gcc - $STD apt-get install -y ca-certificates - $STD apt-get install -y gnupg + $STD apt-get install -y \ + git \ + build-essential \ + ca-certificates \ + gnupg2 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" + NODE_VERSION="22" setup_nodejs + fetch_and_deploy_gh_release "cronicle" "jhuckaby/Cronicle" - msg_info "Installing Node.js" - $STD apt-get update - $STD apt-get install -y nodejs - msg_ok "Installed Node.js" - - msg_info "Installing Cronicle Worker" - mkdir -p /opt/cronicle + msg_info "Configuring Cronicle Worker" cd /opt/cronicle - $STD tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1 $STD npm install $STD node bin/build.js dist sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json @@ -88,6 +76,7 @@ function update_script() { chmod 775 /etc/init.d/cronicled $STD update-rc.d cronicled defaults msg_ok "Installed Cronicle Worker" + echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n" exit fi diff --git a/ct/docmost.sh b/ct/docmost.sh index 8d071c022..81d80ca05 100644 --- a/ct/docmost.sh +++ b/ct/docmost.sh @@ -49,6 +49,7 @@ function update_script() { mv /opt/.env /opt/docmost/.env mv /opt/data /opt/docmost/data $STD pnpm install --force + $STD pnpm nx run server:build # Dirty fix https://github.com/community-scripts/ProxmoxVE/issues/6377 $STD pnpm build msg_ok "Updated ${APP}" diff --git a/ct/elementsynapse.sh b/ct/elementsynapse.sh index 81e9d7e9c..f61ad4a57 100644 --- a/ct/elementsynapse.sh +++ b/ct/elementsynapse.sh @@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/mis APP="Element Synapse" var_tags="${var_tags:-server}" var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-1024}" +var_ram="${var_ram:-2048}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-12}" diff --git a/ct/fumadocs.sh b/ct/fumadocs.sh index 3a71314a8..dcd9e8a33 100644 --- a/ct/fumadocs.sh +++ b/ct/fumadocs.sh @@ -43,6 +43,9 @@ function update_script() { msg_error "Project directory does not exist: $PROJECT_DIR" exit 1 fi + if ! command -v git &>/dev/null; then + $STD apt-get install -y git + fi msg_info "Stopping service $SERVICE_NAME" systemctl stop "$SERVICE_NAME" diff --git a/ct/gotify.sh b/ct/gotify.sh index eb5da7a9b..88e2db566 100644 --- a/ct/gotify.sh +++ b/ct/gotify.sh @@ -29,23 +29,18 @@ function update_script() { fi RELEASE=$(curl -fsSL https://api.github.com/repos/gotify/server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ "${RELEASE}" != "$(cat ~/.gotify 2>/dev/null)" ]] || [[ ! -f ~/.gotify ]]; then msg_info "Stopping ${APP}" systemctl stop gotify msg_ok "Stopped ${APP}" - msg_info "Updating ${APP} to ${RELEASE}" - cd /opt/gotify - curl -fsSL "https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip" -o $(basename "https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-amd64.zip") - $STD unzip -o gotify-linux-amd64.zip - rm -rf gotify-linux-amd64.zip - chmod +x gotify-linux-amd64 - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated ${APP} to ${RELEASE}" + fetch_and_deploy_gh_release "gotify" "gotify/server" "prebuild" "latest" "/opt/gotify" "gotify-linux-amd64.zip" + chmod +x /opt/gotify/gotify-linux-amd64 msg_info "Starting ${APP}" systemctl start gotify msg_ok "Started ${APP}" + msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at ${RELEASE}" diff --git a/ct/grafana.sh b/ct/grafana.sh index 9c128389e..0c2f7d541 100644 --- a/ct/grafana.sh +++ b/ct/grafana.sh @@ -27,6 +27,7 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + msg_info "Updating ${APP}" $STD apt-get update $STD apt-get -y upgrade diff --git a/ct/grocy.sh b/ct/grocy.sh index 9982abb99..3c4a44c72 100644 --- a/ct/grocy.sh +++ b/ct/grocy.sh @@ -27,20 +27,20 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - php_version=$(php -v | head -n 1 | awk '{print $2}') - if [[ ! $php_version == "8.3"* ]]; then - msg_info "Updating PHP" - curl -fsSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg - echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ bookworm main" >/etc/apt/sources.list.d/php.list - apt-get update - apt-get install -y php8.3 php8.3-cli php8.3-{bz2,curl,mbstring,intl,sqlite3,fpm,gd,zip,xml} - systemctl reload apache2 - apt autoremove - msg_ok "Updated PHP" + + php_ver=$(php -v | head -n 1 | awk '{print $2}') + if [[ ! $php_ver == "8.3"* ]]; then + PHP_VERSION="8.3" PHP_MODULE="sqlite3,bz2" PHP_APACHE="yes" setup_php + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/grocy/grocy/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.grocy 2>/dev/null)" ]] || [[ ! -f ~/.grocy ]]; then + msg_info "Updating ${APP}" + bash /var/www/html/update.sh + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" fi - msg_info "Updating ${APP}" - bash /var/www/html/update.sh - msg_ok "Updated Successfully" exit } diff --git a/ct/headers/jeedom b/ct/headers/jeedom new file mode 100644 index 000000000..47ff4dfb6 --- /dev/null +++ b/ct/headers/jeedom @@ -0,0 +1,6 @@ + __ __ + / /__ ___ ____/ /___ ____ ___ + __ / / _ \/ _ \/ __ / __ \/ __ `__ \ +/ /_/ / __/ __/ /_/ / /_/ / / / / / / +\____/\___/\___/\__,_/\____/_/ /_/ /_/ + diff --git a/ct/homebox.sh b/ct/homebox.sh index b6de5c6de..c0ad11f5e 100644 --- a/ct/homebox.sh +++ b/ct/homebox.sh @@ -22,26 +22,24 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -f /opt/homebox ]]; then + if [[ ! -d /opt/homebox ]]; then msg_error "No ${APP} Installation Found!" exit fi - RELEASE=$(curl -fsSL https://api.github.com/repos/sysadminsmedia/homebox/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ -x /opt/homebox ]]; then + sed -i 's|/opt\b|/opt/homebox|g' /etc/systemd/system/homebox.service + sed -i 's|^ExecStart=/opt/homebox$|ExecStart=/opt/homebox/homebox|' /etc/systemd/system/homebox.service + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/sysadminsmedia/homebox/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.homebox 2>/dev/null)" ]] || [[ ! -f ~/.homebox ]]; then msg_info "Stopping ${APP}" systemctl stop homebox msg_ok "${APP} Stopped" - msg_info "Updating ${APP} to ${RELEASE}" - cd /opt - rm -rf homebox_bak - rm -rf /tmp/homebox.tar.gz - mv homebox homebox_bak -curl -fsSL "https://github.com/sysadminsmedia/homebox/releases/download/${RELEASE}/homebox_Linux_x86_64.tar.gz" -o "/tmp/homebox.tar.gz" - tar -xzf /tmp/homebox.tar.gz -C /opt - chmod +x /opt/homebox - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated Homebox" + fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "latest" "/opt/homebox" "homebox_Linux_x86_64.tar.gz" + chmod +x /opt/homebox/homebox + [ -f /opt/.env ] && mv /opt/.env /opt/homebox/.env msg_info "Starting ${APP}" systemctl start homebox diff --git a/ct/homepage.sh b/ct/homepage.sh index d48a70c3f..451040b9e 100644 --- a/ct/homepage.sh +++ b/ct/homepage.sh @@ -27,14 +27,9 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then - if ! command -v npm >/dev/null 2>&1; then - echo "Installing NPM..." - $STD apt-get install -y npm - $STD npm install -g pnpm - echo "Installed NPM..." - fi - fi + + NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs + # ensure that jq is installed if ! command -v jq &>/dev/null; then $STD msg_info "Installing jq..." diff --git a/ct/immich.sh b/ct/immich.sh index be85b2d74..555712b62 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -58,7 +58,7 @@ function update_script() { done msg_ok "Image-processing libraries updated" fi - RELEASE="1.136.0" + RELEASE="1.137.3" #RELEASE=$(curl -fsSL https://api.github.com/repos/immich-app/immich/releases?per_page=1 | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') if [[ -f ~/.immich && "$RELEASE" == "$(cat ~/.immich)" ]]; then msg_ok "No update required. ${APP} is already at v${RELEASE}" @@ -99,11 +99,25 @@ function update_script() { fi cp "$ML_DIR"/ml_start.sh "$INSTALL_DIR" + if grep -qs "set -a" "$APP_DIR"/bin/start.sh; then + cp "$APP_DIR"/bin/start.sh "$INSTALL_DIR" + else + cat <"$INSTALL_DIR"/start.sh +#!/usr/bin/env bash + +set -a +. "$INSTALL_DIR"/.env +set +a + +/usr/bin/node "$APP_DIR"/dist/main.js "\$@" +EOF + chmod +x "$INSTALL_DIR"/start.sh + fi rm -rf "${APP_DIR:?}"/* mkdir -p "$ML_DIR" rm -rf "$SRC_DIR" - fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.136.0" "$SRC_DIR" + fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v${RELEASE}" "$SRC_DIR" msg_info "Updating ${APP} web and microservices" cd "$SRC_DIR"/server @@ -114,6 +128,10 @@ function update_script() { $STD npm ci $STD npm run build $STD npm prune --omit=dev --omit=optional + cp -a {bin,dist,node_modules,resources,package*.json} "$APP_DIR"/ + cp package.json "$APP_DIR"/bin + mv "$INSTALL_DIR"/start.sh "$APP_DIR"/bin + sed -i 's|^start|./start|' "$APP_DIR"/bin/immich-admin cd "$SRC_DIR"/open-api/typescript-sdk $STD npm ci $STD npm run build @@ -121,7 +139,6 @@ function update_script() { $STD npm ci $STD npm run build cd "$SRC_DIR" - cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,bin/start.sh} "$APP_DIR"/ cp -a web/build "$APP_DIR"/www cp LICENSE "$APP_DIR" cd "$APP_DIR" @@ -151,8 +168,8 @@ function update_script() { fi ln -sf "$APP_DIR"/resources "$INSTALL_DIR" cd "$APP_DIR" - grep -Rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g" - grep -RlE "'/build'" | xargs -n1 sed -i "s|'/build'|'$APP_DIR'|g" + grep -rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g" + grep -rlE "'/build'" | xargs -n1 sed -i "s|'/build'|'$APP_DIR'|g" sed -i "s@\"/cache\"@\"$INSTALL_DIR/cache\"@g" "$ML_DIR"/immich_ml/config.py ln -s "${UPLOAD_DIR:-/opt/immich/upload}" "$APP_DIR"/upload ln -s "${UPLOAD_DIR:-/opt/immich/upload}" "$ML_DIR"/upload @@ -214,6 +231,7 @@ function compile_libjxl() { $STD make clean cd "$STAGING_DIR" rm -rf "$SOURCE"/{build,third_party} + sed -i "s/libjxl: .*$/libjxl: $LIBJXL_REVISION/" ~/.immich_library_revisions msg_ok "Recompiled libjxl" fi } @@ -248,6 +266,7 @@ function compile_libheif() { $STD make clean cd "$STAGING_DIR" rm -rf "$SOURCE"/build + sed -i "s/libheif: .*$/libheif: $LIBHEIF_REVISION/" ~/.immich_library_revisions msg_ok "Recompiled libheif" fi } @@ -269,6 +288,7 @@ function compile_libraw() { ldconfig /usr/local/lib $STD make clean cd "$STAGING_DIR" + sed -i "s/libraw: .*$/libraw: $LIBRAW_REVISION/" ~/.immich_library_revisions msg_ok "Recompiled libraw" fi } @@ -288,6 +308,7 @@ function compile_imagemagick() { ldconfig /usr/local/lib $STD make clean cd "$STAGING_DIR" + sed -i "s/imagemagick: .*$/imagemagick: $IMAGEMAGICK_REVISION/" ~/.immich_library_revisions msg_ok "Recompiled ImageMagick" fi } @@ -308,6 +329,7 @@ function compile_libvips() { ldconfig /usr/local/lib cd "$STAGING_DIR" rm -rf "$SOURCE"/build + sed -i "s/libvips: .*$/libvips: $LIBVIPS_REVISION/" ~/.immich_library_revisions msg_ok "Recompiled libvips" fi } diff --git a/ct/inspircd.sh b/ct/inspircd.sh index dea3c7219..c681eeedf 100644 --- a/ct/inspircd.sh +++ b/ct/inspircd.sh @@ -27,26 +27,19 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + RELEASE=$(curl -fsSL https://api.github.com/repos/inspircd/inspircd/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ "${RELEASE}" != "$(cat ~/.inspircd 2>/dev/null)" ]] || [[ ! -f ~/.inspircd ]]; then msg_info "Stopping Service" systemctl stop inspircd msg_ok "Stopped Service" - msg_info "Updating ${APP} to v${RELEASE}" - cd /opt - curl -fsSL "https://github.com/inspircd/inspircd/releases/download/v${RELEASE}/inspircd_${RELEASE}.deb12u2_amd64.deb" -o $(basename "https://github.com/inspircd/inspircd/releases/download/v${RELEASE}/inspircd_${RELEASE}.deb12u2_amd64.deb") - $STD apt-get install "./inspircd_${RELEASE}.deb12u2_amd64.deb" -y - echo "${RELEASE}" >"/opt/${APP}_version.txt" - msg_ok "Updated ${APP} to v${RELEASE}" + fetch_and_deploy_gh_release "inspircd" "inspircd/inspircd" "binary" msg_info "Starting Service" systemctl start inspircd msg_ok "Started Service" - msg_info "Cleaning up" - rm -rf /opt/inspircd_${RELEASE}.deb12u2_amd64.deb - msg_ok "Cleaned" msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at v${RELEASE}." diff --git a/ct/jackett.sh b/ct/jackett.sh index 91cd61518..6b2b80aac 100644 --- a/ct/jackett.sh +++ b/ct/jackett.sh @@ -27,17 +27,18 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - RELEASE=$(curl -fsSL https://github.com/Jackett/Jackett/releases/latest | grep "title>Release" | cut -d " " -f 4) - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then - msg_info "Updating ${APP}" - curl -fsSL "https://github.com/Jackett/Jackett/releases/download/$RELEASE/Jackett.Binaries.LinuxAMDx64.tar.gz" -o $(basename "https://github.com/Jackett/Jackett/releases/download/$RELEASE/Jackett.Binaries.LinuxAMDx64.tar.gz") - systemctl stop jackett + + if [ ! -f /opt/.env ]; then + sed -i 's|^Environment="DisableRootWarning=true"$|EnvironmentFile="/opt/.env"|' /etc/systemd/system/jackett.service + cat </opt/.env +DisableRootWarning=true +EOF + fi + + RELEASE=$(curl -s https://api.github.com/repos/Jackett/Jackett/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.jackett 2>/dev/null)" ]] || [[ ! -f ~/.jackett ]]; then rm -rf /opt/Jackett - tar -xzf Jackett.Binaries.LinuxAMDx64.tar.gz -C /opt - rm -rf Jackett.Binaries.LinuxAMDx64.tar.gz - systemctl start jackett - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated ${APP} to ${RELEASE}" + fetch_and_deploy_gh_release "jackett" "Jackett/Jackett" "prebuild" "latest" "/opt/Jackett" "Jackett.Binaries.LinuxAMDx64.tar.gz" else msg_ok "No update required. ${APP} is already at ${RELEASE}" fi diff --git a/ct/jeedom.sh b/ct/jeedom.sh new file mode 100644 index 000000000..2b933cb83 --- /dev/null +++ b/ct/jeedom.sh @@ -0,0 +1,46 @@ +#!/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: Mips2648 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://jeedom.com/ + +APP="Jeedom" +var_tags="${var_tags:-automation;smarthome}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-16}" +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 /var/www/html/core/config/version ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + msg_info "Updating OS" + $STD apt-get update + $STD apt-get -y upgrade + msg_ok "OS updated, you can now update Jeedom from the Web UI." + 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}${CL}" diff --git a/ct/keycloak.sh b/ct/keycloak.sh index 7494b6602..8cd4583d8 100644 --- a/ct/keycloak.sh +++ b/ct/keycloak.sh @@ -23,34 +23,39 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -f /etc/systemd/system/keycloak.service ]]; then + if [[ ! -d /opt/keycloak ]]; then msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating ${APP} LXC" + + msg_info "Stopping Keycloak" + systemctl stop keycloak + msg_ok "Stopped Keycloak" msg_info "Updating packages" $STD apt-get update $STD apt-get -y upgrade + msg_ok "Updated packages" - RELEASE=$(curl -fsSL https://api.github.com/repos/keycloak/keycloak/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - msg_info "Updating Keycloak to v$RELEASE" + msg_info "Backup old Keycloak" cd /opt - curl -fsSL "https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz" -o $(basename "https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz") mv keycloak keycloak.old - tar -xzf keycloak-$RELEASE.tar.gz - cp -r keycloak.old/conf keycloak-$RELEASE - cp -r keycloak.old/providers keycloak-$RELEASE - cp -r keycloak.old/themes keycloak-$RELEASE - mv keycloak-$RELEASE keycloak + tar -czf keycloak_conf_backup.tar.gz keycloak.old/conf + msg_ok "Backup done" - msg_info "Delete temporary installation files" - rm keycloak-$RELEASE.tar.gz + fetch_and_deploy_gh_release "keycloak" "keycloak/keycloak" "prebuild" "latest" "/opt/keycloak" "keycloak-*.tar.gz" + + msg_info "Updating ${APP}" + cd /opt + mv keycloak_conf_backup.tar.gz keycloak/conf + cp -r keycloak.old/providers keycloak + cp -r keycloak.old/themes keycloak rm -rf keycloak.old + msg_ok "Updated ${APP} LXC" - msg_info "Restating Keycloak" + msg_info "Restarting Keycloak" systemctl restart keycloak - msg_ok "Updated Successfully" + msg_ok "Restarted Keycloak" exit } diff --git a/ct/koillection.sh b/ct/koillection.sh index 373d3fd73..87982ec18 100644 --- a/ct/koillection.sh +++ b/ct/koillection.sh @@ -28,17 +28,18 @@ function update_script() { exit fi RELEASE=$(curl -fsSL https://api.github.com/repos/benjaminjonard/koillection/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ ! -f ~/.koillection ]] || [[ "${RELEASE}" != "$(cat ~/.koillection)" ]]; then msg_info "Stopping Service" systemctl stop apache2 msg_ok "Stopped Service" - msg_info "Updating ${APP} to v${RELEASE}" - cd /opt + msg_info "Creating a backup" mv /opt/koillection/ /opt/koillection-backup - curl -fsSL "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip") - $STD unzip "${RELEASE}.zip" - mv "/opt/koillection-${RELEASE}" /opt/koillection + msg_ok "Backup created" + + fetch_and_deploy_gh_release "koillection" "benjaminjonard/koillection" + + msg_info "Updating ${APP} to v${RELEASE}" cd /opt/koillection cp -r /opt/koillection-backup/.env.local /opt/koillection cp -r /opt/koillection-backup/public/uploads/. /opt/koillection/public/uploads/ @@ -50,7 +51,6 @@ function update_script() { $STD yarn install $STD yarn build chown -R www-data:www-data /opt/koillection/public/uploads - echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated $APP to v${RELEASE}" msg_info "Starting Service" @@ -58,9 +58,9 @@ function update_script() { msg_ok "Started Service" msg_info "Cleaning up" - rm -r "/opt/${RELEASE}.zip" rm -r /opt/koillection-backup msg_ok "Cleaned" + msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at v${RELEASE}" diff --git a/ct/komga.sh b/ct/komga.sh index ef76c20f5..1370dcf29 100644 --- a/ct/komga.sh +++ b/ct/komga.sh @@ -27,23 +27,21 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating ${APP}" + RELEASE=$(curl -fsSL https://api.github.com/repos/gotson/komga/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ ! -f ~/.komga ]] || [[ "${RELEASE}" != "$(cat ~/.komga)" ]]; then msg_info "Stopping ${APP}" systemctl stop komga msg_ok "Stopped ${APP}" - msg_info "Updating ${APP} to ${RELEASE}" - curl -fsSL "https://github.com/gotson/komga/releases/download/${RELEASE}/komga-${RELEASE}.jar" -o $(basename "https://github.com/gotson/komga/releases/download/${RELEASE}/komga-${RELEASE}.jar") - rm -rf /opt/komga/komga.jar - mv -f komga-${RELEASE}.jar /opt/komga/komga.jar - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated ${APP} to ${RELEASE}" + rm -f /opt/komga/komga.jar + USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "komga" "gotson/komga" "singlefile" "latest" "/opt/komga" "komga*.jar" + mv /opt/komga/komga-*.jar /opt/komga/komga.jar msg_info "Starting ${APP}" systemctl start komga msg_ok "Started ${APP}" + msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at ${RELEASE}." diff --git a/ct/kubo.sh b/ct/kubo.sh index fbf968881..aeb363a8d 100644 --- a/ct/kubo.sh +++ b/ct/kubo.sh @@ -23,21 +23,24 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -f /usr/local/kubo ]]; then + if [[ ! -f /usr/local/kubo/ipfs ]]; then msg_error "No ${APP} Installation Found!" exit fi - RELEASE=$(curl -fsSL https://github.com/ipfs/kubo/releases/latest | grep "title>Release" | cut -d " " -f 4) - if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then - msg_info "Updating $APP LXC" - $STD apt-get update - $STD apt-get -y upgrade - curl -fsSL "https://github.com/ipfs/kubo/releases/download/${RELEASE}/kubo_${RELEASE}_linux-amd64.tar.gz" -o $(basename "https://github.com/ipfs/kubo/releases/download/${RELEASE}/kubo_${RELEASE}_linux-amd64.tar.gz") - tar -xzf "kubo_${RELEASE}_linux-amd64.tar.gz" -C /usr/local - systemctl restart ipfs.service - echo "${RELEASE}" >/opt/${APP}_version.txt - rm "kubo_${RELEASE}_linux-amd64.tar.gz" - msg_ok "Updated $APP LXC" + + RELEASE=$(curl -fsSL https://api.github.com/repos/ipfs/kubo/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.kubo)" ]] || [[ ! -f ~/.kubo ]]; then + msg_info "Stopping service" + systemctl stop ipfs + msg_ok "Stopped service" + + fetch_and_deploy_gh_release "kubo" "ipfs/kubo" "prebuild" "latest" "/usr/local/kubo" "kubo*linux-amd64.tar.gz" + + msg_info "Starting service" + systemctl start ipfs + msg_ok "Service started" + + msg_ok "Updated successfuly" else msg_ok "No update required. ${APP} is already at ${RELEASE}" fi diff --git a/ct/librespeed-rust.sh b/ct/librespeed-rust.sh index c25c062f9..0708c7e3a 100644 --- a/ct/librespeed-rust.sh +++ b/ct/librespeed-rust.sh @@ -27,16 +27,17 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - RELEASE=$(curl -fsSL https://api.github.com/repos/librespeed/speedtest-rust/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "v([^"]+).*/\1/') + + RELEASE=$(curl -fsSL https://api.github.com/repos/librespeed/speedtest-rust/releases/latest | jq -r '.tag_name' | sed 's/^v//') if [[ "${RELEASE}" != "$(cat ~/.librespeed 2>/dev/null)" ]] || [[ ! -f ~/.librespeed ]]; then msg_info "Stopping Services" - systemctl stop librespeed-rs + systemctl stop librespeed_rs msg_ok "Services Stopped" fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-aarch64-unknown-linux-gnu.deb" msg_info "Starting Service" - systemctl start librespeed-rs + systemctl start librespeed_rs msg_ok "Started Service" else msg_ok "No update required. ${APP} is already at v${RELEASE}" diff --git a/ct/lidarr.sh b/ct/lidarr.sh index 51fd881a5..c125ed2b2 100644 --- a/ct/lidarr.sh +++ b/ct/lidarr.sh @@ -29,19 +29,24 @@ function update_script() { exit fi - msg_info "Updating $APP LXC" - temp_file="$(mktemp)" - rm -rf /opt/Lidarr - RELEASE=$(curl -fsSL https://api.github.com/repos/Lidarr/Lidarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - curl -fsSL "https://github.com/Lidarr/Lidarr/releases/download/v${RELEASE}/Lidarr.master.${RELEASE}.linux-core-x64.tar.gz" -o "$temp_file" - $STD tar -xvzf "$temp_file" - mv Lidarr /opt - chmod 775 /opt/Lidarr - msg_ok "Updated $APP LXC" + RELEASE=$(curl -fsSL https://api.github.com/repos/Lidarr/Lidarr/releases/latest | jq -r '.tag_name' | sed 's/^v//') + if [[ "${RELEASE}" != "$(cat ~/.lidarr)" ]] || [[ ! -f ~/.lidarr ]]; then - msg_info "Cleaning up" - rm -rf "$temp_file" - msg_ok "Cleaned up" + msg_info "Stopping service" + systemctl stop lidarr + msg_ok "Service stopped" + + fetch_and_deploy_gh_release "lidarr" "Lidarr/Lidarr" "prebuild" "latest" "/opt/Lidarr" "Lidarr.master*linux-core-x64.tar.gz" + chmod 775 /opt/Lidarr + + msg_info "Starting service" + systemctl start lidarr + msg_ok "Service started" + + msg_ok "Updated successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi exit } diff --git a/ct/listmonk.sh b/ct/listmonk.sh index f725b2747..f1981c32e 100644 --- a/ct/listmonk.sh +++ b/ct/listmonk.sh @@ -27,31 +27,33 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + if ! command -v jq &>/dev/null; then + $STD apt-get install -y jq + fi - RELEASE=$(curl -fsSL https://api.github.com/repos/knadh/listmonk/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + RELEASE=$(curl -fsSL https://api.github.com/repos/knadh/listmonk/releases/latest | jq -r '.tag_name' | sed 's/^v//') + if [[ "${RELEASE}" != "$(cat ~/.listmonk)" ]] || [[ ! -f ~/.listmonk ]]; then msg_info "Stopping ${APP}" systemctl stop listmonk msg_ok "Stopped ${APP}" - msg_info "Updating ${APP} to v${RELEASE}" - cd /opt + msg_info "Backing up data" mv /opt/listmonk/ /opt/listmonk-backup - mkdir /opt/listmonk/ - curl -fsSL "https://github.com/knadh/listmonk/releases/download/v${RELEASE}/listmonk_${RELEASE}_linux_arm64.tar.gz" -o $(basename "https://github.com/knadh/listmonk/releases/download/v${RELEASE}/listmonk_${RELEASE}_linux_arm64.tar.gz") - tar -xzf "listmonk_${RELEASE}_linux_arm64.tar.gz" -C /opt/listmonk + msg_ok "Backed up data" + + fetch_and_deploy_gh_release "listmonk" "knadh/listmonk" "prebuild" "latest" "/opt/listmonk" "listmonk*linux_arm64.tar.gz" + + msg_info "Configuring listmonk" mv /opt/listmonk-backup/config.toml /opt/listmonk/config.toml mv /opt/listmonk-backup/uploads /opt/listmonk/uploads $STD /opt/listmonk/listmonk --upgrade --yes --config /opt/listmonk/config.toml - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated $APP to v${RELEASE}" + msg_ok "Configured listmonk" msg_info "Starting ${APP}" systemctl start listmonk msg_ok "Started ${APP}" msg_info "Cleaning up" - rm -rf "/opt/listmonk_${RELEASE}_linux_arm64.tar.gz" rm -rf /opt/listmonk-backup/ msg_ok "Cleaned" diff --git a/ct/lubelogger.sh b/ct/lubelogger.sh index 95bddb515..c923e878d 100644 --- a/ct/lubelogger.sh +++ b/ct/lubelogger.sh @@ -27,16 +27,17 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - RELEASE=$(curl -fsSL https://api.github.com/repos/hargata/lubelog/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - RELEASE_TRIMMED=$(echo "${RELEASE}" | tr -d ".") - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if ! command -v jq &>/dev/null; then + $STD apt-get install -y jq + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/hargata/lubelog/releases/latest | jq -r '.tag_name' | sed 's/^v//') + if [[ ! -f ~/.lubelogger ]] || [[ "${RELEASE}" != "$(cat ~/.lubelogger)" ]]; then msg_info "Stopping Service" systemctl stop lubelogger msg_ok "Stopped Service" - msg_info "Updating ${APP} to v${RELEASE}" - cd /opt - curl -fsSL "https://github.com/hargata/lubelog/releases/download/v${RELEASE}/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip" -o $(basename "https://github.com/hargata/lubelog/releases/download/v${RELEASE}/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip") + msg_info "Backing up data" mkdir -p /tmp/lubeloggerData/data cp /opt/lubelogger/appsettings.json /tmp/lubeloggerData/appsettings.json cp -r /opt/lubelogger/data/ /tmp/lubeloggerData/ @@ -50,20 +51,23 @@ function update_script() { [[ -e /opt/lubelogger/wwwroot/temp ]] && cp -r /opt/lubelogger/wwwroot/temp /tmp/lubeloggerData/data/ [[ -e /opt/lubelogger/log ]] && cp -r /opt/lubelogger/log /tmp/lubeloggerData/ rm -rf /opt/lubelogger - $STD unzip LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip -d lubelogger + msg_ok "Backed up data" + + fetch_and_deploy_gh_release "lubelogger" "hargata/lubelog" "prebuild" "latest" "/opt/lubelogger" "LubeLogger*linux_x64.zip" + + msg_info "Configuring LubeLogger" chmod 700 /opt/lubelogger/CarCareTracker cp -rf /tmp/lubeloggerData/* /opt/lubelogger/ - echo "${RELEASE}" >"/opt/${APP}_version.txt" - msg_ok "Updated ${APP} to v${RELEASE}" + msg_ok "Configured LubeLogger" msg_info "Starting Service" systemctl start lubelogger msg_ok "Started Service" msg_info "Cleaning up" - rm -rf /opt/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip rm -rf /tmp/lubeloggerData msg_ok "Cleaned" + msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at v${RELEASE}." diff --git a/ct/magicmirror.sh b/ct/magicmirror.sh index 715674158..0b930342b 100644 --- a/ct/magicmirror.sh +++ b/ct/magicmirror.sh @@ -27,16 +27,17 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - RELEASE=$(curl -fsSL https://api.github.com/repos/MagicMirrorOrg/MagicMirror/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt; fi - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if ! command -v jq &>/dev/null; then + $STD apt-get install -y jq + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/MagicMirrorOrg/MagicMirror/releases/latest | jq -r '.tag_name' | sed 's/^v//') + if [[ ! -f ~/.magicmirror ]] || [[ "${RELEASE}" != "$(cat ~/.magicmirror)" ]]; then msg_info "Stopping Service" systemctl stop magicmirror msg_ok "Stopped Service" - msg_info "Updating ${APP} to v${RELEASE}" - $STD apt-get update - $STD apt-get upgrade -y + msg_info "Backing up data" rm -rf /opt/magicmirror-backup mkdir /opt/magicmirror-backup cp /opt/magicmirror/config/config.js /opt/magicmirror-backup @@ -44,27 +45,24 @@ function update_script() { cp /opt/magicmirror/css/custom.css /opt/magicmirror-backup fi cp -r /opt/magicmirror/modules /opt/magicmirror-backup - temp_file=$(mktemp) -curl -fsSL "https://github.com/MagicMirrorOrg/MagicMirror/archive/refs/tags/v${RELEASE}.tar.gz" -o ""$temp_file"" - tar -xzf "$temp_file" - rm -rf /opt/magicmirror - mv MagicMirror-${RELEASE} /opt/magicmirror + msg_ok "Backed up data" + + fetch_and_deploy_gh_release "magicmirror" "MagicMirrorOrg/MagicMirror" "tarball" + + msg_info "Configuring MagicMirror" cd /opt/magicmirror + sed -i -E 's/("postinstall": )".*"/\1""/; s/("prepare": )".*"/\1""/' package.json $STD npm run install-mm cp /opt/magicmirror-backup/config.js /opt/magicmirror/config/ if [[ -f /opt/magicmirror-backup/custom.css ]]; then cp /opt/magicmirror-backup/custom.css /opt/magicmirror/css/ fi - echo "${RELEASE}" >"/opt/${APP}_version.txt" - msg_ok "Updated ${APP} to v${RELEASE}" + msg_ok "Configured MagicMirror" msg_info "Starting Service" systemctl start magicmirror msg_ok "Started Service" - msg_info "Cleaning up" - rm -f $temp_file - msg_ok "Cleaned" msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at v${RELEASE}." diff --git a/ct/managemydamnlife.sh b/ct/managemydamnlife.sh index 95311c5df..b581e3c9a 100644 --- a/ct/managemydamnlife.sh +++ b/ct/managemydamnlife.sh @@ -28,39 +28,33 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + if ! command -v jq &>/dev/null; then + $STD apt-get install -y jq + fi - RELEASE=$(curl -fsSL https://api.github.com/repos/intri-in/manage-my-damn-life-nextjs/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ "${RELEASE}" != "$(cat /opt/mmdl_version.txt)" ]] || [[ ! -f /opt/mmdl_version.txt ]]; then - msg_info "Stopping $APP" + RELEASE=$(curl -fsSL https://api.github.com/repos/intri-in/manage-my-damn-life-nextjs/releases/latest | jq -r '.tag_name' | sed 's/^v//') + if [[ "${RELEASE}" != "$(cat ~/.mmdl)" ]] || [[ ! -f ~/.mmdl ]]; then + msg_info "Stopping service" systemctl stop mmdl - msg_ok "Stopped $APP" + msg_ok "Stopped service" msg_info "Creating Backup" cp /opt/mmdl/.env /opt/mmdl.env msg_ok "Backup Created" - msg_info "Updating $APP to v${RELEASE}" - curl -fsSLO "https://github.com/intri-in/manage-my-damn-life-nextjs/archive/refs/tags/v${RELEASE}.zip" - rm -r /opt/mmdl - unzip -q v"$RELEASE".zip - mv manage-my-damn-life-nextjs-"$RELEASE"/ /opt/mmdl - mv /opt/mmdl.env /opt/mmdl/.env + fetch_and_deploy_gh_release "mmdl" "intri-in/manage-my-damn-life-nextjs" "tarball" + + msg_info "Configuring ${APP}" cd /opt/mmdl $STD npm install $STD npm run migrate $STD npm run build - msg_ok "Updated $APP to v${RELEASE}" + msg_ok "Configured ${APP}" - msg_info "Starting $APP" + msg_info "Starting service" systemctl start mmdl - msg_ok "Started $APP" + msg_ok "Started service" - msg_info "Cleaning Up" - rm -f ~/v"$RELEASE".zip - msg_ok "Cleanup Completed" - - # Last Action - echo "$RELEASE" >/opt/mmdl_version.txt msg_ok "Update Successful" else msg_ok "No update required. ${APP} is already at v${RELEASE}" diff --git a/ct/mediamtx.sh b/ct/mediamtx.sh index 8ab37c93d..28076bbe5 100644 --- a/ct/mediamtx.sh +++ b/ct/mediamtx.sh @@ -20,15 +20,34 @@ color catch_errors function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -d /opt/mediamtx/ ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - msg_error "Currently we don't provide an update function for this ${APP}." - exit + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/mediamtx/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if ! command -v jq &>/dev/null; then + $STD apt-get install -y jq + fi + + RELEASE=$(curl -fsSL https://api.github.com/repos/bluenviron/mediamtx/releases/latest | jq -r '.tag_name' | sed 's/^v//') + if [[ "${RELEASE}" != "$(cat ~/.mediamtx)" ]] || [[ ! -f ~/.mediamtx ]]; then + msg_info "Stopping service" + systemctl stop mediamtx + msg_ok "Service stopped" + + fetch_and_deploy_gh_release "mediamtx" "bluenviron/mediamtx" "prebuild" "latest" "/opt/mediamtx" "mediamtx*linux_amd64.tar.gz" + + msg_info "Starting service" + systemctl start mediamtx + msg_ok "Service started" + + msg_ok "Updated successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + fi + exit } start diff --git a/ct/meilisearch.sh b/ct/meilisearch.sh index 98a51e634..56bc5f643 100644 --- a/ct/meilisearch.sh +++ b/ct/meilisearch.sh @@ -24,7 +24,7 @@ function update_script() { check_container_storage check_container_resources - if [[ ! -f /opt/Meilisearch_version.txt ]]; then + if [[ ! -d /opt/meilisearch ]]; then msg_error "No Meilisearch Installation Found!" exit fi @@ -38,13 +38,7 @@ function update_script() { systemctl stop meilisearch msg_ok "Stopped Meilisearch" - msg_info "Updating Meilisearch" - tmp_file=$(mktemp) - RELEASE=$(curl -s https://api.github.com/repos/meilisearch/meilisearch/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - curl -fsSL https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch.deb -o $tmp_file - $STD dpkg -i $tmp_file - echo "$RELEASE" >/opt/meilisearch_version.txt - msg_ok "Updated Meilisearch" + fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" msg_info "Starting Meilisearch" systemctl start meilisearch @@ -53,7 +47,7 @@ function update_script() { fi if [ "$UPD" == "2" ]; then - if [[ ! -f /opt/Meilisearch-ui_version.txt ]]; then + if [[ ! -d /opt/meilisearch-ui ]]; then msg_error "No Meilisearch-UI Installation Found!" exit fi @@ -61,22 +55,16 @@ function update_script() { systemctl stop meilisearch-ui msg_ok "Stopped Meilisearch-UI" - msg_info "Updating Meilisearch-UI" - tmp_file=$(mktemp) - tmp_dir=$(mktemp -d) - RELEASE_UI=$(curl -s https://api.github.com/repos/riccox/meilisearch-ui/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') cp /opt/meilisearch-ui/.env.local /tmp/.env.local.bak rm -rf /opt/meilisearch-ui - mkdir -p /opt/meilisearch-ui - curl -fsSL "https://github.com/riccox/meilisearch-ui/archive/refs/tags/${RELEASE_UI}.zip" -o $tmp_file - $STD unzip "$tmp_file" -d "$tmp_dir" - mv "$tmp_dir"/*/* /opt/meilisearch-ui/ + fetch_and_deploy_gh_release "meilisearch-ui" "riccox/meilisearch-ui" "tarball" + + msg_info "Configuring Meilisearch-UI" cd /opt/meilisearch-ui sed -i 's|const hash = execSync("git rev-parse HEAD").toString().trim();|const hash = "unknown";|' /opt/meilisearch-ui/vite.config.ts mv /tmp/.env.local.bak /opt/meilisearch-ui/.env.local $STD pnpm install - echo "$RELEASE_UI" >/opt/meilisearch-ui_version.txt - msg_ok "Updated Meilisearch-UI" + msg_ok "Configured Meilisearch-UI" msg_info "Starting Meilisearch-UI" systemctl start meilisearch-ui diff --git a/ct/memos.sh b/ct/memos.sh index 882b96f43..24ba51df9 100644 --- a/ct/memos.sh +++ b/ct/memos.sh @@ -7,9 +7,9 @@ source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/mis APP="Memos" var_tags="${var_tags:-notes}" -var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-3072}" -var_disk="${var_disk:-7}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-3}" var_os="${var_os:-debian}" var_version="${var_version:-12}" var_unprivileged="${var_unprivileged:-1}" @@ -27,26 +27,23 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating $APP (Patience)" - cd /opt/memos - git reset --hard HEAD - output=$(git pull --no-rebase) - if echo "$output" | grep -q "Already up to date."; then - msg_ok "$APP is already up to date." - exit + + RELEASE=$(curl -fsSL https://api.github.com/repos/usememos/memos/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.memos 2>/dev/null)" ]] || [[ ! -f ~/.memos ]]; then + msg_info "Stopping service" + systemctl stop memos + msg_ok "Service stopped" + + fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "latest" "/opt/memos" "memos*linux_amd64.tar.gz" + + msg_info "Starting service" + systemctl start memos + msg_ok "Service started" + + msg_ok "Updated successfully" + else + msg_ok "No update required. ${APP} is already at v${RELEASE}" fi - systemctl stop memos - export NODE_OPTIONS="--max-old-space-size=2048" - cd /opt/memos/web - $STD pnpm i --frozen-lockfile - $STD pnpm build - cd /opt/memos - mkdir -p /opt/memos/server/dist - cp -r web/dist/* /opt/memos/server/dist/ - cp -r web/dist/* /opt/memos/server/router/frontend/dist/ - $STD go build -o /opt/memos/memos -tags=embed bin/memos/main.go - systemctl start memos - msg_ok "Updated $APP" exit } diff --git a/ct/monica.sh b/ct/monica.sh index cd7c2c461..be6c2af12 100644 --- a/ct/monica.sh +++ b/ct/monica.sh @@ -27,18 +27,20 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + RELEASE=$(curl -fsSL https://api.github.com/repos/monicahq/monica/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ ! -f ~/.monica ]] || [[ "${RELEASE}" != "$(cat ~/.monica)" ]]; then msg_info "Stopping Service" systemctl stop apache2 msg_ok "Stopped Service" - msg_info "Updating ${APP} to v${RELEASE}" - cd /opt + msg_info "Creating backup" mv /opt/monica/ /opt/monica-backup - curl -fsSL "https://github.com/monicahq/monica/releases/download/v${RELEASE}/monica-v${RELEASE}.tar.bz2" -o $(basename "https://github.com/monicahq/monica/releases/download/v${RELEASE}/monica-v${RELEASE}.tar.bz2") - tar -xjf "monica-v${RELEASE}.tar.bz2" - mv "/opt/monica-v${RELEASE}" /opt/monica + msg_ok "Backup created" + + fetch_and_deploy_gh_release "monica" "monicahq/monica" "prebuild" "latest" "/opt/monica" "monica-v*.tar.bz2" + + msg_info "Configuring monica" cd /opt/monica/ cp -r /opt/monica-backup/.env /opt/monica cp -r /opt/monica-backup/storage/* /opt/monica/storage/ @@ -48,17 +50,16 @@ function update_script() { $STD php artisan monica:update --force chown -R www-data:www-data /opt/monica chmod -R 775 /opt/monica/storage - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated $APP to v${RELEASE}" + msg_ok "Configured monica" msg_info "Starting Service" systemctl start apache2 msg_ok "Started Service" msg_info "Cleaning up" - rm -r "/opt/monica-v${RELEASE}.tar.bz2" rm -r /opt/monica-backup msg_ok "Cleaned" + msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at v${RELEASE}" diff --git a/ct/myspeed.sh b/ct/myspeed.sh index 5f6c822ee..ede3ce468 100644 --- a/ct/myspeed.sh +++ b/ct/myspeed.sh @@ -28,31 +28,28 @@ function update_script() { exit fi RELEASE=$(curl -fsSL https://github.com/gnmyt/myspeed/releases/latest | grep "title>Release" | cut -d " " -f 5) - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then - + if [[ ! -f ~/.myspeed ]] || [[ "${RELEASE}" != "$(cat ~/.myspeed)" ]]; then msg_info "Stopping ${APP} Service" systemctl stop myspeed msg_ok "Stopped ${APP} Service" - msg_info "Updating ${APP} to ${RELEASE}" + msg_info "Creating backup" cd /opt rm -rf myspeed_bak mv myspeed myspeed_bak - curl -fsSL "https://github.com/gnmyt/myspeed/releases/download/v$RELEASE/MySpeed-$RELEASE.zip" -o $(basename "https://github.com/gnmyt/myspeed/releases/download/v$RELEASE/MySpeed-$RELEASE.zip") - $STD unzip MySpeed-$RELEASE.zip -d myspeed - cd myspeed + msg_ok "Backup created" + + fetch_and_deploy_gh_release "myspeed" "gnmyt/myspeed" "prebuild" "latest" "/opt/myspeed" "MySpeed-*.zip" + + msg_info "Updating ${APP} to ${RELEASE}" + cd /opt/myspeed $STD npm install - echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated ${APP} to ${RELEASE}" msg_info "Starting ${APP} Service" systemctl start myspeed msg_ok "Started ${APP} Service" - msg_info "Cleaning up" - rm -rf MySpeed-$RELEASE.zip - msg_ok "Cleaned" - msg_ok "Updated Successfully!\n" else msg_ok "No update required. ${APP} is already at ${RELEASE}" diff --git a/ct/n8n.sh b/ct/n8n.sh index 3629d3e67..6de7162cc 100644 --- a/ct/n8n.sh +++ b/ct/n8n.sh @@ -34,6 +34,18 @@ function update_script() { echo "Installed NPM..." fi fi + if [ ! -f /opt/n8n.env ]; then + sed -i 's|^Environment="N8N_SECURE_COOKIE=false"$|EnvironmentFile=/opt/n8n.env|' /etc/systemd/system/n8n.service + HOST_IP=$(hostname -I | awk '{print $1}') + mkdir -p /opt + cat </opt/n8n.env +N8N_SECURE_COOKIE=false +N8N_PORT=5678 +N8N_PROTOCOL=http +N8N_HOST=$HOST_IP +EOF + fi + msg_info "Updating ${APP} LXC" $STD npm update -g n8n systemctl restart n8n diff --git a/ct/navidrome.sh b/ct/navidrome.sh index 533d83af6..b20a4cd28 100644 --- a/ct/navidrome.sh +++ b/ct/navidrome.sh @@ -27,27 +27,19 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - RELEASE=$(curl -fsSL https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk -F '"' '{print $4}') - if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt; fi - if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + + RELEASE=$(curl -fsSL https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.navidrome 2>/dev/null)" ]] || [[ ! -f ~/.navidrome ]]; then msg_info "Stopping Services" systemctl stop navidrome msg_ok "Services Stopped" - msg_info "Updating ${APP} to ${RELEASE}" - TMP_DEB=$(mktemp --suffix=.deb) - curl -fsSL -o "${TMP_DEB}" "https://github.com/navidrome/navidrome/releases/download/${RELEASE}/navidrome_${RELEASE#v}_linux_amd64.deb" - $STD apt-get install -y "${TMP_DEB}" - echo "${RELEASE}" >/opt/"${APP}_version.txt" - msg_ok "Updated Navidrome" + fetch_and_deploy_gh_release "navidrome" "navidrome/navidrome" "binary" msg_info "Starting Services" systemctl start navidrome msg_ok "Started Services" - msg_info "Cleaning Up" - rm -f "${TMP_DEB}" - msg_ok "Cleaned" msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at ${RELEASE}" diff --git a/ct/neo4j.sh b/ct/neo4j.sh index 9c54fde0e..d8c6cb5a7 100644 --- a/ct/neo4j.sh +++ b/ct/neo4j.sh @@ -28,16 +28,7 @@ function update_script() { exit fi if ! dpkg -l | grep -q temurin-21-jre; then - msg_info "Installing Adoptium JDK" - $STD apt-get install -y \ - gnupg2 \ - lsb-release - mkdir -p /etc/apt/keyrings - curl -fsSL https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor >/etc/apt/trusted.gpg.d/adoptium.gpg - echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" >/etc/apt/sources.list.d/adoptium.list - $STD apt-get update - $STD apt-get install -y temurin-21-jre - msg_ok "Adoptium JDK installed" + JAVA_VERSION="21" setup_java fi msg_info "Updating ${APP}" $STD apt-get update diff --git a/ct/nodebb.sh b/ct/nodebb.sh index 1558cd769..ac74d3e62 100644 --- a/ct/nodebb.sh +++ b/ct/nodebb.sh @@ -32,7 +32,7 @@ function update_script() { fi RELEASE=$(curl -fsSL https://api.github.com/repos/NodeBB/NodeBB/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 + if [[ "${RELEASE}" != "$(cat ~/.nodebb)" ]] || [[ ! -f ~/.nodebb ]]; then msg_info "Stopping ${APP}" systemctl stop nodebb msg_ok "Stopped ${APP}" @@ -40,13 +40,14 @@ function update_script() { msg_info "Updating ${APP} to v${RELEASE}" cd /opt/nodebb $STD ./nodebb upgrade - echo "${RELEASE}" >/opt/${APP}_version.txt + echo "${RELEASE}" > ~/.nodebb msg_ok "Updated ${APP} to v${RELEASE}" msg_info "Starting ${APP}" systemctl start nodebb msg_ok "Started ${APP}" - msg_ok "Updated Successfully" + + msg_ok "Updated Successfully\n" else msg_ok "No update required. ${APP} is already at v${RELEASE}." fi @@ -60,4 +61,4 @@ 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}:4567${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4567${CL}" diff --git a/ct/oauth2-proxy.sh b/ct/oauth2-proxy.sh index 47dcce1d9..bc909dbd0 100644 --- a/ct/oauth2-proxy.sh +++ b/ct/oauth2-proxy.sh @@ -30,26 +30,18 @@ function update_script() { fi RELEASE=$(curl -fsSL https://api.github.com/repos/oauth2-proxy/oauth2-proxy/releases/latest | jq -r .tag_name | sed 's/^v//') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ ! -f ~/.oauth2-proxy ]] || [[ "${RELEASE}" != "$(cat ~/.oauth2-proxy)" ]]; then msg_info "Stopping ${APP} services" systemctl stop oauth2-proxy - msg_ok "Stopped ${APP}" + msg_ok "Stopped ${APP} service" - msg_info "Updating $APP to ${RELEASE}" - rm -f /opt/oauth2-proxy/oauth2-proxy - curl -fsSL "https://github.com/oauth2-proxy/oauth2-proxy/releases/download/v${RELEASE}/oauth2-proxy-v${RELEASE}.linux-amd64.tar.gz" -o /opt/oauth2-proxy.tar.gz - tar -xzf /opt/oauth2-proxy.tar.gz - mv /opt/oauth2-proxy-v${RELEASE}.linux-amd64/oauth2-proxy /opt/oauth2-proxy + fetch_and_deploy_gh_release "oauth2-proxy" "oauth2-proxy/oauth2-proxy" "prebuild" "latest" "/opt/oauth2-proxy" "oauth2-proxy*linux-amd64.tar.gz" + + msg_info "Starting ${APP} service" systemctl start oauth2-proxy - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated ${APP} to ${RELEASE}" + msg_ok "Started ${APP} service" - msg_info "Cleaning up" - rm -f "/opt/oauth2-proxy.tar.gz" - rm -rf "/opt/oauth2-proxy-v${RELEASE}.linux-amd64" - $STD apt-get -y autoremove - $STD apt-get -y autoclean - msg_ok "Cleaned" + msg_ok "Updated successfully!\n" else msg_ok "${APP} is already up to date (${RELEASE})" fi diff --git a/ct/ombi.sh b/ct/ombi.sh index 7d1d69841..ddc5a7054 100644 --- a/ct/ombi.sh +++ b/ct/ombi.sh @@ -27,22 +27,29 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - RELEASE=$(curl -fsSL https://api.github.com/repos/Ombi-app/Ombi/releases/latest | grep '"tag_name":' | cut -d'"' -f4) - if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then - msg_info "Stopping ${APP}" + + RELEASE=$(curl -fsSL https://api.github.com/repos/Ombi-app/Ombi/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ "${RELEASE}" != "$(cat ~/.ombi)" ]] || [[ ! -f ~/.ombi ]]; then + msg_info "Stopping ${APP} service" systemctl stop ombi - msg_ok "Stopped ${APP}" + msg_ok "Stopped ${APP} service" - msg_info "Updating ${APP} to ${RELEASE}" - curl -fsSL "https://github.com/Ombi-app/Ombi/releases/download/${RELEASE}/linux-x64.tar.gz" -o $(basename "https://github.com/Ombi-app/Ombi/releases/download/${RELEASE}/linux-x64.tar.gz") - tar -xzf linux-x64.tar.gz -C /opt/ombi - rm -rf linux-x64.tar.gz - echo "${RELEASE}" >/opt/${APP}_version.txt - msg_ok "Updated ${APP} to ${RELEASE}" + msg_info "Creating backup" + [[ -f /opt/ombi/Ombi.db ]] && mv /opt/ombi/Ombi.db /opt + [[ -f /opt/ombi/OmbiExternal.db ]] && mv /opt/ombi/OmbiExternal.db /opt + [[ -f /opt/ombi/OmbiSettings.db ]] && mv /opt/ombi/OmbiSettings.db /opt + msg_ok "Backup created" - msg_info "Starting ${APP}" + rm -rf /opt/ombi + fetch_and_deploy_gh_release "ombi" "Ombi-app/Ombi" "prebuild" "latest" "/opt/ombi" "linux-x64.tar.gz" + [[ -f /opt/Ombi.db ]] && mv /opt/Ombi.db /opt/ombi + [[ -f /opt/OmbiExternal.db ]] && mv /opt/OmbiExternal.db /opt/ombi + [[ -f /opt/OmbiSettings.db ]] && mv /opt/OmbiSettings.db /opt/ombi + + msg_info "Starting ${APP} service" systemctl start ombi - msg_ok "Started ${APP}" + msg_ok "Started ${APP} service" + msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} ia already at ${RELEASE}." diff --git a/ct/opengist.sh b/ct/opengist.sh index 205753b0b..9e0c2c912 100644 --- a/ct/opengist.sh +++ b/ct/opengist.sh @@ -27,34 +27,27 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + RELEASE=$(curl -fsSL https://api.github.com/repos/thomiceli/opengist/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ ! -f ~/.opengist ]] || [[ "${RELEASE}" != "$(cat ~/.opengist)" ]]; then msg_info "Stopping Service" - systemctl stop opengist.service + systemctl stop opengist msg_ok "Stopped Service" - msg_info "Updating ${APP} to v${RELEASE}" - $STD apt-get update - $STD apt-get -y upgrade - cd /opt + msg_info "Creating backup" mv /opt/opengist /opt/opengist-backup - curl -fsSL "https://github.com/thomiceli/opengist/releases/download/v${RELEASE}/opengist${RELEASE}-linux-arm64.tar.gz" -o $(basename "https://github.com/thomiceli/opengist/releases/download/v${RELEASE}/opengist${RELEASE}-linux-arm64.tar.gz") - tar -xzf opengist${RELEASE}-linux-arm64.tar.gz + msg_ok "Backup created" + + fetch_and_deploy_gh_release "opengist" "thomiceli/opengist" "prebuild" "latest" "/opt/opengist" "opengist*linux-arm64.tar.gz" + + msg_info "Configuring ${APP}" mv /opt/opengist-backup/config.yml /opt/opengist/config.yml - chmod +x /opt/opengist/opengist - echo "${RELEASE}" >"/opt/${APP}_version.txt" - msg_ok "Updated ${APP} LXC" + msg_ok "Configured ${APP}" msg_info "Starting Service" - systemctl start opengist.service + systemctl start opengist msg_ok "Started Service" - msg_info "Cleaning up" - rm -rf /opt/opengist${RELEASE}-linux-arm64.tar.gz - rm -rf /opt/opengist-backup - $STD apt-get -y autoremove - $STD apt-get -y autoclean - msg_ok "Cleaned" msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at v${RELEASE}." diff --git a/ct/outline.sh b/ct/outline.sh index d5d214035..f1b8f399e 100644 --- a/ct/outline.sh +++ b/ct/outline.sh @@ -27,36 +27,32 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + RELEASE=$(curl -fsSL https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + if [[ ! -f ~/.outline ]] || [[ "${RELEASE}" != "$(cat ~/.outline)" ]]; then msg_info "Stopping Services" systemctl stop outline msg_ok "Services Stopped" - msg_info "Updating ${APP} to ${RELEASE}" - temp_file=$(mktemp) + msg_info "Creating backup" cp /opt/outline/.env /opt - rm -rf /opt/outline - curl -fsSL "https://github.com/outline/outline/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" - tar zxf "$temp_file" - mv outline-"${RELEASE}" /opt/outline + msg_ok "Backup created" + + fetch_and_deploy_gh_release "outline" "outline/outline" "tarball" + + msg_info "Updating ${APP} to ${RELEASE}" cd /opt/outline export NODE_ENV=development export NODE_OPTIONS="--max-old-space-size=3584" $STD yarn install --frozen-lockfile $STD yarn build mv /opt/.env /opt/outline - echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated ${APP}" msg_info "Starting Services" systemctl start outline msg_ok "Started Services" - msg_info "Cleaning Up" - rm -rf "$temp_file" - rm -rf "$HOME"/outline-"${RELEASE}" - msg_ok "Cleaned" msg_ok "Updated Successfully" else msg_ok "No update required. ${APP} is already at ${RELEASE}" diff --git a/ct/overseerr.sh b/ct/overseerr.sh index e64aca335..6d06437ce 100644 --- a/ct/overseerr.sh +++ b/ct/overseerr.sh @@ -27,20 +27,35 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating $APP" - systemctl stop overseerr - cd /opt/overseerr - output=$(git pull) - $STD git pull - if echo "$output" | grep -q "Already up to date."; then - msg_ok " $APP is already up to date." + + RELEASE=$(curl -fsSL https://api.github.com/repos/sct/overseerr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ ! -f ~/.overseerr ]] || [[ "${RELEASE}" != "$(cat ~/.overseerr)" ]]; then + msg_info "Stopping ${APP} service" + systemctl stop overseerr + msg_ok "Service stopped" + + msg_info "Creating backup" + mv /opt/overseerr/config /opt/config_backup + msg_ok "Backup created" + + fetch_and_deploy_gh_release "overseerr" "sct/overseerr" "tarball" + rm -rf /opt/overseerr/config + + msg_info "Configuring ${APP} (Patience)" + cd /opt/overseerr + $STD yarn install + $STD yarn build + mv /opt/config_backup /opt/overseerr/config + msg_ok "Configured ${APP}" + + msg_info "Starting ${APP} service" systemctl start overseerr - exit + msg_ok "Started ${APP} service" + + msg_ok "Updated successfully!" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" fi - $STD yarn install - $STD yarn build - systemctl start overseerr - msg_ok "Updated $APP" exit } diff --git a/ct/owncast.sh b/ct/owncast.sh index 108534604..1ca513e13 100644 --- a/ct/owncast.sh +++ b/ct/owncast.sh @@ -27,10 +27,23 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating $APP LXC" - $STD apt-get update - $STD apt-get -y upgrade - msg_ok "Updated $APP LXC" + + RELEASE=$(curl -fsSL https://api.github.com/repos/owncast/owncast/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') + if [[ ! -f ~/.owncast ]] || [[ "${RELEASE}" != "$(cat ~/.owncast)" ]]; then + msg_info "Stopping ${APP}" + systemctl stop owncast + msg_ok "Stopped ${APP}" + + fetch_and_deploy_gh_release "owncast" "owncast/owncast" "prebuild" "latest" "/opt/owncast" "owncast*linux-64bit.zip" + + msg_info "Starting ${APP}" + systemctl start owncast + msg_ok "Started ${APP}" + + msg_ok "Updated Successfully" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}." + fi exit } diff --git a/ct/photoprism.sh b/ct/photoprism.sh index 9b220c9ae..217cd3827 100644 --- a/ct/photoprism.sh +++ b/ct/photoprism.sh @@ -27,22 +27,35 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Stopping PhotoPrism" - sudo systemctl stop photoprism - msg_ok "Stopped PhotoPrism" - msg_info "Updating PhotoPrism" - $STD apt-get install -y libvips42 - curl -fsSL https://dl.photoprism.app/pkg/linux/amd64.tar.gz | tar -xzf - -C /opt/photoprism --strip-components=1 - msg_ok "Updated PhotoPrism" + RELEASE=$(curl -fsSL https://api.github.com/repos/photoprism/photoprism/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ "${RELEASE}" != "$(cat ~/.photoprism 2>/dev/null)" ]] || [[ ! -f ~/.photoprism ]]; then + msg_info "Stopping PhotoPrism" + systemctl stop photoprism + msg_ok "Stopped PhotoPrism" - msg_info "Starting PhotoPrism" - sudo systemctl start photoprism - msg_ok "Started PhotoPrism" - msg_ok "Update Successful" + fetch_and_deploy_gh_release "photoprism" "photoprism/photoprism" "prebuild" "latest" "/opt/photoprism" "*linux-amd64.tar.gz" + + LIBHEIF_URL=$(curl -fsSL "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-$(lsb_release -cs)-amd64-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1) + if [[ "${LIBHEIF_URL}" != "$(cat ~/.photoprism_libheif 2>/dev/null)" ]] || [[ ! -f ~/.photoprism_libheif ]]; then + msg_info "Updating PhotoPrism LibHeif" + $STD apt-get install -y libvips42 + curl -fsSL "https://dl.photoprism.app/dist/libheif/$LIBHEIF_URL" -o /tmp/libheif.tar.gz + tar -xzf /tmp/libheif.tar.gz -C /usr/local + ldconfig + echo "${LIBHEIF_URL}" >~/.photoprism_libheif + msg_ok "Updated PhotoPrism LibHeif" + fi + + msg_info "Starting PhotoPrism" + systemctl start photoprism + msg_ok "Started PhotoPrism" + msg_ok "Update Successful" + else + msg_ok "No update required. ${APP} is already at v${RELEASE}" + fi exit } - start build_container description diff --git a/ct/suwayomiserver.sh b/ct/suwayomiserver.sh index 750a0d364..fecd5ceec 100644 --- a/ct/suwayomiserver.sh +++ b/ct/suwayomiserver.sh @@ -28,34 +28,20 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - if dpkg -l | grep -q "openjdk-17-jre"; then - $STD apt-get remove -y openjdk-17-jre - fi - JAVA_VERSION=21 setup_java RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - if [[ "${RELEASE}" != "$(cat /opt/suwayomi-server_version.txt)" ]] || [[ ! -f /opt/suwayomi-server_version.txt ]]; then - msg_info "Updating $APP" + if [[ "${RELEASE}" != "$(cat ~/.suwayomi-server 2>/dev/null)" ]] || [[ ! -f ~/.suwayomi-server ]]; then + JAVA_VERSION=21 setup_java msg_info "Stopping $APP" systemctl stop suwayomi-server msg_ok "Stopped $APP" - msg_info "Updating $APP to v${RELEASE}" - temp_file=$(mktemp) - RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - curl -fsSL "https://github.com/Suwayomi/Suwayomi-Server/releases/download/${RELEASE}/Suwayomi-Server-${RELEASE}-debian-all.deb" -o "$temp_file" - $STD dpkg -i "$temp_file" - msg_ok "Updated $APP to v${RELEASE}" + fetch_and_deploy_gh_release "suwayomi-server" "Suwayomi/Suwayomi-Server" "binary" msg_info "Starting $APP" systemctl start suwayomi-server msg_ok "Started $APP" - msg_info "Cleaning Up" - rm -f "$temp_file" - msg_ok "Cleanup Completed" - - echo "${RELEASE}" >/opt/suwayomi-server_version.txt.txt msg_ok "Update Successful" else msg_ok "No update required. ${APP} is already at v${RELEASE}" diff --git a/ct/tandoor.sh b/ct/tandoor.sh index 81ba8fee2..0bae7b1d2 100644 --- a/ct/tandoor.sh +++ b/ct/tandoor.sh @@ -27,27 +27,27 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - if ! [[ $(dpkg -s python3-xmlsec 2>/dev/null) ]]; then - $STD apt-get update - $STD apt-get install -y python3-xmlsec - fi - if cd /opt/tandoor && git pull | grep -q 'Already up to date'; then + #if ! [[ $(dpkg -s python3-xmlsec 2>/dev/null) ]]; then + #$STD apt-get update + #$STD apt-get install -y python3-xmlsec + #fi + #if cd /opt/tandoor && git pull | grep -q 'Already up to date'; then msg_ok "There is currently no update available." - else - msg_info "Updating ${APP} (Patience)" - export $(cat /opt/tandoor/.env | grep "^[^#]" | xargs) - cd /opt/tandoor/ - $STD pip3 install -r requirements.txt - $STD /usr/bin/python3 /opt/tandoor/manage.py migrate - $STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic --no-input - $STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic_js_reverse - cd /opt/tandoor/vue - $STD yarn install - $STD yarn build - cd /opt/tandoor - $STD python3 version.py - systemctl restart gunicorn_tandoor - msg_ok "Updated ${APP}" + #else + #msg_info "Updating ${APP} (Patience)" + #export $(cat /opt/tandoor/.env | grep "^[^#]" | xargs) + #cd /opt/tandoor/ + #$STD pip3 install -r requirements.txt + #$STD /usr/bin/python3 /opt/tandoor/manage.py migrate + #$STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic --no-input + #$STD /usr/bin/python3 /opt/tandoor/manage.py collectstatic_js_reverse + #cd /opt/tandoor/vue + #$STD yarn install + #$STD yarn build + #cd /opt/tandoor + #$STD python3 version.py + #systemctl restart gunicorn_tandoor + #msg_ok "Updated ${APP}" fi exit } diff --git a/ct/victoriametrics.sh b/ct/victoriametrics.sh index 0311bfe3e..96588660b 100644 --- a/ct/victoriametrics.sh +++ b/ct/victoriametrics.sh @@ -37,8 +37,11 @@ function update_script() { fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-arm64-v+([0-9.]).tar.gz" fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-arm64-v+([0-9.]).tar.gz" - fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-arm64*.tar.gz" - fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-arm64*.tar.gz" + + if [[ -f /etc/systemd/system/victoriametrics-logs.service ]]; then + fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-arm64*.tar.gz" + fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-arm64*.tar.gz" + fi chmod +x /opt/victoriametrics/* msg_info "Starting $APP" diff --git a/frontend/public/json/booklore.json b/frontend/public/json/booklore.json index 9ccc8eff8..d92e987e8 100644 --- a/frontend/public/json/booklore.json +++ b/frontend/public/json/booklore.json @@ -9,8 +9,8 @@ "updateable": true, "privileged": false, "interface_port": 6060, - "documentation": "https://github.com/adityachandelgit/BookLore", - "website": "https://github.com/adityachandelgit/BookLore", + "documentation": "https://booklore-app.github.io/booklore-docs/docs/getting-started", + "website": "https://github.com/booklore-app/booklore", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/booklore.webp", "config_path": "/opt/booklore_storage/.env", "description": "BookLore is a self-hosted digital library for managing and reading books, offering a beautiful interface and support for metadata management. Built with a modern tech stack, it provides support for importing, organizing, and reading EPUBs and PDFs, while also managing cover images and book metadata.", diff --git a/frontend/public/json/cronicle.json b/frontend/public/json/cronicle.json index 8447fd628..395cafb27 100644 --- a/frontend/public/json/cronicle.json +++ b/frontend/public/json/cronicle.json @@ -9,7 +9,7 @@ "updateable": true, "privileged": false, "interface_port": 3012, - "documentation": null, + "documentation": "https://github.com/jhuckaby/Cronicle/blob/master/README.md", "website": "https://github.com/jhuckaby/Cronicle", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/chronicle.webp", "config_path": "/opt/cronicle/conf/config.json", diff --git a/frontend/public/json/elementsynapse.json b/frontend/public/json/elementsynapse.json index 958b18b38..36bfaf1e6 100644 --- a/frontend/public/json/elementsynapse.json +++ b/frontend/public/json/elementsynapse.json @@ -20,7 +20,7 @@ "script": "ct/elementsynapse.sh", "resources": { "cpu": 1, - "ram": 1024, + "ram": 2048, "hdd": 4, "os": "debian", "version": "12" diff --git a/frontend/public/json/gotify.json b/frontend/public/json/gotify.json index 08cc46cab..9765ba8d7 100644 --- a/frontend/public/json/gotify.json +++ b/frontend/public/json/gotify.json @@ -6,7 +6,7 @@ ], "date_created": "2024-05-02", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 80, "documentation": "https://gotify.net/docs/index", diff --git a/frontend/public/json/hivemq.json b/frontend/public/json/hivemq.json index ee59470e9..4ef722497 100644 --- a/frontend/public/json/hivemq.json +++ b/frontend/public/json/hivemq.json @@ -9,7 +9,7 @@ "updateable": false, "privileged": false, "interface_port": 1883, - "documentation": null, + "documentation": "https://github.com/hivemq/hivemq-community-edition/wiki", "website": "https://www.hivemq.com/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/hivemq.webp", "config_path": "/opt/hivemq/conf/config.xml", diff --git a/frontend/public/json/homebox.json b/frontend/public/json/homebox.json index e1163aadd..795b8e452 100644 --- a/frontend/public/json/homebox.json +++ b/frontend/public/json/homebox.json @@ -9,10 +9,10 @@ "updateable": true, "privileged": false, "interface_port": 7745, - "documentation": null, + "documentation": "https://homebox.software/en/quick-start.html", "website": "https://homebox.software/en/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/homebox.webp", - "config_path": "/opt/.env", + "config_path": "/opt/homebox/.env", "description": "HomeBox is a simple, home-focused inventory management software. It allows users to organize and track household items by adding, updating, or deleting them. Features include optional details like warranty info, CSV import/export, custom labels, locations, and multi-tenant support for sharing with others. It\u2019s designed to be fast, easy to use, and portable.", "install_methods": [ { @@ -31,10 +31,5 @@ "username": null, "password": null }, - "notes": [ - { - "text": ".env file location: `/opt/.env`", - "type": "info" - } - ] + "notes": [] } diff --git a/frontend/public/json/jackett.json b/frontend/public/json/jackett.json index fe681dce8..6ee1016c1 100644 --- a/frontend/public/json/jackett.json +++ b/frontend/public/json/jackett.json @@ -6,13 +6,13 @@ ], "date_created": "2024-05-02", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 9117, "documentation": "https://github.com/Jackett/Jackett/wiki", "website": "https://github.com/Jackett/Jackett", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/jackett.webp", - "config_path": "", + "config_path": "/opt/.env", "description": "Jackett supports a wide range of trackers, including popular ones like The Pirate Bay, RARBG, and Torrentz2, as well as many private trackers. It can be integrated with several BitTorrent clients, including qBittorrent, Deluge, and uTorrent, among others.", "install_methods": [ { diff --git a/frontend/public/json/jeedom.json b/frontend/public/json/jeedom.json new file mode 100644 index 000000000..4a4210dfa --- /dev/null +++ b/frontend/public/json/jeedom.json @@ -0,0 +1,44 @@ +{ + "name": "Jeedom", + "slug": "jeedom", + "categories": [ + 16 + ], + "date_created": "2025-07-29", + "type": "ct", + "updateable": false, + "privileged": false, + "interface_port": 80, + "documentation": "https://doc.jeedom.com", + "config_path": "", + "website": "https://jeedom.com/", + "logo": "https://jeedom.com/_next/image?url=%2Fassets%2Fimg%2Flogo.png&w=256&q=75", + "description": "Jeedom is a home automation system that is free, open, and cloudless. It allows users to manage and automate various aspects of their homes by creating objects, installing plugins for added functionalities, and connecting to a Market account for services. It also supports direct access URLs and user management.", + "install_methods": [ + { + "type": "default", + "script": "ct/jeedom.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 16, + "os": "Debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": "admin", + "password": "admin" + }, + "notes": [ + { + "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.", + "type": "warning" + }, + { + "text": "Only OS packages are updateable. To update Jeedom, please use the web interface.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/keycloak.json b/frontend/public/json/keycloak.json index bf1203c42..f51da3b3a 100644 --- a/frontend/public/json/keycloak.json +++ b/frontend/public/json/keycloak.json @@ -6,7 +6,7 @@ ], "date_created": "2024-05-02", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 8080, "documentation": "https://www.keycloak.org/documentation", @@ -28,8 +28,8 @@ } ], "default_credentials": { - "username": null, - "password": null + "username": "tmpadm", + "password": "admin123" }, "notes": [ { @@ -39,6 +39,10 @@ { "text": "This script requires some extra steps after the installation, Please checkout the `https://github.com/community-scripts/ProxmoxVE/discussions/193`", "type": "info" + }, + { + "text": "When updating, if you had modified cache-ispn.xml: Re-apply your changes to the new file, otherwise leave it unchanged.", + "type": "info" } ] } diff --git a/frontend/public/json/lidarr.json b/frontend/public/json/lidarr.json index 786169f84..755b354bb 100644 --- a/frontend/public/json/lidarr.json +++ b/frontend/public/json/lidarr.json @@ -9,10 +9,10 @@ "updateable": true, "privileged": false, "interface_port": 8686, - "documentation": null, + "documentation": "https://wiki.servarr.com/en/lidarr", "website": "https://lidarr.audio/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/lidarr.webp", - "config_path": "", + "config_path": "/var/lib/lidarr/config.xml", "description": "Lidarr is a music management tool designed for Usenet and BitTorrent users. It allows users to manage and organize their music collection with ease. Lidarr integrates with popular Usenet and BitTorrent clients, such as Sonarr and Radarr, to automate the downloading and organizing of music files. The software provides a web-based interface for managing and organizing music, making it easy to search and find songs, albums, and artists. Lidarr also supports metadata management, including album art, artist information, and lyrics, making it easy for users to keep their music collection organized and up-to-date. The software is designed to be easy to use and provides a simple and intuitive interface for managing and organizing music collections, making it a valuable tool for music lovers who want to keep their collection organized and up-to-date. With Lidarr, users can enjoy their music collection from anywhere, making it a powerful tool for managing and sharing music files.", "install_methods": [ { diff --git a/frontend/public/json/listmonk.json b/frontend/public/json/listmonk.json index c216c6461..ba47075ff 100644 --- a/frontend/public/json/listmonk.json +++ b/frontend/public/json/listmonk.json @@ -1,35 +1,35 @@ { - "name": "listmonk", - "slug": "listmonk", - "categories": [ - 0 - ], - "date_created": "2024-11-22", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 9000, - "documentation": "https://listmonk.app/docs/", - "website": "https://listmonk.app/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/listmonk.webp", - "config_path": "/opt/listmonk/config.toml", - "description": "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard.", - "install_methods": [ - { - "type": "default", - "script": "ct/listmonk.sh", - "resources": { - "cpu": 1, - "ram": 512, - "hdd": 4, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [] + "name": "listmonk", + "slug": "listmonk", + "categories": [ + 0 + ], + "date_created": "2024-11-22", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 9000, + "documentation": "https://listmonk.app/docs/", + "website": "https://listmonk.app/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/listmonk.webp", + "config_path": "/opt/listmonk/config.toml", + "description": "High performance, self-hosted, newsletter and mailing list manager with a modern dashboard.", + "install_methods": [ + { + "type": "default", + "script": "ct/listmonk.sh", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] } diff --git a/frontend/public/json/mediamtx.json b/frontend/public/json/mediamtx.json index afe9d7aff..89bb8c41a 100644 --- a/frontend/public/json/mediamtx.json +++ b/frontend/public/json/mediamtx.json @@ -6,7 +6,7 @@ ], "date_created": "2024-05-02", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": null, "documentation": "https://github.com/bluenviron/mediamtx/blob/main/README.md", diff --git a/frontend/public/json/memos.json b/frontend/public/json/memos.json index ac9400c0f..0d5bcf0b5 100644 --- a/frontend/public/json/memos.json +++ b/frontend/public/json/memos.json @@ -19,9 +19,9 @@ "type": "default", "script": "ct/memos.sh", "resources": { - "cpu": 2, - "ram": 3072, - "hdd": 7, + "cpu": 1, + "ram": 1024, + "hdd": 3, "os": "debian", "version": "12" } diff --git a/frontend/public/json/n8n.json b/frontend/public/json/n8n.json index 7ab0ed00b..3dbff38c0 100644 --- a/frontend/public/json/n8n.json +++ b/frontend/public/json/n8n.json @@ -12,7 +12,7 @@ "documentation": "https://docs.n8n.io/", "website": "https://n8n.io/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/n8n.webp", - "config_path": "", + "config_path": "/opt/n8n.env", "description": "n8n is a workflow automation tool that enables users to automate various tasks and processes by connecting various data sources, systems, and services. It provides a visual interface for building workflows, allowing users to easily define and automate complex sequences of actions, such as data processing, conditional branching, and API calls. n8n supports a wide range of integrations, making it a versatile tool for automating a variety of use cases, from simple data processing workflows to complex business processes. With its extendable architecture, n8n is designed to be easily customizable and can be adapted to meet the specific needs of different users and industries.", "install_methods": [ { @@ -31,5 +31,10 @@ "username": null, "password": null }, - "notes": [] + "notes": [ + { + "text": "You may need to configure the `WEBHOOK_URL` in the config file when using a domain.", + "type": "info" + } + ] } diff --git a/frontend/public/json/navidrome.json b/frontend/public/json/navidrome.json index ec2b0ea9c..acfc1e608 100644 --- a/frontend/public/json/navidrome.json +++ b/frontend/public/json/navidrome.json @@ -1,40 +1,40 @@ { - "name": "Navidrome", - "slug": "navidrome", - "categories": [ - 13 - ], - "date_created": "2024-05-02", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 4533, - "documentation": null, - "website": "https://www.navidrome.org/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/navidrome.webp", - "config_path": "/etc/navidrome/navidrome.toml", - "description": "Navidrome is a music server solution that makes your music collection accessible from anywhere. It provides a modern web-based user interface and compatibility with a range of third-party mobile apps for both iOS and Android devices. With Navidrome, users can access their music collection from anywhere, whether at home or on the go. The software supports a variety of music formats, making it easy for users to play their favorite songs and albums. Navidrome provides a simple and user-friendly interface for managing and organizing music collections, making it a valuable tool for music lovers who want to access their music from anywhere. The software is designed to be easy to set up and use, making it a popular choice for those who want to host their own music server and enjoy their music collection from anywhere.", - "install_methods": [ - { - "type": "default", - "script": "ct/navidrome.sh", - "resources": { - "cpu": 2, - "ram": 1024, - "hdd": 4, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "To change Navidrome music folder path, `nano /etc/navidrome/navidrome.toml`", - "type": "info" - } - ] + "name": "Navidrome", + "slug": "navidrome", + "categories": [ + 13 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 4533, + "documentation": "https://www.navidrome.org/docs/", + "website": "https://www.navidrome.org/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/navidrome.webp", + "config_path": "/etc/navidrome/navidrome.toml", + "description": "Navidrome is a music server solution that makes your music collection accessible from anywhere. It provides a modern web-based user interface and compatibility with a range of third-party mobile apps for both iOS and Android devices. With Navidrome, users can access their music collection from anywhere, whether at home or on the go. The software supports a variety of music formats, making it easy for users to play their favorite songs and albums. Navidrome provides a simple and user-friendly interface for managing and organizing music collections, making it a valuable tool for music lovers who want to access their music from anywhere. The software is designed to be easy to set up and use, making it a popular choice for those who want to host their own music server and enjoy their music collection from anywhere.", + "install_methods": [ + { + "type": "default", + "script": "ct/navidrome.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "To change Navidrome music folder path, `nano /etc/navidrome/navidrome.toml`", + "type": "info" + } + ] } diff --git a/frontend/public/json/neo4j.json b/frontend/public/json/neo4j.json index dabebbe4f..3c2e7a3ea 100644 --- a/frontend/public/json/neo4j.json +++ b/frontend/public/json/neo4j.json @@ -6,10 +6,10 @@ ], "date_created": "2024-10-20", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 7474, - "documentation": null, + "documentation": "https://neo4j.com/docs/", "website": "https://neo4j.com/product/neo4j-graph-database/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/neo4j.webp", "config_path": "/etc/neo4j/neo4j.conf", diff --git a/frontend/public/json/ombi.json b/frontend/public/json/ombi.json index 1f10a7f5f..a1ab86780 100644 --- a/frontend/public/json/ombi.json +++ b/frontend/public/json/ombi.json @@ -6,7 +6,7 @@ ], "date_created": "2024-05-02", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 5000, "documentation": "https://docs.ombi.app/", diff --git a/frontend/public/json/opengist.json b/frontend/public/json/opengist.json index 8d29583a9..80db5e445 100644 --- a/frontend/public/json/opengist.json +++ b/frontend/public/json/opengist.json @@ -9,7 +9,7 @@ "updateable": true, "privileged": false, "interface_port": 6157, - "documentation": null, + "documentation": "https://opengist.io/docs/", "website": "https://opengist.io/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/opengist.webp", "config_path": "/opt/opengist/config.yml", diff --git a/frontend/public/json/owncast.json b/frontend/public/json/owncast.json index 230064726..55fc27334 100644 --- a/frontend/public/json/owncast.json +++ b/frontend/public/json/owncast.json @@ -6,7 +6,7 @@ ], "date_created": "2024-05-02", "type": "ct", - "updateable": false, + "updateable": true, "privileged": false, "interface_port": 8080, "documentation": "https://owncast.online/docs/", diff --git a/frontend/public/json/salt.json b/frontend/public/json/salt.json index 3f056a396..096c4ee00 100644 --- a/frontend/public/json/salt.json +++ b/frontend/public/json/salt.json @@ -9,7 +9,7 @@ "updateable": true, "privileged": false, "config_path": "/opt/salt/.env", - "interface_port": 3000, + "interface_port": null, "documentation": "https://docs.saltproject.io/salt/install-guide/en/latest/", "website": "https://saltproject.io/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/salt.webp", diff --git a/frontend/public/json/suwayomi-server.json b/frontend/public/json/suwayomi-server.json new file mode 100644 index 000000000..dba29be78 --- /dev/null +++ b/frontend/public/json/suwayomi-server.json @@ -0,0 +1,40 @@ +{ + "name": "Suwayomi-Server", + "slug": "suwayomi-server", + "categories": [ + 13 + ], + "date_created": "2025-08-01", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 4567, + "documentation": "https://github.com/Suwayomi/Suwayomi-Server/wiki", + "website": "https://github.com/Suwayomi/Suwayomi-Server", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/suwayomi.webp", + "config_path": "", + "description": "A free and open source manga reader server that runs extensions built for Mihon (Tachiyomi).", + "install_methods": [ + { + "type": "default", + "script": "ct/suwayomiserver.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This application can be conflicting with Kaspersky products. You maybe need to disable Kaspersky in order to use this application.", + "type": "info" + } + ] +} diff --git a/frontend/public/json/tandoor.json b/frontend/public/json/tandoor.json.bak similarity index 100% rename from frontend/public/json/tandoor.json rename to frontend/public/json/tandoor.json.bak diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index c0c787cab..94e825fab 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,4 +1,404 @@ [ + { + "name": "advplyr/audiobookshelf", + "version": "v2.27.0", + "date": "2025-08-02T23:35:37Z" + }, + { + "name": "gethomepage/homepage", + "version": "v1.4.2", + "date": "2025-08-02T22:52:30Z" + }, + { + "name": "TwiN/gatus", + "version": "v5.21.0", + "date": "2025-08-02T18:56:03Z" + }, + { + "name": "linuxserver/Heimdall", + "version": "v2.7.4", + "date": "2025-08-02T16:51:19Z" + }, + { + "name": "msgbyte/tianji", + "version": "v1.24.9", + "date": "2025-08-02T16:46:17Z" + }, + { + "name": "actualbudget/actual", + "version": "v25.8.0", + "date": "2025-08-02T16:17:45Z" + }, + { + "name": "fuma-nama/fumadocs", + "version": "fumadocs-core@15.6.8", + "date": "2025-08-02T09:44:14Z" + }, + { + "name": "inspircd/inspircd", + "version": "v4.8.0", + "date": "2025-08-02T09:12:10Z" + }, + { + "name": "evcc-io/evcc", + "version": "0.207.0", + "date": "2025-08-02T09:09:08Z" + }, + { + "name": "donaldzou/WGDashboard", + "version": "v4.2.5", + "date": "2025-08-02T08:58:21Z" + }, + { + "name": "theonedev/onedev", + "version": "v12.0.3", + "date": "2025-08-02T08:16:46Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.2219", + "date": "2025-08-02T06:00:23Z" + }, + { + "name": "pocketbase/pocketbase", + "version": "v0.29.1", + "date": "2025-08-02T05:51:37Z" + }, + { + "name": "henrygd/beszel", + "version": "v0.12.2", + "date": "2025-08-02T01:12:52Z" + }, + { + "name": "steveiliop56/tinyauth", + "version": "v3.6.2", + "date": "2025-07-17T12:08:03Z" + }, + { + "name": "mongodb/mongo", + "version": "r8.2.0-rc2", + "date": "2025-08-01T23:31:28Z" + }, + { + "name": "docmost/docmost", + "version": "v0.22.2", + "date": "2025-08-01T23:27:06Z" + }, + { + "name": "influxdata/influxdb", + "version": "v1.12.2rc0", + "date": "2025-08-01T21:48:30Z" + }, + { + "name": "homarr-labs/homarr", + "version": "v1.31.0", + "date": "2025-08-01T19:18:16Z" + }, + { + "name": "MediaBrowser/Emby.Releases", + "version": "4.9.1.2", + "date": "2025-06-26T22:08:00Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "v6.2.21", + "date": "2025-07-17T04:46:25Z" + }, + { + "name": "Koenkk/zigbee2mqtt", + "version": "2.6.0", + "date": "2025-08-01T15:42:21Z" + }, + { + "name": "immich-app/immich", + "version": "v1.137.3", + "date": "2025-08-01T15:06:36Z" + }, + { + "name": "Luligu/matterbridge", + "version": "3.2.0", + "date": "2025-08-01T14:49:29Z" + }, + { + "name": "keycloak/keycloak", + "version": "26.0.14", + "date": "2025-08-01T11:29:12Z" + }, + { + "name": "documenso/documenso", + "version": "v1.12.2-rc.3", + "date": "2025-08-01T14:46:22Z" + }, + { + "name": "alexta69/metube", + "version": "2025.07.31", + "date": "2025-08-01T14:44:48Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.104.2", + "date": "2025-07-31T13:14:26Z" + }, + { + "name": "element-hq/synapse", + "version": "v1.135.0", + "date": "2025-08-01T12:43:17Z" + }, + { + "name": "crowdsecurity/crowdsec", + "version": "v1.6.11", + "date": "2025-07-22T12:11:38Z" + }, + { + "name": "zwave-js/zwave-js-ui", + "version": "v11.0.1", + "date": "2025-08-01T07:43:59Z" + }, + { + "name": "meilisearch/meilisearch", + "version": "prototype-arroy-becomes-hannoy-8", + "date": "2025-08-01T07:34:21Z" + }, + { + "name": "mattermost/mattermost", + "version": "server/public/v0.1.16", + "date": "2025-07-28T22:46:46Z" + }, + { + "name": "gotson/komga", + "version": "1.23.1", + "date": "2025-08-01T04:30:24Z" + }, + { + "name": "gristlabs/grist-core", + "version": "v1.7.1", + "date": "2025-07-31T22:26:54Z" + }, + { + "name": "zitadel/zitadel", + "version": "v4.0.0", + "date": "2025-07-31T20:05:45Z" + }, + { + "name": "lazy-media/Reactive-Resume", + "version": "v1.2.3", + "date": "2025-07-31T19:18:36Z" + }, + { + "name": "apache/tomcat", + "version": "9.0.108", + "date": "2025-07-31T18:24:50Z" + }, + { + "name": "Suwayomi/Suwayomi-Server", + "version": "v2.1.1867", + "date": "2025-07-31T18:08:43Z" + }, + { + "name": "TandoorRecipes/recipes", + "version": "2.0.1", + "date": "2025-07-31T17:29:38Z" + }, + { + "name": "home-assistant/core", + "version": "2025.7.4", + "date": "2025-07-28T08:15:50Z" + }, + { + "name": "TryGhost/Ghost-CLI", + "version": "v1.28.2", + "date": "2025-07-31T15:02:56Z" + }, + { + "name": "NodeBB/NodeBB", + "version": "v3.12.8", + "date": "2025-07-31T14:00:13Z" + }, + { + "name": "Stirling-Tools/Stirling-PDF", + "version": "v1.1.1", + "date": "2025-07-31T12:16:54Z" + }, + { + "name": "Paymenter/Paymenter", + "version": "v1.2.7", + "date": "2025-07-31T09:50:54Z" + }, + { + "name": "apache/cassandra", + "version": "5.0.5-tentative", + "date": "2025-07-31T09:40:54Z" + }, + { + "name": "redis/redis", + "version": "8.2-int", + "date": "2025-07-31T09:01:24Z" + }, + { + "name": "ollama/ollama", + "version": "v0.10.1", + "date": "2025-07-31T04:39:49Z" + }, + { + "name": "coder/code-server", + "version": "v4.102.3", + "date": "2025-07-31T03:41:16Z" + }, + { + "name": "hyperion-project/hyperion.ng", + "version": "2.1.1", + "date": "2025-06-14T17:45:06Z" + }, + { + "name": "gtsteffaniak/filebrowser", + "version": "v0.7.18-beta", + "date": "2025-07-30T21:26:00Z" + }, + { + "name": "fallenbagel/jellyseerr", + "version": "preview-fix-invalid-blacklisttag", + "date": "2025-07-30T20:30:29Z" + }, + { + "name": "benjaminjonard/koillection", + "version": "1.6.17", + "date": "2025-07-30T20:24:17Z" + }, + { + "name": "semaphoreui/semaphore", + "version": "v2.16.0-beta6", + "date": "2025-07-23T19:18:14Z" + }, + { + "name": "wizarrrr/wizarr", + "version": "2025.7.8", + "date": "2025-07-30T18:17:51Z" + }, + { + "name": "oauth2-proxy/oauth2-proxy", + "version": "v7.11.0", + "date": "2025-07-30T18:16:38Z" + }, + { + "name": "leiweibau/Pi.Alert", + "version": "v2025-07-30", + "date": "2025-07-30T17:13:40Z" + }, + { + "name": "bunkerity/bunkerweb", + "version": "v1.6.2", + "date": "2025-07-08T13:52:33Z" + }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.50.8", + "date": "2025-07-30T11:33:00Z" + }, + { + "name": "dani-garcia/vaultwarden", + "version": "1.34.3", + "date": "2025-07-30T09:10:59Z" + }, + { + "name": "BookStackApp/BookStack", + "version": "v25.07", + "date": "2025-07-30T08:52:20Z" + }, + { + "name": "zabbix/zabbix", + "version": "7.4.1", + "date": "2025-07-30T08:43:04Z" + }, + { + "name": "wazuh/wazuh", + "version": "coverity-w31-4.13.0", + "date": "2025-07-30T08:30:15Z" + }, + { + "name": "morpheus65535/bazarr", + "version": "v1.5.3-beta.10", + "date": "2025-07-15T06:07:03Z" + }, + { + "name": "jenkinsci/jenkins", + "version": "jenkins-2.521", + "date": "2025-07-30T03:38:59Z" + }, + { + "name": "OliveTin/OliveTin", + "version": "2025.7.29", + "date": "2025-07-29T22:20:13Z" + }, + { + "name": "netbox-community/netbox", + "version": "v4.3.5", + "date": "2025-07-29T20:30:04Z" + }, + { + "name": "tailscale/tailscale", + "version": "v1.86.2", + "date": "2025-07-29T19:16:24Z" + }, + { + "name": "caddyserver/xcaddy", + "version": "v0.4.5", + "date": "2025-07-29T16:39:18Z" + }, + { + "name": "node-red/node-red", + "version": "4.1.0", + "date": "2025-07-29T15:15:26Z" + }, + { + "name": "rogerfar/rdt-client", + "version": "v2.0.115", + "date": "2025-07-29T04:38:35Z" + }, + { + "name": "diced/zipline", + "version": "v4.2.1", + "date": "2025-07-28T19:25:48Z" + }, + { + "name": "HabitRPG/habitica", + "version": "v5.38.0", + "date": "2025-07-28T19:17:42Z" + }, + { + "name": "navidrome/navidrome", + "version": "v0.58.0", + "date": "2025-07-28T18:59:50Z" + }, + { + "name": "AdguardTeam/AdGuardHome", + "version": "v0.107.64", + "date": "2025-07-28T14:24:56Z" + }, + { + "name": "booklore-app/BookLore", + "version": "v0.35.0", + "date": "2025-07-28T14:20:30Z" + }, + { + "name": "Graylog2/graylog2-server", + "version": "7.0.0-alpha.1", + "date": "2025-07-28T11:28:22Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.3.0p35", + "date": "2025-07-28T08:32:54Z" + }, + { + "name": "PrivateBin/PrivateBin", + "version": "2.0.0", + "date": "2025-07-28T07:48:40Z" + }, + { + "name": "esphome/esphome", + "version": "2025.7.4", + "date": "2025-07-28T07:33:36Z" + }, { "name": "umami-software/umami", "version": "v2.19.0", @@ -9,36 +409,11 @@ "version": "v1.18.4", "date": "2025-06-25T00:06:56Z" }, - { - "name": "dani-garcia/vaultwarden", - "version": "1.34.2", - "date": "2025-07-27T18:49:05Z" - }, - { - "name": "msgbyte/tianji", - "version": "v1.24.7", - "date": "2025-07-27T18:34:18Z" - }, - { - "name": "benjaminjonard/koillection", - "version": "1.6.16", - "date": "2025-07-27T14:48:37Z" - }, - { - "name": "Jackett/Jackett", - "version": "v0.22.2200", - "date": "2025-07-27T05:52:33Z" - }, { "name": "project-zot/zot", "version": "v2.1.6", "date": "2025-07-27T01:14:14Z" }, - { - "name": "steveiliop56/tinyauth", - "version": "v3.6.2", - "date": "2025-07-17T12:08:03Z" - }, { "name": "aceberg/WatchYourLAN", "version": "2.1.3", @@ -49,50 +424,15 @@ "version": "v0.14.1", "date": "2024-08-29T22:32:51Z" }, - { - "name": "keycloak/keycloak", - "version": "26.3.2", - "date": "2025-07-24T10:14:27Z" - }, - { - "name": "MediaBrowser/Emby.Releases", - "version": "4.9.1.2", - "date": "2025-06-26T22:08:00Z" - }, - { - "name": "henrygd/beszel", - "version": "v0.12.1", - "date": "2025-07-25T23:53:12Z" - }, - { - "name": "gtsteffaniak/filebrowser", - "version": "v0.7.17-beta", - "date": "2025-07-25T22:03:43Z" - }, - { - "name": "ollama/ollama", - "version": "v0.10.0-rc2", - "date": "2025-07-25T21:24:06Z" - }, - { - "name": "homarr-labs/homarr", - "version": "v1.30.1", - "date": "2025-07-25T19:18:09Z" - }, - { - "name": "tailscale/tailscale", - "version": "v1.86.1", - "date": "2025-07-25T17:55:38Z" - }, { "name": "openobserve/openobserve", "version": "v0.15.0-rc4", "date": "2025-07-25T16:50:34Z" }, { - "name": "fuma-nama/fumadocs", - "version": "fumadocs-openapi@9.1.5", - "date": "2025-07-25T16:20:20Z" + "name": "emqx/emqx", + "version": "e6.0.0-M2.202508-alpha.1", + "date": "2025-07-25T16:01:00Z" }, { "name": "heiher/hev-socks5-server", @@ -104,101 +444,31 @@ "version": "v12.0.1", "date": "2025-07-25T11:54:30Z" }, - { - "name": "Luligu/matterbridge", - "version": "3.1.7", - "date": "2025-07-25T10:19:56Z" - }, - { - "name": "morpheus65535/bazarr", - "version": "v1.5.3-beta.10", - "date": "2025-07-15T06:07:03Z" - }, { "name": "ErsatzTV/ErsatzTV", "version": "v25.3.1", "date": "2025-07-25T03:39:31Z" }, - { - "name": "TryGhost/Ghost-CLI", - "version": "v1.28.0", - "date": "2025-07-25T01:21:13Z" - }, { "name": "Brandawg93/PeaNUT", "version": "v5.10.0", "date": "2025-07-24T23:33:09Z" }, - { - "name": "coder/code-server", - "version": "v4.102.2", - "date": "2025-07-24T22:42:01Z" - }, - { - "name": "linuxserver/Heimdall", - "version": "v2.7.3", - "date": "2025-07-24T18:07:21Z" - }, { "name": "docker/compose", "version": "v2.39.1", "date": "2025-07-24T17:02:01Z" }, - { - "name": "wizarrrr/wizarr", - "version": "2025.7.7", - "date": "2025-07-24T16:44:19Z" - }, - { - "name": "immich-app/immich", - "version": "v1.136.0", - "date": "2025-07-24T16:42:30Z" - }, - { - "name": "meilisearch/meilisearch", - "version": "prototype-cellulite-1", - "date": "2025-07-24T16:32:57Z" - }, { "name": "grokability/snipe-it", "version": "v8.2.1", "date": "2025-07-24T14:37:54Z" }, - { - "name": "Stirling-Tools/Stirling-PDF", - "version": "v1.1.0", - "date": "2025-07-24T14:08:58Z" - }, { "name": "glpi-project/glpi", "version": "10.0.19", "date": "2025-07-16T09:45:14Z" }, - { - "name": "Paymenter/Paymenter", - "version": "v1.2.5", - "date": "2025-07-24T11:52:16Z" - }, - { - "name": "Checkmk/checkmk", - "version": "v2.3.0p35-rc2", - "date": "2025-07-24T07:00:54Z" - }, - { - "name": "zwave-js/zwave-js-ui", - "version": "v10.10.0", - "date": "2025-07-24T06:15:19Z" - }, - { - "name": "firefly-iii/firefly-iii", - "version": "v6.2.21", - "date": "2025-07-17T04:46:25Z" - }, - { - "name": "advplyr/audiobookshelf", - "version": "v2.26.3", - "date": "2025-07-23T23:16:46Z" - }, { "name": "minio/minio", "version": "RELEASE.2025-07-23T15-54-02Z", @@ -209,21 +479,6 @@ "version": "v12.1.0", "date": "2025-07-23T19:35:52Z" }, - { - "name": "semaphoreui/semaphore", - "version": "v2.16.0-beta6", - "date": "2025-07-23T19:18:14Z" - }, - { - "name": "fallenbagel/jellyseerr", - "version": "preview-plex-home-profile", - "date": "2025-07-23T16:40:31Z" - }, - { - "name": "jenkinsci/jenkins", - "version": "jenkins-2.516.1", - "date": "2025-07-23T14:16:23Z" - }, { "name": "traefik/traefik", "version": "v3.5.0", @@ -239,21 +494,16 @@ "version": "v1.37.0.5076", "date": "2025-06-04T11:04:53Z" }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.103.2", - "date": "2025-07-22T11:22:26Z" - }, - { - "name": "zabbix/zabbix", - "version": "7.4.1rc1", - "date": "2025-07-23T11:54:39Z" - }, { "name": "cockpit-project/cockpit", "version": "343", "date": "2025-07-23T11:21:34Z" }, + { + "name": "neo4j/neo4j", + "version": "2025.07.0", + "date": "2025-07-23T10:13:43Z" + }, { "name": "jhuckaby/Cronicle", "version": "v0.9.85", @@ -269,11 +519,6 @@ "version": "v4.3.1", "date": "2025-07-22T20:10:08Z" }, - { - "name": "esphome/esphome", - "version": "2025.7.3", - "date": "2025-07-22T20:09:49Z" - }, { "name": "rcourtman/Pulse", "version": "v3.42.0", @@ -289,41 +534,11 @@ "version": "v0.7.3", "date": "2025-07-22T14:39:54Z" }, - { - "name": "element-hq/synapse", - "version": "v1.134.0", - "date": "2025-07-15T13:43:39Z" - }, { "name": "goauthentik/authentik", "version": "version/2025.4.4", "date": "2025-07-22T13:08:15Z" }, - { - "name": "crowdsecurity/crowdsec", - "version": "v1.6.11", - "date": "2025-07-22T12:11:38Z" - }, - { - "name": "home-assistant/core", - "version": "2025.7.3", - "date": "2025-07-22T08:30:59Z" - }, - { - "name": "mattermost/mattermost", - "version": "v9.11.18", - "date": "2025-07-22T06:18:08Z" - }, - { - "name": "adityachandelgit/BookLore", - "version": "v0.34.1", - "date": "2025-07-22T05:57:50Z" - }, - { - "name": "lazy-media/Reactive-Resume", - "version": "v1.2.2", - "date": "2025-07-22T03:12:54Z" - }, { "name": "ellite/Wallos", "version": "v4.0.0", @@ -334,16 +549,6 @@ "version": "v1.64.0", "date": "2025-07-21T20:56:33Z" }, - { - "name": "mongodb/mongo", - "version": "r8.2.0-rc0", - "date": "2025-07-21T19:07:52Z" - }, - { - "name": "HabitRPG/habitica", - "version": "v5.37.2", - "date": "2025-07-21T14:08:35Z" - }, { "name": "tobychui/zoraxy", "version": "v3.2.5r2", @@ -384,16 +589,6 @@ "version": "sdk/v0.26.0", "date": "2025-07-20T13:26:30Z" }, - { - "name": "OliveTin/OliveTin", - "version": "2025.7.19", - "date": "2025-07-20T09:44:35Z" - }, - { - "name": "documenso/documenso", - "version": "v1.12.2-rc.2", - "date": "2025-07-20T07:05:19Z" - }, { "name": "linkwarden/linkwarden", "version": "v2.11.5", @@ -419,36 +614,6 @@ "version": "v5.6.0", "date": "2025-07-19T13:34:36Z" }, - { - "name": "bunkerity/bunkerweb", - "version": "v1.6.2", - "date": "2025-07-08T13:52:33Z" - }, - { - "name": "pocketbase/pocketbase", - "version": "v0.29.0", - "date": "2025-07-19T08:54:54Z" - }, - { - "name": "theonedev/onedev", - "version": "v12.0.1", - "date": "2025-07-18T15:02:25Z" - }, - { - "name": "TandoorRecipes/recipes", - "version": "1.5.35", - "date": "2025-06-22T08:30:10Z" - }, - { - "name": "wazuh/wazuh", - "version": "coverity-w30-4.13.0", - "date": "2025-07-18T12:05:26Z" - }, - { - "name": "emqx/emqx", - "version": "e6.0.0-M1.202507-rc.1", - "date": "2025-07-18T07:48:52Z" - }, { "name": "cross-seed/cross-seed", "version": "v6.13.1", @@ -464,11 +629,6 @@ "version": "2.0.7", "date": "2025-07-17T15:33:14Z" }, - { - "name": "oauth2-proxy/oauth2-proxy", - "version": "v7.10.0", - "date": "2025-07-17T12:08:40Z" - }, { "name": "icereed/paperless-gpt", "version": "v0.22.0", @@ -494,41 +654,16 @@ "version": "v2.1.1", "date": "2025-07-15T22:38:01Z" }, - { - "name": "netbox-community/netbox", - "version": "v4.3.4", - "date": "2025-07-15T18:01:50Z" - }, - { - "name": "gethomepage/homepage", - "version": "v1.4.0", - "date": "2025-07-15T16:43:28Z" - }, - { - "name": "zitadel/zitadel", - "version": "v2.70.14", - "date": "2025-07-15T15:27:51Z" - }, { "name": "WordPress/WordPress", "version": "6.8.2", "date": "2025-07-15T15:14:16Z" }, - { - "name": "dgtlmoon/changedetection.io", - "version": "0.50.7", - "date": "2025-07-15T11:29:29Z" - }, { "name": "cloudreve/cloudreve", "version": "4.3.0", "date": "2025-07-15T09:54:38Z" }, - { - "name": "gotson/komga", - "version": "1.22.1", - "date": "2025-07-15T06:44:29Z" - }, { "name": "go-gitea/gitea", "version": "v1.24.3", @@ -564,11 +699,6 @@ "version": "1.3.11", "date": "2025-07-13T13:33:48Z" }, - { - "name": "evcc-io/evcc", - "version": "0.205.0", - "date": "2025-07-13T12:27:31Z" - }, { "name": "authelia/authelia", "version": "v4.39.5", @@ -584,21 +714,11 @@ "version": "v10.10.7", "date": "2025-04-05T19:14:59Z" }, - { - "name": "leiweibau/Pi.Alert", - "version": "v2025-07-12", - "date": "2025-07-12T07:53:52Z" - }, { "name": "eclipse-mosquitto/mosquitto", "version": "v2.0.22", "date": "2025-07-11T21:34:20Z" }, - { - "name": "neo4j/neo4j", - "version": "2025.06.2", - "date": "2025-07-11T18:03:51Z" - }, { "name": "FlowiseAI/Flowise", "version": "flowise@3.0.4", @@ -654,21 +774,11 @@ "version": "16.0", "date": "2025-07-09T13:28:43Z" }, - { - "name": "AdguardTeam/AdGuardHome", - "version": "v0.107.63", - "date": "2025-06-26T14:34:19Z" - }, { "name": "mysql/mysql-server", "version": "mysql-cluster-9.4.0", "date": "2025-07-09T08:35:30Z" }, - { - "name": "TwiN/gatus", - "version": "v5.20.0", - "date": "2025-07-08T16:27:11Z" - }, { "name": "photoprism/photoprism", "version": "250707-d28b3101e", @@ -679,11 +789,6 @@ "version": "v6.8.1", "date": "2025-07-07T14:40:11Z" }, - { - "name": "BookStackApp/BookStack", - "version": "v25.05.2", - "date": "2025-07-07T14:08:25Z" - }, { "name": "slskd/slskd", "version": "0.23.1", @@ -699,16 +804,6 @@ "version": "v1.17.2", "date": "2025-07-06T12:21:52Z" }, - { - "name": "redis/redis", - "version": "8.0.3", - "date": "2025-07-06T12:19:24Z" - }, - { - "name": "hyperion-project/hyperion.ng", - "version": "2.1.1", - "date": "2025-06-14T17:45:06Z" - }, { "name": "Kareadita/Kavita", "version": "v0.8.7", @@ -724,11 +819,6 @@ "version": "2.37.0", "date": "2025-07-04T14:49:43Z" }, - { - "name": "Graylog2/graylog2-server", - "version": "6.3.1", - "date": "2025-07-04T11:20:48Z" - }, { "name": "cloudflare/cloudflared", "version": "2025.7.0", @@ -739,36 +829,11 @@ "version": "v4.1.2", "date": "2025-07-03T16:59:29Z" }, - { - "name": "influxdata/influxdb", - "version": "v3.2.1", - "date": "2025-07-03T16:09:19Z" - }, - { - "name": "actualbudget/actual", - "version": "v25.7.1", - "date": "2025-07-03T01:03:18Z" - }, - { - "name": "Koenkk/zigbee2mqtt", - "version": "2.5.1", - "date": "2025-07-02T19:38:06Z" - }, - { - "name": "apache/tomcat", - "version": "9.0.107", - "date": "2025-07-02T07:12:09Z" - }, { "name": "qbittorrent/qBittorrent", "version": "release-5.1.2", "date": "2025-07-02T06:13:16Z" }, - { - "name": "diced/zipline", - "version": "v4.2.0", - "date": "2025-07-02T00:45:31Z" - }, { "name": "sysadminsmedia/homebox", "version": "v0.20.2", @@ -784,11 +849,6 @@ "version": "2025.4", "date": "2025-07-01T18:01:37Z" }, - { - "name": "navidrome/navidrome", - "version": "v0.57.0", - "date": "2025-07-01T16:47:46Z" - }, { "name": "MagicMirrorOrg/MagicMirror", "version": "v2.32.0", @@ -799,11 +859,6 @@ "version": "v7.4.4", "date": "2025-06-30T13:04:22Z" }, - { - "name": "PrivateBin/PrivateBin", - "version": "1.7.8", - "date": "2025-06-30T09:00:54Z" - }, { "name": "typesense/typesense", "version": "v29.0", @@ -814,16 +869,6 @@ "version": "v1.3.8", "date": "2025-06-29T07:41:53Z" }, - { - "name": "node-red/node-red", - "version": "4.1.0-beta.2", - "date": "2025-06-26T14:23:26Z" - }, - { - "name": "gristlabs/grist-core", - "version": "v1.6.1", - "date": "2025-06-25T21:19:25Z" - }, { "name": "arunavo4/gitea-mirror", "version": "v2.18.0", @@ -844,11 +889,6 @@ "version": "0.17.14", "date": "2025-06-21T23:43:04Z" }, - { - "name": "rogerfar/rdt-client", - "version": "v2.0.114", - "date": "2025-06-21T11:20:21Z" - }, { "name": "Sonarr/Sonarr", "version": "v4.0.15.2941", @@ -869,21 +909,11 @@ "version": "v3.5.5", "date": "2025-06-19T05:43:47Z" }, - { - "name": "docmost/docmost", - "version": "v0.21.0", - "date": "2025-06-18T21:43:27Z" - }, { "name": "pterodactyl/panel", "version": "v1.11.11", "date": "2025-06-18T18:04:50Z" }, - { - "name": "NodeBB/NodeBB", - "version": "v3.12.7", - "date": "2025-06-18T14:22:53Z" - }, { "name": "Bubka/2FAuth", "version": "v5.6.0", @@ -894,11 +924,6 @@ "version": "2.0.0-pre3", "date": "2025-06-18T08:01:24Z" }, - { - "name": "donaldzou/WGDashboard", - "version": "v4.2.4", - "date": "2025-06-17T05:37:06Z" - }, { "name": "webmin/webmin", "version": "2.402", @@ -1014,11 +1039,6 @@ "version": "0.19.2", "date": "2025-05-29T14:39:17Z" }, - { - "name": "apache/cassandra", - "version": "cassandra-4.0.18", - "date": "2025-05-28T21:45:55Z" - }, { "name": "Athou/commafeed", "version": "5.10.0", @@ -1119,11 +1139,6 @@ "version": "v4.1.2", "date": "2024-05-04T08:06:50Z" }, - { - "name": "Suwayomi/Suwayomi-Server", - "version": "v2.0.1727", - "date": "2025-04-21T17:53:05Z" - }, { "name": "caddyserver/caddy", "version": "v2.10.0", @@ -1174,11 +1189,6 @@ "version": "1.5.0", "date": "2025-03-30T17:42:59Z" }, - { - "name": "inspircd/inspircd", - "version": "v4.7.0", - "date": "2025-03-29T03:50:50Z" - }, { "name": "grocy/grocy", "version": "v4.5.0", @@ -1339,11 +1349,6 @@ "version": "0.10.1", "date": "2024-11-10T10:25:45Z" }, - { - "name": "caddyserver/xcaddy", - "version": "v0.4.4", - "date": "2024-11-05T23:06:11Z" - }, { "name": "zerotier/ZeroTierOne", "version": "1.14.2", @@ -1393,10 +1398,5 @@ "name": "pterodactyl/wings", "version": "v1.11.13", "date": "2024-05-08T04:20:34Z" - }, - { - "name": "CrazyWolf13/web-check", - "version": "1.0.0", - "date": "2024-05-05T02:01:51Z" } ] diff --git a/frontend/public/json/victoriametrics.json b/frontend/public/json/victoriametrics.json index 4798d372e..77371cd73 100644 --- a/frontend/public/json/victoriametrics.json +++ b/frontend/public/json/victoriametrics.json @@ -31,5 +31,10 @@ "username": null, "password": null }, - "notes": [] + "notes": [ + { + "text": "Included option to install VictoriaLogs.", + "type": "info" + } + ] } diff --git a/frontend/src/config/site-config.tsx b/frontend/src/config/site-config.tsx index 92af19ad6..ed8d08549 100644 --- a/frontend/src/config/site-config.tsx +++ b/frontend/src/config/site-config.tsx @@ -45,7 +45,7 @@ export const navbarLinks = [ export const mostPopularScripts = ["post-pve-install", "docker", "homeassistant"]; export const analytics = { - url: "analytics.community-scripts.org", + url: "analytics.bramsuurd.nl", token: "aefee1b9-2a12-4ac2-9d82-a63113edc62e", }; diff --git a/install/argus-install.sh b/install/argus-install.sh index 4d41295bd..77609b674 100644 --- a/install/argus-install.sh +++ b/install/argus-install.sh @@ -13,17 +13,7 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - jq -msg_ok "Installed Dependencies" - -msg_info "Setup Argus" -RELEASE=$(curl -fsSL https://api.github.com/repos/release-argus/Argus/releases/latest | jq -r .tag_name | sed 's/^v//') -mkdir -p /opt/argus -curl -fsSL "https://github.com/release-argus/Argus/releases/download/${RELEASE}/Argus-${RELEASE}.linux-arm64" -o /opt/argus/Argus -chmod +x /opt/argus/Argus -msg_ok "Setup Argus" +fetch_and_deploy_gh_release "Argus" "release-argus/Argus" "singlefile" "latest" "/opt/argus" "Argus*linux-arm64" msg_info "Setup Argus Config" cat </opt/argus/config.yml @@ -71,7 +61,6 @@ service: icon_link_to: https://helper-scripts.com/ web_url: https://github.com/community-scripts/ProxmoxVE/releases EOF -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Setup Config" msg_info "Creating Service" diff --git a/install/autobrr-install.sh b/install/autobrr-install.sh index 0cc0367bd..76ae0b310 100644 --- a/install/autobrr-install.sh +++ b/install/autobrr-install.sh @@ -13,10 +13,9 @@ setting_up_container network_check update_os -msg_info "Installing Autobrr" -curl -fsSL "$(curl -fsSL https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_arm64 | cut -d\" -f4)" -o $(basename "$(curl -fsSL https://api.github.com/repos/autobrr/autobrr/releases/latest | grep download | grep linux_x86_64 | cut -d\" -f4)") -tar -C /usr/local/bin -xzf autobrr*.tar.gz -rm -rf autobrr*.tar.gz +fetch_and_deploy_gh_release "autobrr" "autobrr/autobrr" "prebuild" "latest" "/usr/local/bin" "autobrr_*_linux_arm64.tar.gz" + +msg_info "Configuring Autobrr" mkdir -p /root/.config/autobrr cat <>/root/.config/autobrr/config.toml # https://autobrr.com/configuration/autobrr @@ -25,21 +24,24 @@ port = 7474 logLevel = "DEBUG" sessionSecret = "$(openssl rand -base64 24)" EOF -msg_ok "Installed Autobrr" +msg_ok "Configured Autobrr" msg_info "Creating Service" -service_path="/etc/systemd/system/autobrr.service" -echo "[Unit] +cat </etc/systemd/system/autobrr.service +[Unit] Description=autobrr service After=syslog.target network-online.target + [Service] Type=simple User=root Group=root ExecStart=/usr/local/bin/autobrr --config=/root/.config/autobrr/ + [Install] -WantedBy=multi-user.target" >$service_path -systemctl enable --now -q autobrr.service +WantedBy=multi-user.target +EOF +systemctl enable --now -q autobrr msg_ok "Created Service" motd_ssh diff --git a/install/booklore-install.sh b/install/booklore-install.sh index 1f7f2dbb9..3594e5f1a 100644 --- a/install/booklore-install.sh +++ b/install/booklore-install.sh @@ -3,7 +3,7 @@ # Copyright (c) 2021-2025 community-scripts ORG # Author: MickLesk (CanbiZ) # License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/adityachandelgit/BookLore +# Source: https://github.com/booklore-app/BookLore source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" color @@ -17,7 +17,7 @@ msg_info "Installing Dependencies" $STD apt-get install -y nginx msg_ok "Installed Dependencies" -fetch_and_deploy_gh_release "booklore" "adityachandelgit/BookLore" +fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore" JAVA_VERSION="21" setup_java NODE_VERSION="22" setup_nodejs setup_mariadb @@ -59,7 +59,7 @@ msg_ok "Created Environment" msg_info "Building Backend" cd /opt/booklore/booklore-api -APP_VERSION=$(curl -fsSL https://api.github.com/repos/adityachandelgit/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//') +APP_VERSION=$(curl -fsSL https://api.github.com/repos/booklore-app/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//') yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml $STD ./gradlew clean build --no-daemon mkdir -p /opt/booklore/dist diff --git a/install/crafty-controller-install.sh b/install/crafty-controller-install.sh index 025efcfff..b6ff2fd14 100644 --- a/install/crafty-controller-install.sh +++ b/install/crafty-controller-install.sh @@ -24,10 +24,7 @@ $STD apt-get install -y \ msg_ok "Installed Dependencies" msg_info "Setting up TemurinJDK" -mkdir -p /etc/apt/keyrings -curl -fsSL "https://packages.adoptium.net/artifactory/api/gpg/key/public" | tee /etc/apt/keyrings/adoptium.asc -echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list -$STD apt-get update +setup_java $STD apt-get install -y temurin-{8,11,17,21}-jre sudo update-alternatives --set java /usr/lib/jvm/temurin-21-jre-arm64/bin/java msg_ok "Installed TemurinJDK" @@ -41,7 +38,7 @@ $STD apt-get install -y \ rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED msg_ok "Setup Python3" -msg_info "Installing Craty-Controller (Patience)" +msg_info "Installing Crafty-Controller (Patience)" useradd crafty -m -s /bin/bash cd /opt mkdir -p /opt/crafty-controller/crafty /opt/crafty-controller/server diff --git a/install/cronicle-install.sh b/install/cronicle-install.sh index 2825cc0ec..b4023323f 100644 --- a/install/cronicle-install.sh +++ b/install/cronicle-install.sh @@ -14,13 +14,11 @@ network_check update_os NODE_VERSION="22" setup_nodejs +fetch_and_deploy_gh_release "cronicle" "jhuckaby/Cronicle" -msg_info "Installing Cronicle Primary Server" -LATEST=$(curl -fsSL https://api.github.com/repos/jhuckaby/Cronicle/releases/latest | grep '"tag_name":' | cut -d'"' -f4) +msg_info "Configuring Cronicle Primary Server" IP=$(hostname -I | awk '{print $1}') -mkdir -p /opt/cronicle cd /opt/cronicle -$STD tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1 $STD npm install $STD node bin/build.js dist sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json @@ -29,7 +27,7 @@ $STD /opt/cronicle/bin/control.sh start $STD cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled chmod 775 /etc/init.d/cronicled $STD update-rc.d cronicled defaults -msg_ok "Installed Cronicle Primary Server" +msg_ok "Configured Cronicle Primary Server" motd_ssh customize diff --git a/install/docmost-install.sh b/install/docmost-install.sh index eeddadb9d..b75933d6f 100644 --- a/install/docmost-install.sh +++ b/install/docmost-install.sh @@ -51,6 +51,7 @@ sed -i -e "s|APP_SECRET=.*|APP_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z /opt/docmost/.env export NODE_OPTIONS="--max-old-space-size=2048" $STD pnpm install +$STD pnpm nx run server:build # Dirty fix https://github.com/community-scripts/ProxmoxVE/issues/6377 $STD pnpm build msg_ok "Configured Docmost" diff --git a/install/fumadocs-install.sh b/install/fumadocs-install.sh index 1ce3fc6bf..a332a2e10 100644 --- a/install/fumadocs-install.sh +++ b/install/fumadocs-install.sh @@ -14,7 +14,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - ca-certificates + ca-certificates \ + git msg_ok "Installed Dependencies" NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs diff --git a/install/gotify-install.sh b/install/gotify-install.sh index b8e12a577..34e36de67 100644 --- a/install/gotify-install.sh +++ b/install/gotify-install.sh @@ -13,16 +13,8 @@ setting_up_container network_check update_os -msg_info "Installing Gotify" -RELEASE=$(curl -fsSL https://api.github.com/repos/gotify/server/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -mkdir -p /opt/gotify -cd /opt/gotify -curl -fsSL "https://github.com/gotify/server/releases/download/v${RELEASE}/gotify-linux-arm64.zip" -o "gotify-linux-arm64.zip" -$STD unzip gotify-linux-arm64.zip -rm -rf gotify-linux-arm64.zip -chmod +x gotify-linux-arm64 -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -msg_ok "Installed Gotify" +fetch_and_deploy_gh_release "gotify" "gotify/server" "prebuild" "latest" "/opt/gotify" "gotify-linux-arm64.zip" +chmod +x /opt/gotify/gotify-linux-arm64 msg_info "Creating Service" cat </etc/systemd/system/gotify.service diff --git a/install/grafana-install.sh b/install/grafana-install.sh index 6ad5a321f..ab0ba0327 100644 --- a/install/grafana-install.sh +++ b/install/grafana-install.sh @@ -14,20 +14,20 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y apt-transport-https -$STD apt-get install -y software-properties-common +$STD apt-get install -y \ + apt-transport-https \ + software-properties-common msg_ok "Installed Dependencies" msg_info "Setting up Grafana Repository" curl -fsSL "https://apt.grafana.com/gpg.key" -o "/usr/share/keyrings/grafana.key" -sh -c 'echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" > /etc/apt/sources.list.d/grafana.list' +echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" >/etc/apt/sources.list.d/grafana.list msg_ok "Set up Grafana Repository" msg_info "Installing Grafana" $STD apt-get update $STD apt-get install -y grafana -systemctl start grafana-server -systemctl enable --now -q grafana-server.service +systemctl enable -q --now grafana-server msg_ok "Installed Grafana" motd_ssh diff --git a/install/grocy-install.sh b/install/grocy-install.sh index d360cba34..297923a48 100644 --- a/install/grocy-install.sh +++ b/install/grocy-install.sh @@ -17,23 +17,10 @@ msg_info "Installing Dependencies" $STD apt-get install -y apt-transport-https msg_ok "Installed Dependencies" -msg_info "Installing PHP8.2" -VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" -curl -fsSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg -echo -e "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $VERSION main" >/etc/apt/sources.list.d/php.list -$STD apt-get update -$STD apt-get install -y php8.2 -$STD apt-get install -y libapache2-mod-php8.2 -$STD apt-get install -y php8.2-sqlite3 -$STD apt-get install -y php8.2-gd -$STD apt-get install -y php8.2-intl -$STD apt-get install -y php8.2-mbstring -msg_ok "Installed PHP8.2" +PHP_VERSION="8.3" PHP_MODULE="sqlite3,bz2" PHP_APACHE="yes" setup_php +fetch_and_deploy_gh_release "grocy" "grocy/grocy" "prebuild" "latest" "/var/www/html" "grocy*.zip" -msg_info "Installing grocy" -latest=$(curl -fsSL https://api.github.com/repos/grocy/grocy/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/grocy/grocy/releases/download/v${latest}/grocy_${latest}.zip" -o "grocy_${latest}.zip" -$STD unzip grocy_${latest}.zip -d /var/www/html +msg_info "Configuring grocy" chown -R www-data:www-data /var/www/html cp /var/www/html/config-dist.php /var/www/html/data/config.php chmod +x /var/www/html/update.sh @@ -64,5 +51,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -rm -rf /root/grocy_${latest}.zip msg_ok "Cleaned" diff --git a/install/habitica-install.sh b/install/habitica-install.sh index 10acf4d5d..07bfbbf87 100644 --- a/install/habitica-install.sh +++ b/install/habitica-install.sh @@ -26,10 +26,12 @@ NODE_VERSION="20" NODE_MODULE="gulp-cli,mocha,npm@10" setup_nodejs fetch_and_deploy_gh_release "habitica" "HabitRPG/habitica" "tarball" "latest" "/opt/habitica" msg_info "Setup ${APPLICATION}" +IPADDRESS=$(hostname -I | awk '{print $1}') cd /opt/habitica $STD npm i $STD npm run postinstall cp config.json.example config.json +sed -i "s/\"TRUSTED_DOMAINS\": \"/&http:\/\/$IPADDRESS:3000,/" config.json $STD npm run client:build $STD gulp build:prod diff --git a/install/hivemq-install.sh b/install/hivemq-install.sh index de5f9c3f1..729d760c8 100644 --- a/install/hivemq-install.sh +++ b/install/hivemq-install.sh @@ -13,34 +13,26 @@ setting_up_container network_check update_os -msg_info "Installing OpenJDK" -curl -fsSL "https://packages.adoptium.net/artifactory/api/gpg/key/public" | gpg --dearmor >/etc/apt/trusted.gpg.d/adoptium.gpg -echo 'deb [arch=arm64 signed-by=/etc/apt/trusted.gpg.d/adoptium.gpg] https://packages.adoptium.net/artifactory/deb bookworm main' >/etc/apt/sources.list.d/adoptium.list -$STD apt-get update -$STD apt-get install -y temurin-17-jre -msg_ok "Installed OpenJDK" +JAVA_VERSION="21" setup_java +fetch_and_deploy_gh_release "hivemq" "hivemq/hivemq-community-edition" "prebuild" "latest" "/opt/hivemq" "hivemq-ce-*.zip" -msg_info "Installing HiveMQ CE" -RELEASE=$(curl -fsSL https://api.github.com/repos/hivemq/hivemq-community-edition/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -curl -fsSL "https://github.com/hivemq/hivemq-community-edition/releases/download/${RELEASE}/hivemq-ce-${RELEASE}.zip" -o "hivemq-ce-${RELEASE}.zip" -$STD unzip hivemq-ce-${RELEASE}.zip -mkdir -p /opt/hivemq -mv hivemq-ce-${RELEASE}/* /opt/hivemq +msg_info "Configuring HiveMQ CE" useradd -d /opt/hivemq hivemq chown -R hivemq:hivemq /opt/hivemq chmod +x /opt/hivemq/bin/run.sh cp /opt/hivemq/bin/init-script/hivemq.service /etc/systemd/system/hivemq.service rm /opt/hivemq/conf/config.xml mv /opt/hivemq/conf/examples/configuration/config-sample-tcp-and-websockets.xml /opt/hivemq/conf/config.xml +msg_ok "Configured HiveMQ CE" + +msg_info "Starting service" systemctl enable -q --now hivemq -msg_ok "Installed HiveMQ CE" +msg_ok "Service started" motd_ssh customize msg_info "Cleaning up" -rm -rf hivemq-ce-${RELEASE}.zip -rm -rf ../hivemq-ce-${RELEASE} $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/homebox-install.sh b/install/homebox-install.sh index 6d3b38478..88c763612 100644 --- a/install/homebox-install.sh +++ b/install/homebox-install.sh @@ -14,18 +14,17 @@ setting_up_container network_check update_os -msg_info "Installing Homebox" -RELEASE=$(curl -fsSL https://api.github.com/repos/sysadminsmedia/homebox/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -curl -fsSL "https://github.com/sysadminsmedia/homebox/releases/download/${RELEASE}/homebox_Linux_arm64.tar.gz" | tar -xzf - -C /opt -chmod +x /opt/homebox -cat </opt/.env +fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "latest" "/opt/homebox" "homebox_Linux_arm64.tar.gz" + +msg_info "Configuring Homebox" +chmod +x /opt/homebox/homebox +cat </opt/homebox/.env # For possible environment variables check here: https://homebox.software/en/configure-homebox HBOX_MODE=production HBOX_WEB_PORT=7745 HBOX_WEB_HOST=0.0.0.0 EOF -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" -msg_ok "Installed Homebox" +msg_ok "Configured Homebox" msg_info "Creating Service" cat </etc/systemd/system/homebox.service @@ -34,9 +33,9 @@ Description=Start Homebox Service After=network.target [Service] -WorkingDirectory=/opt -ExecStart=/opt/homebox -EnvironmentFile=/opt/.env +WorkingDirectory=/opt/homebox +ExecStart=/opt/homebox/homebox +EnvironmentFile=/opt/homebox/.env Restart=on-failure [Install] diff --git a/install/immich-install.sh b/install/immich-install.sh index e51b449f8..5497ad437 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -266,7 +266,7 @@ GEO_DIR="${INSTALL_DIR}/geodata" mkdir -p "$INSTALL_DIR" mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${ML_DIR}","${INSTALL_DIR}"/cache} -fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.136.0" "$SRC_DIR" +fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.137.3" "$SRC_DIR" msg_info "Installing ${APPLICATION} (more patience please)" @@ -275,6 +275,9 @@ $STD npm install -g node-gyp node-pre-gyp $STD npm ci $STD npm run build $STD npm prune --omit=dev --omit=optional +cp -a {bin,dist,node_modules,resources,package*.json} "$APP_DIR"/ +cp package.json "$APP_DIR"/bin +sed -i 's|^start|./start|' "$APP_DIR"/bin/immich-admin cd "$SRC_DIR"/open-api/typescript-sdk $STD npm ci $STD npm run build @@ -282,14 +285,13 @@ cd "$SRC_DIR"/web $STD npm ci $STD npm run build cd "$SRC_DIR" -cp -a server/{node_modules,dist,bin,resources,package.json,package-lock.json,bin/start.sh} "$APP_DIR"/ cp -a web/build "$APP_DIR"/www cp LICENSE "$APP_DIR" cd "$APP_DIR" export SHARP_FORCE_GLOBAL_LIBVIPS=true $STD npm install sharp rm -rf "$APP_DIR"/node_modules/@img/sharp-{libvips*,linuxmusl-x64} -msg_ok "Installed Immich Web Components" +msg_ok "Installed Immich Server and Web Components" cd "$SRC_DIR"/machine-learning export VIRTUAL_ENV="${ML_DIR}/ml-venv" @@ -305,8 +307,8 @@ fi ln -sf "$APP_DIR"/resources "$INSTALL_DIR" cd "$APP_DIR" -grep -Rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g" -grep -RlE "'/build'" | xargs -n1 sed -i "s|'/build'|'$APP_DIR'|g" +grep -rl /usr/src | xargs -n1 sed -i "s|\/usr/src|$INSTALL_DIR|g" +grep -rlE "'/build'" | xargs -n1 sed -i "s|'/build'|'$APP_DIR'|g" sed -i "s@\"/cache\"@\"$INSTALL_DIR/cache\"@g" "$ML_DIR"/immich_ml/config.py ln -s "$UPLOAD_DIR" "$APP_DIR"/upload ln -s "$UPLOAD_DIR" "$ML_DIR"/upload @@ -370,7 +372,16 @@ set +a python3 -m immich_ml EOF -chmod +x "$ML_DIR"/ml_start.sh +cat <"$APP_DIR"/bin/start.sh +#!/usr/bin/env bash + +set -a +. "$INSTALL_DIR"/.env +set +a + +/usr/bin/node "$APP_DIR"/dist/main.js "\$@" +EOF +chmod +x "$ML_DIR"/ml_start.sh "$APP_DIR"/bin/start.sh cat </etc/systemd/system/"${APPLICATION}"-web.service [Unit] Description=${APPLICATION} Web Service diff --git a/install/inspircd-install.sh b/install/inspircd-install.sh index 873018021..0544e909d 100644 --- a/install/inspircd-install.sh +++ b/install/inspircd-install.sh @@ -13,13 +13,9 @@ setting_up_container network_check update_os -# broken on arm64 +fetch_and_deploy_gh_release "inspircd" "inspircd/inspircd" "binary" -msg_info "Installing InspIRCd" -RELEASE=$(curl -fsSL https://api.github.com/repos/inspircd/inspircd/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -cd /opt -curl -fsSL "https://github.com/inspircd/inspircd/releases/download/v${RELEASE}/inspircd_${RELEASE}.deb12u2_amd64.deb" -o "inspircd_${RELEASE}.deb12u2_amd64.deb" -$STD apt-get install "./inspircd_${RELEASE}.deb12u2_amd64.deb" -y &>/dev/null +msg_info "Configuring InspIRCd" cat </etc/inspircd/inspircd.conf @@ -34,15 +30,12 @@ cat </etc/inspircd/inspircd.conf email="irc@&networkDomain;"> EOF - -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed InspIRCd" motd_ssh customize msg_info "Cleaning up" -rm -rf /opt/inspircd_${RELEASE}.deb12u2_amd64.deb $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/jackett-install.sh b/install/jackett-install.sh index ebdaeb868..cd6a79aab 100644 --- a/install/jackett-install.sh +++ b/install/jackett-install.sh @@ -13,20 +13,14 @@ setting_up_container network_check update_os -msg_info "Installing Jackett" -RELEASE=$(curl -fsSL https://github.com/Jackett/Jackett/releases/latest | grep "title>Release" | cut -d " " -f 4) -cd /opt -curl -fsSL "https://github.com/Jackett/Jackett/releases/download/$RELEASE/Jackett.Binaries.LinuxARM64.tar.gz" -o "Jackett.Binaries.LinuxARM64.tar.gz" -tar -xzf Jackett.Binaries.LinuxARM64.tar.gz -C /opt -rm -rf Jackett.Binaries.LinuxARM64.tar.gz -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -msg_ok "Installed Jackett" +fetch_and_deploy_gh_release "jackett" "Jackett/Jackett" "prebuild" "latest" "/opt/Jackett" "Jackett.Binaries.LinuxARM64.tar.gz" msg_info "Creating Service" cat </etc/systemd/system/jackett.service [Unit] Description=Jackett Daemon After=network.target + [Service] SyslogIdentifier=jackett Restart=always @@ -35,7 +29,8 @@ Type=simple WorkingDirectory=/opt/Jackett ExecStart=/bin/sh /opt/Jackett/jackett_launcher.sh TimeoutStopSec=30 -Environment="DisableRootWarning=true" +EnvironmentFile="/opt/.env" + [Install] WantedBy=multi-user.target EOF diff --git a/install/jeedom-install.sh b/install/jeedom-install.sh new file mode 100644 index 000000000..d868e84b1 --- /dev/null +++ b/install/jeedom-install.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Mips2648 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://jeedom.com/ + +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 \ + lsb-release \ + git +msg_ok "Dependencies installed" + +DEFAULT_BRANCH="master" +REPO_URL="https://github.com/jeedom/core.git" + +echo +while true; do + read -rp "${TAB3}Enter branch to use (master, beta, alpha...) (Default: ${DEFAULT_BRANCH}): " BRANCH + BRANCH="${BRANCH:-$DEFAULT_BRANCH}" + + if git ls-remote --heads "$REPO_URL" "refs/heads/$BRANCH" | grep -q .; then + break + else + msg_error "Branch '$BRANCH' does not exist on remote. Please try again." + fi +done + +msg_info "Downloading Jeedom installation script" +cd /tmp +wget -q https://raw.githubusercontent.com/jeedom/core/"${BRANCH}"/install/install.sh +chmod +x install.sh +msg_ok "Installation script downloaded" + +msg_info "Install Jeedom main dependencies, please wait" +$STD ./install.sh -v "$BRANCH" -s 2 +msg_ok "Installed Jeedom main dependencies" + +msg_info "Install Database" +$STD ./install.sh -v "$BRANCH" -s 3 +msg_ok "Database installed" + +msg_info "Install Apache" +$STD ./install.sh -v "$BRANCH" -s 4 +msg_ok "Apache installed" + +msg_info "Install PHP and dependencies" +$STD ./install.sh -v "$BRANCH" -s 5 +msg_ok "PHP installed" + +msg_info "Download Jeedom core" +$STD ./install.sh -v "$BRANCH" -s 6 +msg_ok "Download done" + +msg_info "Database customisation" +$STD ./install.sh -v "$BRANCH" -s 7 +msg_ok "Database customisation done" + +msg_info "Jeedom customisation" +$STD ./install.sh -v "$BRANCH" -s 8 +msg_ok "Jeedom customisation done" + +msg_info "Configuring Jeedom" +$STD ./install.sh -v "$BRANCH" -s 9 +msg_ok "Jeedom configured" + +msg_info "Installing Jeedom" +$STD ./install.sh -v "$BRANCH" -s 10 +msg_ok "Jeedom installed" + +msg_info "Post installation" +$STD ./install.sh -v "$BRANCH" -s 11 +msg_ok "Post installation done" + +msg_info "Check installation" +$STD ./install.sh -v "$BRANCH" -s 12 +msg_ok "Installation checked, everything is successfuly installed. A reboot is recommended." + +motd_ssh +customize + +msg_info "Cleaning up" +rm -rf /tmp/install.sh +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/install/karakeep-install.sh b/install/karakeep-install.sh index 95dc0c25f..2e5ad4084 100644 --- a/install/karakeep-install.sh +++ b/install/karakeep-install.sh @@ -15,28 +15,20 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - g++ \ build-essential \ git \ ca-certificates \ chromium/stable \ chromium-common/stable \ graphicsmagick \ - ghostscript \ - jq + ghostscript msg_ok "Installed Dependencies" -msg_info "Installing Additional Tools" -curl -fsSL "https://github.com/Y2Z/monolith/releases/latest/download/monolith-gnu-linux-aarch64" -o "/usr/bin/monolith" -chmod +x /usr/bin/monolith -curl -fsSL "https://github.com/yt-dlp/yt-dlp-nightly-builds/releases/latest/download/yt-dlp_linux_aarch64" -o "/usr/bin/yt-dlp" -chmod +x /usr/bin/yt-dlp -msg_ok "Installed Additional Tools" +fetch_and_deploy_gh_release "monolith" "Y2Z/monolith" "singlefile" "latest" "/usr/bin" "monolith-gnu-linux-aarch64" +fetch_and_deploy_gh_release "yt-dlp" "yt-dlp/yt-dlp-nightly-builds" "singlefile" "latest" "/usr/bin" "yt-dlp_linux" +fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" -msg_info "Installing Meilisearch" -cd /tmp -curl -fsSL "https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch-aarch64.deb" -o "meilisearch.deb" -$STD dpkg -i meilisearch.deb +msg_info "Configuring Meilisearch" curl -fsSL "https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml" -o "/etc/meilisearch.toml" MASTER_KEY=$(openssl rand -base64 12) sed -i \ @@ -47,7 +39,7 @@ sed -i \ -e 's|^snapshot_dir =.*|snapshot_dir = "/var/lib/meilisearch/snapshots"|' \ -e 's|^# no_analytics = true|no_analytics = true|' \ /etc/meilisearch.toml -msg_ok "Installed Meilisearch" +msg_ok "Configured Meilisearch" fetch_and_deploy_gh_release "karakeep" "karakeep-app/karakeep" cd /opt/karakeep @@ -185,7 +177,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf /tmp/meilisearch-aarch64.deb $STD apt-get autoremove -y $STD apt-get autoclean -y msg_ok "Cleaned" diff --git a/install/keycloak-install.sh b/install/keycloak-install.sh index ca1d6579f..a39a694f7 100644 --- a/install/keycloak-install.sh +++ b/install/keycloak-install.sh @@ -13,32 +13,46 @@ setting_up_container network_check update_os -msg_info "Installing OpenJDK" -curl -fsSL "https://packages.adoptium.net/artifactory/api/gpg/key/public" | gpg --dearmor >/etc/apt/trusted.gpg.d/adoptium.gpg -echo 'deb [arch=arm64 signed-by=/etc/apt/trusted.gpg.d/adoptium.gpg] https://packages.adoptium.net/artifactory/deb bookworm main' >/etc/apt/sources.list.d/adoptium.list -$STD apt-get update -$STD apt-get install -y temurin-21-jre -msg_ok "Installed OpenJDK" +JAVA_VERSION=21 setup_java +PG_VERSION=16 setup_postgresql -msg_info "Installing Keycloak" -temp_file=$(mktemp) -RELEASE=$(curl -fsSL https://api.github.com/repos/keycloak/keycloak/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -curl -fsSL "https://github.com/keycloak/keycloak/releases/download/$RELEASE/keycloak-$RELEASE.tar.gz" -o "$temp_file" -tar xzf $temp_file -mv keycloak-$RELEASE /opt/keycloak -msg_ok "Installed Keycloak" +msg_info "Configuring PostgreSQL" +DB_NAME="keycloak" +DB_USER="keycloak" +DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)" +$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" +$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8';" +$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;" +msg_ok "Configured PostgreSQL" + +fetch_and_deploy_gh_release "keycloak" "keycloak/keycloak" "prebuild" "latest" "/opt/keycloak" "keycloak-*.tar.gz" msg_info "Creating Service" cat </etc/systemd/system/keycloak.service [Unit] Description=Keycloak Service -After=network.target +Requires=network.target +After=syslog.target network-online.target [Service] +Type=idle User=root WorkingDirectory=/opt/keycloak -ExecStart=/opt/keycloak/bin/kc.sh start-dev - +ExecStart=/opt/keycloak/bin/kc.sh start +ExecStop=/opt/keycloak/bin/kc.sh stop +Restart=always +RestartSec=3 +Environment="JAVA_HOME=/usr/lib/jvm/temurin-21-jdk-amd64" +Environment="KC_DB=postgres" +Environment="KC_DB_USERNAME=$DB_USER" +Environment="KC_DB_PASSWORD=$DB_PASS" +Environment="KC_HTTP_ENABLED=true" +Environment="KC_BOOTSTRAP_ADMIN_USERNAME=tmpadm" +Environment="KC_BOOTSTRAP_ADMIN_PASSWORD=admin123" +# Comment following line and uncomment the next 2 if working behind a reverse proxy +Environment="KC_HOSTNAME_STRICT=false" +#Environment="KC_HOSTNAME=keycloak.example.com" +#Environment="KC_PROXY_HEADERS=xforwarded" [Install] WantedBy=multi-user.target EOF @@ -49,7 +63,6 @@ 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/koillection-install.sh b/install/koillection-install.sh index 23d157cd1..dd169967e 100644 --- a/install/koillection-install.sh +++ b/install/koillection-install.sh @@ -13,29 +13,10 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - apache2 \ - lsb-release -msg_ok "Installed Dependencies" - NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs PG_VERSION="16" setup_postgresql - -msg_info "Setup PHP8.4 Repository" -$STD curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb -$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb -$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' -$STD apt-get update -msg_ok "Setup PHP8.4 Repository" - -msg_info "Setup PHP" -$STD apt-get install -y \ - php8.4 \ - php8.4-{apcu,ctype,curl,dom,fileinfo,gd,iconv,intl,mbstring,pgsql} \ - libapache2-mod-php8.4 \ - composer -msg_info "Setup PHP" +PHP_VERSION="8.4" PHP_APACHE="YES" PHP_MODULE="apcu,ctype,dom,fileinfo,iconv,pgsql" setup_php +setup_composer msg_info "Setting up PostgreSQL" DB_NAME=koillection @@ -51,12 +32,9 @@ $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMP } >>~/koillection.creds msg_ok "Set up PostgreSQL" -msg_info "Installing Koillection" -RELEASE=$(curl -fsSL https://api.github.com/repos/benjaminjonard/koillection/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -cd /opt -curl -fsSL "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip" -o "/opt/${RELEASE}.zip" -$STD unzip "${RELEASE}.zip" -mv "/opt/koillection-${RELEASE}" /opt/koillection +fetch_and_deploy_gh_release "koillection" "benjaminjonard/koillection" + +msg_info "Configuring Koillection" cd /opt/koillection cp /opt/koillection/.env /opt/koillection/.env.local APP_SECRET=$(openssl rand -base64 32) @@ -75,8 +53,7 @@ cd assets/ $STD yarn install $STD yarn build chown -R www-data:www-data /opt/koillection/public/uploads -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -msg_ok "Installed Koillection" +msg_ok "Configured Koillection" msg_info "Creating Service" cat </etc/apache2/sites-available/koillection.conf @@ -107,7 +84,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf "/opt/${RELEASE}.zip" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/komga-install.sh b/install/komga-install.sh index f2891ab38..04dedc905 100644 --- a/install/komga-install.sh +++ b/install/komga-install.sh @@ -13,17 +13,9 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y openjdk-17-jre -msg_ok "Installed Dependencies" - -msg_info "Installing Komga" -RELEASE=$(curl -fsSL https://api.github.com/repos/gotson/komga/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -curl -fsSL "https://github.com/gotson/komga/releases/download/${RELEASE}/komga-${RELEASE}.jar" -o "komga-${RELEASE}.jar" -mkdir -p /opt/komga -mv -f komga-${RELEASE}.jar /opt/komga/komga.jar -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" -msg_ok "Installed Komga" +JAVA_VERSION="21" setup_java +USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "komga" "gotson/komga" "singlefile" "latest" "/opt/komga" "komga*.jar" +mv /opt/komga/komga-*.jar /opt/komga/komga.jar msg_info "Creating Service" cat </etc/systemd/system/komga.service @@ -42,7 +34,7 @@ Restart=on-failure [Install] WantedBy=multi-user.target EOF -systemctl enable --now -q komga +systemctl enable -q --now komga msg_ok "Created Service" motd_ssh diff --git a/install/kubo-install.sh b/install/kubo-install.sh index 883ad19b8..c9f8d63e3 100644 --- a/install/kubo-install.sh +++ b/install/kubo-install.sh @@ -14,10 +14,9 @@ setting_up_container network_check update_os -msg_info "Installing IPFS" -RELEASE=$(curl -fsSL https://github.com/ipfs/kubo/releases/latest | grep "title>Release" | cut -d " " -f 4) -$STD curl -fsSL "https://github.com/ipfs/kubo/releases/download/${RELEASE}/kubo_${RELEASE}_linux-arm64.tar.gz" -o "kubo_${RELEASE}_linux-arm64.tar.gz" -tar -xzf "kubo_${RELEASE}_linux-arm64.tar.gz" -C /usr/local +fetch_and_deploy_gh_release "kubo" "ipfs/kubo" "prebuild" "latest" "/usr/local/kubo" "kubo*linux-arm64.tar.gz" + +msg_info "Configuring IPFS" $STD ln -s /usr/local/kubo/ipfs /usr/local/bin/ipfs $STD ipfs init ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001 @@ -43,7 +42,7 @@ Environment=HOME=/root [Install] WantedBy=multi-user.target EOF -systemctl enable --now -q ipfs.service +systemctl enable -q --now ipfs msg_ok "Created Service" motd_ssh diff --git a/install/librespeed-rust-install.sh b/install/librespeed-rust-install.sh index e9ac4cc08..23a293733 100644 --- a/install/librespeed-rust-install.sh +++ b/install/librespeed-rust-install.sh @@ -16,7 +16,7 @@ update_os fetch_and_deploy_gh_release "librespeed-rust" "librespeed/speedtest-rust" "binary" "latest" "/opt/librespeed-rust" "librespeed-rs-aarch64-unknown-linux-gnu.deb" msg_info "Enabling Service" -systemctl enable -q --now speedtest_rs.service +systemctl enable -q --now speedtest_rs msg_ok "Enabled Service" motd_ssh diff --git a/install/lidarr-install.sh b/install/lidarr-install.sh index e74badb1c..d2da6a58a 100644 --- a/install/lidarr-install.sh +++ b/install/lidarr-install.sh @@ -20,22 +20,20 @@ $STD apt-get install -y \ mediainfo msg_ok "Installed Dependencies" -msg_info "Installing Lidarr" -temp_file="$(mktemp)" +fetch_and_deploy_gh_release "lidarr" "Lidarr/Lidarr" "prebuild" "latest" "/opt/Lidarr" "Lidarr.master*linux-core-arm64.tar.gz" + +msg_info "Configuring Lidarr" mkdir -p /var/lib/lidarr/ chmod 775 /var/lib/lidarr/ -RELEASE=$(curl -fsSL https://api.github.com/repos/Lidarr/Lidarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/Lidarr/Lidarr/releases/download/v${RELEASE}/Lidarr.master.${RELEASE}.linux-core-arm64.tar.gz" -o "$temp_file" -$STD tar -xvzf "$temp_file" -mv Lidarr /opt chmod 775 /opt/Lidarr -msg_ok "Installed Lidarr" +msg_ok "Configured Lidarr" msg_info "Creating Service" cat </etc/systemd/system/lidarr.service [Unit] Description=Lidarr Daemon After=syslog.target network.target + [Service] UMask=0002 Type=simple @@ -43,6 +41,7 @@ ExecStart=/opt/Lidarr/Lidarr -nobrowser -data=/var/lib/lidarr/ TimeoutStopSec=20 KillMode=process Restart=on-failure + [Install] WantedBy=multi-user.target EOF @@ -53,7 +52,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf "$temp_file" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/listmonk-install.sh b/install/listmonk-install.sh index dd47b0a17..8eac6a5c0 100644 --- a/install/listmonk-install.sh +++ b/install/listmonk-install.sh @@ -13,11 +13,9 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y postgresql -msg_ok "Installed Dependencies" +PG_VERSION="17" setup_postgresql -msg_info "Setting up PostgreSQL" +msg_info "Configuring PostgreSQL" DB_NAME=listmonk DB_USER=listmonk DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13) @@ -29,22 +27,16 @@ $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMP echo -e "listmonk Database Password: \e[32m$DB_PASS\e[0m" echo -e "listmonk Database Name: \e[32m$DB_NAME\e[0m" } >>~/listmonk.creds -msg_ok "Set up PostgreSQL" +msg_ok "Configured PostgreSQL" -msg_info "Installing listmonk" -cd /opt -mkdir /opt/listmonk -mkdir /opt/listmonk/uploads -RELEASE=$(curl -fsSL https://api.github.com/repos/knadh/listmonk/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/knadh/listmonk/releases/download/v${RELEASE}/listmonk_${RELEASE}_linux_arm64.tar.gz" -o "listmonk_${RELEASE}_linux_arm64.tar.gz" -tar -xzf "listmonk_${RELEASE}_linux_arm64.tar.gz" -C /opt/listmonk +fetch_and_deploy_gh_release "listmonk" "knadh/listmonk" "prebuild" "latest" "/opt/listmonk" "listmonk*linux_arm64.tar.gz" +msg_info "Configuring listmonk" +mkdir -p /opt/listmonk/uploads $STD /opt/listmonk/listmonk --new-config --config /opt/listmonk/config.toml sed -i -e 's/address = "localhost:9000"/address = "0.0.0.0:9000"/' -e 's/^password = ".*"/password = "'"$DB_PASS"'"/' /opt/listmonk/config.toml $STD /opt/listmonk/listmonk --install --yes --config /opt/listmonk/config.toml - -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -msg_ok "Installed listmonk" +msg_ok "Configured listmonk" msg_info "Creating Service" cat </etc/systemd/system/listmonk.service @@ -70,7 +62,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf "/opt/listmonk_${RELEASE}_linux_arm64.tar.gz" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/lubelogger-install.sh b/install/lubelogger-install.sh index 9a5f82b65..2ea12db58 100644 --- a/install/lubelogger-install.sh +++ b/install/lubelogger-install.sh @@ -13,25 +13,14 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - zip \ - jq -msg_ok "Installed Dependencies" +fetch_and_deploy_gh_release "lubelogger" "hargata/lubelog" "prebuild" "latest" "/opt/lubelogger" "LubeLogger*linux_x64.zip" -msg_info "Installing LubeLogger" -cd /opt -mkdir -p /opt/lubelogger -RELEASE=$(curl -fsSL https://api.github.com/repos/hargata/lubelog/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -RELEASE_TRIMMED=$(echo "${RELEASE}" | tr -d ".") +msg_info "Configuring LubeLogger" cd /opt/lubelogger -curl -fsSL "https://github.com/hargata/lubelog/releases/download/v${RELEASE}/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip" -o "LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip" -$STD unzip LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip chmod 700 /opt/lubelogger/CarCareTracker cp /opt/lubelogger/appsettings.json /opt/lubelogger/appsettings_bak.json jq '.Kestrel = {"Endpoints": {"Http": {"Url": "http://0.0.0.0:5000"}}}' /opt/lubelogger/appsettings_bak.json >/opt/lubelogger/appsettings.json -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" -msg_ok "Installed LubeLogger" +msg_ok "Configured LubeLogger" msg_info "Creating Service" cat </etc/systemd/system/lubelogger.service @@ -53,7 +42,7 @@ Restart=on-failure WantedBy=multi-user.target EOF -systemctl enable --now -q lubelogger.service +systemctl enable -q --now lubelogger msg_ok "Created Service" motd_ssh @@ -61,7 +50,6 @@ customize msg_info "Cleaning up" rm -rf /opt/lubelogger/appsettings_bak.json -rm -rf /opt/lubelogger/LubeLogger_v${RELEASE_TRIMMED}_linux_x64.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/mafl-install.sh b/install/mafl-install.sh index cf4478f27..cfd1418dc 100644 --- a/install/mafl-install.sh +++ b/install/mafl-install.sh @@ -22,14 +22,14 @@ msg_ok "Installed Dependencies" NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs fetch_and_deploy_gh_release "mafl" "hywax/mafl" -msg_info "Installing Mafl v${RELEASE}" +msg_info "Installing Mafl" mkdir -p /opt/mafl/data curl -fsSL "https://raw.githubusercontent.com/hywax/mafl/main/.example/config.yml" -o "/opt/mafl/data/config.yml" cd /opt/mafl export NUXT_TELEMETRY_DISABLED=true $STD yarn install $STD yarn build -msg_ok "Installed Mafl v${RELEASE}" +msg_ok "Installed Mafl" msg_info "Creating Service" cat </etc/systemd/system/mafl.service diff --git a/install/magicmirror-install.sh b/install/magicmirror-install.sh index 44dc1b46f..d44bd834f 100644 --- a/install/magicmirror-install.sh +++ b/install/magicmirror-install.sh @@ -14,14 +14,11 @@ network_check update_os NODE_VERSION="22" setup_nodejs +fetch_and_deploy_gh_release "magicmirror" "MagicMirrorOrg/MagicMirror" "tarball" -msg_info "Setup MagicMirror" -temp_file=$(mktemp) -RELEASE=$(curl -fsSL https://api.github.com/repos/MagicMirrorOrg/MagicMirror/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/MagicMirrorOrg/MagicMirror/archive/refs/tags/v${RELEASE}.tar.gz" -o ""$temp_file"" -tar -xzf "$temp_file" -mv MagicMirror-${RELEASE} /opt/magicmirror +msg_info "Configuring MagicMirror" cd /opt/magicmirror +sed -i -E 's/("postinstall": )".*"/\1""/; s/("prepare": )".*"/\1""/' package.json $STD npm run install-mm cat </opt/magicmirror/config/config.js let config = { @@ -112,8 +109,7 @@ let config = { /*************** DO NOT EDIT THE LINE BELOW ***************/ if (typeof module !== "undefined") {module.exports = config;} EOF -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" -msg_ok "Setup MagicMirror" +msg_ok "Configured MagicMirror" msg_info "Creating Service" cat </etc/systemd/system/magicmirror.service @@ -133,14 +129,13 @@ ExecStart=/usr/bin/npm run server [Install] WantedBy=multi-user.target EOF -systemctl enable --now magicmirror +systemctl enable -q --now magicmirror msg_ok "Created Service" motd_ssh customize msg_info "Cleaning up" -rm -rf $temp_file $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/managemydamnlife-install.sh b/install/managemydamnlife-install.sh index 00dc1af80..6bd01fd50 100644 --- a/install/managemydamnlife-install.sh +++ b/install/managemydamnlife-install.sh @@ -31,13 +31,10 @@ $STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH } >>~/mmdl.creds msg_ok "Set up Database" -msg_info "Installing ${APPLICATION}" -RELEASE=$(curl -fsSL https://api.github.com/repos/intri-in/manage-my-damn-life-nextjs/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSLO "https://github.com/intri-in/manage-my-damn-life-nextjs/archive/refs/tags/v${RELEASE}.zip" -unzip -q v"$RELEASE".zip -mv manage-my-damn-life-nextjs-"$RELEASE"/ /opt/mmdl -cp /opt/mmdl/sample.env.local /opt/mmdl/.env +fetch_and_deploy_gh_release "mmdl" "intri-in/manage-my-damn-life-nextjs" "tarball" +msg_info "Configuring ${APPLICATION}" +cp /opt/mmdl/sample.env.local /opt/mmdl/.env sed -i -e 's|db|localhost|' \ -e "s|myuser|${DB_USER}|" \ -e "s|mypassword|${DB_PASS}|" \ @@ -46,15 +43,13 @@ sed -i -e 's|db|localhost|' \ -e "s|sample_install_mmdm|${DB_NAME}|" \ -e "s|=PASSWORD|=$(openssl rand -base64 40 | tr -dc 'a-zA-Z0-9' | head -c40)|" \ /opt/mmdl/.env - cd /opt/mmdl export NEXT_TELEMETRY_DISABLE=1 export CI="true" $STD npm install $STD npm run migrate $STD npm run build -echo "${RELEASE}" >/opt/mmdl_version.txt -msg_ok "Installed ${APPLICATION}" +msg_ok "Configured ${APPLICATION}" msg_info "Creating Service" cat </etc/systemd/system/mmdl.service @@ -78,7 +73,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -f ~/v${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/mediamtx-install.sh b/install/mediamtx-install.sh index 51434201d..703c274b3 100644 --- a/install/mediamtx-install.sh +++ b/install/mediamtx-install.sh @@ -17,14 +17,7 @@ msg_info "Installing Dependencies" $STD apt-get install -y ffmpeg msg_ok "Installed Dependencies" -msg_info "Installing MediaMTX" -RELEASE=$(curl -fsSL https://api.github.com/repos/bluenviron/mediamtx/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -mkdir -p /opt/mediamtx -cd /opt/mediamtx -curl -fsSL "https://github.com/bluenviron/mediamtx/releases/download/${RELEASE}/mediamtx_${RELEASE}_linux_arm64v8.tar.gz" -o "mediamtx_${RELEASE}_linux_arm64v8.tar.gz" -tar xzf mediamtx_${RELEASE}_linux_arm64v8.tar.gz -rm -rf mediamtx_${RELEASE}_linux_arm64v8.tar.gz -msg_ok "Installed MediaMTX" +fetch_and_deploy_gh_release "mediamtx" "bluenviron/mediamtx" "prebuild" "latest" "/opt/mediamtx" "mediamtx*linux_arm64v8.tar.gz" msg_info "Creating Service" cat </etc/systemd/system/mediamtx.service diff --git a/install/meilisearch-install.sh b/install/meilisearch-install.sh index 84867c741..2c3a5e015 100644 --- a/install/meilisearch-install.sh +++ b/install/meilisearch-install.sh @@ -13,11 +13,10 @@ setting_up_container network_check update_os -msg_info "Setup ${APPLICATION}" -tmp_file=$(mktemp) -RELEASE=$(curl -s https://api.github.com/repos/meilisearch/meilisearch/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -curl -fsSL https://github.com/meilisearch/meilisearch/releases/latest/download/meilisearch.deb -o $tmp_file -$STD dpkg -i $tmp_file +fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" + +msg_info "Configuring ${APPLICATION}" +cd /opt/meilisearch curl -fsSL https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml -o /etc/meilisearch.toml MASTER_KEY=$(openssl rand -base64 12) LOCAL_IP="$(hostname -I | awk '{print $1}')" @@ -30,21 +29,14 @@ sed -i \ -e 's|^# no_analytics = true|no_analytics = true|' \ -e 's|^http_addr =.*|http_addr = "0.0.0.0:7700"|' \ /etc/meilisearch.toml -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -msg_ok "Setup ${APPLICATION}" +msg_ok "Configured ${APPLICATION}" read -r -p "${TAB3}Do you want add meilisearch-ui? [y/n]: " prompt if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs + fetch_and_deploy_gh_release "meilisearch-ui" "riccox/meilisearch-ui" "tarball" - msg_info "Setup ${APPLICATION}-ui" - tmp_file=$(mktemp) - tmp_dir=$(mktemp -d) - mkdir -p /opt/meilisearch-ui - RELEASE_UI=$(curl -s https://api.github.com/repos/riccox/meilisearch-ui/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') - curl -fsSL "https://github.com/riccox/meilisearch-ui/archive/refs/tags/${RELEASE_UI}.zip" -o "$tmp_file" - $STD unzip "$tmp_file" -d "$tmp_dir" - mv "$tmp_dir"/*/* /opt/meilisearch-ui/ + msg_info "Configuring ${APPLICATION}-ui" cd /opt/meilisearch-ui sed -i 's|const hash = execSync("git rev-parse HEAD").toString().trim();|const hash = "unknown";|' /opt/meilisearch-ui/vite.config.ts $STD pnpm install @@ -53,11 +45,10 @@ VITE_SINGLETON_MODE=true VITE_SINGLETON_HOST=http://${LOCAL_IP}:7700 VITE_SINGLETON_API_KEY=${MASTER_KEY} EOF - echo "${RELEASE_UI}" >/opt/${APPLICATION}-ui_version.txt - msg_ok "Setup ${APPLICATION}-ui" + msg_ok "Configured ${APPLICATION}-ui" fi -msg_info "Setting up Services" +msg_info "Creating service" cat </etc/systemd/system/meilisearch.service [Unit] Description=Meilisearch @@ -94,8 +85,7 @@ WantedBy=multi-user.target EOF systemctl enable -q --now meilisearch-ui fi - -msg_ok "Set up Services" +msg_ok "Service created" motd_ssh customize diff --git a/install/memos-install.sh b/install/memos-install.sh index 94b5783b2..15654a3d2 100644 --- a/install/memos-install.sh +++ b/install/memos-install.sh @@ -14,29 +14,8 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - build-essential \ - git \ - tzdata -msg_ok "Installed Dependencies" - -NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs -setup_go - -msg_info "Installing Memos (Patience)" +fetch_and_deploy_gh_release "memos" "usememos/memos" "prebuild" "latest" "/opt/memos" "memos*linux_amd64.tar.gz" mkdir -p /opt/memos_data -export NODE_OPTIONS="--max-old-space-size=2048" -$STD git clone https://github.com/usememos/memos.git /opt/memos -cd /opt/memos/web -$STD pnpm i --frozen-lockfile -$STD pnpm build -cd /opt/memos -mkdir -p /opt/memos/server/dist -cp -r web/dist/* /opt/memos/server/dist/ -cp -r web/dist/* /opt/memos/server/router/frontend/dist/ -$STD go build -o /opt/memos/memos -tags=embed bin/memos/main.go -msg_ok "Installed Memos" msg_info "Creating Service" cat </etc/systemd/system/memos.service diff --git a/install/monica-install.sh b/install/monica-install.sh index 162ac399b..8e39cc564 100644 --- a/install/monica-install.sh +++ b/install/monica-install.sh @@ -13,14 +13,8 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - apache2 \ - libapache2-mod-php \ - php-{bcmath,curl,dom,gd,gmp,iconv,intl,json,mbstring,mysqli,opcache,pdo-mysql,redis,tokenizer,xml,zip} \ - composer -msg_ok "Installed Dependencies" - +PHP_VERSION="8.2" PHP_APACHE="YES" PHP_MODULE="dom,gmp,iconv,mysqli,pdo-mysql,redis,tokenizer" setup_php +setup_composer setup_mariadb NODE_VERSION="20" NODE_MODULE="yarn@latest" setup_nodejs @@ -39,12 +33,9 @@ $STD mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUS } >>~/monica.creds msg_ok "Set up MariaDB" -msg_info "Installing monica" -RELEASE=$(curl -fsSL https://api.github.com/repos/monicahq/monica/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -cd /opt -curl -fsSL "https://github.com/monicahq/monica/releases/download/v${RELEASE}/monica-v${RELEASE}.tar.bz2" -o "monica-v${RELEASE}.tar.bz2" -tar -xjf "monica-v${RELEASE}.tar.bz2" -mv "/opt/monica-v${RELEASE}" /opt/monica +fetch_and_deploy_gh_release "monica" "monicahq/monica" "prebuild" "latest" "/opt/monica" "monica-v*.tar.bz2" + +msg_info "Configuring monica" cd /opt/monica cp /opt/monica/.env.example /opt/monica/.env HASH_SALT=$(openssl rand -base64 32) @@ -59,8 +50,7 @@ $STD php artisan key:generate $STD php artisan setup:production --email=admin@helper-scripts.com --password=helper-scripts.com --force chown -R www-data:www-data /opt/monica chmod -R 775 /opt/monica/storage -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -msg_ok "Installed monica" +msg_ok "Configured monica" msg_info "Creating Service" cat </etc/apache2/sites-available/monica.conf @@ -87,7 +77,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf "/opt/monica-v${RELEASE}.tar.bz2" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/myspeed-install.sh b/install/myspeed-install.sh index 98b474e84..b25b9220d 100644 --- a/install/myspeed-install.sh +++ b/install/myspeed-install.sh @@ -20,15 +20,11 @@ $STD apt-get install -y \ msg_ok "Installed Dependencies" NODE_VERSION="22" setup_nodejs +fetch_and_deploy_gh_release "myspeed" "gnmyt/myspeed" "prebuild" "latest" "/opt/myspeed" "MySpeed-*.zip" -msg_info "Installing MySpeed" -RELEASE=$(curl -fsSL https://github.com/gnmyt/myspeed/releases/latest | grep "title>Release" | cut -d " " -f 5) -cd /opt -curl -fsSL "https://github.com/gnmyt/myspeed/releases/download/v$RELEASE/MySpeed-$RELEASE.zip" -o "MySpeed-$RELEASE.zip" -$STD unzip MySpeed-$RELEASE.zip -d myspeed -cd myspeed +msg_info "Configuring MySpeed" +cd /opt/myspeed $STD npm install -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Installed MySpeed" msg_info "Creating Service" @@ -56,6 +52,5 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove -rm -rf /opt/MySpeed-$RELEASE.zip $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/n8n-install.sh b/install/n8n-install.sh index ce559e3b7..a2ecd294b 100644 --- a/install/n8n-install.sh +++ b/install/n8n-install.sh @@ -15,7 +15,8 @@ update_os msg_info "Installing Dependencies" $STD apt-get install -y \ - ca-certificates + ca-certificates \ + build-essential msg_ok "Installed Dependencies" NODE_VERSION="22" setup_nodejs @@ -26,18 +27,28 @@ $STD npm install --global n8n msg_ok "Installed n8n" msg_info "Creating Service" +HOST_IP=$(hostname -I | awk '{print $1}') +mkdir -p /opt +cat </opt/n8n.env +N8N_SECURE_COOKIE=false +N8N_PORT=5678 +N8N_PROTOCOL=http +N8N_HOST=$HOST_IP +EOF + cat </etc/systemd/system/n8n.service [Unit] Description=n8n [Service] Type=simple -Environment="N8N_SECURE_COOKIE=false" +EnvironmentFile=/opt/n8n.env ExecStart=n8n start + [Install] WantedBy=multi-user.target EOF -$STD systemctl enable --now n8n +systemctl enable -q --now n8n msg_ok "Created Service" motd_ssh diff --git a/install/navidrome-install.sh b/install/navidrome-install.sh index 6bb587a61..a3464c916 100644 --- a/install/navidrome-install.sh +++ b/install/navidrome-install.sh @@ -14,18 +14,14 @@ network_check update_os msg_info "Installing Dependencies (Patience)" -$STD apt-get install -y \ - ffmpeg +$STD apt-get install -y ffmpeg msg_ok "Installed Dependencies" -msg_info "Installing Navidrome" -RELEASE=$(curl -fsSL https://api.github.com/repos/navidrome/navidrome/releases/latest | grep "tag_name" | awk -F '"' '{print $4}') -TMP_DEB=$(mktemp --suffix=.deb) -curl -fsSL -o "${TMP_DEB}" "https://github.com/navidrome/navidrome/releases/download/${RELEASE}/navidrome_${RELEASE#v}_linux_arm64.deb" -$STD apt-get install -y "${TMP_DEB}" +fetch_and_deploy_gh_release "navidrome" "navidrome/navidrome" "binary" + +msg_info "Starting Navidrome" systemctl enable -q --now navidrome -echo "${RELEASE}" >/opt/Navidrome_version.txt -msg_ok "Installed Navidrome" +msg_ok "Started Navidrome" read -p "${TAB3}Do you want to install filebrowser addon? (y/n) " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then @@ -36,7 +32,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -f "${TMP_DEB}" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/neo4j-install.sh b/install/neo4j-install.sh index 2b63ccff9..c72fcfbcc 100644 --- a/install/neo4j-install.sh +++ b/install/neo4j-install.sh @@ -14,22 +14,12 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - lsb-release -msg_ok "Installed Dependencies" - -msg_info "Setting up Adoptium Repository" -mkdir -p /etc/apt/keyrings -curl -fsSL "https://packages.adoptium.net/artifactory/api/gpg/key/public" | gpg --dearmor >/etc/apt/trusted.gpg.d/adoptium.gpg -echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" >/etc/apt/sources.list.d/adoptium.list -msg_ok "Set up Adoptium Repository" +JAVA_VERSION="21" setup_java msg_info "Installing Neo4j (patience)" curl -fsSL "https://debian.neo4j.com/neotechnology.gpg.key" | gpg --dearmor -o /etc/apt/keyrings/neotechnology.gpg echo 'deb [signed-by=/etc/apt/keyrings/neotechnology.gpg] https://debian.neo4j.com stable latest' >/etc/apt/sources.list.d/neo4j.list $STD apt-get update -$STD apt-get install -y temurin-21-jre $STD apt-get install -y neo4j sed -i '/server.default_listen_address/s/^#//' /etc/neo4j/neo4j.conf systemctl enable -q --now neo4j diff --git a/install/nodebb-install.sh b/install/nodebb-install.sh index 4ec9495df..504bac972 100644 --- a/install/nodebb-install.sh +++ b/install/nodebb-install.sh @@ -24,7 +24,7 @@ msg_ok "Installed Dependencies" setup_mongodb NODE_VERSION="22" setup_nodejs -msg_info "Configure MongoDB" +msg_info "Configuring MongoDB" MONGO_ADMIN_USER="admin" MONGO_ADMIN_PWD="$(openssl rand -base64 18 | cut -c1-13)" NODEBB_USER="nodebb" @@ -63,14 +63,11 @@ sed -i 's/bindIp: 127.0.0.1/bindIp: 0.0.0.0/' /etc/mongod.conf sed -i '/security:/d' /etc/mongod.conf bash -c 'echo -e "\nsecurity:\n authorization: enabled" >> /etc/mongod.conf' systemctl restart mongod -msg_ok "MongoDB successfully configurated" +msg_ok "MongoDB configured" -msg_info "Install NodeBB" -cd /opt -RELEASE=$(curl -fsSL https://api.github.com/repos/NodeBB/NodeBB/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/NodeBB/NodeBB/archive/refs/tags/v${RELEASE}.zip" -o "/opt/v${RELEASE}.zip" -$STD unzip v${RELEASE}.zip -mv NodeBB-${RELEASE} /opt/nodebb +fetch_and_deploy_gh_release "nodebb" "NodeBB/NodeBB" "tarball" + +msg_info "Configuring NodeBB" cd /opt/nodebb touch pidfile expect </dev/null 2>&1 @@ -107,8 +104,7 @@ expect "Confirm Password" { } expect eof EOF -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" -msg_ok "Installed NodeBB" +msg_ok "Configured NodeBB" msg_info "Creating Services" cat </etc/systemd/system/nodebb.service @@ -136,7 +132,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -R /opt/v${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/oauth2-proxy-install.sh b/install/oauth2-proxy-install.sh index 7dbb380bd..38c977c96 100644 --- a/install/oauth2-proxy-install.sh +++ b/install/oauth2-proxy-install.sh @@ -13,20 +13,8 @@ setting_up_container network_check update_os -msg_info "Installing Dependencies" -$STD apt-get install -y \ - jq -msg_ok "Installed Dependencies" - -msg_info "Setup OAuth2-Proxy" -RELEASE=$(curl -fsSL https://api.github.com/repos/oauth2-proxy/oauth2-proxy/releases/latest | jq -r .tag_name | sed 's/^v//') -mkdir -p /opt/oauth2-proxy -curl -fsSL "https://github.com/oauth2-proxy/oauth2-proxy/releases/download/v${RELEASE}/oauth2-proxy-v${RELEASE}.linux-amd64.tar.gz" -o /opt/oauth2-proxy.tar.gz -tar -xzf /opt/oauth2-proxy.tar.gz -C /opt -mv /opt/oauth2-proxy-v${RELEASE}.linux-amd64/oauth2-proxy /opt/oauth2-proxy +fetch_and_deploy_gh_release "oauth2-proxy" "oauth2-proxy/oauth2-proxy" "prebuild" "latest" "/opt/oauth2-proxy" "oauth2-proxy*linux-amd64.tar.gz" touch /opt/oauth2-proxy/config.toml -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -msg_ok "Setup OAuth2-Proxy" msg_info "Creating Service" cat </etc/systemd/system/oauth2-proxy.service @@ -51,8 +39,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -f "/opt/oauth2-proxy.tar.gz" -rm -rf "/opt/oauth2-proxy-v${RELEASE}.linux-amd64" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/ombi-install.sh b/install/ombi-install.sh index 22dd9f7eb..1fb2358b5 100644 --- a/install/ombi-install.sh +++ b/install/ombi-install.sh @@ -13,14 +13,7 @@ setting_up_container network_check update_os -msg_info "Installing Ombi" -RELEASE=$(curl -fsSL https://api.github.com/repos/Ombi-app/Ombi/releases/latest | grep '"tag_name":' | cut -d'"' -f4) -curl -fsSL "https://github.com/Ombi-app/Ombi/releases/download/${RELEASE}/linux-arm64.tar.gz" -o "linux-arm64.tar.gz" -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt -mkdir -p /opt/ombi -tar -xzf linux-arm64.tar.gz -C /opt/ombi -rm -rf linux-arm64.tar.gz -msg_ok "Installed Ombi" +fetch_and_deploy_gh_release "ombi" "Ombi-app/Ombi" "prebuild" "latest" "/opt/ombi" "linux-arm64.tar.gz" msg_info "Creating Service" cat </etc/systemd/system/ombi.service diff --git a/install/opengist-install.sh b/install/opengist-install.sh index 97b029089..19092bc58 100644 --- a/install/opengist-install.sh +++ b/install/opengist-install.sh @@ -17,20 +17,11 @@ msg_info "Installing Dependencies" $STD apt-get install -y git msg_ok "Installed Dependencies" -msg_info "Install Opengist" -RELEASE=$(curl -fsSL https://api.github.com/repos/thomiceli/opengist/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" -curl -fsSL "https://github.com/thomiceli/opengist/releases/download/v${RELEASE}/opengist${RELEASE}-linux-arm64.tar.gz" -o "opengist${RELEASE}-linux-arm64.tar.gz" -$STD tar -xzf opengist${RELEASE}-linux-arm64.tar.gz -mv opengist /opt/opengist -chmod +x /opt/opengist/opengist +fetch_and_deploy_gh_release "opengist" "thomiceli/opengist" "prebuild" "latest" "/opt/opengist" "opengist*linux-arm64.tar.gz" mkdir -p /opt/opengist-data -msg_ok "Installed Opengist" - -msg_info "Creating Service" - sed -i 's|opengist-home:.*|opengist-home: /opt/opengist-data|' /opt/opengist/config.yml +msg_info "Creating Service" cat </etc/systemd/system/opengist.service [Unit] Description=Opengist server to manage your Gists @@ -52,7 +43,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf /opengist${RELEASE}-linux-arm64.tar.gz $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/openobserve-install.sh b/install/openobserve-install.sh index 9d7dcfdde..9f8bab143 100644 --- a/install/openobserve-install.sh +++ b/install/openobserve-install.sh @@ -16,7 +16,7 @@ update_os msg_info "Installing OpenObserve" mkdir -p /opt/openobserve/data LATEST=$(curl -fsSL https://api.github.com/repos/openobserve/openobserve/releases/latest | grep '"tag_name":' | cut -d'"' -f4) -$STD tar zxvf <(curl -fsSL https://github.com/openobserve/openobserve/releases/download/$LATEST/openobserve-${LATEST}-linux-arm64.tar.gz) -C /opt/openobserve +$STD tar zxvf <(curl -fsSL https://downloads.openobserve.ai/releases/openobserve/$LATEST/openobserve-$LATEST-linux-arm64.tar.gz) -C /opt/openobserve cat </opt/openobserve/data/.env ZO_ROOT_USER_EMAIL = "admin@example.com" diff --git a/install/outline-install.sh b/install/outline-install.sh index 5fd5f3bfe..b773e92b0 100644 --- a/install/outline-install.sh +++ b/install/outline-install.sh @@ -40,14 +40,11 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';" } >>~/outline.creds msg_ok "Set up PostgreSQL Database" -msg_info "Setup Outline (Patience)" +fetch_and_deploy_gh_release "outline" "outline/outline" "tarball" + +msg_info "Configuring Outline (Patience)" SECRET_KEY="$(openssl rand -hex 32)" -temp_file=$(mktemp) LOCAL_IP="$(hostname -I | awk '{print $1}')" -RELEASE=$(curl -fsSL https://api.github.com/repos/outline/outline/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/outline/outline/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file" -tar zxf $temp_file -mv outline-${RELEASE} /opt/outline cd /opt/outline cp .env.sample .env export NODE_ENV=development @@ -62,8 +59,7 @@ export NODE_OPTIONS="--max-old-space-size=3584" $STD yarn build sed -i 's/NODE_ENV=development/NODE_ENV=production/g' /opt/outline/.env export NODE_ENV=production -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" -msg_ok "Setup Outline" +msg_ok "Configured Outline" msg_info "Creating Service" cat </etc/systemd/system/outline.service @@ -89,7 +85,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf $temp_file $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/overseerr-install.sh b/install/overseerr-install.sh index 9b891128f..8cd244d5f 100644 --- a/install/overseerr-install.sh +++ b/install/overseerr-install.sh @@ -14,19 +14,17 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y \ - git \ - ca-certificates +$STD apt-get install -y ca-certificates msg_ok "Installed Dependencies" NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs +fetch_and_deploy_gh_release "overseerr" "sct/overseerr" "tarball" -msg_info "Installing Overseerr (Patience)" -git clone -q https://github.com/sct/overseerr.git /opt/overseerr +msg_info "Configuring Overseerr (Patience)" cd /opt/overseerr $STD yarn install $STD yarn build -msg_ok "Installed Overseerr" +msg_ok "Configured Overseerr" msg_info "Creating Service" cat </etc/systemd/system/overseerr.service diff --git a/install/owncast-install.sh b/install/owncast-install.sh index 37e1109b8..a889da259 100644 --- a/install/owncast-install.sh +++ b/install/owncast-install.sh @@ -19,13 +19,7 @@ $STD apt-get install -y wget $STD apt-get install -y openssh-server msg_ok "Installed Dependencies" -msg_info "Installing Owncast" -mkdir /opt/owncast -cd /opt/owncast -curl -fsSL "$(curl -fsSL https://api.github.com/repos/owncast/owncast/releases/latest | grep download | grep linux-arm64 | cut -d\" -f4)" -o $(basename "$(curl -fsSL https://api.github.com/repos/owncast/owncast/releases/latest | grep download | grep linux-arm64 | cut -d\" -f4)") -$STD unzip owncast*.zip -rm owncast*.zip -msg_ok "Installed Owncast" +fetch_and_deploy_gh_release "owncast" "owncast/owncast" "prebuild" "latest" "/opt/owncast" "owncast*linux-arm64.zip" msg_info "Creating Service" cat </etc/systemd/system/owncast.service diff --git a/install/photoprism-install.sh b/install/photoprism-install.sh index b261e5c47..957596bf3 100644 --- a/install/photoprism-install.sh +++ b/install/photoprism-install.sh @@ -15,48 +15,90 @@ update_os msg_info "Installing Dependencies (Patience)" $STD apt-get install -y \ - exiftool \ - ffmpeg \ - libheif1 \ - libpng-dev \ - libjpeg-dev \ - libtiff-dev \ - imagemagick \ - darktable \ - rawtherapee \ - libvips42 \ - lsb-release + exiftool \ + ffmpeg \ + libheif1 \ + libpng-dev \ + libjpeg-dev \ + libtiff-dev \ + imagemagick \ + darktable \ + rawtherapee \ + libvips42 \ + lsb-release echo 'export PATH=/usr/local:$PATH' >>~/.bashrc export PATH=/usr/local:$PATH msg_ok "Installed Dependencies" +fetch_and_deploy_gh_release "photoprism" "photoprism/photoprism" "prebuild" "latest" "/opt/photoprism" "*linux-arm64.tar.gz" + msg_info "Installing PhotoPrism (Patience)" mkdir -p /opt/photoprism/{cache,config,photos,storage,temp} mkdir -p /opt/photoprism/photos/{originals,import} mkdir -p /opt/photoprism_backups -curl -fsSL https://dl.photoprism.app/pkg/linux/arm64.tar.gz | tar -xz -C /opt/photoprism --strip-components=1 LIBHEIF_URL=$(curl -fsSL "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-$(lsb_release -cs)-arm64-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1) -curl -fsSL "https://dl.photoprism.app/dist/libheif/$LIBHEIF_URL" | tar -xzf - -C /usr/local --strip-components=1 +curl -fsSL "https://dl.photoprism.app/dist/libheif/$LIBHEIF_URL" -o /tmp/libheif.tar.gz +tar -xzf /tmp/libheif.tar.gz -C /usr/local ldconfig +echo "${LIBHEIF_URL}" >~/.photoprism_libheif chmod -R 755 /opt/photoprism/photos/originals cat </opt/photoprism/config/.env +# Authentication +PHOTOPRISM_ADMIN_USER='admin' +PHOTOPRISM_ADMIN_PASSWORD='changeme' PHOTOPRISM_AUTH_MODE='password' -PHOTOPRISM_ADMIN_PASSWORD='helper-scripts.com' +PHOTOPRISM_PUBLIC='false' + +# Network / HTTP PHOTOPRISM_HTTP_HOST='0.0.0.0' PHOTOPRISM_HTTP_PORT='2342' -PHOTOPRISM_SITE_CAPTION='https://tteck.github.io/Proxmox/' +PHOTOPRISM_SITE_URL='http://localhost:2342/' +PHOTOPRISM_DISABLE_TLS='true' +PHOTOPRISM_DEFAULT_TLS='false' +PHOTOPRISM_HTTP_COMPRESSION='gzip' + +# Features & AI +PHOTOPRISM_DISABLE_TENSORFLOW='false' +PHOTOPRISM_DISABLE_FACES='false' +PHOTOPRISM_DISABLE_CLASSIFICATION='false' +PHOTOPRISM_DISABLE_VECTORS='false' +PHOTOPRISM_DETECT_NSFW='false' +PHOTOPRISM_UPLOAD_NSFW='true' + +# Paths & Storage PHOTOPRISM_STORAGE_PATH='/opt/photoprism/storage' PHOTOPRISM_ORIGINALS_PATH='/opt/photoprism/photos/originals' PHOTOPRISM_IMPORT_PATH='/opt/photoprism/photos/import' PHOTOPRISM_BACKUP_PATH='/opt/photoprism_backups' + +# Database PHOTOPRISM_DATABASE_DRIVER='sqlite' -PHOTOPRISM_DISABLE_WEBDAV='false' -PHOTOPRISM_DISABLE_FACES='false' + +# Behavior & Options PHOTOPRISM_AUTO_INDEX='300' PHOTOPRISM_AUTO_IMPORT='-1' -PHOTOPRISM_PUBLIC='false' +PHOTOPRISM_DISABLE_WEBDAV='false' +PHOTOPRISM_READONLY='false' +PHOTOPRISM_DISABLE_SETTINGS='false' +PHOTOPRISM_DISABLE_CHOWN='false' +PHOTOPRISM_EXPERIMENTAL='false' +PHOTOPRISM_INIT='https tensorflow' + +# Image Processing +PHOTOPRISM_ORIGINALS_LIMIT='5000' +PHOTOPRISM_JPEG_QUALITY='85' +PHOTOPRISM_RAW_PRESETS='false' +PHOTOPRISM_DISABLE_RAW='false' + +# Debug & Logging PHOTOPRISM_DEBUG='false' +PHOTOPRISM_LOG_LEVEL='info' + +# Site Info +PHOTOPRISM_SITE_CAPTION='https://Helper-Scripts.com' +PHOTOPRISM_SITE_DESCRIPTION='' +PHOTOPRISM_SITE_AUTHOR='' EOF ln -sf /opt/photoprism/bin/photoprism /usr/local/bin/photoprism diff --git a/install/pialert-install.sh b/install/pialert-install.sh index 1e97cd5b3..4d23b3646 100644 --- a/install/pialert-install.sh +++ b/install/pialert-install.sh @@ -30,6 +30,7 @@ $STD apt-get -y install \ wakeonlan \ fping \ zip \ + libtext-csv-perl \ cron msg_ok "Installed Dependencies" @@ -51,7 +52,8 @@ $STD apt-get -y install \ python3-requests \ python3-tz \ python3-tzlocal \ - python3-aiohttp + python3-aiohttp \ + python3-cryptography rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED $STD pip3 install mac-vendor-lookup $STD pip3 install fritzconnection @@ -59,6 +61,7 @@ $STD pip3 install cryptography $STD pip3 install pyunifi $STD pip3 install openwrt-luci-rpc $STD pip3 install asusrouter +$STD pip3 install paho-mqtt msg_ok "Installed Python Dependencies" msg_info "Installing Pi.Alert" diff --git a/install/suwayomiserver-install.sh b/install/suwayomiserver-install.sh index 5c6114a99..ae53b135f 100644 --- a/install/suwayomiserver-install.sh +++ b/install/suwayomiserver-install.sh @@ -18,14 +18,7 @@ $STD apt-get install -y libc++-dev msg_ok "Installed Dependencies" JAVA_VERSION=21 setup_java - -msg_info "Settting up Suwayomi-Server" -temp_file=$(mktemp) -RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') -curl -fsSL "https://github.com/Suwayomi/Suwayomi-Server/releases/download/${RELEASE}/Suwayomi-Server-${RELEASE}-debian-all.deb" -o "$temp_file" -$STD dpkg -i "$temp_file" -echo "${RELEASE}" >/opt/suwayomi-server_version.txt -msg_ok "Done setting up Suwayomi-Server" +fetch_and_deploy_gh_release "suwayomi-server" "Suwayomi/Suwayomi-Server" "binary" msg_info "Creating Service" cat </etc/systemd/system/suwayomi-server.service @@ -47,7 +40,6 @@ 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/victoriametrics-install.sh b/install/victoriametrics-install.sh index ab2fc8da5..bc3312797 100644 --- a/install/victoriametrics-install.sh +++ b/install/victoriametrics-install.sh @@ -15,8 +15,13 @@ update_os fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-arm64-v+([0-9.]).tar.gz" fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-arm64-v+([0-9.]).tar.gz" -fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-arm64*.tar.gz" -fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-arm64*.tar.gz" + +read -r -p "${TAB3}Would you like to add VictoriaLogs? " prompt + +if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then + fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-arm64*.tar.gz" + fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-arm64*.tar.gz" +fi msg_info "Setup VictoriaMetrics" mkdir -p /opt/victoriametrics/data @@ -38,8 +43,10 @@ ExecStart=/opt/victoriametrics/victoria-metrics-prod --storageDataPath="/opt/vic [Install] WantedBy=multi-user.target EOF +systemctl enable -q --now victoriametrics -cat </etc/systemd/system/victoriametrics-logs.service +if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then + cat </etc/systemd/system/victoriametrics-logs.service [Unit] Description=VictoriaMetrics Service @@ -53,15 +60,14 @@ ExecStart=/opt/victoriametrics/victoria-logs-prod [Install] WantedBy=multi-user.target EOF -systemctl enable -q --now victoriametrics -systemctl enable -q --now victoriametrics-logs + systemctl enable -q --now victoriametrics-logs +fi msg_ok "Created Service" motd_ssh customize msg_info "Cleaning up" -rm -rf $temp_dir $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/misc/alpine-install.func b/misc/alpine-install.func index 57a8eb019..1bcb42919 100644 --- a/misc/alpine-install.func +++ b/misc/alpine-install.func @@ -152,4 +152,11 @@ EOF echo "bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)\"" >/usr/bin/update chmod +x /usr/bin/update + + if [[ -n "${SSH_AUTHORIZED_KEY}" ]]; then + mkdir -p /root/.ssh + echo "${SSH_AUTHORIZED_KEY}" >/root/.ssh/authorized_keys + chmod 700 /root/.ssh + chmod 600 /root/.ssh/authorized_keys + fi } diff --git a/misc/build.func b/misc/build.func index 96e6c3e3f..0e388d813 100644 --- a/misc/build.func +++ b/misc/build.func @@ -248,6 +248,18 @@ write_config() { # This function writes the configuration to a file. if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "Write configfile" --yesno "Do you want to write the selections to a config file?" 10 60; then FILEPATH="/opt/community-scripts/${NSAPP}.conf" + [[ "$GATE" =~ ",gw=" ]] && local GATE="${GATE##,gw=}" + + # Strip prefixes from parameters for config file storage + local SD_VALUE="${SD}" + local NS_VALUE="${NS}" + local MAC_VALUE="${MAC}" + local VLAN_VALUE="${VLAN}" + [[ "$SD" =~ ^-searchdomain= ]] && SD_VALUE="${SD#-searchdomain=}" + [[ "$NS" =~ ^-nameserver= ]] && NS_VALUE="${NS#-nameserver=}" + [[ "$MAC" =~ ^,hwaddr= ]] && MAC_VALUE="${MAC#,hwaddr=}" + [[ "$VLAN" =~ ^,tag= ]] && VLAN_VALUE="${VLAN#,tag=}" + if [[ ! -f $FILEPATH ]]; then cat <"$FILEPATH" # ${NSAPP} Configuration File @@ -270,10 +282,10 @@ IPV6_METHOD="${IPV6_METHOD:-none}" GATE="${GATE:-none}" APT_CACHER_IP="${APT_CACHER_IP:-none}" MTU="${MTU:-1500}" -SD="${SD:-none}" -NS="${NS:-none}" -MAC="${MAC:-none}" -VLAN="${VLAN:-none}" +SD="${SD_VALUE:-none}" +NS="${NS_VALUE:-none}" +MAC="${MAC_VALUE:-none}" +VLAN="${VLAN_VALUE:-none}" SSH="${SSH}" SSH_AUTHORIZED_KEY="${SSH_AUTHORIZED_KEY}" TAGS="${TAGS:-none}" @@ -308,10 +320,10 @@ IPV6_METHOD="${IPV6_METHOD:-none}" GATE="${GATE:-none}" APT_CACHER_IP="${APT_CACHER_IP:-none}" MTU="${MTU:-1500}" -SD="${SD:-none}" -NS="${NS:-none}" -MAC="${MAC:-none}" -VLAN="${VLAN:-none}" +SD="${SD_VALUE:-none}" +NS="${NS_VALUE:-none}" +MAC="${MAC_VALUE:-none}" +VLAN="${VLAN_VALUE:-none}" SSH="${SSH}" SSH_AUTHORIZED_KEY="${SSH_AUTHORIZED_KEY}" TAGS="${TAGS:-none}" @@ -805,7 +817,36 @@ advanced_settings() { if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then echo -e "${CREATING}${BOLD}${RD}Creating a ${APP} LXC using the above advanced settings${CL}" + + # Strip prefixes from DNS parameters for config file storage + local SD_VALUE="$SD" + local NS_VALUE="$NS" + local MAC_VALUE="$MAC" + local VLAN_VALUE="$VLAN" + [[ "$SD" =~ ^-searchdomain= ]] && SD_VALUE="${SD#-searchdomain=}" + [[ "$NS" =~ ^-nameserver= ]] && NS_VALUE="${NS#-nameserver=}" + [[ "$MAC" =~ ^,hwaddr= ]] && MAC_VALUE="${MAC#,hwaddr=}" + [[ "$VLAN" =~ ^,tag= ]] && VLAN_VALUE="${VLAN#,tag=}" + + # Temporarily store original values + local SD_ORIG="$SD" + local NS_ORIG="$NS" + local MAC_ORIG="$MAC" + local VLAN_ORIG="$VLAN" + + # Set clean values for config file writing + SD="$SD_VALUE" + NS="$NS_VALUE" + MAC="$MAC_VALUE" + VLAN="$VLAN_VALUE" + write_config + + # Restore original formatted values for container creation + SD="$SD_ORIG" + NS="$NS_ORIG" + MAC="$MAC_ORIG" + VLAN="$VLAN_ORIG" else clear header_info @@ -1251,6 +1292,10 @@ EOF msg_ok "Network in LXC is reachable" break fi + if pct exec "$CTID" -- curl -fsSIL --max-time 10 deb.debian.org >/dev/null 2>&1; then + msg_ok "Network in LXC is reachable" + break + fi if [ "$i" -lt 10 ]; then msg_warn "No network yet in LXC (try $i/10) – waiting..." sleep 3 diff --git a/misc/config-file.func b/misc/config-file.func index 842c1246c..9799b4a4b 100644 --- a/misc/config-file.func +++ b/misc/config-file.func @@ -272,7 +272,8 @@ config_file() { GATE="" elif [[ "$NET" =~ $ip_cidr_regex ]]; then echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}$NET${CL}" - if [ ! -z "$GATE" ]; then + if [[ -n "$GATE" ]]; then + [[ "$GATE" =~ ",gw=" ]] && GATE="${GATE##,gw=}" if [[ "$GATE" =~ $ip_regex ]]; then echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}$GATE${CL}" GATE=",gw=$GATE" @@ -468,8 +469,11 @@ config_file() { SD="" echo -e "${SEARCH}${BOLD}${DGN}DNS Search Domain: ${BGN}Host${CL}" else - echo -e "${SEARCH}${BOLD}${DGN}DNS Search Domain: ${BGN}$SD${CL}" - SD="-searchdomain=$SD" + # Strip prefix if present for config file storage + local SD_VALUE="$SD" + [[ "$SD" =~ ^-searchdomain= ]] && SD_VALUE="${SD#-searchdomain=}" + echo -e "${SEARCH}${BOLD}${DGN}DNS Search Domain: ${BGN}$SD_VALUE${CL}" + SD="-searchdomain=$SD_VALUE" fi else if SD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then @@ -491,11 +495,14 @@ config_file() { NS="" echo -e "${NETWORK}${BOLD}${DGN}DNS Server IP Address: ${BGN}Host${CL}" else - if [[ "$NS" =~ $ip_regex ]]; then - echo -e "${NETWORK}${BOLD}${DGN}DNS Server IP Address: ${BGN}$NS${CL}" - NS="-nameserver=$NS" + # Strip prefix if present for config file storage + local NS_VALUE="$NS" + [[ "$NS" =~ ^-nameserver= ]] && NS_VALUE="${NS#-nameserver=}" + if [[ "$NS_VALUE" =~ $ip_regex ]]; then + echo -e "${NETWORK}${BOLD}${DGN}DNS Server IP Address: ${BGN}$NS_VALUE${CL}" + NS="-nameserver=$NS_VALUE" else - msg_error "Invalid IP Address format for DNS Server. Needs to be 0.0.0.0, was ${NS}" + msg_error "Invalid IP Address format for DNS Server. Needs to be 0.0.0.0, was ${NS_VALUE}" exit fi fi @@ -518,11 +525,14 @@ config_file() { MAC="" echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}Host${CL}" else - if [[ "$MAC" =~ ^([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}$ ]]; then - echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" - MAC=",hwaddr=$MAC" + # Strip prefix if present for config file storage + local MAC_VALUE="$MAC" + [[ "$MAC" =~ ^,hwaddr= ]] && MAC_VALUE="${MAC#,hwaddr=}" + if [[ "$MAC_VALUE" =~ ^([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}$ ]]; then + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC_VALUE${CL}" + MAC=",hwaddr=$MAC_VALUE" else - msg_error "MAC Address must be in the format xx:xx:xx:xx:xx:xx, was ${MAC}" + msg_error "MAC Address must be in the format xx:xx:xx:xx:xx:xx, was ${MAC_VALUE}" exit fi fi @@ -545,11 +555,14 @@ config_file() { VLAN="" echo -e "${VLANTAG}${BOLD}${DGN}Vlan: ${BGN}Host${CL}" else - if [[ "$VLAN" =~ ^-?[0-9]+$ ]]; then - echo -e "${VLANTAG}${BOLD}${DGN}Vlan: ${BGN}$VLAN${CL}" - VLAN=",tag=$VLAN" + # Strip prefix if present for config file storage + local VLAN_VALUE="$VLAN" + [[ "$VLAN" =~ ^,tag= ]] && VLAN_VALUE="${VLAN#,tag=}" + if [[ "$VLAN_VALUE" =~ ^-?[0-9]+$ ]]; then + echo -e "${VLANTAG}${BOLD}${DGN}Vlan: ${BGN}$VLAN_VALUE${CL}" + VLAN=",tag=$VLAN_VALUE" else - msg_error "VLAN must be an integer, was ${VLAN}" + msg_error "VLAN must be an integer, was ${VLAN_VALUE}" exit fi fi diff --git a/misc/create_lxc.sh b/misc/create_lxc.sh index c35e45667..f11c57390 100644 --- a/misc/create_lxc.sh +++ b/misc/create_lxc.sh @@ -31,7 +31,6 @@ function on_exit() { } function error_handler() { - local exit_code="$?" local line_number="$1" local command="$2" @@ -50,6 +49,14 @@ function on_terminate() { exit 143 } +function exit_script() { + clear + printf "\e[?25h" + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + kill 0 + exit 1 +} + function check_storage_support() { local CONTENT="$1" local -a VALID_STORAGES=() @@ -63,21 +70,7 @@ function check_storage_support() { [[ ${#VALID_STORAGES[@]} -gt 0 ]] } -# This checks for the presence of valid Container Storage and Template Storage locations -msg_info "Validating Storage" -if ! check_storage_support "rootdir"; then - - msg_error "No valid storage found for 'rootdir' (Container)." - exit 1 -fi -if ! check_storage_support "vztmpl"; then - - msg_error "No valid storage found for 'vztmpl' (Template)." - exit 1 -fi -msg_ok "Validated Storage (rootdir / vztmpl)." - -# This function is used to select the storage class and determine the corresponding storage content type and label. +# This function selects a storage pool for a given content type (e.g., rootdir, vztmpl). function select_storage() { local CLASS=$1 CONTENT CONTENT_LABEL @@ -112,8 +105,20 @@ function select_storage() { ;; esac -local -a MENU + # Check for preset STORAGE variable + if [ "$CONTENT" = "rootdir" ] && [ -n "${STORAGE:-}" ]; then + if pvesm status -content "$CONTENT" | awk 'NR>1 {print $1}' | grep -qx "$STORAGE"; then + STORAGE_RESULT="$STORAGE" + msg_info "Using preset storage: $STORAGE_RESULT for $CONTENT_LABEL" + return 0 + else + msg_error "Preset storage '$STORAGE' is not valid for content type '$CONTENT'." + return 2 + fi + fi + local -A STORAGE_MAP + local -a MENU local COL_WIDTH=0 while read -r TAG TYPE _ TOTAL USED FREE _; do @@ -134,17 +139,23 @@ local -a MENU if [ $((${#MENU[@]} / 3)) -eq 1 ]; then STORAGE_RESULT="${STORAGE_MAP[${MENU[0]}]}" + STORAGE_INFO="${MENU[1]}" return 0 fi local WIDTH=$((COL_WIDTH + 42)) while true; do - local DISPLAY_SELECTED=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + local DISPLAY_SELECTED + DISPLAY_SELECTED=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ --title "Storage Pools" \ --radiolist "Which storage pool for ${CONTENT_LABEL,,}?\n(Spacebar to select)" \ 16 "$WIDTH" 6 "${MENU[@]}" 3>&1 1>&2 2>&3) - [[ $? -ne 0 ]] && return 3 + # Cancel or ESC + [[ $? -ne 0 ]] && exit_script + + # Strip trailing whitespace or newline (important for storages like "storage (dir)") + DISPLAY_SELECTED=$(sed 's/[[:space:]]*$//' <<<"$DISPLAY_SELECTED") if [[ -z "$DISPLAY_SELECTED" || -z "${STORAGE_MAP[$DISPLAY_SELECTED]+_}" ]]; then whiptail --msgbox "No valid storage selected. Please try again." 8 58 @@ -152,6 +163,12 @@ local -a MENU fi STORAGE_RESULT="${STORAGE_MAP[$DISPLAY_SELECTED]}" + for ((i = 0; i < ${#MENU[@]}; i += 3)); do + if [[ "${MENU[$i]}" == "$DISPLAY_SELECTED" ]]; then + STORAGE_INFO="${MENU[$i + 1]}" + break + fi + done return 0 done } @@ -180,45 +197,22 @@ if qm status "$CTID" &>/dev/null || pct status "$CTID" &>/dev/null; then exit 206 fi -# DEFAULT_FILE="/usr/local/community-scripts/default_storage" -# if [[ -f "$DEFAULT_FILE" ]]; then -# source "$DEFAULT_FILE" -# if [[ -n "$TEMPLATE_STORAGE" && -n "$CONTAINER_STORAGE" ]]; then -# msg_info "Using default storage configuration from: $DEFAULT_FILE" -# msg_ok "Template Storage: ${BL}$TEMPLATE_STORAGE${CL} ${GN}|${CL} Container Storage: ${BL}$CONTAINER_STORAGE${CL}" -# else -# msg_warn "Default storage file exists but is incomplete – falling back to manual selection" -# TEMPLATE_STORAGE=$(select_storage template) -# msg_ok "Using ${BL}$TEMPLATE_STORAGE${CL} ${GN}for Template Storage." -# CONTAINER_STORAGE=$(select_storage container) -# msg_ok "Using ${BL}$CONTAINER_STORAGE${CL} ${GN}for Container Storage." -# fi -# else -# # TEMPLATE STORAGE SELECTION -# # Template Storage -# while true; do -# TEMPLATE_STORAGE=$(select_storage template) -# if [[ -n "$TEMPLATE_STORAGE" ]]; then -# msg_ok "Using ${BL}$TEMPLATE_STORAGE${CL} ${GN}for Template Storage." -# break -# fi -# msg_warn "No valid template storage selected. Please try again." -# done - -# while true; do -# CONTAINER_STORAGE=$(select_storage container) -# if [[ -n "$CONTAINER_STORAGE" ]]; then -# msg_ok "Using ${BL}$CONTAINER_STORAGE${CL} ${GN}for Container Storage." -# break -# fi -# msg_warn "No valid container storage selected. Please try again." -# done - -# fi +# This checks for the presence of valid Container Storage and Template Storage locations +msg_info "Validating Storage" +if ! check_storage_support "rootdir"; then + msg_error "No valid storage found for 'rootdir' (Container)." + exit 1 +fi +if ! check_storage_support "vztmpl"; then + msg_error "No valid storage found for 'vztmpl' (Template)." + exit 1 +fi +msg_ok "Valid Storage Found" while true; do if select_storage template; then TEMPLATE_STORAGE="$STORAGE_RESULT" + TEMPLATE_STORAGE_INFO="$STORAGE_INFO" break fi done @@ -226,9 +220,11 @@ done while true; do if select_storage container; then CONTAINER_STORAGE="$STORAGE_RESULT" + CONTAINER_STORAGE_INFO="$STORAGE_INFO" break fi done +msg_ok "Validated Storage | Container: ${BL}$CONTAINER_STORAGE${CL} ($CONTAINER_STORAGE_INFO)" # Check free space on selected container storage STORAGE_FREE=$(pvesm status | awk -v s="$CONTAINER_STORAGE" '$1 == s { print $6 }') @@ -325,6 +321,8 @@ fi msg_ok "LXC Template is ready to use." +msg_ok "LXC Template '$TEMPLATE' is ready to use." + msg_info "Creating LXC Container" # Check and fix subuid/subgid grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid @@ -336,7 +334,7 @@ PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}}) # Secure creation of the LXC container with lock and template check lockfile="/tmp/template.${TEMPLATE}.lock" -exec 9>"$lockfile" >/dev/null 2>&1 || { +exec 9>"$lockfile" || { msg_error "Failed to create lock file '$lockfile'." exit 200 } @@ -374,7 +372,6 @@ if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[ done sleep 1 # I/O-Sync-Delay - msg_ok "Re-downloaded LXC Template" fi diff --git a/misc/install.func b/misc/install.func index 04e38d977..04ee0803c 100644 --- a/misc/install.func +++ b/misc/install.func @@ -130,8 +130,8 @@ network_check() { update_os() { msg_info "Updating Container OS" if [[ "$CACHER" == "yes" ]]; then - echo "Acquire::http::Proxy-Auto-Detect \"/usr/local/bin/apt-proxy-detect.sh\";" >/etc/apt/apt.conf.d/00aptproxy - cat <<'EOF' >/usr/local/bin/apt-proxy-detect.sh + echo 'Acquire::http::Proxy-Auto-Detect "/usr/local/bin/apt-proxy-detect.sh";' >/etc/apt/apt.conf.d/00aptproxy + cat </usr/local/bin/apt-proxy-detect.sh #!/bin/bash if nc -w1 -z "${CACHER_IP}" 3142; then echo -n "http://${CACHER_IP}:3142" diff --git a/misc/tools.func b/misc/tools.func index 5f7b429e7..f88d5d6d8 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -953,7 +953,7 @@ function fetch_and_deploy_gh_release() { $STD apt-get install -y unzip fi unzip -q "$tmpdir/$filename" -d "$unpack_tmp" - elif [[ "$filename" == *.tar.* ]]; then + elif [[ "$filename" == *.tar.* || "$filename" == *.tgz ]]; then tar -xf "$tmpdir/$filename" -C "$unpack_tmp" else msg_error "Unsupported archive format: $filename" @@ -963,23 +963,41 @@ function fetch_and_deploy_gh_release() { local top_dirs top_dirs=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1 -type d | wc -l) - - if [[ "$top_dirs" -eq 1 ]]; then + local top_entries inner_dir + top_entries=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1) + if [[ "$(echo "$top_entries" | wc -l)" -eq 1 && -d "$top_entries" ]]; then # Strip leading folder - local inner_dir - inner_dir=$(find "$unpack_tmp" -mindepth 1 -maxdepth 1 -type d) + inner_dir="$top_entries" shopt -s dotglob nullglob - cp -r "$inner_dir"/* "$target/" + if compgen -G "$inner_dir/*" >/dev/null; then + cp -r "$inner_dir"/* "$target/" || { + msg_error "Failed to copy contents from $inner_dir to $target" + rm -rf "$tmpdir" "$unpack_tmp" + return 1 + } + else + msg_error "Inner directory is empty: $inner_dir" + rm -rf "$tmpdir" "$unpack_tmp" + return 1 + fi shopt -u dotglob nullglob else # Copy all contents shopt -s dotglob nullglob - cp -r "$unpack_tmp"/* "$target/" + if compgen -G "$unpack_tmp/*" >/dev/null; then + cp -r "$unpack_tmp"/* "$target/" || { + msg_error "Failed to copy contents to $target" + rm -rf "$tmpdir" "$unpack_tmp" + return 1 + } + else + msg_error "Unpacked archive is empty" + rm -rf "$tmpdir" "$unpack_tmp" + return 1 + fi shopt -u dotglob nullglob fi - rm -rf "$unpack_tmp" - ### Singlefile Mode ### elif [[ "$mode" == "singlefile" ]]; then local pattern="${6%\"}"