diff --git a/CHANGELOG.md b/CHANGELOG.md index aadf3f0dc..b7c519433 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,8 +14,64 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-06-24 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Update all Alpine Scripts to atleast 1GB HDD [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#5418](https://github.com/community-scripts/ProxmoxVE/pull/5418)) + + - #### ✨ New Features + + - [core]: Improve GitHub release fetch robustness with split timeouts and retry logic [@MickLesk](https://github.com/MickLesk) ([#5422](https://github.com/community-scripts/ProxmoxVE/pull/5422)) + - Minio: use latest version or latest feature rich version [@MickLesk](https://github.com/MickLesk) ([#5423](https://github.com/community-scripts/ProxmoxVE/pull/5423)) + + - #### 🔧 Refactor + + - Refactor: MeTube to uv based install [@MickLesk](https://github.com/MickLesk) ([#5411](https://github.com/community-scripts/ProxmoxVE/pull/5411)) + - Refactor: Prometheus PVE Exporter to uv based install [@MickLesk](https://github.com/MickLesk) ([#5412](https://github.com/community-scripts/ProxmoxVE/pull/5412)) + - Refactor: ESPHome to uv based install [@MickLesk](https://github.com/MickLesk) ([#5413](https://github.com/community-scripts/ProxmoxVE/pull/5413)) + +## 2025-06-23 + +### 🆕 New Scripts + + - Alpine-Forgejo by @Johann3s-H [@MickLesk](https://github.com/MickLesk) ([#5396](https://github.com/community-scripts/ProxmoxVE/pull/5396)) + +### 🚀 Updated Scripts + + - [core]: tools.func -> autoupdate npm to newest version on install [@MickLesk](https://github.com/MickLesk) ([#5397](https://github.com/community-scripts/ProxmoxVE/pull/5397)) + + - #### 🐞 Bug Fixes + + - PLANKA: Fix the update procedure [@tremor021](https://github.com/tremor021) ([#5391](https://github.com/community-scripts/ProxmoxVE/pull/5391)) + - changed trilium github repo [@miggi92](https://github.com/miggi92) ([#5390](https://github.com/community-scripts/ProxmoxVE/pull/5390)) + - changedetection: fix: hermetic msedge [@CrazyWolf13](https://github.com/CrazyWolf13) ([#5388](https://github.com/community-scripts/ProxmoxVE/pull/5388)) + +### 🌐 Website + + - #### 📝 Script Information + + - MariaDB: Add information about Adminer on website [@tremor021](https://github.com/tremor021) ([#5400](https://github.com/community-scripts/ProxmoxVE/pull/5400)) + ## 2025-06-22 +### 🚀 Updated Scripts + + - [core]: fix timing issues while template update & timezone setup at create new LXC [@MickLesk](https://github.com/MickLesk) ([#5358](https://github.com/community-scripts/ProxmoxVE/pull/5358)) +- alpine: increase hdd to 1gb [@MickLesk](https://github.com/MickLesk) ([#5377](https://github.com/community-scripts/ProxmoxVE/pull/5377)) + + - #### 🐞 Bug Fixes + + - fix: casing and naming error after #5254 [@GoetzGoerisch](https://github.com/GoetzGoerisch) ([#5380](https://github.com/community-scripts/ProxmoxVE/pull/5380)) + - fix: install_adminer > setup_adminer [@MickLesk](https://github.com/MickLesk) ([#5356](https://github.com/community-scripts/ProxmoxVE/pull/5356)) + - gitea: Update gitea.sh to stop update failures [@tystuyfzand](https://github.com/tystuyfzand) ([#5361](https://github.com/community-scripts/ProxmoxVE/pull/5361)) + + - #### 🔧 Refactor + + - Immich: unpin release; use fetch & deploy function for update [@vhsdream](https://github.com/vhsdream) ([#5355](https://github.com/community-scripts/ProxmoxVE/pull/5355)) + ## 2025-06-21 ## 2025-06-20 diff --git a/ct/alpine-forgejo.sh b/ct/alpine-forgejo.sh new file mode 100644 index 000000000..cced348c8 --- /dev/null +++ b/ct/alpine-forgejo.sh @@ -0,0 +1,45 @@ +#!/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: Johann3s-H (An!ma) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://forgejo.org/ + +APP="Alpine-Forgejo" +var_tags="${var_tags:-alpine;git}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-1}" +var_os="${var_os:-alpine}" +var_version="${var_version:-3.21}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + msg_info "Updating Alpine Packages" + $STD apk -U upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Updating Forgejo" + $STD apk upgrade forgejo + msg_ok "Updated Forgejo" + + msg_info "Restarting Forgejo" + $STD rc-service forgejo restart + msg_ok "Restarted Forgejo" + + exit 0 +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/alpine-it-tools.sh b/ct/alpine-it-tools.sh index 2c551c2d5..e835baeb5 100644 --- a/ct/alpine-it-tools.sh +++ b/ct/alpine-it-tools.sh @@ -9,7 +9,7 @@ APP="Alpine-IT-Tools" var_tags="${var_tags:-alpine;development}" var_cpu="${var_cpu:-1}" var_ram="${var_ram:-256}" -var_disk="${var_disk:-0.5}" +var_disk="${var_disk:-1}" var_os="${var_os:-alpine}" var_version="${var_version:-3.21}" var_unprivileged="${var_unprivileged:-1}" diff --git a/ct/alpine-zigbee2mqtt.sh b/ct/alpine-zigbee2mqtt.sh index 0ddd09ea1..5f2ba042a 100644 --- a/ct/alpine-zigbee2mqtt.sh +++ b/ct/alpine-zigbee2mqtt.sh @@ -7,7 +7,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/mis APP="Alpine-Zigbee2MQTT" var_tags="${var_tags:-alpine;zigbee;mqtt;smarthome}" -var_disk="${var_disk:-0.3}" +var_disk="${var_disk:-1}" var_cpu="${var_cpu:-1}" var_ram="${var_ram:-256}" var_os="${var_os:-alpine}" diff --git a/ct/alpine.sh b/ct/alpine.sh index 8511ef5c0..3968be748 100644 --- a/ct/alpine.sh +++ b/ct/alpine.sh @@ -9,7 +9,7 @@ APP="Alpine" var_tags="${var_tags:-os;alpine}" var_cpu="${var_cpu:-1}" var_ram="${var_ram:-512}" -var_disk="${var_disk:-0.5}" +var_disk="${var_disk:-1}" var_os="${var_os:-alpine}" var_version="${var_version:-3.21}" var_unprivileged="${var_unprivileged:-1}" diff --git a/ct/changedetection.sh b/ct/changedetection.sh index 8d6ade3d0..2ca25c71f 100644 --- a/ct/changedetection.sh +++ b/ct/changedetection.sh @@ -52,7 +52,8 @@ function update_script() { $STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps # Update Chrome separately, as it has to be done with the force option. Otherwise the installation of other browsers will not be done if Chrome is already installed. $STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome - $STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit msedge + $STD /opt/browserless/node_modules/playwright-core/cli.js install --force msedge + $STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit $STD npm run build --prefix /opt/browserless $STD npm run build:function --prefix /opt/browserless $STD npm prune production --prefix /opt/browserless diff --git a/ct/esphome.sh b/ct/esphome.sh index 1e0fc98b8..8383612fa 100644 --- a/ct/esphome.sh +++ b/ct/esphome.sh @@ -25,22 +25,57 @@ function update_script() { check_container_resources if [[ ! -f /etc/systemd/system/esphomeDashboard.service ]]; then msg_error "No ${APP} Installation Found!" - exit + exit 1 fi - msg_info "Stopping ESPHome" + + msg_info "Stopping ${APP}" systemctl stop esphomeDashboard - msg_ok "Stopped ESPHome" + msg_ok "Stopped ${APP}" - msg_info "Updating ESPHome" - if [[ -d /srv/esphome ]]; then - $STD source /srv/esphome/bin/activate + VENV_PATH="/opt/esphome/.venv" + ESPHOME_BIN="${VENV_PATH}/bin/esphome" + export PYTHON_VERSION="3.12" + + if [[ ! -d "$VENV_PATH" || ! -x "$ESPHOME_BIN" ]]; then + PYTHON_VERSION="3.12" setup_uv + msg_info "Migrating to uv/venv" + rm -rf "$VENV_PATH" + mkdir -p /opt/esphome + cd /opt/esphome + $STD uv venv "$VENV_PATH" + $STD "$VENV_PATH/bin/python" -m ensurepip --upgrade + $STD "$VENV_PATH/bin/python" -m pip install --upgrade pip + $STD "$VENV_PATH/bin/python" -m pip install esphome tornado esptool + msg_ok "Migrated to uv/venv" + else + msg_info "Updating ESPHome" + PYTHON_VERSION="3.12" setup_uv + $STD "$VENV_PATH/bin/python" -m pip install --upgrade esphome tornado esptool + msg_ok "Updated ESPHome" fi - $STD pip3 install -U esphome - msg_ok "Updated ESPHome" + SERVICE_FILE="/etc/systemd/system/esphomeDashboard.service" + if ! grep -q "${VENV_PATH}/bin/esphome" "$SERVICE_FILE"; then + msg_info "Updating systemd service" + cat <"$SERVICE_FILE" +[Unit] +Description=ESPHome Dashboard +After=network.target - msg_info "Starting ESPHome" +[Service] +ExecStart=${VENV_PATH}/bin/esphome dashboard /root/config/ +Restart=always +User=root + +[Install] +WantedBy=multi-user.target +EOF + $STD systemctl daemon-reload + msg_ok "Updated systemd service" + fi + + msg_info "Starting ${APP}" systemctl start esphomeDashboard - msg_ok "Started ESPHome" + msg_ok "Started ${APP}" msg_ok "Updated Successfully" exit } diff --git a/ct/gitea.sh b/ct/gitea.sh index b741b4905..671c8fdbb 100644 --- a/ct/gitea.sh +++ b/ct/gitea.sh @@ -29,10 +29,11 @@ function update_script() { fi RELEASE=$(curl -fsSL https://github.com/go-gitea/gitea/releases/latest | grep "title>Release" | cut -d " " -f 4 | sed 's/^v//') msg_info "Updating $APP to ${RELEASE}" - curl -fsSL "https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-amd64" -o $(basename "https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-amd64") + FILENAME="gitea-$RELEASE-linux-amd64" + curl -fsSL "https://github.com/go-gitea/gitea/releases/download/v$RELEASE/gitea-$RELEASE-linux-amd64" -o $FILENAME systemctl stop gitea rm -rf /usr/local/bin/gitea - mv gitea* /usr/local/bin/gitea + mv $FILENAME /usr/local/bin/gitea chmod +x /usr/local/bin/gitea systemctl start gitea msg_ok "Updated $APP Successfully" diff --git a/ct/headers/alpine-forgejo b/ct/headers/alpine-forgejo new file mode 100644 index 000000000..40c8e23f3 --- /dev/null +++ b/ct/headers/alpine-forgejo @@ -0,0 +1,6 @@ + ___ __ _ ______ _ + / | / /___ (_)___ ___ / ____/___ _________ ____ (_)___ + / /| | / / __ \/ / __ \/ _ \______/ /_ / __ \/ ___/ __ `/ _ \ / / __ \ + / ___ |/ / /_/ / / / / / __/_____/ __/ / /_/ / / / /_/ / __/ / / /_/ / +/_/ |_/_/ .___/_/_/ /_/\___/ /_/ \____/_/ \__, /\___/_/ /\____/ + /_/ /____/ /___/ diff --git a/ct/immich.sh b/ct/immich.sh index a3570eb62..f721aa972 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -181,116 +181,114 @@ function update_script() { fi fi 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 [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then - msg_info "Stopping ${APP} services" - systemctl stop immich-web - systemctl stop immich-ml - msg_ok "Stopped ${APP}" - INSTALL_DIR="/opt/${APP}" - UPLOAD_DIR="$(sed -n '/^IMMICH_MEDIA_LOCATION/s/[^=]*=//p' /opt/immich/.env)" - SRC_DIR="${INSTALL_DIR}/source" - APP_DIR="${INSTALL_DIR}/app" - ML_DIR="${APP_DIR}/machine-learning" - GEO_DIR="${INSTALL_DIR}/geodata" - VCHORD_RELEASE="$(curl -fsSL https://api.github.com/repos/tensorchord/vectorchord/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')" - - if [[ ! -f ~/.vchord_version ]] || [[ "$VCHORD_RELEASE" != "$(cat ~/.vchord_version)" ]]; then - msg_info "Updating VectorChord" - if [[ ! -f ~/.vchord_version ]] || [[ ! "$(cat ~/.vchord_version)" > "0.3.0" ]]; then - $STD sudo -u postgres pg_dumpall --clean --if-exists --username=postgres | gzip >/etc/postgresql/immich-db-vchord0.3.0.sql.gz - chown postgres /etc/postgresql/immich-db-vchord0.3.0.sql.gz - $STD sudo -u postgres gunzip --stdout /etc/postgresql/immich-db-vchord0.3.0.sql.gz | - sed -e "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" \ - -e "/vchordrq.prewarm_dim/d" | - sudo -u postgres psql - fi - curl -fsSL "https://github.com/tensorchord/vectorchord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb - $STD apt install -y ./vchord.deb - $STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vchord UPDATE;" - systemctl restart postgresql - if [[ ! -f ~/.vchord_version ]] || [[ ! "$(cat ~/.vchord_version)" > "0.3.0" ]]; then - $STD sudo -u postgres psql -d immich -c "REINDEX DATABASE;" - fi - echo "$VCHORD_RELEASE" >~/.vchord_version - rm ./vchord.deb - msg_ok "Updated VectorChord to v${VCHORD_RELEASE}" - fi - - cp "$ML_DIR"/ml_start.sh "$INSTALL_DIR" - rm -rf "${APP_DIR:?}"/* - rm -rf "$SRC_DIR" - immich_zip=$(mktemp) - curl -fsSL "https://github.com/immich-app/immich/archive/refs/tags/v${RELEASE}.zip" -o "$immich_zip" - msg_info "Updating ${APP} web and microservices" - unzip -q "$immich_zip" - mv "$APP-$RELEASE"/ "$SRC_DIR" - mkdir -p "$ML_DIR" - cd "$SRC_DIR"/server - if [[ "$RELEASE" == "1.135.1" ]]; then - rm ./src/schema/migrations/1750323941566-UnsetPrewarmDimParameter.ts - fi - $STD npm install -g node-gyp node-pre-gyp - $STD npm ci - $STD npm run build - $STD npm prune --omit=dev --omit=optional - cd "$SRC_DIR"/open-api/typescript-sdk - $STD npm ci - $STD npm run build - 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,start*.sh} "$APP_DIR"/ - cp -a web/build "$APP_DIR"/www - cp LICENSE "$APP_DIR" - msg_ok "Updated ${APP} web and microservices" - - cd "$SRC_DIR"/machine-learning - export VIRTUAL_ENV="${ML_DIR}"/ml-venv - $STD /usr/local/bin/uv venv "$VIRTUAL_ENV" - if [[ -f ~/.openvino ]]; then - msg_info "Updating HW-accelerated machine-learning" - /usr/local/bin/uv -q sync --extra openvino --no-cache --active - patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.11/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-311-x86_64-linux-gnu.so" - msg_ok "Updated HW-accelerated machine-learning" - else - msg_info "Updating machine-learning" - /usr/local/bin/uv -q sync --extra cpu --no-cache --active - msg_ok "Updated machine-learning" - fi - cd "$SRC_DIR" - cp -a machine-learning/{ann,immich_ml} "$ML_DIR" - mv "$INSTALL_DIR"/ml_start.sh "$ML_DIR" - if [[ -f ~/.openvino ]]; then - sed -i "/intra_op/s/int = 0/int = os.cpu_count() or 0/" "$ML_DIR"/immich_ml/config.py - 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" - 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 - ln -s "$GEO_DIR" "$APP_DIR" - - msg_info "Updating Immich CLI" - $STD npm install --build-from-source sharp - rm -rf "$APP_DIR"/node_modules/@img/sharp-{libvips*,linuxmusl-x64} - $STD npm i -g @immich/cli - msg_ok "Updated Immich CLI" - - chown -R immich:immich "$INSTALL_DIR" - echo "$RELEASE" >/opt/"${APP}"_version.txt - msg_ok "Updated ${APP} to v${RELEASE}" - - msg_info "Cleaning up" - rm -f "$immich_zip" - $STD apt-get -y autoremove - $STD apt-get -y autoclean - msg_ok "Cleaned" - else - msg_ok "${APP} is already at v${RELEASE}" + if [[ -f ~/.immich && "$RELEASE" == "$(cat ~/.immich)" ]]; then + msg_ok "No update required. ${APP} is already at v${RELEASE}" + exit fi + msg_info "Stopping ${APP} services" + systemctl stop immich-web + systemctl stop immich-ml + msg_ok "Stopped ${APP}" + INSTALL_DIR="/opt/${APP}" + UPLOAD_DIR="$(sed -n '/^IMMICH_MEDIA_LOCATION/s/[^=]*=//p' /opt/immich/.env)" + SRC_DIR="${INSTALL_DIR}/source" + APP_DIR="${INSTALL_DIR}/app" + ML_DIR="${APP_DIR}/machine-learning" + GEO_DIR="${INSTALL_DIR}/geodata" + VCHORD_RELEASE="$(curl -fsSL https://api.github.com/repos/tensorchord/vectorchord/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')" + + if [[ ! -f ~/.vchord_version ]] || [[ "$VCHORD_RELEASE" != "$(cat ~/.vchord_version)" ]]; then + msg_info "Updating VectorChord" + if [[ ! -f ~/.vchord_version ]] || [[ ! "$(cat ~/.vchord_version)" > "0.3.0" ]]; then + $STD sudo -u postgres pg_dumpall --clean --if-exists --username=postgres | gzip >/etc/postgresql/immich-db-vchord0.3.0.sql.gz + chown postgres /etc/postgresql/immich-db-vchord0.3.0.sql.gz + $STD sudo -u postgres gunzip --stdout /etc/postgresql/immich-db-vchord0.3.0.sql.gz | + sed -e "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" \ + -e "/vchordrq.prewarm_dim/d" | + sudo -u postgres psql + fi + curl -fsSL "https://github.com/tensorchord/vectorchord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb + $STD apt install -y ./vchord.deb + $STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vchord UPDATE;" + systemctl restart postgresql + if [[ ! -f ~/.vchord_version ]] || [[ ! "$(cat ~/.vchord_version)" > "0.3.0" ]]; then + $STD sudo -u postgres psql -d immich -c "REINDEX DATABASE;" + fi + echo "$VCHORD_RELEASE" >~/.vchord_version + rm ./vchord.deb + msg_ok "Updated VectorChord to v${VCHORD_RELEASE}" + fi + + cp "$ML_DIR"/ml_start.sh "$INSTALL_DIR" + rm -rf "${APP_DIR:?}"/* + mkdir -p "$ML_DIR" + rm -rf "$SRC_DIR" + + fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "latest" "$SRC_DIR" + + msg_info "Updating ${APP} web and microservices" + cd "$SRC_DIR"/server + if [[ "$RELEASE" == "1.135.1" ]]; then + rm ./src/schema/migrations/1750323941566-UnsetPrewarmDimParameter.ts + fi + $STD npm install -g node-gyp node-pre-gyp + $STD npm ci + $STD npm run build + $STD npm prune --omit=dev --omit=optional + cd "$SRC_DIR"/open-api/typescript-sdk + $STD npm ci + $STD npm run build + 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,start*.sh} "$APP_DIR"/ + cp -a web/build "$APP_DIR"/www + cp LICENSE "$APP_DIR" + msg_ok "Updated ${APP} web and microservices" + + cd "$SRC_DIR"/machine-learning + export VIRTUAL_ENV="${ML_DIR}"/ml-venv + $STD /usr/local/bin/uv venv "$VIRTUAL_ENV" + if [[ -f ~/.openvino ]]; then + msg_info "Updating HW-accelerated machine-learning" + /usr/local/bin/uv -q sync --extra openvino --no-cache --active + patchelf --clear-execstack "${VIRTUAL_ENV}/lib/python3.11/site-packages/onnxruntime/capi/onnxruntime_pybind11_state.cpython-311-x86_64-linux-gnu.so" + msg_ok "Updated HW-accelerated machine-learning" + else + msg_info "Updating machine-learning" + /usr/local/bin/uv -q sync --extra cpu --no-cache --active + msg_ok "Updated machine-learning" + fi + cd "$SRC_DIR" + cp -a machine-learning/{ann,immich_ml} "$ML_DIR" + mv "$INSTALL_DIR"/ml_start.sh "$ML_DIR" + if [[ -f ~/.openvino ]]; then + sed -i "/intra_op/s/int = 0/int = os.cpu_count() or 0/" "$ML_DIR"/immich_ml/config.py + 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" + 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 + ln -s "$GEO_DIR" "$APP_DIR" + + msg_info "Updating Immich CLI" + $STD npm install --build-from-source sharp + rm -rf "$APP_DIR"/node_modules/@img/sharp-{libvips*,linuxmusl-x64} + $STD npm i -g @immich/cli + msg_ok "Updated Immich CLI" + + chown -R immich:immich "$INSTALL_DIR" + echo "$RELEASE" >/opt/"${APP}"_version.txt + msg_ok "Updated ${APP} to v${RELEASE}" + + msg_info "Cleaning up" + $STD apt-get -y autoremove + $STD apt-get -y autoclean + msg_ok "Cleaned" systemctl restart immich-ml immich-web exit } diff --git a/ct/metube.sh b/ct/metube.sh index 9a3e8952d..8a3a12f59 100644 --- a/ct/metube.sh +++ b/ct/metube.sh @@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/mis APP="MeTube" var_tags="${var_tags:-media;youtube}" var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-1024}" +var_ram="${var_ram:-2048}" var_disk="${var_disk:-10}" var_os="${var_os:-debian}" var_version="${var_version:-12}" @@ -23,40 +23,97 @@ function update_script() { header_info check_container_storage check_container_resources + if [[ ! -d /opt/metube ]]; then msg_error "No ${APP} Installation Found!" exit fi + msg_info "Stopping ${APP} Service" systemctl stop metube msg_ok "Stopped ${APP} Service" - msg_info "Updating ${APP} to latest Git" - cd /opt - if [ -d metube_bak ]; then - rm -rf metube_bak + msg_info "Backing up Old Installation" + if [[ -d /opt/metube_bak ]]; then + rm -rf /opt/metube_bak fi - mv metube metube_bak + mv /opt/metube /opt/metube_bak + msg_ok "Backup created" + + msg_info "Cloning Latest ${APP} Release" $STD git clone https://github.com/alexta69/metube /opt/metube + msg_ok "Cloned ${APP}" + + msg_info "Building Frontend" cd /opt/metube/ui $STD npm install $STD node_modules/.bin/ng build - cd /opt/metube - cp /opt/metube_bak/.env /opt/metube/ - $STD pip3 install pipenv - $STD pipenv install + msg_ok "Built Frontend" - if [ -d "/opt/metube_bak" ]; then - rm -rf /opt/metube_bak + PYTHON_VERSION="3.13" setup_uv + + msg_info "Setting up Python Environment (uv)" + $STD uv venv /opt/metube/.venv + $STD /opt/metube/.venv/bin/python -m ensurepip --upgrade + $STD /opt/metube/.venv/bin/python -m pip install --upgrade pip + $STD /opt/metube/.venv/bin/python -m pip install pipenv + msg_ok "Python Environment Ready" + + msg_info "Installing Backend Requirements" + cd /opt/metube + $STD /opt/metube/.venv/bin/pipenv install + msg_ok "Installed Backend" + + msg_info "Restoring Environment File" + if [[ -f /opt/metube_bak/.env ]]; then + cp /opt/metube_bak/.env /opt/metube/.env fi - msg_ok "Updated ${APP} to latest Git" + msg_ok "Restored .env" + + if [[ ! -d /opt/metube/.venv ]]; then + msg_info "Migrating to uv-based environment" + PYTHON_VERSION="3.13" setup_uv + $STD uv venv /opt/metube/.venv + $STD /opt/metube/.venv/bin/python -m ensurepip --upgrade + $STD /opt/metube/.venv/bin/python -m pip install --upgrade pip + $STD /opt/metube/.venv/bin/python -m pip install pipenv + $STD /opt/metube/.venv/bin/pipenv install + $STD /opt/metube/.venv/bin/pipenv update yt-dlp + + msg_info "Patching systemd Service" + cat </etc/systemd/system/metube.service +[Unit] +Description=Metube - YouTube Downloader +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/metube +EnvironmentFile=/opt/metube/.env +ExecStart=/opt/metube/.venv/bin/pipenv run python3 app/main.py +Restart=always +User=root + +[Install] +WantedBy=multi-user.target +EOF + msg_ok "Patched systemd Service" + fi + $STD systemctl daemon-reload + msg_ok "Service Updated" + + msg_info "Cleaning up" + rm -rf /opt/metube_bak + $STD apt-get -y autoremove + $STD apt-get -y autoclean + msg_ok "Cleaned Up" msg_info "Starting ${APP} Service" - systemctl start metube + systemctl enable -q --now metube sleep 1 msg_ok "Started ${APP} Service" - msg_ok "Updated Successfully!\n" - exit + + msg_ok "Updated Successfully!" } start diff --git a/ct/minio.sh b/ct/minio.sh index e45690a3b..1b875e1d1 100644 --- a/ct/minio.sh +++ b/ct/minio.sh @@ -27,16 +27,33 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + FEATURE_RICH_VERSION="2025-04-22T22-12-26Z" RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}') - if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then + CURRENT_VERSION="" + [[ -f /opt/${APP}_version.txt ]] && CURRENT_VERSION=$(cat /opt/${APP}_version.txt) + RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}') + + if [[ "${CURRENT_VERSION}" == "${FEATURE_RICH_VERSION}" && "${RELEASE}" != "${FEATURE_RICH_VERSION}" ]]; then + echo + echo "You are currently running the last feature-rich community version: ${FEATURE_RICH_VERSION}" + echo "WARNING: Updating to the latest version will REMOVE most management features from the Console UI." + echo "Do you still want to upgrade to the latest version? [y/N]: " + read -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + msg_ok "No update performed. Staying on the feature-rich version." + exit + fi + fi + + if [[ "${CURRENT_VERSION}" != "${RELEASE}" ]]; then msg_info "Stopping ${APP}" systemctl stop minio msg_ok "${APP} Stopped" msg_info "Updating ${APP} to ${RELEASE}" mv /usr/local/bin/minio /usr/local/bin/minio_bak - curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/minio" -o $(basename "https://dl.min.io/server/minio/release/linux-amd64/minio") - mv minio /usr/local/bin/ + curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/minio" -o /usr/local/bin/minio chmod +x /usr/local/bin/minio echo "${RELEASE}" >/opt/${APP}_version.txt msg_ok "Updated ${APP}" diff --git a/ct/planka.sh b/ct/planka.sh index 01f817a3b..b08b0ab1c 100644 --- a/ct/planka.sh +++ b/ct/planka.sh @@ -41,19 +41,19 @@ function update_script() { mkdir -p /opt/planka-backup/background-images mkdir -p /opt/planka-backup/attachments mv /opt/planka/planka/.env /opt/planka-backup - mv /opt/planka/planka/public/favicons/* /opt/planka-backup/favicons/ - mv /opt/planka/planka/public/user-avatars/* /opt/planka-backup/user-avatars/ - mv /opt/planka/planka/public/background-images/* /opt/planka-backup/background-images/ - mv /opt/planka/planka/private/attachments/* /opt/planka-backup/attachments/ + [ -n "$(ls -A /opt/planka/planka/public/favicons 2>/dev/null)" ] && mv /opt/planka/planka/public/favicons/* /opt/planka-backup/favicons/ + [ -n "$(ls -A /opt/planka/planka/public/user-avatars 2>/dev/null)" ] && mv /opt/planka/planka/public/user-avatars/* /opt/planka-backup/user-avatars/ + [ -n "$(ls -A /opt/planka/planka/public/background-images 2>/dev/null)" ] && mv /opt/planka/planka/public/background-images/* /opt/planka-backup/background-images/ + [ -n "$(ls -A /opt/planka/planka/private/attachments 2>/dev/null)" ] && mv /opt/planka/planka/private/attachments/* /opt/planka-backup/attachments/ rm -rf /opt/planka fetch_and_deploy_gh_release "planka" "plankanban/planka" "prebuild" "latest" "/opt/planka" "planka-prebuild.zip" cd /opt/planka/planka $STD npm install mv /opt/planka-backup/.env /opt/planka/planka/ - mv /opt/planka-backup/favicons/* /opt/planka/planka/public/favicons/ - mv /opt/planka-backup/user-avatars/* /opt/planka/planka/public/user-avatars/ - mv /opt/planka-backup/background-images/* /opt/planka/planka/public/background-images/ - mv /opt/planka-backup/attachments/* /opt/planka/planka/private/attachments/ + [ -n "$(ls -A /opt/planka-backup/favicons 2>/dev/null)" ] && mv /opt/planka-backup/favicons/* /opt/planka/planka/public/favicons/ + [ -n "$(ls -A /opt/planka-backup/user-avatars 2>/dev/null)" ] && mv /opt/planka-backup/user-avatars/* /opt/planka/planka/public/user-avatars/ + [ -n "$(ls -A /opt/planka-backup/background-images 2>/dev/null)" ] && mv /opt/planka-backup/background-images/* /opt/planka/planka/public/background-images/ + [ -n "$(ls -A /opt/planka-backup/attachments 2>/dev/null)" ] && mv /opt/planka-backup/attachments/* /opt/planka/planka/private/attachments/ msg_ok "Updated $APP to ${RELEASE}" msg_info "Starting $APP" diff --git a/ct/prometheus-pve-exporter.sh b/ct/prometheus-pve-exporter.sh index 2b1490f00..7b1d04430 100644 --- a/ct/prometheus-pve-exporter.sh +++ b/ct/prometheus-pve-exporter.sh @@ -20,26 +20,69 @@ color catch_errors function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -f /etc/systemd/system/prometheus-pve-exporter.service ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - msg_info "Stopping ${APP}" - systemctl stop prometheus-pve-exporter - msg_ok "Stopped ${APP}" + header_info + check_container_storage + check_container_resources + if [[ ! -f /etc/systemd/system/prometheus-pve-exporter.service ]]; then + msg_error "No ${APP} Installation Found!" + exit 1 + fi - msg_info "Updating ${APP}" - $STD pip install prometheus-pve-exporter --default-timeout=300 --upgrade --root-user-action=ignore - msg_ok "Updated ${APP}" + msg_info "Stopping ${APP}" + systemctl stop prometheus-pve-exporter + msg_ok "Stopped ${APP}" - msg_info "Starting ${APP}" - systemctl start prometheus-pve-exporter - msg_ok "Started ${APP}" - msg_ok "Updated Successfully" - exit + export PVE_VENV_PATH="/opt/prometheus-pve-exporter/.venv" + export PVE_EXPORTER_BIN="${PVE_VENV_PATH}/bin/pve_exporter" + + if [[ ! -d "$PVE_VENV_PATH" || ! -x "$PVE_EXPORTER_BIN" ]]; then + PYTHON_VERSION="3.12" setup_uv + msg_info "Migrating to uv/venv" + rm -rf "$PVE_VENV_PATH" + mkdir -p /opt/prometheus-pve-exporter + cd /opt/prometheus-pve-exporter + $STD uv venv "$PVE_VENV_PATH" + $STD "$PVE_VENV_PATH/bin/python" -m ensurepip --upgrade + $STD "$PVE_VENV_PATH/bin/python" -m pip install --upgrade pip + $STD "$PVE_VENV_PATH/bin/python" -m pip install prometheus-pve-exporter + msg_ok "Migrated to uv/venv" + else + msg_info "Updating Prometheus Proxmox VE Exporter" + PYTHON_VERSION="3.12" setup_uv + $STD "$PVE_VENV_PATH/bin/python" -m pip install --upgrade prometheus-pve-exporter + msg_ok "Updated Prometheus Proxmox VE Exporter" + fi + local service_file="/etc/systemd/system/prometheus-pve-exporter.service" + if ! grep -q "${PVE_VENV_PATH}/bin/pve_exporter" "$service_file"; then + msg_info "Updating systemd service" + cat <"$service_file" +[Unit] +Description=Prometheus Proxmox VE Exporter +Documentation=https://github.com/znerol/prometheus-pve-exporter +After=syslog.target network.target + +[Service] +User=root +Restart=always +Type=simple +ExecStart=${PVE_VENV_PATH}/bin/pve_exporter \\ + --config.file=/opt/prometheus-pve-exporter/pve.yml \\ + --web.listen-address=0.0.0.0:9221 +ExecReload=/bin/kill -HUP \$MAINPID + +[Install] +WantedBy=multi-user.target +EOF + $STD systemctl daemon-reload + msg_ok "Updated systemd service" + fi + + msg_info "Starting ${APP}" + systemctl start prometheus-pve-exporter + msg_ok "Started ${APP}" + + msg_ok "Updated Successfully" + exit 0 } start @@ -49,4 +92,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}:9221${CL}" \ No newline at end of file +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9221${CL}" diff --git a/ct/trilium.sh b/ct/trilium.sh index 57dccb1e7..bcc3e58e3 100644 --- a/ct/trilium.sh +++ b/ct/trilium.sh @@ -52,7 +52,7 @@ function update_script() { cp -r "${DB_PATH}" /opt/trilium_backup/ rm -rf /opt/trilium cd /tmp - curl -fsSL "https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz" -o "TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz" + curl -fsSL "https://github.com/TriliumNext/trilium/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz" -o "TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz" tar -xf "TriliumNextNotes-Server-v${RELEASE}-linux-x64.tar.xz" mv "TriliumNextNotes-Server-${RELEASE}-linux-x64" /opt/trilium diff --git a/frontend/public/json/alpine-it-tools.json b/frontend/public/json/alpine-it-tools.json index e2194cb82..94764f83c 100644 --- a/frontend/public/json/alpine-it-tools.json +++ b/frontend/public/json/alpine-it-tools.json @@ -21,7 +21,7 @@ "resources": { "cpu": 1, "ram": 256, - "hdd": 0.5, + "hdd": 1, "os": "alpine", "version": "3.21" } @@ -32,7 +32,7 @@ "resources": { "cpu": 1, "ram": 256, - "hdd": 0.5, + "hdd": 1, "os": "alpine", "version": "3.21" } diff --git a/frontend/public/json/alpine.json b/frontend/public/json/alpine.json index ebd03f018..508f7b681 100644 --- a/frontend/public/json/alpine.json +++ b/frontend/public/json/alpine.json @@ -21,7 +21,7 @@ "resources": { "cpu": 1, "ram": 512, - "hdd": 0.5, + "hdd": 1, "os": "alpine", "version": "3.21" } diff --git a/frontend/public/json/forgejo.json b/frontend/public/json/forgejo.json index b94c5849b..674c9a775 100644 --- a/frontend/public/json/forgejo.json +++ b/frontend/public/json/forgejo.json @@ -25,8 +25,19 @@ "os": "debian", "version": "12" } + }, + { + "type": "alpine", + "script": "ct/alpine-forgejo.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } } - ], + ], "default_credentials": { "username": null, "password": null diff --git a/frontend/public/json/mariadb.json b/frontend/public/json/mariadb.json index 3004ea9c9..a91f36a24 100644 --- a/frontend/public/json/mariadb.json +++ b/frontend/public/json/mariadb.json @@ -46,6 +46,10 @@ { "text": "This script requires some extra steps after the installation, Please checkout the 'documentation'", "type": "info" + }, + { + "text": "Access Adminer Web UI at `http:///adminer.php`", + "type": "info" } ] } diff --git a/frontend/public/json/metube.json b/frontend/public/json/metube.json new file mode 100644 index 000000000..66e0fa0b6 --- /dev/null +++ b/frontend/public/json/metube.json @@ -0,0 +1,35 @@ +{ + "name": "MeTube", + "slug": "metube", + "categories": [ + 11 + ], + "date_created": "2025-06-24", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8081, + "documentation": null, + "website": "https://github.com/alexta69/metube", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/metube.webp", + "config_path": "/opt/metube/.env", + "description": "MeTube allows you to download videos from YouTube and dozens of other sites.", + "install_methods": [ + { + "type": "default", + "script": "ct/metube.sh", + "resources": { + "cpu": 1, + "ram": 2048, + "hdd": 10, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/metube.json.bak b/frontend/public/json/metube.json.bak deleted file mode 100644 index 12f0a8214..000000000 --- a/frontend/public/json/metube.json.bak +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "MeTube", - "slug": "metube", - "categories": [ - 11 - ], - "date_created": "2024-06-12", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 8081, - "documentation": null, - "website": "https://github.com/alexta69/metube", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/metube.webp", - "config_path": "/opt/metube/.env", - "description": "MeTube allows you to download videos from YouTube and dozens of other sites.", - "install_methods": [ - { - "type": "default", - "script": "ct/metube.sh", - "resources": { - "cpu": 1, - "ram": 1024, - "hdd": 10, - "os": "debian", - "version": "12" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [] -} diff --git a/frontend/public/json/trilium.json b/frontend/public/json/trilium.json index 3efbee29f..44ca9e740 100644 --- a/frontend/public/json/trilium.json +++ b/frontend/public/json/trilium.json @@ -10,7 +10,7 @@ "privileged": false, "interface_port": 8080, "documentation": "https://triliumnext.github.io/Docs/", - "website": "https://github.com/TriliumNext/Notes", + "website": "https://github.com/TriliumNext/trilium", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/triliumnext.webp", "config_path": "/root/trilium-data/config.ini", "description": "TriliumNext is an newer Fork of Trilium. TriliumNext is an open-source note-taking and personal knowledge management application. It allows users to organize and manage their notes, ideas, and information in a single place, using a hierarchical tree-like structure. Trilium offers a range of features, including rich text formatting, links, images, and attachments, making it easy to create and structure notes. The software is designed to be flexible and customizable, with a range of customization options and plugins available, including themes, export options, and more. Trilium is a self-hosted solution, and can be run on a local machine or a cloud-based server, providing users with full control over their notes and information.", diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 4a721f2bd..bbf9e0210 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,8 +1,118 @@ [ + { + "name": "rcourtman/Pulse", + "version": "v3.31.1", + "date": "2025-06-23T23:13:13Z" + }, + { + "name": "meilisearch/meilisearch", + "version": "prototype-incremental-vector-store-1", + "date": "2025-06-23T21:37:47Z" + }, + { + "name": "minio/minio", + "version": "RELEASE.2025-06-13T11-33-47Z", + "date": "2025-06-23T20:58:42Z" + }, + { + "name": "esphome/esphome", + "version": "2025.6.1", + "date": "2025-06-23T19:28:09Z" + }, + { + "name": "runtipi/runtipi", + "version": "v4.2.1", + "date": "2025-06-03T20:04:28Z" + }, + { + "name": "home-assistant/core", + "version": "2025.6.2", + "date": "2025-06-23T18:38:37Z" + }, + { + "name": "Checkmk/checkmk", + "version": "v2.4.0p5-rc2", + "date": "2025-06-23T15:50:55Z" + }, + { + "name": "VictoriaMetrics/VictoriaMetrics", + "version": "pmm-6401-v1.120.0", + "date": "2025-06-23T15:12:12Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.98.2", + "date": "2025-06-18T18:20:16Z" + }, + { + "name": "Graylog2/graylog2-server", + "version": "6.3.0-rc.2", + "date": "2025-06-23T11:31:38Z" + }, + { + "name": "mattermost/mattermost", + "version": "v9.11.17", + "date": "2025-06-18T08:12:05Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.2042", + "date": "2025-06-23T05:54:00Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "v6.2.18", + "date": "2025-06-20T04:45:37Z" + }, + { + "name": "gotson/komga", + "version": "1.22.0", + "date": "2025-06-23T03:11:37Z" + }, { "name": "plexguide/Huntarr.io", - "version": "8.1.7", - "date": "2025-06-21T23:25:45Z" + "version": "8.1.8", + "date": "2025-06-23T00:21:30Z" + }, + { + "name": "OliveTin/OliveTin", + "version": "2025.6.22", + "date": "2025-06-22T22:41:11Z" + }, + { + "name": "qbittorrent/qBittorrent", + "version": "release-5.1.1", + "date": "2025-06-22T21:41:17Z" + }, + { + "name": "pocket-id/pocket-id", + "version": "v1.4.1", + "date": "2025-06-22T19:38:08Z" + }, + { + "name": "msgbyte/tianji", + "version": "v1.22.3", + "date": "2025-06-22T18:29:00Z" + }, + { + "name": "clusterzx/paperless-ai", + "version": "v3.0.7", + "date": "2025-06-22T17:49:29Z" + }, + { + "name": "fuma-nama/fumadocs", + "version": "create-fumadocs-app@15.5.4", + "date": "2025-06-22T13:12:24Z" + }, + { + "name": "TandoorRecipes/recipes", + "version": "1.5.35", + "date": "2025-06-22T08:30:10Z" + }, + { + "name": "inventree/InvenTree", + "version": "0.17.14", + "date": "2025-06-21T23:43:04Z" }, { "name": "HabitRPG/habitica", @@ -14,11 +124,6 @@ "version": "preview-fix-proxy-auth", "date": "2025-06-21T13:43:58Z" }, - { - "name": "rcourtman/Pulse", - "version": "v3.30.0", - "date": "2025-06-17T16:00:01Z" - }, { "name": "rogerfar/rdt-client", "version": "v2.0.114", @@ -32,7 +137,7 @@ { "name": "theonedev/onedev", "version": "v11.11.1", - "date": "2025-06-21T09:23:39Z" + "date": "2025-06-21T07:32:15Z" }, { "name": "pocketbase/pocketbase", @@ -44,11 +149,6 @@ "version": "0.50.4", "date": "2025-06-21T07:47:02Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.2035", - "date": "2025-06-21T05:52:31Z" - }, { "name": "coder/code-server", "version": "v4.101.1", @@ -69,21 +169,11 @@ "version": "3.2.1-rc1", "date": "2025-06-20T19:41:10Z" }, - { - "name": "VictoriaMetrics/VictoriaMetrics", - "version": "v1.24.0-victorialogs", - "date": "2025-06-20T19:31:31Z" - }, { "name": "homarr-labs/homarr", "version": "v1.25.0", "date": "2025-06-20T19:15:43Z" }, - { - "name": "msgbyte/tianji", - "version": "v1.22.1", - "date": "2025-06-20T18:12:20Z" - }, { "name": "mongodb/mongo", "version": "r8.1.2-rc0", @@ -134,21 +224,11 @@ "version": "v2.16.3", "date": "2025-06-20T05:49:06Z" }, - { - "name": "firefly-iii/firefly-iii", - "version": "v6.2.18", - "date": "2025-06-20T04:45:37Z" - }, { "name": "paperless-ngx/paperless-ngx", "version": "v2.17.1", "date": "2025-06-19T19:35:01Z" }, - { - "name": "pocket-id/pocket-id", - "version": "v1.4.0", - "date": "2025-06-19T18:30:11Z" - }, { "name": "rclone/rclone", "version": "v1.70.1", @@ -164,16 +244,6 @@ "version": "2025.05.1", "date": "2025-06-19T11:28:36Z" }, - { - "name": "mattermost/mattermost", - "version": "v9.11.17", - "date": "2025-06-18T08:12:05Z" - }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.98.2", - "date": "2025-06-18T18:20:16Z" - }, { "name": "redis/redis", "version": "8.2-m01-int2", @@ -209,11 +279,6 @@ "version": "v3.12.7", "date": "2025-06-18T14:22:53Z" }, - { - "name": "clusterzx/paperless-ai", - "version": "v3.0.6", - "date": "2025-06-18T14:18:13Z" - }, { "name": "openhab/openhab-core", "version": "5.0.0.M3", @@ -229,11 +294,6 @@ "version": "v10.7.0", "date": "2025-06-18T11:57:05Z" }, - { - "name": "esphome/esphome", - "version": "2025.6.0", - "date": "2025-06-18T09:41:11Z" - }, { "name": "forgejo/forgejo", "version": "v11.0.2", @@ -324,21 +384,11 @@ "version": "version/2025.6.2", "date": "2025-06-16T17:54:39Z" }, - { - "name": "runtipi/runtipi", - "version": "nightly", - "date": "2025-06-16T17:35:17Z" - }, { "name": "emqx/emqx", "version": "e5.9.1-alpha.1", "date": "2025-06-16T15:34:01Z" }, - { - "name": "fuma-nama/fumadocs", - "version": "fumadocs-openapi@9.0.12", - "date": "2025-06-16T15:09:27Z" - }, { "name": "open-webui/open-webui", "version": "v0.6.15", @@ -349,11 +399,6 @@ "version": "v8.1.16", "date": "2025-06-16T13:49:37Z" }, - { - "name": "Graylog2/graylog2-server", - "version": "6.3.0-rc.1", - "date": "2025-06-16T11:28:08Z" - }, { "name": "home-assistant/operating-system", "version": "15.2", @@ -434,11 +479,6 @@ "version": "v3.3.25", "date": "2025-06-14T02:52:44Z" }, - { - "name": "home-assistant/core", - "version": "2025.6.1", - "date": "2025-06-13T20:16:18Z" - }, { "name": "wazuh/wazuh", "version": "coverity-w25-4.13.0", @@ -454,16 +494,6 @@ "version": "v2025-06-12", "date": "2025-06-12T20:59:47Z" }, - { - "name": "meilisearch/meilisearch", - "version": "latest", - "date": "2025-06-12T19:09:18Z" - }, - { - "name": "Checkmk/checkmk", - "version": "v2.3.0p34", - "date": "2025-06-12T12:15:44Z" - }, { "name": "zitadel/zitadel", "version": "v3.3.0", @@ -474,11 +504,6 @@ "version": "v1.12.0-rc.4", "date": "2025-06-12T00:27:41Z" }, - { - "name": "TandoorRecipes/recipes", - "version": "2.0.0-alpha-4", - "date": "2025-05-14T05:01:45Z" - }, { "name": "MediaBrowser/Emby.Releases", "version": "4.8.11.0", @@ -559,11 +584,6 @@ "version": "v1.10.0", "date": "2025-06-07T08:31:48Z" }, - { - "name": "OliveTin/OliveTin", - "version": "2025.6.6", - "date": "2025-06-06T21:39:22Z" - }, { "name": "diced/zipline", "version": "v4.1.2", @@ -644,11 +664,6 @@ "version": "1.26.3", "date": "2025-06-02T22:00:14Z" }, - { - "name": "inventree/InvenTree", - "version": "0.17.13", - "date": "2025-06-02T12:44:20Z" - }, { "name": "usememos/memos", "version": "v0.24.4", @@ -759,11 +774,6 @@ "version": "v4.39.4", "date": "2025-05-25T02:27:28Z" }, - { - "name": "minio/minio", - "version": "RELEASE.2025-05-24T17-08-30Z", - "date": "2025-05-24T21:42:19Z" - }, { "name": "0xERR0R/blocky", "version": "v0.26.2", @@ -814,11 +824,6 @@ "version": "2.0.4", "date": "2025-05-16T15:09:53Z" }, - { - "name": "gotson/komga", - "version": "1.21.3", - "date": "2025-05-16T04:31:05Z" - }, { "name": "Dolibarr/dolibarr", "version": "18.0.7", @@ -944,11 +949,6 @@ "version": "v2.6.3", "date": "2025-04-27T09:05:42Z" }, - { - "name": "qbittorrent/qBittorrent", - "version": "release-5.1.0", - "date": "2025-04-27T08:53:48Z" - }, { "name": "photoprism/photoprism", "version": "250426-27ec7a128", diff --git a/frontend/public/json/zigbee2mqtt.json b/frontend/public/json/zigbee2mqtt.json index d7bb9a284..354f6743e 100644 --- a/frontend/public/json/zigbee2mqtt.json +++ b/frontend/public/json/zigbee2mqtt.json @@ -1,51 +1,51 @@ { - "name": "Zigbee2MQTT", - "slug": "zigbee2mqtt", - "categories": [ - 17 - ], - "date_created": "2024-05-02", - "type": "ct", - "updateable": true, - "privileged": true, - "interface_port": 9442, - "documentation": "https://www.zigbee2mqtt.io/guide/getting-started/", - "website": "https://www.zigbee2mqtt.io/", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/zigbee2mqtt.webp", - "config_path": "/opt/zigbee2mqtt/data/configuration.yaml", - "description": "Zigbee2MQTT is an open-source software project that allows you to use Zigbee-based smart home devices (such as those sold under the Philips Hue and Ikea Tradfri brands) with MQTT-based home automation systems, like Home Assistant, Node-RED, and others. The software acts as a bridge between your Zigbee devices and MQTT, allowing you to control and monitor these devices from your home automation system.", - "install_methods": [ - { - "type": "default", - "script": "ct/zigbee2mqtt.sh", - "resources": { - "cpu": 2, - "ram": 1024, - "hdd": 4, - "os": "debian", - "version": "12" - } - }, - { - "type": "alpine", - "script": "ct/alpine-zigbee2mqtt.sh", - "resources": { - "cpu": 1, - "ram": 256, - "hdd": 0.3, - "os": "alpine", - "version": "3.21" - } - } - ], - "default_credentials": { - "username": null, - "password": null + "name": "Zigbee2MQTT", + "slug": "zigbee2mqtt", + "categories": [ + 17 + ], + "date_created": "2024-05-02", + "type": "ct", + "updateable": true, + "privileged": true, + "interface_port": 9442, + "documentation": "https://www.zigbee2mqtt.io/guide/getting-started/", + "website": "https://www.zigbee2mqtt.io/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/zigbee2mqtt.webp", + "config_path": "/opt/zigbee2mqtt/data/configuration.yaml", + "description": "Zigbee2MQTT is an open-source software project that allows you to use Zigbee-based smart home devices (such as those sold under the Philips Hue and Ikea Tradfri brands) with MQTT-based home automation systems, like Home Assistant, Node-RED, and others. The software acts as a bridge between your Zigbee devices and MQTT, allowing you to control and monitor these devices from your home automation system.", + "install_methods": [ + { + "type": "default", + "script": "ct/zigbee2mqtt.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "debian", + "version": "12" + } }, - "notes": [ - { - "text": "You can find the post-install guide here: `https://github.com/community-scripts/ProxmoxVE/discussions/410`", - "type": "info" - } - ] + { + "type": "alpine", + "script": "ct/alpine-zigbee2mqtt.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.21" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "You can find the post-install guide here: `https://github.com/community-scripts/ProxmoxVE/discussions/410`", + "type": "info" + } + ] } diff --git a/install/adventurelog-install.sh b/install/adventurelog-install.sh index 407295003..cafeb5056 100644 --- a/install/adventurelog-install.sh +++ b/install/adventurelog-install.sh @@ -22,8 +22,8 @@ $STD apt-get install -y \ msg_ok "Installed Dependencies" PYTHON_VERSION="3.12" setup_uv -NODE_VERSION="22" NODE_MODULE="pnpm@latest" install_node_and_modules -PG_VERSION="16" PG_MODULES="postgis" install_postgresql +NODE_VERSION="22" NODE_MODULE="pnpm@latest" setup_nodejs +PG_VERSION="16" PG_MODULES="postgis" setup_postgresql msg_info "Set up PostgreSQL Database" DB_NAME="adventurelog_db" @@ -90,7 +90,6 @@ EOF cd /opt/adventurelog/frontend $STD pnpm i $STD pnpm build -echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" msg_ok "Installed AdventureLog" msg_info "Setting up Django Admin" @@ -148,7 +147,6 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf /opt/v${RELEASE}.zip $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/alpine-forgejo-install.sh b/install/alpine-forgejo-install.sh new file mode 100644 index 000000000..870b4888e --- /dev/null +++ b/install/alpine-forgejo-install.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Johann3s-H (An!ma) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://forgejo.org/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Forgejo" +$STD apk add --no-cache forgejo +msg_ok "Installed Forgejo" + +msg_info "Enabling Forgejo Service" +$STD rc-update add forgejo default +msg_ok "Enabled Forgejo Service" + +msg_info "Starting Forgejo" +$STD service forgejo start +msg_ok "Started Forgejo" + +motd_ssh +customize \ No newline at end of file diff --git a/install/esphome-install.sh b/install/esphome-install.sh index 86cfec92f..b5d046770 100644 --- a/install/esphome-install.sh +++ b/install/esphome-install.sh @@ -17,34 +17,34 @@ msg_info "Installing Dependencies" $STD apt-get install -y git msg_ok "Installed Dependencies" -msg_info "Setup Python3" -$STD apt-get install -y \ - python3 \ - python3-dev \ - python3-pip \ - python3-venv -rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Setup Python3" +PYTHON_VERSION="3.12" setup_uv -msg_info "Installing ESPHome" -mkdir /root/config -$STD pip install esphome tornado esptool -msg_ok "Installed ESPHome" +msg_info "Setting up Virtual Environment" +mkdir -p /opt/esphome +mkdir -p /root/config +cd /opt/esphome +$STD uv venv /opt/esphome/.venv +$STD /opt/esphome/.venv/bin/python -m ensurepip --upgrade +$STD /opt/esphome/.venv/bin/python -m pip install --upgrade pip +$STD /opt/esphome/.venv/bin/python -m pip install esphome tornado esptool +msg_ok "Setup and Installed ESPHome" msg_info "Creating Service" +mkdir -p /root/config cat </etc/systemd/system/esphomeDashboard.service [Unit] Description=ESPHome Dashboard After=network.target [Service] -ExecStart=/usr/local/bin/esphome dashboard /root/config/ +ExecStart=/opt/esphome/.venv/bin/esphome dashboard /root/config/ Restart=always User=root [Install] WantedBy=multi-user.target EOF + systemctl enable -q --now esphomeDashboard msg_ok "Created Service" diff --git a/install/immich-install.sh b/install/immich-install.sh index aa0490b9b..86958e0cf 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -282,7 +282,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.135.0" "$SRC_DIR" +fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "latest" "$SRC_DIR" msg_info "Installing ${APPLICATION} (more patience please)" diff --git a/install/linkwarden-install.sh b/install/linkwarden-install.sh index 241c57f4f..d44dd0533 100644 --- a/install/linkwarden-install.sh +++ b/install/linkwarden-install.sh @@ -44,7 +44,7 @@ msg_ok "Set up PostgreSQL DB" read -r -p "${TAB3}Would you like to add Adminer? " prompt if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then - install_adminer + setup_adminer fi msg_info "Installing Linkwarden (Patience)" diff --git a/install/metube-install.sh b/install/metube-install.sh index 8df8a437d..ac22cf332 100644 --- a/install/metube-install.sh +++ b/install/metube-install.sh @@ -1,8 +1,7 @@ #!/usr/bin/env bash # Copyright (c) 2021-2025 tteck -# Author: tteck -# Co-Author: MickLesk (Canbiz) +# Author: MickLesk (Canbiz) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # Source: https://github.com/alexta69/metube @@ -28,15 +27,7 @@ $STD apt-get install -y --no-install-recommends \ ca-certificates msg_ok "Installed Dependencies" -msg_info "Setup Python3" -$STD apt-get install -y \ - python3 \ - python3-dev \ - python3-pip \ - python3-venv -rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Setup Python3" - +PYTHON_VERSION="3.13" setup_uv NODE_VERSION="22" setup_nodejs msg_info "Installing MeTube" @@ -45,8 +36,13 @@ cd /opt/metube/ui $STD npm install $STD node_modules/.bin/ng build cd /opt/metube -$STD pip3 install pipenv -$STD pipenv install +$STD uv venv /opt/metube/.venv +$STD /opt/metube/.venv/bin/python -m ensurepip --upgrade +$STD /opt/metube/.venv/bin/python -m pip install --upgrade pip +$STD /opt/metube/.venv/bin/python -m pip install pipenv +$STD /opt/metube/.venv/bin/pipenv install +$STD /opt/metube/.venv/bin/pipenv update yt-dlp + mkdir -p /opt/metube_downloads /opt/metube_downloads/.metube /opt/metube_downloads/music /opt/metube_downloads/videos cat </opt/metube/.env DOWNLOAD_DIR=/opt/metube_downloads @@ -66,7 +62,7 @@ After=network.target Type=simple WorkingDirectory=/opt/metube EnvironmentFile=/opt/metube/.env -ExecStart=/usr/local/bin/pipenv run python3 app/main.py +ExecStart=/opt/metube/.venv/bin/pipenv run python3 app/main.py Restart=always User=root diff --git a/install/minio-install.sh b/install/minio-install.sh index c94af1227..fe6bc6b47 100644 --- a/install/minio-install.sh +++ b/install/minio-install.sh @@ -13,31 +13,60 @@ setting_up_container network_check update_os -msg_info "Setup MinIO" -RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}') -curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/minio" -o /usr/local/bin/minio +FEATURE_RICH_VERSION="2025-04-22T22-12-26Z" + +echo +echo "MinIO recently removed many management features from the Console UI." +echo "The last feature-complete version is: $FEATURE_RICH_VERSION" +echo "Latest versions require the paid edition for full UI functionality." +echo +echo "Choose which version to install:" +echo " [N] Feature-rich community version ($FEATURE_RICH_VERSION) [Recommended]" +echo " [Y] Latest version (may lack UI features)" +echo +read -p "Install latest MinIO version? [y/N]: " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + USE_LATEST=true +else + USE_LATEST=false +fi + +msg_info "Setting up MinIO" +if [[ "$USE_LATEST" == "true" ]]; then + RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}') + DOWNLOAD_URL="https://dl.min.io/server/minio/release/linux-amd64/minio" +else + RELEASE="$FEATURE_RICH_VERSION" + DOWNLOAD_URL="https://dl.min.io/server/minio/release/linux-amd64/archive/minio.RELEASE.${FEATURE_RICH_VERSION}" +fi + +curl -fsSL "$DOWNLOAD_URL" -o /usr/local/bin/minio chmod +x /usr/local/bin/minio useradd -r minio-user -s /sbin/nologin mkdir -p /home/minio-user chown minio-user:minio-user /home/minio-user mkdir -p /data chown minio-user:minio-user /data + MINIO_ADMIN_USER="minioadmin" MINIO_ADMIN_PASSWORD="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)" + cat </etc/default/minio MINIO_ROOT_USER=${MINIO_ADMIN_USER} MINIO_ROOT_PASSWORD=${MINIO_ADMIN_PASSWORD} EOF + { echo "" - echo "MinIO-Credentials" + echo "MinIO Credentials" echo "MinIO Admin User: $MINIO_ADMIN_USER" echo "MinIO Admin Password: $MINIO_ADMIN_PASSWORD" } >>~/minio.creds -echo "${RELEASE}" >/opt/${APPLICATION}_version.txt +echo "${RELEASE}" >/opt/${APPLICATION,,}_version.txt msg_ok "Setup MinIO" -msg_info "Creating Service" +msg_info "Creating service" cat </etc/systemd/system/minio.service [Unit] Description=MinIO @@ -57,8 +86,9 @@ LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF + systemctl enable -q --now minio -msg_ok "Created Service" +msg_ok "Service created" motd_ssh customize @@ -66,4 +96,4 @@ customize msg_info "Cleaning up" $STD apt-get -y autoremove $STD apt-get -y autoclean -msg_ok "Cleaned" +msg_ok "Cleanup complete" diff --git a/install/prometheus-pve-exporter-install.sh b/install/prometheus-pve-exporter-install.sh index b2ccef80d..513611e5b 100644 --- a/install/prometheus-pve-exporter-install.sh +++ b/install/prometheus-pve-exporter-install.sh @@ -13,16 +13,16 @@ setting_up_container network_check update_os -msg_info "Setup Python3" -$STD apt-get install -y \ - python3 \ - python3-pip -rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Setup Python3" +PYTHON_VERSION="3.12" setup_uv msg_info "Installing Prometheus Proxmox VE Exporter" -python3 -m pip install --default-timeout=300 --quiet --root-user-action=ignore prometheus-pve-exporter mkdir -p /opt/prometheus-pve-exporter +cd /opt/prometheus-pve-exporter + +$STD uv venv /opt/prometheus-pve-exporter/.venv +$STD /opt/prometheus-pve-exporter/.venv/bin/python -m ensurepip --upgrade +$STD /opt/prometheus-pve-exporter/.venv/bin/python -m pip install --upgrade pip +$STD /opt/prometheus-pve-exporter/.venv/bin/python -m pip install prometheus-pve-exporter cat </opt/prometheus-pve-exporter/pve.yml default: user: prometheus@pve @@ -42,7 +42,7 @@ After=syslog.target network.target User=root Restart=always Type=simple -ExecStart=pve_exporter \ +ExecStart=/opt/prometheus-pve-exporter/.venv/bin/pve_exporter \ --config.file=/opt/prometheus-pve-exporter/pve.yml \ --web.listen-address=0.0.0.0:9221 ExecReload=/bin/kill -HUP \$MAINPID diff --git a/install/trilium-install.sh b/install/trilium-install.sh index 5657a8ed2..1d73c253a 100644 --- a/install/trilium-install.sh +++ b/install/trilium-install.sh @@ -15,8 +15,8 @@ update_os msg_info "Setup TriliumNext" cd /opt -RELEASE=$(curl -fsSL https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') -curl -fsSL "https://github.com/TriliumNext/Notes/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-arm64.tar.xz" -o "TriliumNextNotes-Server-v${RELEASE}-linux-arm64.tar.xz" +RELEASE=$(curl -fsSL https://api.github.com/repos/TriliumNext/trilium/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') +curl -fsSL "https://github.com/TriliumNext/trilium/releases/download/v${RELEASE}/TriliumNextNotes-Server-v${RELEASE}-linux-arm64.tar.xz" -o "TriliumNextNotes-Server-v${RELEASE}-linux-arm64.tar.xz" tar -xf TriliumNextNotes-Server-v${RELEASE}-linux-arm64.tar.xz mv TriliumNextNotes-Server-$RELEASE-linux-arm64 /opt/trilium echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" diff --git a/misc/build.func b/misc/build.func index a7eb65d22..3ace386ad 100644 --- a/misc/build.func +++ b/misc/build.func @@ -1063,7 +1063,9 @@ EOF msg_info "Starting LXC Container" pct start "$CTID" msg_ok "Started LXC Container" + msg_info "Customizing LXC Container" + : "${tz:=Etc/UTC}" if [ "$var_os" == "alpine" ]; then sleep 3 pct exec "$CTID" -- /bin/sh -c 'cat </etc/apk/repositories @@ -1073,19 +1075,22 @@ EOF' pct exec "$CTID" -- ash -c "apk add bash newt curl openssh nano mc ncurses >/dev/null" else sleep 3 - # Set locale and timezone before update pct exec "$CTID" -- bash -c "sed -i '/$LANG/ s/^# //' /etc/locale.gen" pct exec "$CTID" -- bash -c "locale_line=\$(grep -v '^#' /etc/locale.gen | grep -E '^[a-zA-Z]' | awk '{print \$1}' | head -n 1) && \ echo LANG=\$locale_line >/etc/default/locale && \ locale-gen >/dev/null && \ export LANG=\$locale_line" - pct exec "$CTID" -- bash -c "echo $tz >/etc/timezone && ln -sf /usr/share/zoneinfo/$tz /etc/localtime" + if pct exec "$CTID" -- test -e "/usr/share/zoneinfo/$tz"; then + pct exec "$CTID" -- bash -c "echo $tz >/etc/timezone && ln -sf /usr/share/zoneinfo/$tz /etc/localtime" + else + msg_info "Skipping timezone setup – zone '$tz' not found in container" + fi - # Install curl pct exec "$CTID" -- bash -c "apt-get update >/dev/null && apt-get install -y sudo curl mc gnupg2 >/dev/null" fi msg_ok "Customized LXC Container" + lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/install/"$var_install".sh)" $? } diff --git a/misc/create_lxc.sh b/misc/create_lxc.sh index 64a4c2cf4..a79fb5677 100644 --- a/misc/create_lxc.sh +++ b/misc/create_lxc.sh @@ -155,13 +155,19 @@ if [ -f /etc/pve/corosync.conf ]; then fi # Update LXC template list -msg_info "Updating LXC Template List" +TEMPLATE_SEARCH="${PCT_OSTYPE}-${PCT_OSVERSION:-}" -if ! timeout 10 pveam update >/dev/null 2>&1; then - msg_error "Failed to update LXC template list. Please check your Proxmox host's internet connection and DNS resolution." - exit 201 +msg_info "Updating LXC Template List" +if ! timeout 15 pveam update >/dev/null 2>&1; then + TEMPLATE_FALLBACK=$(pveam list "$TEMPLATE_STORAGE" | awk "/$TEMPLATE_SEARCH/ {print \$2}" | sort -t - -k 2 -V | tail -n1) + if [[ -z "$TEMPLATE_FALLBACK" ]]; then + msg_error "Failed to update LXC template list and no local template matching '$TEMPLATE_SEARCH' found." + exit 201 + fi + msg_info "Skipping template update – using local fallback: $TEMPLATE_FALLBACK" +else + msg_ok "LXC Template List Updated" fi -$STD msg_ok "LXC Template List Updated" # Get LXC template string if [ $PCT_OSTYPE = debian ]; then diff --git a/misc/tools.func b/misc/tools.func index 8f4cc8a0a..5fb37a6ce 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -64,6 +64,12 @@ function setup_nodejs() { exit 1 fi + # Update to latest npm + $STD npm install -g npm@latest || { + msg_error "Failed to update npm to latest version" + exit 1 + } + msg_ok "Setup Node.js ${NODE_VERSION}" fi @@ -741,12 +747,12 @@ function fetch_and_deploy_gh_release() { local app_lc=$(echo "${app,,}" | tr -d ' ') local version_file="$HOME/.${app_lc}" - local curl_timeout="--connect-timeout 10 --max-time 30" + + local api_timeout="--connect-timeout 5 --max-time 30" + local download_timeout="--connect-timeout 15 --max-time 900" local current_version="" - if [[ -f "$version_file" ]]; then - current_version=$(<"$version_file") - fi + [[ -f "$version_file" ]] && current_version=$(<"$version_file") if ! command -v jq &>/dev/null; then $STD apt-get install -y jq &>/dev/null @@ -757,11 +763,22 @@ function fetch_and_deploy_gh_release() { local header=() [[ -n "${GITHUB_TOKEN:-}" ]] && header=(-H "Authorization: token $GITHUB_TOKEN") - local resp http_code - resp=$(curl $curl_timeout -fsSL -w "%{http_code}" -o /tmp/gh_rel.json "${header[@]}" "$api_url") + local max_retries=3 retry_delay=2 attempt=1 success=false resp http_code + + while ((attempt <= max_retries)); do + resp=$(curl $api_timeout -fsSL -w "%{http_code}" -o /tmp/gh_rel.json "${header[@]}" "$api_url") && success=true && break + sleep "$retry_delay" + ((attempt++)) + done + + if ! $success; then + msg_error "Failed to fetch release metadata after $max_retries attempts" + return 1 + fi + http_code="${resp:(-3)}" [[ "$http_code" != "200" ]] && { - msg_error "Failed to fetch release: HTTP $http_code" + msg_error "GitHub API returned HTTP $http_code" return 1 } @@ -779,14 +796,14 @@ function fetch_and_deploy_gh_release() { tmpdir=$(mktemp -d) || return 1 local filename="" url="" - msg_info "Setup $app ($version)" + msg_info "Fetching GitHub release: $app ($version)" if [[ "$mode" == "tarball" || "$mode" == "source" ]]; then url=$(echo "$json" | jq -r '.tarball_url // empty') [[ -z "$url" ]] && url="https://github.com/$repo/archive/refs/tags/v$version.tar.gz" filename="${app_lc}-${version}.tar.gz" - curl $curl_timeout -fsSL -o "$tmpdir/$filename" "$url" || { + curl $download_timeout -fsSL -o "$tmpdir/$filename" "$url" || { msg_error "Download failed: $url" rm -rf "$tmpdir" return 1 @@ -830,7 +847,7 @@ function fetch_and_deploy_gh_release() { fi filename="${url_match##*/}" - curl $curl_timeout -fsSL -o "$tmpdir/$filename" "$url_match" || { + curl $download_timeout -fsSL -o "$tmpdir/$filename" "$url_match" || { msg_error "Download failed: $url_match" rm -rf "$tmpdir" return 1 @@ -865,7 +882,7 @@ function fetch_and_deploy_gh_release() { } filename="${asset_url##*/}" - curl $curl_timeout -fsSL -o "$tmpdir/$filename" "$asset_url" || { + curl $download_timeout -fsSL -o "$tmpdir/$filename" "$asset_url" || { msg_error "Download failed: $asset_url" rm -rf "$tmpdir" return 1 @@ -906,7 +923,7 @@ function fetch_and_deploy_gh_release() { filename="${asset_url##*/}" mkdir -p "$target" - curl $curl_timeout -fsSL -o "$target/$app" "$asset_url" || { + curl $download_timeout -fsSL -o "$target/$app" "$asset_url" || { msg_error "Download failed: $asset_url" rm -rf "$tmpdir" return 1 @@ -921,7 +938,7 @@ function fetch_and_deploy_gh_release() { fi echo "$version" >"$version_file" - msg_ok "Setup $app ($version)" + msg_ok "Deployed: $app ($version)" rm -rf "$tmpdir" } diff --git a/vm/openwrt.sh b/vm/openwrt.sh index 86f6e4e4f..84660e19c 100644 --- a/vm/openwrt.sh +++ b/vm/openwrt.sh @@ -516,7 +516,7 @@ DESCRIPTION=$( Logo -

OpenWRT VM

+

OpenWrt VM

diff --git a/vm/pimox-haos-vm.sh b/vm/pimox-haos-vm.sh index c4e328a79..d941b97be 100644 --- a/vm/pimox-haos-vm.sh +++ b/vm/pimox-haos-vm.sh @@ -403,7 +403,7 @@ DESCRIPTION=$( Logo -

OpenWRT VM

+

Homeassistant VM