From 20740c3ca20adf808dc043eb00fd5f6aa468d005 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Mon, 6 Jul 2026 14:38:07 +0200 Subject: [PATCH 001/161] fix(docker): remove interactive container update check from setup_docker The 'Interactive Container Update Check' block scanned ALL running Docker containers, pulled their images, then stopped and removed them with only a message asking the user to manually recreate them. This is destructive and outside the scope of the Docker LXC update script, which is responsible for updating the Docker engine itself and the Portainer / Portainer-Agent containers that this script originally installed. Removes the entire block. Updates now cover: - OS packages (apt) - Docker engine (via setup_docker / repo) - Portainer CE (if installed by this script) - Portainer Agent (if installed by this script) Self-hosted / user-managed containers are intentionally left alone. Fixes #15601 --- misc/tools.func | 60 ------------------------------------------------- 1 file changed, 60 deletions(-) diff --git a/misc/tools.func b/misc/tools.func index 883c98da0..29bf34314 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -4641,66 +4641,6 @@ EOF fi fi - # Interactive Container Update Check - if [[ "${DOCKER_SKIP_UPDATES:-}" != "true" ]] && [ "$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 - - 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) - - # 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) - - if [ -n "$latest_digest" ] && [ "$current_digest" != "$latest_digest" ]; then - containers_with_updates+=("$name") - container_info+=("${index}) ${name} (${image})") - ((index++)) - 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 - - 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 - msg_ok "All containers are up-to-date" - fi - fi - msg_ok "Docker setup completed" } From 728726d5ccac635527c34e7ae1280510d1473abe Mon Sep 17 00:00:00 2001 From: MickLesk Date: Mon, 6 Jul 2026 14:43:25 +0200 Subject: [PATCH 002/161] fix(docker): safe, interactive per-container update check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the destructive multi-select container update block with a proper per-container Y/N workflow: - Unattended / non-interactive (DOCKER_NONINTERACTIVE=1 or no tty): skip silently -- no docker pulls, no prompts. - Interactive: stop_spinner() before any prompt to keep the terminal clean, then for each container with a newer image: Compose-managed → prompt Y/N (auto-no after 60 s) → on Y: docker compose pull && docker compose up -d Standalone run → prompt Y/N (auto-no after 60 s) → on Y: docker pull only; no stop/rm; user is told to recreate manually - portainer / portainer_agent are excluded (handled earlier in setup_docker) The old code always stopped and removed the container without recreating it, leaving users with a destroyed service. Standalone containers without a Compose project can never be auto-recreated safely, so only the image is pulled. Fixes #15601 --- misc/tools.func | 84 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/misc/tools.func b/misc/tools.func index 29bf34314..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,6 +4643,86 @@ EOF fi fi + # 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" + + local name image compose_workdir compose_service current_digest latest_digest + local compose_updates=() + local standalone_updates=() + + while IFS= read -r line; do + name=$(echo "$line" | awk '{print $1}') + image=$(echo "$line" | awk '{print $2}') + + # Portainer containers are handled by the dedicated block above + [[ "$name" == "portainer" || "$name" == "portainer_agent" ]] && continue + + 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}}') + + # Stop spinner before any interactive prompt + stop_spinner + + 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 + msg_ok "Docker setup completed" } From 93ce08aa72d6fde738a7328f4fb4ec78b82f87ae Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 12:44:28 +0000 Subject: [PATCH 003/161] Update CHANGELOG.md (#15616) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c48a7a4b..af1d268f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -499,6 +499,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-06 + ## 2026-07-05 ### 🆕 New Scripts From 555953117c76a17f75521247bcbd2cbd1c6ed303 Mon Sep 17 00:00:00 2001 From: Sam Heinz Date: Mon, 6 Jul 2026 23:00:41 +1000 Subject: [PATCH 004/161] fix(plane): don't clobber global app var, breaking /usr/bin/update (#15612) --- install/plane-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 81d6b2beeea2032529790e8eda19c9443243ba23 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 13:01:09 +0000 Subject: [PATCH 005/161] Update CHANGELOG.md (#15617) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index af1d268f1..d3b266ab5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -501,6 +501,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-06 +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - 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)) + ## 2026-07-05 ### 🆕 New Scripts From 68cc4f3da7ac91f6a6ecbb63159f63051bf35033 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 6 Jul 2026 09:38:39 -0400 Subject: [PATCH 006/161] Immich: Update libvips to 8.18.4 (#15619) --- ct/immich.sh | 2 +- install/immich-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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" From 766f8519a3ccabdcdef30223afffbb894223903d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 13:39:09 +0000 Subject: [PATCH 007/161] Update CHANGELOG.md (#15620) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3b266ab5..d7b63cd8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -503,6 +503,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 Updated Scripts + - Immich: Update libvips to 8.18.4 [@vhsdream](https://github.com/vhsdream) ([#15619](https://github.com/community-scripts/ProxmoxVE/pull/15619)) + - #### 🐞 Bug Fixes - 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)) From 7027d67eb3a2080cfdef33b2c4547d9640ac3ba8 Mon Sep 17 00:00:00 2001 From: Sam Heinz Date: Mon, 6 Jul 2026 23:41:55 +1000 Subject: [PATCH 008/161] attempt to port docker-vm to support arm64 (#15611) --- misc/vm-core.func | 15 +++++++++++---- vm/docker-vm.sh | 33 ++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 11 deletions(-) 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 From bff3c6932a0f699d1f1934485c40a772ad9a0655 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 13:42:23 +0000 Subject: [PATCH 009/161] Update CHANGELOG.md (#15621) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7b63cd8a..8bdbe2bf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -507,6 +507,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - 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)) ## 2026-07-05 From c5f905ccf1a32d2cfe73349df4371cee755e17b9 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 6 Jul 2026 14:18:09 -0400 Subject: [PATCH 010/161] cliproxyapi: point setup message at /management.html (#15628) The completion message previously pointed to the bare host:port, which serves the proxy API rather than the admin UI. Provider authentication happens at /management.html. Co-authored-by: root --- ct/cliproxyapi.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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}" From 87ccf49dc32f47a9e843e1fb1768cce455b71bb0 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 18:18:31 +0000 Subject: [PATCH 011/161] Update CHANGELOG.md (#15629) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bdbe2bf7..c6fdda187 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -510,6 +510,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - 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)) + ## 2026-07-05 ### 🆕 New Scripts From fe7de5e26cec5587f27e1b33b23d0ca4f6d6ab33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 6 Jul 2026 20:18:45 +0200 Subject: [PATCH 012/161] Update URL format in rustdeskserver.sh (#15626) --- ct/rustdeskserver.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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}" From e00df4fd6e3cd4d8f62fe290ff5d738b9e5c4279 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 18:18:57 +0000 Subject: [PATCH 013/161] Update CHANGELOG.md (#15630) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6fdda187..c67f8c59a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -507,6 +507,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - 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)) From 0102d5bd83e79970f73241072be8b36aebe8151b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 6 Jul 2026 21:15:04 +0200 Subject: [PATCH 015/161] fix alignment in various ct end messages (#15632) --- ct/alpine-cinny.sh | 4 +- ct/apache-airflow.sh | 6 +- ct/authentik.sh | 120 ++++++++++++++++++++-------------------- ct/baserow.sh | 4 +- ct/bookorbit.sh | 4 +- ct/clickhouse.sh | 4 +- ct/cross-seed.sh | 2 +- ct/cyberchef.sh | 8 +-- ct/etherpad.sh | 4 +- ct/excalidash.sh | 4 +- ct/feishin.sh | 4 +- ct/flame.sh | 6 +- ct/fmd-server.sh | 4 +- ct/hev-socks5-server.sh | 3 +- ct/iventoy.sh | 4 +- ct/kiwix.sh | 8 +-- ct/koffan.sh | 4 +- ct/kometa.sh | 2 +- ct/loki.sh | 62 ++++++++++----------- ct/lyrionmusicserver.sh | 4 +- ct/matterjs-server.sh | 8 +-- ct/netbird.sh | 2 +- ct/paperclip.sh | 4 +- ct/pinchflat.sh | 4 +- ct/plane.sh | 12 ++-- ct/postiz.sh | 7 +-- ct/rackula.sh | 4 +- ct/shlink.sh | 2 +- ct/snapotter.sh | 4 +- ct/spliit.sh | 4 +- ct/tolgee.sh | 4 +- ct/twenty.sh | 9 ++- ct/xyops.sh | 4 +- 33 files changed, 163 insertions(+), 166 deletions(-) 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/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/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/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/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/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/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/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/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}" From 7a9726b1dda667f79bb83235b36979754588c1e4 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 19:15:29 +0000 Subject: [PATCH 016/161] Update CHANGELOG.md (#15633) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c67f8c59a..00a310fea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -503,7 +503,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 Updated Scripts - - Immich: Update libvips to 8.18.4 [@vhsdream](https://github.com/vhsdream) ([#15619](https://github.com/community-scripts/ProxmoxVE/pull/15619)) + - 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 From d9d724ce57bc7721b724187cb530b71e1b2659da Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 6 Jul 2026 23:27:42 +0200 Subject: [PATCH 017/161] Remove: FlowiseAI (#15624) --- ct/flowiseai.sh | 54 ------------------------------------ install/flowiseai-install.sh | 52 ---------------------------------- 2 files changed, 106 deletions(-) delete mode 100644 ct/flowiseai.sh delete mode 100644 install/flowiseai-install.sh 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/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 From 3143d25caa9eb55d89f2bcd51cde6eeec8a36be9 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 21:28:09 +0000 Subject: [PATCH 018/161] Update CHANGELOG.md (#15637) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00a310fea..237f4f130 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -516,6 +516,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - 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 From 2bf6c5e5da85d5208db396340bececa0e476000a Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 6 Jul 2026 17:28:48 -0400 Subject: [PATCH 019/161] Wizarr: Build JS and CSS static assets (#15634) --- ct/wizarr.sh | 34 ++++++++++++++++++++++++++-------- install/wizarr-install.sh | 12 ++++++++---- 2 files changed, 34 insertions(+), 12 deletions(-) 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/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 From a9d71b7d234f532843511e574337f9be030bfd91 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 21:29:10 +0000 Subject: [PATCH 020/161] Update CHANGELOG.md (#15638) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 237f4f130..420ba6fb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -508,6 +508,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 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)) From 87f2189cbb5b73c9c2204a292fd06efa465b0824 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 23:47:06 +0200 Subject: [PATCH 021/161] Update .app files (#15636) Co-authored-by: GitHub Actions --- ct/headers/flowiseai | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 ct/headers/flowiseai 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 @@ - ________ _ ___ ____ - / ____/ /___ _ __(_)_______ / | / _/ - / /_ / / __ \ | /| / / / ___/ _ \/ /| | / / - / __/ / / /_/ / |/ |/ / (__ ) __/ ___ |_/ / -/_/ /_/\____/|__/|__/_/____/\___/_/ |_/___/ - From 67e0c7e9f83fda92c2b5516626a495e90fe9536b Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Tue, 7 Jul 2026 22:45:52 +0200 Subject: [PATCH 022/161] Forgejo-Runner (#15046) --- ct/forgejo-runner.sh | 79 +++++++++++++++++++++ ct/headers/forgejo-runner | 6 ++ install/forgejo-runner-install.sh | 114 ++++++++++++++++++++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 ct/forgejo-runner.sh create mode 100644 ct/headers/forgejo-runner create mode 100644 install/forgejo-runner-install.sh 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/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/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 From e64f5a041d136545e9879d30e13cb360a0f98ba4 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 7 Jul 2026 20:46:17 +0000 Subject: [PATCH 023/161] Update CHANGELOG.md (#15644) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 420ba6fb2..2dabf3bbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -499,6 +499,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-07 + +### 🆕 New Scripts + + - Forgejo-Runner ([#15046](https://github.com/community-scripts/ProxmoxVE/pull/15046)) + ## 2026-07-06 ### 🚀 Updated Scripts From 6e55269d9fdab34fc774839e93903b383816e79b Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 8 Jul 2026 13:04:13 +0200 Subject: [PATCH 024/161] BabyBuddy: Harden update script (#15642) Ensure cleanup runs from `/opt/babybuddy` before deleting old files, add `--` to the removal command for safer argument handling, and run `manage.py makemigrations` before `migrate` so database updates are applied reliably during upgrades. --- ct/babybuddy.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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}" From a6a8651000b252c5f7a80fea5b6e3aa63475339b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 11:04:41 +0000 Subject: [PATCH 025/161] Update CHANGELOG.md (#15647) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dabf3bbe..6b39405fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -499,6 +499,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-08 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - BabyBuddy: Harden update script [@MickLesk](https://github.com/MickLesk) ([#15642](https://github.com/community-scripts/ProxmoxVE/pull/15642)) + ## 2026-07-07 ### 🆕 New Scripts From 11937bf5fa8bcb2631907389c301b36c7675db4f Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 8 Jul 2026 18:56:59 -0400 Subject: [PATCH 026/161] Opencloud: Bump version to 7.2.1 (#15655) --- ct/opencloud.sh | 2 +- install/opencloud-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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" From f1adfc32d30d85529412e80def20e23f0f1e856a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 22:57:24 +0000 Subject: [PATCH 027/161] Update CHANGELOG.md (#15657) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b39405fe..b5e9bda8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -505,6 +505,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 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 From bfab0dd034bd182034f1ffb05e45018ec9c85373 Mon Sep 17 00:00:00 2001 From: TowyTowy <85077986+TowyTowy@users.noreply.github.com> Date: Thu, 9 Jul 2026 03:28:40 +0200 Subject: [PATCH 028/161] fix(pihole): repair Unbound DNS-over-TLS (DoT) forwarding config (#15654) When the optional Unbound install is chosen with DoT forwarding, the script truncated (>) /etc/unbound/unbound.conf.d/pi-hole.conf and rewrote it starting with an indented "tls-cert-bundle:" option that has no "server:" section header. unbound-checkconf rejects this ("syntax error, is there no section start"), so "systemctl restart unbound" exits 1 and the install aborts (line 153). The overwrite also dropped the interface/port 5335 settings Pi-hole forwards to. Append (>>) the DoT additions to the existing recursive server block instead, under a proper "server:" section (unbound merges multiple server: clauses), so the tls-cert-bundle and forward-zone are valid and the resolver keeps listening on 127.0.0.1:5335. Recursive (non-DoT) mode is unchanged. Co-authored-by: Claude Fable 5 --- install/pihole-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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: "." From 25045ef344386fe5855ed2ea19c89f0d03e452b3 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 01:29:01 +0000 Subject: [PATCH 029/161] Update CHANGELOG.md (#15659) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5e9bda8c..25dc2426a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -499,6 +499,12 @@ 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 From 89b671880a752c0e7c8cba029bd12d9e4f200f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:53:04 +0200 Subject: [PATCH 030/161] Endurain: Fix update procedure (#15674) * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * Fixed update procedure * ups --------- Co-authored-by: community-scripts-pr-app[bot] <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] --- ct/endurain.sh | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/ct/endurain.sh b/ct/endurain.sh index 934532aea..cdfd6eb0a 100644 --- a/ct/endurain.sh +++ b/ct/endurain.sh @@ -34,31 +34,22 @@ function update_script() { systemctl stop endurain msg_ok "Stopped Service" - msg_info "Creating Backup" - cp /opt/endurain/.env /opt/endurain.env - cp /opt/endurain/frontend/dist/env.js /opt/endurain.env.js - msg_ok "Created Backup" - + create_backup /opt/endurain/.env /opt/endurain/frontend/dist/env.js CLEAN_INSTALL=1 fetch_and_deploy_codeberg_release "endurain" "endurain-project/endurain" "tarball" "latest" "/opt/endurain" msg_info "Preparing Update" cd /opt/endurain - rm -rf \ - /opt/endurain/{docs,example.env,screenshot_01.png} \ - /opt/endurain/docker* \ - /opt/endurain/*.yml - cp /opt/endurain.env /opt/endurain/.env - rm /opt/endurain.env + rm -rf /opt/endurain/{docs,example.env,screenshot_01.png} /opt/endurain/docker* /opt/endurain/*.yml msg_ok "Prepared Update" msg_info "Updating Frontend" cd /opt/endurain/frontend $STD npm ci $STD npm run build - cp /opt/endurain.env.js /opt/endurain/frontend/dist/env.js - rm /opt/endurain.env.js msg_ok "Updated Frontend" + restore_backup + msg_info "Updating Backend" cd /opt/endurain/backend UV_VERSION=$(grep -Po 'required-version\s*=\s*"\K[^"]+' pyproject.toml 2>/dev/null || echo "0.11.18") From f1e952005ebcef591859b4d04686b72fe984e92d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 08:53:34 +0000 Subject: [PATCH 031/161] Update CHANGELOG.md (#15678) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25dc2426a..62e82d39c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -499,6 +499,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-10 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Endurain: Fix update procedure [@tremor021](https://github.com/tremor021) ([#15674](https://github.com/community-scripts/ProxmoxVE/pull/15674)) + ## 2026-07-09 ### 🚀 Updated Scripts From 6716d8de842c5a0507f08c111f6d3c9a7bc11729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:53:51 +0200 Subject: [PATCH 032/161] Fireshare: Fix for install and upgrade to v1.7.3 (#15673) * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * Fix install and upgrade to v1.7.3 --------- Co-authored-by: community-scripts-pr-app[bot] <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] --- ct/fireshare.sh | 21 ++++++++++++++------- install/fireshare-install.sh | 3 +++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ct/fireshare.sh b/ct/fireshare.sh index 296cb6c01..f10be013b 100644 --- a/ct/fireshare.sh +++ b/ct/fireshare.sh @@ -35,12 +35,22 @@ function update_script() { systemctl stop fireshare msg_ok "Stopped Service" - mv /opt/fireshare/fireshare.env /opt + create_backup /opt/fireshare/fireshare.env CLEAN_INSTALL=1 fetch_and_deploy_gh_release "fireshare" "ShaneIsrael/fireshare" "tarball" - mv /opt/fireshare.env /opt/fireshare + restore_backup rm -f /usr/local/bin/fireshare - msg_info "Updating Fireshare" + if ! grep -q "__FIRESHARE_PORT__" /etc/nginx/nginx.conf; then + cp /opt/fireshare/app/nginx/prod.conf /etc/nginx/nginx.conf + sed -i 's|root /processed/|root /opt/fireshare-processed/|g' /etc/nginx/nginx.conf + sed -i 's/^user[[:space:]]\+nginx;/user root;/' /etc/nginx/nginx.conf + sed -i 's|root[[:space:]]\+/app/build;|root /opt/fireshare/app/client/build;|' /etc/nginx/nginx.conf + sed -i 's/__FIRESHARE_PORT__/80/g' /etc/nginx/nginx.conf + cp /opt/fireshare/app/nginx/error.html /etc/nginx/ + cp /opt/fireshare/app/nginx/api_unavailable.html /etc/nginx/ + fi + msg_info "Configuring Fireshare" + cd /opt/fireshare $STD uv venv --clear $STD .venv/bin/python -m ensurepip --upgrade @@ -53,13 +63,10 @@ function update_script() { export VIDEO_DIRECTORY=/opt/fireshare-videos export PROCESSED_DIRECTORY=/opt/fireshare-processed $STD uv run flask db upgrade - - msg_info "Building Fireshare Client" cd /opt/fireshare/app/client $STD npm install $STD npm run build - msg_ok "Built Fireshare Client" - msg_ok "Updated Fireshare" + msg_ok "Configured Fireshare" msg_info "Starting Service" systemctl start fireshare diff --git a/install/fireshare-install.sh b/install/fireshare-install.sh index 982679c6e..311ba230b 100644 --- a/install/fireshare-install.sh +++ b/install/fireshare-install.sh @@ -141,6 +141,9 @@ cp /opt/fireshare/app/nginx/prod.conf /etc/nginx/nginx.conf sed -i 's|root /processed/|root /opt/fireshare-processed/|g' /etc/nginx/nginx.conf sed -i 's/^user[[:space:]]\+nginx;/user root;/' /etc/nginx/nginx.conf sed -i 's|root[[:space:]]\+/app/build;|root /opt/fireshare/app/client/build;|' /etc/nginx/nginx.conf +sed -i 's/__FIRESHARE_PORT__/80/g' /etc/nginx/nginx.conf +cp /opt/fireshare/app/nginx/error.html /etc/nginx/ +cp /opt/fireshare/app/nginx/api_unavailable.html /etc/nginx/ systemctl start nginx cat <~/fireshare.creds From 11139aede74cf8c4aa648a8c8a0ac1bf47270d90 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 08:54:13 +0000 Subject: [PATCH 033/161] Update CHANGELOG.md (#15679) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62e82d39c..d6e442727 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -505,6 +505,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - Fireshare: Fix for install and upgrade to v1.7.3 [@tremor021](https://github.com/tremor021) ([#15673](https://github.com/community-scripts/ProxmoxVE/pull/15673)) - Endurain: Fix update procedure [@tremor021](https://github.com/tremor021) ([#15674](https://github.com/community-scripts/ProxmoxVE/pull/15674)) ## 2026-07-09 From 2e4558e2628c3038b8d32cd44d84d50feaa4d41b Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:57:27 +0200 Subject: [PATCH 034/161] Squid (#15605) * Add squid (ct) * Update ct/squid.sh * Simplify squid.sh by removing proxy user instructions Removed instructions for adding a proxy user inside the container. --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: Sam Heinz Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com> --- ct/headers/squid | 6 +++ ct/squid.sh | 53 ++++++++++++++++++++++++ install/squid-install.sh | 88 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 ct/headers/squid create mode 100644 ct/squid.sh create mode 100644 install/squid-install.sh diff --git a/ct/headers/squid b/ct/headers/squid new file mode 100644 index 000000000..3d826ef75 --- /dev/null +++ b/ct/headers/squid @@ -0,0 +1,6 @@ + _____ _ __ + / ___/____ ___ __(_)___/ / + \__ \/ __ `/ / / / / __ / + ___/ / /_/ / /_/ / / /_/ / +/____/\__, /\__,_/_/\__,_/ + /_/ diff --git a/ct/squid.sh b/ct/squid.sh new file mode 100644 index 000000000..1698fc395 --- /dev/null +++ b/ct/squid.sh @@ -0,0 +1,53 @@ +#!/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: 007hacky007 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.squid-cache.org/ + +APP="Squid" +var_tags="${var_tags:-proxy}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-4}" +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/squid/squid.conf ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating Squid" + $STD apt update + $STD apt upgrade -y + msg_ok "Updated Squid" + + msg_info "Validating Squid Configuration" + $STD squid -k parse + msg_ok "Validated Squid Configuration" + + msg_info "Restarting Squid" + systemctl restart squid + msg_ok "Restarted Squid" + 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} Proxy endpoint:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}${IP}:3128${CL}" diff --git a/install/squid-install.sh b/install/squid-install.sh new file mode 100644 index 000000000..aa0110820 --- /dev/null +++ b/install/squid-install.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: 007hacky007 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://www.squid-cache.org/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Configuring Squid" +mkdir -p /etc/squid +cat </etc/squid/squid.conf +acl localnet src 0.0.0.1-0.255.255.255 +acl localnet src 10.0.0.0/8 +acl localnet src 100.64.0.0/10 +acl localnet src 169.254.0.0/16 +acl localnet src 172.16.0.0/12 +acl localnet src 192.168.0.0/16 +acl localnet src fc00::/7 +acl localnet src fe80::/10 + +acl SSL_ports port 443 +acl Safe_ports port 80 +acl Safe_ports port 21 +acl Safe_ports port 443 +acl Safe_ports port 70 +acl Safe_ports port 210 +acl Safe_ports port 1025-65535 +acl Safe_ports port 280 +acl Safe_ports port 488 +acl Safe_ports port 591 +acl Safe_ports port 777 +acl CONNECT method CONNECT + +http_access deny !Safe_ports +http_access deny CONNECT !SSL_ports +http_access allow localhost manager +http_access deny manager + +auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwords +auth_param basic realm proxy +acl authenticated proxy_auth REQUIRED +http_access allow authenticated +http_access deny all + +http_port 3128 + +coredump_dir /var/spool/squid + +refresh_pattern ^ftp: 1440 20% 10080 +refresh_pattern ^gopher: 1440 0% 1440 +refresh_pattern -i (/cgi-bin/|\\?) 0 0% 0 +refresh_pattern . 0 20% 4320 + +# Privacy / hardening +httpd_suppress_version_string on +visible_hostname $(hostname) +forwarded_for delete +request_header_access X-Forwarded-For deny all +EOF +msg_ok "Configured Squid" + +msg_info "Installing Dependencies" +$STD apt install -y \ + squid \ + apache2-utils +msg_ok "Installed Dependencies" + +msg_info "Configuring Squid Authentication" +touch /etc/squid/passwords +chown proxy:proxy /etc/squid/passwords +chmod 640 /etc/squid/passwords +$STD squid -k parse +msg_ok "Configured Squid Authentication" + +msg_info "Starting Service" +systemctl enable -q --now squid +msg_ok "Started Service" + +motd_ssh +customize +cleanup_lxc From f4e0111ac0236580d5fb78e51922e7a5dcf5bc08 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 08:57:54 +0000 Subject: [PATCH 035/161] Update CHANGELOG.md (#15680) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6e442727..e4c01f33b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -501,6 +501,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-10 +### 🆕 New Scripts + + - Squid ([#15605](https://github.com/community-scripts/ProxmoxVE/pull/15605)) + ### 🚀 Updated Scripts - #### 🐞 Bug Fixes From 92c4fb45a9e36899b4cbddffe4b3680f63ff775e Mon Sep 17 00:00:00 2001 From: wollew Date: Fri, 10 Jul 2026 20:47:58 +0200 Subject: [PATCH 036/161] Adapt to new artifact filename format for pocket id (#15689) * Adapt to new artifact filename format for pocket id * adapt pocket id install to new artifact filename format as well --- ct/pocketid.sh | 2 +- install/pocketid-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/pocketid.sh b/ct/pocketid.sh index 6153b40c0..9ffc54426 100755 --- a/ct/pocketid.sh +++ b/ct/pocketid.sh @@ -71,7 +71,7 @@ function update_script() { cp /opt/pocket-id/.env /opt/env fi - fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-$(arch_resolve)" + fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id_linux_$(arch_resolve)" mv /opt/env /opt/pocket-id/.env msg_info "Starting Service" diff --git a/install/pocketid-install.sh b/install/pocketid-install.sh index 47f945d3b..11b8fa591 100644 --- a/install/pocketid-install.sh +++ b/install/pocketid-install.sh @@ -14,7 +14,7 @@ network_check update_os read -r -p "${TAB3}What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url -fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-$(arch_resolve)" +fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id_linux_$(arch_resolve)" msg_info "Configuring Pocket ID" ENCRYPTION_KEY=$(openssl rand -base64 32) From b958252441893470e356cfc0e5073957c5552030 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 18:48:25 +0000 Subject: [PATCH 037/161] Update CHANGELOG.md (#15692) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4c01f33b..67c3be7b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -509,6 +509,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - Adapt to new artifact filename format for pocket id [@wollew](https://github.com/wollew) ([#15689](https://github.com/community-scripts/ProxmoxVE/pull/15689)) - Fireshare: Fix for install and upgrade to v1.7.3 [@tremor021](https://github.com/tremor021) ([#15673](https://github.com/community-scripts/ProxmoxVE/pull/15673)) - Endurain: Fix update procedure [@tremor021](https://github.com/tremor021) ([#15674](https://github.com/community-scripts/ProxmoxVE/pull/15674)) From 98bedb6ccd7a0cb3f9424989b364e835ca0f0249 Mon Sep 17 00:00:00 2001 From: pumrum Date: Sat, 11 Jul 2026 04:48:55 -0400 Subject: [PATCH 038/161] Fix spacing on VLAN Input Box in haos-vm.sh (#15696) --- vm/haos-vm.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/haos-vm.sh b/vm/haos-vm.sh index 85d582170..df5189614 100644 --- a/vm/haos-vm.sh +++ b/vm/haos-vm.sh @@ -475,7 +475,7 @@ function advanced_settings() { done while true; do - if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan (leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z "$VLAN1" ]; then VLAN1="Default" VLAN="" From f137f8c8942e552693a0f2f9f2bdfcb56735e85a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 08:49:21 +0000 Subject: [PATCH 039/161] Update CHANGELOG.md (#15699) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67c3be7b4..ab1e165fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -499,6 +499,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-11 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Fix spacing on VLAN Input Box in haos-vm.sh [@pumrum](https://github.com/pumrum) ([#15696](https://github.com/community-scripts/ProxmoxVE/pull/15696)) + ## 2026-07-10 ### 🆕 New Scripts From 618d578c353149798079c19720f1b0478fc085ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Sat, 11 Jul 2026 20:00:29 +0200 Subject: [PATCH 040/161] [tools.func]: Add function to handle deployment via GitLab release tags (#15641) * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * Update CHANGELOG.md (#15631) Co-authored-by: github-actions[bot] * add gl tag handling funcs --------- Co-authored-by: community-scripts-pr-app[bot] <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] --- misc/tools.func | 193 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) diff --git a/misc/tools.func b/misc/tools.func index e8e18f4f3..9360535a3 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -2559,6 +2559,199 @@ fetch_and_deploy_gh_tag() { return 0 } +# ------------------------------------------------------------------------------ +# Get the latest GitLab repository tag matching a glob pattern. +# +# Description: +# - Queries the GitLab repository tags API (up to 100 tags per page) +# - Filters tag names against a shell glob pattern (e.g. "web-v*" or "mobile-v*") +# - Always excludes pre-release tags (those containing alpha, beta, or rc) +# - Sorts matching tags with `sort -V` and returns the highest one +# - Supports GITLAB_TOKEN for private/rate-limited projects +# +# Usage: +# get_latest_gl_tag "owner/repo" "web-v*" +# get_latest_gl_tag "owner/repo" "mobile-v*" +# get_latest_gl_tag "owner/repo" # returns newest tag (no filter) +# +# Arguments: +# $1 - GitLab repo path (namespace/project, e.g. "mygroup/myapp") +# $2 - Optional glob pattern to filter tag names (e.g. "web-v*") +# +# Returns: +# Latest matching tag name on stdout, or non-zero on failure +# ------------------------------------------------------------------------------ +get_latest_gl_tag() { + local repo="$1" + local pattern="${2:-}" + + local repo_encoded + repo_encoded=$(printf '%s' "$repo" | sed 's|/|%2F|g') + + local api_base="https://gitlab.com/api/v4/projects/${repo_encoded}/repository/tags" + local api_timeout="--connect-timeout 10 --max-time 60" + + local header=() + [[ -n "${GITLAB_TOKEN:-}" ]] && header=(-H "PRIVATE-TOKEN: $GITLAB_TOKEN") + + # If a pattern is given, pass it as a regex search to reduce server-side results. + # GitLab ?search= supports anchored regex; convert leading glob prefix to regex anchor. + local search_param="" + if [[ -n "$pattern" ]]; then + # Strip trailing wildcard for the search hint (server-side prefix filter). + local prefix="${pattern%%\**}" + [[ -n "$prefix" ]] && search_param="?search=^${prefix}&per_page=100" || search_param="?per_page=100" + else + search_param="?per_page=100" + fi + + local temp_file + temp_file=$(mktemp) || return 1 + + local http_code + http_code=$(curl $api_timeout -sSL -w "%{http_code}" -o "$temp_file" \ + "${header[@]}" "${api_base}${search_param}" 2>/dev/null) || true + + if [[ "$http_code" != "200" ]]; then + rm -f "$temp_file" + msg_error "GitLab tags API returned HTTP $http_code for $repo" + return 22 + fi + + local tag="" + if [[ -n "$pattern" ]]; then + # Client-side glob filter + pre-release exclusion, then version-sort to pick the highest match. + tag=$(jq -r '.[].name' "$temp_file" 2>/dev/null | while IFS= read -r t; do + case "$t" in + *alpha* | *beta* | *rc*) continue ;; + $pattern) echo "$t" ;; + esac + done | sort -V | tail -n1) + else + # No pattern: skip pre-release tags, take the first remaining (newest) one. + tag=$(jq -r '.[].name' "$temp_file" 2>/dev/null | + grep -Eiv '(alpha|beta|rc)' | + head -n1) + fi + + rm -f "$temp_file" + + if [[ -z "$tag" ]]; then + msg_error "No tags matching '${pattern:-*}' found for ${repo}" + return 250 + fi + + echo "$tag" +} + +# ------------------------------------------------------------------------------ +# Fetches and deploys a GitLab tag-based source tarball. +# +# Description: +# - Resolves the latest tag matching the given glob pattern via get_latest_gl_tag +# (or uses the exact tag if one is provided instead of "latest") +# - Downloads the GitLab source tarball for that tag +# - Extracts it to the target directory +# - Writes the resolved tag to ~/. for update-checking +# +# Usage: +# fetch_and_deploy_gl_tag "myapp" "mygroup/myrepo" "web-v*" +# fetch_and_deploy_gl_tag "myapp" "mygroup/myrepo" "mobile-v*" "/opt/myapp" +# fetch_and_deploy_gl_tag "myapp" "mygroup/myrepo" "v*" # any v-tag +# fetch_and_deploy_gl_tag "myapp" "mygroup/myrepo" "web-v3.0*" # narrow version range +# +# Arguments: +# $1 - App name (used for version file ~/. and lowercase tarball name) +# $2 - GitLab repo path (namespace/project, e.g. "mygroup/myapp") +# $3 - Tag pattern: glob (e.g. "web-v*") or exact tag (e.g. "web-v3.0.0"). +# Use "latest" to fetch the single newest tag with no pattern filter. +# $4 - Target directory (default: /opt/$app) +# +# Notes: +# - Supports CLEAN_INSTALL=1 to wipe target before extracting +# - Supports GITLAB_TOKEN for private/rate-limited projects +# - For repos that only publish tags, not formal GitLab Releases +# (use fetch_and_deploy_gl_release for proper Releases with assets) +# ------------------------------------------------------------------------------ +fetch_and_deploy_gl_tag() { + local app="$1" + local repo="$2" + local tag_pattern="${3:-latest}" + local target="${4:-/opt/$app}" + + local app_lc="" + app_lc="$(echo "${app,,}" | tr -d ' ')" + local version_file="$HOME/.${app_lc}" + + local api_timeout="--connect-timeout 10 --max-time 60" + local download_timeout="--connect-timeout 15 --max-time 900" + + local header=() + [[ -n "${GITLAB_TOKEN:-}" ]] && header=(-H "PRIVATE-TOKEN: $GITLAB_TOKEN") + + # Resolve the tag: if caller passed a glob/latest, query the API. + # If caller passed an exact tag (no wildcards), use it directly. + local resolved_tag="$tag_pattern" + if [[ "$tag_pattern" == "latest" || "$tag_pattern" == *"*"* || "$tag_pattern" == *"?"* ]]; then + local glob_arg="" + [[ "$tag_pattern" != "latest" ]] && glob_arg="$tag_pattern" + resolved_tag=$(get_latest_gl_tag "$repo" "$glob_arg") || { + msg_error "Failed to determine latest tag matching '${tag_pattern}' for ${repo}" + return 250 + } + fi + + local current_version="" + [[ -f "$version_file" ]] && current_version=$(<"$version_file") + + if [[ "$current_version" == "$resolved_tag" ]]; then + msg_ok "$app is already up-to-date ($resolved_tag)" + return 0 + fi + + local repo_encoded + repo_encoded=$(printf '%s' "$repo" | sed 's|/|%2F|g') + + # GitLab source tarball URL (no release needed, works for any tag). + local version_safe="${resolved_tag//\//-}" + local tarball_url="https://gitlab.com/${repo}/-/archive/${resolved_tag}/${app_lc}-${version_safe}.tar.gz" + + local tmpdir + tmpdir=$(mktemp -d) || return 1 + local filename="${app_lc}-${version_safe}.tar.gz" + + msg_info "Fetching GitLab tag: ${app} (${resolved_tag})" + + curl $download_timeout -fsSL "${header[@]}" -o "$tmpdir/$filename" "$tarball_url" || { + msg_error "Download failed: $tarball_url" + rm -rf "$tmpdir" + return 7 + } + + mkdir -p "$target" + if [[ "${CLEAN_INSTALL:-0}" == "1" ]]; then + rm -rf "${target:?}/"* + fi + + tar --no-same-owner -xzf "$tmpdir/$filename" -C "$tmpdir" || { + msg_error "Failed to extract tarball" + rm -rf "$tmpdir" + return 251 + } + + local unpack_dir + unpack_dir=$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d | head -n1) + + shopt -s dotglob nullglob + cp -r "$unpack_dir"/* "$target/" + shopt -u dotglob nullglob + + rm -rf "$tmpdir" + echo "$resolved_tag" >"$version_file" + msg_ok "Deployed ${app} ${resolved_tag} to ${target}" + return 0 +} + # ------------------------------------------------------------------------------ # Checks for new GitHub tag (for repos without releases). # From 0906341e95a151b19095ddf130251f0ef632e053 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 20:00:36 +0200 Subject: [PATCH 041/161] LocalAGI (#15687) * Add localagi (ct) * Refactor localagi.sh for better readability Removed unnecessary blank lines and improved script readability. --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com> --- ct/headers/localagi | 6 +++ ct/localagi.sh | 67 +++++++++++++++++++++++++++++++++ install/localagi-install.sh | 75 +++++++++++++++++++++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 ct/headers/localagi create mode 100644 ct/localagi.sh create mode 100644 install/localagi-install.sh diff --git a/ct/headers/localagi b/ct/headers/localagi new file mode 100644 index 000000000..c47da9aac --- /dev/null +++ b/ct/headers/localagi @@ -0,0 +1,6 @@ + __ _____ __________ + / / ____ _________ _/ / | / ____/ _/ + / / / __ \/ ___/ __ `/ / /| |/ / __ / / + / /___/ /_/ / /__/ /_/ / / ___ / /_/ // / +/_____/\____/\___/\__,_/_/_/ |_\____/___/ + diff --git a/ct/localagi.sh b/ct/localagi.sh new file mode 100644 index 000000000..b2f9fbe91 --- /dev/null +++ b/ct/localagi.sh @@ -0,0 +1,67 @@ +#!/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: BillyOutlast +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/mudler/LocalAGI + +APP="LocalAGI" +var_tags="${var_tags:-ai}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-4096}" +var_disk="${var_disk:-20}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" +var_unprivileged="${var_unprivileged:-1}" +var_gpu="${var_gpu:-no}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/localagi ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "localagi" "mudler/LocalAGI"; then + msg_info "Stopping Service" + systemctl stop localagi + msg_ok "Stopped Service" + + create_backup /opt/localagi/.env + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "localagi" "mudler/LocalAGI" "tarball" "latest" "/opt/localagi" + restore_backup + + msg_info "Building LocalAGI" + cd /opt/localagi/webui/react-ui + $STD bun install + $STD bun run build + cd /opt/localagi + $STD go build -o /usr/local/bin/localagi + msg_ok "Updated LocalAGI successfully" + + msg_info "Starting Service" + systemctl start localagi + msg_ok "Started Service" + msg_ok "Updated successfully!" + exit + fi + exit +} + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/install/localagi-install.sh b/install/localagi-install.sh new file mode 100644 index 000000000..3589d1b8b --- /dev/null +++ b/install/localagi-install.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: BillyOutlast +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/mudler/LocalAGI + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +APP="LocalAGI" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt install -y build-essential +msg_ok "Installed Dependencies" + +NODE_VERSION="24" setup_nodejs +setup_go + +msg_info "Installing Bun" +export BUN_INSTALL="/root/.bun" +curl -fsSL https://bun.sh/install | $STD bash +ln -sf /root/.bun/bin/bun /usr/local/bin/bun +ln -sf /root/.bun/bin/bunx /usr/local/bin/bunx +msg_ok "Installed Bun" + +fetch_and_deploy_gh_release "localagi" "mudler/LocalAGI" "tarball" "latest" "/opt/localagi" + +msg_info "Configuring LocalAGI" +mkdir -p /opt/localagi/pool +cat <<'EOF' >/opt/localagi/.env +LOCALAGI_MODEL=gemma-3-4b-it-qat +LOCALAGI_MULTIMODAL_MODEL=moondream2-20250414 +LOCALAGI_IMAGE_MODEL=sd-1.5-ggml +LOCALAGI_LLM_API_URL=http://127.0.0.1:11434/v1 +LOCALAGI_STATE_DIR=/opt/localagi/pool +EOF +msg_ok "Configured LocalAGI" + +msg_info "Setting up LocalAGI" +cd /opt/localagi/webui/react-ui +$STD bun install +$STD bun run build +cd /opt/localagi +$STD go build -o /usr/local/bin/localagi +msg_ok "Set up LocalAGI" + +msg_info "Creating LocalAGI systemd service" +cat </etc/systemd/system/localagi.service +[Unit] +Description=LocalAGI +After=network.target + +[Service] +User=root +Type=simple +EnvironmentFile=/opt/localagi/.env + +WorkingDirectory=/opt/localagi +ExecStart=/usr/local/bin/localagi +Restart=on-failure + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now localagi +msg_ok "Created LocalAGI systemd service" + +motd_ssh +customize +cleanup_lxc From ed9c80f8053f66520b9469225d312a060d2753cf Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 18:00:51 +0000 Subject: [PATCH 042/161] Update CHANGELOG.md (#15707) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab1e165fa..a2bb24f91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -501,12 +501,22 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-11 +### 🆕 New Scripts + + - LocalAGI ([#15687](https://github.com/community-scripts/ProxmoxVE/pull/15687)) + ### 🚀 Updated Scripts - #### 🐞 Bug Fixes - Fix spacing on VLAN Input Box in haos-vm.sh [@pumrum](https://github.com/pumrum) ([#15696](https://github.com/community-scripts/ProxmoxVE/pull/15696)) +### 💾 Core + + - #### ✨ New Features + + - [tools.func]: Add function to handle deployment via GitLab release tags [@tremor021](https://github.com/tremor021) ([#15641](https://github.com/community-scripts/ProxmoxVE/pull/15641)) + ## 2026-07-10 ### 🆕 New Scripts From f1b2bd048600228d0108d5f3fc1b32fce672a656 Mon Sep 17 00:00:00 2001 From: TowyTowy <85077986+TowyTowy@users.noreply.github.com> Date: Sat, 11 Jul 2026 20:07:05 +0200 Subject: [PATCH 044/161] fix(adventurelog): allow pnpm build scripts so install/update doesn't abort (#15681) AdventureLog's frontend install runs a bare `pnpm i`. On pnpm v10+, build scripts of dependencies (esbuild, es5-ext, svelte-preprocess) are ignored by default and pnpm aborts with ERR_PNPM_IGNORED_BUILDS (exit 1), so the install never reaches `pnpm build`. The shipped frontend/pnpm-workspace.yaml already pins esbuild, so those builds are expected to run. Enable the builds for this app only by appending `dangerouslyAllowAllBuilds: true` to the frontend's pnpm-workspace.yaml before `pnpm i`, in both the install and update paths. The change is guarded so it is not duplicated on re-run, and it is scoped to AdventureLog (which ships no onlyBuiltDependencies) to avoid the global config conflict that a repo-wide setting would cause. Fixes #15670 Co-authored-by: Claude Fable 5 --- ct/adventurelog.sh | 1 + install/adventurelog-install.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/ct/adventurelog.sh b/ct/adventurelog.sh index 0da4c09c0..98327747e 100644 --- a/ct/adventurelog.sh +++ b/ct/adventurelog.sh @@ -60,6 +60,7 @@ function update_script() { $STD .venv/bin/python -m manage migrate cd /opt/adventurelog/frontend + grep -q "^dangerouslyAllowAllBuilds:" ./pnpm-workspace.yaml 2>/dev/null || echo "dangerouslyAllowAllBuilds: true" >>./pnpm-workspace.yaml $STD pnpm i $STD pnpm build msg_ok "Updated AdventureLog" diff --git a/install/adventurelog-install.sh b/install/adventurelog-install.sh index 10e664bc6..b480da0d9 100644 --- a/install/adventurelog-install.sh +++ b/install/adventurelog-install.sh @@ -72,6 +72,7 @@ BODY_SIZE_LIMIT=Infinity ORIGIN='http://$LOCAL_IP:3000' EOF cd /opt/adventurelog/frontend +grep -q "^dangerouslyAllowAllBuilds:" ./pnpm-workspace.yaml 2>/dev/null || echo "dangerouslyAllowAllBuilds: true" >>./pnpm-workspace.yaml $STD pnpm i $STD pnpm build msg_ok "Installed AdventureLog" From dcd1eefdd4d5051ce5e6d41fa00cbc9ab6ad52b3 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 18:07:32 +0000 Subject: [PATCH 045/161] Update CHANGELOG.md (#15709) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2bb24f91..707ec2a40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -507,6 +507,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 Updated Scripts + - fix(adventurelog): allow pnpm build scripts so install/update doesn't abort [@TowyTowy](https://github.com/TowyTowy) ([#15681](https://github.com/community-scripts/ProxmoxVE/pull/15681)) + - #### 🐞 Bug Fixes - Fix spacing on VLAN Input Box in haos-vm.sh [@pumrum](https://github.com/pumrum) ([#15696](https://github.com/community-scripts/ProxmoxVE/pull/15696)) From c481c3e24ee6cb91e7d98cb6ef9b517f8060c039 Mon Sep 17 00:00:00 2001 From: TowyTowy <85077986+TowyTowy@users.noreply.github.com> Date: Sat, 11 Jul 2026 22:15:12 +0200 Subject: [PATCH 046/161] fix(fileflows): install .NET 10 ASP.NET Core Runtime to match current release (#15702) * fix(fileflows): install .NET 10 ASP.NET Core Runtime to match current release FileFlows now ships its server/node binaries targeting .NET 10 (Microsoft.NETCore.App 10.0.0), but the install script still installs the ASP.NET Core Runtime 8.0. On a fresh install the app therefore cannot start: You must install or update .NET to run this application. Framework: 'Microsoft.NETCore.App', version '10.0.0' (x64) The following frameworks were found: 8.0.28 at [/usr/share/dotnet/shared/Microsoft.NETCore.App] so "dotnet FileFlows.Server.dll --systemd install" fails with exit code 150 (service failed to start) and the container aborts (issue #15686). Bump the runtime to 10.0 on both branches: aspnetcore-runtime-10.0 from packages.microsoft.com on amd64 (the same repo and package already used by igotify, rdtclient and technitiumdns) and dotnet-install --channel 10.0 on arm64. Co-Authored-By: Claude Fable 5 * fix(fileflows): ensure current .NET runtime on update too An existing install set up under an older .NET (e.g. aspnetcore-runtime-8.0) would download a newer FileFlows on update but keep the old runtime, failing to start with the same framework-not-found error. Mirror the runtime handling used by technitiumdns/rdtclient in update_script. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: Claude Fable 5 --- ct/fileflows.sh | 22 ++++++++++++++++++++++ install/fileflows-install.sh | 6 +++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/ct/fileflows.sh b/ct/fileflows.sh index 1f33d2dd0..473efd435 100644 --- a/ct/fileflows.sh +++ b/ct/fileflows.sh @@ -43,6 +43,28 @@ function update_script() { tar -czf "$backup_filename" -C /opt/fileflows Data msg_ok "Backup Created" + # FileFlows tracks the latest release, whose .NET target can move (e.g. 8 -> 10); + # ensure the current ASP.NET Core Runtime so an existing install doesn't fail to + # start after updating to a newer .NET major version. + msg_info "Ensuring ASP.NET Core Runtime" + if [[ "$(arch_resolve)" == "arm64" ]]; then + if [[ ! -x /usr/lib/dotnet10/dotnet ]]; then + curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh + $STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10 + ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet + rm -f /tmp/dotnet-install.sh + fi + elif ! is_package_installed "aspnetcore-runtime-10.0"; then + $STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true + setup_deb822_repo \ + "microsoft" \ + "https://packages.microsoft.com/keys/microsoft-2025.asc" \ + "https://packages.microsoft.com/debian/13/prod/" \ + "trixie" + $STD apt install -y aspnetcore-runtime-10.0 + fi + msg_ok "Ensured ASP.NET Core Runtime" + fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" msg_info "Starting Service" diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh index af93424b6..50242be8a 100644 --- a/install/fileflows-install.sh +++ b/install/fileflows-install.sh @@ -26,8 +26,8 @@ msg_info "Installing ASP.NET Core Runtime" if [[ "$(arch_resolve)" == "arm64" ]]; then # packages.microsoft.com only ships amd64 debs for Debian; use dotnet-install on arm64 curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh - $STD bash /tmp/dotnet-install.sh --channel 8.0 --runtime aspnetcore --install-dir /usr/lib/dotnet8 - ln -sf /usr/lib/dotnet8/dotnet /usr/bin/dotnet + $STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10 + ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet rm -f /tmp/dotnet-install.sh else setup_deb822_repo \ @@ -35,7 +35,7 @@ else "https://packages.microsoft.com/keys/microsoft-2025.asc" \ "https://packages.microsoft.com/debian/13/prod/" \ "trixie" - $STD apt install -y aspnetcore-runtime-8.0 + $STD apt install -y aspnetcore-runtime-10.0 fi msg_ok "Installed ASP.NET Core Runtime" From 8fbb4b1988e3fde4cdfdd684401dddc9096b8691 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 20:15:36 +0000 Subject: [PATCH 047/161] Update CHANGELOG.md (#15712) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 707ec2a40..c880c3861 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -511,6 +511,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - fix(fileflows): install .NET 10 ASP.NET Core Runtime to match current release [@TowyTowy](https://github.com/TowyTowy) ([#15702](https://github.com/community-scripts/ProxmoxVE/pull/15702)) - Fix spacing on VLAN Input Box in haos-vm.sh [@pumrum](https://github.com/pumrum) ([#15696](https://github.com/community-scripts/ProxmoxVE/pull/15696)) ### 💾 Core From 76335cefe8790b036249636b12920fb04c6ab254 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 12 Jul 2026 00:17:46 +0000 Subject: [PATCH 048/161] Archive old changelog entries (#15714) Co-authored-by: github-actions[bot] --- .github/changelogs/2026/07.md | 91 ++++++++++++++++++++++ CHANGELOG.md | 138 ++-------------------------------- 2 files changed, 96 insertions(+), 133 deletions(-) diff --git a/.github/changelogs/2026/07.md b/.github/changelogs/2026/07.md index 4c20ca3e6..2ecd58f89 100644 --- a/.github/changelogs/2026/07.md +++ b/.github/changelogs/2026/07.md @@ -1,3 +1,94 @@ +## 2026-07-11 + +### 🆕 New Scripts + + - LocalAGI ([#15687](https://github.com/community-scripts/ProxmoxVE/pull/15687)) + +### 🚀 Updated Scripts + + - fix(adventurelog): allow pnpm build scripts so install/update doesn't abort [@TowyTowy](https://github.com/TowyTowy) ([#15681](https://github.com/community-scripts/ProxmoxVE/pull/15681)) + + - #### 🐞 Bug Fixes + + - fix(fileflows): install .NET 10 ASP.NET Core Runtime to match current release [@TowyTowy](https://github.com/TowyTowy) ([#15702](https://github.com/community-scripts/ProxmoxVE/pull/15702)) + - Fix spacing on VLAN Input Box in haos-vm.sh [@pumrum](https://github.com/pumrum) ([#15696](https://github.com/community-scripts/ProxmoxVE/pull/15696)) + +### 💾 Core + + - #### ✨ New Features + + - [tools.func]: Add function to handle deployment via GitLab release tags [@tremor021](https://github.com/tremor021) ([#15641](https://github.com/community-scripts/ProxmoxVE/pull/15641)) + +## 2026-07-10 + +### 🆕 New Scripts + + - Squid ([#15605](https://github.com/community-scripts/ProxmoxVE/pull/15605)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Adapt to new artifact filename format for pocket id [@wollew](https://github.com/wollew) ([#15689](https://github.com/community-scripts/ProxmoxVE/pull/15689)) + - Fireshare: Fix for install and upgrade to v1.7.3 [@tremor021](https://github.com/tremor021) ([#15673](https://github.com/community-scripts/ProxmoxVE/pull/15673)) + - Endurain: Fix update procedure [@tremor021](https://github.com/tremor021) ([#15674](https://github.com/community-scripts/ProxmoxVE/pull/15674)) + +## 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 + + - excalidash ([#15604](https://github.com/community-scripts/ProxmoxVE/pull/15604)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - fix: homarr: cli [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15603](https://github.com/community-scripts/ProxmoxVE/pull/15603)) + - immich: vacuum smart_search/face_search before VectorChord bump [@irishpadres](https://github.com/irishpadres) ([#15607](https://github.com/community-scripts/ProxmoxVE/pull/15607)) + ## 2026-07-04 ### 🚀 Updated Scripts diff --git a/CHANGELOG.md b/CHANGELOG.md index c880c3861..8e1c5dcbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,9 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit + + + @@ -87,7 +90,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
-

July (4 entries)

+

July (11 entries)

[View July 2026 Changelog](.github/changelogs/2026/07.md) @@ -1104,135 +1107,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### ✨ New Features - - [core] Implement backup and restore functions [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15067](https://github.com/community-scripts/ProxmoxVE/pull/15067)) - -## 2026-06-11 - -### 🆕 New Scripts - - - Clickhouse ([#15045](https://github.com/community-scripts/ProxmoxVE/pull/15045)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Manyfold: add new dependency [@MickLesk](https://github.com/MickLesk) ([#15040](https://github.com/community-scripts/ProxmoxVE/pull/15040)) - - OpenArchiver: switch Rebuild Function [@MickLesk](https://github.com/MickLesk) ([#15042](https://github.com/community-scripts/ProxmoxVE/pull/15042)) - - CLIProxyAPI: Save management password to creds file [@tremor021](https://github.com/tremor021) ([#15051](https://github.com/community-scripts/ProxmoxVE/pull/15051)) - - Jotty: Fix wrong path test in config restore [@vhsdream](https://github.com/vhsdream) ([#15038](https://github.com/community-scripts/ProxmoxVE/pull/15038)) - - Fix for cross-seed after node upgrade [@TorinFrancis](https://github.com/TorinFrancis) ([#15025](https://github.com/community-scripts/ProxmoxVE/pull/15025)) - - - #### 🔧 Refactor - - - Alpine-Nextcloud: Upgrade PHP and dependencies in installation script [@MickLesk](https://github.com/MickLesk) ([#15039](https://github.com/community-scripts/ProxmoxVE/pull/15039)) - - [arm64] porting stage 1: set script arm64 statuses to yes [@asylumexp](https://github.com/asylumexp) ([#15052](https://github.com/community-scripts/ProxmoxVE/pull/15052)) - -### 💾 Core - - - #### ✨ New Features - - - misc scripts: add support for arm64 [@asylumexp](https://github.com/asylumexp) ([#12639](https://github.com/community-scripts/ProxmoxVE/pull/12639)) - - - #### 🔧 Refactor - - - [arm64] remove logic for custom debian arm64 template [@asylumexp](https://github.com/asylumexp) ([#15050](https://github.com/community-scripts/ProxmoxVE/pull/15050)) - -### 📚 Documentation - - - (github): Revise script request template [@MickLesk](https://github.com/MickLesk) ([#15058](https://github.com/community-scripts/ProxmoxVE/pull/15058)) - -## 2026-06-10 - -### 🆕 New Scripts - - - Baserow ([#14968](https://github.com/community-scripts/ProxmoxVE/pull/14968)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Koillection: Fix update procedure [@tremor021](https://github.com/tremor021) ([#15033](https://github.com/community-scripts/ProxmoxVE/pull/15033)) - -## 2026-06-09 - -### 🆕 New Scripts - - - paperclip ([#14990](https://github.com/community-scripts/ProxmoxVE/pull/14990)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - endurain: Install pytz package during backend setup [@MickLesk](https://github.com/MickLesk) ([#15014](https://github.com/community-scripts/ProxmoxVE/pull/15014)) - - - #### 🔧 Refactor - - - Refactor: Proxmox Backup Server - use deb822 [@MickLesk](https://github.com/MickLesk) ([#15013](https://github.com/community-scripts/ProxmoxVE/pull/15013)) - -## 2026-06-08 - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - security: Fix HTTP to HTTPS for all package and repository downloads [@MickLesk](https://github.com/MickLesk) ([#15009](https://github.com/community-scripts/ProxmoxVE/pull/15009)) - - homelable: preserve MCP server config across updates [@ferr079](https://github.com/ferr079) ([#14996](https://github.com/community-scripts/ProxmoxVE/pull/14996)) - - changedetection: migrate Python install to uv venv [@ferr079](https://github.com/ferr079) ([#14995](https://github.com/community-scripts/ProxmoxVE/pull/14995)) - - - #### 🔧 Refactor - - - Update Flowwiseai to node 24 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14999](https://github.com/community-scripts/ProxmoxVE/pull/14999)) - -### 🧰 Tools - - - #### 🐞 Bug Fixes - - - security: Fix MITM RCE vulnerability in microcode scripts (CVE) [@MickLesk](https://github.com/MickLesk) ([#15007](https://github.com/community-scripts/ProxmoxVE/pull/15007)) - -## 2026-06-07 - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Immich: use actual installed PostgreSQL version for vchord package [@MickLesk](https://github.com/MickLesk) ([#14989](https://github.com/community-scripts/ProxmoxVE/pull/14989)) - - - #### 🔧 Refactor - - - Navidrome: remove genereic filebrowser addon setup [@MickLesk](https://github.com/MickLesk) ([#14991](https://github.com/community-scripts/ProxmoxVE/pull/14991)) - -## 2026-06-06 - -### 🆕 New Scripts - - - Spliit ([#14966](https://github.com/community-scripts/ProxmoxVE/pull/14966)) -- Tolgee ([#14965](https://github.com/community-scripts/ProxmoxVE/pull/14965)) -- XYOps ([#14967](https://github.com/community-scripts/ProxmoxVE/pull/14967)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Photoprism: Allow env variables with spaces [@Badintral](https://github.com/Badintral) ([#14969](https://github.com/community-scripts/ProxmoxVE/pull/14969)) - -## 2026-06-05 - -### 🆕 New Scripts - - - MatterJS-Server ([#14951](https://github.com/community-scripts/ProxmoxVE/pull/14951)) -- CyberChef ([#14952](https://github.com/community-scripts/ProxmoxVE/pull/14952)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Jackett: Create missing .env file [@tremor021](https://github.com/tremor021) ([#14959](https://github.com/community-scripts/ProxmoxVE/pull/14959)) - - OpenThread-BR: use systemd instead of init.d [@tomfrenzel](https://github.com/tomfrenzel) ([#14942](https://github.com/community-scripts/ProxmoxVE/pull/14942)) - - - #### ✨ New Features - - - AMD IGPU support [@Learath](https://github.com/Learath) ([#14944](https://github.com/community-scripts/ProxmoxVE/pull/14944)) - - - #### 💥 Breaking Changes - - - update authentik to 2026.5.2 [@thieneret](https://github.com/thieneret) ([#14846](https://github.com/community-scripts/ProxmoxVE/pull/14846)) \ No newline at end of file + - [core] Implement backup and restore functions [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15067](https://github.com/community-scripts/ProxmoxVE/pull/15067)) \ No newline at end of file From 96100474cc54c6a0f64efbd0827c6c8ff7957fe4 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 12 Jul 2026 00:18:12 +0000 Subject: [PATCH 049/161] Update CHANGELOG.md (#15715) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e1c5dcbb..09c1e41bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -502,6 +502,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+## 2026-07-12 + ## 2026-07-11 ### 🆕 New Scripts From c0b2c906faf271b89a7e6a78e4bf7a8001ef4c9a Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 12 Jul 2026 11:48:43 -0400 Subject: [PATCH 050/161] Immich: Bump version to 3.0.2 (#15668) * Immich: Bump version to 3.0.2 * Bump vchord to 1.1.1 * Add MickLesk HEIC patch --- ct/immich.sh | 25 +++++++++++++++++++++++-- install/immich-install.sh | 25 +++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/ct/immich.sh b/ct/immich.sh index 48ae7ceda..1aa7e0546 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -110,7 +110,7 @@ EOF msg_ok "Image-processing libraries up to date" fi - RELEASE="v3.0.1" + RELEASE="v3.0.2" if check_for_gh_release "Immich" "immich-app/immich" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then if [[ $(cat ~/.immich) > "2.5.1" ]]; then msg_info "Enabling Maintenance Mode" @@ -124,7 +124,7 @@ EOF systemctl stop immich-web systemctl stop immich-ml msg_ok "Stopped Services" - VCHORD_RELEASE="1.0.0" + VCHORD_RELEASE="1.1.1" [[ -f ~/.vchord_version ]] && mv ~/.vchord_version ~/.vectorchord if check_for_gh_release "VectorChord" "tensorchord/VectorChord" "${VCHORD_RELEASE}" "updated together with Immich after testing"; then # dead tuples in smart_search/face_search make the REINDEX below fail with @@ -328,6 +328,27 @@ EOF systemctl daemon-reload fi + # MickLesk temporary patch for HEIC thumbnail gen + msg_info "Patching media.repository.js" + MEDIA_REPO_JS="/opt/immich/app/dist/repositories/media.repository.js" + if [[ -f "$MEDIA_REPO_JS" ]]; then + python3 - <<'PY' +from pathlib import Path +p = Path('/opt/immich/app/dist/repositories/media.repository.js') +s = p.read_text() +old = "(0, sharp_1.default)(input).metadata()" +new = "(0, sharp_1.default)(input, { unlimited: true, limitInputPixels: false }).metadata()" +if new in s: + print('hotfix already there') + elif old in s: + p.write_text(s.replace(old, new, 1)) + print('hotfix applied') + else: + print('pattern not found, skipped') +PY + fi + msg_ok "Patched media.repository.js" + # chown excluding upload dir contents (may be a mount with restricted permissions) chown immich:immich "$INSTALL_DIR" find "$INSTALL_DIR" -maxdepth 1 -mindepth 1 ! -name upload -exec chown -R immich:immich {} + diff --git a/install/immich-install.sh b/install/immich-install.sh index fcaad3e0b..2aa611c61 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -162,7 +162,7 @@ PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql ACTUAL_PG_VERSION=$(ls /etc/postgresql/ 2>/dev/null | sort -V | tail -1) ACTUAL_PG_VERSION=${ACTUAL_PG_VERSION:-16} -VCHORD_RELEASE="1.0.0" +VCHORD_RELEASE="1.1.1" fetch_and_deploy_gh_release "VectorChord" "tensorchord/VectorChord" "binary" "${VCHORD_RELEASE}" "/tmp" "postgresql-${ACTUAL_PG_VERSION}-vchord_*_$(arch_resolve).deb" sed -i "s/^#shared_preload.*/shared_preload_libraries = 'vchord.so'/" /etc/postgresql/${ACTUAL_PG_VERSION}/main/postgresql.conf @@ -311,7 +311,7 @@ ML_DIR="${APP_DIR}/machine-learning" GEO_DIR="${INSTALL_DIR}/geodata" mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache} -fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v3.0.1" "$SRC_DIR" +fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v3.0.2" "$SRC_DIR" PNPM_VERSION="$(jq -r '.packageManager | split("@")[1] | split("+")[0]' ${SRC_DIR}/package.json)" export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs @@ -437,6 +437,27 @@ cd "$INSTALL_DIR" ln -s "$GEO_DIR" "$APP_DIR" msg_ok "Installed GeoNames data" +# MickLesk temporary patch for HEIC thumbnail gen +msg_info "Patching media.repository.js" +MEDIA_REPO_JS="/opt/immich/app/dist/repositories/media.repository.js" +if [[ -f "$MEDIA_REPO_JS" ]]; then + python3 - <<'PY' +from pathlib import Path +p = Path('/opt/immich/app/dist/repositories/media.repository.js') +s = p.read_text() +old = "(0, sharp_1.default)(input).metadata()" +new = "(0, sharp_1.default)(input, { unlimited: true, limitInputPixels: false }).metadata()" +if new in s: + print('hotfix already there') +elif old in s: + p.write_text(s.replace(old, new, 1)) + print('hotfix applied') +else: + print('pattern not found, skipped') +PY +fi +msg_ok "Patched media.repository.js" + mkdir -p /var/log/immich touch /var/log/immich/{web.log,ml.log} msg_ok "Installed Immich" From 962c040f441383e70fb6089ba4bb7b3eb29ae0ba Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 12 Jul 2026 15:49:09 +0000 Subject: [PATCH 051/161] Update CHANGELOG.md (#15721) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09c1e41bd..029dc05ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,6 +504,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-12 +### 🚀 Updated Scripts + + - Immich: Bump version to 3.0.2 [@vhsdream](https://github.com/vhsdream) ([#15668](https://github.com/community-scripts/ProxmoxVE/pull/15668)) + ## 2026-07-11 ### 🆕 New Scripts From 48483c63b8cb9543ecec4fade1c98dec7838f223 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Jul 2026 18:24:19 +0200 Subject: [PATCH 052/161] fix(immich): correct Python indentation error in ct/immich.sh heredoc patch (#15723) * Initial plan * fix: correct Python indentation in immich heredoc patch (ct/immich.sh) --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> --- ct/immich.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/immich.sh b/ct/immich.sh index 1aa7e0546..fd3d60a94 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -340,10 +340,10 @@ old = "(0, sharp_1.default)(input).metadata()" new = "(0, sharp_1.default)(input, { unlimited: true, limitInputPixels: false }).metadata()" if new in s: print('hotfix already there') - elif old in s: +elif old in s: p.write_text(s.replace(old, new, 1)) print('hotfix applied') - else: +else: print('pattern not found, skipped') PY fi From 0a7bd0f37ed3a16235abd63054a2b5d204f2e47e Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 12 Jul 2026 16:24:42 +0000 Subject: [PATCH 053/161] Update CHANGELOG.md (#15724) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 029dc05ad..b3b0bf2fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -508,6 +508,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - Immich: Bump version to 3.0.2 [@vhsdream](https://github.com/vhsdream) ([#15668](https://github.com/community-scripts/ProxmoxVE/pull/15668)) +### ❔ Uncategorized + + - fix(immich): correct Python indentation error in ct/immich.sh heredoc patch [@Copilot](https://github.com/Copilot) ([#15723](https://github.com/community-scripts/ProxmoxVE/pull/15723)) + ## 2026-07-11 ### 🆕 New Scripts From f7fdf419b10b2fc4a5e55b0e153d433a3f6c431f Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Sun, 12 Jul 2026 23:22:39 +0200 Subject: [PATCH 054/161] AFFiNE (#15690) --- ct/affine.sh | 127 ++++++++++++++++++++++ ct/headers/affine | 6 ++ install/affine-install.sh | 215 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 348 insertions(+) create mode 100644 ct/affine.sh create mode 100644 ct/headers/affine create mode 100644 install/affine-install.sh diff --git a/ct/affine.sh b/ct/affine.sh new file mode 100644 index 000000000..ff8562073 --- /dev/null +++ b/ct/affine.sh @@ -0,0 +1,127 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/toeverything/AFFiNE + +APP="AFFiNE" +var_tags="${var_tags:-knowledge;notes;workspace}" +var_cpu="${var_cpu:-4}" +var_ram="${var_ram:-8192}" +var_disk="${var_disk:-20}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/affine ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "affine_app" "toeverything/AFFiNE"; then + msg_info "Stopping Services" + systemctl stop affine-web affine-worker + msg_ok "Stopped Services" + + create_backup /root/.affine/config /root/.affine/storage + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "latest" "/opt/affine" + + msg_info "Rebuilding Application (Patience)" + cd /opt/affine + source /root/.profile + export PATH="/root/.cargo/bin:/root/.rbenv/shims:$PATH" + + set -a && source /opt/affine/.env && set +a + + export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 + export VITE_CORE_COMMIT_SHA=$(cat ~/.affine_app) + + # Initialize git repo (required for build process) + $STD git init -q + $STD git config user.email "build@local" + $STD git config user.name "Build" + $STD git add -A + $STD git commit -q -m "update" + + # Force Turbo to run sequentially + mkdir -p /opt/affine/.turbo + cat </opt/affine/.turbo/config.json +{ + "concurrency": 1 +} +TURBO + + $STD corepack enable + $STD corepack prepare yarn@4.12.0 --activate + $STD yarn config set enableTelemetry 0 + + export NODE_OPTIONS="--max-old-space-size=2048" + $STD yarn install + $STD npm install -g typescript + + $STD yarn affine @affine/native build + $STD yarn affine @affine/server-native build + + # Create architecture-specific symlinks + ln -sf /opt/affine/packages/backend/native/server-native.node \ + /opt/affine/packages/backend/native/server-native.x64.node + ln -sf /opt/affine/packages/backend/native/server-native.node \ + /opt/affine/packages/backend/native/server-native.arm64.node + ln -sf /opt/affine/packages/backend/native/server-native.node \ + /opt/affine/packages/backend/native/server-native.armv7.node + + $STD yarn affine init + $STD yarn affine build -p @affine/reader + $STD yarn affine build -p @affine/server + + export NODE_OPTIONS="--max-old-space-size=4096" + $STD yarn affine build -p @affine/web + $STD yarn affine build -p @affine/admin + + # Copy web assets + mkdir -p /opt/affine/packages/backend/server/static + cp -r /opt/affine/packages/frontend/apps/web/dist/* /opt/affine/packages/backend/server/static/ + mkdir -p /opt/affine/packages/backend/server/static/admin + cp -r /opt/affine/packages/frontend/admin/dist/* /opt/affine/packages/backend/server/static/admin/ + + # Mobile manifest placeholder + mkdir -p /opt/affine/packages/backend/server/static/mobile + echo '{"publicPath":"/","js":[],"css":[],"gitHash":"","description":""}' \ + >/opt/affine/packages/backend/server/static/mobile/assets-manifest.json + + # Run migrations + cd /opt/affine/packages/backend/server + set -a && source /opt/affine/.env && set +a + $STD node ./scripts/self-host-predeploy.js + + restore_backup + + msg_info "Starting Services" + systemctl start affine-web affine-worker + msg_ok "Started Services" + msg_ok "Updated Successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3010/sign-in${CL}" diff --git a/ct/headers/affine b/ct/headers/affine new file mode 100644 index 000000000..0e1d759f0 --- /dev/null +++ b/ct/headers/affine @@ -0,0 +1,6 @@ + ___ _____________ _ ________ + / | / ____/ ____(_) | / / ____/ + / /| | / /_ / /_ / / |/ / __/ + / ___ |/ __/ / __/ / / /| / /___ +/_/ |_/_/ /_/ /_/_/ |_/_____/ + diff --git a/install/affine-install.sh b/install/affine-install.sh new file mode 100644 index 000000000..2e29234b6 --- /dev/null +++ b/install/affine-install.sh @@ -0,0 +1,215 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/toeverything/AFFiNE + +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 \ + git \ + pkg-config \ + openssl \ + libssl-dev \ + libjemalloc2 \ + redis-server \ + nginx +msg_ok "Installed Dependencies" + +PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql +PG_DB_NAME="affine" PG_DB_USER="affine" setup_postgresql_db +NODE_VERSION="22" setup_nodejs +setup_rust + +fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "latest" "/opt/affine" + +msg_info "Setting up Directories" +rm -rf /root/.affine +mkdir -p /root/.affine/{storage,config} +msg_ok "Set up Directories" + +msg_info "Configuring Environment" +SECRET_KEY=$(openssl rand -hex 32) +cat </opt/affine/.env +NODE_ENV=production +AFFINE_SERVER_PORT=3010 +AFFINE_SERVER_HOST=${LOCAL_IP} +AFFINE_SERVER_EXTERNAL_URL=http://${LOCAL_IP} +DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME} +REDIS_SERVER_HOST=localhost +REDIS_SERVER_PORT=6379 +AFFINE_INDEXER_ENABLED=false +SECRET_KEY=${SECRET_KEY} +EOF +msg_ok "Configured Environment" + +msg_info "Building AFFiNE (Patience)" +cd /opt/affine +source /root/.profile +export PATH="/root/.cargo/bin:$PATH" +export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 +export VITE_CORE_COMMIT_SHA=$(cat ~/.affine_app) +# # Initialize git repo (required for build process) +$STD git init -q +$STD git config user.email "build@local" +$STD git config user.name "Build" +$STD git add -A +$STD git commit -q -m "initial" +mkdir -p /opt/affine/.turbo +cat </opt/affine/.turbo/config.json +{ + "concurrency": 1 +} +TURBO +$STD corepack enable +$STD corepack prepare yarn@4.12.0 --activate +$STD yarn config set enableTelemetry 0 +export NODE_OPTIONS="--max-old-space-size=4096" +export TSC_COMPILE_ON_ERROR=true +$STD yarn install +$STD npm install -g typescript +$STD yarn affine @affine/native build +$STD yarn affine @affine/server-native build + +# Create architecture-specific symlinks for server-native +ln -sf /opt/affine/packages/backend/native/server-native.node \ + /opt/affine/packages/backend/native/server-native.x64.node +ln -sf /opt/affine/packages/backend/native/server-native.node \ + /opt/affine/packages/backend/native/server-native.arm64.node +ln -sf /opt/affine/packages/backend/native/server-native.node \ + /opt/affine/packages/backend/native/server-native.armv7.node + +$STD yarn affine init +$STD yarn affine build -p @affine/reader +$STD yarn affine build -p @affine/server +export NODE_OPTIONS="--max-old-space-size=4096" +$STD yarn affine build -p @affine/web +$STD yarn affine build -p @affine/admin +mkdir -p /opt/affine/packages/backend/server/static +cp -r /opt/affine/packages/frontend/apps/web/dist/* /opt/affine/packages/backend/server/static/ +mkdir -p /opt/affine/packages/backend/server/static/admin +cp -r /opt/affine/packages/frontend/admin/dist/* /opt/affine/packages/backend/server/static/admin/ +# Create empty mobile manifest (server expects it but we don't build mobile) +mkdir -p /opt/affine/packages/backend/server/static/mobile +cat <<'MANIFEST' >/opt/affine/packages/backend/server/static/mobile/assets-manifest.json +{"publicPath":"/","js":[],"css":[],"gitHash":"","description":""} +MANIFEST +msg_ok "Built AFFiNE" + +msg_info "Running Initial Migration" +cd /opt/affine/packages/backend/server +set -a && source /opt/affine/.env && set +a +$STD node ./scripts/self-host-predeploy.js +msg_ok "Ran Initial Migration" + +msg_info "Creating Services" +cat </etc/systemd/system/affine-web.service +[Unit] +Description=AFFiNE Web Server +After=network.target postgresql.service redis-server.service +Requires=postgresql.service redis-server.service + +[Service] +Type=simple +WorkingDirectory=/opt/affine/packages/backend/server +EnvironmentFile=/opt/affine/.env +Environment=LD_PRELOAD=libjemalloc.so.2 +Environment=NODE_OPTIONS=--max-old-space-size=1024 +ExecStart=/usr/bin/node ./dist/main.js +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF + +cat </etc/systemd/system/affine-worker.service +[Unit] +Description=AFFiNE Background Worker +After=network.target postgresql.service redis-server.service +Requires=postgresql.service redis-server.service + +[Service] +Type=simple +WorkingDirectory=/opt/affine/packages/backend/server +EnvironmentFile=/opt/affine/.env +Environment=LD_PRELOAD=libjemalloc.so.2 +Environment=NODE_OPTIONS=--max-old-space-size=1024 +ExecStart=/usr/bin/node ./dist/main.js --worker +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF + +systemctl enable -q --now redis-server affine-web affine-worker +msg_ok "Created Services" + +msg_info "Creating Admin User" +ADMIN_PASS=$(openssl rand -base64 12) +for i in {1..30}; do + if curl -s http://localhost:3010/info >/dev/null 2>&1; then + break + fi + sleep 2 +done +# Create admin via API +ADMIN_RESPONSE=$(curl -s -X POST http://localhost:3010/api/setup/create-admin-user \ + -H "Content-Type: application/json" \ + -d "{\"email\":\"admin@affine.local\",\"password\":\"${ADMIN_PASS}\"}") +if echo "$ADMIN_RESPONSE" | grep -q '"id"'; then + { + echo "AFFiNE Credentials" + echo "==================" + echo "Email: admin@affine.local" + echo "Password: ${ADMIN_PASS}" + } >~/affine.creds + msg_ok "Created Admin User" +else + msg_warn "Admin creation skipped (may already exist)" +fi + +msg_info "Configuring Nginx" +cat </etc/nginx/sites-available/affine.conf +upstream affine_backend { + server 127.0.0.1:3010; +} + +server { + listen 80; + server_name _; + + client_max_body_size 100M; + + location / { + proxy_pass http://affine_backend; + proxy_http_version 1.1; + proxy_set_header Host \$host; + proxy_set_header X-Real-IP \$remote_addr; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_redirect off; + proxy_buffering off; + } +} +EOF +ln -sf /etc/nginx/sites-available/affine.conf /etc/nginx/sites-enabled/ +rm -f /etc/nginx/sites-enabled/default +systemctl enable -q --now nginx +msg_ok "Configured Nginx" + +motd_ssh +customize +cleanup_lxc From eb3fb749df39fd4adf58ce9f71c499572857257c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sun, 12 Jul 2026 21:22:59 +0000 Subject: [PATCH 055/161] Update CHANGELOG.md (#15727) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3b0bf2fb..7e289b0f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,6 +504,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-12 +### 🆕 New Scripts + + - AFFiNE ([#15690](https://github.com/community-scripts/ProxmoxVE/pull/15690)) + ### 🚀 Updated Scripts - Immich: Bump version to 3.0.2 [@vhsdream](https://github.com/vhsdream) ([#15668](https://github.com/community-scripts/ProxmoxVE/pull/15668)) From fd20ed1bfc479b89334b5176131e0c794e2d3a5f Mon Sep 17 00:00:00 2001 From: Tobias <96661824+CrazyWolf13@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:05:11 +0200 Subject: [PATCH 056/161] reitti: update to v5 (#15635) --- ct/reitti.sh | 84 +++++++++++++++++++++++++++++++++++---- install/reitti-install.sh | 44 +++++++++++++------- 2 files changed, 106 insertions(+), 22 deletions(-) diff --git a/ct/reitti.sh b/ct/reitti.sh index f160176d4..5980e6ae7 100644 --- a/ct/reitti.sh +++ b/ct/reitti.sh @@ -106,13 +106,6 @@ spring.servlet.multipart.max-file-size=5GB spring.servlet.multipart.max-request-size=5GB server.tomcat.max-part-count=100 -# Rqueue configuration -rqueue.web.enable=false -rqueue.job.enabled=false -rqueue.message.durability.in-terminal-state=0 -rqueue.key.prefix=\${spring.cache.redis.key-prefix} -rqueue.message.converter.provider.class=com.dedicatedcode.reitti.config.RQueueCustomMessageConverter - # Application-specific settings reitti.server.advertise-uri= @@ -168,6 +161,81 @@ PROPEOF msg_ok "Rewrote application.properties (backup: application.properties.bak)" fi + # Migrate v4 -> v5: Remove Rqueue configuration (replaced by Quartz Scheduler) + if grep -q "^rqueue\." /opt/reitti/application.properties 2>/dev/null; then + msg_info "Migrating to v5: Removing Rqueue configuration" + sed -i '/^# Rqueue configuration$/d; /^rqueue\./d' /opt/reitti/application.properties + msg_ok "Removed Rqueue configuration" + fi + + # Migrate v4 -> v5: Update application.properties and nginx tile cache for v5 compatibility + if grep -q "^reitti\.process-data\.schedule=" /opt/reitti/application.properties 2>/dev/null; then + msg_info "Migrating to v5: Updating application.properties" + sed -i '/^reitti\.process-data\.schedule=/d' /opt/reitti/application.properties + sed -i 's/^reitti\.import\.processing-idle-start-time=.*/reitti.import.grace-time-seconds=30/' /opt/reitti/application.properties + sed -i 's/^spring\.datasource\.hikari\.maximum-pool-size=20$/spring.datasource.hikari.maximum-pool-size=30/' /opt/reitti/application.properties + grep -q "devices" /opt/reitti/application.properties || \ + sed -i 's/^spring\.cache\.cache-names=\(.*\)$/spring.cache.cache-names=\1,devices,mapStyles,mapStyleJson/' /opt/reitti/application.properties + grep -q "org.quartz.core.ErrorLogger" /opt/reitti/application.properties || \ + sed -i '/^logging\.level\.com\.dedicatedcode\.reitti=/a logging.level.org.quartz.core.ErrorLogger=FATAL' /opt/reitti/application.properties + grep -q "^spring.servlet.multipart.resolve-lazily=" /opt/reitti/application.properties || \ + sed -i '/^spring\.servlet\.multipart\.max-request-size=/a spring.servlet.multipart.resolve-lazily=true' /opt/reitti/application.properties + grep -q "^spring.mvc.async.request-timeout=" /opt/reitti/application.properties || \ + echo "spring.mvc.async.request-timeout=600000" >>/opt/reitti/application.properties + if ! grep -q "^spring.quartz" /opt/reitti/application.properties; then + cat >>/opt/reitti/application.properties <<'QUARTZEOF' + +# Quartz Scheduler configuration +spring.quartz.job-store-type=jdbc +spring.quartz.jdbc.initialize-schema=never +spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate +spring.quartz.properties.org.quartz.jobStore.isClustered=false +spring.quartz.properties.org.quartz.jobStore.tablePrefix=qrtz_ +spring.quartz.properties.org.quartz.threadPool.threadCount=5 +QUARTZEOF + fi + grep -q "^reitti.import.staging.cleanup.cron=" /opt/reitti/application.properties || \ + echo "reitti.import.staging.cleanup.cron=0 0 4 * * *" >>/opt/reitti/application.properties + grep -q "^reitti.batching.max-batch-size=" /opt/reitti/application.properties || \ + printf "reitti.batching.max-batch-size=100\nreitti.batching.max-wait-time=5\n" >>/opt/reitti/application.properties + grep -q "^reitti.jobs.cleanup.cron=" /opt/reitti/application.properties || \ + printf "reitti.jobs.cleanup.cron=0 0 4 * * ?\nreitti.jobs.cleanup.max-age-hours=24\n" >>/opt/reitti/application.properties + grep -q "^reitti.db-janitor.schedule=" /opt/reitti/application.properties || \ + echo "reitti.db-janitor.schedule=0 0 4 * * ?" >>/opt/reitti/application.properties + msg_ok "Updated application.properties for v5" + + if [[ -f /etc/nginx/nginx.conf ]]; then + msg_info "Migrating to v5: Updating nginx tile cache configuration" + cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.v5 + cat >/etc/nginx/nginx.conf <<'NGINXEOF' +user www-data; + +events { + worker_connections 1024; +} +http { + resolver 1.1.1.1 8.8.8.8 valid=30s ipv6=off; + proxy_cache_path /var/cache/nginx/tiles levels=1:2 keys_zone=tiles:10m max_size=1g inactive=30d use_temp_path=off; + server { + listen 80; + location /custom/ { + set $upstream_url $http_x_reitti_upstream_url; + proxy_pass $upstream_url; + proxy_set_header Host $proxy_host; + proxy_set_header User-Agent "Reitti/1.0"; + proxy_cache tiles; + proxy_cache_key $upstream_url; + proxy_cache_valid 200 30d; + proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; + } + } +} +NGINXEOF + systemctl reload nginx + msg_ok "Updated nginx tile cache configuration" + fi + fi + if check_for_gh_release "reitti" "dedicatedcode/reitti"; then msg_info "Stopping Service" systemctl stop reitti @@ -179,10 +247,12 @@ PROPEOF USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "reitti" "dedicatedcode/reitti" "singlefile" "latest" "/opt/reitti" "reitti-app.jar" mv /opt/reitti/reitti-*.jar /opt/reitti/reitti.jar + msg_warn "v5 runs a one-time database migration on first start (GPS points → device table). This may take several minutes on large datasets — do not interrupt the container." msg_info "Starting Service" systemctl start reitti msg_ok "Started Service" msg_ok "Updated successfully!" + msg_warn "Post-upgrade: Verify each API token has a Device assigned in Settings → API Tokens. Tokens without a device cannot ingest location data in v5." fi exit } diff --git a/install/reitti-install.sh b/install/reitti-install.sh index 2810b1495..512b0cd13 100644 --- a/install/reitti-install.sh +++ b/install/reitti-install.sh @@ -30,27 +30,30 @@ mv /opt/reitti/reitti-*.jar /opt/reitti/reitti.jar msg_info "Installing Nginx Tile Cache" mkdir -p /var/cache/nginx/tiles -cat </etc/nginx/nginx.conf +cat <<'NGINXEOF' >/etc/nginx/nginx.conf user www-data; events { worker_connections 1024; } http { + resolver 1.1.1.1 8.8.8.8 valid=30s ipv6=off; proxy_cache_path /var/cache/nginx/tiles levels=1:2 keys_zone=tiles:10m max_size=1g inactive=30d use_temp_path=off; server { listen 80; - location / { - proxy_pass https://tile.openstreetmap.org/; - proxy_set_header Host tile.openstreetmap.org; + location /custom/ { + set $upstream_url $http_x_reitti_upstream_url; + proxy_pass $upstream_url; + proxy_set_header Host $proxy_host; proxy_set_header User-Agent "Reitti/1.0"; proxy_cache tiles; + proxy_cache_key $upstream_url; proxy_cache_valid 200 30d; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; } } } -EOF +NGINXEOF chown -R www-data:www-data /var/cache/nginx chmod -R 750 /var/cache/nginx systemctl restart nginx @@ -71,6 +74,7 @@ server.compression.mime-types=text/plain,application/json logging.level.root=INFO logging.level.org.hibernate.engine.jdbc.spi.SqlExceptionHelper=FATAL logging.level.com.dedicatedcode.reitti=INFO +logging.level.org.quartz.core.ErrorLogger=FATAL # Internationalization spring.messages.basename=messages @@ -82,7 +86,7 @@ spring.messages.fallback-to-system-locale=false spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/$PG_DB_NAME spring.datasource.username=$PG_DB_USER spring.datasource.password=$PG_DB_PASS -spring.datasource.hikari.maximum-pool-size=20 +spring.datasource.hikari.maximum-pool-size=30 # Redis configuration spring.data.redis.host=127.0.0.1 @@ -92,20 +96,23 @@ spring.data.redis.password= spring.data.redis.database=0 spring.cache.redis.key-prefix= -spring.cache.cache-names=processed-visits,significant-places,users,magic-links,configurations,transport-mode-configs,avatarThumbnails,avatarData,user-settings +spring.cache.cache-names=processed-visits,significant-places,users,magic-links,configurations,transport-mode-configs,avatarThumbnails,avatarData,user-settings,devices,mapStyles,mapStyleJson spring.cache.redis.time-to-live=1d # Upload configuration spring.servlet.multipart.max-file-size=5GB spring.servlet.multipart.max-request-size=5GB +spring.servlet.multipart.resolve-lazily=true server.tomcat.max-part-count=100 +spring.mvc.async.request-timeout=600000 -# Rqueue configuration -rqueue.web.enable=false -rqueue.job.enabled=false -rqueue.message.durability.in-terminal-state=0 -rqueue.key.prefix=\${spring.cache.redis.key-prefix} -rqueue.message.converter.provider.class=com.dedicatedcode.reitti.config.RQueueCustomMessageConverter +# Quartz Scheduler configuration +spring.quartz.job-store-type=jdbc +spring.quartz.jdbc.initialize-schema=never +spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate +spring.quartz.properties.org.quartz.jobStore.isClustered=false +spring.quartz.properties.org.quartz.jobStore.tablePrefix=qrtz_ +spring.quartz.properties.org.quartz.threadPool.threadCount=5 # Application-specific settings reitti.server.advertise-uri= @@ -117,18 +124,25 @@ reitti.security.oidc.enabled=false reitti.security.oidc.registration.enabled=false reitti.import.batch-size=10000 -reitti.import.processing-idle-start-time=10 +reitti.import.grace-time-seconds=30 +reitti.import.staging.cleanup.cron=0 0 4 * * * + +reitti.batching.max-batch-size=100 +reitti.batching.max-wait-time=5 reitti.geo-point-filter.max-speed-kmh=1000 reitti.geo-point-filter.max-accuracy-meters=100 reitti.geo-point-filter.history-lookback-hours=24 reitti.geo-point-filter.window-size=50 -reitti.process-data.schedule=0 */10 * * * * reitti.process-data.refresh-views.schedule=0 0 4 * * * reitti.imports.schedule=0 5/10 * * * * reitti.imports.owntracks-recorder.schedule=\${reitti.imports.schedule} +reitti.jobs.cleanup.cron=0 0 4 * * ? +reitti.jobs.cleanup.max-age-hours=24 +reitti.db-janitor.schedule=0 0 4 * * ? + # Geocoding service configuration reitti.geocoding.max-errors=10 reitti.geocoding.photon.base-url= From fae0aacf6d8c227c32920e6e2e2870fd4a427501 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 09:05:39 +0000 Subject: [PATCH 057/161] Update CHANGELOG.md (#15731) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e289b0f1..0035efcd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -502,6 +502,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-13 + +### 🚀 Updated Scripts + + - #### 💥 Breaking Changes + + - reitti: update to v5 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15635](https://github.com/community-scripts/ProxmoxVE/pull/15635)) + ## 2026-07-12 ### 🆕 New Scripts From 12949bce6c4f8af2909e2bcecb1d0cd8c452be10 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:10:49 +0200 Subject: [PATCH 058/161] fix(build.func): parse script status without jq dependency (#15729) Replace jq-based PocketBase status parsing with sed/grep so disabled and deleted script checks work on hosts that do not have jq installed yet. --- misc/build.func | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/misc/build.func b/misc/build.func index bf74bd3b6..93fced258 100644 --- a/misc/build.func +++ b/misc/build.func @@ -3764,19 +3764,18 @@ runtime_script_status_guard() { return 0 fi - if ! command -v jq >/dev/null 2>&1; then - msg_warn "Missing jq for script status check. Continuing without status verification." + local is_deleted is_disabled deleted_message disable_message info_url + if printf '%s' "$response" | grep -qE '"items":[[:space:]]*\[[[:space:]]*\]'; then return 0 fi - local has_record is_deleted is_disabled deleted_message disable_message info_url - has_record=$(printf '%s' "$response" | jq -r '.items | length') - [[ "$has_record" == "0" ]] && return 0 - - is_deleted=$(printf '%s' "$response" | jq -r '.items[0].is_deleted // false') - is_disabled=$(printf '%s' "$response" | jq -r '.items[0].is_disabled // false') - deleted_message=$(printf '%s' "$response" | jq -r '.items[0].deleted_message // ""') - disable_message=$(printf '%s' "$response" | jq -r '.items[0].disable_message // ""') + # PocketBase returns a flat, fixed-field JSON blob; sed is enough here (no jq needed). + is_deleted=$(printf '%s' "$response" | sed -n 's/.*"is_deleted"[[:space:]]*:[[:space:]]*\(true\|false\).*/\1/p' | head -1) + is_disabled=$(printf '%s' "$response" | sed -n 's/.*"is_disabled"[[:space:]]*:[[:space:]]*\(true\|false\).*/\1/p' | head -1) + deleted_message=$(printf '%s' "$response" | sed -n 's/.*"deleted_message"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1) + disable_message=$(printf '%s' "$response" | sed -n 's/.*"disable_message"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1) + is_deleted=${is_deleted:-false} + is_disabled=${is_disabled:-false} info_url="https://community-scripts.org/scripts/${script_slug}" if [[ "$is_deleted" == "true" ]]; then From a1333222a806c9022685503469e11ac2140ef7d4 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:11:08 +0200 Subject: [PATCH 059/161] fix(shinobi): remove obsolete --unsafe-perm npm flag (#15730) Shinobi installs fail on Node.js 22 because npm 10 no longer accepts the --unsafe-perm CLI flag during npm install. --- install/shinobi-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/shinobi-install.sh b/install/shinobi-install.sh index 383325016..6107c6488 100644 --- a/install/shinobi-install.sh +++ b/install/shinobi-install.sh @@ -54,7 +54,7 @@ cronKey=$(head -c 1024 Date: Mon, 13 Jul 2026 09:11:16 +0000 Subject: [PATCH 060/161] Update CHANGELOG.md (#15733) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0035efcd9..51866c189 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -510,6 +510,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - reitti: update to v5 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15635](https://github.com/community-scripts/ProxmoxVE/pull/15635)) +### 💾 Core + + - #### 🐞 Bug Fixes + + - fix(build.func): parse script status without jq dependency [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15729](https://github.com/community-scripts/ProxmoxVE/pull/15729)) + ## 2026-07-12 ### 🆕 New Scripts From 4a98e86db159d2e3bc56c76ff59576d97506f5cf Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 09:11:36 +0000 Subject: [PATCH 061/161] Update CHANGELOG.md (#15734) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51866c189..a0c2ce581 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,6 +506,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 Updated Scripts + - #### 🐞 Bug Fixes + + - fix(shinobi): remove obsolete --unsafe-perm npm flag [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15730](https://github.com/community-scripts/ProxmoxVE/pull/15730)) + - #### 💥 Breaking Changes - reitti: update to v5 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15635](https://github.com/community-scripts/ProxmoxVE/pull/15635)) From f828e629b5c6ceb1a583ae992d5039740b8da433 Mon Sep 17 00:00:00 2001 From: TowyTowy <85077986+TowyTowy@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:12:10 +0200 Subject: [PATCH 062/161] fix(hyperion): keep service running after container reboot (#15653) * fix(hyperion): keep service running after container reboot The packaged hyperion@.service declares "Requisite=network.target" but is not ordered After=network.target. Inside an LXC the unit's start job can be evaluated before network.target is active, and because Requisite= is stricter than Requires= (it does not pull the unit in or wait for it) the job fails with "Dependency failed", so Hyperion does not start after a reboot. Add a systemd drop-in that clears Requisite=; ordering is still provided by the base unit's Wants=/After=network-online.target. Co-Authored-By: Claude Fable 5 * Fix Hyperion service startup issue in LXC Remove Requisite from Hyperion service to ensure it starts correctly in LXC environments. --------- Co-authored-by: Claude Fable 5 Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com> --- install/hyperion-install.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install/hyperion-install.sh b/install/hyperion-install.sh index db5bf301f..b58798f96 100644 --- a/install/hyperion-install.sh +++ b/install/hyperion-install.sh @@ -24,6 +24,12 @@ msg_ok "Set up Hyperion repository" msg_info "Installing Hyperion" $STD apt install -y hyperion +mkdir -p /etc/systemd/system/hyperion@.service.d +cat </etc/systemd/system/hyperion@.service.d/override.conf +[Unit] +Requisite= +EOF +systemctl daemon-reload systemctl enable -q --now hyperion@root msg_ok "Installed Hyperion" From 1e7667e5f80c19ce960b239922dac8b755923479 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 09:12:36 +0000 Subject: [PATCH 063/161] Update CHANGELOG.md (#15735) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0c2ce581..2fd3b3fb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,6 +506,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 Updated Scripts + - fix(hyperion): keep service running after container reboot [@TowyTowy](https://github.com/TowyTowy) ([#15653](https://github.com/community-scripts/ProxmoxVE/pull/15653)) + - #### 🐞 Bug Fixes - fix(shinobi): remove obsolete --unsafe-perm npm flag [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15730](https://github.com/community-scripts/ProxmoxVE/pull/15730)) From ca082aedf06eb27d14aaa41e55f4746c8290456b Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:31:53 +0200 Subject: [PATCH 064/161] Docmost: Fix update procedure (#15732) Updated messages for configuring and starting the Docmost service. --- ct/docmost.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ct/docmost.sh b/ct/docmost.sh index c3392c585..a9727d6ad 100644 --- a/ct/docmost.sh +++ b/ct/docmost.sh @@ -39,7 +39,6 @@ function update_script() { create_backup /opt/docmost/.env \ /opt/docmost/data - fetch_and_deploy_gh_release "docmost" "docmost/docmost" "tarball" restore_backup @@ -54,9 +53,11 @@ function update_script() { sed -i '/^@Module({$/i @Global()' /opt/docmost/apps/server/src/core/core.module.ts fi + msg_insfo "Configuring Docmost" + cd /opt/docmost $STD pnpm install --force $STD pnpm build - msg_ok "Updated ${APP}" + msg_ok "Configured Docmost" msg_info "Starting Service" systemctl start docmost From 81bb9c7d71b8fa7903ceec1286db1092cbf9e584 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 09:32:19 +0000 Subject: [PATCH 065/161] Update CHANGELOG.md (#15737) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fd3b3fb0..161a3dfca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -510,6 +510,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - Docmost: Fix update procedure [@MickLesk](https://github.com/MickLesk) ([#15732](https://github.com/community-scripts/ProxmoxVE/pull/15732)) - fix(shinobi): remove obsolete --unsafe-perm npm flag [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15730](https://github.com/community-scripts/ProxmoxVE/pull/15730)) - #### 💥 Breaking Changes From 649e66ed2bd5d08dbe0566022099ac3d13582364 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:37:39 +0200 Subject: [PATCH 066/161] tools.func: some improvements (sql injection / command injection / guard) (#15661) * Update tools.func - Add _TOOLS_FUNC_LOADED guard to prevent double-sourcing - Remove duplicate is_alpine() (core.func version is more robust) - Fix end_timer: now actually outputs duration (was silent) - Fix SQL injection in setup_mariadb_db: escape single quotes in identifiers - Fix SQL injection in setup_postgresql_db: escape single quotes in identifiers - Fix sed injection in edit_yaml_config: escape | and & in value - Fix command injection in curl_with_retry: use array instead of string eval - Fix command injection in curl_api_with_retry: use array instead of string eval * Update misc/tools.func Co-authored-by: Sam Heinz --------- Co-authored-by: Sam Heinz --- misc/tools.func | 53 +++++++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/misc/tools.func b/misc/tools.func index 9360535a3..53486628b 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -36,6 +36,10 @@ # # ============================================================================== +# Guard against double-sourcing (core.func uses the same pattern) +[[ -n "${_TOOLS_FUNC_LOADED:-}" ]] && return 0 +_TOOLS_FUNC_LOADED=1 + # ------------------------------------------------------------------------------ # Debug helper - outputs to stderr when TOOLS_DEBUG is enabled # Usage: debug_log "message" @@ -91,16 +95,17 @@ curl_with_retry() { while [[ $attempt -le $retries ]]; do debug_log "curl attempt $attempt/$retries: $url" - local curl_cmd="curl -fsSL --connect-timeout $connect_timeout --max-time $timeout" - [[ -n "$extra_opts" ]] && curl_cmd="$curl_cmd $extra_opts" + # Build curl command as array to avoid command injection via extra_opts + local -a curl_args=(curl -fsSL --connect-timeout "$connect_timeout" --max-time "$timeout") + [[ -n "$extra_opts" ]] && read -ra _extra <<<"$extra_opts" && curl_args+=("${_extra[@]}") if [[ "$output" == "-" ]]; then - if $curl_cmd "$url"; then + if "${curl_args[@]}" "$url"; then success=true break fi else - if $curl_cmd -o "$output" "$url"; then + if "${curl_args[@]}" -o "$output" "$url"; then success=true break fi @@ -153,15 +158,16 @@ curl_api_with_retry() { while [[ $attempt -le $retries ]]; do debug_log "curl API attempt $attempt/$retries: $url" - local curl_cmd="curl -fsSL --connect-timeout $connect_timeout --max-time $timeout -w '%{http_code}'" - [[ -n "$extra_opts" ]] && curl_cmd="$curl_cmd $extra_opts" + # Build curl command as array to avoid command injection via extra_opts + local -a curl_args=(curl -fsSL --connect-timeout "$connect_timeout" --max-time "$timeout" -w '%{http_code}') + [[ -n "$extra_opts" ]] && read -ra _extra <<<"$extra_opts" && curl_args+=("${_extra[@]}") if [[ -n "$body_file" ]]; then - http_code=$($curl_cmd -o "$body_file" "$url" 2>/dev/null) || true + http_code=$("${curl_args[@]}" -o "$body_file" "$url" 2>/dev/null) || true else # Capture body and http_code separately local tmp_body="/tmp/curl_api_body_$$" - http_code=$($curl_cmd -o "$tmp_body" "$url" 2>/dev/null) || true + http_code=$("${curl_args[@]}" -o "$tmp_body" "$url" 2>/dev/null) || true if [[ -f "$tmp_body" ]]; then cat "$tmp_body" rm -f "$tmp_body" @@ -304,7 +310,10 @@ edit_yaml_config() { return 1 fi - sed -i "s|^\([[:space:]]*${key}[[:space:]]*:\).*|\1 ${value}|" "$file" + # Escape sed metacharacters in value (| and &) to prevent injection + local escaped_value="${value//|/\\|}" + escaped_value="${escaped_value//&/\\&}" + sed -i "s|^\([[:space:]]*${key}[[:space:]]*:\).*|\1 ${escaped_value}|" "$file" } # ------------------------------------------------------------------------------ @@ -1687,10 +1696,6 @@ is_ubuntu() { [[ "$(get_os_info id)" == "ubuntu" ]] } -is_alpine() { - [[ "$(get_os_info id)" == "alpine" ]] -} - # ------------------------------------------------------------------------------ # Get Debian/Ubuntu major version # ------------------------------------------------------------------------------ @@ -2454,8 +2459,10 @@ start_timer() { end_timer() { local start_time="$1" local label="${2:-Operation}" - local end_time=$(date +%s) + local end_time + end_time=$(date +%s) local duration=$((end_time - start_time)) + echo "${label} took ${duration}s" } # ------------------------------------------------------------------------------ @@ -6939,9 +6946,11 @@ setup_mariadb_db() { msg_info "Setting up MariaDB Database" - $STD mariadb -u root -e "CREATE DATABASE \`$MARIADB_DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" - $STD mariadb -u root -e "CREATE USER '$MARIADB_DB_USER'@'localhost' IDENTIFIED BY '$MARIADB_DB_PASS';" - $STD mariadb -u root -e "GRANT ALL ON \`$MARIADB_DB_NAME\`.* TO '$MARIADB_DB_USER'@'localhost';" + # Use --defaults-extra-file to pass credentials safely and escape identifiers + # to prevent SQL injection via DB name / user / password + $STD mariadb -u root -e "CREATE DATABASE \`${MARIADB_DB_NAME//\`/\`\`}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" + $STD mariadb -u root -e "CREATE USER '${MARIADB_DB_USER//\'/\'\'}'@'localhost' IDENTIFIED BY '${MARIADB_DB_PASS//\'/\'\'}';" + $STD mariadb -u root -e "GRANT ALL ON \`${MARIADB_DB_NAME//\`/\`\`}\`.* TO '${MARIADB_DB_USER//\'/\'\'}'@'localhost';" # Optional extra grants if [[ -n "${MARIADB_DB_EXTRA_GRANTS:-}" ]]; then @@ -8571,8 +8580,14 @@ setup_postgresql_db() { fi msg_info "Setting up PostgreSQL Database" - $STD sudo -u postgres psql -c "CREATE ROLE $PG_DB_USER WITH LOGIN PASSWORD '$PG_DB_PASS';" - $STD sudo -u postgres psql -c "CREATE DATABASE $PG_DB_NAME WITH OWNER $PG_DB_USER ENCODING 'UTF8' TEMPLATE template0;" + # Escape single quotes in identifiers to prevent SQL injection + local _pg_user_escaped _pg_pass_escaped _pg_db_escaped + _pg_user_escaped="${PG_DB_USER//\'/\'\'}" + _pg_pass_escaped="${PG_DB_PASS//\'/\'\'}" + _pg_db_escaped="${PG_DB_NAME//\'/\'\'}" + + $STD sudo -u postgres psql -c "CREATE ROLE $_pg_user_escaped WITH LOGIN PASSWORD '$_pg_pass_escaped';" + $STD sudo -u postgres psql -c "CREATE DATABASE $_pg_db_escaped WITH OWNER $_pg_user_escaped ENCODING 'UTF8' TEMPLATE template0;" # Configure pg_cron database BEFORE creating the extension (must be set before pg_cron loads) if [[ -n "${PG_DB_EXTENSIONS:-}" ]] && [[ ",${PG_DB_EXTENSIONS//[[:space:]]/}," == *",pg_cron,"* ]]; then From d6d8d20c7666730d7be3882a8f0ef0dacc6291e3 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 09:38:01 +0000 Subject: [PATCH 067/161] Update CHANGELOG.md (#15739) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 161a3dfca..fd3880243 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -523,6 +523,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - fix(build.func): parse script status without jq dependency [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15729](https://github.com/community-scripts/ProxmoxVE/pull/15729)) + - #### 🔧 Refactor + + - tools.func: some improvements (sql injection / command injection / guard) [@MickLesk](https://github.com/MickLesk) ([#15661](https://github.com/community-scripts/ProxmoxVE/pull/15661)) + ## 2026-07-12 ### 🆕 New Scripts From 734bb75b126b940edcb69609ea98882e3f2656a9 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 13 Jul 2026 11:56:12 +0200 Subject: [PATCH 068/161] fix storyteller release selection for multi-stream tags (#15736) Add optional tag prefix filtering to GitHub/GitLab release helpers and use web-v2 for Storyteller install/update so latest non-web tags no longer break deployment. --- ct/storyteller.sh | 4 +-- install/storyteller-install.sh | 2 +- misc/tools.func | 65 +++++++++++++++++++++++++++++----- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/ct/storyteller.sh b/ct/storyteller.sh index df2f915c9..0e49e0196 100644 --- a/ct/storyteller.sh +++ b/ct/storyteller.sh @@ -32,7 +32,7 @@ function update_script() { NODE_VERSION="24" NODE_MODULE="corepack,yarn" setup_nodejs - if check_for_gl_release "storyteller" "storyteller-platform/storyteller"; then + if check_for_gl_release "storyteller" "storyteller-platform/storyteller" "" "" "web-v2"; then msg_info "Stopping Service" systemctl stop storyteller msg_ok "Stopped Service" @@ -41,7 +41,7 @@ function update_script() { cp /opt/storyteller/.env /opt/storyteller_env.bak msg_ok "Backed up Data" - CLEAN_INSTALL=1 fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller" + CLEAN_INSTALL=1 fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller" "" "web-v2" msg_info "Restoring Configuration" mv /opt/storyteller_env.bak /opt/storyteller/.env diff --git a/install/storyteller-install.sh b/install/storyteller-install.sh index b3b343da6..1df32ec27 100644 --- a/install/storyteller-install.sh +++ b/install/storyteller-install.sh @@ -28,7 +28,7 @@ NODE_VERSION="24" NODE_MODULE="corepack,yarn" setup_nodejs fetch_and_deploy_gh_release "readium" "readium/cli" "prebuild" "latest" "/opt/readium" "readium_linux_$(arch_resolve "x86_64" "arm64").tar.gz" ln -sf /opt/readium/readium /usr/local/bin/readium -fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller" +fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller" "" "web-v2" msg_info "Setting up Storyteller" cd /opt/storyteller diff --git a/misc/tools.func b/misc/tools.func index 53486628b..4a35c695d 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -2833,6 +2833,7 @@ check_for_gh_release() { local source="$2" local pinned_version_in="${3:-}" # optional local pin_reason="${4:-}" # optional reason shown to user + local tag_prefix="${5:-}" # optional tag prefix filter (e.g. web-v2) local app_lc="" app_lc="$(echo "${app,,}" | tr -d ' ')" local current_file="$HOME/.${app_lc}" @@ -2888,7 +2889,7 @@ check_for_gh_release() { rm -f "$gh_check_json" fi - if [[ -z "$pinned_version_in" ]]; then + if [[ -z "$pinned_version_in" && -z "$tag_prefix" ]]; then http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gh_check_json" \ -H 'Accept: application/vnd.github+json' \ -H 'X-GitHub-Api-Version: 2022-11-28' \ @@ -2916,7 +2917,7 @@ check_for_gh_release() { rm -f "$gh_check_json" fi - # If no releases yet (pinned version OR /latest failed), fetch up to 100 + # If no releases yet (pinned version, tag prefix, OR /latest failed), fetch up to 100 if [[ -z "$releases_json" ]]; then http_code=$(curl -sSL --max-time 20 -w "%{http_code}" -o "$gh_check_json" \ -H 'Accept: application/vnd.github+json' \ @@ -2954,9 +2955,18 @@ check_for_gh_release() { rm -f "$gh_check_json" fi - mapfile -t raw_tags < <(jq -r '.[] | select(.draft==false and .prerelease==false) | .tag_name' <<<"$releases_json") + if [[ -n "$tag_prefix" ]]; then + mapfile -t raw_tags < <(jq -r --arg p "$tag_prefix" \ + '.[] | select(.draft==false and .prerelease==false) | select(.tag_name | startswith($p)) | .tag_name' <<<"$releases_json") + else + mapfile -t raw_tags < <(jq -r '.[] | select(.draft==false and .prerelease==false) | .tag_name' <<<"$releases_json") + fi if ((${#raw_tags[@]} == 0)); then - msg_error "No stable releases found for ${app}" + if [[ -n "$tag_prefix" ]]; then + msg_error "No stable releases matching prefix '${tag_prefix}' found for ${app}" + else + msg_error "No stable releases found for ${app}" + fi return 250 fi @@ -3960,6 +3970,7 @@ fetch_and_deploy_gh_release() { local version="${var_appversion:-${4:-latest}}" local target="${5:-/opt/$app}" local asset_pattern="${6:-}" + local tag_prefix="${7:-}" # Validate app name to prevent /root/. directory issues if [[ -z "$app" ]]; then @@ -3989,7 +4000,13 @@ fetch_and_deploy_gh_release() { TOOLS_GH_REL_JSON="$gh_rel_json" local api_url="https://api.github.com/repos/$repo/releases" - [[ "$version" != "latest" ]] && api_url="$api_url/tags/$version" || api_url="$api_url/latest" + if [[ "$version" != "latest" ]]; then + api_url="$api_url/tags/$version" + elif [[ -n "$tag_prefix" ]]; then + api_url="$api_url?per_page=100" + else + api_url="$api_url/latest" + fi local header=() [[ -n "${GITHUB_TOKEN:-}" ]] && header=(-H "Authorization: token $GITHUB_TOKEN") @@ -4052,6 +4069,14 @@ fetch_and_deploy_gh_release() { local json tag_name json=$(<"$gh_rel_json") + if [[ "$version" == "latest" && -n "$tag_prefix" ]]; then + json=$(echo "$json" | jq --arg p "$tag_prefix" \ + '[.[] | select(.draft==false and .prerelease==false) | select(.tag_name | startswith($p))][0] // empty') + if [[ -z "$json" || "$json" == "null" ]]; then + msg_error "No stable release matching prefix '${tag_prefix}' found for $repo on GitHub" + return 1 + fi + fi tag_name=$(echo "$json" | jq -r '.tag_name // .name // empty') # Only strip leading 'v' when followed by a digit (e.g. v1.2.3), not words like "version/..." [[ "$tag_name" =~ ^v[0-9] ]] && version="${tag_name:1}" || version="$tag_name" @@ -9484,6 +9509,7 @@ check_for_gl_release() { local source="$2" local pinned_version_in="${3:-}" # optional local pin_reason="${4:-}" # optional reason shown to user + local tag_prefix="${5:-}" # optional tag prefix filter (e.g. web-v2) local app_lc="${app,,}" local current_file="$HOME/.${app_lc}" @@ -9560,9 +9586,18 @@ check_for_gl_release() { rm -f "$gl_check_json" fi - mapfile -t raw_tags < <(jq -r '.[] | .tag_name' <<<"$releases_json") + if [[ -n "$tag_prefix" ]]; then + mapfile -t raw_tags < <(jq -r --arg p "$tag_prefix" \ + '.[] | select(.tag_name | startswith($p)) | .tag_name' <<<"$releases_json") + else + mapfile -t raw_tags < <(jq -r '.[] | .tag_name' <<<"$releases_json") + fi if ((${#raw_tags[@]} == 0)); then - msg_error "No releases found for ${app} on GitLab" + if [[ -n "$tag_prefix" ]]; then + msg_error "No releases matching prefix '${tag_prefix}' found for ${app} on GitLab" + else + msg_error "No releases found for ${app} on GitLab" + fi return 250 fi @@ -9757,6 +9792,7 @@ fetch_and_deploy_gl_release() { local version="${var_appversion:-${4:-latest}}" local target="${5:-/opt/$app}" local asset_pattern="${6:-}" + local tag_prefix="${7:-}" if [[ -z "$app" ]]; then app="${repo##*/}" @@ -9788,6 +9824,8 @@ fetch_and_deploy_gl_release() { local api_url if [[ "$version" != "latest" ]]; then api_url="$api_base/$version" + elif [[ -n "$tag_prefix" ]]; then + api_url="$api_base?per_page=100&order_by=released_at&sort=desc" else api_url="$api_base?per_page=1&order_by=released_at&sort=desc" fi @@ -9842,9 +9880,18 @@ fetch_and_deploy_gl_release() { json=$(<"$gl_rel_json") if [[ "$version" == "latest" ]]; then - json=$(echo "$json" | jq '.[0] // empty') + if [[ -n "$tag_prefix" ]]; then + json=$(echo "$json" | jq --arg p "$tag_prefix" \ + '[.[] | select(.tag_name | startswith($p))][0] // empty') + else + json=$(echo "$json" | jq '.[0] // empty') + fi if [[ -z "$json" || "$json" == "null" ]]; then - msg_error "No releases found for $repo on GitLab" + if [[ -n "$tag_prefix" ]]; then + msg_error "No release matching prefix '${tag_prefix}' found for $repo on GitLab" + else + msg_error "No releases found for $repo on GitLab" + fi return 1 fi fi From 1521e131b5ecf7d6fea3b54f15d3fd2068da3f77 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 09:56:44 +0000 Subject: [PATCH 069/161] Update CHANGELOG.md (#15740) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd3880243..78b9a1ea3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -510,6 +510,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - fix storyteller release selection for stable web tags [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15736](https://github.com/community-scripts/ProxmoxVE/pull/15736)) - Docmost: Fix update procedure [@MickLesk](https://github.com/MickLesk) ([#15732](https://github.com/community-scripts/ProxmoxVE/pull/15732)) - fix(shinobi): remove obsolete --unsafe-perm npm flag [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15730](https://github.com/community-scripts/ProxmoxVE/pull/15730)) From 7596b95517bfc11fff8aa39e4e0d328f8559e2f5 Mon Sep 17 00:00:00 2001 From: mnavon Date: Mon, 13 Jul 2026 12:59:52 +0300 Subject: [PATCH 070/161] immich: use actual PostgreSQL version for VectorChord package lookup (#15705) * immich: use actual PostgreSQL version for VectorChord package lookup * fix: update PostgreSQL version variable for VectorChord package deployment --- ct/immich.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ct/immich.sh b/ct/immich.sh index fd3d60a94..af15f4e1e 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -125,6 +125,8 @@ EOF systemctl stop immich-ml msg_ok "Stopped Services" VCHORD_RELEASE="1.1.1" + PG_VERSION=$(ls /etc/postgresql/ 2>/dev/null | sort -V | tail -1) + PG_VERSION=${PG_VERSION:-16} [[ -f ~/.vchord_version ]] && mv ~/.vchord_version ~/.vectorchord if check_for_gh_release "VectorChord" "tensorchord/VectorChord" "${VCHORD_RELEASE}" "updated together with Immich after testing"; then # dead tuples in smart_search/face_search make the REINDEX below fail with @@ -132,7 +134,7 @@ EOF # while still on the old extension version, a post-upgrade vacuum errors instead $STD sudo -u postgres psql -d immich -c "VACUUM (ANALYZE) smart_search;" $STD sudo -u postgres psql -d immich -c "VACUUM (ANALYZE) face_search;" - fetch_and_deploy_gh_release "VectorChord" "tensorchord/VectorChord" "binary" "${VCHORD_RELEASE}" "/tmp" "postgresql-16-vchord_*_$(arch_resolve).deb" + fetch_and_deploy_gh_release "VectorChord" "tensorchord/VectorChord" "binary" "${VCHORD_RELEASE}" "/tmp" "postgresql-${PG_VERSION}-vchord_*_$(arch_resolve).deb" systemctl restart postgresql $STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vector UPDATE;" $STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vchord UPDATE;" From 666bdbd8c8d9eb2e737b6a8af32f89596bb05e4e Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 10:00:14 +0000 Subject: [PATCH 071/161] Update CHANGELOG.md (#15742) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78b9a1ea3..4aef1a085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -510,6 +510,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - immich: use actual PostgreSQL version for VectorChord package lookup [@mnavon](https://github.com/mnavon) ([#15705](https://github.com/community-scripts/ProxmoxVE/pull/15705)) - fix storyteller release selection for stable web tags [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15736](https://github.com/community-scripts/ProxmoxVE/pull/15736)) - Docmost: Fix update procedure [@MickLesk](https://github.com/MickLesk) ([#15732](https://github.com/community-scripts/ProxmoxVE/pull/15732)) - fix(shinobi): remove obsolete --unsafe-perm npm flag [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15730](https://github.com/community-scripts/ProxmoxVE/pull/15730)) From bcaadc4dbd970b7628349062d4a71b12b056366e Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 13 Jul 2026 14:58:23 +0200 Subject: [PATCH 072/161] typo --- ct/docmost.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/docmost.sh b/ct/docmost.sh index a9727d6ad..1c6271c98 100644 --- a/ct/docmost.sh +++ b/ct/docmost.sh @@ -53,7 +53,7 @@ function update_script() { sed -i '/^@Module({$/i @Global()' /opt/docmost/apps/server/src/core/core.module.ts fi - msg_insfo "Configuring Docmost" + msg_info "Configuring Docmost" cd /opt/docmost $STD pnpm install --force $STD pnpm build From 1e3d0dedb39421faf3e415fb5fd7221f4b543cef Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Mon, 13 Jul 2026 15:09:56 +0200 Subject: [PATCH 073/161] Change sign-in URL to admin URL in affine.sh (#15741) --- ct/affine.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/affine.sh b/ct/affine.sh index ff8562073..c6f2849aa 100644 --- a/ct/affine.sh +++ b/ct/affine.sh @@ -124,4 +124,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}http://${IP}:3010/sign-in${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3010/admin${CL}" From 3c5a848d7da9bff3e97b84f76b4b38332a08245a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 13:10:47 +0000 Subject: [PATCH 074/161] Update CHANGELOG.md (#15747) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4aef1a085..ae7b1893b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -510,6 +510,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - Change sign-in URL to admin URL in affine.sh [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15741](https://github.com/community-scripts/ProxmoxVE/pull/15741)) - immich: use actual PostgreSQL version for VectorChord package lookup [@mnavon](https://github.com/mnavon) ([#15705](https://github.com/community-scripts/ProxmoxVE/pull/15705)) - fix storyteller release selection for stable web tags [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15736](https://github.com/community-scripts/ProxmoxVE/pull/15736)) - Docmost: Fix update procedure [@MickLesk](https://github.com/MickLesk) ([#15732](https://github.com/community-scripts/ProxmoxVE/pull/15732)) From dbe2c9eb97ca75f883cfad0326840912022fe1c8 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 17:39:10 +0200 Subject: [PATCH 075/161] Add leafwiki (ct) (#15748) Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> --- ct/headers/leafwiki | 6 ++++ ct/leafwiki.sh | 57 +++++++++++++++++++++++++++++++++++++ install/leafwiki-install.sh | 55 +++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 ct/headers/leafwiki create mode 100644 ct/leafwiki.sh create mode 100644 install/leafwiki-install.sh diff --git a/ct/headers/leafwiki b/ct/headers/leafwiki new file mode 100644 index 000000000..dcfacbddf --- /dev/null +++ b/ct/headers/leafwiki @@ -0,0 +1,6 @@ + __ _____ ___ __ _ + / / ___ ____ _/ __/ | / (_) /__(_) + / / / _ \/ __ `/ /_ | | /| / / / //_/ / + / /___/ __/ /_/ / __/ | |/ |/ / / ,< / / +/_____/\___/\__,_/_/ |__/|__/_/_/|_/_/ + diff --git a/ct/leafwiki.sh b/ct/leafwiki.sh new file mode 100644 index 000000000..20633cb57 --- /dev/null +++ b/ct/leafwiki.sh @@ -0,0 +1,57 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/perber/leafwiki + +APP="LeafWiki" +var_tags="${var_tags:-wiki;markdown;notes}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-4}" +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 /usr/local/bin/leafwiki ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "leafwiki" "perber/leafwiki"; then + msg_info "Stopping Service" + systemctl stop leafwiki + msg_ok "Stopped Service" + + create_backup /opt/leafwiki/data + fetch_and_deploy_gh_release "leafwiki" "perber/leafwiki" "singlefile" "latest" "/usr/local/bin" "leafwiki-v*-linux-$(arch_resolve)" + restore_backup + + msg_info "Starting Service" + systemctl start leafwiki + msg_ok "Started Service" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/install/leafwiki-install.sh b/install/leafwiki-install.sh new file mode 100644 index 000000000..228ffc702 --- /dev/null +++ b/install/leafwiki-install.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/perber/leafwiki + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +fetch_and_deploy_gh_release "leafwiki" "perber/leafwiki" "singlefile" "latest" "/usr/local/bin" "leafwiki-v*-linux-$(arch_resolve)" + +msg_info "Configuring LeafWiki" +mkdir -p /opt/leafwiki/data +mkdir -p /etc/leafwiki +JWT_SECRET=$(openssl rand -hex 32) +ADMIN_PASS=$(openssl rand -base64 12 | tr -dc 'a-zA-Z0-9' | head -c12) +cat </etc/leafwiki/.env +LEAFWIKI_DATA_DIR=/opt/leafwiki/data +LEAFWIKI_HOST=0.0.0.0 +LEAFWIKI_PORT=8080 +LEAFWIKI_JWT_SECRET=${JWT_SECRET} +LEAFWIKI_ADMIN_PASSWORD=${ADMIN_PASS} +LEAFWIKI_ALLOW_INSECURE=true +EOF +msg_ok "Configured LeafWiki" + +msg_info "Creating Service" +cat </etc/systemd/system/leafwiki.service +[Unit] +Description=LeafWiki +After=network.target + +[Service] +Type=simple +User=root +EnvironmentFile=/etc/leafwiki/.env +ExecStart=/usr/local/bin/leafwiki +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now leafwiki +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From da627244073208059d52023525fc958b0c2294fb Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 15:41:02 +0000 Subject: [PATCH 076/161] Update CHANGELOG.md (#15749) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae7b1893b..0db03f2e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,12 +504,15 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-13 -### 🚀 Updated Scripts +### 🆕 New Scripts - - fix(hyperion): keep service running after container reboot [@TowyTowy](https://github.com/TowyTowy) ([#15653](https://github.com/community-scripts/ProxmoxVE/pull/15653)) + - LeafWiki ([#15748](https://github.com/community-scripts/ProxmoxVE/pull/15748)) + +### 🚀 Updated Scripts - #### 🐞 Bug Fixes + - fix(hyperion): keep service running after container reboot [@TowyTowy](https://github.com/TowyTowy) ([#15653](https://github.com/community-scripts/ProxmoxVE/pull/15653)) - Change sign-in URL to admin URL in affine.sh [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15741](https://github.com/community-scripts/ProxmoxVE/pull/15741)) - immich: use actual PostgreSQL version for VectorChord package lookup [@mnavon](https://github.com/mnavon) ([#15705](https://github.com/community-scripts/ProxmoxVE/pull/15705)) - fix storyteller release selection for stable web tags [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15736](https://github.com/community-scripts/ProxmoxVE/pull/15736)) From 5d57c328fb02ec272644ee35b5f3a154bcf4be8b Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 14 Jul 2026 03:32:29 -0400 Subject: [PATCH 077/161] [Upstream Fix] Immich: Fix loader priority (#15755) --- ct/immich.sh | 1 + install/immich-install.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/ct/immich.sh b/ct/immich.sh index af15f4e1e..e72c4b7fe 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -501,6 +501,7 @@ function compile_libvips() { $STD git clone https://github.com/libvips/libvips.git "$SOURCE" cd "$SOURCE" $STD git reset --hard "$LIBVIPS_REVISION" + $STD git apply "$BASE_DIR"/server/sources/libvips-patches/0001-put-other-loaders-ahead-of-dcrawload.patch $STD meson setup build --buildtype=release --libdir=lib -Dintrospection=disabled -Dtiff=disabled cd build $STD ninja install diff --git a/install/immich-install.sh b/install/immich-install.sh index 2aa611c61..b75d4a7f2 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -286,6 +286,7 @@ LIBVIPS_REVISION="e01a4797cabe77d457fdfa7d776b7a7e7ca6d6a7" $STD git clone https://github.com/libvips/libvips.git "$SOURCE" cd "$SOURCE" $STD git reset --hard "$LIBVIPS_REVISION" +$STD git apply "$BASE_DIR"/server/sources/libvips-patches/0001-put-other-loaders-ahead-of-dcrawload.patch $STD meson setup build --buildtype=release --libdir=lib -Dintrospection=disabled -Dtiff=disabled cd build $STD ninja install From 6f76cc043e15c461060c67a7d08115a4b7bb36e7 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 07:32:54 +0000 Subject: [PATCH 078/161] Update CHANGELOG.md (#15756) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0db03f2e1..3ecee9dd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -502,6 +502,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-14 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - [Upstream Fix] Immich: Fix loader priority [@vhsdream](https://github.com/vhsdream) ([#15755](https://github.com/community-scripts/ProxmoxVE/pull/15755)) + ## 2026-07-13 ### 🆕 New Scripts From 171b954c7c429ed4ddda5fe8eed4474fc268e8ce Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:00:22 +0200 Subject: [PATCH 079/161] fix(fileflows): handle update API failures and fix Node install (#14858) Server updates no longer abort on 401 or unreachable API; users can force deploy when security is enabled or the app is down. Node installs now pass --server during systemd setup, and Node updates skip the server-only API. --- ct/fileflows.sh | 112 +++++++++++++++++++++++------------ install/fileflows-install.sh | 7 ++- 2 files changed, 79 insertions(+), 40 deletions(-) diff --git a/ct/fileflows.sh b/ct/fileflows.sh index 473efd435..9e3a5cd7e 100644 --- a/ct/fileflows.sh +++ b/ct/fileflows.sh @@ -31,50 +31,86 @@ function update_script() { exit fi - update_available=$(curl -fsSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' | jq .UpdateAvailable) - if [[ "${update_available}" == "true" ]]; then - msg_info "Stopping Service" - systemctl --all stop 'fileflows*' - msg_info "Stopped Service" + local proceed=false - msg_info "Creating Backup" - ls /opt/*.tar.gz &>/dev/null && rm -f /opt/*.tar.gz - backup_filename="/opt/${APP}_backup_$(date +%F).tar.gz" - tar -czf "$backup_filename" -C /opt/fileflows Data - msg_ok "Backup Created" - - # FileFlows tracks the latest release, whose .NET target can move (e.g. 8 -> 10); - # ensure the current ASP.NET Core Runtime so an existing install doesn't fail to - # start after updating to a newer .NET major version. - msg_info "Ensuring ASP.NET Core Runtime" - if [[ "$(arch_resolve)" == "arm64" ]]; then - if [[ ! -x /usr/lib/dotnet10/dotnet ]]; then - curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh - $STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10 - ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet - rm -f /tmp/dotnet-install.sh + if systemctl list-unit-files 'fileflows.service' --no-legend 2>/dev/null | grep -q '^fileflows\.service'; then + tmp=$(mktemp) + http_code=$(curl -sSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' -o "$tmp" -w '%{http_code}' 2>/dev/null) || http_code="000" + if [[ "$http_code" == "200" ]]; then + update_available=$(jq -r '.UpdateAvailable // false' "$tmp" 2>/dev/null) + rm -f "$tmp" + if [[ "${update_available}" == "true" ]]; then + proceed=true + else + msg_ok "No update required. ${APP} is already at latest version" + exit + fi + else + rm -f "$tmp" + if [[ "$http_code" == "401" ]]; then + msg_warn "Could not check for updates: API returned 401 (security may be enabled)." + else + msg_warn "Could not check for updates: API unreachable (HTTP ${http_code})." + fi + if [[ "${FORCE_UPDATE:-}" == "1" ]]; then + proceed=true + else + read -r -p "${TAB3}Force update without version check? [y/N]: " CONFIRM + if [[ "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then + proceed=true + else + msg_error "Update aborted." + exit + fi fi - elif ! is_package_installed "aspnetcore-runtime-10.0"; then - $STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true - setup_deb822_repo \ - "microsoft" \ - "https://packages.microsoft.com/keys/microsoft-2025.asc" \ - "https://packages.microsoft.com/debian/13/prod/" \ - "trixie" - $STD apt install -y aspnetcore-runtime-10.0 fi - msg_ok "Ensured ASP.NET Core Runtime" - - fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" - - msg_info "Starting Service" - systemctl --all start 'fileflows*' - msg_ok "Started Service" - msg_ok "Updated successfully!" else - msg_ok "No update required. ${APP} is already at latest version" + proceed=true fi + if [[ "$proceed" != "true" ]]; then + exit + fi + + msg_info "Stopping Service" + systemctl --all stop 'fileflows*' + msg_ok "Stopped Service" + + msg_info "Creating Backup" + ls /opt/*.tar.gz &>/dev/null && rm -f /opt/*.tar.gz + backup_filename="/opt/${APP}_backup_$(date +%F).tar.gz" + tar -czf "$backup_filename" -C /opt/fileflows Data + msg_ok "Backup Created" + + # FileFlows tracks the latest release, whose .NET target can move (e.g. 8 -> 10); + # ensure the current ASP.NET Core Runtime so an existing install doesn't fail to + # start after updating to a newer .NET major version. + msg_info "Ensuring ASP.NET Core Runtime" + if [[ "$(arch_resolve)" == "arm64" ]]; then + if [[ ! -x /usr/lib/dotnet10/dotnet ]]; then + curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh + $STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10 + ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet + rm -f /tmp/dotnet-install.sh + fi + elif ! is_package_installed "aspnetcore-runtime-10.0"; then + $STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true + setup_deb822_repo \ + "microsoft" \ + "https://packages.microsoft.com/keys/microsoft-2025.asc" \ + "https://packages.microsoft.com/debian/13/prod/" \ + "trixie" + $STD apt install -y aspnetcore-runtime-10.0 + fi + msg_ok "Ensured ASP.NET Core Runtime" + + fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" + + msg_info "Starting Service" + systemctl --all start 'fileflows*' + msg_ok "Started Service" + msg_ok "Updated successfully!" + exit } diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh index 50242be8a..14efb6582 100644 --- a/install/fileflows-install.sh +++ b/install/fileflows-install.sh @@ -55,9 +55,12 @@ if [[ "$install_server" =~ ^[Ss]$ ]]; then msg_ok "Installed FileFlows Server" else msg_info "Installing FileFlows Node" + read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url + while [[ -z "${server_url// /}" ]]; do + read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url + done cd /opt/fileflows/Node - $STD dotnet FileFlows.Node.dll - $STD dotnet FileFlows.Node.dll --systemd install --root true + $STD dotnet FileFlows.Node.dll --server "$server_url" --systemd install --root true systemctl enable -q --now fileflows-node msg_ok "Installed FileFlows Node" fi From b7a002cae496b9d340aa11cd455f3bc6bc077ec3 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 10:00:47 +0000 Subject: [PATCH 080/161] Update CHANGELOG.md (#15762) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ecee9dd7..234591e6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -508,6 +508,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - fix(fileflows): handle update API 401, force update, and Node install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14858](https://github.com/community-scripts/ProxmoxVE/pull/14858)) - [Upstream Fix] Immich: Fix loader priority [@vhsdream](https://github.com/vhsdream) ([#15755](https://github.com/community-scripts/ProxmoxVE/pull/15755)) ## 2026-07-13 From 55ab97a020d6fb62bcb5634c602ad106417a013e Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:02:10 +0200 Subject: [PATCH 081/161] Revert "fix(fileflows): handle update API failures and fix Node install (#14858)" (#15764) This reverts commit 171b954c7c429ed4ddda5fe8eed4474fc268e8ce. --- ct/fileflows.sh | 112 ++++++++++++----------------------- install/fileflows-install.sh | 7 +-- 2 files changed, 40 insertions(+), 79 deletions(-) diff --git a/ct/fileflows.sh b/ct/fileflows.sh index 9e3a5cd7e..473efd435 100644 --- a/ct/fileflows.sh +++ b/ct/fileflows.sh @@ -31,86 +31,50 @@ function update_script() { exit fi - local proceed=false + update_available=$(curl -fsSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' | jq .UpdateAvailable) + if [[ "${update_available}" == "true" ]]; then + msg_info "Stopping Service" + systemctl --all stop 'fileflows*' + msg_info "Stopped Service" - if systemctl list-unit-files 'fileflows.service' --no-legend 2>/dev/null | grep -q '^fileflows\.service'; then - tmp=$(mktemp) - http_code=$(curl -sSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' -o "$tmp" -w '%{http_code}' 2>/dev/null) || http_code="000" - if [[ "$http_code" == "200" ]]; then - update_available=$(jq -r '.UpdateAvailable // false' "$tmp" 2>/dev/null) - rm -f "$tmp" - if [[ "${update_available}" == "true" ]]; then - proceed=true - else - msg_ok "No update required. ${APP} is already at latest version" - exit - fi - else - rm -f "$tmp" - if [[ "$http_code" == "401" ]]; then - msg_warn "Could not check for updates: API returned 401 (security may be enabled)." - else - msg_warn "Could not check for updates: API unreachable (HTTP ${http_code})." - fi - if [[ "${FORCE_UPDATE:-}" == "1" ]]; then - proceed=true - else - read -r -p "${TAB3}Force update without version check? [y/N]: " CONFIRM - if [[ "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then - proceed=true - else - msg_error "Update aborted." - exit - fi + msg_info "Creating Backup" + ls /opt/*.tar.gz &>/dev/null && rm -f /opt/*.tar.gz + backup_filename="/opt/${APP}_backup_$(date +%F).tar.gz" + tar -czf "$backup_filename" -C /opt/fileflows Data + msg_ok "Backup Created" + + # FileFlows tracks the latest release, whose .NET target can move (e.g. 8 -> 10); + # ensure the current ASP.NET Core Runtime so an existing install doesn't fail to + # start after updating to a newer .NET major version. + msg_info "Ensuring ASP.NET Core Runtime" + if [[ "$(arch_resolve)" == "arm64" ]]; then + if [[ ! -x /usr/lib/dotnet10/dotnet ]]; then + curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh + $STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10 + ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet + rm -f /tmp/dotnet-install.sh fi + elif ! is_package_installed "aspnetcore-runtime-10.0"; then + $STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true + setup_deb822_repo \ + "microsoft" \ + "https://packages.microsoft.com/keys/microsoft-2025.asc" \ + "https://packages.microsoft.com/debian/13/prod/" \ + "trixie" + $STD apt install -y aspnetcore-runtime-10.0 fi + msg_ok "Ensured ASP.NET Core Runtime" + + fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" + + msg_info "Starting Service" + systemctl --all start 'fileflows*' + msg_ok "Started Service" + msg_ok "Updated successfully!" else - proceed=true + msg_ok "No update required. ${APP} is already at latest version" fi - if [[ "$proceed" != "true" ]]; then - exit - fi - - msg_info "Stopping Service" - systemctl --all stop 'fileflows*' - msg_ok "Stopped Service" - - msg_info "Creating Backup" - ls /opt/*.tar.gz &>/dev/null && rm -f /opt/*.tar.gz - backup_filename="/opt/${APP}_backup_$(date +%F).tar.gz" - tar -czf "$backup_filename" -C /opt/fileflows Data - msg_ok "Backup Created" - - # FileFlows tracks the latest release, whose .NET target can move (e.g. 8 -> 10); - # ensure the current ASP.NET Core Runtime so an existing install doesn't fail to - # start after updating to a newer .NET major version. - msg_info "Ensuring ASP.NET Core Runtime" - if [[ "$(arch_resolve)" == "arm64" ]]; then - if [[ ! -x /usr/lib/dotnet10/dotnet ]]; then - curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh - $STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10 - ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet - rm -f /tmp/dotnet-install.sh - fi - elif ! is_package_installed "aspnetcore-runtime-10.0"; then - $STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true - setup_deb822_repo \ - "microsoft" \ - "https://packages.microsoft.com/keys/microsoft-2025.asc" \ - "https://packages.microsoft.com/debian/13/prod/" \ - "trixie" - $STD apt install -y aspnetcore-runtime-10.0 - fi - msg_ok "Ensured ASP.NET Core Runtime" - - fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" - - msg_info "Starting Service" - systemctl --all start 'fileflows*' - msg_ok "Started Service" - msg_ok "Updated successfully!" - exit } diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh index 14efb6582..50242be8a 100644 --- a/install/fileflows-install.sh +++ b/install/fileflows-install.sh @@ -55,12 +55,9 @@ if [[ "$install_server" =~ ^[Ss]$ ]]; then msg_ok "Installed FileFlows Server" else msg_info "Installing FileFlows Node" - read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url - while [[ -z "${server_url// /}" ]]; do - read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url - done cd /opt/fileflows/Node - $STD dotnet FileFlows.Node.dll --server "$server_url" --systemd install --root true + $STD dotnet FileFlows.Node.dll + $STD dotnet FileFlows.Node.dll --systemd install --root true systemctl enable -q --now fileflows-node msg_ok "Installed FileFlows Node" fi From 09ec7b32034035639b57e5efa62d39e3a7da09c4 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 10:02:33 +0000 Subject: [PATCH 082/161] Update CHANGELOG.md (#15765) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 234591e6e..d4c31f965 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,6 +506,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 Updated Scripts + - Revert "fix(fileflows): handle update API 401, force update, and Node install" [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15764](https://github.com/community-scripts/ProxmoxVE/pull/15764)) + - #### 🐞 Bug Fixes - fix(fileflows): handle update API 401, force update, and Node install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14858](https://github.com/community-scripts/ProxmoxVE/pull/14858)) From 63f219f14f1bd959075d5b478d43dfb332bc8e73 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:44:19 +0200 Subject: [PATCH 083/161] Revise project eligibility criteria in request template Updated eligibility requirements for project requests in the discussion template, clarifying the criteria for self-hosting, repository stars, and project age. --- .../DISCUSSION_TEMPLATE/request-script.yml | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/request-script.yml b/.github/DISCUSSION_TEMPLATE/request-script.yml index 64d694c97..c966e8747 100644 --- a/.github/DISCUSSION_TEMPLATE/request-script.yml +++ b/.github/DISCUSSION_TEMPLATE/request-script.yml @@ -12,13 +12,17 @@ body: Requests may be closed if the application is out of scope, abandoned, too new, not publicly verifiable, or not suitable for a reliable Proxmox VE Helper-Scripts integration. General requirements: - - The application should be self-hosted. - - The project should have an official public source repository. - - The project should provide official releases, tags, or release tarballs. - - The project should be actively maintained. - - The project should generally have at least 1,000 stars or a comparable public adoption signal. - - The latest official release or tag should not be older than 6 months. - - The project itself should be at least 6 months old. + - The application must be self-hosted. + - The project must have an official public source repository. + - The project must provide official releases, tags, or release tarballs. + - The project must be actively maintained. + - The official source repository must have at least 1,000 stars. + - The latest official release or tag must not be older than 6 months. + - The project itself must be at least 6 months old. + + Projects that do not meet these requirements may be closed without further evaluation. + + Exceptions to the 1,000-star requirement are rare and require a clearly verifiable, significant public adoption signal. - type: input id: application-name @@ -47,6 +51,35 @@ body: validations: required: true + - type: markdown + attributes: + value: | + ## ⚠️ Project Eligibility + + Before continuing, verify that the requested project meets the minimum requirements below. + + **Projects with fewer than 1,000 stars are generally not eligible for a script request.** + + Exceptions are only considered where there is a clearly verifiable, significant public adoption signal. + + - type: input + id: repository-stars + attributes: + label: Repository Stars + description: Enter the current number of stars of the official source repository. + placeholder: "e.g., 15,000" + validations: + required: true + + - type: checkboxes + id: minimum-stars + attributes: + label: Minimum Adoption Requirement + description: Confirm that you have verified the project's public adoption. + options: + - label: The official source repository has at least 1,000 stars. + required: true + - type: textarea id: app-description attributes: From c039ab2e62041163cb4d1ddef7e65a30f9b46f53 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:45:49 +0200 Subject: [PATCH 084/161] Refactor input and checkbox fields for repository stars --- .../DISCUSSION_TEMPLATE/request-script.yml | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/DISCUSSION_TEMPLATE/request-script.yml b/.github/DISCUSSION_TEMPLATE/request-script.yml index c966e8747..a2cf93136 100644 --- a/.github/DISCUSSION_TEMPLATE/request-script.yml +++ b/.github/DISCUSSION_TEMPLATE/request-script.yml @@ -62,23 +62,23 @@ body: Exceptions are only considered where there is a clearly verifiable, significant public adoption signal. - - type: input - id: repository-stars - attributes: - label: Repository Stars - description: Enter the current number of stars of the official source repository. - placeholder: "e.g., 15,000" - validations: - required: true - - - type: checkboxes - id: minimum-stars - attributes: - label: Minimum Adoption Requirement - description: Confirm that you have verified the project's public adoption. - options: - - label: The official source repository has at least 1,000 stars. - required: true + - type: input + id: repository-stars + attributes: + label: Repository Stars + description: Enter the current number of stars of the official source repository. + placeholder: "e.g., 15,000" + validations: + required: true + + - type: checkboxes + id: minimum-stars + attributes: + label: Minimum Adoption Requirement + description: Confirm that you have verified the project's public adoption. + options: + - label: The official source repository has at least 1,000 stars. + required: true - type: textarea id: app-description From 103b420e30c299944661326a813fd8b2e388c2ff Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:08:23 +0000 Subject: [PATCH 085/161] Update CHANGELOG.md (#15771) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4c31f965..3ecee9dd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,11 +506,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 Updated Scripts - - Revert "fix(fileflows): handle update API 401, force update, and Node install" [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15764](https://github.com/community-scripts/ProxmoxVE/pull/15764)) - - #### 🐞 Bug Fixes - - fix(fileflows): handle update API 401, force update, and Node install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14858](https://github.com/community-scripts/ProxmoxVE/pull/14858)) - [Upstream Fix] Immich: Fix loader priority [@vhsdream](https://github.com/vhsdream) ([#15755](https://github.com/community-scripts/ProxmoxVE/pull/15755)) ## 2026-07-13 From ab3c9be482ce2715f7daee0209bc649f902b9176 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 14 Jul 2026 13:58:22 +0200 Subject: [PATCH 086/161] fix(birdnet-go): match new upstream release asset naming (#15758) Upstream BirdNET-Go releases now suffix tarball names with the release date (e.g. birdnet-go-linux-amd64-20260713.tar.gz). Use a wildcard pattern so install and update can fetch the latest release without falling back to older nightlies. Fixes #15753 --- ct/birdnet-go.sh | 2 +- install/birdnet-go-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/birdnet-go.sh b/ct/birdnet-go.sh index 39db9ca1f..6319219f9 100644 --- a/ct/birdnet-go.sh +++ b/ct/birdnet-go.sh @@ -37,7 +37,7 @@ function update_script() { systemctl stop birdnet msg_ok "Stopped Service" - fetch_and_deploy_gh_release "birdnet" "tphakala/birdnet-go" "prebuild" "latest" "/opt/birdnet" "birdnet-go-linux-$(arch_resolve).tar.gz" + fetch_and_deploy_gh_release "birdnet" "tphakala/birdnet-go" "prebuild" "latest" "/opt/birdnet" "birdnet-go-linux-$(arch_resolve)*.tar.gz" msg_info "Deploying Binary" cp /opt/birdnet/birdnet-go /usr/local/bin/birdnet-go diff --git a/install/birdnet-go-install.sh b/install/birdnet-go-install.sh index b3dfcab8e..df0a96058 100644 --- a/install/birdnet-go-install.sh +++ b/install/birdnet-go-install.sh @@ -21,7 +21,7 @@ $STD apt install -y \ ffmpeg msg_ok "Installed Dependencies" -fetch_and_deploy_gh_release "birdnet" "tphakala/birdnet-go" "prebuild" "latest" "/opt/birdnet" "birdnet-go-linux-$(arch_resolve).tar.gz" +fetch_and_deploy_gh_release "birdnet" "tphakala/birdnet-go" "prebuild" "latest" "/opt/birdnet" "birdnet-go-linux-$(arch_resolve)*.tar.gz" msg_info "Setting up BirdNET-Go" cp /opt/birdnet/birdnet-go /usr/local/bin/birdnet-go From 9c586b94abac33fa8bc7e9e6189ee6bfe6196fda Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 11:58:44 +0000 Subject: [PATCH 087/161] Update CHANGELOG.md (#15774) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ecee9dd7..a5d921673 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -508,6 +508,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - BirdNET-Go: Match new upstream release asset naming [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15758](https://github.com/community-scripts/ProxmoxVE/pull/15758)) - [Upstream Fix] Immich: Fix loader priority [@vhsdream](https://github.com/vhsdream) ([#15755](https://github.com/community-scripts/ProxmoxVE/pull/15755)) ## 2026-07-13 From 7f430e15bb19febdde643a2efc3863bcdf227c36 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:00:17 +0200 Subject: [PATCH 088/161] feat(silverbullet): add optional Runtime API install via Chromium (#15761) Adds an install-time prompt to optionally enable Silverbullet's Runtime API by installing Chromium and configuring SB_CHROME_PATH / SB_CHROME_DATA_DIR. --- install/silverbullet-install.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/install/silverbullet-install.sh b/install/silverbullet-install.sh index 6e26d9ccd..26f769c16 100644 --- a/install/silverbullet-install.sh +++ b/install/silverbullet-install.sh @@ -16,6 +16,17 @@ update_os fetch_and_deploy_gh_release "silverbullet" "silverbulletmd/silverbullet" "prebuild" "latest" "/opt/silverbullet/bin" "silverbullet-server-linux-$(arch_resolve "x86_64" "aarch64").zip" mkdir -p /opt/silverbullet/space +RUNTIME_API_ENV="" +read -rp "${TAB3}Enable Silverbullet Runtime API? Requires Chromium (~700MB). Uses ~200MB extra RAM. (y/N): " runtime_api_prompt +if [[ "${runtime_api_prompt,,}" =~ ^(y|yes)$ ]]; then + msg_info "Installing Chromium for Runtime API" + $STD apt install -y chromium + msg_ok "Installed Chromium for Runtime API" + RUNTIME_API_ENV=$'Environment=SB_CHROME_PATH=/usr/bin/chromium\nEnvironment=SB_CHROME_DATA_DIR=/opt/silverbullet/space/.chrome-data\n' + touch /opt/silverbullet/.runtime-api-enabled + msg_ok "Runtime API will be enabled" +fi + msg_info "Creating Service" cat </etc/systemd/system/silverbullet.service [Unit] @@ -25,6 +36,7 @@ After=syslog.target network.target [Service] User=root Type=simple +${RUNTIME_API_ENV} ExecStart=/opt/silverbullet/bin/silverbullet --hostname 0.0.0.0 --port 3000 /opt/silverbullet/space WorkingDirectory=/opt/silverbullet Restart=on-failure From e81220611617c3ea18d07d2584ef9ac7230b3435 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:00:40 +0000 Subject: [PATCH 089/161] Update CHANGELOG.md (#15775) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5d921673..993e216d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -511,6 +511,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - BirdNET-Go: Match new upstream release asset naming [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15758](https://github.com/community-scripts/ProxmoxVE/pull/15758)) - [Upstream Fix] Immich: Fix loader priority [@vhsdream](https://github.com/vhsdream) ([#15755](https://github.com/community-scripts/ProxmoxVE/pull/15755)) + - #### ✨ New Features + + - Silverbullet: Add optional Runtime API install via Chromium [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15761](https://github.com/community-scripts/ProxmoxVE/pull/15761)) + ## 2026-07-13 ### 🆕 New Scripts From 3f5453b609a3f1fba93ff174d1c340d38890c25c Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:01:16 +0200 Subject: [PATCH 090/161] FileFlows: Handle update API 401, force update, and Node install (#15766) * fix(fileflows): handle update API failures and fix Node install Server updates no longer abort on 401 or unreachable API; users can force deploy when security is enabled or the app is down. Node installs now pass --server during systemd setup, and Node updates skip the server-only API. * Update fileflows.sh --- ct/fileflows.sh | 109 +++++++++++++++++++++++------------ install/fileflows-install.sh | 7 ++- 2 files changed, 76 insertions(+), 40 deletions(-) diff --git a/ct/fileflows.sh b/ct/fileflows.sh index 473efd435..3f72cef69 100644 --- a/ct/fileflows.sh +++ b/ct/fileflows.sh @@ -31,50 +31,83 @@ function update_script() { exit fi - update_available=$(curl -fsSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' | jq .UpdateAvailable) - if [[ "${update_available}" == "true" ]]; then - msg_info "Stopping Service" - systemctl --all stop 'fileflows*' - msg_info "Stopped Service" + local proceed=false - msg_info "Creating Backup" - ls /opt/*.tar.gz &>/dev/null && rm -f /opt/*.tar.gz - backup_filename="/opt/${APP}_backup_$(date +%F).tar.gz" - tar -czf "$backup_filename" -C /opt/fileflows Data - msg_ok "Backup Created" - - # FileFlows tracks the latest release, whose .NET target can move (e.g. 8 -> 10); - # ensure the current ASP.NET Core Runtime so an existing install doesn't fail to - # start after updating to a newer .NET major version. - msg_info "Ensuring ASP.NET Core Runtime" - if [[ "$(arch_resolve)" == "arm64" ]]; then - if [[ ! -x /usr/lib/dotnet10/dotnet ]]; then - curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh - $STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10 - ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet - rm -f /tmp/dotnet-install.sh + if systemctl list-unit-files 'fileflows.service' --no-legend 2>/dev/null | grep -q '^fileflows\.service'; then + tmp=$(mktemp) + http_code=$(curl -sSL -X 'GET' "http://localhost:19200/api/status/update-available" -H 'accept: application/json' -o "$tmp" -w '%{http_code}' 2>/dev/null) || http_code="000" + if [[ "$http_code" == "200" ]]; then + update_available=$(jq -r '.UpdateAvailable // false' "$tmp" 2>/dev/null) + rm -f "$tmp" + if [[ "${update_available}" == "true" ]]; then + proceed=true + else + msg_ok "No update required. ${APP} is already at latest version" + exit + fi + else + rm -f "$tmp" + if [[ "$http_code" == "401" ]]; then + msg_warn "Could not check for updates: API returned 401 (security may be enabled)." + else + msg_warn "Could not check for updates: API unreachable (HTTP ${http_code})." + fi + if [[ "${FORCE_UPDATE:-}" == "1" ]]; then + proceed=true + else + read -r -p "${TAB3}Force update without version check? [y/N]: " CONFIRM + if [[ "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then + proceed=true + else + msg_error "Update aborted." + exit + fi fi - elif ! is_package_installed "aspnetcore-runtime-10.0"; then - $STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true - setup_deb822_repo \ - "microsoft" \ - "https://packages.microsoft.com/keys/microsoft-2025.asc" \ - "https://packages.microsoft.com/debian/13/prod/" \ - "trixie" - $STD apt install -y aspnetcore-runtime-10.0 fi - msg_ok "Ensured ASP.NET Core Runtime" - - fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" - - msg_info "Starting Service" - systemctl --all start 'fileflows*' - msg_ok "Started Service" - msg_ok "Updated successfully!" else - msg_ok "No update required. ${APP} is already at latest version" + proceed=true fi + if [[ "$proceed" != "true" ]]; then + exit + fi + + msg_info "Stopping Service" + systemctl --all stop 'fileflows*' + msg_ok "Stopped Service" + + msg_info "Creating Backup" + ls /opt/*.tar.gz &>/dev/null && rm -f /opt/*.tar.gz + backup_filename="/opt/${APP}_backup_$(date +%F).tar.gz" + tar -czf "$backup_filename" -C /opt/fileflows Data + msg_ok "Backup Created" + + msg_info "Ensuring ASP.NET Core Runtime" + if [[ "$(arch_resolve)" == "arm64" ]]; then + if [[ ! -x /usr/lib/dotnet10/dotnet ]]; then + curl -fsSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh + $STD bash /tmp/dotnet-install.sh --channel 10.0 --runtime aspnetcore --install-dir /usr/lib/dotnet10 + ln -sf /usr/lib/dotnet10/dotnet /usr/bin/dotnet + rm -f /tmp/dotnet-install.sh + fi + elif ! is_package_installed "aspnetcore-runtime-10.0"; then + $STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true + setup_deb822_repo \ + "microsoft" \ + "https://packages.microsoft.com/keys/microsoft-2025.asc" \ + "https://packages.microsoft.com/debian/13/prod/" \ + "trixie" + $STD apt install -y aspnetcore-runtime-10.0 + fi + msg_ok "Ensured ASP.NET Core Runtime" + + fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" + + msg_info "Starting Service" + systemctl --all start 'fileflows*' + msg_ok "Started Service" + msg_ok "Updated successfully!" + exit } diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh index 50242be8a..14efb6582 100644 --- a/install/fileflows-install.sh +++ b/install/fileflows-install.sh @@ -55,9 +55,12 @@ if [[ "$install_server" =~ ^[Ss]$ ]]; then msg_ok "Installed FileFlows Server" else msg_info "Installing FileFlows Node" + read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url + while [[ -z "${server_url// /}" ]]; do + read -r -p "${TAB3}Enter FileFlows Server URL (e.g. http://192.168.1.10:19200): " server_url + done cd /opt/fileflows/Node - $STD dotnet FileFlows.Node.dll - $STD dotnet FileFlows.Node.dll --systemd install --root true + $STD dotnet FileFlows.Node.dll --server "$server_url" --systemd install --root true systemctl enable -q --now fileflows-node msg_ok "Installed FileFlows Node" fi From 9055f4b34e2b5f08839c9e36c7b680f90763cb54 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:01:40 +0200 Subject: [PATCH 091/161] fix(lychee): preserve uploads and ownership during update (#15768) The update script wiped public/uploads and did not re-apply www-data ownership, causing HTTP 500 after successful updates. Align with upstream upgrade steps and sibling Laravel scripts by backing up uploads/dist, restarting PHP-FPM, running full artisan cache cycle, and adding verbose diagnostics. Fixes #15763 --- ct/lychee.sh | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/ct/lychee.sh b/ct/lychee.sh index 887d1f3ac..7adfff87b 100644 --- a/ct/lychee.sh +++ b/ct/lychee.sh @@ -31,33 +31,38 @@ function update_script() { fi if check_for_gh_release "lychee" "LycheeOrg/Lychee"; then + PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;') + msg_info "Stopping Services" - systemctl stop caddy + systemctl stop caddy php${PHP_VER}-fpm msg_ok "Stopped Services" - msg_info "Backing up Data" - cp /opt/lychee/.env /opt/lychee.env.bak - cp -r /opt/lychee/storage /opt/lychee_storage_backup - msg_ok "Backed up Data" + create_backup /opt/lychee/.env \ + /opt/lychee/storage \ + /opt/lychee/public/uploads \ + /opt/lychee/public/dist CLEAN_INSTALL=1 fetch_and_deploy_gh_release "lychee" "LycheeOrg/Lychee" "prebuild" "latest" "/opt/lychee" "Lychee.zip" - msg_info "Restoring Data" - cp /opt/lychee.env.bak /opt/lychee/.env - rm -f /opt/lychee.env.bak - cp -r /opt/lychee_storage_backup/. /opt/lychee/storage - rm -rf /opt/lychee_storage_backup - msg_ok "Restored Data" + restore_backup msg_info "Updating Application" cd /opt/lychee $STD php artisan migrate --force + $STD php artisan config:clear + $STD php artisan cache:clear $STD php artisan optimize:clear - chmod -R 775 /opt/lychee/storage /opt/lychee/bootstrap/cache + $STD php artisan optimize + chown -R www-data:www-data /opt/lychee + chmod -R 775 /opt/lychee/storage /opt/lychee/bootstrap/cache \ + /opt/lychee/public/dist /opt/lychee/public/uploads + if [[ "${VERBOSE:-no}" = "yes" ]]; then + php artisan lychee:diagnostics || true + fi msg_ok "Updated Application" msg_info "Starting Services" - systemctl start caddy + systemctl start caddy php${PHP_VER}-fpm msg_ok "Started Services" msg_ok "Updated successfully!" fi From 254e720b4fe79af72e258e55660a6f554e48cf10 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:01:44 +0000 Subject: [PATCH 092/161] Update CHANGELOG.md (#15776) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 993e216d7..5df109bec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -508,6 +508,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - FileFlows: Handle update API 401, force update, and Node install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15766](https://github.com/community-scripts/ProxmoxVE/pull/15766)) - BirdNET-Go: Match new upstream release asset naming [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15758](https://github.com/community-scripts/ProxmoxVE/pull/15758)) - [Upstream Fix] Immich: Fix loader priority [@vhsdream](https://github.com/vhsdream) ([#15755](https://github.com/community-scripts/ProxmoxVE/pull/15755)) From bb4e35f9886e6c94f0ac2baa7c77b9318c1deaf2 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:02:17 +0000 Subject: [PATCH 093/161] Update CHANGELOG.md (#15777) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5df109bec..e3a97ccb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -508,6 +508,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - Lychee: Preserve uploads and ownership during update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15768](https://github.com/community-scripts/ProxmoxVE/pull/15768)) - FileFlows: Handle update API 401, force update, and Node install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15766](https://github.com/community-scripts/ProxmoxVE/pull/15766)) - BirdNET-Go: Match new upstream release asset naming [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15758](https://github.com/community-scripts/ProxmoxVE/pull/15758)) - [Upstream Fix] Immich: Fix loader priority [@vhsdream](https://github.com/vhsdream) ([#15755](https://github.com/community-scripts/ProxmoxVE/pull/15755)) From 817ee347c7ab5134e59a8fbeee568e82dc37f6f2 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:08:14 +0200 Subject: [PATCH 094/161] Bump OpenCloud version to v7.2.2 (#15769) * Bump OpenCloud release version to v7.2.2 * Update OpenCloud version to v7.2.2 --- ct/opencloud.sh | 2 +- install/opencloud-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/opencloud.sh b/ct/opencloud.sh index b328d90ab..0ce6d9291 100644 --- a/ct/opencloud.sh +++ b/ct/opencloud.sh @@ -30,7 +30,7 @@ function update_script() { exit fi - RELEASE="v7.2.1" + RELEASE="v7.2.2" 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/install/opencloud-install.sh b/install/opencloud-install.sh index 0dc635098..f3f1bc93b 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.1" "/usr/bin" "opencloud-*-linux-$(arch_resolve)" +fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.2.2" "/usr/bin" "opencloud-*-linux-$(arch_resolve)" mv /usr/bin/OpenCloud /usr/bin/opencloud msg_info "Configuring OpenCloud" From 9f8bc4b03d84329b21af7e9d2e364c1e367877b8 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:08:38 +0000 Subject: [PATCH 095/161] Update CHANGELOG.md (#15778) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3a97ccb4..28d868983 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -515,6 +515,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### ✨ New Features + - Bump OpenCloud version to v7.2.2 [@MickLesk](https://github.com/MickLesk) ([#15769](https://github.com/community-scripts/ProxmoxVE/pull/15769)) - Silverbullet: Add optional Runtime API install via Chromium [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15761](https://github.com/community-scripts/ProxmoxVE/pull/15761)) ## 2026-07-13 From 670d972cc1342521ebaa59d715bd8bf5ca03ef7c Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:14:20 +0200 Subject: [PATCH 096/161] fix(wanderer): clean deploy and install plugins for v0.20.0 update (#15759) Use CLEAN_INSTALL with create_backup/restore_backup so stale v0.19.x source files no longer break go build after the integrations migration. Also set up the plugins directory and install official WASM bundles. --- ct/wanderer.sh | 13 +++++++++++-- install/wanderer-install.sh | 9 ++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ct/wanderer.sh b/ct/wanderer.sh index 432963379..bb0ec71cd 100644 --- a/ct/wanderer.sh +++ b/ct/wanderer.sh @@ -30,12 +30,14 @@ function update_script() { exit fi - if check_for_gh_release "wanderer" "Flomp/wanderer"; then + if check_for_gh_release "wanderer" "open-wanderer/wanderer"; then msg_info "Stopping service" systemctl stop wanderer-web msg_ok "Stopped service" - fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source" + create_backup /opt/wanderer/source/search + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source" + restore_backup msg_info "Updating wanderer" cd /opt/wanderer/source/db @@ -44,6 +46,13 @@ function update_script() { cd /opt/wanderer/source/web $STD npm ci $STD npm run build + mkdir -p /opt/wanderer/data/plugins + [[ -e /data/plugins ]] || ln -sfn /opt/wanderer/data/plugins /data/plugins + msg_info "Installing wanderer plugins" + for plugin in hammerhead komoot strava; do + fetch_and_deploy_gh_release "wanderer-plugin-${plugin}" "open-wanderer/wanderer" "prebuild" "${CHECK_UPDATE_RELEASE:-latest}" "/opt/wanderer/data/plugins" "wanderer-plugin-${plugin}.tar.gz" || msg_warn "Failed to install wanderer plugin: ${plugin}" + done + msg_ok "Installed wanderer plugins" msg_ok "Updated wanderer" msg_info "Starting service" diff --git a/install/wanderer-install.sh b/install/wanderer-install.sh index 3cebc9fef..6a8571bbf 100644 --- a/install/wanderer-install.sh +++ b/install/wanderer-install.sh @@ -20,7 +20,8 @@ if [[ "$(arch_resolve)" == "arm64" ]]; then else fetch_and_deploy_gh_release "meilisearch" "meilisearch/meilisearch" "binary" "latest" "/opt/wanderer/source/search" fi -mkdir -p /opt/wanderer/{source,data/pb_data,data/meili_data} +mkdir -p /opt/wanderer/{source,data/pb_data,data/meili_data,data/plugins} +[[ -e /data/plugins ]] || ln -sfn /opt/wanderer/data/plugins /data/plugins fetch_and_deploy_gh_release "wanderer" "open-wanderer/wanderer" "tarball" "latest" "/opt/wanderer/source" msg_info "Installing wanderer (patience)" @@ -32,6 +33,12 @@ $STD npm ci $STD npm run build msg_ok "Installed wanderer" +msg_info "Installing wanderer plugins" +for plugin in hammerhead komoot strava; do + fetch_and_deploy_gh_release "wanderer-plugin-${plugin}" "open-wanderer/wanderer" "prebuild" "latest" "/opt/wanderer/data/plugins" "wanderer-plugin-${plugin}.tar.gz" || msg_warn "Failed to install wanderer plugin: ${plugin}" +done +msg_ok "Installed wanderer plugins" + msg_info "Creating Service" MEILI_KEY=$(openssl rand -hex 32) POCKETBASE_KEY=$(openssl rand -hex 16) From 0f37abff3ce52a120fec946195861a7eff20d68d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:14:44 +0000 Subject: [PATCH 097/161] Update CHANGELOG.md (#15779) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28d868983..bec04bb4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -508,6 +508,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - Wanderer: Clean deploy and install plugins for v0.20.0 update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15759](https://github.com/community-scripts/ProxmoxVE/pull/15759)) - Lychee: Preserve uploads and ownership during update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15768](https://github.com/community-scripts/ProxmoxVE/pull/15768)) - FileFlows: Handle update API 401, force update, and Node install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15766](https://github.com/community-scripts/ProxmoxVE/pull/15766)) - BirdNET-Go: Match new upstream release asset naming [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15758](https://github.com/community-scripts/ProxmoxVE/pull/15758)) From 108c9dcf43c191a473d2910842cc3806f1ef86da Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:15:32 +0200 Subject: [PATCH 098/161] Add yuvomi (ct) (#15772) Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> --- ct/headers/yuvomi | 6 ++++ ct/yuvomi.sh | 64 ++++++++++++++++++++++++++++++++++ install/yuvomi-install.sh | 72 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 ct/headers/yuvomi create mode 100644 ct/yuvomi.sh create mode 100644 install/yuvomi-install.sh diff --git a/ct/headers/yuvomi b/ct/headers/yuvomi new file mode 100644 index 000000000..3247d3dcc --- /dev/null +++ b/ct/headers/yuvomi @@ -0,0 +1,6 @@ +__ __ _ +\ \/ /_ ___ ______ ____ ___ (_) + \ / / / / | / / __ \/ __ `__ \/ / + / / /_/ /| |/ / /_/ / / / / / / / +/_/\__,_/ |___/\____/_/ /_/ /_/_/ + diff --git a/ct/yuvomi.sh b/ct/yuvomi.sh new file mode 100644 index 000000000..625a0aa61 --- /dev/null +++ b/ct/yuvomi.sh @@ -0,0 +1,64 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/ulsklyc/yuvomi + +APP="Yuvomi" +var_tags="${var_tags:-family;planner;calendar}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-1024}" +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}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/yuvomi ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "yuvomi" "ulsklyc/yuvomi"; then + msg_info "Stopping Service" + systemctl stop yuvomi + msg_ok "Stopped Service" + + create_backup /opt/yuvomi/data /opt/yuvomi/.env + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "yuvomi" "ulsklyc/yuvomi" "tarball" + + msg_info "Installing Node.js Dependencies" + cd /opt/yuvomi + $STD npm ci --omit=dev + msg_ok "Installed Node.js Dependencies" + + restore_backup + + msg_info "Starting Service" + systemctl start yuvomi + msg_ok "Started Service" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/install/yuvomi-install.sh b/install/yuvomi-install.sh new file mode 100644 index 000000000..521049586 --- /dev/null +++ b/install/yuvomi-install.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/ulsklyc/yuvomi + +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 \ + python3 \ + make \ + g++ \ + libsqlcipher-dev +msg_ok "Installed Dependencies" + +NODE_VERSION="22" setup_nodejs + +fetch_and_deploy_gh_release "yuvomi" "ulsklyc/yuvomi" "tarball" + +msg_info "Installing Node.js Dependencies" +cd /opt/yuvomi +$STD npm ci --omit=dev +msg_ok "Installed Node.js Dependencies" + +msg_info "Configuring Yuvomi" +mkdir -p /opt/yuvomi/data /opt/yuvomi/backups +SESSION_SECRET=$(openssl rand -hex 32) +DB_ENCRYPT_KEY=$(openssl rand -hex 32) +cat </opt/yuvomi/.env +PORT=3000 +NODE_ENV=production +DB_PATH=/opt/yuvomi/data/yuvomi.db +DB_ENCRYPTION_KEY=${DB_ENCRYPT_KEY} +SESSION_SECRET=${SESSION_SECRET} +RATE_LIMIT_WINDOW_MS=60000 +RATE_LIMIT_MAX_ATTEMPTS=5 +RATE_LIMIT_BLOCK_DURATION_MS=900000 +EOF +msg_ok "Configured Yuvomi" + +msg_info "Creating Service" +cat </etc/systemd/system/yuvomi.service +[Unit] +Description=Yuvomi Family Planner +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/yuvomi +EnvironmentFile=/opt/yuvomi/.env +ExecStart=/usr/bin/node server/index.js +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now yuvomi +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From 2bffa47924a7b739ff1f6c4ff33d88c3e5c72588 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:16:01 +0000 Subject: [PATCH 099/161] Update CHANGELOG.md (#15780) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bec04bb4f..c9aad4a0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,6 +504,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-14 +### 🆕 New Scripts + + - Yuvomi ([#15772](https://github.com/community-scripts/ProxmoxVE/pull/15772)) + ### 🚀 Updated Scripts - #### 🐞 Bug Fixes From d4d482746b2334751d558bb569512934b07d1efa Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 14:16:10 +0200 Subject: [PATCH 100/161] Add grav (ct) (#15773) Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> --- ct/grav.sh | 54 +++++++++++++++++++ ct/headers/grav | 6 +++ install/grav-install.sh | 111 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 ct/grav.sh create mode 100644 ct/headers/grav create mode 100644 install/grav-install.sh diff --git a/ct/grav.sh b/ct/grav.sh new file mode 100644 index 000000000..9271a029e --- /dev/null +++ b/ct/grav.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Raffaele (rafspiny) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://getgrav.org/ + +APP="Grav" +var_tags="${var_tags:-cms}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-8}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" +var_unprivileged="${var_unprivileged:-1}" + + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d "/opt/grav" ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "grav" "getgrav/grav"; then + msg_info "Creating Backup" + cd /opt/grav + bin/grav backup -nq + msg_ok "Backup Created" + bin/gpm self-upgrade -y + cd - + chown -R www-data:www-data /opt/grav + msg_ok "Update Successful" + fi + exit +} + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:80${CL}" diff --git a/ct/headers/grav b/ct/headers/grav new file mode 100644 index 000000000..3e041ab1e --- /dev/null +++ b/ct/headers/grav @@ -0,0 +1,6 @@ + ______ + / ____/________ __ __ + / / __/ ___/ __ `/ | / / +/ /_/ / / / /_/ /| |/ / +\____/_/ \__,_/ |___/ + diff --git a/install/grav-install.sh b/install/grav-install.sh new file mode 100644 index 000000000..8b3c396cf --- /dev/null +++ b/install/grav-install.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Raffaele (rafspiny) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://getgrav.org/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt install -y \ + nginx \ + logrotate +msg_ok "Installed Dependencies" + +PHP_FPM="YES" setup_php + +fetch_and_deploy_gh_release "grav" "getgrav/grav" "prebuild" "latest" "/opt/grav" "grav-admin-v*zip" +chown -R www-data:www-data /opt/grav + +msg_info "Configuring Nginx" +PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;') +PHP_FPM_SOCK=$(find /run/php -maxdepth 1 -name "php*-fpm.sock" -type s | sort -V | tail -1) +unlink /etc/nginx/sites-enabled/default +rm -f /etc/nginx/sites-available/default +cat </etc/nginx/sites-available/grav +server { + listen 80; + server_name _; + root /opt/grav; + index index.html index.htm index.php; + + location / { + try_files \$uri \$uri/ /index.html /index.htm /index.php\$is_args\$args; + } + + ## Begin - Security + location ~* /(\.git|cache|bin|logs|backup|tests)/.*$ { return 403; } + location ~* /(system|vendor)/.*\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; } + location ~* /user/.*\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; } + location ~ /(LICENSE\.txt|composer\.lock|composer\.json|nginx\.conf|web\.config|htaccess\.txt|\.htaccess) { return 403; } + ## End - Security + + ## Begin - API + location ^~ /api/ { + try_files \$uri \$uri/ /index.php\$is_args\$args; + } + ## End - API + + # deny all direct access to these sensitive user folders, whatever the file type + location ~* /user/(accounts|config|env)/.*$ { return 403; } + # allow public media uploads under user/data to be served directly; + # this must come before the user/data deny so it wins the match + location ~* /user/data/.*\.(jpe?g|png|gif|webp|avif|bmp|ico|mp4|webm|ogg|ogv|mov|mp3|wav|m4a|flac|pdf)$ { try_files \$uri =404; } + # deny everything else under user/data + location ~* /user/data/.*$ { return 403; } + + + ## Begin - Caching + location ~* ^/forms-basic-captcha-image.jpg$ { + try_files \$uri \$uri/ /index.php\$is_args\$args; + } + + location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { + expires 30d; + add_header Vary Accept-Encoding; + log_not_found off; + } + + location ~* ^.+\.(?:css|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|woff2|svg)$ { + access_log off; + expires 30d; + add_header Cache-Control public; + tcp_nodelay off; + open_file_cache max=3000 inactive=120s; + open_file_cache_valid 45s; + open_file_cache_min_uses 2; + open_file_cache_errors off; + } + ## End - Caching + + location ~ ^(.+\.php)(.*)$ { + fastcgi_split_path_info ^(.+\.php)(.*)$; + if (!-f \$document_root\$fastcgi_script_name) { return 404; } + fastcgi_pass unix:${PHP_FPM_SOCK}; + fastcgi_index index.php; + include /etc/nginx/fastcgi_params; + fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; + } + + location ~ /\.ht { + deny all; + } +} +EOF +ln -sf /etc/nginx/sites-available/grav /etc/nginx/sites-enabled/grav +systemctl enable -q --now php${PHP_VER}-fpm +$STD nginx -t +systemctl enable -q --now nginx +$STD nginx -s reload +msg_ok "Configured Nginx" + +motd_ssh +customize +cleanup_lxc From a5b839f91fe1869fc64b217276639e964690cab8 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 12:16:30 +0000 Subject: [PATCH 101/161] Update CHANGELOG.md (#15781) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9aad4a0d..88c37eb3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,7 +506,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🆕 New Scripts - - Yuvomi ([#15772](https://github.com/community-scripts/ProxmoxVE/pull/15772)) + - Grav ([#15773](https://github.com/community-scripts/ProxmoxVE/pull/15773)) +- Yuvomi ([#15772](https://github.com/community-scripts/ProxmoxVE/pull/15772)) ### 🚀 Updated Scripts From ed29bb6f6206d007bd40c2038974b7dcf5ccbc31 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Tue, 14 Jul 2026 22:38:24 +0200 Subject: [PATCH 102/161] AFFiNE: Pin to v0.26.3 (#15782) * AFFiNE: Pin to v0.26.3 * Update GitHub release version to v0.26.3 --- ct/affine.sh | 5 +++-- install/affine-install.sh | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ct/affine.sh b/ct/affine.sh index c6f2849aa..236a225bd 100644 --- a/ct/affine.sh +++ b/ct/affine.sh @@ -30,14 +30,15 @@ function update_script() { exit fi - if check_for_gh_release "affine_app" "toeverything/AFFiNE"; then + RELEASE="v0.26.3" + if check_for_gh_release "affine_app" "toeverything/AFFiNE" "${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 affine-web affine-worker msg_ok "Stopped Services" create_backup /root/.affine/config /root/.affine/storage - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "latest" "/opt/affine" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "${RELEASE}" "/opt/affine" msg_info "Rebuilding Application (Patience)" cd /opt/affine diff --git a/install/affine-install.sh b/install/affine-install.sh index 2e29234b6..4c15d2403 100644 --- a/install/affine-install.sh +++ b/install/affine-install.sh @@ -30,7 +30,7 @@ PG_DB_NAME="affine" PG_DB_USER="affine" setup_postgresql_db NODE_VERSION="22" setup_nodejs setup_rust -fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "latest" "/opt/affine" +fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "v0.26.3" "/opt/affine" msg_info "Setting up Directories" rm -rf /root/.affine From 80c4b04d83272f4fb8918d62319b070b86615c73 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 20:38:53 +0000 Subject: [PATCH 103/161] Update CHANGELOG.md (#15788) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88c37eb3a..dea512093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -513,8 +513,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes - - Wanderer: Clean deploy and install plugins for v0.20.0 update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15759](https://github.com/community-scripts/ProxmoxVE/pull/15759)) - Lychee: Preserve uploads and ownership during update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15768](https://github.com/community-scripts/ProxmoxVE/pull/15768)) + - Wanderer: Clean deploy and install plugins for v0.20.0 update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15759](https://github.com/community-scripts/ProxmoxVE/pull/15759)) - FileFlows: Handle update API 401, force update, and Node install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15766](https://github.com/community-scripts/ProxmoxVE/pull/15766)) - BirdNET-Go: Match new upstream release asset naming [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15758](https://github.com/community-scripts/ProxmoxVE/pull/15758)) - [Upstream Fix] Immich: Fix loader priority [@vhsdream](https://github.com/vhsdream) ([#15755](https://github.com/community-scripts/ProxmoxVE/pull/15755)) @@ -524,6 +524,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - Bump OpenCloud version to v7.2.2 [@MickLesk](https://github.com/MickLesk) ([#15769](https://github.com/community-scripts/ProxmoxVE/pull/15769)) - Silverbullet: Add optional Runtime API install via Chromium [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15761](https://github.com/community-scripts/ProxmoxVE/pull/15761)) + - #### 🔧 Refactor + + - AFFiNE: Pin to v0.26.3 [@MickLesk](https://github.com/MickLesk) ([#15782](https://github.com/community-scripts/ProxmoxVE/pull/15782)) + ## 2026-07-13 ### 🆕 New Scripts From 07e31eb5bce1d4bf0efd1601b1f5369e1cd49b4a Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Tue, 14 Jul 2026 22:54:55 +0200 Subject: [PATCH 104/161] Pangolin: Bump to 1.20.0 | BREAKING: Switch to PostgreSQL (#15682) * Pangolin: Bump to 1.20.0 and harden SQLite migrations Bump the default Pangolin version to 1.20.0 in both CT and install scripts. Update the CT upgrade path to validate required 1.20.0 schema objects, clear stale versionMigrations markers when needed, retry migrations once, and abort with a clear error if the schema is still incomplete to avoid a broken runtime. * extend migration check... * another try... * bump pangolin to PSQL * remove migration paths * remove old migrations * use create_backup and restore_backup * Block Pangolin SQLite upgrades Update the Pangolin CT upgrade path to fail fast when PostgreSQL is not installed. The script now explains that upgrades to Pangolin 1.20.0+ require PostgreSQL and that SQLite data cannot be migrated automatically. * fix env * Update pangolin.sh * Update pangolin-install.sh --- ct/pangolin.sh | 39 +++++++++++++++++-------------------- install/pangolin-install.sh | 21 +++++++++++++------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/ct/pangolin.sh b/ct/pangolin.sh index 08d604277..fe5b787a9 100644 --- a/ct/pangolin.sh +++ b/ct/pangolin.sh @@ -6,7 +6,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV # Source: https://pangolin.net/ | Github: https://github.com/fosrl/pangolin APP="Pangolin" -PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.18.4}" +PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.20.0}" var_tags="${var_tags:-proxy}" var_cpu="${var_cpu:-2}" var_ram="${var_ram:-4096}" @@ -33,6 +33,15 @@ function update_script() { ensure_dependencies build-essential python3 + if ! command -v psql &>/dev/null; then + msg_error "This installation uses SQLite and cannot be upgraded to Pangolin ${PANGOLIN_VERSION}." + echo -e "${INFO}${YW}Starting with Pangolin 1.20.0, PostgreSQL is required as the database backend.${CL}" + echo -e "${INFO}${YW}An automatic migration of your existing SQLite data is not supported.${CL}" + echo -e "${INFO}${YW}Please create a new LXC with the Pangolin install script, which sets up PostgreSQL automatically.${CL}" + echo -e "${INFO}${YW}Your current data is preserved in this container and can be manually migrated if needed.${CL}" + exit 1 + fi + NODE_VERSION="24" setup_nodejs if check_for_gh_release "pangolin" "fosrl/pangolin" "$PANGOLIN_VERSION" "Pinned to a tested release because Pangolin's schema changes have repeatedly broken unattended updates. To try a newer version at your own risk, run: 'export PANGOLIN_VERSION=' and re-run update. If it breaks, please open an issue at https://github.com/community-scripts/ProxmoxVE/issues with the error log."; then @@ -41,13 +50,8 @@ function update_script() { systemctl stop gerbil msg_info "Service stopped" - msg_info "Creating backup" - tar -czf /opt/pangolin_config_backup.tar.gz -C /opt/pangolin config - if [[ -f /opt/pangolin/config/db/db.sqlite ]]; then - cp -a /opt/pangolin/config/db/db.sqlite \ - "/opt/pangolin/config/db/db.sqlite.pre-${PANGOLIN_VERSION}-$(date +%Y%m%d-%H%M%S).bak" - fi - msg_ok "Created backup" + DB_URL=$(sed -n 's/.*connection_string: "\(.*\)".*/\1/p' /opt/pangolin/config/config.yml) + create_backup /opt/pangolin/config CLEAN_INSTALL=1 fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)" @@ -55,23 +59,21 @@ function update_script() { msg_info "Updating Pangolin" cd /opt/pangolin $STD npm ci - $STD npm run set:sqlite + $STD npm run set:pg $STD npm run set:oss rm -rf server/private - $STD npm run db:generate + DATABASE_URL="$DB_URL" $STD npm run db:generate $STD npm run build $STD npm run build:cli cp -R .next/standalone ./ + cp -r server/migrations ./dist/init chmod +x ./dist/cli.mjs cp server/db/names.json ./dist/names.json cp server/db/ios_models.json ./dist/ios_models.json cp server/db/mac_models.json ./dist/mac_models.json msg_ok "Updated Pangolin" - msg_info "Restoring config" - tar -xzf /opt/pangolin_config_backup.tar.gz -C /opt/pangolin --overwrite - rm -f /opt/pangolin_config_backup.tar.gz - msg_ok "Restored config" + restore_backup if ! grep -q '^ExecStartPre=/usr/bin/node dist/migrations.mjs' /etc/systemd/system/pangolin.service 2>/dev/null; then msg_info "Adding migration step to pangolin.service" @@ -82,13 +84,8 @@ function update_script() { msg_info "Running database migrations" cd /opt/pangolin - SQLITE_DB="/opt/pangolin/config/db/db.sqlite" - if [[ -f "$SQLITE_DB" ]]; then - if ! sqlite3 "$SQLITE_DB" ".tables" 2>/dev/null | tr ' ' '\n' | grep -qx "statusHistory"; then - sqlite3 "$SQLITE_DB" "DELETE FROM versionMigrations;" 2>/dev/null || true - fi - fi ENVIRONMENT=prod $STD node dist/migrations.mjs + msg_ok "Ran database migrations" msg_info "Updating Badger plugin version" @@ -112,4 +109,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}https://${CL}" +echo -e "${GATEWAY}${BGN}https:// or http://${IP}:3002${CL}" diff --git a/install/pangolin-install.sh b/install/pangolin-install.sh index ab3fc5095..0a8f008af 100644 --- a/install/pangolin-install.sh +++ b/install/pangolin-install.sh @@ -16,18 +16,19 @@ update_os msg_info "Installing Dependencies" $STD apt install -y \ build-essential \ - python3 \ - sqlite3 \ iptables msg_ok "Installed Dependencies" NODE_VERSION="24" setup_nodejs -PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.18.4}" +PG_VERSION="17" setup_postgresql +PG_DB_NAME="pangolin" PG_DB_USER="pangolin" setup_postgresql_db +PANGOLIN_VERSION="${PANGOLIN_VERSION:-1.20.0}" fetch_and_deploy_gh_release "pangolin" "fosrl/pangolin" "tarball" "$PANGOLIN_VERSION" fetch_and_deploy_gh_release "gerbil" "fosrl/gerbil" "singlefile" "latest" "/usr/bin" "gerbil_linux_$(arch_resolve)" fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_$(arch_resolve).tar.gz" read -rp "${TAB3}Enter your Pangolin URL (ex: https://pangolin.example.com): " pango_url +[[ "$pango_url" != https://* && "$pango_url" != http://* ]] && pango_url="https://${pango_url}" read -rp "${TAB3}Enter your email address: " pango_email msg_info "Setup Pangolin" @@ -36,13 +37,14 @@ BADGER_VERSION=$(get_latest_github_release "fosrl/badger" "false") cd /opt/pangolin mkdir -p /opt/pangolin/config/{traefik,db,letsencrypt,logs} $STD npm ci -$STD npm run set:sqlite +$STD npm run set:pg $STD npm run set:oss rm -rf server/private -$STD npm run db:generate +DATABASE_URL="postgresql://pangolin:${PG_DB_PASS}@localhost:5432/pangolin" $STD npm run db:generate $STD npm run build $STD npm run build:cli cp -R .next/standalone ./ +cp -r server/migrations ./dist/init cat </usr/local/bin/pangctl #!/bin/sh @@ -74,6 +76,9 @@ flags: require_email_verification: false disable_signup_without_invite: false disable_user_create_org: false + +postgres: + connection_string: "postgresql://pangolin:${PG_DB_PASS}@localhost:5432/pangolin" EOF cat </opt/pangolin/config/traefik/traefik_config.yml @@ -181,7 +186,8 @@ http: servers: - url: "http://$LOCAL_IP:3000" EOF -$STD npm run db:push +export ENVIRONMENT=prod +$STD node dist/migrations.mjs . /etc/os-release if [ "$VERSION_CODENAME" = "trixie" ]; then @@ -197,7 +203,8 @@ msg_info "Creating Services" cat </etc/systemd/system/pangolin.service [Unit] Description=Pangolin Service -After=network.target +After=network.target postgresql.service +Wants=postgresql.service [Service] Type=simple From 2afea1239cce6876a11c45d300ca47c196774dc1 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 20:55:21 +0000 Subject: [PATCH 105/161] Update CHANGELOG.md (#15789) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dea512093..b87f350c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -524,6 +524,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - Bump OpenCloud version to v7.2.2 [@MickLesk](https://github.com/MickLesk) ([#15769](https://github.com/community-scripts/ProxmoxVE/pull/15769)) - Silverbullet: Add optional Runtime API install via Chromium [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15761](https://github.com/community-scripts/ProxmoxVE/pull/15761)) + - #### 💥 Breaking Changes + + - Pangolin: Bump to 1.20.0 | BREAKING: Switch to PostgreSQL [@MickLesk](https://github.com/MickLesk) ([#15682](https://github.com/community-scripts/ProxmoxVE/pull/15682)) + - #### 🔧 Refactor - AFFiNE: Pin to v0.26.3 [@MickLesk](https://github.com/MickLesk) ([#15782](https://github.com/community-scripts/ProxmoxVE/pull/15782)) From c52a69e8e5b8680eed07037b0fbf1e7f0e5997fc Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 20:55:10 +1000 Subject: [PATCH 106/161] Nexterm (#15688) * Add nexterm (ct) * Remove architecture check from nexterm.sh Removed architecture check for dpkg. * Change var_arm64 default to 'yes' and update fetch commands * Fix license URL and update service creation messages * typo --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com> --- ct/headers/nexterm | 6 +++ ct/nexterm.sh | 66 +++++++++++++++++++++++++++++ install/nexterm-install.sh | 85 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 ct/headers/nexterm create mode 100644 ct/nexterm.sh create mode 100644 install/nexterm-install.sh diff --git a/ct/headers/nexterm b/ct/headers/nexterm new file mode 100644 index 000000000..7d52bc561 --- /dev/null +++ b/ct/headers/nexterm @@ -0,0 +1,6 @@ + _ __ __ + / | / /__ _ __/ /____ _________ ___ + / |/ / _ \| |/_/ __/ _ \/ ___/ __ `__ \ + / /| / __/> /etc/nexterm-engine/config.yaml +server_host: "127.0.0.1" +server_port: 7800 +registration_token: "${LOCAL_ENGINE_TOKEN}" +tls: false +EOF +cat </etc/nexterm-server/server.env +NODE_ENV=production +SERVER_PORT=6989 +LOCAL_ENGINE_TOKEN=${LOCAL_ENGINE_TOKEN} +ENCRYPTION_KEY=${ENCRYPTION_KEY} +EOF +chmod 0640 /etc/nexterm-engine/config.yaml /etc/nexterm-server/server.env +msg_ok "Configured Nexterm" + +msg_info "Creating Services" +cat </etc/systemd/system/nexterm-server.service +[Unit] +Description=Nexterm Server +Documentation=https://docs.nexterm.dev/ +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/nexterm/data +EnvironmentFile=/etc/nexterm-server/server.env +ExecStart=/opt/nexterm/server/nexterm-server +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +cat </etc/systemd/system/nexterm-engine.service +[Unit] +Description=Nexterm Engine +Documentation=https://docs.nexterm.dev/ +After=network-online.target nexterm-server.service +Wants=network-online.target + +[Service] +Type=simple +User=root +WorkingDirectory=/etc/nexterm-engine +Environment=FREERDP_EXTENSION_PATH=/opt/nexterm/engine/lib/freerdp2 +Environment=LD_LIBRARY_PATH=/opt/nexterm/engine/lib +ExecStart=/opt/nexterm/engine/nexterm-engine +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now nexterm-server +sleep 5 +systemctl enable -q --now nexterm-engine +msg_ok "Created Services" + +motd_ssh +customize +cleanup_lxc From c99768869daff20a9c193c3c9099c9187a59abd2 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 10:55:37 +0000 Subject: [PATCH 107/161] Update CHANGELOG.md (#15798) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b87f350c6..05c63577e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -502,6 +502,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-15 + +### 🆕 New Scripts + + - Nexterm ([#15688](https://github.com/community-scripts/ProxmoxVE/pull/15688)) + ## 2026-07-14 ### 🆕 New Scripts From 75a1da273f7b2c67b740ae76877bf87b47eb9604 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 15 Jul 2026 21:35:28 +0200 Subject: [PATCH 108/161] SnapOtter: refactor deployment and installation process (#15797) --- ct/snapotter.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ct/snapotter.sh b/ct/snapotter.sh index 2ebea2959..f0293ad1d 100644 --- a/ct/snapotter.sh +++ b/ct/snapotter.sh @@ -35,14 +35,12 @@ function update_script() { systemctl stop snapotter msg_ok "Stopped Service" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "snapotter" "snapotter-hq/SnapOtter" "tarball" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "snapotter" "snapotter-hq/SnapOtter" "prebuild" "latest" "/opt/snapotter" "snapotter-*-linux-amd64.tar.gz" msg_info "Updating SnapOtter" - cd /opt/snapotter - $STD npm pkg delete scripts.prepare - $STD pnpm install --frozen-lockfile - $STD pnpm --filter @snapotter/web build - sed -i 's/mediapipe==0.10.21/mediapipe>=0.10.21/' /opt/snapotter/docker/feature-manifest.json + $STD uv python install 3.11 + $STD uv venv --seed --python 3.11 /opt/snapotter_data/ai/venv + ln -sfn /opt/snapotter /app msg_ok "Updated SnapOtter" msg_info "Starting Service" From c759617379d0628fd21e11cdead9e9df5b7fa87b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 19:35:52 +0000 Subject: [PATCH 109/161] Update CHANGELOG.md (#15802) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05c63577e..03444fae6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -508,6 +508,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - Nexterm ([#15688](https://github.com/community-scripts/ProxmoxVE/pull/15688)) +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - SnapOtter: refactor update process to prebuild [@MickLesk](https://github.com/MickLesk) ([#15797](https://github.com/community-scripts/ProxmoxVE/pull/15797)) + ## 2026-07-14 ### 🆕 New Scripts From 812267aeddab1ea1c93c040f492c493b2a1b8000 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 15 Jul 2026 21:36:13 +0200 Subject: [PATCH 110/161] 2fauth: minor fixes for 8.0.0 (#15795) --- ct/2fauth.sh | 1 + install/2fauth-install.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/ct/2fauth.sh b/ct/2fauth.sh index 506f140d8..5b5dc3eb7 100644 --- a/ct/2fauth.sh +++ b/ct/2fauth.sh @@ -60,6 +60,7 @@ function update_script() { php artisan 2fauth:install chown -R www-data: /opt/2fauth chmod -R 755 /opt/2fauth + $STD php artisan 2fauth:fix-passport-key-permissions $STD systemctl restart php8.4-fpm $STD systemctl restart nginx msg_ok "Configured 2FAuth" diff --git a/install/2fauth-install.sh b/install/2fauth-install.sh index 386b5c3de..61c8377ae 100644 --- a/install/2fauth-install.sh +++ b/install/2fauth-install.sh @@ -43,6 +43,7 @@ $STD php artisan migrate:refresh $STD php artisan passport:install -q -n $STD php artisan storage:link $STD php artisan config:cache +$STD php artisan 2fauth:fix-passport-key-permissions chown -R www-data: /opt/2fauth chmod -R 755 /opt/2fauth msg_ok "Setup 2fauth" From 66eff7ee87841c38aff0525fb8f268a6beab702a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 19:36:37 +0000 Subject: [PATCH 111/161] Update CHANGELOG.md (#15803) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03444fae6..8b1550036 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -512,6 +512,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - 2fauth: minor fixes for 8.0.0 [@MickLesk](https://github.com/MickLesk) ([#15795](https://github.com/community-scripts/ProxmoxVE/pull/15795)) - SnapOtter: refactor update process to prebuild [@MickLesk](https://github.com/MickLesk) ([#15797](https://github.com/community-scripts/ProxmoxVE/pull/15797)) ## 2026-07-14 From 74a233b8b901421b17852e8693b5411ff09135d5 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 15 Jul 2026 21:37:10 +0200 Subject: [PATCH 112/161] Default Docker setup to official repo (#15794) --- misc/tools.func | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/misc/tools.func b/misc/tools.func index 4a35c695d..82f87ffea 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -4663,20 +4663,20 @@ setup_composer() { # - Cleans up legacy repository files # # Usage: -# setup_docker # Uses distro package (recommended) -# USE_DOCKER_REPO=true setup_docker # Uses official Docker repo +# setup_docker # Uses official Docker repo (recommended) +# USE_DOCKER_REPO=false setup_docker # Uses distro docker.io package # DOCKER_PORTAINER="true" setup_docker # DOCKER_LOG_DRIVER="json-file" setup_docker # # Variables: -# USE_DOCKER_REPO - Set to "true" to use official Docker repository -# (default: false, uses distro docker.io package) +# USE_DOCKER_REPO - Set to "false" to use distro docker.io package +# (default: true, uses official Docker repository) # DOCKER_PORTAINER - Install Portainer CE (optional, "true" to enable) # DOCKER_LOG_DRIVER - Log driver (optional, default: "journald") # DOCKER_SKIP_UPDATES - Skip container update check (optional, "true" to skip) # # Features: -# - Uses stable distro packages by default +# - Uses official Docker repository by default # - Migrates from get.docker.com to repository-based installation # - Updates Docker Engine if newer version available # - Interactive per-container update prompt (Y/N, 60 s auto-no) @@ -4692,7 +4692,7 @@ _docker_is_noninteractive() { setup_docker() { local docker_installed=false local portainer_installed=false - local USE_DOCKER_REPO="${USE_DOCKER_REPO:-false}" + local USE_DOCKER_REPO="${USE_DOCKER_REPO:-true}" # Check if Docker is already installed if command -v docker &>/dev/null; then @@ -4707,7 +4707,7 @@ setup_docker() { msg_info "Portainer container detected" fi - # Scenario 1: Use distro repository (default, most stable) + # Scenario 1: Use distro repository (opt-out via USE_DOCKER_REPO=false) if [[ "$USE_DOCKER_REPO" != "true" && "$USE_DOCKER_REPO" != "TRUE" && "$USE_DOCKER_REPO" != "1" ]]; then # Install or upgrade Docker from distro repo From b36ad5c3a2db0c15a8df768e8e793ee51a776c4b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 19:37:39 +0000 Subject: [PATCH 113/161] Update CHANGELOG.md (#15804) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b1550036..08054a113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -515,6 +515,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - 2fauth: minor fixes for 8.0.0 [@MickLesk](https://github.com/MickLesk) ([#15795](https://github.com/community-scripts/ProxmoxVE/pull/15795)) - SnapOtter: refactor update process to prebuild [@MickLesk](https://github.com/MickLesk) ([#15797](https://github.com/community-scripts/ProxmoxVE/pull/15797)) +### 💾 Core + + - #### 🔧 Refactor + + - tools.func: default Docker setup to official repo [@MickLesk](https://github.com/MickLesk) ([#15794](https://github.com/community-scripts/ProxmoxVE/pull/15794)) + ## 2026-07-14 ### 🆕 New Scripts From d23a2e64e7978d1318ff870927c2ac23cd7cedba Mon Sep 17 00:00:00 2001 From: MickLesk Date: Thu, 16 Jul 2026 09:01:53 +0200 Subject: [PATCH 114/161] migration snapotter --- ct/snapotter.sh | 50 ++++++++++++++++++++++++++++++++++-- install/snapotter-install.sh | 21 +++++++++++++-- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/ct/snapotter.sh b/ct/snapotter.sh index f0293ad1d..ce2323f8f 100644 --- a/ct/snapotter.sh +++ b/ct/snapotter.sh @@ -30,12 +30,58 @@ function update_script() { exit fi - if check_for_gh_release "snapotter" "snapotter-hq/SnapOtter"; then + NEEDS_V2_MIGRATION=false + grep -q '^DB_PATH=' /opt/snapotter_data/.env 2>/dev/null && NEEDS_V2_MIGRATION=true + UPDATE_AVAILABLE=false + check_for_gh_release "snapotter" "snapotter-hq/SnapOtter" && UPDATE_AVAILABLE=true + + if [[ "$NEEDS_V2_MIGRATION" == true || "$UPDATE_AVAILABLE" == true ]]; then msg_info "Stopping Service" systemctl stop snapotter msg_ok "Stopped Service" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "snapotter" "snapotter-hq/SnapOtter" "prebuild" "latest" "/opt/snapotter" "snapotter-*-linux-amd64.tar.gz" + PG_VERSION="17" setup_postgresql + if ! sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname = 'snapotter'" | grep -qx '1'; then + PG_DB_NAME="snapotter" PG_DB_USER="snapotter" setup_postgresql_db + else + PG_DB_NAME="snapotter" + PG_DB_USER="snapotter" + PG_DB_PASS=$(sed -n 's|^DATABASE_URL=postgres://snapotter:\([^@]*\)@.*|\1|p' /opt/snapotter_data/.env | head -n1) + if [[ -z "$PG_DB_PASS" ]]; then + msg_error "SnapOtter's PostgreSQL database exists, but its password is not available in /opt/snapotter_data/.env" + exit 1 + fi + fi + + msg_info "Installing Redis" + $STD apt install -y redis-server + if grep -q '^appendonly ' /etc/redis/redis.conf; then + sed -i 's/^appendonly .*/appendonly yes/' /etc/redis/redis.conf + else + echo 'appendonly yes' >>/etc/redis/redis.conf + fi + $STD systemctl enable --now redis-server + msg_ok "Installed Redis" + + msg_info "Migrating SnapOtter Configuration" + sed -i '/^DB_PATH=/d; /^DATABASE_URL=/d; /^REDIS_URL=/d; /^SQLITE_MIGRATE_PATH=/d' /opt/snapotter_data/.env + cat <>/opt/snapotter_data/.env +DATABASE_URL=postgres://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} +REDIS_URL=redis://127.0.0.1:6379 +EOF + if [[ -f /opt/snapotter_data/snapotter.db ]]; then + echo 'SQLITE_MIGRATE_PATH=/opt/snapotter_data/snapotter.db' >>/opt/snapotter_data/.env + fi + if ! grep -q '^Requires=postgresql.service redis-server.service$' /etc/systemd/system/snapotter.service; then + sed -i '/^After=/c\After=network-online.target postgresql.service redis-server.service' /etc/systemd/system/snapotter.service + sed -i '/^\[Unit\]/a Wants=network-online.target\nRequires=postgresql.service redis-server.service' /etc/systemd/system/snapotter.service + fi + systemctl daemon-reload + msg_ok "Migrated SnapOtter Configuration" + + if [[ "$UPDATE_AVAILABLE" == true ]]; then + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "snapotter" "snapotter-hq/SnapOtter" "prebuild" "latest" "/opt/snapotter" "snapotter-*-linux-amd64.tar.gz" + fi msg_info "Updating SnapOtter" $STD uv python install 3.11 diff --git a/install/snapotter-install.sh b/install/snapotter-install.sh index 7878c441a..b8330b7ca 100644 --- a/install/snapotter-install.sh +++ b/install/snapotter-install.sh @@ -39,6 +39,19 @@ msg_ok "Installed Dependencies" PYTHON_VERSION="3.11" setup_uv NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs +PG_VERSION="17" setup_postgresql +PG_DB_NAME="snapotter" PG_DB_USER="snapotter" setup_postgresql_db + +msg_info "Installing Redis" +$STD apt install -y redis-server +if grep -q '^appendonly ' /etc/redis/redis.conf; then + sed -i 's/^appendonly .*/appendonly yes/' /etc/redis/redis.conf +else + echo 'appendonly yes' >>/etc/redis/redis.conf +fi +$STD systemctl enable --now redis-server +msg_ok "Installed Redis" + fetch_and_deploy_gh_release "caire" "esimov/caire" "prebuild" "latest" "/usr/local/bin" "caire-*-linux-amd64.tar.gz" fetch_and_deploy_gh_release "snapotter" "snapotter-hq/SnapOtter" "prebuild" "latest" "/opt/snapotter" "snapotter-*-linux-amd64.tar.gz" @@ -61,7 +74,8 @@ mkdir -p /tmp/snapotter-workspace cat </opt/snapotter_data/.env PORT=1349 NODE_ENV=production -DB_PATH=/opt/snapotter_data/snapotter.db +DATABASE_URL=postgres://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME} +REDIS_URL=redis://127.0.0.1:6379 WORKSPACE_PATH=/tmp/snapotter-workspace FILES_STORAGE_PATH=/opt/snapotter_data/files PYTHON_VENV_PATH=/opt/snapotter_data/ai/venv @@ -85,7 +99,9 @@ PNPM_BIN="$(command -v pnpm)" cat </etc/systemd/system/snapotter.service [Unit] Description=SnapOtter Service -After=network.target +Wants=network-online.target +After=network-online.target postgresql.service redis-server.service +Requires=postgresql.service redis-server.service [Service] Type=simple @@ -99,6 +115,7 @@ RestartSec=5 [Install] WantedBy=multi-user.target EOF +systemctl daemon-reload systemctl enable -q --now snapotter msg_ok "Created Service" From 5144f8d0cc82cc05ce0ce4d17563c9be6aac2974 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 07:02:22 +0000 Subject: [PATCH 115/161] Update CHANGELOG.md (#15809) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08054a113..571d939bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -502,6 +502,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-16 + ## 2026-07-15 ### 🆕 New Scripts From c44789f5f6e734ad7f8c4cd5302da9a600802393 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 16 Jul 2026 03:30:38 -0400 Subject: [PATCH 116/161] Pin Immich to v3.0.3 (#15790) --- ct/immich.sh | 2 +- install/immich-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/immich.sh b/ct/immich.sh index e72c4b7fe..1ea66f467 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -110,7 +110,7 @@ EOF msg_ok "Image-processing libraries up to date" fi - RELEASE="v3.0.2" + RELEASE="v3.0.3" if check_for_gh_release "Immich" "immich-app/immich" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then if [[ $(cat ~/.immich) > "2.5.1" ]]; then msg_info "Enabling Maintenance Mode" diff --git a/install/immich-install.sh b/install/immich-install.sh index b75d4a7f2..688ae657e 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -312,7 +312,7 @@ ML_DIR="${APP_DIR}/machine-learning" GEO_DIR="${INSTALL_DIR}/geodata" mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache} -fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v3.0.2" "$SRC_DIR" +fetch_and_deploy_gh_release "Immich" "immich-app/immich" "tarball" "v3.0.3" "$SRC_DIR" PNPM_VERSION="$(jq -r '.packageManager | split("@")[1] | split("+")[0]' ${SRC_DIR}/package.json)" export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 NODE_VERSION="24" NODE_MODULE="corepack" setup_nodejs From b9f26d66ed5131bcded155ebb83784f303cf4355 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 07:31:00 +0000 Subject: [PATCH 117/161] Update CHANGELOG.md (#15810) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 571d939bb..07e93f2cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,6 +504,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-16 +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Pin Immich to v3.0.3 [@vhsdream](https://github.com/vhsdream) ([#15790](https://github.com/community-scripts/ProxmoxVE/pull/15790)) + ## 2026-07-15 ### 🆕 New Scripts From d122341a470838e6ecc8d8fdc678b460ae1e1c6e Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 18:01:24 +1000 Subject: [PATCH 118/161] Add notediscovery (ct) (#15811) Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> --- ct/headers/notediscovery | 6 +++ ct/notediscovery.sh | 64 ++++++++++++++++++++++++++++++++ install/notediscovery-install.sh | 51 +++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 ct/headers/notediscovery create mode 100644 ct/notediscovery.sh create mode 100644 install/notediscovery-install.sh diff --git a/ct/headers/notediscovery b/ct/headers/notediscovery new file mode 100644 index 000000000..df51d962d --- /dev/null +++ b/ct/headers/notediscovery @@ -0,0 +1,6 @@ + _ __ __ ____ _ + / | / /___ / /____ / __ \(_)_____________ _ _____ _______ __ + / |/ / __ \/ __/ _ \/ / / / / ___/ ___/ __ \ | / / _ \/ ___/ / / / + / /| / /_/ / /_/ __/ /_/ / (__ ) /__/ /_/ / |/ / __/ / / /_/ / +/_/ |_/\____/\__/\___/_____/_/____/\___/\____/|___/\___/_/ \__, / + /____/ diff --git a/ct/notediscovery.sh b/ct/notediscovery.sh new file mode 100644 index 000000000..3b15fd0c7 --- /dev/null +++ b/ct/notediscovery.sh @@ -0,0 +1,64 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/gamosoft/NoteDiscovery + +APP="NoteDiscovery" +var_tags="${var_tags:-notes;wiki;knowledge-base}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-512}" +var_disk="${var_disk:-4}" +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 [[ ! -d /opt/notediscovery ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "notediscovery" "gamosoft/NoteDiscovery"; then + msg_info "Stopping Service" + systemctl stop notediscovery + msg_ok "Stopped Service" + + create_backup /opt/notediscovery/data /opt/notediscovery/config.yaml + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "notediscovery" "gamosoft/NoteDiscovery" "tarball" + + msg_info "Syncing Dependencies" + cd /opt/notediscovery + $STD uv sync --no-dev + msg_ok "Synced Dependencies" + + restore_backup + + msg_info "Starting Service" + systemctl start notediscovery + msg_ok "Started Service" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8000${CL}" diff --git a/install/notediscovery-install.sh b/install/notediscovery-install.sh new file mode 100644 index 000000000..26687f8c6 --- /dev/null +++ b/install/notediscovery-install.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/gamosoft/NoteDiscovery + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +setup_uv + +fetch_and_deploy_gh_release "notediscovery" "gamosoft/NoteDiscovery" "tarball" + +msg_info "Installing Dependencies" +cd /opt/notediscovery +$STD uv sync --no-dev +msg_ok "Installed Dependencies" + +msg_info "Configuring NoteDiscovery" +mkdir -p /opt/notediscovery/data +msg_ok "Configured NoteDiscovery" + +msg_info "Creating Service" +cat </etc/systemd/system/notediscovery.service +[Unit] +Description=NoteDiscovery Knowledge Base +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/notediscovery +ExecStart=/opt/notediscovery/.venv/bin/python /opt/notediscovery/run.py +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now notediscovery +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From 9bb99c59c583d9c5306635da3a4365c79e82e460 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 18:01:44 +1000 Subject: [PATCH 119/161] Beaverhabits (#15813) * Add beaverhabits (ct) * Update URL to include '/register' path --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com> --- ct/beaverhabits.sh | 64 +++++++++++++++++++++++++++++++++ ct/headers/beaverhabits | 6 ++++ install/beaverhabits-install.sh | 53 +++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 ct/beaverhabits.sh create mode 100644 ct/headers/beaverhabits create mode 100644 install/beaverhabits-install.sh diff --git a/ct/beaverhabits.sh b/ct/beaverhabits.sh new file mode 100644 index 000000000..168be42d4 --- /dev/null +++ b/ct/beaverhabits.sh @@ -0,0 +1,64 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/daya0576/beaverhabits + +APP="BeaverHabits" +var_tags="${var_tags:-habits;tracking;productivity}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-4}" +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 [[ ! -d /opt/beaverhabits ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "beaverhabits" "daya0576/beaverhabits"; then + msg_info "Stopping Service" + systemctl stop beaverhabits + msg_ok "Stopped Service" + + create_backup /opt/beaverhabits/.user + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "beaverhabits" "daya0576/beaverhabits" "tarball" + + msg_info "Syncing Dependencies" + cd /opt/beaverhabits + $STD uv sync --no-dev + msg_ok "Synced Dependencies" + + restore_backup + + msg_info "Starting Service" + systemctl start beaverhabits + msg_ok "Started Service" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8080/register{CL}" diff --git a/ct/headers/beaverhabits b/ct/headers/beaverhabits new file mode 100644 index 000000000..0a11d4242 --- /dev/null +++ b/ct/headers/beaverhabits @@ -0,0 +1,6 @@ + ____ __ __ __ _ __ + / __ )___ ____ __ _____ _____/ / / /___ _/ /_ (_) /______ + / __ / _ \/ __ `/ | / / _ \/ ___/ /_/ / __ `/ __ \/ / __/ ___/ + / /_/ / __/ /_/ /| |/ / __/ / / __ / /_/ / /_/ / / /_(__ ) +/_____/\___/\__,_/ |___/\___/_/ /_/ /_/\__,_/_.___/_/\__/____/ + diff --git a/install/beaverhabits-install.sh b/install/beaverhabits-install.sh new file mode 100644 index 000000000..f58f4003a --- /dev/null +++ b/install/beaverhabits-install.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/daya0576/beaverhabits + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +PYTHON_VERSION="3.14" setup_uv + +fetch_and_deploy_gh_release "beaverhabits" "daya0576/beaverhabits" "tarball" + +msg_info "Installing Dependencies" +cd /opt/beaverhabits +$STD uv sync --no-dev +msg_ok "Installed Dependencies" + +msg_info "Configuring BeaverHabits" +mkdir -p /opt/beaverhabits/.user +msg_ok "Configured BeaverHabits" + +msg_info "Creating Service" +cat </etc/systemd/system/beaverhabits.service +[Unit] +Description=BeaverHabits Habit Tracker +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/beaverhabits +Environment=HABITS_STORAGE=USER_DISK +Environment=NICEGUI_STORAGE_PATH=/opt/beaverhabits/.user/.nicegui +ExecStart=/opt/beaverhabits/.venv/bin/gunicorn beaverhabits.main:app --bind 0.0.0.0:8080 -w 1 -k uvicorn_worker.UvicornWorker --max-requests 10000 --log-level info +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now beaverhabits +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From 6d6d66eec6f5110a223b9689da8c25b8e9e8ce0a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 08:01:53 +0000 Subject: [PATCH 120/161] Update CHANGELOG.md (#15814) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07e93f2cf..5b7b02e1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,6 +504,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-16 +### 🆕 New Scripts + + - Notediscovery ([#15811](https://github.com/community-scripts/ProxmoxVE/pull/15811)) + ### 🚀 Updated Scripts - #### 🐞 Bug Fixes From 775f1a98c219784fc1da25da0cd74dbe3db990e6 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 18:02:13 +1000 Subject: [PATCH 121/161] Sync-In (#15812) * Add sync-in (ct) * remove empty lines --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com> --- ct/headers/sync-in | 6 +++ ct/sync-in.sh | 65 ++++++++++++++++++++++++++++++ install/sync-in-install.sh | 82 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 ct/headers/sync-in create mode 100644 ct/sync-in.sh create mode 100644 install/sync-in-install.sh diff --git a/ct/headers/sync-in b/ct/headers/sync-in new file mode 100644 index 000000000..f5ae41c66 --- /dev/null +++ b/ct/headers/sync-in @@ -0,0 +1,6 @@ + _____ _ + / ___/__ ______ _____ (_)___ + \__ \/ / / / __ \/ ___/_____/ / __ \ + ___/ / /_/ / / / / /__/_____/ / / / / +/____/\__, /_/ /_/\___/ /_/_/ /_/ + /____/ diff --git a/ct/sync-in.sh b/ct/sync-in.sh new file mode 100644 index 000000000..4b43c6dd4 --- /dev/null +++ b/ct/sync-in.sh @@ -0,0 +1,65 @@ +#!/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: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Sync-in/server + +APP="Sync-in" +var_tags="${var_tags:-files;sync;collaboration}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-20}" +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 [[ ! -d /opt/sync-in/node_modules/@sync-in ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "sync-in" "Sync-in/server"; then + msg_info "Stopping Service" + systemctl stop sync-in + msg_ok "Stopped Service" + + msg_info "Updating Sync-in" + $STD npm install --prefix /opt/sync-in "@sync-in/server@${CHECK_UPDATE_RELEASE#v}" + msg_ok "Updated Sync-in" + + msg_info "Running Database Migrations" + cd /opt/sync-in + $STD npx sync-in-server migrate-db + msg_ok "Ran Database Migrations" + + VERSION=$(node -pe "require('/opt/sync-in/node_modules/@sync-in/server/package.json').version" 2>/dev/null || echo "") + [[ -n "$VERSION" ]] && echo "$VERSION" >~/.sync-in + + msg_info "Starting Service" + systemctl start sync-in + msg_ok "Started Service" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed Successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/install/sync-in-install.sh b/install/sync-in-install.sh new file mode 100644 index 000000000..0550fecca --- /dev/null +++ b/install/sync-in-install.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Sync-in/server + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +NODE_VERSION="22" setup_nodejs +setup_mariadb +MARIADB_DB_NAME="sync_in" MARIADB_DB_USER="sync_in" setup_mariadb_db + +msg_info "Installing Sync-in" +mkdir -p /opt/sync-in/data +$STD npm install --prefix /opt/sync-in @sync-in/server +msg_ok "Installed Sync-in" + +msg_info "Configuring Sync-in" +ENCRYPT_KEY=$(openssl rand -hex 32) +ACCESS_SECRET=$(openssl rand -hex 32) +REFRESH_SECRET=$(openssl rand -hex 32) +cat </opt/sync-in/environment.yaml +server: + port: 8080 +mysql: + url: 'mysql://${MARIADB_DB_USER}:${MARIADB_DB_PASS}@localhost:3306/${MARIADB_DB_NAME}' +auth: + encryptionKey: '${ENCRYPT_KEY}' + token: + access: + secret: '${ACCESS_SECRET}' + refresh: + secret: '${REFRESH_SECRET}' +applications: + files: + dataPath: '/opt/sync-in/data' +EOF +msg_ok "Configured Sync-in" + +msg_info "Running Database Migrations" +cd /opt/sync-in +$STD npx sync-in-server migrate-db +msg_ok "Ran Database Migrations" + +msg_info "Creating Admin User" +cd /opt/sync-in +$STD npx sync-in-server create-user +msg_ok "Created Admin User" + +VERSION=$(node -pe "require('/opt/sync-in/node_modules/@sync-in/server/package.json').version" 2>/dev/null || echo "") +[[ -n "$VERSION" ]] && echo "$VERSION" >~/.sync-in + +msg_info "Creating Service" +cat </etc/systemd/system/sync-in.service +[Unit] +Description=Sync-in Server +After=network.target mariadb.service + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/sync-in +ExecStart=/opt/sync-in/node_modules/.bin/sync-in-server start +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now sync-in +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From 12dec08523df35d0a2ff82f83f9e676d4556e8b7 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 08:02:15 +0000 Subject: [PATCH 122/161] Update CHANGELOG.md (#15815) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b7b02e1a..46862da55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,7 +506,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🆕 New Scripts - - Notediscovery ([#15811](https://github.com/community-scripts/ProxmoxVE/pull/15811)) + - Beaverhabits ([#15813](https://github.com/community-scripts/ProxmoxVE/pull/15813)) +- Notediscovery ([#15811](https://github.com/community-scripts/ProxmoxVE/pull/15811)) ### 🚀 Updated Scripts From 04a84f505242ebf5c1ce1d91d0a6e928ea179ab5 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 10:28:25 +0200 Subject: [PATCH 123/161] Update CHANGELOG.md (#15816) Co-authored-by: github-actions[bot] Co-authored-by: Sam Heinz --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46862da55..f4262df4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,8 +506,9 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🆕 New Scripts + - Sync-In ([#15812](https://github.com/community-scripts/ProxmoxVE/pull/15812)) - Beaverhabits ([#15813](https://github.com/community-scripts/ProxmoxVE/pull/15813)) -- Notediscovery ([#15811](https://github.com/community-scripts/ProxmoxVE/pull/15811)) + - Notediscovery ([#15811](https://github.com/community-scripts/ProxmoxVE/pull/15811)) ### 🚀 Updated Scripts From 772430de7e101ddc47bbcd75de047550045e478a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 08:28:51 +0000 Subject: [PATCH 124/161] Update CHANGELOG.md (#15818) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4262df4f..51cae93c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -507,8 +507,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🆕 New Scripts - Sync-In ([#15812](https://github.com/community-scripts/ProxmoxVE/pull/15812)) - - Beaverhabits ([#15813](https://github.com/community-scripts/ProxmoxVE/pull/15813)) - - Notediscovery ([#15811](https://github.com/community-scripts/ProxmoxVE/pull/15811)) +- Beaverhabits ([#15813](https://github.com/community-scripts/ProxmoxVE/pull/15813)) +- Notediscovery ([#15811](https://github.com/community-scripts/ProxmoxVE/pull/15811)) ### 🚀 Updated Scripts From e15db754a633e997b6ac6d4b7fb0b438bb122768 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Thu, 16 Jul 2026 11:44:55 +0200 Subject: [PATCH 125/161] github: close PRs that do not follow the PR template Add a workflow that validates description, prerequisites, and type-of-change checkboxes, with exemptions for bots, maintainers, and the keep open label. --- .../workflows/close-invalid-pr-template.yml | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 .github/workflows/close-invalid-pr-template.yml diff --git a/.github/workflows/close-invalid-pr-template.yml b/.github/workflows/close-invalid-pr-template.yml new file mode 100644 index 000000000..ce4c9a1bb --- /dev/null +++ b/.github/workflows/close-invalid-pr-template.yml @@ -0,0 +1,163 @@ +name: Close PRs Missing Template + +on: + pull_request_target: + branches: ["main"] + types: [opened, edited, reopened, synchronize, labeled] + +jobs: + validate-pr-template: + if: github.repository == 'community-scripts/ProxmoxVE' + runs-on: ubuntu-latest + permissions: + pull-requests: write + issues: write + contents: read + steps: + - name: Close PR if it does not follow the PR template + uses: actions/github-script@v7 + with: + script: | + const pr = context.payload.pull_request; + const prNumber = pr.number; + const author = pr.user.login; + const owner = context.repo.owner; + const repo = context.repo.repo; + + const allowedBots = [ + "push-app-to-main[bot]", + "push-app-to-main", + "community-scripts-pr-app", + "github-actions[bot]", + "dependabot[bot]", + ]; + + if (allowedBots.includes(author) || author.endsWith("[bot]")) { + core.info(`PR #${prNumber} by bot "${author}" — skipping template validation.`); + return; + } + + const association = pr.author_association; + const exemptAssociations = ["OWNER", "MEMBER", "COLLABORATOR"]; + if (exemptAssociations.includes(association)) { + core.info(`PR #${prNumber} by ${association} "${author}" — skipping template validation.`); + return; + } + + const labels = pr.labels.map((label) => label.name); + const skipLabels = ["automated pr", "keep open"]; + + if (skipLabels.some((label) => labels.includes(label))) { + core.info(`PR #${prNumber} has a skip label (${labels.join(", ")}) — skipping template validation.`); + return; + } + + if (pr.draft) { + core.info(`PR #${prNumber} is a draft — skipping template validation.`); + return; + } + + const body = pr.body || ""; + const failures = []; + + const requiredSections = [ + "## ✍️ Description", + "## ✅ Prerequisites", + "## 🛠️ Type of Change", + ]; + + for (const section of requiredSections) { + if (!body.includes(section)) { + failures.push(`Missing required section: \`${section}\``); + } + } + + const descriptionMatch = body.match( + /## ✍️ Description\s*\n+([\s\S]*?)(?=\n## )/i + ); + const description = (descriptionMatch?.[1] || "").trim(); + if (!description) { + failures.push("The **Description** section is empty."); + } + + const prerequisiteCheckboxes = [ + "**Self-review completed**", + "**Tested thoroughly**", + "**No security risks**", + ]; + + for (const checkbox of prerequisiteCheckboxes) { + const escaped = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1"); + const regex = new RegExp(`- \\[(x|X)\\]\\s*${escaped}`, "i"); + if (!regex.test(body)) { + failures.push(`Prerequisite not checked: ${checkbox}`); + } + } + + const typeOfChangeCheckboxes = [ + "🐞 **Bug fix**", + "✨ **New feature**", + "💥 **Breaking change**", + "🆕 **New script**", + "🌍 **Website update**", + "🔧 **Refactoring / Code Cleanup**", + "📝 **Documentation update**", + ]; + + const hasTypeChecked = typeOfChangeCheckboxes.some((checkbox) => { + const escaped = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1"); + const regex = new RegExp(`- \\[(x|X)\\]\\s*${escaped}`, "i"); + return regex.test(body); + }); + + if (!hasTypeChecked) { + failures.push("At least one **Type of Change** checkbox must be checked."); + } + + if (failures.length === 0) { + core.info(`PR #${prNumber} follows the PR template.`); + return; + } + + core.info(`Closing PR #${prNumber} — template validation failed.`); + + const templateUrl = + "https://github.com/community-scripts/ProxmoxVE/blob/main/.github/pull_request_template.md"; + const failureList = failures.map((item) => `- ${item}`).join("\n"); + + const comment = [ + `👋 Hi @${author},`, + ``, + `This pull request was closed because it does not follow the [PR template](${templateUrl}).`, + ``, + `Please fix the following and open a new PR (or reopen this one after updating the description):`, + ``, + failureList, + ``, + `> Use the template sections, fill in the description, check all prerequisite boxes, and select at least one type of change.`, + ``, + `Maintainers can add the \`keep open\` label to exempt a PR from this check.`, + ``, + `Thank you for contributing! 🙏`, + ].join("\n"); + + await github.rest.issues.createComment({ + owner, + repo, + issue_number: prNumber, + body: comment, + }); + + await github.rest.pulls.update({ + owner, + repo, + pull_number: prNumber, + state: "closed", + }); + + await github.rest.issues.addLabels({ + owner, + repo, + issue_number: prNumber, + labels: ["missing pr template"], + }); From 8655282c2dd0ced0be15bc37b07adbc7ef818fb0 Mon Sep 17 00:00:00 2001 From: soupy-boy <50962850+soupy-boy@users.noreply.github.com> Date: Fri, 17 Jul 2026 00:43:05 -0600 Subject: [PATCH 126/161] autoremove and autoclean after apt full-upgrade (#15831) --- tools/pve/update-lxcs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pve/update-lxcs.sh b/tools/pve/update-lxcs.sh index 52e9d2528..e083a4fc2 100644 --- a/tools/pve/update-lxcs.sh +++ b/tools/pve/update-lxcs.sh @@ -78,7 +78,7 @@ function update_container() { alpine) pct exec "$container" -- ash -c "apk -U upgrade" ;; archlinux) pct exec "$container" -- bash -c "pacman -Syyu --noconfirm" ;; fedora | rocky | centos | alma) pct exec "$container" -- bash -c "dnf -y update && dnf -y upgrade" ;; - ubuntu | debian | devuan) pct exec "$container" -- bash -c "apt-get update 2>/dev/null | grep 'packages.*upgraded'; apt list --upgradable 2>/dev/null | cat && apt-get -yq dist-upgrade 2>&1; rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED || true" ;; + ubuntu | debian | devuan) pct exec "$container" -- bash -c "apt-get update 2>/dev/null | grep 'packages.*upgraded'; apt list --upgradable 2>/dev/null | cat && apt-get -yq dist-upgrade 2>&1; apt-get -yq autoremove 2>&1; apt-get -yq autoclean 2>&1; rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED || true" ;; opensuse) pct exec "$container" -- bash -c "zypper ref && zypper --non-interactive dup" ;; esac } From a51e1f37f5c33909ebab38a43b0a19cea38a903b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 06:43:31 +0000 Subject: [PATCH 127/161] Update CHANGELOG.md (#15836) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51cae93c6..a3b11f22a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -502,6 +502,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-17 + +### 🧰 Tools + + - #### ✨ New Features + + - update-lxc: autoremove and autoclean after apt full-upgrade [@soupy-boy](https://github.com/soupy-boy) ([#15831](https://github.com/community-scripts/ProxmoxVE/pull/15831)) + ## 2026-07-16 ### 🆕 New Scripts From 55002839fb966a65212995bdd5502fb1c7ee697c Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 17 Jul 2026 03:00:32 -0400 Subject: [PATCH 128/161] Pin Opencloud to v7.3.0 (#15826) --- ct/opencloud.sh | 2 +- install/opencloud-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/opencloud.sh b/ct/opencloud.sh index 0ce6d9291..51485fec3 100644 --- a/ct/opencloud.sh +++ b/ct/opencloud.sh @@ -30,7 +30,7 @@ function update_script() { exit fi - RELEASE="v7.2.2" + RELEASE="v7.3.0" 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/install/opencloud-install.sh b/install/opencloud-install.sh index f3f1bc93b..d0cb26994 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.2" "/usr/bin" "opencloud-*-linux-$(arch_resolve)" +fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v7.3.0" "/usr/bin" "opencloud-*-linux-$(arch_resolve)" mv /usr/bin/OpenCloud /usr/bin/opencloud msg_info "Configuring OpenCloud" From 3f90af2a214d8bfc2ec9b1d27fcb2c7495fb3a01 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 07:00:56 +0000 Subject: [PATCH 129/161] Update CHANGELOG.md (#15839) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3b11f22a..836222dbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,6 +504,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-17 +### 🚀 Updated Scripts + + - #### ✨ New Features + + - Pin Opencloud to v7.3.0 [@vhsdream](https://github.com/vhsdream) ([#15826](https://github.com/community-scripts/ProxmoxVE/pull/15826)) + ### 🧰 Tools - #### ✨ New Features From 5d4eff049323476e96e192b5d9fde03c8ffecd52 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Fri, 17 Jul 2026 11:59:05 +0200 Subject: [PATCH 130/161] fix(esphome): install libusb-1.0-0 for ESP-IDF native builds (#15838) ESPHome 2026.7.0 validates openocd-esp32 during native ESP-IDF setup, which requires libusb-1.0.so.0. Add the runtime package to install and update paths. Fixes #15835 --- ct/esphome.sh | 1 + install/esphome-install.sh | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ct/esphome.sh b/ct/esphome.sh index 4dcf1ea06..086be0e83 100644 --- a/ct/esphome.sh +++ b/ct/esphome.sh @@ -28,6 +28,7 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + ensure_dependencies libusb-1.0-0 msg_info "Stopping Service" systemctl stop esphome-device-builder 2>/dev/null || true diff --git a/install/esphome-install.sh b/install/esphome-install.sh index 1b5b7367d..02c46b155 100644 --- a/install/esphome-install.sh +++ b/install/esphome-install.sh @@ -14,7 +14,8 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt install -y git +$STD apt install -y git \ + libusb-1.0-0 msg_ok "Installed Dependencies" PYTHON_VERSION="3.12" setup_uv From c991a7eccf5ab4fdf8c50ea4f2bbb6db42b4be9d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 09:59:30 +0000 Subject: [PATCH 131/161] Update CHANGELOG.md (#15843) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 836222dbc..4f39a7fa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,6 +506,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 Updated Scripts + - #### 🐞 Bug Fixes + + - esphome: install libusb-1.0-0 for ESP-IDF native builds [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15838](https://github.com/community-scripts/ProxmoxVE/pull/15838)) + - #### ✨ New Features - Pin Opencloud to v7.3.0 [@vhsdream](https://github.com/vhsdream) ([#15826](https://github.com/community-scripts/ProxmoxVE/pull/15826)) From 271df3c3fb8a02c755470264d3693bfdd935589c Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Fri, 17 Jul 2026 12:18:36 +0200 Subject: [PATCH 132/161] feat(build.func): notify users when already on a pinned script version (#15819) Query PocketBase pinned_version/pin_reason during LXC updates and show an informational message when the installed version matches the pin, so users know not to open issues for missing newer updates. --- misc/build.func | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/misc/build.func b/misc/build.func index 93fced258..53509780f 100644 --- a/misc/build.func +++ b/misc/build.func @@ -3753,18 +3753,19 @@ run_addon_updates() { } runtime_script_status_guard() { + local mode="${1:-}" local script_slug="${SCRIPT_SLUG:-${NSAPP:-}}" script_slug="$(echo "$script_slug" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')" [[ -z "$script_slug" ]] && return 0 - local api_url="https://db.community-scripts.org/api/collections/script_scripts/records?filter=(slug='${script_slug}')&perPage=1&fields=slug,is_disabled,is_deleted,disable_message,deleted_message" + local api_url="https://db.community-scripts.org/api/collections/script_scripts/records?filter=(slug='${script_slug}')&perPage=1&fields=slug,is_disabled,is_deleted,disable_message,deleted_message,pinned_version,pin_reason" local response if ! response=$(curl -fsSL --connect-timeout 2 --max-time 3 "$api_url" 2>/dev/null); then msg_warn "Script status check is unavailable. Continuing without status verification." return 0 fi - local is_deleted is_disabled deleted_message disable_message info_url + local is_deleted is_disabled deleted_message disable_message pinned_version pin_reason info_url if printf '%s' "$response" | grep -qE '"items":[[:space:]]*\[[[:space:]]*\]'; then return 0 fi @@ -3774,6 +3775,8 @@ runtime_script_status_guard() { is_disabled=$(printf '%s' "$response" | sed -n 's/.*"is_disabled"[[:space:]]*:[[:space:]]*\(true\|false\).*/\1/p' | head -1) deleted_message=$(printf '%s' "$response" | sed -n 's/.*"deleted_message"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1) disable_message=$(printf '%s' "$response" | sed -n 's/.*"disable_message"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1) + pinned_version=$(printf '%s' "$response" | sed -n 's/.*"pinned_version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1) + pin_reason=$(printf '%s' "$response" | sed -n 's/.*"pin_reason"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1) is_deleted=${is_deleted:-false} is_disabled=${is_disabled:-false} info_url="https://community-scripts.org/scripts/${script_slug}" @@ -3805,6 +3808,26 @@ runtime_script_status_guard() { return 1 fi + if [[ "$mode" == "update" && -n "$pinned_version" && -n "${NSAPP:-}" ]]; then + local current_file="$HOME/.${NSAPP}" + if [[ -f "$current_file" ]]; then + local installed pinned_clean installed_clean + installed="$(<"$current_file")" + pinned_clean="$pinned_version" + installed_clean="$installed" + [[ "$pinned_clean" =~ ^v[0-9] ]] && pinned_clean="${pinned_clean:1}" + [[ "$installed_clean" =~ ^v[0-9] ]] && installed_clean="${installed_clean:1}" + if [[ "$installed_clean" == "$pinned_clean" ]]; then + if [[ -n "$pin_reason" ]]; then + msg_info "You are already on the pinned version (${pinned_version}). ${pin_reason}" + else + msg_info "You are already on the pinned version (${pinned_version}). No newer update is offered intentionally — please do not open an issue unless you see an actual error." + fi + msg_info "More info: ${info_url}" + fi + fi + fi + return 0 } @@ -3820,7 +3843,7 @@ runtime_script_status_guard() { start() { source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) if command -v pveversion >/dev/null 2>&1; then - runtime_script_status_guard || return 0 + runtime_script_status_guard install || return 0 install_script || return 0 return 0 elif [ ! -z ${PHS_SILENT+x} ] && [[ "${PHS_SILENT}" == "1" ]]; then @@ -3828,7 +3851,7 @@ start() { set_std_mode ensure_profile_loaded get_lxc_ip - runtime_script_status_guard || return 0 + runtime_script_status_guard update || return 0 update_script run_addon_updates update_motd_ip @@ -3839,7 +3862,7 @@ start() { set_std_mode ensure_profile_loaded get_lxc_ip - runtime_script_status_guard || return 0 + runtime_script_status_guard update || return 0 update_script run_addon_updates update_motd_ip @@ -3869,7 +3892,7 @@ start() { esac ensure_profile_loaded get_lxc_ip - runtime_script_status_guard || return 0 + runtime_script_status_guard update || return 0 update_script run_addon_updates update_motd_ip From f119e8782a74484ae2bfd84801d212a43cd814a2 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 10:18:59 +0000 Subject: [PATCH 133/161] Update CHANGELOG.md (#15844) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f39a7fa8..e16f9052e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -514,6 +514,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - Pin Opencloud to v7.3.0 [@vhsdream](https://github.com/vhsdream) ([#15826](https://github.com/community-scripts/ProxmoxVE/pull/15826)) +### 💾 Core + + - #### ✨ New Features + + - feat(build.func): notify users when already on a pinned script version [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15819](https://github.com/community-scripts/ProxmoxVE/pull/15819)) + ### 🧰 Tools - #### ✨ New Features From 7bf45d5b6601e5b8896cd2a2ebbf0fa3105a1055 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Fri, 17 Jul 2026 12:49:24 +0200 Subject: [PATCH 134/161] fix stupid branch delete bot --- .github/workflows/delete-merged-branches.yml | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/delete-merged-branches.yml b/.github/workflows/delete-merged-branches.yml index aafaf2b44..09a9f8ab1 100644 --- a/.github/workflows/delete-merged-branches.yml +++ b/.github/workflows/delete-merged-branches.yml @@ -91,6 +91,30 @@ jobs: let skipped = 0; for (const branch of candidates) { + // A branch name can be reused after an earlier PR was merged. Never delete a + // branch while it is the head of a current open PR, even if it is also a + // candidate from an older merged PR. + try { + const { data: openPrs } = await github.rest.pulls.list({ + owner, + repo, + state: "open", + head: `${owner}:${branch}`, + per_page: 1, + }); + + if (openPrs.length > 0) { + console.log(`Skipped "${branch}" (head of open PR #${openPrs[0].number})`); + skipped++; + continue; + } + } catch (error) { + // Do not risk deleting a branch if GitHub cannot confirm it has no open PR. + console.log(`Failed to check open PRs for "${branch}": ${error.message}`); + skipped++; + continue; + } + // Confirm the branch still exists and isn't protected. let branchData; try { From abc31499a2228db9b6cbfee457703d85544c9452 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Fri, 17 Jul 2026 12:52:57 +0200 Subject: [PATCH 135/161] n8n: unpin / use latest release (#15817) * n8n: unpin / use latest release startup issue is fixed, so unpin and set to latest release * Update n8n installation to latest version --- ct/n8n.sh | 2 +- install/n8n-install.sh | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ct/n8n.sh b/ct/n8n.sh index 8f9cb483b..658a19b6c 100644 --- a/ct/n8n.sh +++ b/ct/n8n.sh @@ -45,7 +45,7 @@ EOF systemctl daemon-reload fi - $STD npm install -g n8n@2.27.5 + $STD npm install -g n8n@latest systemctl restart n8n msg_ok "Updated n8n" msg_ok "Updated successfully!" diff --git a/install/n8n-install.sh b/install/n8n-install.sh index 8ddf37d0b..c6f0d421a 100644 --- a/install/n8n-install.sh +++ b/install/n8n-install.sh @@ -16,7 +16,6 @@ update_os msg_info "Installing Dependencies" $STD apt install -y \ build-essential \ - python3 \ python3-setuptools \ graphicsmagick msg_ok "Installed Dependencies" @@ -24,7 +23,7 @@ msg_ok "Installed Dependencies" NODE_VERSION="24" setup_nodejs msg_info "Installing n8n (Patience)" -$STD npm install -g n8n@2.27.5 +$STD npm install -g n8n@latest msg_ok "Installed n8n" msg_info "Creating Service" From 373ae7e143ce9d4411cb43e28133134b3098c606 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Fri, 17 Jul 2026 12:53:05 +0200 Subject: [PATCH 136/161] MongoDB: Implement kernel version check and patch (#15821) --- misc/tools.func | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/misc/tools.func b/misc/tools.func index 82f87ffea..c80a879d8 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -7431,6 +7431,18 @@ setup_mongodb() { mkdir -p /var/lib/mongodb chown -R mongodb:mongodb /var/lib/mongodb + local KERNEL_VERSION MONGO_MAJOR + KERNEL_VERSION=$(uname -r | cut -d- -f1) + MONGO_MAJOR="${MONGO_VERSION%%.*}" + if ((MONGO_MAJOR >= 8)) && [[ "$(printf '%s\n' "6.19" "$KERNEL_VERSION" | sort -V | head -n1)" == "6.19" ]]; then + mkdir -p /etc/systemd/system/mongod.service.d + cat </etc/systemd/system/mongod.service.d/rseq.conf +[Service] +Environment=GLIBC_TUNABLES=glibc.pthread.rseq=1 +EOF + systemctl daemon-reload + fi + $STD systemctl enable mongod || { msg_warn "Failed to enable mongod service" } From 7c7d40cfe3f4a22137e087738f04f0fd3cff5407 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Fri, 17 Jul 2026 12:53:13 +0200 Subject: [PATCH 137/161] tools.func: enhance rbenv with profile updates / bundle in bashrc (#15822) * tools.func: enhance rbenv with profile updates / bundle in bashrc Added checks to update shell profile files for rbenv integration and removed redundant profile setup code. * Refactor Ruby version installation script * Fix comment formatting in tools.func --- misc/tools.func | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/misc/tools.func b/misc/tools.func index c80a879d8..adb7a5ac4 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -8689,6 +8689,7 @@ setup_postgresql_db() { export PG_DB_USER export PG_DB_PASS } + # ------------------------------------------------------------------------------ # Installs rbenv and ruby-build, installs Ruby and optionally Rails. # @@ -8708,8 +8709,26 @@ setup_ruby() { local RBENV_DIR="$HOME/.rbenv" local RBENV_BIN="$RBENV_DIR/bin/rbenv" local PROFILE_FILE="$HOME/.profile" + local BASH_PROFILE_FILE="$HOME/.bash_profile" + local BASHRC_FILE="$HOME/.bashrc" local TMP_DIR=$(mktemp -d) + if ! grep -q 'rbenv init' "$PROFILE_FILE" 2>/dev/null; then + cat <<'EOF' >>"$PROFILE_FILE" +export PATH="$HOME/.rbenv/bin:$PATH" +eval "$(rbenv init -)" +EOF + fi + if ! grep -q '.rbenv/shims' "$PROFILE_FILE" 2>/dev/null; then + echo 'export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"' >>"$PROFILE_FILE" + fi + if [[ -f "$BASH_PROFILE_FILE" ]] && ! grep -q '.rbenv/shims' "$BASH_PROFILE_FILE"; then + echo 'export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"' >>"$BASH_PROFILE_FILE" + fi + if [[ -f "$BASHRC_FILE" ]] && ! grep -q '.rbenv/shims' "$BASHRC_FILE"; then + echo 'export PATH="$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"' >>"$BASHRC_FILE" + fi + # Get currently installed Ruby version local CURRENT_RUBY_VERSION="" if [[ -x "$RBENV_BIN" ]]; then From 853f5e868a231519da977c04b01dedc7d1360e25 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 10:53:20 +0000 Subject: [PATCH 138/161] Update CHANGELOG.md (#15846) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e16f9052e..0721bdd1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -512,6 +512,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### ✨ New Features + - n8n: unpin / use latest release [@MickLesk](https://github.com/MickLesk) ([#15817](https://github.com/community-scripts/ProxmoxVE/pull/15817)) - Pin Opencloud to v7.3.0 [@vhsdream](https://github.com/vhsdream) ([#15826](https://github.com/community-scripts/ProxmoxVE/pull/15826)) ### 💾 Core @@ -520,6 +521,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - feat(build.func): notify users when already on a pinned script version [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15819](https://github.com/community-scripts/ProxmoxVE/pull/15819)) + - #### 💥 Breaking Changes + + - MongoDB: Implement kernel version check and patch [@MickLesk](https://github.com/MickLesk) ([#15821](https://github.com/community-scripts/ProxmoxVE/pull/15821)) + ### 🧰 Tools - #### ✨ New Features From 8f2b68ed7e577f362390330f85f9c1aeeda86b12 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 10:53:42 +0000 Subject: [PATCH 139/161] Update CHANGELOG.md (#15847) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0721bdd1e..9471d1a73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -519,6 +519,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### ✨ New Features + - tools.func: enhance rbenv with profile updates / bundle in bashrc [@MickLesk](https://github.com/MickLesk) ([#15822](https://github.com/community-scripts/ProxmoxVE/pull/15822)) - feat(build.func): notify users when already on a pinned script version [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15819](https://github.com/community-scripts/ProxmoxVE/pull/15819)) - #### 💥 Breaking Changes From 79cee47df6682d044f53b8683bebe272af02696f Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:29:59 +0200 Subject: [PATCH 140/161] SFTPGo: Update APT Repo & Re-Enable Script (#15829) * SFTPGo: Update APT Repo & Re-Enable Script * Update sftpgo.sh --- ct/sftpgo.sh | 6 ++++++ install/sftpgo-install.sh | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ct/sftpgo.sh b/ct/sftpgo.sh index d96f013d2..5c6a79adf 100644 --- a/ct/sftpgo.sh +++ b/ct/sftpgo.sh @@ -28,6 +28,12 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + + setup_deb822_repo \ + "sftpgo" \ + "https://oss.sftpgo.com/apt/gpg.key" \ + "https://oss.sftpgo.com/apt" \ + "trixie" msg_info "Updating SFTPGo" $STD apt update diff --git a/install/sftpgo-install.sh b/install/sftpgo-install.sh index d27d4f761..5547d2e59 100644 --- a/install/sftpgo-install.sh +++ b/install/sftpgo-install.sh @@ -19,8 +19,8 @@ msg_ok "Installed Dependencies" setup_deb822_repo \ "sftpgo" \ - "https://ftp.osuosl.org/pub/sftpgo/apt/gpg.key" \ - "https://ftp.osuosl.org/pub/sftpgo/apt" \ + "https://oss.sftpgo.com/apt/gpg.key" \ + "https://oss.sftpgo.com/apt" \ "trixie" msg_info "Installing SFTPGo" From e7557c235541c56752f345baa6ab6b3b8708c36b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 12:30:21 +0000 Subject: [PATCH 141/161] Update CHANGELOG.md (#15849) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9471d1a73..eeccce0b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -515,6 +515,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - n8n: unpin / use latest release [@MickLesk](https://github.com/MickLesk) ([#15817](https://github.com/community-scripts/ProxmoxVE/pull/15817)) - Pin Opencloud to v7.3.0 [@vhsdream](https://github.com/vhsdream) ([#15826](https://github.com/community-scripts/ProxmoxVE/pull/15826)) + - #### 🔧 Refactor + + - SFTPGo: Update APT Repo & Re-Enable Script [@MickLesk](https://github.com/MickLesk) ([#15829](https://github.com/community-scripts/ProxmoxVE/pull/15829)) + ### 💾 Core - #### ✨ New Features From 2ab4a31dd1fa9c40662a8f2761c7d9a8872e8d6f Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:30:27 +0200 Subject: [PATCH 142/161] OxiCloud (#15823) * Add oxicloud (ct) * Update ct/oxicloud.sh --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: Sam Heinz --- ct/headers/oxicloud | 6 +++ ct/oxicloud.sh | 85 +++++++++++++++++++++++++++++++++++ install/oxicloud-install.sh | 88 +++++++++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 ct/headers/oxicloud create mode 100644 ct/oxicloud.sh create mode 100644 install/oxicloud-install.sh diff --git a/ct/headers/oxicloud b/ct/headers/oxicloud new file mode 100644 index 000000000..b48c6ee29 --- /dev/null +++ b/ct/headers/oxicloud @@ -0,0 +1,6 @@ + ____ _ ________ __ + / __ \_ __(_) ____/ /___ __ ______/ / + / / / / |/_/ / / / / __ \/ / / / __ / +/ /_/ /> /etc/oxicloud/.env +chmod 600 /etc/oxicloud/.env +msg_ok "Configured OxiCloud" + +msg_info "Creating OxiCloud Service" +cat </etc/systemd/system/oxicloud.service +[Unit] +Description=OxiCloud Service +After=network.target postgresql.service +Requires=postgresql.service + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/oxicloud +EnvironmentFile=/etc/oxicloud/.env +ExecStart=/usr/local/bin/oxicloud +Restart=always +RestartSec=5 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now oxicloud +msg_ok "Created OxiCloud Service" + +motd_ssh +customize +cleanup_lxc From 13d7bf6c7807fcfa17b348801bd88c227c5a44e0 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 12:30:43 +0000 Subject: [PATCH 143/161] Update CHANGELOG.md (#15850) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eeccce0b8..799803123 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,6 +504,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-17 +### 🆕 New Scripts + + - OxiCloud ([#15823](https://github.com/community-scripts/ProxmoxVE/pull/15823)) + ### 🚀 Updated Scripts - #### 🐞 Bug Fixes From ff192c45304745f786091593e22633923c9da911 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:30:55 +0200 Subject: [PATCH 145/161] Invidious (#15824) * Add invidious (ct) * Update install/invidious-install.sh * Update install/invidious-install.sh * Update install/invidious-install.sh * Update ct/invidious.sh * Update ct/invidious.sh --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: Sam Heinz --- ct/headers/invidious | 6 ++ ct/invidious.sh | 77 ++++++++++++++++++++++ install/invidious-install.sh | 121 +++++++++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+) create mode 100644 ct/headers/invidious create mode 100644 ct/invidious.sh create mode 100644 install/invidious-install.sh diff --git a/ct/headers/invidious b/ct/headers/invidious new file mode 100644 index 000000000..c858744dd --- /dev/null +++ b/ct/headers/invidious @@ -0,0 +1,6 @@ + ____ _ ___ + / _/___ _ __(_)___/ (_)___ __ _______ + / // __ \ | / / / __ / / __ \/ / / / ___/ + _/ // / / / |/ / / /_/ / / /_/ / /_/ (__ ) +/___/_/ /_/|___/_/\__,_/_/\____/\__,_/____/ + diff --git a/ct/invidious.sh b/ct/invidious.sh new file mode 100644 index 000000000..b3b68a632 --- /dev/null +++ b/ct/invidious.sh @@ -0,0 +1,77 @@ +#!/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: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/iv-org/invidious + +APP="Invidious" +var_tags="${var_tags:-streaming}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-4096}" +var_disk="${var_disk:-20}" +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 [[ ! -d /opt/invidious ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "Invidious" "iv-org/invidious"; then + msg_info "Stopping services" + $STD systemctl stop invidious-companion invidious + msg_ok "Stopped services" + + create_backup /opt/invidious/config/config.yml + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Invidious" "iv-org/invidious" "tarball" "latest" "/opt/invidious" + if check_for_gh_release "Invidious-Companion" "iv-org/invidious-companion"; then + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Invidious-Companion" "iv-org/invidious-companion" "prebuild" "latest" "/opt/invidious-companion" "invidious_companion-$(arch_resolve x86_64 aarch64)-unknown-linux-gnu.tar.gz" + fi + + msg_info "Rebuilding Invidious" + cd /opt/invidious + INVIDIOUS_VERSION="$(cat ~/.invidious 2>/dev/null || echo "unknown")" + INVIDIOUS_VERSION="${INVIDIOUS_VERSION#v}" + sed -i \ + -e "s~^\(\s*CURRENT_BRANCH\s*=\).*~\1 \"master\"~" \ + -e "s~^\(\s*CURRENT_COMMIT\s*=\).*~\1 \"\"~" \ + -e "s~^\(\s*CURRENT_VERSION\s*=\).*~\1 \"${INVIDIOUS_VERSION}\"~" \ + -e "s~^\(\s*CURRENT_TAG\s*=\).*~\1 \"${INVIDIOUS_VERSION}\"~" \ + -e "s~^\(\s*ASSET_COMMIT\s*=\).*~\1 \"\"~" \ + src/invidious.cr + $STD make + msg_ok "Rebuilt Invidious" + + restore_backup + + msg_info "Starting services" + $STD systemctl start invidious invidious-companion + msg_ok "Started services" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW}Access it using the following URL:${CL}" +echo -e "${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/install/invidious-install.sh b/install/invidious-install.sh new file mode 100644 index 000000000..798b09e92 --- /dev/null +++ b/install/invidious-install.sh @@ -0,0 +1,121 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/iv-org/invidious + +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 \ + git \ + pkg-config \ + libssl-dev \ + libxml2-dev \ + libyaml-dev \ + libgmp-dev \ + libreadline-dev \ + librsvg2-bin \ + libsqlite3-dev \ + zlib1g-dev \ + libpcre2-dev \ + libevent-dev \ + fonts-open-sans +msg_ok "Installed Dependencies" + +if [[ "$(arch_resolve amd64 arm64)" == "amd64" ]]; then + setup_deb822_repo "crystal" "https://download.opensuse.org/repositories/devel:/languages:/crystal/Debian_13/Release.key" "https://download.opensuse.org/repositories/devel:/languages:/crystal/Debian_13/" "./" + $STD apt install -y crystal +else + fetch_and_deploy_gh_release "Crystal" "crystal-lang/crystal" "prebuild" "latest" "/opt/crystal" "crystal-*-linux-aarch64-bundled.tar.gz" + ln -sf /opt/crystal/bin/crystal /usr/local/bin/crystal + ln -sf /opt/crystal/bin/shards /usr/local/bin/shards +fi + +PG_VERSION="17" setup_postgresql +PG_DB_NAME="invidious" PG_DB_USER="invidious" setup_postgresql_db +fetch_and_deploy_gh_release "Invidious" "iv-org/invidious" "tarball" "latest" "/opt/invidious" +fetch_and_deploy_gh_release "Invidious Companion" "iv-org/invidious-companion" "prebuild" "latest" "/opt/invidious-companion" "invidious_companion-$(arch_resolve x86_64 aarch64)-unknown-linux-gnu.tar.gz" + +msg_info "Building Invidious" +cd /opt/invidious +INVIDIOUS_VERSION="$(cat ~/.invidious 2>/dev/null || echo "unknown")" +INVIDIOUS_VERSION="${INVIDIOUS_VERSION#v}" +sed -i \ + -e "s~^\(\s*CURRENT_BRANCH\s*=\).*~\1 \"master\"~" \ + -e "s~^\(\s*CURRENT_COMMIT\s*=\).*~\1 \"\"~" \ + -e "s~^\(\s*CURRENT_VERSION\s*=\).*~\1 \"${INVIDIOUS_VERSION}\"~" \ + -e "s~^\(\s*CURRENT_TAG\s*=\).*~\1 \"${INVIDIOUS_VERSION}\"~" \ + -e "s~^\(\s*ASSET_COMMIT\s*=\).*~\1 \"\"~" \ + src/invidious.cr +$STD make +msg_ok "Built Invidious" + +msg_info "Configuring Invidious" +SECRET_KEY="$(openssl rand -hex 8)" +HMAC_KEY="$(openssl rand -hex 32)" +sed -e '\~^db:~,\~dbname:~d' \ + -e "s~^#database_.*~database_url: postgres://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}~" \ + -e 's~^#check_tables.*~check_tables: true~' \ + -e 's~^#invidious_companion:~invidious_companion:~' \ + -e 's~^# - private_~ - private_~' \ + -e "s~^#invidious_companion_key:.*~invidious_companion_key: \"${SECRET_KEY}\"~" \ + -e "s~^hmac_key:.*~hmac_key: \"${HMAC_KEY}\"~" \ + /opt/invidious/config/config.example.yml >/opt/invidious/config/config.yml +chmod 600 /opt/invidious/config/config.yml + +cat </etc/logrotate.d/invidious.logrotate +/opt/invidious/invidious.log { + rotate 4 + weekly + notifempty + missingok + compress + minsize 1048576 +} +EOF +chmod 0644 /etc/logrotate.d/invidious.logrotate +msg_ok "Configured Invidious" + +msg_info "Migrating database" +$STD ./invidious --migrate +msg_ok "Migrated database" + +msg_info "Configuring services" +sed -e 's|^User=invidious|User=root|' \ + -e 's|^Group=invidious|Group=root|' \ + -e 's|/home/invidious/invidious|/opt/invidious|g' \ + /opt/invidious/invidious.service >/etc/systemd/system/invidious.service +mkdir -p /var/tmp/youtubei.js +cat </etc/systemd/system/invidious-companion.service +[Unit] +Description=Invidious Companion +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/invidious-companion +Environment=SERVER_SECRET_KEY=${SECRET_KEY} +Environment=CACHE_DIRECTORY=/var/tmp/youtubei.js +ExecStart=/opt/invidious-companion/invidious_companion +Restart=always +RestartSec=2s + +[Install] +WantedBy=multi-user.target +EOF +systemctl -q enable --now invidious invidious-companion +msg_ok "Configured services" + +motd_ssh +customize +cleanup_lxc From b1259e3749cd1340d735a9617ba9151c4027301b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 12:31:05 +0000 Subject: [PATCH 146/161] Update CHANGELOG.md (#15852) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 799803123..51e416806 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -506,7 +506,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🆕 New Scripts - - OxiCloud ([#15823](https://github.com/community-scripts/ProxmoxVE/pull/15823)) + - Invidious ([#15824](https://github.com/community-scripts/ProxmoxVE/pull/15824)) +- OxiCloud ([#15823](https://github.com/community-scripts/ProxmoxVE/pull/15823)) ### 🚀 Updated Scripts From d2ecb9f44c3f3aa57980d9c23c84c8556e387b79 Mon Sep 17 00:00:00 2001 From: Austin Date: Fri, 17 Jul 2026 15:02:47 -0400 Subject: [PATCH 148/161] CLIProxyAPI: fix update deleting config.yaml (#15834) --- ct/cliproxyapi.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ct/cliproxyapi.sh b/ct/cliproxyapi.sh index 9eb49a1a6..40f9f2b1f 100644 --- a/ct/cliproxyapi.sh +++ b/ct/cliproxyapi.sh @@ -36,8 +36,12 @@ function update_script() { systemctl stop cliproxyapi msg_ok "Stopped CLIProxyAPI" + create_backup /opt/cliproxyapi/config.yaml + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cliproxyapi" "router-for-me/CLIProxyAPI" "prebuild" "latest" "/opt/cliproxyapi" "CLIProxyAPI_*_linux_$(arch_resolve "amd64" "aarch64").tar.gz" + restore_backup + msg_info "Starting CLIProxyAPI" systemctl start cliproxyapi msg_ok "Started CLIProxyAPI" From 29552c6e2ead168ed296fdd2a61a158144b3401b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 19:03:14 +0000 Subject: [PATCH 149/161] Update CHANGELOG.md (#15859) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51e416806..c09d83fab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -513,6 +513,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - CLIProxyAPI: fix update deleting config.yaml [@austinpilz](https://github.com/austinpilz) ([#15834](https://github.com/community-scripts/ProxmoxVE/pull/15834)) - esphome: install libusb-1.0-0 for ESP-IDF native builds [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15838](https://github.com/community-scripts/ProxmoxVE/pull/15838)) - #### ✨ New Features From b2936ff9ce1e819653eb3ea6081c511e7cbc3c3f Mon Sep 17 00:00:00 2001 From: TowyTowy <85077986+TowyTowy@users.noreply.github.com> Date: Fri, 17 Jul 2026 21:04:31 +0200 Subject: [PATCH 150/161] fix(apache-guacamole): detect installed extensions during update (#15841) --- ct/apache-guacamole.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ct/apache-guacamole.sh b/ct/apache-guacamole.sh index bbd9673cc..89f1b973b 100644 --- a/ct/apache-guacamole.sh +++ b/ct/apache-guacamole.sh @@ -146,7 +146,7 @@ function update_script() { # Check and upgrade optional extensions # TOTP Extension - if [[ -f /etc/guacamole/extensions/guacamole-auth-totp-*.jar ]]; then + if compgen -G "/etc/guacamole/extensions/guacamole-auth-totp-*.jar" >/dev/null; then msg_info "Updating TOTP Extension" rm -f /etc/guacamole/extensions/guacamole-auth-totp-*.jar curl_download "/tmp/guacamole-auth-totp.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-totp-${LATEST_SERVER}.tar.gz" @@ -158,7 +158,7 @@ function update_script() { fi # DUO Extension - if [[ -f /etc/guacamole/extensions/guacamole-auth-duo-*.jar ]]; then + if compgen -G "/etc/guacamole/extensions/guacamole-auth-duo-*.jar" >/dev/null; then msg_info "Updating DUO Extension" rm -f /etc/guacamole/extensions/guacamole-auth-duo-*.jar curl_download "/tmp/guacamole-auth-duo.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-duo-${LATEST_SERVER}.tar.gz" @@ -170,7 +170,7 @@ function update_script() { fi # LDAP Extension - if [[ -f /etc/guacamole/extensions/guacamole-auth-ldap-*.jar ]]; then + if compgen -G "/etc/guacamole/extensions/guacamole-auth-ldap-*.jar" >/dev/null; then msg_info "Updating LDAP Extension" rm -f /etc/guacamole/extensions/guacamole-auth-ldap-*.jar curl_download "/tmp/guacamole-auth-ldap.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-ldap-${LATEST_SERVER}.tar.gz" @@ -182,7 +182,7 @@ function update_script() { fi # Quick Connect Extension - if [[ -f /etc/guacamole/extensions/guacamole-auth-quickconnect-*.jar ]]; then + if compgen -G "/etc/guacamole/extensions/guacamole-auth-quickconnect-*.jar" >/dev/null; then msg_info "Updating Quick Connect Extension" rm -f /etc/guacamole/extensions/guacamole-auth-quickconnect-*.jar curl_download "/tmp/guacamole-auth-quickconnect.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-auth-quickconnect-${LATEST_SERVER}.tar.gz" @@ -194,7 +194,7 @@ function update_script() { fi # History Recording Storage Extension - if [[ -f /etc/guacamole/extensions/guacamole-history-recording-storage-*.jar ]]; then + if compgen -G "/etc/guacamole/extensions/guacamole-history-recording-storage-*.jar" >/dev/null; then msg_info "Updating History Recording Storage Extension" rm -f /etc/guacamole/extensions/guacamole-history-recording-storage-*.jar curl_download "/tmp/guacamole-history-recording-storage.tar.gz" "https://downloads.apache.org/guacamole/${LATEST_SERVER}/binary/guacamole-history-recording-storage-${LATEST_SERVER}.tar.gz" From b5360882c90946d92d5faea0f85dbf7b10c5d8fe Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 19:04:58 +0000 Subject: [PATCH 151/161] Update CHANGELOG.md (#15860) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c09d83fab..14b0f895e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -513,6 +513,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - apache-guacamole: detect installed extensions during update [@TowyTowy](https://github.com/TowyTowy) ([#15841](https://github.com/community-scripts/ProxmoxVE/pull/15841)) - CLIProxyAPI: fix update deleting config.yaml [@austinpilz](https://github.com/austinpilz) ([#15834](https://github.com/community-scripts/ProxmoxVE/pull/15834)) - esphome: install libusb-1.0-0 for ESP-IDF native builds [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15838](https://github.com/community-scripts/ProxmoxVE/pull/15838)) From f75b0a8b0e423c8c743ae9c3730ec98b9d94d159 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Fri, 17 Jul 2026 21:05:10 +0200 Subject: [PATCH 152/161] AFFiNE: Bump to 0.27.0 (#15848) --- ct/affine.sh | 11 +++++++---- install/affine-install.sh | 10 ++++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/ct/affine.sh b/ct/affine.sh index 236a225bd..1480c2a99 100644 --- a/ct/affine.sh +++ b/ct/affine.sh @@ -30,17 +30,19 @@ function update_script() { exit fi - RELEASE="v0.26.3" + RELEASE="v0.27.0" if check_for_gh_release "affine_app" "toeverything/AFFiNE" "${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 affine-web affine-worker msg_ok "Stopped Services" + ensure_dependencies cmake + create_backup /root/.affine/config /root/.affine/storage CLEAN_INSTALL=1 fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "${RELEASE}" "/opt/affine" - msg_info "Rebuilding Application (Patience)" + msg_info "Rebuilding Application (Patience ~25 mins, don't close the console!)" cd /opt/affine source /root/.profile export PATH="/root/.cargo/bin:/root/.rbenv/shims:$PATH" @@ -51,11 +53,12 @@ function update_script() { export VITE_CORE_COMMIT_SHA=$(cat ~/.affine_app) # Initialize git repo (required for build process) + export HUSKY=0 $STD git init -q $STD git config user.email "build@local" $STD git config user.name "Build" $STD git add -A - $STD git commit -q -m "update" + $STD git commit -q -m "update" --no-verify --allow-empty # Force Turbo to run sequentially mkdir -p /opt/affine/.turbo @@ -66,7 +69,7 @@ function update_script() { TURBO $STD corepack enable - $STD corepack prepare yarn@4.12.0 --activate + $STD corepack prepare yarn@4.13.0 --activate $STD yarn config set enableTelemetry 0 export NODE_OPTIONS="--max-old-space-size=2048" diff --git a/install/affine-install.sh b/install/affine-install.sh index 4c15d2403..50144d4e0 100644 --- a/install/affine-install.sh +++ b/install/affine-install.sh @@ -22,7 +22,8 @@ $STD apt install -y \ libssl-dev \ libjemalloc2 \ redis-server \ - nginx + nginx \ + cmake msg_ok "Installed Dependencies" PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql @@ -30,7 +31,7 @@ PG_DB_NAME="affine" PG_DB_USER="affine" setup_postgresql_db NODE_VERSION="22" setup_nodejs setup_rust -fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "v0.26.3" "/opt/affine" +fetch_and_deploy_gh_release "affine_app" "toeverything/AFFiNE" "tarball" "v0.27.0" "/opt/affine" msg_info "Setting up Directories" rm -rf /root/.affine @@ -59,11 +60,12 @@ export PATH="/root/.cargo/bin:$PATH" export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 export VITE_CORE_COMMIT_SHA=$(cat ~/.affine_app) # # Initialize git repo (required for build process) +export HUSKY=0 $STD git init -q $STD git config user.email "build@local" $STD git config user.name "Build" $STD git add -A -$STD git commit -q -m "initial" +$STD git commit -q -m "update" --no-verify --allow-empty mkdir -p /opt/affine/.turbo cat </opt/affine/.turbo/config.json { @@ -71,7 +73,7 @@ cat </opt/affine/.turbo/config.json } TURBO $STD corepack enable -$STD corepack prepare yarn@4.12.0 --activate +$STD corepack prepare yarn@4.13.0 --activate $STD yarn config set enableTelemetry 0 export NODE_OPTIONS="--max-old-space-size=4096" export TSC_COMPILE_ON_ERROR=true From 0b15e1950019e693c096dc687760142d14523212 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 19:05:36 +0000 Subject: [PATCH 153/161] Update CHANGELOG.md (#15861) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14b0f895e..81d72a7b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -519,6 +519,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### ✨ New Features + - AFFiNE: Bump to 0.27.0 [@MickLesk](https://github.com/MickLesk) ([#15848](https://github.com/community-scripts/ProxmoxVE/pull/15848)) - n8n: unpin / use latest release [@MickLesk](https://github.com/MickLesk) ([#15817](https://github.com/community-scripts/ProxmoxVE/pull/15817)) - Pin Opencloud to v7.3.0 [@vhsdream](https://github.com/vhsdream) ([#15826](https://github.com/community-scripts/ProxmoxVE/pull/15826)) From 78990277f2488b045d1d02d3c406edfbbbb924ce Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Jul 2026 21:13:19 +0200 Subject: [PATCH 154/161] Fix DocuSeal missing Leptonica deps on install and update (#15858) * Initial plan * Fix DocuSeal leptonica dependencies --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> --- ct/docuseal.sh | 2 ++ install/docuseal-install.sh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/ct/docuseal.sh b/ct/docuseal.sh index d856d1694..9fbdca313 100644 --- a/ct/docuseal.sh +++ b/ct/docuseal.sh @@ -35,6 +35,8 @@ function update_script() { systemctl stop docuseal docuseal-sidekiq msg_ok "Stopped Services" + ensure_dependencies libleptonica-dev libleptonica6 + create_backup /opt/docuseal/.env \ /opt/docuseal/data diff --git a/install/docuseal-install.sh b/install/docuseal-install.sh index 82c89bfc6..e502256e3 100644 --- a/install/docuseal-install.sh +++ b/install/docuseal-install.sh @@ -23,6 +23,8 @@ $STD apt install -y \ libreadline-dev \ zlib1g-dev \ libffi-dev \ + libleptonica-dev \ + libleptonica6 \ libvips42 \ libvips-dev \ libheif1 \ From c0a327dad8de829d571c9a44b4d5c602e453dc48 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 19:13:41 +0000 Subject: [PATCH 155/161] Update CHANGELOG.md (#15862) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81d72a7b2..d6aa7f1e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -513,6 +513,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - Fix DocuSeal missing Leptonica deps on install and update [@Copilot](https://github.com/Copilot) ([#15858](https://github.com/community-scripts/ProxmoxVE/pull/15858)) - apache-guacamole: detect installed extensions during update [@TowyTowy](https://github.com/TowyTowy) ([#15841](https://github.com/community-scripts/ProxmoxVE/pull/15841)) - CLIProxyAPI: fix update deleting config.yaml [@austinpilz](https://github.com/austinpilz) ([#15834](https://github.com/community-scripts/ProxmoxVE/pull/15834)) - esphome: install libusb-1.0-0 for ESP-IDF native builds [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15838](https://github.com/community-scripts/ProxmoxVE/pull/15838)) From 3f7228f9c6c53a65db7dd08a846cf4514606756a Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Fri, 17 Jul 2026 21:16:15 +0200 Subject: [PATCH 156/161] fix(webtrees): initialize database schema before admin user creation (#15837) PR #14818 replaced the setup wizard curl with CLI commands but omitted the schema migration step, causing fresh installs to fail when creating the admin user. Trigger schema init via HTTP after config-ini. Fixes #15828 --- install/webtrees-install.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/install/webtrees-install.sh b/install/webtrees-install.sh index c2be2e79e..69b735e46 100644 --- a/install/webtrees-install.sh +++ b/install/webtrees-install.sh @@ -47,6 +47,8 @@ msg_ok "Configured Caddy" msg_info "Automating Webtrees Setup" cd /opt/webtrees +mkdir -p /opt/webtrees/data +chown -R www-data:www-data /opt/webtrees/data WT_ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c15) $STD sudo -u www-data php /opt/webtrees/index.php config-ini \ --dbhost=127.0.0.1 \ @@ -56,6 +58,15 @@ $STD sudo -u www-data php /opt/webtrees/index.php config-ini \ --dbname=webtrees \ --tblpfx=wt_ \ --base-url="http://${LOCAL_IP}" +msg_info "Initializing Webtrees database schema" +for i in {1..15}; do + if curl -sf "http://127.0.0.1/" >/dev/null 2>&1; then + break + fi + sleep 2 +done +$STD mariadb -u webtrees -p"${MARIADB_DB_PASS}" -h 127.0.0.1 webtrees -e "SHOW TABLES LIKE 'wt_user';" | grep -q wt_user +msg_ok "Initialized Webtrees database schema" $STD sudo -u www-data php /opt/webtrees/index.php user Admin \ --create \ --real-name="Administrator" \ From c24bba00ded0fd9b6ebcde69477786ec825910d3 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2026 19:16:42 +0000 Subject: [PATCH 157/161] Update CHANGELOG.md (#15863) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d6aa7f1e6..ab484bb31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -513,6 +513,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 Bug Fixes + - webtrees: initialize database schema before admin user creation [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15837](https://github.com/community-scripts/ProxmoxVE/pull/15837)) - Fix DocuSeal missing Leptonica deps on install and update [@Copilot](https://github.com/Copilot) ([#15858](https://github.com/community-scripts/ProxmoxVE/pull/15858)) - apache-guacamole: detect installed extensions during update [@TowyTowy](https://github.com/TowyTowy) ([#15841](https://github.com/community-scripts/ProxmoxVE/pull/15841)) - CLIProxyAPI: fix update deleting config.yaml [@austinpilz](https://github.com/austinpilz) ([#15834](https://github.com/community-scripts/ProxmoxVE/pull/15834)) From 7f1b0ead93e011757dd52b07846060db9ff56e95 Mon Sep 17 00:00:00 2001 From: Sir106 Date: Sat, 18 Jul 2026 22:19:31 +0200 Subject: [PATCH 158/161] [tools.update-lxcs] feat: optional reporting success/failures to heathchecks.io (or others) (#15701) * feat: add task monitoring option via e.g. healthchecks.io. To be configured via PING variable in config file. * attach logfile on failure to healthcheck.io message * fixed error status when updating lxc even if finished successful --------- Co-authored-by: Sir106 --- tools/pve/cron-update-lxcs.sh | 11 ++++++-- tools/pve/update-lxcs-cron.sh | 48 ++++++++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/tools/pve/cron-update-lxcs.sh b/tools/pve/cron-update-lxcs.sh index c97975c44..437c7e472 100644 --- a/tools/pve/cron-update-lxcs.sh +++ b/tools/pve/cron-update-lxcs.sh @@ -116,6 +116,9 @@ add() { # Add container IDs to exclude from updates (comma-separated): # EXCLUDE=100,101,102 EXCLUDE= + +# Healthchecks.io Ping URL (optional) +# PING_URL= CONF ok "Created config ${CONF_FILE}" fi @@ -235,9 +238,11 @@ view_cron_config() { fi if [[ -f "$CONF_FILE" ]]; then echo -e " \e[36mConfig file:\e[0m ${CONF_FILE}" - local excludes + local excludes ping_url excludes=$(grep -oP '^\s*EXCLUDE\s*=\s*\K.*' "$CONF_FILE" 2>/dev/null || true) + ping_url=$(grep -oP '^\s*PING_URL\s*=\s*\K.*' "$CONF_FILE" 2>/dev/null | tr -d '"' | tr -d "'" || true) echo -e " \e[36mExcluded:\e[0m ${excludes:-(none)}" + echo -e " \e[36mPing URL:\e[0m ${ping_url:-(none)}" echo "" echo -e " \e[90m--- ${CONF_FILE} ---\e[0m" cat "$CONF_FILE" @@ -284,9 +289,11 @@ show_status() { fi if [[ -f "$CONF_FILE" ]]; then - local excludes + local excludes ping_url excludes=$(grep -oP '^\s*EXCLUDE\s*=\s*\K.*' "$CONF_FILE" 2>/dev/null || echo "(none)") + ping_url=$(grep -oP '^\s*PING_URL\s*=\s*\K.*' "$CONF_FILE" 2>/dev/null | tr -d '"' | tr -d "'" || echo "(none)") echo -e " \e[36mExcluded:\e[0m ${excludes:-"(none)"}" + echo -e " \e[36mPing URL:\e[0m ${ping_url:-"(none)"}" fi if [[ -f "$LOG_FILE" ]]; then diff --git a/tools/pve/update-lxcs-cron.sh b/tools/pve/update-lxcs-cron.sh index d7abc4cae..0e021944a 100644 --- a/tools/pve/update-lxcs-cron.sh +++ b/tools/pve/update-lxcs-cron.sh @@ -11,14 +11,15 @@ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin CONF_FILE="/etc/update-lxcs.conf" - -echo -e "\n $(date)" +LOG_FILE="/var/log/update-lxcs-cron.log" +PING_URL="" # Collect excluded containers from arguments excluded_containers=("$@") -# Merge exclusions from config file if it exists +# Merge exclusions and healthchecks URL from config file if it exists if [[ -f "$CONF_FILE" ]]; then + PING_URL=$(grep -oP '^\s*PING_URL\s*=\s*\K.+' "$CONF_FILE" 2>/dev/null | tr -d '"' | tr -d "'" || true) conf_exclude=$(grep -oP '^\s*EXCLUDE\s*=\s*\K[0-9,]+' "$CONF_FILE" 2>/dev/null || true) IFS=',' read -ra conf_ids <<<"$conf_exclude" for id in "${conf_ids[@]}"; do @@ -27,6 +28,17 @@ if [[ -f "$CONF_FILE" ]]; then done fi +# Overwrite logfile on each run when healthchecks is used +if [[ -n "$PING_URL" ]]; then + true > "$LOG_FILE" +fi + +if [[ -n "$PING_URL" ]]; then + curl -fsS -m 10 --retry 5 "${PING_URL}/start" -o /dev/null 2>/dev/null || true +fi + +echo -e "\n $(date)" + function update_container() { local container=$1 local name @@ -38,12 +50,36 @@ function update_container() { alpine) pct exec "$container" -- ash -c "apk -U upgrade" ;; archlinux) pct exec "$container" -- bash -c "pacman -Syyu --noconfirm" ;; fedora | rocky | centos | alma) pct exec "$container" -- bash -c "dnf -y update && dnf -y upgrade" ;; - ubuntu | debian | devuan) pct exec "$container" -- bash -c "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::='--force-confold' dist-upgrade -y; rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED" ;; + ubuntu | debian | devuan) pct exec "$container" -- bash -c "apt-get update; DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::='--force-confold' dist-upgrade -y; status=\$?; rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED || true; exit \$status" ;; opensuse) pct exec "$container" -- bash -c "zypper ref && zypper --non-interactive dup" ;; *) echo " [Warn] Unknown OS type '$os' for container $container, skipping" ;; esac } +update_status=0 + +# Define exit handler to send healthchecks.io status (with logfile on failure/success) +function exit_handler() { + local exit_code=$? + if [[ -n "$PING_URL" ]]; then + sync + if [[ $exit_code -ne 0 || $update_status -ne 0 ]]; then + if [[ -f "$LOG_FILE" ]]; then + curl -fsS -m 10 --retry 5 --data-binary @"$LOG_FILE" "${PING_URL}/fail" -o /dev/null 2>/dev/null || true + else + curl -fsS -m 10 --retry 5 "${PING_URL}/fail" -o /dev/null 2>/dev/null || true + fi + else + if [[ -f "$LOG_FILE" ]]; then + curl -fsS -m 10 --retry 5 --data-binary @"$LOG_FILE" "$PING_URL" -o /dev/null 2>/dev/null || true + else + curl -fsS -m 10 --retry 5 "$PING_URL" -o /dev/null 2>/dev/null || true + fi + fi + fi +} +trap exit_handler EXIT + for container in $(pct list | awk '{if(NR>1) print $1}'); do excluded=false for excluded_container in "${excluded_containers[@]}"; do @@ -65,7 +101,7 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do echo -e "[Info] Starting $container" pct start "$container" sleep 5 - update_container "$container" || echo " [Error] Update failed for $container" + update_container "$container" || { echo " [Error] Update failed for $container"; update_status=1; } # check if patchmon agent is present in container and run a report if found if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n" @@ -74,7 +110,7 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do echo -e "[Info] Shutting down $container" pct shutdown "$container" --timeout 60 & elif [ "$status" == "status: running" ]; then - update_container "$container" || echo " [Error] Update failed for $container" + update_container "$container" || { echo " [Error] Update failed for $container"; update_status=1; } # check if patchmon agent is present in container and run a report if found if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n" From 09c85021fc000ab151201a3b699edc00be7f062c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:19:59 +0000 Subject: [PATCH 159/161] Update CHANGELOG.md (#15877) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab484bb31..b9b1f82b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -502,6 +502,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-07-18 + +### 🧰 Tools + + - #### ✨ New Features + + - [tools.update-lxcs] feat: optional reporting success/failures to heathchecks.io (or others) [@sir106](https://github.com/sir106) ([#15701](https://github.com/community-scripts/ProxmoxVE/pull/15701)) + ## 2026-07-17 ### 🆕 New Scripts From eb5a5b2cb769681fec7c27d761d9286d83969e4b Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com> Date: Sat, 18 Jul 2026 23:21:19 +0200 Subject: [PATCH 160/161] add configurable host CA inheritance for LXC bootstrap (#15840) Introduce host CA certificate propagation in the shared LXC build flow so containers can trust enterprise/private PKI roots during early package bootstrap. Add an advanced-install toggle with default auto behavior so unattended installs remain seamless while interactive users can explicitly opt out. Co-authored-by: Michel Roegl-Brunner --- misc/build.func | 143 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 136 insertions(+), 7 deletions(-) diff --git a/misc/build.func b/misc/build.func index 53509780f..f22692d42 100644 --- a/misc/build.func +++ b/misc/build.func @@ -1009,6 +1009,7 @@ base_settings() { APT_CACHER=${var_apt_cacher:-""} APT_CACHER_IP=${var_apt_cacher_ip:-""} + INHERIT_HOST_CA="${var_inherit_host_ca:-auto}" # Runtime check: Verify APT cacher is reachable if configured if [[ -n "$APT_CACHER_IP" && "$APT_CACHER" == "yes" ]]; then @@ -1088,7 +1089,7 @@ load_vars_file() { # Allowed var_* keys local VAR_WHITELIST=( - var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_keyctl + var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_inherit_host_ca var_keyctl var_gateway var_hostname var_ipv6_method var_mac var_mknod var_mount_fs var_mtu var_net var_nesting var_ns var_os var_protection var_pw var_ram var_tags var_timezone var_tun var_unprivileged var_verbose var_version var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage var_searchdomain @@ -1285,6 +1286,12 @@ load_vars_file() { continue fi ;; + var_inherit_host_ca) + if [[ "$var_val" != "yes" && "$var_val" != "no" && "$var_val" != "auto" ]]; then + msg_warn "Invalid host CA inheritance value '$var_val' in $file (must be yes/no/auto), ignoring" + continue + fi + ;; var_container_storage | var_template_storage) # Validate that the storage exists and is active on the current node local _storage_status @@ -1324,7 +1331,7 @@ default_var_settings() { # Allowed var_* keys (alphabetically sorted) # Note: Removed var_ctid (can only exist once), var_ipv6_static (static IPs are unique) local VAR_WHITELIST=( - var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_keyctl + var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_inherit_host_ca var_keyctl var_gateway var_hostname var_ipv6_method var_mac var_mknod var_mount_fs var_mtu var_net var_nesting var_ns var_os var_protection var_pw var_ram var_tags var_timezone var_tun var_unprivileged var_verbose var_version var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage @@ -1407,6 +1414,7 @@ var_ssh=no # HTTP/HTTPS proxy (optional - for networks requiring a proxy) # var_http_proxy=http://proxy.local:8080 # var_http_no_proxy=localhost,127.0.0.1,.local +# var_inherit_host_ca=auto # Features/Tags/verbosity var_fuse=no @@ -1507,7 +1515,7 @@ get_app_defaults_path() { if ! declare -p VAR_WHITELIST >/dev/null 2>&1; then # Note: Removed var_ctid (can only exist once), var_ipv6_static (static IPs are unique) declare -ag VAR_WHITELIST=( - var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_keyctl + var_apt_cacher var_apt_cacher_ip var_brg var_cpu var_disk var_fuse var_github_token var_gpu var_http_no_proxy var_http_proxy var_inherit_host_ca var_keyctl var_gateway var_hostname var_ipv6_method var_mac var_mknod var_mount_fs var_mtu var_net var_nesting var_ns var_os var_protection var_pw var_ram var_tags var_timezone var_tun var_unprivileged var_verbose var_version var_vlan var_ssh var_ssh_authorized_key var_container_storage var_template_storage var_searchdomain @@ -1657,6 +1665,7 @@ _build_current_app_vars_tmp() { _apt_cacher_ip="${APT_CACHER_IP:-}" _http_proxy="${HTTP_PROXY:-${var_http_proxy:-}}" _http_no_proxy="${HTTP_NO_PROXY:-${var_http_no_proxy:-}}" + _inherit_host_ca="${INHERIT_HOST_CA:-${var_inherit_host_ca:-auto}}" _fuse="${ENABLE_FUSE:-no}" _tun="${ENABLE_TUN:-no}" _gpu="${ENABLE_GPU:-no}" @@ -1710,6 +1719,7 @@ _build_current_app_vars_tmp() { [ -n "$_apt_cacher_ip" ] && echo "var_apt_cacher_ip=$(_sanitize_value "$_apt_cacher_ip")" [ -n "$_http_proxy" ] && echo "var_http_proxy=$(_sanitize_value "$_http_proxy")" [ -n "$_http_no_proxy" ] && echo "var_http_no_proxy=$(_sanitize_value "$_http_no_proxy")" + [ -n "$_inherit_host_ca" ] && echo "var_inherit_host_ca=$(_sanitize_value "$_inherit_host_ca")" [ -n "$_fuse" ] && echo "var_fuse=$(_sanitize_value "$_fuse")" [ -n "$_tun" ] && echo "var_tun=$(_sanitize_value "$_tun")" @@ -1874,7 +1884,7 @@ advanced_settings() { TAGS="community-script${var_tags:+;${var_tags}}" fi local STEP=1 - local MAX_STEP=30 + local MAX_STEP=31 # Store values for back navigation - inherit from var_* app defaults local _ct_type="${var_unprivileged:-1}" @@ -1896,6 +1906,7 @@ advanced_settings() { local _apt_cacher_ip="${var_apt_cacher_ip:-}" local _http_proxy="${var_http_proxy:-}" local _http_no_proxy="${var_http_no_proxy:-}" + local _inherit_host_ca="${var_inherit_host_ca:-auto}" local _mtu="${var_mtu:-}" local _sd="${var_searchdomain:-}" local _ns="${var_ns:-}" @@ -2725,9 +2736,47 @@ advanced_settings() { ;; # ═══════════════════════════════════════════════════════════════════════════ - # STEP 25: Container Timezone + # STEP 25: Host CA Inheritance # ═══════════════════════════════════════════════════════════════════════════ 25) + local host_ca_count=0 + local host_ca_dir="/usr/local/share/ca-certificates" + local cert + shopt -s nullglob + for cert in "$host_ca_dir"/*.crt; do + host_ca_count=$((host_ca_count + 1)) + done + shopt -u nullglob + + if [[ $host_ca_count -eq 0 ]]; then + _inherit_host_ca="auto" + ((STEP++)) + continue + fi + + local host_ca_default_flag="" + [[ "$_inherit_host_ca" == "no" ]] && host_ca_default_flag="--defaultno" + if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \ + --title "HOST CA INHERITANCE" \ + --ok-button "Next" --cancel-button "Back" \ + $host_ca_default_flag \ + --yesno "\nInherit host CA certificates into this container?\n\nDetected on host: ${host_ca_count} certificate(s) in:\n${host_ca_dir}\n\nRecommended for private PKI / TLS-inspection environments.\n\n(App default: ${var_inherit_host_ca:-auto})" 16 72; then + _inherit_host_ca="yes" + else + if [ $? -eq 1 ]; then + _inherit_host_ca="no" + else + ((STEP--)) + continue + fi + fi + ((STEP++)) + ;; + + # ═══════════════════════════════════════════════════════════════════════════ + # STEP 26: Container Timezone + # ═══════════════════════════════════════════════════════════════════════════ + 26) local tz_hint="$_ct_timezone" [[ -z "$tz_hint" ]] && tz_hint="(empty - will use host timezone)" @@ -2750,9 +2799,9 @@ advanced_settings() { ;; # ═══════════════════════════════════════════════════════════════════════════ - # STEP 26: Container Protection + # STEP 27: Container Protection # ═══════════════════════════════════════════════════════════════════════════ - 26) + 27) local protect_default_flag="--defaultno" [[ "$_protect_ct" == "yes" || "$_protect_ct" == "1" ]] && protect_default_flag="" @@ -2904,6 +2953,7 @@ Leave empty to skip." local apt_display="${_apt_cacher:-no}" [[ "$_apt_cacher" == "yes" && -n "$_apt_cacher_ip" ]] && apt_display="$_apt_cacher_ip" local http_proxy_display="${_http_proxy:-(none)}" + local inherit_ca_display="${_inherit_host_ca:-auto}" local post_install_display="${_post_install:-(none)}" local post_install_warn="" @@ -2934,6 +2984,7 @@ Advanced: Timezone: $tz_display APT Cacher: $apt_display HTTP Proxy: $http_proxy_display + Inherit Host CAs: $inherit_ca_display Verbose: $_verbose Post-Install Script: ${post_install_display}${post_install_warn}" @@ -2979,6 +3030,7 @@ Advanced: APT_CACHER_IP="$_apt_cacher_ip" HTTP_PROXY="$_http_proxy" HTTP_NO_PROXY="$_http_no_proxy" + INHERIT_HOST_CA="$_inherit_host_ca" VERBOSE="$_verbose" var_post_install="$_post_install" @@ -2997,6 +3049,7 @@ Advanced: var_sdn_vnet="$_sdn_vnet" var_http_proxy="$_http_proxy" var_http_no_proxy="$_http_no_proxy" + var_inherit_host_ca="$_inherit_host_ca" # Format optional values [[ -n "$_mtu" ]] && MTU=",mtu=$_mtu" || MTU="" @@ -3945,6 +3998,81 @@ EOF msg_ok "Applied HTTP proxy in container" } +# ------------------------------------------------------------------------------ +# _apply_host_ca_certs_in_container() +# +# - Copies administrator-provided CA certificates from the Proxmox host into the +# container before base package bootstrap +# - Source: /usr/local/share/ca-certificates/*.crt (Debian convention) +# - Refreshes the container trust store when update-ca-certificates is available +# - No-op when no host certificates are present; failures are non-fatal +# ------------------------------------------------------------------------------ +_apply_host_ca_certs_in_container() { + local host_ca_dir="/usr/local/share/ca-certificates" + [[ -z "${CTID:-}" ]] && return 0 + local inherit_host_ca="${INHERIT_HOST_CA:-${var_inherit_host_ca:-auto}}" + + local -a host_certs=() + local cert + shopt -s nullglob + for cert in "$host_ca_dir"/*.crt; do + host_certs+=("$cert") + done + shopt -u nullglob + + [[ ${#host_certs[@]} -eq 0 ]] && return 0 + + case "${inherit_host_ca,,}" in + no | false | 0 | off) + msg_info "Skipping host CA inheritance by configuration" + return 0 + ;; + esac + + msg_info "Inheriting host CA certificates into container" + + local found=${#host_certs[@]} + local copied=0 + local skipped=0 + local cert_name + + pct exec "$CTID" -- mkdir -p /usr/local/share/ca-certificates >/dev/null 2>&1 || { + msg_warn "Failed to create CA certificate directory in container" + return 0 + } + + for cert in "${host_certs[@]}"; do + cert_name="$(basename "$cert")" + if [[ ! -r "$cert" || "$cert_name" != *.crt ]]; then + msg_warn "Skipping invalid or unreadable host CA certificate: ${cert_name}" + skipped=$((skipped + 1)) + continue + fi + + if pct push "$CTID" "$cert" "/usr/local/share/ca-certificates/${cert_name}" >/dev/null 2>&1; then + pct exec "$CTID" -- chmod 644 "/usr/local/share/ca-certificates/${cert_name}" >/dev/null 2>&1 || true + copied=$((copied + 1)) + else + msg_warn "Failed to push host CA certificate: ${cert_name}" + skipped=$((skipped + 1)) + fi + done + + if [[ $copied -eq 0 ]]; then + msg_warn "No host CA certificates were copied (${found} found, ${skipped} skipped)" + return 0 + fi + + local refresh_shell="bash" + [[ "$var_os" == "alpine" ]] && refresh_shell="ash" + + if pct exec "$CTID" -- "$refresh_shell" -c 'command -v update-ca-certificates >/dev/null 2>&1 && update-ca-certificates' >/dev/null 2>&1; then + msg_ok "Inherited ${copied} host CA certificate(s) and updated trust store (${skipped} skipped)" + else + msg_warn "Copied ${copied} host CA certificate(s), but trust store update failed or update-ca-certificates is unavailable (${skipped} skipped)" + fi +} + # ------------------------------------------------------------------------------ # build_container() # @@ -4565,6 +4693,7 @@ EOF local install_exit_code=0 _apply_http_proxy_in_container + _apply_host_ca_certs_in_container # Continue with standard container setup if [ "$var_os" == "alpine" ]; then From 658aad229ae262256d4565c2d62d99653b2e6d78 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 21:21:41 +0000 Subject: [PATCH 161/161] Update CHANGELOG.md (#15878) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9b1f82b2..e41f26298 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -504,6 +504,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-07-18 +### 💾 Core + + - #### ✨ New Features + + - core: add configurable host CA inheritance during bootstrap [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15840](https://github.com/community-scripts/ProxmoxVE/pull/15840)) + ### 🧰 Tools - #### ✨ New Features