diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c48a7a4b..25dc2426a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -499,6 +499,49 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-09 + +### 🚀 Updated Scripts + + - fix(pihole): repair Unbound DNS-over-TLS (DoT) forwarding config [@TowyTowy](https://github.com/TowyTowy) ([#15654](https://github.com/community-scripts/ProxmoxVE/pull/15654)) + +## 2026-07-08 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Opencloud: Bump version to 7.2.1 [@vhsdream](https://github.com/vhsdream) ([#15655](https://github.com/community-scripts/ProxmoxVE/pull/15655)) + - BabyBuddy: Harden update script [@MickLesk](https://github.com/MickLesk) ([#15642](https://github.com/community-scripts/ProxmoxVE/pull/15642)) + +## 2026-07-07 + +### 🆕 New Scripts + + - Forgejo-Runner ([#15046](https://github.com/community-scripts/ProxmoxVE/pull/15046)) + +## 2026-07-06 + +### 🚀 Updated Scripts + + - Fix alignment in various ct end messages [@tremor021](https://github.com/tremor021) ([#15632](https://github.com/community-scripts/ProxmoxVE/pull/15632)) +- Immich: Update libvips to 8.18.4 [@vhsdream](https://github.com/vhsdream) ([#15619](https://github.com/community-scripts/ProxmoxVE/pull/15619)) + + - #### 🐞 Bug Fixes + + - Wizarr: Build JS and CSS static assets [@vhsdream](https://github.com/vhsdream) ([#15634](https://github.com/community-scripts/ProxmoxVE/pull/15634)) + - RustDesk Server: Update URL format in rustdeskserver.sh [@tremor021](https://github.com/tremor021) ([#15626](https://github.com/community-scripts/ProxmoxVE/pull/15626)) + - attempt to port docker-vm to support arm64 [@asylumexp](https://github.com/asylumexp) ([#15611](https://github.com/community-scripts/ProxmoxVE/pull/15611)) + - fix(plane): don't clobber global app var, breaking /usr/bin/update [@asylumexp](https://github.com/asylumexp) ([#15612](https://github.com/community-scripts/ProxmoxVE/pull/15612)) + + - #### 🔧 Refactor + + - cliproxyapi: point setup message at /management.html [@austinpilz](https://github.com/austinpilz) ([#15628](https://github.com/community-scripts/ProxmoxVE/pull/15628)) + +### 🗑️ Deleted Scripts + + - Remove: FlowiseAI [@MickLesk](https://github.com/MickLesk) ([#15624](https://github.com/community-scripts/ProxmoxVE/pull/15624)) + ## 2026-07-05 ### 🆕 New Scripts diff --git a/ct/alpine-cinny.sh b/ct/alpine-cinny.sh index 72c93f3e6..17a6019ae 100644 --- a/ct/alpine-cinny.sh +++ b/ct/alpine-cinny.sh @@ -54,5 +54,5 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following IP:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" +echo -e "${INFO}${YW}Access it using the following IP:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/apache-airflow.sh b/ct/apache-airflow.sh index d6a331177..2a97f914d 100644 --- a/ct/apache-airflow.sh +++ b/ct/apache-airflow.sh @@ -33,7 +33,7 @@ function update_script() { INSTALLED=$(cat ~/.airflow 2>/dev/null || echo "0") LATEST=$(curl -fsSL "https://pypi.org/pypi/apache-airflow/json" | jq -r '.info.version') - if [[ "$INSTALLED" == "$LATEST" ]]; then + if [[ $INSTALLED == "$LATEST" ]]; then msg_ok "Already on the latest version (${LATEST})" exit fi @@ -71,5 +71,5 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/authentik.sh b/ct/authentik.sh index b857bcff4..c8b99db82 100644 --- a/ct/authentik.sh +++ b/ct/authentik.sh @@ -30,7 +30,7 @@ function update_script() { exit fi - read -r MAJOR MINOR PATCH <<< "$(sed 's/^version\///; s/\./ /g' "$HOME/.authentik")" + read -r MAJOR MINOR PATCH <<<"$(sed 's/^version\///; s/\./ /g' "$HOME/.authentik")" msg_info "Update dependencies" ensure_dependencies crossbuild-essential-$(arch_resolve) gcc-$(arch_resolve "x86-64" "aarch64")-linux-gnu cmake clang libunwind-18-dev @@ -66,26 +66,26 @@ function update_script() { if check_for_gh_release "authentik" "goauthentik/authentik" "${AUTHENTIK_VERSION}"; then msg_info "Stopping Services" systemctl stop authentik-server authentik-worker - if [[ $(systemctl is-active authentik-ldap) == active ]]; then - systemctl stop authentik-ldap - fi - if [[ $(systemctl is-active authentik-rac) == active ]]; then - systemctl stop authentik-rac - fi - if [[ $(systemctl is-active authentik-radius) == active ]]; then - systemctl stop authentik-radius - fi + if [[ $(systemctl is-active authentik-ldap) == active ]]; then + systemctl stop authentik-ldap + fi + if [[ $(systemctl is-active authentik-rac) == active ]]; then + systemctl stop authentik-rac + fi + if [[ $(systemctl is-active authentik-radius) == active ]]; then + systemctl stop authentik-radius + fi msg_ok "Stopped Services" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "authentik" "goauthentik/authentik" "tarball" "${AUTHENTIK_VERSION}" "/opt/authentik" - msg_info "Configuring rust" - cd /opt/authentik - $STD rustup install - $STD rustup default "$(sed -n 's/channel = "\(.*\)"/\1/p' rust-toolchain.toml)" - msg_ok "Configured rust" + msg_info "Configuring rust" + cd /opt/authentik + $STD rustup install + $STD rustup default "$(sed -n 's/channel = "\(.*\)"/\1/p' rust-toolchain.toml)" + msg_ok "Configured rust" - msg_info "Updating web" + msg_info "Updating web" cd /opt/authentik/web export NODE_ENV="production" $STD npm install @@ -99,18 +99,18 @@ function update_script() { export CC="$(arch_resolve "x86_64" "aarch64")-linux-gnu-gcc" $STD go mod download $STD go build -o /opt/authentik/authentik-server ./cmd/server - $STD go build -o /opt/authentik/ldap ./cmd/ldap - $STD go build -o /opt/authentik/rac ./cmd/rac - $STD go build -o /opt/authentik/radius ./cmd/radius + $STD go build -o /opt/authentik/ldap ./cmd/ldap + $STD go build -o /opt/authentik/rac ./cmd/rac + $STD go build -o /opt/authentik/radius ./cmd/radius msg_ok "Updated go proxy" - msg_info "Building worker" - export AWS_LC_FIPS_SYS_CC="clang" - cd /opt/authentik - $STD cargo build --package authentik --no-default-features --features core --locked --release --jobs 1 - cp ./target/release/authentik /opt/authentik/authentik-worker - rm -r ./target - msg_ok "Built worker" + msg_info "Building worker" + export AWS_LC_FIPS_SYS_CC="clang" + cd /opt/authentik + $STD cargo build --package authentik --no-default-features --features core --locked --release --jobs 1 + cp ./target/release/authentik /opt/authentik/authentik-worker + rm -r ./target + msg_ok "Built worker" msg_info "Updating python server" export UV_NO_BINARY_PACKAGE="cryptography lxml python-kadmin-rs xmlsec" @@ -125,26 +125,26 @@ function update_script() { msg_ok "Updated python server" if [[ $MAJOR == 2026 && $MINOR -lt 5 ]]; then - msg_info "Updating Worker and Server config" - cp /etc/authentik/config.yml /etc/authentik/config.bak - yq -i ".postgresql.conn_max_age = 0" /etc/authentik/config.yml - yq -i ".postgresql.conn_health_checks = false" /etc/authentik/config.yml - yq -i ".listen.debug_tokio = \"[::]:6669\"" /etc/authentik/config.yml - yq -i ".log.rust_log.console_subscriber = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.h2 = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.hyper_util = \"warn\"" /etc/authentik/config.yml - yq -i ".log.rust_log.mio = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.notify = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.reqwest = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.runtime = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.rustls = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.sqlx = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.sqlx_postgres = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.tokio = \"info\"" /etc/authentik/config.yml - yq -i ".log.rust_log.tungstenite = \"info\"" /etc/authentik/config.yml - yq -i ".web.workers = 2" /etc/authentik/config.yml - mv /etc/default/authentik /etc/default/authentik.bak - cat </etc/default/authentik-server + msg_info "Updating Worker and Server config" + cp /etc/authentik/config.yml /etc/authentik/config.bak + yq -i ".postgresql.conn_max_age = 0" /etc/authentik/config.yml + yq -i ".postgresql.conn_health_checks = false" /etc/authentik/config.yml + yq -i '.listen.debug_tokio = "[::]:6669"' /etc/authentik/config.yml + yq -i '.log.rust_log.console_subscriber = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.h2 = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.hyper_util = "warn"' /etc/authentik/config.yml + yq -i '.log.rust_log.mio = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.notify = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.reqwest = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.runtime = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.rustls = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.sqlx = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.sqlx_postgres = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.tokio = "info"' /etc/authentik/config.yml + yq -i '.log.rust_log.tungstenite = "info"' /etc/authentik/config.yml + yq -i ".web.workers = 2" /etc/authentik/config.yml + mv /etc/default/authentik /etc/default/authentik.bak + cat </etc/default/authentik-server TMPDIR=/dev/shm/ UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=0 @@ -159,7 +159,7 @@ AUTHENTIK_LISTEN__HTTP="[::]:9000" AUTHENTIK_LISTEN__HTTPS="[::]:9443" AUTHENTIK_LISTEN__METRICS="[::]:9300" EOF - cat </etc/default/authentik-worker + cat </etc/default/authentik-worker TMPDIR=/dev/shm/ UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=0 @@ -174,11 +174,11 @@ AUTHENTIK_LISTEN__HTTP="[::]:8000" AUTHENTIK_LISTEN__HTTPS="[::]:8443" AUTHENTIK_LISTEN__METRICS="[::]:8300" EOF - msg_ok "Updated Worker and Server config!" - msg_warn "Please check /etc/default/authentik-worker and /etc/default/authentik-server config files for port configurations!" + msg_ok "Updated Worker and Server config!" + msg_warn "Please check /etc/default/authentik-worker and /etc/default/authentik-server config files for port configurations!" - msg_info "Updating services" - cat </etc/systemd/system/authentik-server.service + msg_info "Updating services" + cat </etc/systemd/system/authentik-server.service [Unit] Description=authentik Go Server (API Gateway) After=network.target @@ -198,7 +198,7 @@ EnvironmentFile=/etc/default/authentik-server WantedBy=multi-user.target EOF - cat </etc/systemd/system/authentik-worker.service + cat </etc/systemd/system/authentik-worker.service [Unit] Description=authentik Worker After=network.target postgresql.service @@ -217,21 +217,21 @@ RestartSec=5 [Install] WantedBy=multi-user.target EOF - systemctl daemon-reload - msg_ok "Updated services" - fi + systemctl daemon-reload + msg_ok "Updated services" + fi fi msg_info "Starting Services" systemctl start authentik-server authentik-worker if [[ $(systemctl is-enabled authentik-ldap) == enabled ]]; then - systemctl start authentik-ldap + systemctl start authentik-ldap fi if [[ $(systemctl is-enabled authentik-rac) == enabled ]]; then - systemctl start authentik-rac + systemctl start authentik-rac fi if [[ $(systemctl is-enabled authentik-radius) == enabled ]]; then - systemctl start authentik-radius + systemctl start authentik-radius fi msg_ok "Started Services" msg_ok "Updated successfully!" @@ -270,5 +270,5 @@ 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}https://${IP}:9443${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}https://${IP}:9443${CL}" diff --git a/ct/babybuddy.sh b/ct/babybuddy.sh index 29fc7703a..b718a42ef 100644 --- a/ct/babybuddy.sh +++ b/ct/babybuddy.sh @@ -40,7 +40,8 @@ function update_script() { create_backup /opt/babybuddy/babybuddy/settings/production.py msg_info "Cleaning old files" - find . -mindepth 1 -maxdepth 1 ! -name '.venv' -exec rm -rf {} + + cd /opt/babybuddy || exit + find . -mindepth 1 -maxdepth 1 ! -name '.venv' -exec rm -rf -- {} + msg_ok "Cleaned old files" fetch_and_deploy_gh_release "babybuddy" "babybuddy/babybuddy" "tarball" @@ -51,6 +52,7 @@ function update_script() { source .venv/bin/activate $STD uv pip install -r requirements.txt export DJANGO_SETTINGS_MODULE=babybuddy.settings.production + $STD python manage.py makemigrations $STD python manage.py migrate msg_ok "Updated ${APP}" diff --git a/ct/baserow.sh b/ct/baserow.sh index fa0d044db..836ca4840 100644 --- a/ct/baserow.sh +++ b/ct/baserow.sh @@ -71,5 +71,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/bookorbit.sh b/ct/bookorbit.sh index 16e330e24..7b0e95c13 100644 --- a/ct/bookorbit.sh +++ b/ct/bookorbit.sh @@ -75,5 +75,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/clickhouse.sh b/ct/clickhouse.sh index a0e49e619..966dffa39 100644 --- a/ct/clickhouse.sh +++ b/ct/clickhouse.sh @@ -41,5 +41,5 @@ 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}:8123${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8123${CL}" diff --git a/ct/cliproxyapi.sh b/ct/cliproxyapi.sh index cffa0fc17..9eb49a1a6 100644 --- a/ct/cliproxyapi.sh +++ b/ct/cliproxyapi.sh @@ -52,5 +52,5 @@ 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 "${GATEWAY}${BGN}http://${IP}:8317${CL}" +echo -e "${INFO}${YW}Authenticate your AI providers via the management panel at:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8317/management.html${CL}" diff --git a/ct/cross-seed.sh b/ct/cross-seed.sh index a61f1274c..7970657d8 100644 --- a/ct/cross-seed.sh +++ b/ct/cross-seed.sh @@ -52,5 +52,5 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access cross-seed API using the following URL:${CL}" +echo -e "${INFO}${YW}Access cross-seed API using the following URL:${CL}" echo -e "${GATEWAY}${BGN}http://${IP}:2468${CL}" diff --git a/ct/cyberchef.sh b/ct/cyberchef.sh index e50d1c7b3..d698f1c86 100644 --- a/ct/cyberchef.sh +++ b/ct/cyberchef.sh @@ -26,8 +26,8 @@ function update_script() { check_container_resources if [[ ! -d /opt/cyberchef ]]; then - msg_error "No ${APP} Installation Found!" - exit + msg_error "No ${APP} Installation Found!" + exit fi if check_for_gh_release "cyberchef" "gchq/CyberChef"; then @@ -58,5 +58,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/ct/etherpad.sh b/ct/etherpad.sh index f5a63852d..df7cd61bf 100755 --- a/ct/etherpad.sh +++ b/ct/etherpad.sh @@ -61,5 +61,5 @@ 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}:9001${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:9001${CL}" diff --git a/ct/excalidash.sh b/ct/excalidash.sh index 07f2f1764..09a265fcd 100644 --- a/ct/excalidash.sh +++ b/ct/excalidash.sh @@ -75,5 +75,5 @@ 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}:6767${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:6767${CL}" diff --git a/ct/feishin.sh b/ct/feishin.sh index 4f3f8cd63..dec1ece1b 100644 --- a/ct/feishin.sh +++ b/ct/feishin.sh @@ -75,5 +75,5 @@ 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}:9180${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:9180${CL}" diff --git a/ct/flame.sh b/ct/flame.sh index 4378f4d10..c903fcc4c 100644 --- a/ct/flame.sh +++ b/ct/flame.sh @@ -36,7 +36,7 @@ function update_script() { msg_ok "Stopped Service" create_backup /opt/flame/.env \ - /opt/flame/data + /opt/flame/data CLEAN_INSTALL=1 fetch_and_deploy_gh_release "flame" "pawelmalak/flame" "tarball" restore_backup @@ -65,5 +65,5 @@ 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}:5005${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:5005${CL}" diff --git a/ct/flowiseai.sh b/ct/flowiseai.sh deleted file mode 100644 index 7d4c6468e..000000000 --- a/ct/flowiseai.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://flowiseai.com/ | Github: https://github.com/FlowiseAI/Flowise - -APP="FlowiseAI" -var_tags="${var_tags:-low-code}" -var_disk="${var_disk:-10}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-4096}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -var_arm64="${var_arm64:-yes}" -var_unprivileged="${var_unprivileged:-1}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -f /etc/systemd/system/flowise.service ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs - - msg_info "Updating FlowiseAI (this may take some time)" - systemctl stop flowise - $STD pnpm add -g flowise - if grep -q 'ExecStart=npx flowise start' /etc/systemd/system/flowise.service; then - sed -i 's|ExecStart=npx flowise start|ExecStart=flowise start|' /etc/systemd/system/flowise.service - systemctl daemon-reload - fi - systemctl start flowise - msg_ok "Updated FlowiseAI" - msg_ok "Updated successfully!" - 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 "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/fmd-server.sh b/ct/fmd-server.sh index 76a7bd96d..0c8b75293 100644 --- a/ct/fmd-server.sh +++ b/ct/fmd-server.sh @@ -60,5 +60,5 @@ 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}https://${IP}:8443${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}https://${IP}:8443${CL}" diff --git a/ct/forgejo-runner.sh b/ct/forgejo-runner.sh new file mode 100644 index 000000000..7c7c1774f --- /dev/null +++ b/ct/forgejo-runner.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Simon Friedrich (lengschder97) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://forgejo.org/ + +APP="Forgejo-Runner" +var_tags="${var_tags:-ci}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-8}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_arm64="${var_arm64:-yes}" +var_unprivileged="${var_unprivileged:-1}" +var_nesting="${var_nesting:-1}" +var_keyctl="${var_keyctl:-1}" + +export var_forgejo_instance="${var_forgejo_instance:-}" +export var_forgejo_runner_token="${var_forgejo_runner_token:-}" +export var_runner_labels="${var_runner_labels:-}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /usr/local/bin/forgejo-runner ]]; then + msg_error "No ${APP} installation found!" + exit 1 + fi + + RELEASE=$(curl -fsSL https://data.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | grep -oP '"tag_name":\s*"\K[^"]+' | sed 's/^v//') + if [[ "${RELEASE}" == "$(cat ~/.forgejo-runner 2>/dev/null)" ]]; then + msg_ok "No update required. ${APP} is already at v${RELEASE}" + exit + fi + + msg_info "Stopping Services" + systemctl stop forgejo-runner + msg_ok "Stopped Services" + + msg_info "Updating Forgejo Runner to v${RELEASE}" + curl -fsSL "https://code.forgejo.org/forgejo/runner/releases/download/v${RELEASE}/forgejo-runner-${RELEASE}-linux-$(arch_resolve)" -o /usr/local/bin/forgejo-runner + chmod +x /usr/local/bin/forgejo-runner + echo "${RELEASE}" >~/.forgejo-runner + msg_ok "Updated Forgejo Runner" + + msg_info "Starting Services" + systemctl start forgejo-runner + msg_ok "Started Services" + msg_ok "Updated successfully!" + exit +} + +if [[ -n "${mode:-}" ]]; then + if [[ -z "${var_forgejo_instance:-}" ]]; then + msg_error "var_forgejo_instance is required for unattended installs." + exit 1 + fi + if [[ -z "${var_forgejo_runner_token:-}" ]]; then + msg_error "var_forgejo_runner_token is required for unattended installs." + exit 1 + fi +fi + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} After first boot, check your Forgejo Instance for the new Runner.${CL}" diff --git a/ct/headers/flowiseai b/ct/headers/flowiseai deleted file mode 100644 index 7011f22b4..000000000 --- a/ct/headers/flowiseai +++ /dev/null @@ -1,6 +0,0 @@ - ________ _ ___ ____ - / ____/ /___ _ __(_)_______ / | / _/ - / /_ / / __ \ | /| / / / ___/ _ \/ /| | / / - / __/ / / /_/ / |/ |/ / (__ ) __/ ___ |_/ / -/_/ /_/\____/|__/|__/_/____/\___/_/ |_/___/ - diff --git a/ct/headers/forgejo-runner b/ct/headers/forgejo-runner new file mode 100644 index 000000000..5be4a07fe --- /dev/null +++ b/ct/headers/forgejo-runner @@ -0,0 +1,6 @@ + ______ _ ____ + / ____/___ _________ ____ (_)___ / __ \__ ______ ____ ___ _____ + / /_ / __ \/ ___/ __ `/ _ \ / / __ \______/ /_/ / / / / __ \/ __ \/ _ \/ ___/ + / __/ / /_/ / / / /_/ / __/ / / /_/ /_____/ _, _/ /_/ / / / / / / / __/ / +/_/ \____/_/ \__, /\___/_/ /\____/ /_/ |_|\__,_/_/ /_/_/ /_/\___/_/ + /____/ /___/ diff --git a/ct/hev-socks5-server.sh b/ct/hev-socks5-server.sh index 3b9ffe873..b2a84616a 100644 --- a/ct/hev-socks5-server.sh +++ b/ct/hev-socks5-server.sh @@ -30,7 +30,6 @@ function update_script() { exit fi - if check_for_gh_release "hev-socks5-server" "heiher/hev-socks5-server"; then msg_info "Stopping Service" systemctl stop hev-socks5-server @@ -52,6 +51,6 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it with a SOCKS5 client using the following URL:${CL}" +echo -e "${INFO}${YW}Access it with a SOCKS5 client using the following URL:${CL}" echo -e "${GATEWAY}${BGN}${IP}:1080${CL}" echo -e "${INFO}${YW} and the credentials stored at /root/hev.creds${CL}" diff --git a/ct/immich.sh b/ct/immich.sh index 77500920c..48ae7ceda 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -471,7 +471,7 @@ function compile_imagemagick() { function compile_libvips() { SOURCE=$SOURCE_DIR/libvips - LIBVIPS_REVISION="3664cfc5dc2c5661288f5bf5a85ccc51c64c1626" + LIBVIPS_REVISION="e01a4797cabe77d457fdfa7d776b7a7e7ca6d6a7" if [[ "$LIBVIPS_REVISION" != "$(grep 'libvips' ~/.immich_library_revisions | awk '{print $2}')" ]]; then msg_info "Recompiling libvips" [[ -d "$SOURCE" ]] && rm -rf "$SOURCE" diff --git a/ct/iventoy.sh b/ct/iventoy.sh index 441312c11..89aac7813 100644 --- a/ct/iventoy.sh +++ b/ct/iventoy.sh @@ -52,5 +52,5 @@ 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}:26000${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:26000${CL}" diff --git a/ct/kiwix.sh b/ct/kiwix.sh index c66803e2e..ecde55d14 100644 --- a/ct/kiwix.sh +++ b/ct/kiwix.sh @@ -37,12 +37,12 @@ function update_script() { msg_ok "Updated Package Index" CANDIDATE=$(apt-cache policy kiwix-tools | awk '/Candidate:/{print $2}') - if [[ -z "$CANDIDATE" || "$CANDIDATE" == "(none)" ]]; then + if [[ -z $CANDIDATE || $CANDIDATE == "(none)" ]]; then msg_error "No Candidate Version Found for kiwix-tools" exit fi - if [[ "$CURRENT" == "$CANDIDATE" ]]; then + if [[ $CURRENT == "$CANDIDATE" ]]; then echo "${CURRENT}" >/root/.kiwix msg_ok "Already on latest version: ${CURRENT}" exit @@ -71,5 +71,5 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/koffan.sh b/ct/koffan.sh index 910070c7f..ec87a32b0 100644 --- a/ct/koffan.sh +++ b/ct/koffan.sh @@ -59,5 +59,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/kometa.sh b/ct/kometa.sh index b0a9e0caa..965076f8c 100644 --- a/ct/kometa.sh +++ b/ct/kometa.sh @@ -83,5 +83,5 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access Kometa Quickstart:${CL}" +echo -e "${INFO}${YW}Access Kometa Quickstart:${CL}" echo -e "${GATEWAY}${BGN}http://${IP}:7171${CL}" diff --git a/ct/loki.sh b/ct/loki.sh index 2156eac5a..d1c6a2570 100644 --- a/ct/loki.sh +++ b/ct/loki.sh @@ -37,38 +37,38 @@ function update_script() { case $CHOICE in 1) - msg_info "Stopping Loki" - systemctl stop loki - msg_ok "Stopped Loki" + msg_info "Stopping Loki" + systemctl stop loki + msg_ok "Stopped Loki" - msg_info "Updating Loki" - $STD apt update - $STD apt install -y --only-upgrade loki - msg_ok "Updated Loki" + msg_info "Updating Loki" + $STD apt update + $STD apt install -y --only-upgrade loki + msg_ok "Updated Loki" - msg_info "Starting Loki" - systemctl start loki - msg_ok "Started Loki" - msg_ok "Updated successfully!" - exit - ;; - 2) - msg_info "Configuring Loki to listen on 0.0.0.0" - sed -i 's/http_listen_address:.*/http_listen_address: 0.0.0.0/' /etc/loki/config.yml - sed -i 's/http_listen_port:.*/http_listen_port: 3100/' /etc/loki/config.yml - systemctl restart loki - msg_ok "Configured Loki to listen on 0.0.0.0" - exit - ;; - 3) - msg_info "Configuring Loki to listen on ${LOCAL_IP}" - sed -i "s/http_listen_address:.*/http_listen_address: $LOCAL_IP/" /etc/loki/config.yml - sed -i 's/http_listen_port:.*/http_listen_port: 3100/' /etc/loki/config.yml - systemctl restart loki - msg_ok "Configured Loki to listen on ${LOCAL_IP}" - exit - ;; - esac + msg_info "Starting Loki" + systemctl start loki + msg_ok "Started Loki" + msg_ok "Updated successfully!" + exit + ;; + 2) + msg_info "Configuring Loki to listen on 0.0.0.0" + sed -i 's/http_listen_address:.*/http_listen_address: 0.0.0.0/' /etc/loki/config.yml + sed -i 's/http_listen_port:.*/http_listen_port: 3100/' /etc/loki/config.yml + systemctl restart loki + msg_ok "Configured Loki to listen on 0.0.0.0" + exit + ;; + 3) + msg_info "Configuring Loki to listen on ${LOCAL_IP}" + sed -i "s/http_listen_address:.*/http_listen_address: $LOCAL_IP/" /etc/loki/config.yml + sed -i 's/http_listen_port:.*/http_listen_port: 3100/' /etc/loki/config.yml + systemctl restart loki + msg_ok "Configured Loki to listen on ${LOCAL_IP}" + exit + ;; + esac exit 0 } @@ -78,5 +78,5 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access loki using the following URL:${CL}" +echo -e "${INFO}${YW}Access loki using the following URL:${CL}" echo -e "${GATEWAY}${BGN}http://${IP}:3100${CL}\n" diff --git a/ct/lyrionmusicserver.sh b/ct/lyrionmusicserver.sh index 8ef432b93..b14d0d791 100644 --- a/ct/lyrionmusicserver.sh +++ b/ct/lyrionmusicserver.sh @@ -35,7 +35,7 @@ function update_script() { DEB_URL=$(curl_with_retry 'https://lyrion.org/getting-started/' | grep -oP "]*href=\"\K[^\"]*${DEB_ARCH}\.deb(?=\"[^>]*>)" | head -n 1) RELEASE=$(echo "$DEB_URL" | grep -oP "lyrionmusicserver_\K[0-9.]+(?=_${DEB_ARCH}\.deb)") DEB_FILE="/tmp/lyrionmusicserver_${RELEASE}_${DEB_ARCH}.deb" - if [[ ! -f /opt/lyrion_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/lyrion_version.txt)" ]]; then + if [[ ! -f /opt/lyrion_version.txt ]] || [[ ${RELEASE} != "$(cat /opt/lyrion_version.txt)" ]]; then msg_info "Updating $APP to ${RELEASE}" curl_with_retry "$DEB_URL" "$DEB_FILE" $STD apt install "$DEB_FILE" -y @@ -56,5 +56,5 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access the web interface at:${CL}" +echo -e "${INFO}${YW}Access the web interface at:${CL}" echo -e "${GATEWAY}${BGN}http://${IP}:9000${CL}" diff --git a/ct/matterjs-server.sh b/ct/matterjs-server.sh index 65d53f5f5..0904c4974 100644 --- a/ct/matterjs-server.sh +++ b/ct/matterjs-server.sh @@ -31,10 +31,10 @@ function update_script() { fi NODE_VERSION="24" setup_nodejs - + CURRENT=$(cat /opt/matter-server/node_modules/matter-server/package.json | grep '"version"' | head -1 | sed 's/.*"\([^"]*\)".*/\1/') LATEST=$(npm view matter-server version 2>/dev/null) - if [[ "$CURRENT" != "$LATEST" ]]; then + if [[ $CURRENT != "$LATEST" ]]; then msg_info "Stopping Service" systemctl stop matterjs-server msg_ok "Stopped Service" @@ -60,5 +60,5 @@ 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}:5580${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:5580${CL}" diff --git a/ct/netbird.sh b/ct/netbird.sh index 336094791..8359805be 100644 --- a/ct/netbird.sh +++ b/ct/netbird.sh @@ -44,5 +44,5 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access NetBird by entering the container and running:${CL}" +echo -e "${INFO}${YW}Access NetBird by entering the container and running:${CL}" echo -e "${GATEWAY}${BGN}netbird up${CL}" diff --git a/ct/opencloud.sh b/ct/opencloud.sh index b64dc34d0..b328d90ab 100644 --- a/ct/opencloud.sh +++ b/ct/opencloud.sh @@ -30,7 +30,7 @@ function update_script() { exit fi - RELEASE="v7.2.0" + RELEASE="v7.2.1" if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then msg_info "Stopping services" systemctl stop opencloud opencloud-wopi diff --git a/ct/paperclip.sh b/ct/paperclip.sh index e7c1f5101..10c27de23 100644 --- a/ct/paperclip.sh +++ b/ct/paperclip.sh @@ -79,5 +79,5 @@ 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}:3100${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3100${CL}" diff --git a/ct/pinchflat.sh b/ct/pinchflat.sh index 7b696dd41..c930b741a 100644 --- a/ct/pinchflat.sh +++ b/ct/pinchflat.sh @@ -66,5 +66,5 @@ 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}:8945${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8945${CL}" diff --git a/ct/plane.sh b/ct/plane.sh index 13c29969c..0d8d9f6c9 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -38,10 +38,10 @@ function update_script() { msg_ok "Stopped Services" create_backup /opt/plane/.env \ - /opt/plane/apps/admin/.env \ - /opt/plane/apps/api/.env \ - /opt/plane/apps/space/.env \ - /opt/plane/apps/web/.env + /opt/plane/apps/admin/.env \ + /opt/plane/apps/api/.env \ + /opt/plane/apps/space/.env \ + /opt/plane/apps/web/.env CLEAN_INSTALL=1 fetch_and_deploy_gh_release "plane" "makeplane/plane" "tarball" @@ -86,5 +86,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/ct/postiz.sh b/ct/postiz.sh index cdfbc51b2..dc004abb5 100644 --- a/ct/postiz.sh +++ b/ct/postiz.sh @@ -37,7 +37,7 @@ function update_script() { msg_ok "Stopped Services" create_backup /opt/postiz/.env \ - /opt/postiz/uploads + /opt/postiz/uploads CLEAN_INSTALL=1 fetch_and_deploy_gh_release "postiz" "gitroomhq/postiz-app" "tarball" @@ -56,7 +56,6 @@ function update_script() { $STD pnpm run prisma-db-push msg_ok "Ran Database Migrations" - mkdir -p /opt/postiz/uploads restore_backup @@ -74,5 +73,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/ct/rackula.sh b/ct/rackula.sh index 74f453c55..c0b15a9b9 100755 --- a/ct/rackula.sh +++ b/ct/rackula.sh @@ -77,5 +77,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/ct/rustdeskserver.sh b/ct/rustdeskserver.sh index 921ab1130..8831bda20 100644 --- a/ct/rustdeskserver.sh +++ b/ct/rustdeskserver.sh @@ -60,4 +60,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 "${GATEWAY}${BGN}${IP}:21114${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:21114${CL}" diff --git a/ct/shlink.sh b/ct/shlink.sh index 0d6a210dd..a9238fe49 100644 --- a/ct/shlink.sh +++ b/ct/shlink.sh @@ -80,7 +80,7 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access Shlink Web Client using the following URL:${CL}" +echo -e "${INFO}${YW}Access Shlink Web Client using the following URL:${CL}" echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" echo -e "${INFO}${YW} Shlink HTTP API:${CL}" echo -e "${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/snapotter.sh b/ct/snapotter.sh index 86671ab42..2ebea2959 100644 --- a/ct/snapotter.sh +++ b/ct/snapotter.sh @@ -59,5 +59,5 @@ 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}:1349${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:1349${CL}" diff --git a/ct/spliit.sh b/ct/spliit.sh index 33076cd42..d039b75d9 100755 --- a/ct/spliit.sh +++ b/ct/spliit.sh @@ -72,5 +72,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/tolgee.sh b/ct/tolgee.sh index fab3dc278..4455852ff 100644 --- a/ct/tolgee.sh +++ b/ct/tolgee.sh @@ -52,5 +52,5 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/twenty.sh b/ct/twenty.sh index 0b212ef0f..e1e9e35d3 100644 --- a/ct/twenty.sh +++ b/ct/twenty.sh @@ -39,10 +39,10 @@ function update_script() { msg_ok "Stopped Services" create_backup /opt/twenty/.env \ - /opt/twenty/packages/twenty-server/.local-storage + /opt/twenty/packages/twenty-server/.local-storage CLEAN_INSTALL=1 fetch_and_deploy_gh_release "twenty" "twentyhq/twenty" "tarball" restore_backup - + msg_info "Building Application" cd /opt/twenty export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 @@ -63,7 +63,6 @@ function update_script() { $STD npx -y typeorm migration:run -d dist/database/typeorm/core/core.datasource msg_ok "Ran Database Migrations" - msg_info "Starting Services" systemctl start twenty-server twenty-worker msg_ok "Started Services" @@ -78,5 +77,5 @@ 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}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/wizarr.sh b/ct/wizarr.sh index febc1e4c3..af6a2adac 100644 --- a/ct/wizarr.sh +++ b/ct/wizarr.sh @@ -50,20 +50,38 @@ function update_script() { $STD /usr/local/bin/uv sync --frozen $STD /usr/local/bin/uv run --frozen pybabel compile -d app/translations $STD npm --prefix app/static install - $STD npm --prefix app/static run build:css + $STD npm --prefix app/static run build mkdir -p ./.cache $STD tar -xf "$BACKUP_FILE" --directory=/ - if grep -q 'workers' /opt/wizarr/start.sh; then - sed -i 's/--workers 4//' /opt/wizarr/start.sh + if grep -q 'bind' /opt/wizarr/start.sh; then + WIZARR_PORT=$(awk -F: '{print $2}' /opt/wizarr/start.sh | awk -F' ' '{print $1}' | tr -d '[:space:]') fi - if ! grep -qE 'FLASK|WORKERS|VERSION' /opt/wizarr/.env; then - cat </opt/wizarr/.env + sed -i -E -e 's/[[:space:]]+/ /g' \ + -e 's/--workers 4//' \ + -e 's/--bind 0.0.0.0:[0-9]+//' /opt/wizarr/start.sh + KEYS=("FLASK" "WORKERS" "HOST" "PORT") + for key in "${KEYS[@]}"; do + if ! grep -q "$key" /opt/wizarr/.env; then + cat </opt/wizarr/.env +APP_URL=http://${LOCAL_IP} +DISABLE_BUILTIN_AUTH=false FLASK_ENV=production GUNICORN_WORKERS=4 -APP_VERSION=$(sed 's/^20/v&/' ~/.wizarr) +HOST=0.0.0.0 +PORT=${WIZARR_PORT:-5690} +LOG_LEVEL=info +APP_VERSION=$(cat ~/.wizarr) EOF - else - sed -i "s/_VERSION=v.*$/_VERSION=v$(cat ~/.wizarr)/" /opt/wizarr/.env + fi + continue + done + sed -i "s/_VERSION=.*$/_VERSION=$(cat ~/.wizarr)/" /opt/wizarr/.env + if grep -q 'abnormal' /etc/systemd/system/wizarr.service; then + sed -i 's/on-abnormal/always \ +RestartSec=10 \ +KillMode=mixed \ +TimeoutStopSec=10/' /etc/systemd/system/wizarr.service + systemctl daemon-reload fi rm -rf "$BACKUP_FILE" export FLASK_SKIP_SCHEDULER=true diff --git a/ct/xyops.sh b/ct/xyops.sh index 61f641119..2768a39ae 100644 --- a/ct/xyops.sh +++ b/ct/xyops.sh @@ -69,5 +69,5 @@ 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}:5522${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:5522${CL}" diff --git a/install/flowiseai-install.sh b/install/flowiseai-install.sh deleted file mode 100644 index 73cc8c1eb..000000000 --- a/install/flowiseai-install.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://flowiseai.com/ | Github: https://github.com/FlowiseAI/Flowise - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -$STD apt install -y \ - build-essential \ - pkg-config -msg_ok "Installed Dependencies" - -PYTHON_VERSION="3.11" setup_uv -NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs - -msg_info "Installing FlowiseAI (Patience)" -PYTHON_BIN="$(uv python find 3.11)" -export npm_config_python="$PYTHON_BIN" -$STD pnpm add -g flowise -mkdir -p /opt/flowiseai -curl -fsSL "https://raw.githubusercontent.com/FlowiseAI/Flowise/main/packages/server/.env.example" -o "/opt/flowiseai/.env" -msg_ok "Installed FlowiseAI" - -msg_info "Creating Service" -cat </etc/systemd/system/flowise.service -[Unit] -Description=FlowiseAI -After=network.target - -[Service] -EnvironmentFile=/opt/flowiseai/.env -ExecStart=flowise start -Restart=always - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now flowise -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/forgejo-runner-install.sh b/install/forgejo-runner-install.sh new file mode 100644 index 000000000..94ceb6877 --- /dev/null +++ b/install/forgejo-runner-install.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Simon Friedrich (lengschder97) +# 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 + +setup_yq + +if [[ -z "${var_forgejo_instance:-}" ]]; then + read -r -p "${TAB3}Forgejo Instance URL (e.g. https://codeberg.org): " var_forgejo_instance + var_forgejo_instance="${var_forgejo_instance:-https://codeberg.org}" +fi + +if [[ -z "${var_forgejo_runner_uuid:-}" ]]; then + read -r -p "${TAB3}Forgejo Runner UUID: " var_forgejo_runner_uuid +fi + +if [[ -z "${var_forgejo_runner_uuid:-}" ]]; then + msg_error "No runner UUID provided. Cannot continue." + exit 1 +fi + +if [[ -z "${var_forgejo_runner_token:-}" ]]; then + read -r -p "${TAB3}Forgejo Runner Token: " var_forgejo_runner_token +fi + +if [[ -z "${var_forgejo_runner_token:-}" ]]; then + msg_error "No runner registration token provided. Cannot continue." + exit 1 +fi + +DEFAULT_RUNNER_LABELS="linux-amd64:docker://node:22-bookworm" +if [[ -z "${var_runner_labels:-}" ]]; then + read -r -p "${TAB3}Additional runner labels (comma-separated, or leave blank for default only): " var_runner_labels +fi +if [[ -n "${var_runner_labels:-}" ]]; then + RUNNER_LABELS="${DEFAULT_RUNNER_LABELS},${var_runner_labels}" +else + RUNNER_LABELS="${DEFAULT_RUNNER_LABELS}" +fi + +export FORGEJO_INSTANCE="$var_forgejo_instance" +export FORGEJO_RUNNER_TOKEN="$var_forgejo_runner_token" +export FORGEJO_RUNNER_UUID="$var_forgejo_runner_uuid" +export RUNNER_LABELS + +msg_info "Installing dependencies" +$STD apt install -y \ + git \ + podman podman-docker +msg_ok "Installed dependencies" + +msg_info "Enabling Podman socket" +systemctl enable --now podman.socket +msg_ok "Enabled Podman socket" + +msg_info "Installing Forgejo Runner" +RUNNER_VERSION=$(curl -fsSL https://data.forgejo.org/api/v1/repos/forgejo/runner/releases/latest | jq -r .name | sed 's/^v//') +curl -fsSL "https://code.forgejo.org/forgejo/runner/releases/download/v${RUNNER_VERSION}/forgejo-runner-${RUNNER_VERSION}-linux-$(arch_resolve)" -o /usr/local/bin/forgejo-runner +chmod +x /usr/local/bin/forgejo-runner +echo "${RUNNER_VERSION}" >~/.forgejo-runner +msg_ok "Installed Forgejo Runner" + +msg_info "Registering Forgejo Runner" +export DOCKER_HOST="unix:///run/podman/podman.sock" + +msg_info "Generating Forgejo Runner Configuration" +mkdir -p /etc/forgejo-runner +CONFIG_FILE="/etc/forgejo-runner/config.yaml" +forgejo-runner generate-config > $CONFIG_FILE +yq -i ' + .container.docker_host = strenv(DOCKER_HOST) | + .server.connections.forgejo.url = strenv(FORGEJO_INSTANCE) | + .server.connections.forgejo.uuid = strenv(FORGEJO_RUNNER_UUID) | + .server.connections.forgejo.token = strenv(FORGEJO_RUNNER_TOKEN) | + .server.connections.forgejo.labels = (strenv(RUNNER_LABELS) | split(",") | map(select(length > 0))) + ' $CONFIG_FILE +msg_ok "Generated Forgejo Runner Configuration" + + +msg_info "Creating Services" +cat </etc/systemd/system/forgejo-runner.service +[Unit] +Description=Forgejo Runner +Documentation=https://forgejo.org/docs/latest/admin/actions/ +After=podman.socket +Requires=podman.socket + +[Service] +User=root +WorkingDirectory=/root +Environment=DOCKER_HOST=unix:///run/podman/podman.sock +ExecStart=/usr/local/bin/forgejo-runner daemon -c $CONFIG_FILE +Restart=on-failure +RestartSec=10 +TimeoutSec=0 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now forgejo-runner +msg_ok "Created Services" + +motd_ssh +customize +cleanup_lxc diff --git a/install/immich-install.sh b/install/immich-install.sh index 9270b29e1..fcaad3e0b 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -282,7 +282,7 @@ msg_ok "(4/5) Compiled imagemagick" msg_info "(5/5) Compiling libvips" SOURCE=$SOURCE_DIR/libvips -LIBVIPS_REVISION="3664cfc5dc2c5661288f5bf5a85ccc51c64c1626" +LIBVIPS_REVISION="e01a4797cabe77d457fdfa7d776b7a7e7ca6d6a7" $STD git clone https://github.com/libvips/libvips.git "$SOURCE" cd "$SOURCE" $STD git reset --hard "$LIBVIPS_REVISION" diff --git a/install/opencloud-install.sh b/install/opencloud-install.sh index 608440062..0dc635098 100644 --- a/install/opencloud-install.sh +++ b/install/opencloud-install.sh @@ -64,7 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA echo "$COOLPASS" >~/.coolpass msg_ok "Installed Collabora Online" -fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.2.0" "/usr/bin" "opencloud-*-linux-$(arch_resolve)" +fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.2.1" "/usr/bin" "opencloud-*-linux-$(arch_resolve)" mv /usr/bin/OpenCloud /usr/bin/opencloud msg_info "Configuring OpenCloud" diff --git a/install/pihole-install.sh b/install/pihole-install.sh index c88a7c997..547d79f23 100644 --- a/install/pihole-install.sh +++ b/install/pihole-install.sh @@ -119,7 +119,8 @@ edns-packet-max=1232 EOF if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then - cat </etc/unbound/unbound.conf.d/pi-hole.conf + cat <>/etc/unbound/unbound.conf.d/pi-hole.conf +server: tls-cert-bundle: "/etc/ssl/certs/ca-certificates.crt" forward-zone: name: "." diff --git a/install/plane-install.sh b/install/plane-install.sh index 2c03938a3..d481c6551 100644 --- a/install/plane-install.sh +++ b/install/plane-install.sh @@ -85,8 +85,8 @@ VITE_SPACE_BASE_PATH=/spaces VITE_LIVE_BASE_URL=http://${LOCAL_IP} VITE_LIVE_BASE_PATH=/live" # Each Vite app needs its own .env for the build -for app in web admin space; do - echo "$FRONTEND_ENV" >/opt/plane/apps/${app}/.env +for frontend_app in web admin space; do + echo "$FRONTEND_ENV" >/opt/plane/apps/${frontend_app}/.env done export NODE_OPTIONS="--max-old-space-size=4096" export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 diff --git a/install/wizarr-install.sh b/install/wizarr-install.sh index 57a152d11..ba6bca712 100644 --- a/install/wizarr-install.sh +++ b/install/wizarr-install.sh @@ -27,15 +27,17 @@ cd /opt/wizarr $STD /usr/local/bin/uv sync --frozen $STD /usr/local/bin/uv run --frozen pybabel compile -d app/translations $STD npm --prefix app/static install -$STD npm --prefix app/static run build:css +$STD npm --prefix app/static run build mkdir -p ./.cache cat </opt/wizarr/.env FLASK_ENV=production GUNICORN_WORKERS=4 APP_URL=http://${LOCAL_IP} +HOST=0.0.0.0 +PORT=5690 DISABLE_BUILTIN_AUTH=false LOG_LEVEL=INFO -APP_VERSION=v$(get_latest_github_release "wizarrrr/wizarr") +APP_VERSION=$(get_latest_github_release "wizarrrr/wizarr") EOF cat </opt/wizarr/start.sh @@ -44,7 +46,6 @@ cat </opt/wizarr/start.sh uv run --frozen gunicorn \ --config gunicorn.conf.py \ --preload \ - --bind 0.0.0.0:5690 \ --umask 007 \ run:app EOF @@ -62,7 +63,10 @@ Type=simple WorkingDirectory=/opt/wizarr EnvironmentFile=/opt/wizarr/.env ExecStart=/opt/wizarr/start.sh -Restart=on-abnormal +Restart=always +RestartSec=10 +KillMode=mixed +TimeoutStopSec=10 [Install] WantedBy=multi-user.target diff --git a/misc/tools.func b/misc/tools.func index 883c98da0..e8e18f4f3 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -4454,7 +4454,9 @@ setup_composer() { # - Uses stable distro packages by default # - Migrates from get.docker.com to repository-based installation # - Updates Docker Engine if newer version available -# - Interactive container update with multi-select +# - Interactive per-container update prompt (Y/N, 60 s auto-no) +# - Compose-managed containers: full restart via docker compose +# - Standalone containers: image pull only, no destructive stop/rm # - Portainer installation and update support # - Set DOCKER_NONINTERACTIVE=1 to skip interactive prompts (CI/unattended) # ------------------------------------------------------------------------------ @@ -4641,63 +4643,83 @@ EOF fi fi - # Interactive Container Update Check - if [[ "${DOCKER_SKIP_UPDATES:-}" != "true" ]] && [ "$docker_installed" = true ] && ! _docker_is_noninteractive; then + # Container Update Check + # - Skipped entirely when running unattended / non-interactive + # - Compose-managed containers: offered via Y/N → docker compose pull + up -d + # - Standalone containers: offered via Y/N → image pull only (no stop/rm) + if [ "$docker_installed" = true ] && ! _docker_is_noninteractive; then msg_info "Checking for container updates" - # Get list of running containers with update status - local containers_with_updates=() - local container_info=() - local index=1 + local name image compose_workdir compose_service current_digest latest_digest + local compose_updates=() + local standalone_updates=() - while IFS= read -r container; do - local name=$(echo "$container" | awk '{print $1}') - local image=$(echo "$container" | awk '{print $2}') - local current_digest=$(docker inspect "$name" --format='{{.Image}}' 2>/dev/null | cut -d':' -f2 | cut -c1-12) + while IFS= read -r line; do + name=$(echo "$line" | awk '{print $1}') + image=$(echo "$line" | awk '{print $2}') - # Pull latest image digest (ignore failures, e.g. local-only images or registry/permission issues) - docker pull "$image" >/dev/null 2>&1 || true - local latest_digest=$(docker inspect "$image" --format='{{.Id}}' 2>/dev/null | cut -d':' -f2 | cut -c1-12) + # Portainer containers are handled by the dedicated block above + [[ "$name" == "portainer" || "$name" == "portainer_agent" ]] && continue - if [ -n "$latest_digest" ] && [ "$current_digest" != "$latest_digest" ]; then - containers_with_updates+=("$name") - container_info+=("${index}) ${name} (${image})") - ((index++)) + current_digest=$(docker inspect "$name" --format='{{.Image}}' 2>/dev/null | cut -d':' -f2 | cut -c1-12) + docker pull "$image" >/dev/null 2>&1 || continue + latest_digest=$(docker inspect "$image" --format='{{.Id}}' 2>/dev/null | cut -d':' -f2 | cut -c1-12) + [[ -z "$latest_digest" || "$current_digest" == "$latest_digest" ]] && continue + + compose_workdir=$(docker inspect "$name" \ + --format='{{index .Config.Labels "com.docker.compose.project.working_dir"}}' 2>/dev/null || true) + compose_service=$(docker inspect "$name" \ + --format='{{index .Config.Labels "com.docker.compose.service"}}' 2>/dev/null || true) + + if [[ -n "$compose_workdir" && -n "$compose_service" && -d "$compose_workdir" ]]; then + compose_updates+=("${name}|${image}|${compose_workdir}|${compose_service}") + else + standalone_updates+=("${name}|${image}") fi done < <(docker ps --format '{{.Names}} {{.Image}}') - if [ ${#containers_with_updates[@]} -gt 0 ]; then - echo "" - echo "${TAB3}Container updates available:" - for info in "${container_info[@]}"; do - echo "${TAB3} $info" - done - echo "" - read -r -p "${TAB3}Select containers to update (e.g., 1,3,5 or 'all' or 'none'): " selection + # Stop spinner before any interactive prompt + stop_spinner - if [[ ${selection,,} == "all" ]]; then - for container in "${containers_with_updates[@]}"; do - msg_info "Updating container: $container" - docker stop "$container" - docker rm "$container" - # Note: This requires the original docker run command - best to recreate via compose - msg_ok "Stopped and removed $container (please recreate with updated image)" - done - elif [[ ${selection,,} != "none" ]]; then - IFS=',' read -ra SELECTED <<<"$selection" - for num in "${SELECTED[@]}"; do - num=$(echo "$num" | xargs) # trim whitespace - if [[ "$num" =~ ^[0-9]+$ ]] && [ "$num" -ge 1 ] && [ "$num" -le "${#containers_with_updates[@]}" ]; then - container="${containers_with_updates[$((num - 1))]}" - msg_info "Updating container: $container" - docker stop "$container" - docker rm "$container" - msg_ok "Stopped and removed $container (please recreate with updated image)" - fi - done - fi - else + if [[ ${#compose_updates[@]} -eq 0 && ${#standalone_updates[@]} -eq 0 ]]; then msg_ok "All containers are up-to-date" + else + local reply + for entry in "${compose_updates[@]}"; do + IFS='|' read -r name image compose_workdir compose_service <<<"$entry" + reply="" + if read -r -t 60 -p "${TAB3}Update ${name} (${image}) via Compose? (auto-no in 60s): " reply; then + echo "" + else + echo "" + fi + if [[ "${reply,,}" =~ ^(y|yes)$ ]]; then + msg_info "Updating $name" + if (cd "$compose_workdir" && $STD docker compose pull "$compose_service" && $STD docker compose up -d "$compose_service"); then + msg_ok "Updated $name" + else + msg_warn "Could not update $name — try manually in $compose_workdir" + fi + fi + done + + for entry in "${standalone_updates[@]}"; do + IFS='|' read -r name image <<<"$entry" + reply="" + if read -r -t 60 -p "${TAB3}Pull new image for ${name} (${image})? (auto-no in 60s): " reply; then + echo "" + else + echo "" + fi + if [[ "${reply,,}" =~ ^(y|yes)$ ]]; then + msg_info "Pulling new image for $name" + if $STD docker pull "$image"; then + msg_ok "New image available for $name — recreate the container to apply the update" + else + msg_warn "Failed to pull image for $name" + fi + fi + done fi fi diff --git a/misc/vm-core.func b/misc/vm-core.func index 8ad2dfc37..da9ee5584 100644 --- a/misc/vm-core.func +++ b/misc/vm-core.func @@ -620,12 +620,19 @@ pve_check() { } arch_check() { - if [ "$(dpkg --print-architecture)" != "amd64" ]; then - echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" - echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + local arch + arch="$(dpkg --print-architecture)" + if [[ "$arch" != "amd64" && "$arch" != "arm64" ]]; then + msg_error "This script requires amd64 or arm64." echo -e "Exiting..." sleep 2 - exit + exit 106 + fi + if [[ "$arch" == "arm64" && "${var_arm64:-}" != "yes" ]]; then + echo -e "\n ${INFO}${YWB}This script does not yet support ARM64! \n" + echo -e "Exiting..." + sleep 2 + exit 106 fi } diff --git a/vm/docker-vm.sh b/vm/docker-vm.sh index 194470a40..35d247333 100644 --- a/vm/docker-vm.sh +++ b/vm/docker-vm.sh @@ -11,7 +11,6 @@ source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/api.func) 2>/dev/null source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/vm-core.func) 2>/dev/null source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/cloud-init.func) 2>/dev/null || true -load_functions # ============================================================================== # SCRIPT VARIABLES @@ -21,6 +20,7 @@ APP_TYPE="vm" NSAPP="docker-vm" var_os="debian" var_version="13" +ARCH=$(dpkg --print-architecture) GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" @@ -30,6 +30,9 @@ USE_CLOUD_INIT="no" OS_TYPE="" OS_VERSION="" THIN="discard=on,ssd=1," +var_arm64="yes" + +load_functions # ============================================================================== # ERROR HANDLING & CLEANUP @@ -136,11 +139,16 @@ function default_settings() { VMID=$(get_valid_nextid) FORMAT="" - MACHINE=" -machine q35" + if [ "$ARCH" = "arm64" ]; then + MACHINE="" + CPU_TYPE="" + else + MACHINE=" -machine q35" + CPU_TYPE=" -cpu host" + fi DISK_CACHE="" DISK_SIZE="10G" HN="docker" - CPU_TYPE=" -cpu host" CORE_COUNT="2" RAM_SIZE="4096" BRG="vmbr0" @@ -151,11 +159,15 @@ function default_settings() { METHOD="default" echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" - echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}Q35 (Modern)${CL}" + if [ "$ARCH" = "arm64" ]; then + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}virt (ARM64)${CL}" + else + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}Q35 (Modern)${CL}" + fi echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" - echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}$([ "$ARCH" = "arm64" ] && echo "Default" || echo "Host")${CL}" echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" @@ -197,7 +209,11 @@ function advanced_settings() { done # Machine Type - if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ + if [ "$ARCH" = "arm64" ]; then + FORMAT="" + MACHINE="" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}virt${CL}" + elif MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ "q35" "Q35 (Modern, PCIe)" ON \ "i440fx" "i440fx (Legacy, PCI)" OFF \ 3>&1 1>&2 2>&3); then @@ -262,7 +278,10 @@ function advanced_settings() { fi # CPU Model - if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ + if [ "$ARCH" = "arm64" ]; then + CPU_TYPE="" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Default${CL}" + elif CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ "1" "Host (Recommended)" ON \ "0" "KVM64" OFF \ 3>&1 1>&2 2>&3); then