From cb80b564264a09005e52acd248e1c539150579ab Mon Sep 17 00:00:00 2001 From: MickLesk Date: Wed, 20 May 2026 14:44:24 +0200 Subject: [PATCH 01/37] profilarr test --- ct/profilarr.sh | 112 +++++++++++++++++++++++++++++++++ install/profilarr-install.sh | 116 +++++++++++++++++++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 ct/profilarr.sh create mode 100644 install/profilarr-install.sh diff --git a/ct/profilarr.sh b/ct/profilarr.sh new file mode 100644 index 00000000..f7b77c53 --- /dev/null +++ b/ct/profilarr.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: michelroegl-brunner +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Dictionarry-Hub/profilarr + +APP="Profilarr" +var_tags="${var_tags:-arr;radarr;sonarr;config}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-4096}" +var_disk="${var_disk:-8}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +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/profilarr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if [[ -d /opt/profilarr/backend ]]; then + msg_error "Profilarr v1 detected!" + echo -e "\nProfilarr v2 is a complete rewrite and is NOT compatible with v1." + echo -e "There is no migration path. Please create a new LXC container for v2.\n" + exit + fi + + if check_for_gh_release "profilarr" "Dictionarry-Hub/profilarr"; then + msg_info "Stopping Service" + systemctl stop profilarr + msg_ok "Stopped Service" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "profilarr" "Dictionarry-Hub/profilarr" "tarball" + PROFILARR_VERSION=$(curl -fsSL "https://api.github.com/repos/Dictionarry-Hub/profilarr/releases/latest" | grep '"tag_name"' | sed 's/.*"v\([^"]*\)".*/\1/') + + msg_info "Building Profilarr v${PROFILARR_VERSION} (Patience)" + cd /opt/profilarr + ARCH=$(uname -m) + cat >src/lib/shared/build.ts <src/lib/shared/build.ts </etc/systemd/system/profilarr.service +[Unit] +Description=Profilarr - Configuration Management for Radarr/Sonarr +After=network.target + +[Service] +Type=simple +WorkingDirectory=/opt/profilarr/app +Environment="PORT=6868" +Environment="HOST=0.0.0.0" +Environment="APP_BASE_PATH=/var/lib/profilarr" +Environment="DENO_SQLITE_PATH=${SQLITE_PATH}" +ExecStart=/opt/profilarr/app/profilarr +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now profilarr +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From c427689c6ebdb61bfa74a4bffc8cdc701546a2be Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 20 May 2026 12:45:09 +0000 Subject: [PATCH 02/37] chore: update app headers [skip ci] --- ct/headers/profilarr | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/profilarr diff --git a/ct/headers/profilarr b/ct/headers/profilarr new file mode 100644 index 00000000..ad43c117 --- /dev/null +++ b/ct/headers/profilarr @@ -0,0 +1,6 @@ + ____ _____ __ + / __ \_________ / __(_) /___ ___________ + / /_/ / ___/ __ \/ /_/ / / __ `/ ___/ ___/ + / ____/ / / /_/ / __/ / / /_/ / / / / +/_/ /_/ \____/_/ /_/_/\__,_/_/ /_/ + From fddd9ba7695bcbb09f4ab90403c9fea9195de3bc Mon Sep 17 00:00:00 2001 From: MickLesk Date: Wed, 20 May 2026 15:03:30 +0200 Subject: [PATCH 03/37] feat(profilarr): streamline Deno installation and configuration setup --- install/profilarr-install.sh | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/install/profilarr-install.sh b/install/profilarr-install.sh index 00ab26bc..c441fdd5 100644 --- a/install/profilarr-install.sh +++ b/install/profilarr-install.sh @@ -20,21 +20,10 @@ $STD apt install -y \ libsqlite3-0 msg_ok "Installed Dependencies" -msg_info "Installing Deno" -DENO_VERSION=$(curl -fsSL "https://api.github.com/repos/denoland/deno/releases/latest" | grep '"tag_name"' | sed 's/.*"v\([^"]*\)".*/\1/') ARCH=$(uname -m) -case "$ARCH" in -aarch64) DENO_FILE="deno-aarch64-unknown-linux-gnu.zip" ;; -*) DENO_FILE="deno-x86_64-unknown-linux-gnu.zip" ;; -esac -curl -fsSL "https://github.com/denoland/deno/releases/download/v${DENO_VERSION}/${DENO_FILE}" -o /tmp/deno.zip -$STD unzip -qo /tmp/deno.zip -d /usr/local/bin/ -rm /tmp/deno.zip -chmod +x /usr/local/bin/deno -msg_ok "Installed Deno v${DENO_VERSION}" - +fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-${ARCH}-unknown-linux-gnu.zip" fetch_and_deploy_gh_release "profilarr" "Dictionarry-Hub/profilarr" "tarball" -PROFILARR_VERSION=$(curl -fsSL "https://api.github.com/repos/Dictionarry-Hub/profilarr/releases/latest" | grep '"tag_name"' | sed 's/.*"v\([^"]*\)".*/\1/') +PROFILARR_VERSION=$(cat ~/.profilarr) msg_info "Building Profilarr v${PROFILARR_VERSION} (Patience)" cd /opt/profilarr @@ -85,10 +74,16 @@ cp dist/build/server.js /opt/profilarr/app/server.js cp -r dist/build/static /opt/profilarr/app/static chmod +x /opt/profilarr/app/profilarr mkdir -p /var/lib/profilarr/{data,logs,backups,databases} +SQLITE_PATH="/usr/lib/${ARCH}-linux-gnu/libsqlite3.so.0" +cat </etc/default/profilarr +PORT=6868 +HOST=0.0.0.0 +APP_BASE_PATH=/var/lib/profilarr +DENO_SQLITE_PATH=${SQLITE_PATH} +EOF msg_ok "Installed Profilarr" msg_info "Creating Service" -SQLITE_PATH="/usr/lib/${ARCH}-linux-gnu/libsqlite3.so.0" cat </etc/systemd/system/profilarr.service [Unit] Description=Profilarr - Configuration Management for Radarr/Sonarr @@ -97,10 +92,8 @@ After=network.target [Service] Type=simple WorkingDirectory=/opt/profilarr/app -Environment="PORT=6868" -Environment="HOST=0.0.0.0" -Environment="APP_BASE_PATH=/var/lib/profilarr" -Environment="DENO_SQLITE_PATH=${SQLITE_PATH}" +EnvironmentFile=/etc/default/profilarr +Environment=HOME=/root ExecStart=/opt/profilarr/app/profilarr Restart=always RestartSec=5 From b7a8835bbb606cc06ed9a41ba2e9bdf2dc78ba2c Mon Sep 17 00:00:00 2001 From: MickLesk Date: Wed, 20 May 2026 15:06:09 +0200 Subject: [PATCH 04/37] finalize profilarr --- ct/profilarr.sh | 13 +++++++------ install/profilarr-install.sh | 6 +----- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/ct/profilarr.sh b/ct/profilarr.sh index f7b77c53..00e09ce2 100644 --- a/ct/profilarr.sh +++ b/ct/profilarr.sh @@ -36,17 +36,21 @@ function update_script() { exit fi + if check_for_gh_release "deno" "denoland/deno"; then + ARCH=$(uname -m) + fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-${ARCH}-unknown-linux-gnu.zip" + fi + if check_for_gh_release "profilarr" "Dictionarry-Hub/profilarr"; then msg_info "Stopping Service" systemctl stop profilarr msg_ok "Stopped Service" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "profilarr" "Dictionarry-Hub/profilarr" "tarball" - PROFILARR_VERSION=$(curl -fsSL "https://api.github.com/repos/Dictionarry-Hub/profilarr/releases/latest" | grep '"tag_name"' | sed 's/.*"v\([^"]*\)".*/\1/') + PROFILARR_VERSION=$(cat ~/.profilarr) msg_info "Building Profilarr v${PROFILARR_VERSION} (Patience)" cd /opt/profilarr - ARCH=$(uname -m) cat >src/lib/shared/build.ts < Date: Wed, 20 May 2026 15:20:03 +0200 Subject: [PATCH 05/37] matterjs --- ct/matterjs-server.sh | 61 ++++++++++++++++++++++++++++++ install/matterjs-server-install.sh | 44 +++++++++++++++++++++ json/matterjs-server.json | 44 +++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 ct/matterjs-server.sh create mode 100644 install/matterjs-server-install.sh create mode 100644 json/matterjs-server.json diff --git a/ct/matterjs-server.sh b/ct/matterjs-server.sh new file mode 100644 index 00000000..0abb8e0b --- /dev/null +++ b/ct/matterjs-server.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: community-scripts +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/matter-js/matterjs-server + +APP="MatterJS-Server" +var_tags="${var_tags:-matter;iot;smarthome;homeassistant}" +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_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/matter-server ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + CURRENT=$(npm list -g matter-server --depth=0 2>/dev/null | grep matter-server | sed 's/.*@//') + LATEST=$(npm show matter-server version 2>/dev/null) + if [[ "$CURRENT" == "$LATEST" ]]; then + msg_ok "No update required. ${APP} is already at v${LATEST}" + exit + fi + + msg_info "Stopping Service" + systemctl stop matterjs-server + msg_ok "Stopped Service" + + msg_info "Updating ${APP} to v${LATEST}" + $STD npm install -g matter-server + msg_ok "Updated ${APP} to v${LATEST}" + + msg_info "Starting Service" + systemctl start matterjs-server + msg_ok "Started Service" + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:5580${CL}" diff --git a/install/matterjs-server-install.sh b/install/matterjs-server-install.sh new file mode 100644 index 00000000..b3e39987 --- /dev/null +++ b/install/matterjs-server-install.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: community-scripts +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/matter-js/matterjs-server + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +NODE_VERSION="22" setup_nodejs + +msg_info "Installing MatterJS-Server" +$STD npm install -g matter-server +mkdir -p /var/lib/matterjs-server +msg_ok "Installed MatterJS-Server" + +msg_info "Creating Service" +cat </etc/systemd/system/matterjs-server.service +[Unit] +Description=MatterJS Server +After=network.target + +[Service] +Type=simple +User=root +ExecStart=/usr/local/bin/matter-server --storage-path /var/lib/matterjs-server +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now matterjs-server +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/json/matterjs-server.json b/json/matterjs-server.json new file mode 100644 index 00000000..467cf31a --- /dev/null +++ b/json/matterjs-server.json @@ -0,0 +1,44 @@ +{ + "name": "MatterJS-Server", + "slug": "matterjs-server", + "categories": [ + 16 + ], + "date_created": "2026-05-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5580, + "documentation": "https://github.com/matter-js/matterjs-server", + "website": "https://github.com/matter-js/matterjs-server", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/home-assistant.webp", + "description": "JavaScript-based Matter controller server (successor to Python Matter Server). Provides a WebSocket API compatible with the Home Assistant Matter integration.", + "install_methods": [ + { + "type": "default", + "script": "ct/matterjs-server.sh", + "config_path": null, + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This is a Beta version. Not yet officially CSA-certified.", + "type": "warning" + }, + { + "text": "For Matter-over-Thread (Thread Border Router), IPv6 must be enabled in the LXC container.", + "type": "info" + } + ] +} From 75fac84d54306f8062c1497bcb78fb082dc4db7b Mon Sep 17 00:00:00 2001 From: MickLesk Date: Wed, 20 May 2026 15:20:22 +0200 Subject: [PATCH 06/37] format json --- json/matterjs-server.json | 84 +++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/json/matterjs-server.json b/json/matterjs-server.json index 467cf31a..2209b560 100644 --- a/json/matterjs-server.json +++ b/json/matterjs-server.json @@ -1,44 +1,44 @@ { - "name": "MatterJS-Server", - "slug": "matterjs-server", - "categories": [ - 16 - ], - "date_created": "2026-05-20", - "type": "ct", - "updateable": true, - "privileged": false, - "interface_port": 5580, - "documentation": "https://github.com/matter-js/matterjs-server", - "website": "https://github.com/matter-js/matterjs-server", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/home-assistant.webp", - "description": "JavaScript-based Matter controller server (successor to Python Matter Server). Provides a WebSocket API compatible with the Home Assistant Matter integration.", - "install_methods": [ - { - "type": "default", - "script": "ct/matterjs-server.sh", - "config_path": null, - "resources": { - "cpu": 2, - "ram": 1024, - "hdd": 4, - "os": "Debian", - "version": "13" - } - } - ], - "default_credentials": { - "username": null, - "password": null - }, - "notes": [ - { - "text": "This is a Beta version. Not yet officially CSA-certified.", - "type": "warning" + "name": "MatterJS-Server", + "slug": "matterjs-server", + "categories": [ + 16 + ], + "date_created": "2026-05-20", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5580, + "documentation": "https://github.com/matter-js/matterjs-server", + "website": "https://github.com/matter-js/matterjs-server", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/home-assistant.webp", + "description": "JavaScript-based Matter controller server (successor to Python Matter Server). Provides a WebSocket API compatible with the Home Assistant Matter integration.", + "install_methods": [ + { + "type": "default", + "script": "ct/matterjs-server.sh", + "config_path": null, + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null }, - { - "text": "For Matter-over-Thread (Thread Border Router), IPv6 must be enabled in the LXC container.", - "type": "info" - } - ] -} + "notes": [ + { + "text": "This is a Beta version. Not yet officially CSA-certified.", + "type": "warning" + }, + { + "text": "For Matter-over-Thread (Thread Border Router), IPv6 must be enabled in the LXC container.", + "type": "info" + } + ] +} \ No newline at end of file From 0f5f3e87f16f8ab92a68852a88c446cefc5aed7f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 20 May 2026 13:20:47 +0000 Subject: [PATCH 07/37] chore: update app headers [skip ci] --- ct/headers/matterjs-server | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/matterjs-server diff --git a/ct/headers/matterjs-server b/ct/headers/matterjs-server new file mode 100644 index 00000000..2cf8e1aa --- /dev/null +++ b/ct/headers/matterjs-server @@ -0,0 +1,6 @@ + __ ___ __ __ _______ _____ + / |/ /___ _/ /_/ /____ _____ / / ___/ / ___/___ ______ _____ _____ + / /|_/ / __ `/ __/ __/ _ \/ ___/_ / /\__ \______\__ \/ _ \/ ___/ | / / _ \/ ___/ + / / / / /_/ / /_/ /_/ __/ / / /_/ /___/ /_____/__/ / __/ / | |/ / __/ / +/_/ /_/\__,_/\__/\__/\___/_/ \____//____/ /____/\___/_/ |___/\___/_/ + From 5f7ec3aed8aad31370f5103f6679dc3979865287 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Wed, 20 May 2026 15:22:30 +0200 Subject: [PATCH 08/37] typ --- ct/matterjs-server.sh | 2 +- install/matterjs-server-install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/matterjs-server.sh b/ct/matterjs-server.sh index 0abb8e0b..060427f1 100644 --- a/ct/matterjs-server.sh +++ b/ct/matterjs-server.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) # Copyright (c) 2021-2026 community-scripts ORG -# Author: community-scripts +# Author: MickLesk (CanbiZ) # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE # Source: https://github.com/matter-js/matterjs-server diff --git a/install/matterjs-server-install.sh b/install/matterjs-server-install.sh index b3e39987..99045ac8 100644 --- a/install/matterjs-server-install.sh +++ b/install/matterjs-server-install.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Copyright (c) 2021-2026 community-scripts ORG -# Author: community-scripts +# Author: MickLesk (CanbiZ) # License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE # Source: https://github.com/matter-js/matterjs-server From 47fc14acd6d9737e20023821af3ebf478427f05a Mon Sep 17 00:00:00 2001 From: Tom Frenzel Date: Wed, 20 May 2026 15:56:13 +0200 Subject: [PATCH 09/37] fix(matterjs-server): use local install --- ct/matterjs-server.sh | 36 +++++++++++++++--------------- install/matterjs-server-install.sh | 6 +++-- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/ct/matterjs-server.sh b/ct/matterjs-server.sh index 060427f1..f98488ef 100644 --- a/ct/matterjs-server.sh +++ b/ct/matterjs-server.sh @@ -24,30 +24,30 @@ function update_script() { check_container_storage check_container_resources - if [[ ! -f /usr/local/bin/matter-server ]]; then + if [[ ! -d /opt/matter-server ]]; then msg_error "No ${APP} Installation Found!" exit fi - CURRENT=$(npm list -g matter-server --depth=0 2>/dev/null | grep matter-server | sed 's/.*@//') - LATEST=$(npm show matter-server version 2>/dev/null) - if [[ "$CURRENT" == "$LATEST" ]]; then + 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 + msg_info "Stopping Service" + systemctl stop matterjs-server + msg_ok "Stopped Service" + + msg_info "Updating ${APP} from v${CURRENT} to v${LATEST}" + cd /opt/matter-server + $STD npm install matter-server@latest + msg_ok "Updated ${APP}" + + msg_info "Starting Service" + systemctl start matterjs-server + msg_ok "Started Service" + msg_ok "Updated successfully!" + else msg_ok "No update required. ${APP} is already at v${LATEST}" - exit fi - - msg_info "Stopping Service" - systemctl stop matterjs-server - msg_ok "Stopped Service" - - msg_info "Updating ${APP} to v${LATEST}" - $STD npm install -g matter-server - msg_ok "Updated ${APP} to v${LATEST}" - - msg_info "Starting Service" - systemctl start matterjs-server - msg_ok "Started Service" - msg_ok "Updated successfully!" exit } diff --git a/install/matterjs-server-install.sh b/install/matterjs-server-install.sh index 99045ac8..c5ab7fad 100644 --- a/install/matterjs-server-install.sh +++ b/install/matterjs-server-install.sh @@ -16,7 +16,9 @@ update_os NODE_VERSION="22" setup_nodejs msg_info "Installing MatterJS-Server" -$STD npm install -g matter-server +mkdir -p /opt/matter-server +cd /opt/matter-server +$STD npm install matter-server mkdir -p /var/lib/matterjs-server msg_ok "Installed MatterJS-Server" @@ -29,7 +31,7 @@ After=network.target [Service] Type=simple User=root -ExecStart=/usr/local/bin/matter-server --storage-path /var/lib/matterjs-server +ExecStart=/usr/bin/node /opt/matter-server/node_modules/matter-server/dist/esm/MatterServer.js --storage-path /var/lib/matterjs-server Restart=on-failure RestartSec=5 From a05393ee232a6aa833ae718edf21f57615226c5f Mon Sep 17 00:00:00 2001 From: Tom Frenzel Date: Wed, 20 May 2026 15:58:25 +0200 Subject: [PATCH 10/37] chore(matterjs-server): use matter icon --- json/matterjs-server.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json/matterjs-server.json b/json/matterjs-server.json index 2209b560..3f770918 100644 --- a/json/matterjs-server.json +++ b/json/matterjs-server.json @@ -11,7 +11,7 @@ "interface_port": 5580, "documentation": "https://github.com/matter-js/matterjs-server", "website": "https://github.com/matter-js/matterjs-server", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/home-assistant.webp", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/matter.webp", "description": "JavaScript-based Matter controller server (successor to Python Matter Server). Provides a WebSocket API compatible with the Home Assistant Matter integration.", "install_methods": [ { From f0ec3408b8919f64d72aaf538fd50f8bf56fd9e8 Mon Sep 17 00:00:00 2001 From: Tom Frenzel Date: Thu, 21 May 2026 08:33:16 +0200 Subject: [PATCH 11/37] feat(matterjs-server): add systcl rio rules --- install/matterjs-server-install.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/install/matterjs-server-install.sh b/install/matterjs-server-install.sh index c5ab7fad..4cd6c0a6 100644 --- a/install/matterjs-server-install.sh +++ b/install/matterjs-server-install.sh @@ -22,6 +22,16 @@ $STD npm install matter-server mkdir -p /var/lib/matterjs-server msg_ok "Installed MatterJS-Server" +msg_info "Configuring Network" +cat </etc/sysctl.d/60-ipv6-ra-rio.conf +net.ipv6.conf.default.accept_ra_rtr_pref=1 +net.ipv6.conf.default.accept_ra_rt_info_max_plen=128 +net.ipv6.conf.eth0.accept_ra_rtr_pref=1 +net.ipv6.conf.eth0.accept_ra_rt_info_max_plen=128 +EOF +$STD sysctl -p /etc/sysctl.d/60-ipv6-ra-rio.conf +msg_ok "Configured Network" + msg_info "Creating Service" cat </etc/systemd/system/matterjs-server.service [Unit] From 09e76166c570cd788b16fec62d98aa4787dc5a59 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Thu, 21 May 2026 11:55:56 +0200 Subject: [PATCH 12/37] cleanuip --- ct/alpine-coredns.sh | 59 ------------- ct/authentik.sh | 155 ---------------------------------- ct/{ => deferred}/arm.sh | 0 ct/degoog.sh | 73 ---------------- ct/dispatcharr.sh | 173 -------------------------------------- ct/docuseal.sh | 84 ------------------ ct/erpnext.sh | 49 ----------- ct/espconnect.sh | 55 ------------ ct/fileflows.sh | 65 -------------- ct/{ => headers}/labca.sh | 0 ct/librechat.sh | 101 ---------------------- ct/lobehub.sh | 77 ----------------- ct/lychee.sh | 73 ---------------- ct/matomo.sh | 90 -------------------- ct/nagios.sh | 90 -------------------- ct/neko.sh | 78 ----------------- ct/netbird.sh | 55 ------------ ct/profilarr.sh | 113 ------------------------- ct/solidtime.sh | 77 ----------------- ct/soulsync.sh | 68 --------------- ct/storyteller.sh | 85 ------------------- ct/teable.sh | 82 ------------------ ct/tubearchivist.sh | 87 ------------------- ct/webtrees.sh | 65 -------------- 24 files changed, 1854 deletions(-) delete mode 100644 ct/alpine-coredns.sh delete mode 100644 ct/authentik.sh rename ct/{ => deferred}/arm.sh (100%) delete mode 100644 ct/degoog.sh delete mode 100644 ct/dispatcharr.sh delete mode 100644 ct/docuseal.sh delete mode 100644 ct/erpnext.sh delete mode 100644 ct/espconnect.sh delete mode 100644 ct/fileflows.sh rename ct/{ => headers}/labca.sh (100%) delete mode 100644 ct/librechat.sh delete mode 100644 ct/lobehub.sh delete mode 100644 ct/lychee.sh delete mode 100644 ct/matomo.sh delete mode 100644 ct/nagios.sh delete mode 100644 ct/neko.sh delete mode 100644 ct/netbird.sh delete mode 100644 ct/profilarr.sh delete mode 100644 ct/solidtime.sh delete mode 100644 ct/soulsync.sh delete mode 100644 ct/storyteller.sh delete mode 100644 ct/teable.sh delete mode 100644 ct/tubearchivist.sh delete mode 100644 ct/webtrees.sh diff --git a/ct/alpine-coredns.sh b/ct/alpine-coredns.sh deleted file mode 100644 index 10a04a36..00000000 --- a/ct/alpine-coredns.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: CopilotAssistant (community-scripts) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/coredns/coredns - -APP="Alpine-CoreDNS" -var_tags="${var_tags:-dns;network;alpine}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-256}" -var_disk="${var_disk:-1}" -var_os="${var_os:-alpine}" -var_version="${var_version:-3.23}" -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/coredns ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "coredns" "coredns/coredns"; then - msg_info "Stopping Service" - rc-service coredns stop - msg_ok "Stopped Service" - - ARCH=$(uname -m) - [[ "$ARCH" == "x86_64" ]] && ARCH="amd64" - [[ "$ARCH" == "aarch64" ]] && ARCH="arm64" - fetch_and_deploy_gh_release "coredns" "coredns/coredns" "prebuild" "latest" "/usr/local/bin" \ - "coredns_.*_linux_${ARCH}\.tgz" - chmod +x /usr/local/bin/coredns - - msg_info "Starting Service" - rc-service coredns start - 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} CoreDNS is listening on port 53 (DNS)${CL}" -echo -e "${TAB}${GATEWAY}${BGN}dns://${IP}${CL}" diff --git a/ct/authentik.sh b/ct/authentik.sh deleted file mode 100644 index 2879eed6..00000000 --- a/ct/authentik.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: Thieneret -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/goauthentik/authentik - -APP="authentik" -var_tags="${var_tags:-auth}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-4096}" -var_disk="${var_disk:-16}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/authentik ]]; then - msg_error "No authentik Installation Found!" - exit - fi - - NODE_VERSION="24" setup_nodejs - setup_go - UV_PYTHON_INSTALL_DIR="/usr/local/bin" PYTHON_VERSION="3.14.3" setup_uv - setup_rust - - AUTHENTIK_VERSION="version/2026.2.2" - XMLSEC_VERSION="1.3.11" - - if check_for_gh_release "geoipupdate" "maxmind/geoipupdate"; then - fetch_and_deploy_gh_release "geoipupdate" "maxmind/geoipupdate" "binary" - fi - - if check_for_gh_release "xmlsec" "lsh123/xmlsec" "${XMLSEC_VERSION}"; then - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "xmlsec" "lsh123/xmlsec" "tarball" "${XMLSEC_VERSION}" "/opt/xmlsec" - - msg_info "Updating xmlsec" - cd /opt/xmlsec - $STD ./autogen.sh - $STD make -j $(nproc) - $STD make check - $STD make install - $STD ldconfig - msg_ok "Updated xmlsec" - fi - - 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 - msg_ok "Stopped Services" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "authentik" "goauthentik/authentik" "tarball" "${AUTHENTIK_VERSION}" "/opt/authentik" - - msg_info "Updating web" - cd /opt/authentik/web - export NODE_ENV="production" - $STD npm install - $STD npm run build - $STD npm run build:sfe - msg_ok "Updated web" - - msg_info "Updating go proxy" - cd /opt/authentik - export CGO_ENABLED="1" - $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 - msg_ok "Updated go proxy" - - msg_info "Updating python server" - export UV_NO_BINARY_PACKAGE="cryptography lxml python-kadmin-rs xmlsec" - export UV_COMPILE_BYTECODE="1" - export UV_LINK_MODE="copy" - export UV_NATIVE_TLS="1" - export RUSTUP_PERMIT_COPY_RENAME="true" - export UV_PYTHON_INSTALL_DIR="/usr/local/bin" - cd /opt/authentik - $STD uv sync --frozen --no-install-project --no-dev - chown -R authentik:authentik /opt/authentik - msg_ok "Updated python server" - fi - - msg_info "Starting Services" - systemctl start authentik-server authentik-worker - if [[ $(systemctl is-enabled authentik-ldap) == enabled ]]; then - systemctl start authentik-ldap - fi - if [[ $(systemctl is-enabled authentik-rac) == enabled ]]; then - systemctl start authentik-rac - fi - if [[ $(systemctl is-enabled authentik-radius) == enabled ]]; then - systemctl start authentik-radius - fi - msg_ok "Started Services" - msg_ok "Updated successfully!" - exit -} - -start -build_container - -msg_info "Attaching data storage volume" -$STD pct stop "$CTID" -if [ "${PROTECT_CT:-}" == "1" ] || [ "${PROTECT_CT:-}" == "yes" ]; then - $STD pct set "$CTID" --protection 0 - $STD pct set "$CTID" -mp0 "${CONTAINER_STORAGE}":1,mp=/opt/authentik-data,backup=1 - $STD pct set "$CTID" --protection 1 -else - $STD pct set "$CTID" -mp0 "${CONTAINER_STORAGE}":1,mp=/opt/authentik-data,backup=1 -fi -$STD pct start "$CTID" -for i in {1..10}; do - pct status "$CTID" | grep -q "status: running" && break - sleep 1 -done -$STD pct exec "$CTID" -- bash -c "mkdir -p /opt/authentik-data/{certs,media,geoip,templates}; \ - cp /opt/authentik/tests/GeoLite2-ASN-Test.mmdb /opt/authentik-data/geoip/GeoLite2-ASN.mmdb; \ - cp /opt/authentik/tests/GeoLite2-City-Test.mmdb /opt/authentik-data/geoip/GeoLite2-City.mmdb; \ - chown authentik:authentik /opt/authentik-data; \ - chown -R authentik:authentik /opt/authentik-data/{certs,media,geoip,templates}" -msg_ok "Attached data storage volume" - -msg_info "Starting Services" -pct exec "$CTID" -- systemctl enable -q --now authentik-server authentik-worker -msg_ok "Started Services" - -description - -msg_ok "Completed successfully!\n" -echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Initial setup URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000/if/flow/initial-setup/${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}" diff --git a/ct/arm.sh b/ct/deferred/arm.sh similarity index 100% rename from ct/arm.sh rename to ct/deferred/arm.sh diff --git a/ct/degoog.sh b/ct/degoog.sh deleted file mode 100644 index 55e624f9..00000000 --- a/ct/degoog.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: vhsdream -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/fccview/degoog - -APP="degoog" -var_tags="${var_tags:-search;privacy;plugins}" -var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-2048}" -var_disk="${var_disk:-6}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/degoog ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "degoog" "fccview/degoog"; then - msg_info "Stopping Service" - systemctl stop degoog - msg_ok "Stopped Service" - - msg_info "Backing up Configuration & Data" - [[ -f /opt/degoog/.env ]] && cp /opt/degoog/.env /opt/degoog.env.bak - [[ -d /opt/degoog/data ]] && mv /opt/degoog/data /opt/degoog_data_backup - msg_ok "Backed up Configuration & Data" - - if ! command -v bun >/dev/null 2>&1; then - 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" - fi - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "degoog" "fccview/degoog" "prebuild" "latest" "/opt/degoog" "degoog_*_prebuild.tar.gz" - - msg_info "Restoring Configuration & Data" - [[ -f /opt/degoog.env.bak ]] && mv /opt/degoog.env.bak /opt/degoog/.env - [[ -d /opt/degoog_data_backup ]] && mv /opt/degoog_data_backup /opt/degoog/data - msg_ok "Restored Configuration & Data" - - msg_info "Starting Service" - systemctl start degoog - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:4444${CL}" diff --git a/ct/dispatcharr.sh b/ct/dispatcharr.sh deleted file mode 100644 index 2b7df8df..00000000 --- a/ct/dispatcharr.sh +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: ekke85 | MickLesk -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/Dispatcharr/Dispatcharr - -APP="Dispatcharr" -var_tags="${var_tags:-media;arr}" -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_unprivileged="${var_unprivileged:-1}" -var_gpu="${var_gpu:-yes}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -d "/opt/dispatcharr" ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - setup_uv - NODE_VERSION="24" setup_nodejs - - # Fix for nginx not allowing large files - if ! grep -q "client_max_body_size 100M;" /etc/nginx/sites-available/dispatcharr.conf; then - sed -i '/server_name _;/a \ client_max_body_size 100M;' /etc/nginx/sites-available/dispatcharr.conf - systemctl reload nginx - fi - - ensure_dependencies vlc-bin vlc-plugin-base - - if check_for_gh_release "Dispatcharr" "Dispatcharr/Dispatcharr"; then - msg_info "Stopping Services" - systemctl stop dispatcharr-celery - systemctl stop dispatcharr-celerybeat - systemctl stop dispatcharr-daphne - systemctl stop dispatcharr - msg_ok "Stopped Services" - - msg_info "Creating Backup" - if [[ -f /opt/dispatcharr/.env ]]; then - cp /opt/dispatcharr/.env /opt/dispatcharr.env.bak - fi - if [[ -f /opt/dispatcharr/start-gunicorn.sh ]]; then - rm -f /opt/dispatcharr/start-gunicorn.sh - fi - if [[ -f /opt/dispatcharr/start-celery.sh ]]; then - cp /opt/dispatcharr/start-celery.sh /opt/start-celery.sh.bak - fi - if [[ -f /opt/dispatcharr/start-celerybeat.sh ]]; then - cp /opt/dispatcharr/start-celerybeat.sh /opt/start-celerybeat.sh.bak - fi - if [[ -f /opt/dispatcharr/start-daphne.sh ]]; then - cp /opt/dispatcharr/start-daphne.sh /opt/start-daphne.sh.bak - fi - if [[ -f /opt/dispatcharr/.env ]]; then - set -o allexport - source /opt/dispatcharr/.env - set +o allexport - if [[ -n "$POSTGRES_DB" ]] && [[ -n "$POSTGRES_USER" ]] && [[ -n "$POSTGRES_PASSWORD" ]]; then - PGPASSWORD=$POSTGRES_PASSWORD pg_dump -U "$POSTGRES_USER" -h "${POSTGRES_HOST:-localhost}" -p "${POSTGRES_PORT:-5432}" "$POSTGRES_DB" >/opt/dispatcharr_db_$(date +%F).sql - fi - fi - msg_ok "Created Backup" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dispatcharr" "Dispatcharr/Dispatcharr" "tarball" - - msg_info "Restoring Configuration" - if [[ -f /opt/dispatcharr.env.bak ]]; then - mv /opt/dispatcharr.env.bak /opt/dispatcharr/.env - fi - if [[ -f /opt/start-celery.sh.bak ]]; then - mv /opt/start-celery.sh.bak /opt/dispatcharr/start-celery.sh - fi - if [[ -f /opt/start-celerybeat.sh.bak ]]; then - mv /opt/start-celerybeat.sh.bak /opt/dispatcharr/start-celerybeat.sh - fi - if [[ -f /opt/start-daphne.sh.bak ]]; then - mv /opt/start-daphne.sh.bak /opt/dispatcharr/start-daphne.sh - fi - - if ! grep -q "DJANGO_SECRET_KEY" /opt/dispatcharr/.env; then - DJANGO_SECRET=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | cut -c1-50) - echo "DJANGO_SECRET_KEY=$DJANGO_SECRET" >>/opt/dispatcharr/.env - fi - msg_ok "Restored Configuration" - - msg_info "Updating Python Environment" - cd /opt/dispatcharr - rm -rf .venv - $STD uv venv --clear - $STD uv sync - $STD uv pip install uwsgi gevent celery redis daphne - cat <<'UWSGI_EOF' >/opt/dispatcharr/start-uwsgi.sh -#!/usr/bin/env bash -cd /opt/dispatcharr -set -a -source .env -set +a -exec .venv/bin/uwsgi \ - --chdir=/opt/dispatcharr \ - --module=dispatcharr.wsgi:application \ - --master \ - --workers=4 \ - --gevent=400 \ - --http=0.0.0.0:5656 \ - --http-keepalive=1 \ - --http-timeout=600 \ - --socket-timeout=600 \ - --buffer-size=65536 \ - --post-buffering=4096 \ - --lazy-apps \ - --thunder-lock \ - --die-on-term \ - --vacuum -UWSGI_EOF - chmod +x /opt/dispatcharr/start-uwsgi.sh - if grep -q 'start-gunicorn.sh' /etc/systemd/system/dispatcharr.service; then - sed -i 's|start-gunicorn.sh|start-uwsgi.sh|g' /etc/systemd/system/dispatcharr.service - systemctl daemon-reload - fi - msg_ok "Updated Python Environment" - - msg_info "Building Frontend" - cd /opt/dispatcharr/frontend - node -e "const p=require('./package.json');p.overrides=p.overrides||{};p.overrides['webworkify-webpack']='2.1.3';require('fs').writeFileSync('package.json',JSON.stringify(p,null,2));" - rm -f package-lock.json - $STD npm install --no-audit --progress=false - $STD npm run build - msg_ok "Built Frontend" - - msg_info "Running Database Migrations" - cd /opt/dispatcharr - if [[ -f .env ]]; then - set -o allexport - source .env - set +o allexport - fi - $STD uv run python manage.py migrate --noinput - $STD uv run python manage.py collectstatic --noinput - rm -f /opt/dispatcharr_db_*.sql - msg_ok "Ran Database Migrations" - - msg_info "Starting Services" - systemctl start dispatcharr - systemctl start dispatcharr-celery - systemctl start dispatcharr-celerybeat - systemctl start dispatcharr-daphne - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:9191${CL}" diff --git a/ct/docuseal.sh b/ct/docuseal.sh deleted file mode 100644 index c12c2ab1..00000000 --- a/ct/docuseal.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://www.docuseal.com/ - -APP="DocuSeal" -var_tags="${var_tags:-document;esignature;pdf}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-4096}" -var_disk="${var_disk:-10}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/docuseal ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "docuseal" "docusealco/docuseal"; then - msg_info "Stopping Services" - systemctl stop docuseal docuseal-sidekiq - msg_ok "Stopped Services" - - msg_info "Backing up Data" - cp /opt/docuseal/.env /opt/docuseal.env.bak - [[ -d /opt/docuseal/data ]] && mv /opt/docuseal/data /opt/docuseal_data.bak - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "docuseal" "docusealco/docuseal" "tarball" - - msg_info "Restoring Data" - mv /opt/docuseal.env.bak /opt/docuseal/.env - [[ -d /opt/docuseal_data.bak ]] && mv /opt/docuseal_data.bak /opt/docuseal/data - msg_ok "Restored Data" - - msg_info "Building Application" - cd /opt/docuseal - export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH" - eval "$(rbenv init - bash)" 2>/dev/null || true - export RAILS_ENV=production - export NODE_ENV=production - export SECRET_KEY_BASE_DUMMY=1 - set -a - source /opt/docuseal/.env - set +a - $STD bundle config set --local deployment 'true' - $STD bundle config set --local without 'development:test' - $STD bundle install -j"$(nproc)" - $STD yarn install --network-timeout 1000000 - $STD ./bin/shakapacker - $STD bundle exec rails db:migrate - $STD bundle exec bootsnap precompile -j 1 --gemfile app/ lib/ - chown -R docuseal:docuseal /opt/docuseal - msg_ok "Built Application" - - msg_info "Starting Services" - systemctl start docuseal docuseal-sidekiq - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/erpnext.sh b/ct/erpnext.sh deleted file mode 100644 index d4647a28..00000000 --- a/ct/erpnext.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: community-scripts -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/frappe/erpnext - -APP="ERPNext" -var_tags="${var_tags:-erp;business;accounting}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-4096}" -var_disk="${var_disk:-20}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/frappe-bench ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - msg_info "Updating ERPNext" - $STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; cd /opt/frappe-bench && bench update --reset' - msg_ok "Updated ERPNext" - exit -} - -start -build_container -description - -msg_ok "Completed Successfully!\n" -echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" -echo -e "${INFO}${YW} Credentials:${CL}" -echo -e "${TAB}${BGN}Username: Administrator${CL}" -echo -e "${TAB}${BGN}Password: see ~/erpnext.creds${CL}" diff --git a/ct/espconnect.sh b/ct/espconnect.sh deleted file mode 100644 index 32ef1f7c..00000000 --- a/ct/espconnect.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash -COMMUNITY_SCRIPTS_URL="${COMMUNITY_SCRIPTS_URL:-https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main}" -source <(curl -fsSL "$COMMUNITY_SCRIPTS_URL/misc/build.func") -# Copyright (c) 2021-2026 community-scripts ORG -# Author: John Lombardo -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/thelastoutpostworkshop/ESPConnect - -APP="ESPConnect" -var_tags="${var_tags:-iot;esp32;flash}" -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_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/espconnect ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "espconnect" "thelastoutpostworkshop/ESPConnect"; then - msg_info "Stopping Nginx" - systemctl stop nginx - msg_ok "Stopped Nginx" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "espconnect" "thelastoutpostworkshop/ESPConnect" "prebuild" "latest" "/opt/espconnect" "dist.zip" - - msg_info "Starting Nginx" - systemctl start nginx - msg_ok "Started Nginx" - 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 "${TAB}${GATEWAY}${BGN}https://${IP}${CL}" diff --git a/ct/fileflows.sh b/ct/fileflows.sh deleted file mode 100644 index 2459ce79..00000000 --- a/ct/fileflows.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: kkroboth -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://fileflows.com/ - -APP="FileFlows" -var_tags="${var_tags:-media;automation}" -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_unprivileged="${var_unprivileged:-1}" -var_gpu="${var_gpu:-yes}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - - if [[ ! -d /opt/fileflows ]]; then - msg_error "No ${APP} Installation Found!" - 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 stop fileflows* - msg_info "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" - - fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" - - msg_info "Starting Service" - systemctl start fileflows* - msg_ok "Started Service" - msg_ok "Updated successfully!" - else - msg_ok "No update required. ${APP} is already at latest version" - fi - - exit -} - -start -build_container -description - -msg_ok "Completed successfully!\n" -echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:19200${CL}" diff --git a/ct/labca.sh b/ct/headers/labca.sh similarity index 100% rename from ct/labca.sh rename to ct/headers/labca.sh diff --git a/ct/librechat.sh b/ct/librechat.sh deleted file mode 100644 index e428f953..00000000 --- a/ct/librechat.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/danny-avila/LibreChat - -APP="LibreChat" -var_tags="${var_tags:-ai;chat}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-6144}" -var_disk="${var_disk:-20}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/librechat ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_tag "librechat" "danny-avila/LibreChat" "v"; then - msg_info "Stopping Services" - systemctl stop librechat rag-api - msg_ok "Stopped Services" - - msg_info "Backing up Configuration" - cp /opt/librechat/.env /opt/librechat.env.bak - msg_ok "Backed up Configuration" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_tag "librechat" "danny-avila/LibreChat" - - msg_info "Installing Dependencies" - cd /opt/librechat - $STD npm ci - msg_ok "Installed Dependencies" - - msg_info "Building Frontend" - $STD npm run frontend - $STD npm prune --production - $STD npm cache clean --force - msg_ok "Built Frontend" - - msg_info "Restoring Configuration" - cp /opt/librechat.env.bak /opt/librechat/.env - rm -f /opt/librechat.env.bak - msg_ok "Restored Configuration" - - msg_info "Starting Services" - systemctl start rag-api librechat - msg_ok "Started Services" - msg_ok "Updated LibreChat Successfully!" - fi - - if check_for_gh_release "rag-api" "danny-avila/rag_api"; then - msg_info "Stopping RAG API" - systemctl stop rag-api - msg_ok "Stopped RAG API" - - msg_info "Backing up RAG API Configuration" - cp /opt/rag-api/.env /opt/rag-api.env.bak - msg_ok "Backed up RAG API Configuration" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "rag-api" "danny-avila/rag_api" "tarball" - - msg_info "Updating RAG API Dependencies" - cd /opt/rag-api - $STD .venv/bin/pip install -r requirements.lite.txt - msg_ok "Updated RAG API Dependencies" - - msg_info "Restoring RAG API Configuration" - cp /opt/rag-api.env.bak /opt/rag-api/.env - rm -f /opt/rag-api.env.bak - msg_ok "Restored RAG API Configuration" - - msg_info "Starting RAG API" - systemctl start rag-api - msg_ok "Started RAG API" - msg_ok "Updated RAG API 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 "${TAB}${GATEWAY}${BGN}http://${IP}:3080${CL}" diff --git a/ct/lobehub.sh b/ct/lobehub.sh deleted file mode 100644 index 16921a14..00000000 --- a/ct/lobehub.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/lobehub/lobehub - -APP="LobeHub" -var_tags="${var_tags:-ai;chat}" -var_cpu="${var_cpu:-6}" -var_ram="${var_ram:-10240}" -var_disk="${var_disk:-15}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/lobehub ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "lobehub" "lobehub/lobehub"; then - msg_info "Stopping Services" - systemctl stop lobehub - msg_ok "Stopped Services" - - msg_info "Backing up Data" - cp /opt/lobehub/.env /opt/lobehub.env.bak - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "lobehub" "lobehub/lobehub" "tarball" - - msg_info "Restoring Configuration" - cp /opt/lobehub.env.bak /opt/lobehub/.env - rm -f /opt/lobehub.env.bak - msg_ok "Restored Configuration" - - msg_info "Building Application" - cd /opt/lobehub - export NODE_OPTIONS="--max-old-space-size=8192" - $STD pnpm install - $STD pnpm run build:docker - unset NODE_OPTIONS - msg_ok "Built Application" - - msg_info "Running Database Migrations" - cd /opt/lobehub - set -a && source /opt/lobehub/.env && set +a - $STD node /opt/lobehub/.next/standalone/docker.cjs - msg_ok "Ran Database Migrations" - - msg_info "Starting Services" - systemctl start lobehub - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:3210${CL}" diff --git a/ct/lychee.sh b/ct/lychee.sh deleted file mode 100644 index e6df1a22..00000000 --- a/ct/lychee.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/LycheeOrg/Lychee - -APP="Lychee" -var_tags="${var_tags:-media;photos;gallery}" -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_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/lychee ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "lychee" "LycheeOrg/Lychee"; then - msg_info "Stopping Services" - systemctl stop caddy - 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" - - 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" - - msg_info "Updating Application" - cd /opt/lychee - $STD php artisan migrate --force - $STD php artisan optimize:clear - chmod -R 775 /opt/lychee/storage /opt/lychee/bootstrap/cache - msg_ok "Updated Application" - - msg_info "Starting Services" - systemctl start caddy - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:80${CL}" diff --git a/ct/matomo.sh b/ct/matomo.sh deleted file mode 100644 index 935fef71..00000000 --- a/ct/matomo.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://matomo.org/ - -APP="Matomo" -var_tags="${var_tags:-analytics;tracking;privacy}" -var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-2048}" -var_disk="${var_disk:-16}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -var_unprivileged="${var_unprivileged:-1}" - -header_info "$APP" -variables -color -catch_errors - -function flatten_matomo_layout() { - if [[ -d /opt/matomo/matomo ]]; then - msg_info "Migrating Legacy Layout" - rm -rf /opt/matomo/tmp "/opt/matomo/How to install Matomo.html" - find /opt/matomo/matomo -mindepth 1 -maxdepth 1 -exec mv -t /opt/matomo {} + - rm -rf /opt/matomo/matomo - msg_ok "Migrated Legacy Layout" - fi - -} - -function update_script() { - header_info - check_container_storage - check_container_resources - - if [[ ! -d /opt/matomo ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "matomo" "matomo-org/matomo"; then - msg_info "Stopping Services" - systemctl stop caddy - msg_ok "Stopped Services" - - flatten_matomo_layout - - msg_info "Backing up Data" - [[ -f /opt/matomo/config/config.ini.php ]] && cp /opt/matomo/config/config.ini.php /opt/matomo_config.bak - [[ -d /opt/matomo/misc/user ]] && cp -r /opt/matomo/misc/user /opt/matomo_user_backup - [[ -f /root/matomo.creds ]] && cp /root/matomo.creds /opt/matomo_db_creds.bak - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "matomo" "matomo-org/matomo" "prebuild" "latest" "/opt/matomo" "matomo-*.zip" - - flatten_matomo_layout - - msg_info "Restoring Data" - if [[ -f /opt/matomo_config.bak ]]; then - mkdir -p /opt/matomo/config - cp /opt/matomo_config.bak /opt/matomo/config/config.ini.php - fi - if [[ -d /opt/matomo_user_backup ]]; then - mkdir -p /opt/matomo/misc/user - cp -r /opt/matomo_user_backup/. /opt/matomo/misc/user - fi - [[ -f /opt/matomo_db_creds.bak ]] && cp /opt/matomo_db_creds.bak /root/matomo.creds - rm -f /opt/matomo_config.bak /opt/matomo_db_creds.bak - rm -rf /opt/matomo_user_backup - chown -R www-data:www-data /opt/matomo - msg_ok "Restored Data" - - msg_info "Starting Services" - systemctl start caddy - 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 "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" diff --git a/ct/nagios.sh b/ct/nagios.sh deleted file mode 100644 index 24594094..00000000 --- a/ct/nagios.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/NagiosEnterprises/nagioscore - -APP="Nagios" -var_tags="${var_tags:-monitoring;alerts;infrastructure}" -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_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/nagios/etc/nagios.cfg ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - msg_info "Backing up Configuration" - cp -a /usr/local/nagios/etc /opt/nagios-etc-backup - msg_ok "Backed up Configuration" - - if check_for_gh_release "nagios" "NagiosEnterprises/nagioscore"; then - msg_info "Stopping Nagios" - systemctl stop nagios - msg_ok "Stopped Nagios" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nagios" "NagiosEnterprises/nagioscore" "tarball" - - msg_info "Building Nagios Core" - cd /opt/nagios - $STD ./configure --with-httpd-conf=/etc/apache2/sites-enabled - $STD make all - $STD make install-groups-users - usermod -a -G nagios www-data - $STD make install - $STD make install-daemoninit - $STD make install-commandmode - $STD make install-webconf - $STD a2enmod rewrite - $STD a2enmod cgi - msg_ok "Built Nagios Core" - - msg_info "Starting Nagios" - systemctl restart apache2 - systemctl start nagios - msg_ok "Started Nagios" - fi - - if check_for_gh_release "nagios-plugins" "nagios-plugins/nagios-plugins"; then - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "nagios-plugins" "nagios-plugins/nagios-plugins" "tarball" - msg_info "Building Nagios Plugins" - cd /opt/nagios-plugins - $STD ./tools/setup - $STD ./configure - $STD make - $STD make install - msg_ok "Built Nagios Plugins" - fi - - msg_info "Restoring Configuration" - rm -rf /usr/local/nagios/etc - cp -a /opt/nagios-etc-backup /usr/local/nagios/etc - rm -rf /opt/nagios-etc-backup - msg_ok "Restored Configuration" - 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 "${TAB}${GATEWAY}${BGN}http://${IP}/nagios${CL}" diff --git a/ct/neko.sh b/ct/neko.sh deleted file mode 100644 index aa69a267..00000000 --- a/ct/neko.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: CanbiZ (MickLesk) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://neko.m1k1o.net/ - -APP="Neko" -var_tags="${var_tags:-virtual-browser;webrtc;streaming}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-4096}" -var_disk="${var_disk:-12}" -var_os="${var_os:-debian}" -var_version="${var_version:-12}" -var_unprivileged="${var_unprivileged:-1}" -var_gpu="${var_gpu:-yes}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - - if [[ ! -d /opt/neko ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "neko" "m1k1o/neko"; then - msg_info "Stopping Service" - systemctl stop neko - msg_ok "Stopped Service" - - msg_info "Backing up Data" - cp /etc/neko/neko.yaml /opt/neko.yaml.bak - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "neko" "m1k1o/neko" "tarball" - - msg_info "Building Client" - cd /opt/neko/client - $STD npm install - $STD npm run build - cp -r /opt/neko/client/dist/* /var/www/ - msg_ok "Built Client" - - msg_info "Building Server" - cd /opt/neko/server - $STD ./build - cp /opt/neko/server/bin/neko /usr/bin/neko - cp -r /opt/neko/server/bin/plugins/* /etc/neko/plugins/ 2>/dev/null || true - msg_ok "Built Server" - - msg_info "Restoring Data" - cp /opt/neko.yaml.bak /etc/neko/neko.yaml - rm -f /opt/neko.yaml.bak - msg_ok "Restored Data" - - msg_info "Starting Service" - systemctl start neko - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/netbird.sh b/ct/netbird.sh deleted file mode 100644 index 08eca023..00000000 --- a/ct/netbird.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://netbird.io - -APP="NetBird" -var_tags="${var_tags:-network;vpn;connectivity}" -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_unprivileged="${var_unprivileged:-0}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - - if ! command -v netbird &>/dev/null; then - msg_error "No ${APP} Installation Found!" - exit - fi - - msg_info "Stopping Service" - systemctl stop netbird - msg_ok "Stopped Service" - - msg_info "Updating ${APP}" - $STD apt update - $STD apt install -y --only-upgrade netbird - msg_ok "Updated ${APP}" - - msg_info "Starting Service" - systemctl start netbird - msg_ok "Started Service" - 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} Connect this peer to your NetBird network:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}netbird up --setup-key ${CL}" diff --git a/ct/profilarr.sh b/ct/profilarr.sh deleted file mode 100644 index 00e09ce2..00000000 --- a/ct/profilarr.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: michelroegl-brunner -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/Dictionarry-Hub/profilarr - -APP="Profilarr" -var_tags="${var_tags:-arr;radarr;sonarr;config}" -var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-4096}" -var_disk="${var_disk:-8}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/profilarr ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if [[ -d /opt/profilarr/backend ]]; then - msg_error "Profilarr v1 detected!" - echo -e "\nProfilarr v2 is a complete rewrite and is NOT compatible with v1." - echo -e "There is no migration path. Please create a new LXC container for v2.\n" - exit - fi - - if check_for_gh_release "deno" "denoland/deno"; then - ARCH=$(uname -m) - fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-${ARCH}-unknown-linux-gnu.zip" - fi - - if check_for_gh_release "profilarr" "Dictionarry-Hub/profilarr"; then - msg_info "Stopping Service" - systemctl stop profilarr - msg_ok "Stopped Service" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "profilarr" "Dictionarry-Hub/profilarr" "tarball" - PROFILARR_VERSION=$(cat ~/.profilarr) - - msg_info "Building Profilarr v${PROFILARR_VERSION} (Patience)" - cd /opt/profilarr - cat >src/lib/shared/build.ts <>apps/nextjs-app/.env - export HUSKY=0 - export NODE_OPTIONS="--max-old-space-size=8192" - $STD pnpm install --frozen-lockfile - $STD pnpm -F @teable/db-main-prisma prisma-generate --schema ./prisma/postgres/schema.prisma - NODE_ENV=production NEXT_BUILD_ENV_TYPECHECK=false \ - $STD pnpm -r --filter '!playground' run build - msg_ok "Rebuilt Teable" - - msg_info "Running Database Migrations" - source /opt/teable/.env - $STD pnpm -F @teable/db-main-prisma prisma-migrate deploy --schema ./prisma/postgres/schema.prisma - msg_ok "Ran Database Migrations" - - msg_info "Starting Service" - systemctl start teable - msg_ok "Started Service" - msg_ok "Updated successfully!" - else - msg_ok "No update available." - fi - exit -} - -start -build_container -description - -msg_ok "Completed Successfully!\n" -echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/tubearchivist.sh b/ct/tubearchivist.sh deleted file mode 100644 index afa2a295..00000000 --- a/ct/tubearchivist.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: community-scripts -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/tubearchivist/tubearchivist - -APP="Tube Archivist" -var_tags="${var_tags:-media;youtube;archiving}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-6144}" -var_disk="${var_disk:-30}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/tubearchivist ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "tubearchivist" "tubearchivist/tubearchivist"; then - msg_info "Stopping Services" - systemctl stop tubearchivist tubearchivist-celery tubearchivist-beat - msg_ok "Stopped Services" - - msg_info "Backing up Data" - cp /opt/tubearchivist/.env /opt/tubearchivist_env.bak - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tubearchivist" "tubearchivist/tubearchivist" "tarball" "latest" "/opt/tubearchivist" - - msg_info "Rebuilding Tube Archivist" - cd /opt/tubearchivist/frontend - $STD npm install - $STD npm run build:deploy - mkdir -p /opt/tubearchivist/backend/static - cp -r /opt/tubearchivist/frontend/dist/* /opt/tubearchivist/backend/static/ - cp /opt/tubearchivist/docker_assets/backend_start.py /opt/tubearchivist/backend/ - $STD uv pip install --python /opt/tubearchivist/.venv/bin/python -r /opt/tubearchivist/backend/requirements.txt - if [[ -f /opt/tubearchivist/backend/requirements.plugins.txt ]]; then - mkdir -p /opt/yt_plugins/bgutil - $STD uv pip install --python /opt/tubearchivist/.venv/bin/python --target /opt/yt_plugins/bgutil -r /opt/tubearchivist/backend/requirements.plugins.txt - fi - msg_ok "Rebuilt Tube Archivist" - - msg_info "Restoring Configuration" - mv /opt/tubearchivist_env.bak /opt/tubearchivist/.env - sed -i 's|^TA_APP_DIR=/opt/tubearchivist$|TA_APP_DIR=/opt/tubearchivist/backend|' /opt/tubearchivist/.env - sed -i 's|^TA_CACHE_DIR=/opt/tubearchivist/cache$|TA_CACHE_DIR=/cache|' /opt/tubearchivist/.env - sed -i 's|^TA_MEDIA_DIR=/opt/tubearchivist/media$|TA_MEDIA_DIR=/youtube|' /opt/tubearchivist/.env - ln -sf /opt/tubearchivist/cache /cache - ln -sf /opt/tubearchivist/media /youtube - ln -sf /opt/tubearchivist/.env /opt/tubearchivist/backend/.env - msg_ok "Restored Configuration" - - msg_info "Starting Services" - systemctl start tubearchivist tubearchivist-celery tubearchivist-beat - systemctl reload nginx - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}" -echo -e "${INFO}${YW} Credentials:${CL}" -echo -e "${TAB}${BGN}Username: admin${CL}" -echo -e "${TAB}${BGN}Password: see ~/tubearchivist.creds${CL}" diff --git a/ct/webtrees.sh b/ct/webtrees.sh deleted file mode 100644 index 367b609d..00000000 --- a/ct/webtrees.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: sudofly -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://webtrees.net/ - -APP="Webtrees" -var_tags="${var_tags:-genealogy;cms}" -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_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/webtrees ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "webtrees" "fisharebest/webtrees"; then - msg_info "Stopping Service" - PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;') - systemctl stop caddy php${PHP_VER}-fpm - msg_ok "Stopped Service" - - msg_info "Backing up Data" - cp -r /opt/webtrees/data /opt/webtrees_data_backup - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "webtrees" "fisharebest/webtrees" "prebuild" "latest" "/opt/webtrees" "webtrees-*.zip" - - msg_info "Restoring Data" - cp -r /opt/webtrees_data_backup/. /opt/webtrees/data - rm -rf /opt/webtrees_data_backup - chown -R www-data:www-data /opt/webtrees - msg_ok "Restored Data" - - msg_info "Starting Service" - systemctl start caddy php${PHP_VER}-fpm - 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 "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" From 32281d8ba34bb318434812179fda1b5adfb14840 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 21 May 2026 09:56:14 +0000 Subject: [PATCH 13/37] chore: update app headers [skip ci] --- ct/headers/alpine-coredns | 6 ----- ct/headers/arm | 6 ----- ct/headers/authentik | 6 ----- ct/headers/degoog | 6 ----- ct/headers/dispatcharr | 6 ----- ct/headers/docuseal | 6 ----- ct/headers/erpnext | 6 ----- ct/headers/espconnect | 6 ----- ct/headers/fileflows | 6 ----- ct/headers/labca | 6 ----- ct/headers/labca.sh | 54 --------------------------------------- ct/headers/librechat | 6 ----- ct/headers/lobehub | 6 ----- ct/headers/lychee | 6 ----- ct/headers/matomo | 6 ----- ct/headers/nagios | 6 ----- ct/headers/neko | 6 ----- ct/headers/netbird | 6 ----- ct/headers/profilarr | 6 ----- ct/headers/solidtime | 6 ----- ct/headers/soulsync | 6 ----- ct/headers/storyteller | 6 ----- ct/headers/teable | 6 ----- ct/headers/tubearchivist | 6 ----- ct/headers/webtrees | 6 ----- 25 files changed, 198 deletions(-) delete mode 100644 ct/headers/alpine-coredns delete mode 100644 ct/headers/arm delete mode 100644 ct/headers/authentik delete mode 100644 ct/headers/degoog delete mode 100644 ct/headers/dispatcharr delete mode 100644 ct/headers/docuseal delete mode 100644 ct/headers/erpnext delete mode 100644 ct/headers/espconnect delete mode 100644 ct/headers/fileflows delete mode 100644 ct/headers/labca delete mode 100644 ct/headers/labca.sh delete mode 100644 ct/headers/librechat delete mode 100644 ct/headers/lobehub delete mode 100644 ct/headers/lychee delete mode 100644 ct/headers/matomo delete mode 100644 ct/headers/nagios delete mode 100644 ct/headers/neko delete mode 100644 ct/headers/netbird delete mode 100644 ct/headers/profilarr delete mode 100644 ct/headers/solidtime delete mode 100644 ct/headers/soulsync delete mode 100644 ct/headers/storyteller delete mode 100644 ct/headers/teable delete mode 100644 ct/headers/tubearchivist delete mode 100644 ct/headers/webtrees diff --git a/ct/headers/alpine-coredns b/ct/headers/alpine-coredns deleted file mode 100644 index abf1780b..00000000 --- a/ct/headers/alpine-coredns +++ /dev/null @@ -1,6 +0,0 @@ - ___ __ _ ______ ____ _ _______ - / | / /___ (_)___ ___ / ____/___ ________ / __ \/ | / / ___/ - / /| | / / __ \/ / __ \/ _ \______/ / / __ \/ ___/ _ \/ / / / |/ /\__ \ - / ___ |/ / /_/ / / / / / __/_____/ /___/ /_/ / / / __/ /_/ / /| /___/ / -/_/ |_/_/ .___/_/_/ /_/\___/ \____/\____/_/ \___/_____/_/ |_//____/ - /_/ diff --git a/ct/headers/arm b/ct/headers/arm deleted file mode 100644 index 0c03e1ac..00000000 --- a/ct/headers/arm +++ /dev/null @@ -1,6 +0,0 @@ - ___ ____ __ ___ - / | / __ \/ |/ / - / /| | / /_/ / /|_/ / - / ___ |/ _, _/ / / / -/_/ |_/_/ |_/_/ /_/ - diff --git a/ct/headers/authentik b/ct/headers/authentik deleted file mode 100644 index 40f5a799..00000000 --- a/ct/headers/authentik +++ /dev/null @@ -1,6 +0,0 @@ - __ __ __ _ __ - ____ ___ __/ /_/ /_ ___ ____ / /_(_) /__ - / __ `/ / / / __/ __ \/ _ \/ __ \/ __/ / //_/ -/ /_/ / /_/ / /_/ / / / __/ / / / /_/ / ,< -\__,_/\__,_/\__/_/ /_/\___/_/ /_/\__/_/_/|_| - diff --git a/ct/headers/degoog b/ct/headers/degoog deleted file mode 100644 index 11d6e7e9..00000000 --- a/ct/headers/degoog +++ /dev/null @@ -1,6 +0,0 @@ - __ - ____/ /__ ____ _____ ____ ____ _ - / __ / _ \/ __ `/ __ \/ __ \/ __ `/ -/ /_/ / __/ /_/ / /_/ / /_/ / /_/ / -\__,_/\___/\__, /\____/\____/\__, / - /____/ /____/ diff --git a/ct/headers/dispatcharr b/ct/headers/dispatcharr deleted file mode 100644 index a8ad5396..00000000 --- a/ct/headers/dispatcharr +++ /dev/null @@ -1,6 +0,0 @@ - ____ _ __ __ - / __ \(_)________ ____ _/ /______/ /_ ____ ___________ - / / / / / ___/ __ \/ __ `/ __/ ___/ __ \/ __ `/ ___/ ___/ - / /_/ / (__ ) /_/ / /_/ / /_/ /__/ / / / /_/ / / / / -/_____/_/____/ .___/\__,_/\__/\___/_/ /_/\__,_/_/ /_/ - /_/ diff --git a/ct/headers/docuseal b/ct/headers/docuseal deleted file mode 100644 index 116e3646..00000000 --- a/ct/headers/docuseal +++ /dev/null @@ -1,6 +0,0 @@ - ____ _____ __ - / __ \____ _______ __/ ___/___ ____ _/ / - / / / / __ \/ ___/ / / /\__ \/ _ \/ __ `/ / - / /_/ / /_/ / /__/ /_/ /___/ / __/ /_/ / / -/_____/\____/\___/\__,_//____/\___/\__,_/_/ - diff --git a/ct/headers/erpnext b/ct/headers/erpnext deleted file mode 100644 index 0fbb49f2..00000000 --- a/ct/headers/erpnext +++ /dev/null @@ -1,6 +0,0 @@ - __________ ____ _ __ __ - / ____/ __ \/ __ \/ | / /__ _ __/ /_ - / __/ / /_/ / /_/ / |/ / _ \| |/_/ __/ - / /___/ _, _/ ____/ /| / __/> Date: Thu, 21 May 2026 11:58:07 +0200 Subject: [PATCH 14/37] cleanup --- install/alpine-coredns-install.sh | 58 ----- install/authentik-install.sh | 258 -------------------- install/{ => deferred}/arm-install.sh | 0 install/{ => deferred}/godoxy-install.sh | 0 install/{ => deferred}/labca-install.sh | 0 install/degoog-install.sh | 88 ------- install/dispatcharr-install.sh | 261 -------------------- install/docuseal-install.sh | 164 ------------- install/erpnext-install.sh | 108 --------- install/espconnect-install.sh | 62 ----- install/fileflows-install.sh | 57 ----- install/librechat-install.sh | 139 ----------- install/lobehub-install.sh | 101 -------- install/lychee-install.sh | 77 ------ install/matomo-install.sh | 66 ------ install/nagios-install.sh | 78 ------ install/neko-install.sh | 255 -------------------- install/netbird-install.sh | 29 --- install/profilarr-install.sh | 105 -------- install/solidtime-install.sh | 87 ------- install/soulsync-install.sh | 59 ----- install/storyteller-install.sh | 98 -------- install/teable-install.sh | 94 -------- install/tubearchivist-install.sh | 289 ----------------------- install/web-check-install.sh | 140 ----------- install/webtrees-install.sh | 77 ------ 26 files changed, 2750 deletions(-) delete mode 100644 install/alpine-coredns-install.sh delete mode 100644 install/authentik-install.sh rename install/{ => deferred}/arm-install.sh (100%) rename install/{ => deferred}/godoxy-install.sh (100%) rename install/{ => deferred}/labca-install.sh (100%) delete mode 100644 install/degoog-install.sh delete mode 100644 install/dispatcharr-install.sh delete mode 100644 install/docuseal-install.sh delete mode 100644 install/erpnext-install.sh delete mode 100644 install/espconnect-install.sh delete mode 100644 install/fileflows-install.sh delete mode 100644 install/librechat-install.sh delete mode 100644 install/lobehub-install.sh delete mode 100644 install/lychee-install.sh delete mode 100644 install/matomo-install.sh delete mode 100644 install/nagios-install.sh delete mode 100644 install/neko-install.sh delete mode 100644 install/netbird-install.sh delete mode 100644 install/profilarr-install.sh delete mode 100644 install/solidtime-install.sh delete mode 100644 install/soulsync-install.sh delete mode 100644 install/storyteller-install.sh delete mode 100644 install/teable-install.sh delete mode 100644 install/tubearchivist-install.sh delete mode 100644 install/web-check-install.sh delete mode 100644 install/webtrees-install.sh diff --git a/install/alpine-coredns-install.sh b/install/alpine-coredns-install.sh deleted file mode 100644 index adf6c3c6..00000000 --- a/install/alpine-coredns-install.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: CopilotAssistant (community-scripts) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/coredns/coredns - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -ARCH=$(uname -m) -[[ "$ARCH" == "x86_64" ]] && ARCH="amd64" -[[ "$ARCH" == "aarch64" ]] && ARCH="arm64" -fetch_and_deploy_gh_release "coredns" "coredns/coredns" "prebuild" "latest" "/usr/local/bin" \ - "coredns_.*_linux_${ARCH}\.tgz" -chmod +x /usr/local/bin/coredns - -msg_info "Configuring CoreDNS" -mkdir -p /etc/coredns -cat </etc/coredns/Corefile -. { - forward . 1.1.1.1 1.0.0.1 - cache 30 - log - errors - health :8080 - ready :8181 -} -EOF -msg_ok "Configured CoreDNS" - -msg_info "Creating Service" -cat </etc/init.d/coredns -#!/sbin/openrc-run - -name="CoreDNS" -description="CoreDNS DNS Server" -command="/usr/local/bin/coredns" -command_args="-conf /etc/coredns/Corefile" -command_background=true -pidfile="/run/coredns.pid" - -depend() { - need net -} -EOF -chmod +x /etc/init.d/coredns -$STD rc-update add coredns default -$STD rc-service coredns start -msg_ok "Created Service" - -motd_ssh -customize diff --git a/install/authentik-install.sh b/install/authentik-install.sh deleted file mode 100644 index 3147a7b5..00000000 --- a/install/authentik-install.sh +++ /dev/null @@ -1,258 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: Thieneret -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/goauthentik/authentik - -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 \ - libffi-dev \ - libxslt-dev \ - zlib1g-dev \ - libpq-dev \ - krb5-multidev \ - libkrb5-dev \ - heimdal-multidev \ - libclang-dev \ - libltdl-dev \ - libpq5 \ - libmaxminddb0 \ - libkrb5-3 \ - libkdb5-10 \ - libkadm5clnt-mit12 \ - libkadm5clnt7t64-heimdal \ - libltdl7 \ - libxslt1.1 \ - python3-dev \ - libxml2-dev \ - libxml2 \ - libxslt1-dev \ - automake \ - autoconf \ - libtool \ - libtool-bin \ - gcc \ - git -msg_ok "Installed Dependencies" - -NODE_VERSION="24" setup_nodejs -setup_yq -setup_go -UV_PYTHON_INSTALL_DIR="/usr/local/bin" PYTHON_VERSION="3.14.3" setup_uv -setup_rust -PG_VERSION="17" setup_postgresql -PG_DB_NAME="authentik" PG_DB_USER="authentik" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db - -XMLSEC_VERSION="1.3.11" -AUTHENTIK_VERSION="version/2026.2.2" -fetch_and_deploy_gh_release "xmlsec" "lsh123/xmlsec" "tarball" "${XMLSEC_VERSION}" "/opt/xmlsec" -fetch_and_deploy_gh_release "authentik" "goauthentik/authentik" "tarball" "${AUTHENTIK_VERSION}" "/opt/authentik" -fetch_and_deploy_gh_release "geoipupdate" "maxmind/geoipupdate" "binary" - -msg_info "Setup xmlsec" -cd /opt/xmlsec -$STD ./autogen.sh -$STD make -j $(nproc) -$STD make check -$STD make install -$STD ldconfig -msg_ok "xmlsec installed" - -msg_info "Setup web" -cd /opt/authentik/web -export NODE_ENV="production" -$STD npm install -$STD npm run build -$STD npm run build:sfe -msg_ok "Web installed" - -msg_info "Setup go proxy" -cd /opt/authentik -export CGO_ENABLED="1" -$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 -msg_ok "Go proxy installed" - -cat </usr/local/etc/GeoIP.conf -AccountID ChangeME -LicenseKey ChangeME -EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country -DatabaseDirectory /opt/authentik-data/geoip -RetryFor 5m -Parallelism 1 -EOF - -echo "#39 19 * * 6,4 /usr/bin/geoipupdate -f /usr/local/etc/GeoIP.conf" | crontab - - -msg_info "Setup python server" -export UV_NO_BINARY_PACKAGE="cryptography lxml python-kadmin-rs xmlsec" -export UV_COMPILE_BYTECODE="1" -export UV_LINK_MODE="copy" -export UV_NATIVE_TLS="1" -export RUSTUP_PERMIT_COPY_RENAME="true" -export UV_PYTHON_INSTALL_DIR="/usr/local/bin" -cd /opt/authentik -$STD uv sync --frozen --no-install-project --no-dev -cp /opt/authentik/authentik/sources/kerberos/krb5.conf /etc/krb5.conf -msg_ok "Installed python server" - -msg_info "Creating authentik config" -mkdir -p /etc/authentik -mv /opt/authentik/authentik/lib/default.yml /etc/authentik/config.yml -yq -i ".secret_key = \"$(openssl rand -base64 128 | tr -dc 'a-zA-Z0-9' | head -c64)\"" /etc/authentik/config.yml -yq -i ".postgresql.password = \"${PG_DB_PASS}\"" /etc/authentik/config.yml -yq -i ".events.context_processors.geoip = \"/opt/authentik-data/geoip/GeoLite2-City.mmdb\"" /etc/authentik/config.yml -yq -i ".events.context_processors.asn = \"/opt/authentik-data/geoip/GeoLite2-ASN.mmdb\"" /etc/authentik/config.yml -yq -i ".blueprints_dir = \"/opt/authentik/blueprints\"" /etc/authentik/config.yml -yq -i ".cert_discovery_dir = \"/opt/authentik-data/certs\"" /etc/authentik/config.yml -yq -i ".email.template_dir = \"/opt/authentik-data/templates\"" /etc/authentik/config.yml -yq -i ".storage.file.path = \"/opt/authentik-data\"" /etc/authentik/config.yml -yq -i ".disable_startup_analytics = \"true\"" /etc/authentik/config.yml -$STD useradd -U -s /usr/sbin/nologin -r -M -d /opt/authentik authentik -chown -R authentik:authentik /opt/authentik -cat </etc/default/authentik -TMPDIR=/dev/shm/ -UV_LINK_MODE=copy -UV_PYTHON_DOWNLOADS=0 -UV_NATIVE_TLS=1 -VENV_PATH=/opt/authentik/.venv -PYTHONDONTWRITEBYTECODE=1 -PYTHONUNBUFFERED=1 -PATH=/opt/authentik/lifecycle:/opt/authentik/.venv/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin -DJANGO_SETTINGS_MODULE=authentik.root.settings -PROMETHEUS_MULTIPROC_DIR="/tmp/authentik_prometheus_tmp" -EOF -cat </etc/default/authentik_ldap -AUTHENTIK_HOST="https://127.0.0.1:9443" -AUTHENTIK_INSECURE="true" -AUTHENTIK_TOKEN="token-generated-by-authentik" -EOF -cat </etc/default/authentik_rac -AUTHENTIK_HOST="https://127.0.0.1:9443" -AUTHENTIK_INSECURE="true" -AUTHENTIK_TOKEN="token-generated-by-authentik" -EOF -cat </etc/default/authentik_radius -AUTHENTIK_HOST="https://127.0.0.1:9443" -AUTHENTIK_INSECURE="true" -AUTHENTIK_TOKEN="token-generated-by-authentik" -EOF -msg_ok "authentik config created" - -msg_info "Creating services" -cat </etc/systemd/system/authentik-server.service -[Unit] -Description=authentik Go Server (API Gateway) -After=network.target -Wants=postgresql.service - -[Service] -User=authentik -Group=authentik -ExecStartPre=/usr/bin/mkdir -p "\${PROMETHEUS_MULTIPROC_DIR}" -ExecStart=/opt/authentik/authentik-server -WorkingDirectory=/opt/authentik/ -Restart=always -RestartSec=5 -EnvironmentFile=/etc/default/authentik - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/authentik-worker.service -[Unit] -Description=authentik Worker -After=network.target postgresql.service - -[Service] -User=authentik -Group=authentik -Type=simple -EnvironmentFile=/etc/default/authentik -ExecStart=/usr/local/bin/uv run python -m manage worker --pid-file /dev/shm/authentik-worker.pid -WorkingDirectory=/opt/authentik -Restart=always -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/authentik-ldap.service -[Unit] -Description=authentik LDAP Outpost -After=network.target -Wants=postgresql.service - -[Service] -User=authentik -Group=authentik -ExecStart=/opt/authentik/ldap -WorkingDirectory=/opt/authentik/ -Restart=always -RestartSec=5 -EnvironmentFile=/etc/default/authentik_ldap - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/authentik-rac.service -[Unit] -Description=authentik RAC Outpost -After=network.target -Wants=postgresql.service - -[Service] -User=authentik -Group=authentik -ExecStart=/opt/authentik/rac -WorkingDirectory=/opt/authentik/ -Restart=always -RestartSec=5 -EnvironmentFile=/etc/default/authentik_rac - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/authentik-radius.service -[Unit] -Description=authentik Radius Outpost -After=network.target -Wants=postgresql.service - -[Service] -User=authentik -Group=authentik -ExecStart=/opt/authentik/radius -WorkingDirectory=/opt/authentik/ -Restart=always -RestartSec=5 -EnvironmentFile=/etc/default/authentik_radius - -[Install] -WantedBy=multi-user.target -EOF - -msg_ok "Services created" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm-install.sh b/install/deferred/arm-install.sh similarity index 100% rename from install/arm-install.sh rename to install/deferred/arm-install.sh diff --git a/install/godoxy-install.sh b/install/deferred/godoxy-install.sh similarity index 100% rename from install/godoxy-install.sh rename to install/deferred/godoxy-install.sh diff --git a/install/labca-install.sh b/install/deferred/labca-install.sh similarity index 100% rename from install/labca-install.sh rename to install/deferred/labca-install.sh diff --git a/install/degoog-install.sh b/install/degoog-install.sh deleted file mode 100644 index cb1dd23c..00000000 --- a/install/degoog-install.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: vhsdream -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/fccview/degoog - -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 \ - git \ - unzip -msg_ok "Installed Dependencies" - -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 "degoog" "fccview/degoog" "prebuild" "latest" "/opt/degoog" "degoog_*_prebuild.tar.gz" - -msg_info "Setting up degoog" -mkdir -p /opt/degoog/data/{engines,plugins,themes,store} - -cat </opt/degoog/.env -DEGOOG_PORT=4444 -DEGOOG_ENGINES_DIR=/opt/degoog/data/engines -DEGOOG_PLUGINS_DIR=/opt/degoog/data/plugins -DEGOOG_THEMES_DIR=/opt/degoog/data/themes -DEGOOG_ALIASES_FILE=/opt/degoog/data/aliases.json -DEGOOG_PLUGIN_SETTINGS_FILE=/opt/degoog/data/plugin-settings.json -# DEGOOG_SETTINGS_PASSWORDS=changeme -# DEGOOG_PUBLIC_INSTANCE=false -# LOGGER=debug -EOF - -if [[ ! -f /opt/degoog/data/aliases.json ]]; then - cat </opt/degoog/data/aliases.json -{} -EOF -fi - -if [[ ! -f /opt/degoog/data/plugin-settings.json ]]; then - cat </opt/degoog/data/plugin-settings.json -{} -EOF -fi - -if [[ ! -f /opt/degoog/data/repos.json ]]; then - cat </opt/degoog/data/repos.json -[] -EOF -fi -msg_ok "Set up degoog" - -msg_info "Creating Service" -cat </etc/systemd/system/degoog.service -[Unit] -Description=degoog -After=network.target - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/degoog -EnvironmentFile=/opt/degoog/.env -ExecStart=/usr/local/bin/bun run src/server/index.ts -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now degoog -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/dispatcharr-install.sh b/install/dispatcharr-install.sh deleted file mode 100644 index e98cffec..00000000 --- a/install/dispatcharr-install.sh +++ /dev/null @@ -1,261 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: ekke85 | MickLesk -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/Dispatcharr/Dispatcharr - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os -setup_hwaccel - -msg_info "Installing Dependencies" -$STD apt install -y \ - build-essential \ - python3-dev \ - libpq-dev \ - nginx \ - redis-server \ - ffmpeg \ - procps \ - vlc-bin \ - vlc-plugin-base \ - streamlink -msg_ok "Installed Dependencies" - -setup_uv -NODE_VERSION="24" setup_nodejs -PG_VERSION="16" setup_postgresql -PG_DB_NAME="dispatcharr_db" PG_DB_USER="dispatcharr_usr" setup_postgresql_db -fetch_and_deploy_gh_release "dispatcharr" "Dispatcharr/Dispatcharr" "tarball" - -msg_info "Installing Python Dependencies" -cd /opt/dispatcharr -$STD uv venv --clear -$STD uv sync -$STD uv pip install uwsgi gevent celery redis daphne -msg_ok "Installed Python Dependencies" - -msg_info "Configuring Dispatcharr" -install -d -m 755 \ - /data/{logos,recordings,plugins,db} \ - /data/uploads/{m3us,epgs} \ - /data/{m3us,epgs} -chown -R root:root /data -DJANGO_SECRET=$(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9' | cut -c1-50) -export DATABASE_URL="postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}" -export POSTGRES_DB=$PG_DB_NAME -export POSTGRES_USER=$PG_DB_USER -export POSTGRES_PASSWORD=$PG_DB_PASS -export POSTGRES_HOST=localhost -export DJANGO_SECRET_KEY=$DJANGO_SECRET -$STD uv run python manage.py migrate --noinput -$STD uv run python manage.py collectstatic --noinput -cat </opt/dispatcharr/.env -DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME} -POSTGRES_DB=$PG_DB_NAME -POSTGRES_USER=$PG_DB_USER -POSTGRES_PASSWORD=$PG_DB_PASS -POSTGRES_HOST=localhost -CELERY_BROKER_URL=redis://localhost:6379/0 -DJANGO_SECRET_KEY=$DJANGO_SECRET -EOF -cd /opt/dispatcharr/frontend -node -e "const p=require('./package.json');p.overrides=p.overrides||{};p.overrides['webworkify-webpack']='2.1.3';require('fs').writeFileSync('package.json',JSON.stringify(p,null,2));" -rm -f package-lock.json -$STD npm install --no-audit --progress=false -$STD npm run build -msg_ok "Configured Dispatcharr" - -msg_info "Configuring Nginx" -cat </etc/nginx/sites-available/dispatcharr.conf -server { - listen 9191; - server_name _; - client_max_body_size 100M; - - location /assets/ { - alias /opt/dispatcharr/frontend/dist/assets/; - expires 30d; - add_header Cache-Control "public, immutable"; - - types { - text/javascript js; - text/css css; - image/png png; - image/svg+xml svg svgz; - font/woff2 woff2; - font/woff woff; - font/ttf ttf; - } - } - - location /static/ { - alias /opt/dispatcharr/static/; - expires 30d; - add_header Cache-Control "public, immutable"; - } - - location /media/ { - alias /opt/dispatcharr/media/; - } - - location /ws/ { - proxy_pass http://127.0.0.1:8001; - proxy_http_version 1.1; - proxy_set_header Upgrade \$http_upgrade; - proxy_set_header Connection "Upgrade"; - 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; - } - - location / { - include proxy_params; - proxy_pass http://127.0.0.1:5656; - } -} -EOF -ln -sf /etc/nginx/sites-available/dispatcharr.conf /etc/nginx/sites-enabled/dispatcharr.conf -rm -f /etc/nginx/sites-enabled/default -systemctl restart nginx -msg_ok "Configured Nginx" - -msg_info "Creating Services" -cat <<'EOF' >/opt/dispatcharr/start-uwsgi.sh -#!/usr/bin/env bash -cd /opt/dispatcharr -set -a -source .env -set +a -exec .venv/bin/uwsgi \ - --chdir=/opt/dispatcharr \ - --module=dispatcharr.wsgi:application \ - --master \ - --workers=4 \ - --gevent=400 \ - --http=0.0.0.0:5656 \ - --http-keepalive=1 \ - --http-timeout=600 \ - --socket-timeout=600 \ - --buffer-size=65536 \ - --post-buffering=4096 \ - --lazy-apps \ - --thunder-lock \ - --die-on-term \ - --vacuum -EOF -chmod +x /opt/dispatcharr/start-uwsgi.sh - -cat <<'EOF' >/opt/dispatcharr/start-celery.sh -#!/usr/bin/env bash -cd /opt/dispatcharr -set -a -source .env -set +a -exec uv run celery -A dispatcharr worker -l info -c 4 -EOF -chmod +x /opt/dispatcharr/start-celery.sh - -cat <<'EOF' >/opt/dispatcharr/start-celerybeat.sh -#!/usr/bin/env bash -cd /opt/dispatcharr -set -a -source .env -set +a -exec uv run celery -A dispatcharr beat -l info -EOF -chmod +x /opt/dispatcharr/start-celerybeat.sh - -cat <<'EOF' >/opt/dispatcharr/start-daphne.sh -#!/usr/bin/env bash -cd /opt/dispatcharr -set -a -source .env -set +a -exec uv run daphne -b 0.0.0.0 -p 8001 dispatcharr.asgi:application -EOF -chmod +x /opt/dispatcharr/start-daphne.sh - -cat </etc/systemd/system/dispatcharr.service -[Unit] -Description=Dispatcharr Web Server -After=network.target postgresql.service redis-server.service - -[Service] -Type=simple -WorkingDirectory=/opt/dispatcharr -ExecStart=/opt/dispatcharr/start-uwsgi.sh -Restart=on-failure -RestartSec=10 -User=root - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/dispatcharr-celery.service -[Unit] -Description=Dispatcharr Celery Worker -After=network.target redis-server.service -Requires=dispatcharr.service - -[Service] -Type=simple -WorkingDirectory=/opt/dispatcharr -ExecStart=/opt/dispatcharr/start-celery.sh -Restart=on-failure -RestartSec=10 -User=root - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/dispatcharr-celerybeat.service -[Unit] -Description=Dispatcharr Celery Beat Scheduler -After=network.target redis-server.service -Requires=dispatcharr.service - -[Service] -Type=simple -WorkingDirectory=/opt/dispatcharr -ExecStart=/opt/dispatcharr/start-celerybeat.sh -Restart=on-failure -RestartSec=10 -User=root - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/dispatcharr-daphne.service -[Unit] -Description=Dispatcharr WebSocket Server (Daphne) -After=network.target -Requires=dispatcharr.service - -[Service] -Type=simple -WorkingDirectory=/opt/dispatcharr -ExecStart=/opt/dispatcharr/start-daphne.sh -Restart=on-failure -RestartSec=10 -User=root - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now dispatcharr dispatcharr-celery dispatcharr-celerybeat dispatcharr-daphne -msg_ok "Created Services" - -motd_ssh -customize -cleanup_lxc diff --git a/install/docuseal-install.sh b/install/docuseal-install.sh deleted file mode 100644 index 616a1d8d..00000000 --- a/install/docuseal-install.sh +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://www.docuseal.com/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -$STD apt install -y \ - build-essential \ - git \ - libpq-dev \ - libssl-dev \ - libyaml-dev \ - libreadline-dev \ - zlib1g-dev \ - libffi-dev \ - libvips42 \ - libvips-dev \ - libheif1 \ - redis-server \ - fontconfig -msg_ok "Installed Dependencies" - -NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs -RUBY_VERSION="4.0.1" RUBY_INSTALL_RAILS="false" setup_ruby -PG_VERSION="17" setup_postgresql -PG_DB_NAME="docuseal" PG_DB_USER="docuseal" setup_postgresql_db - -msg_info "Downloading Fonts and PDFium" -mkdir -p /opt/fonts /usr/share/fonts/noto -ARCH=$(uname -m | sed 's/x86_64/x64/;s/aarch64/arm64/') -curl -fsSL -o /opt/fonts/GoNotoKurrent-Regular.ttf \ - https://github.com/satbyy/go-noto-universal/releases/download/v7.0/GoNotoKurrent-Regular.ttf -curl -fsSL -o /opt/fonts/GoNotoKurrent-Bold.ttf \ - https://github.com/satbyy/go-noto-universal/releases/download/v7.0/GoNotoKurrent-Bold.ttf -curl -fsSL -o /opt/fonts/DancingScript-Regular.otf \ - https://github.com/impallari/DancingScript/raw/master/fonts/DancingScript-Regular.otf -ln -sf /opt/fonts/GoNotoKurrent-Regular.ttf /usr/share/fonts/noto/ -ln -sf /opt/fonts/GoNotoKurrent-Bold.ttf /usr/share/fonts/noto/ -$STD fc-cache -f -curl -fsSL -o /tmp/pdfium.tgz \ - "https://github.com/bblanchon/pdfium-binaries/releases/latest/download/pdfium-linux-${ARCH}.tgz" -mkdir -p /tmp/pdfium && tar -xzf /tmp/pdfium.tgz -C /tmp/pdfium -cp /tmp/pdfium/lib/libpdfium.so /usr/lib/libpdfium.so -rm -rf /tmp/pdfium /tmp/pdfium.tgz -msg_ok "Downloaded Fonts and PDFium" - -fetch_and_deploy_gh_release "docuseal" "docusealco/docuseal" "tarball" - -msg_info "Downloading Field Detection Model" -mkdir -p /opt/docuseal/tmp -curl -fsSL -o /opt/docuseal/tmp/model.onnx \ - "https://github.com/docusealco/fields-detection/releases/download/2.0.0/model_704_int8.onnx" -mkdir -p /opt/docuseal/public/fonts -ln -sf /opt/fonts/DancingScript-Regular.otf /opt/docuseal/public/fonts/DancingScript-Regular.otf -msg_ok "Downloaded Field Detection Model" - -msg_info "Configuring DocuSeal" -SECRET_KEY=$(openssl rand -hex 64) -mkdir -p /opt/docuseal/data -cat </opt/docuseal/.env -RAILS_ENV=production -NODE_ENV=production -RAILS_LOG_TO_STDOUT=true -RAILS_SERVE_STATIC_FILES=true -SECRET_KEY_BASE=${SECRET_KEY} -DATABASE_URL=postgresql://docuseal:${PG_DB_PASS}@127.0.0.1:5432/docuseal -REDIS_URL=redis://localhost:6379/0 -WORKDIR=/opt/docuseal/data -VIPS_MAX_COORD=17000 -EOF -msg_ok "Configured DocuSeal" - -msg_info "Building Application" -cd /opt/docuseal -export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH" -eval "$(rbenv init - bash)" 2>/dev/null || true -export RAILS_ENV=production -export NODE_ENV=production -export SECRET_KEY_BASE_DUMMY=1 -set -a -source /opt/docuseal/.env -set +a -$STD bundle config set --local deployment 'true' -$STD bundle config set --local without 'development:test' -$STD bundle install -j"$(nproc)" -$STD yarn install --network-timeout 1000000 -$STD ./bin/shakapacker -$STD bundle exec rails db:migrate -$STD bundle exec bootsnap precompile -j 1 --gemfile app/ lib/ -msg_ok "Built Application" - -msg_info "Enabling Redis" -systemctl enable -q --now redis-server -msg_ok "Enabled Redis" - -msg_info "Creating docuseal User" -id docuseal &>/dev/null || useradd -u 2000 -M -s /usr/sbin/nologin -d /opt/docuseal docuseal -chmod o+x /root -chmod -R o+rX /root/.rbenv -chown -R docuseal:docuseal /opt/docuseal /opt/fonts -msg_ok "Created docuseal User" - -msg_info "Creating Services" -cat </etc/systemd/system/docuseal.service -[Unit] -Description=DocuSeal Web -After=network.target postgresql.service redis-server.service - -[Service] -Type=simple -User=docuseal -Group=docuseal -WorkingDirectory=/opt/docuseal -EnvironmentFile=/opt/docuseal/.env -Environment=HOME=/opt/docuseal -Environment=PATH=/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -Environment=BUNDLE_GEMFILE=/opt/docuseal/Gemfile -Environment=BUNDLE_WITHOUT=development:test -ExecStart=/opt/docuseal/bin/bundle exec puma -C /opt/docuseal/config/puma.rb --dir /opt/docuseal -p 3000 -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF - -cat </etc/systemd/system/docuseal-sidekiq.service -[Unit] -Description=DocuSeal Sidekiq -After=network.target postgresql.service redis-server.service - -[Service] -Type=simple -User=docuseal -Group=docuseal -WorkingDirectory=/opt/docuseal -EnvironmentFile=/opt/docuseal/.env -Environment=HOME=/opt/docuseal -Environment=PATH=/root/.rbenv/shims:/root/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -Environment=BUNDLE_GEMFILE=/opt/docuseal/Gemfile -Environment=BUNDLE_WITHOUT=development:test -ExecStart=/opt/docuseal/bin/bundle exec sidekiq -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now docuseal docuseal-sidekiq -msg_ok "Created Services" - -motd_ssh -customize -cleanup_lxc diff --git a/install/erpnext-install.sh b/install/erpnext-install.sh deleted file mode 100644 index bb10a21e..00000000 --- a/install/erpnext-install.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/frappe/erpnext - -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 \ - git \ - sudo \ - build-essential \ - python3-dev \ - libffi-dev \ - libssl-dev \ - redis-server \ - nginx \ - supervisor \ - fail2ban \ - xvfb \ - libfontconfig1 \ - libxrender1 \ - fontconfig \ - libjpeg-dev \ - libmariadb-dev \ - python3-pip -msg_ok "Installed Dependencies" - -NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs -UV_PYTHON="3.13" setup_uv - -setup_mariadb - -msg_info "Configuring MariaDB for ERPNext" -cat </etc/mysql/mariadb.conf.d/50-erpnext.cnf -[mysqld] -character-set-server=utf8mb4 -collation-server=utf8mb4_unicode_ci - -[client] -default-character-set=utf8mb4 -EOF -$STD systemctl restart mariadb -msg_ok "Configured MariaDB for ERPNext" - -msg_info "Installing wkhtmltopdf" -WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bookworm_amd64.deb" -$STD curl -fsSL -o /tmp/wkhtmltox.deb "$WKHTMLTOPDF_URL" -$STD apt install -y /tmp/wkhtmltox.deb -rm -f /tmp/wkhtmltox.deb -msg_ok "Installed wkhtmltopdf" - -msg_info "Installing Frappe Bench" -useradd -m -s /bin/bash frappe -chown frappe:frappe /opt -echo "frappe ALL=(ALL) NOPASSWD:ALL" >/etc/sudoers.d/frappe -$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; uv tool install frappe-bench' -msg_ok "Installed Frappe Bench" - -msg_info "Initializing Frappe Bench" -ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) -DB_ROOT_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) -mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASS}'; FLUSH PRIVILEGES;" -$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; cd /opt && bench init --frappe-branch version-15 frappe-bench' -$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; cd /opt/frappe-bench && bench get-app erpnext --branch version-15' -$STD sudo -u frappe bash -c "export PATH=\"\$HOME/.local/bin:\$PATH\"; cd /opt/frappe-bench && bench new-site site1.local --db-root-username root --db-root-password \"$DB_ROOT_PASS\" --admin-password \"$ADMIN_PASS\" --install-app erpnext --set-default" -msg_ok "Initialized Frappe Bench" - -msg_info "Configuring ERPNext" -cat </opt/frappe-bench/.env -ADMIN_PASSWORD=${ADMIN_PASS} -DB_ROOT_PASSWORD=${DB_ROOT_PASS} -SITE_NAME=site1.local -EOF -{ - echo "ERPNext Credentials" - echo "==================" - echo "Admin Username: Administrator" - echo "Admin Password: ${ADMIN_PASS}" - echo "DB Root Password: ${DB_ROOT_PASS}" - echo "Site Name: site1.local" -} >~/erpnext.creds -$STD systemctl enable --now redis-server -msg_ok "Configured ERPNext" - -msg_info "Setting up Production" -BENCH_PY="/home/frappe/.local/share/uv/tools/frappe-bench/bin/python" -$STD sudo -u frappe bash -c "curl -fsSL https://bootstrap.pypa.io/get-pip.py | \"${BENCH_PY}\"" -$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; uv tool install ansible' -ln -sf /home/frappe/.local/bin/ansible* /usr/local/bin/ -$STD bash -c 'export PATH="/home/frappe/.local/bin:$PATH"; cd /opt/frappe-bench && bench setup production frappe --yes' -ln -sf /opt/frappe-bench/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.conf -$STD supervisorctl reread -$STD supervisorctl update -$STD systemctl enable --now supervisor -msg_ok "Set up Production" - -motd_ssh -customize -cleanup_lxc diff --git a/install/espconnect-install.sh b/install/espconnect-install.sh deleted file mode 100644 index 6a4a21e2..00000000 --- a/install/espconnect-install.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: John Lombardo -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/thelastoutpostworkshop/ESPConnect - -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 -msg_ok "Installed Dependencies" - -fetch_and_deploy_gh_release "espconnect" "thelastoutpostworkshop/ESPConnect" "prebuild" "latest" "/opt/espconnect" "dist.zip" - -msg_info "Configuring Nginx" -mkdir -p /etc/ssl/private -$STD openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \ - -keyout /etc/ssl/private/espconnect-selfsigned.key \ - -out /etc/ssl/certs/espconnect-selfsigned.crt \ - -subj "/CN=ESPConnect" - -cat <<'EOF' >/etc/nginx/sites-available/espconnect -server { - listen 80 default_server; - listen [::]:80 default_server; - - return 301 https://$host$request_uri; -} - -server { - listen 443 ssl default_server; - listen [::]:443 ssl default_server; - - ssl_certificate /etc/ssl/certs/espconnect-selfsigned.crt; - ssl_certificate_key /etc/ssl/private/espconnect-selfsigned.key; - ssl_protocols TLSv1.2 TLSv1.3; - - root /opt/espconnect; - index index.html; - - location / { - try_files $uri $uri/ /index.html; - } -} -EOF -ln -sf /etc/nginx/sites-available/espconnect /etc/nginx/sites-enabled/espconnect -rm -f /etc/nginx/sites-enabled/default -$STD nginx -t -systemctl enable -q nginx -systemctl restart nginx -msg_ok "Configured Nginx" - -motd_ssh -customize -cleanup_lxc diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh deleted file mode 100644 index 32380f6f..00000000 --- a/install/fileflows-install.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: kkroboth -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://fileflows.com/ - -# Import Functions und Setup -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 \ - ffmpeg \ - pciutils -msg_ok "Installed Dependencies" - -msg_info "Installing ASP.NET Core Runtime" -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-8.0 -msg_ok "Installed ASP.NET Core Runtime" - -fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows" - -$STD ln -svf /usr/bin/ffmpeg /usr/local/bin/ffmpeg -$STD ln -svf /usr/bin/ffprobe /usr/local/bin/ffprobe -$STD rm -rf /opt/fileflows/Server/runtimes/win-* - -read -r -p "${TAB3}Do you want to install FileFlows Server or Node? (S/N): " install_server - -if [[ "$install_server" =~ ^[Ss]$ ]]; then - msg_info "Installing FileFlows Server" - cd /opt/fileflows/Server - $STD dotnet FileFlows.Server.dll --systemd install --root true - systemctl enable -q --now fileflows - msg_ok "Installed FileFlows Server" -else - msg_info "Installing FileFlows Node" - cd /opt/fileflows/Node - $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 - -motd_ssh -customize -cleanup_lxc diff --git a/install/librechat-install.sh b/install/librechat-install.sh deleted file mode 100644 index aa1f4df2..00000000 --- a/install/librechat-install.sh +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/danny-avila/LibreChat - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -MONGO_VERSION="8.0" setup_mongodb -setup_meilisearch -PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql -PG_DB_NAME="ragapi" PG_DB_USER="ragapi" PG_DB_EXTENSIONS="vector" setup_postgresql_db -NODE_VERSION="24" setup_nodejs -UV_PYTHON="3.12" setup_uv - -fetch_and_deploy_gh_tag "librechat" "danny-avila/LibreChat" -fetch_and_deploy_gh_release "rag-api" "danny-avila/rag_api" "tarball" - -msg_info "Installing LibreChat Dependencies" -cd /opt/librechat -$STD npm ci -msg_ok "Installed LibreChat Dependencies" - -msg_info "Building Frontend" -$STD npm run frontend -$STD npm prune --production -$STD npm cache clean --force -msg_ok "Built Frontend" - -msg_info "Installing RAG API Dependencies" -cd /opt/rag-api -$STD uv venv --python 3.12 --seed .venv -$STD .venv/bin/pip install -r requirements.lite.txt -mkdir -p /opt/rag-api/uploads -msg_ok "Installed RAG API Dependencies" - -msg_info "Configuring LibreChat" -JWT_SECRET=$(openssl rand -hex 32) -JWT_REFRESH_SECRET=$(openssl rand -hex 32) -CREDS_KEY=$(openssl rand -hex 32) -CREDS_IV=$(openssl rand -hex 16) -cat </opt/librechat/.env -HOST=0.0.0.0 -PORT=3080 -MONGO_URI=mongodb://127.0.0.1:27017/LibreChat -DOMAIN_CLIENT=http://${LOCAL_IP}:3080 -DOMAIN_SERVER=http://${LOCAL_IP}:3080 -NO_INDEX=true -TRUST_PROXY=1 -JWT_SECRET=${JWT_SECRET} -JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET} -SESSION_EXPIRY=1000 * 60 * 15 -REFRESH_TOKEN_EXPIRY=(1000 * 60 * 60 * 24) * 7 -CREDS_KEY=${CREDS_KEY} -CREDS_IV=${CREDS_IV} -ALLOW_EMAIL_LOGIN=true -ALLOW_REGISTRATION=true -ALLOW_SOCIAL_LOGIN=false -ALLOW_SOCIAL_REGISTRATION=false -ALLOW_PASSWORD_RESET=false -ALLOW_UNVERIFIED_EMAIL_LOGIN=true -SEARCH=true -MEILI_NO_ANALYTICS=true -MEILI_HOST=http://127.0.0.1:7700 -MEILI_MASTER_KEY=${MEILISEARCH_MASTER_KEY} -RAG_PORT=8000 -RAG_API_URL=http://127.0.0.1:8000 -APP_TITLE=LibreChat -ENDPOINTS=openAI,agents,assistants,anthropic,google -# OPENAI_API_KEY=your-key-here -# OPENAI_MODELS= -# ANTHROPIC_API_KEY=your-key-here -# GOOGLE_KEY=your-key-here -EOF -msg_ok "Configured LibreChat" - -msg_info "Configuring RAG API" -cat </opt/rag-api/.env -VECTOR_DB_TYPE=pgvector -DB_HOST=127.0.0.1 -DB_PORT=5432 -POSTGRES_DB=${PG_DB_NAME} -POSTGRES_USER=${PG_DB_USER} -POSTGRES_PASSWORD=${PG_DB_PASS} -RAG_HOST=0.0.0.0 -RAG_PORT=8000 -JWT_SECRET=${JWT_SECRET} -RAG_UPLOAD_DIR=/opt/rag-api/uploads/ -EOF -msg_ok "Configured RAG API" - -msg_info "Creating Services" -cat </etc/systemd/system/librechat.service -[Unit] -Description=LibreChat -After=network.target mongod.service meilisearch.service rag-api.service - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/librechat -EnvironmentFile=/opt/librechat/.env -ExecStart=/usr/bin/npm run backend -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -cat </etc/systemd/system/rag-api.service -[Unit] -Description=LibreChat RAG API -After=network.target postgresql.service - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/rag-api -EnvironmentFile=/opt/rag-api/.env -ExecStart=/opt/rag-api/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000 -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now rag-api librechat -msg_ok "Created Services" - -motd_ssh -customize -cleanup_lxc diff --git a/install/lobehub-install.sh b/install/lobehub-install.sh deleted file mode 100644 index ad85b04b..00000000 --- a/install/lobehub-install.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/lobehub/lobehub - -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 -msg_ok "Installed Dependencies" - -PG_VERSION="17" PG_MODULES="pgvector" setup_postgresql - -CODENAME=$(. /etc/os-release && echo "${VERSION_CODENAME:-bookworm}") -fetch_and_deploy_gh_release "paradedb" "paradedb/paradedb" "binary" "latest" "" "postgresql-17-pg-search_*-1PARADEDB-${CODENAME}_$(dpkg --print-architecture).deb" - -msg_info "Configuring pg_search preload library" -if ! grep -q "shared_preload_libraries.*pg_search" /etc/postgresql/17/main/postgresql.conf; then - echo "shared_preload_libraries = 'pg_search'" >>/etc/postgresql/17/main/postgresql.conf -fi -systemctl restart postgresql -msg_ok "Configured pg_search preload library" - -PG_DB_NAME="lobehub" PG_DB_USER="lobehub" PG_DB_EXTENSIONS="vector,pg_search" setup_postgresql_db -NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs - -fetch_and_deploy_gh_release "lobehub" "lobehub/lobehub" "tarball" - -msg_info "Building Application" -cd /opt/lobehub -export DATABASE_URL="postgres://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}" -export DATABASE_DRIVER="node" -export KEY_VAULTS_SECRET="$(openssl rand -base64 32)" -export AUTH_SECRET="$(openssl rand -base64 32)" -export APP_URL="http://localhost:3210" -$STD pnpm install -$STD pnpm run build:docker -msg_ok "Built Application" - -msg_info "Configuring Application" -KEY_VAULTS_SECRET=$(openssl rand -base64 32) -AUTH_SECRET=$(openssl rand -base64 32) -cat </opt/lobehub/.env -DATABASE_URL=postgres://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME} -DATABASE_DRIVER=node -KEY_VAULTS_SECRET=${KEY_VAULTS_SECRET} -AUTH_SECRET=${AUTH_SECRET} -APP_URL=http://${LOCAL_IP}:3210 -HOSTNAME=0.0.0.0 -PORT=3210 -NODE_ENV=production -EOF -msg_ok "Configured Application" - -msg_info "Setting Up Standalone" -cp -r /opt/lobehub/.next/static /opt/lobehub/.next/standalone/.next/static -cp -r /opt/lobehub/public /opt/lobehub/.next/standalone/public -cp -r /opt/lobehub/scripts/migrateServerDB/* /opt/lobehub/.next/standalone/ -cp -r /opt/lobehub/packages/database/migrations /opt/lobehub/.next/standalone/migrations -msg_ok "Set Up Standalone" - -msg_info "Running Database Migrations" -cd /opt/lobehub/.next/standalone -set -a && source /opt/lobehub/.env && set +a -$STD node /opt/lobehub/.next/standalone/docker.cjs -msg_ok "Ran Database Migrations" - -msg_info "Creating Service" -cat </etc/systemd/system/lobehub.service -[Unit] -Description=LobeHub -After=network.target postgresql.service -Requires=postgresql.service - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/lobehub/.next/standalone -EnvironmentFile=/opt/lobehub/.env -ExecStart=/usr/bin/node /opt/lobehub/.next/standalone/server.js -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF - -systemctl enable -q --now lobehub -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/lychee-install.sh b/install/lychee-install.sh deleted file mode 100644 index 6c7c0d93..00000000 --- a/install/lychee-install.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/LycheeOrg/Lychee - -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 \ - caddy \ - libimage-exiftool-perl \ - jpegoptim -msg_ok "Installed Dependencies" - -PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="bcmath,ldap,exif,gd,intl,imagick,redis,zip,pdo_pgsql,pcntl" setup_php - -setup_ffmpeg -setup_imagemagick - -PG_VERSION="16" setup_postgresql -PG_DB_NAME="lychee" PG_DB_USER="lychee" setup_postgresql_db - -fetch_and_deploy_gh_release "lychee" "LycheeOrg/Lychee" "prebuild" "latest" "/opt/lychee" "Lychee.zip" - -msg_info "Configuring Application" -cd /opt/lychee -cp .env.example .env -APP_KEY=$($STD php artisan key:generate --show) -sed -i "s|^APP_KEY=.*|APP_KEY=${APP_KEY}|" .env -sed -i "s|^APP_ENV=.*|APP_ENV=production|" .env -sed -i "s|^APP_DEBUG=.*|APP_DEBUG=false|" .env -sed -i "s|^APP_URL=.*|APP_URL=http://${LOCAL_IP}|" .env -sed -i "s|^DB_CONNECTION=.*|DB_CONNECTION=pgsql|" .env -sed -i "s|^DB_HOST=.*|DB_HOST=127.0.0.1|" .env -sed -i "s|^DB_PORT=.*|DB_PORT=5432|" .env -sed -i "s|^#\?DB_DATABASE=.*|DB_DATABASE=${PG_DB_NAME}|" .env -sed -i "s|^DB_USERNAME=.*|DB_USERNAME=${PG_DB_USER}|" .env -sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=${PG_DB_PASS}|" .env -mkdir -p storage/framework/{cache,sessions,views} storage/logs bootstrap/cache public/dist public/uploads public/sym -touch public/dist/user.css public/dist/custom.js -chmod -R 775 storage bootstrap/cache public/dist public/uploads public/sym -msg_ok "Configured Application" - -msg_info "Running Database Migrations" -cd /opt/lychee -$STD php artisan migrate --force -msg_ok "Ran Database Migrations" - -chown -R www-data:www-data /opt/lychee - -msg_info "Configuring Caddy" -PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;') -cat </etc/caddy/Caddyfile -:80 { - root * /opt/lychee/public - php_fastcgi unix//run/php/php${PHP_VER}-fpm.sock - file_server - encode gzip -} -EOF -usermod -aG www-data caddy -msg_ok "Configured Caddy" - -systemctl enable -q --now php${PHP_VER}-fpm -systemctl restart caddy - -motd_ssh -customize -cleanup_lxc diff --git a/install/matomo-install.sh b/install/matomo-install.sh deleted file mode 100644 index 657e9c2c..00000000 --- a/install/matomo-install.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://matomo.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 caddy -msg_ok "Installed Dependencies" - -mkdir -p /opt/matomo - -PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULES="pdo_mysql,gd,mbstring,xml,curl,intl,zip,ldap" setup_php -setup_mariadb -MARIADB_DB_NAME="matomo" MARIADB_DB_USER="matomo" setup_mariadb_db - -msg_info "Allowing Local TCP Database Access" -$STD mariadb -u root -e "CREATE USER IF NOT EXISTS '$MARIADB_DB_USER'@'127.0.0.1' IDENTIFIED BY '$MARIADB_DB_PASS';" -$STD mariadb -u root -e "ALTER USER '$MARIADB_DB_USER'@'127.0.0.1' IDENTIFIED BY '$MARIADB_DB_PASS';" -$STD mariadb -u root -e "GRANT ALL ON \`$MARIADB_DB_NAME\`.* TO '$MARIADB_DB_USER'@'127.0.0.1';" -$STD mariadb -u root -e "FLUSH PRIVILEGES;" -msg_ok "Allowed Local TCP Database Access" - -fetch_and_deploy_gh_release "matomo" "matomo-org/matomo" "prebuild" "latest" "/opt/matomo" "matomo-*.zip" - -msg_info "Setting up Matomo" -if [[ -d /opt/matomo/matomo ]]; then - rm -rf /opt/matomo/tmp "/opt/matomo/How to install Matomo.html" - find /opt/matomo/matomo -mindepth 1 -maxdepth 1 -exec mv -t /opt/matomo {} + - rm -rf /opt/matomo/matomo -fi -mkdir -p /opt/matomo/tmp -chown -R www-data:www-data /opt/matomo -chmod -R 755 /opt/matomo/tmp -msg_ok "Set up Matomo" - -msg_info "Configuring Caddy" -PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;') -cat </etc/caddy/Caddyfile -:80 { - root * /opt/matomo - @blocked path /config /config/* /tmp /tmp/* /.* /.*/* - respond @blocked 403 - php_fastcgi unix//run/php/php${PHP_VER}-fpm.sock - file_server - encode gzip -} -EOF -usermod -aG www-data caddy -msg_ok "Configured Caddy" - -systemctl enable -q --now php${PHP_VER}-fpm -systemctl restart caddy - -motd_ssh -customize -cleanup_lxc diff --git a/install/nagios-install.sh b/install/nagios-install.sh deleted file mode 100644 index bcac72b3..00000000 --- a/install/nagios-install.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/NagiosEnterprises/nagioscore - -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 \ - autoconf \ - automake \ - build-essential \ - bc \ - dc \ - gawk \ - gettext \ - gperf \ - libgd-dev \ - libmcrypt-dev \ - libnet-snmp-perl \ - libssl-dev \ - snmp \ - apache2 \ - apache2-utils -msg_ok "Installed Dependencies" - -PHP_APACHE="YES" setup_php - -fetch_and_deploy_gh_release "nagios" "NagiosEnterprises/nagioscore" "tarball" - -msg_info "Building Nagios Core" -cd /opt/nagios -$STD ./configure --with-httpd-conf=/etc/apache2/sites-enabled -$STD make all -$STD make install-groups-users -usermod -a -G nagios www-data -$STD make install -$STD make install-daemoninit -$STD make install-commandmode -$STD make install-config -$STD make install-webconf -$STD a2enmod rewrite -$STD a2enmod cgi -msg_ok "Built Nagios Core" - -fetch_and_deploy_gh_release "nagios-plugins" "nagios-plugins/nagios-plugins" "tarball" - -msg_info "Building Nagios Plugins" -cd /opt/nagios-plugins -$STD ./tools/setup -$STD ./configure -$STD make -$STD make install -msg_ok "Built Nagios Plugins" - -msg_info "Configuring Web Authentication" -$STD htpasswd -bc /usr/local/nagios/etc/htpasswd.users nagiosadmin nagiosadmin -chown root:www-data /usr/local/nagios/etc/htpasswd.users -chmod 640 /usr/local/nagios/etc/htpasswd.users -msg_ok "Configured Web Authentication" - -msg_info "Starting Services" -systemctl enable -q apache2 -systemctl restart apache2 -systemctl enable -q --now nagios -msg_ok "Started Services" - -motd_ssh -customize -cleanup_lxc diff --git a/install/neko-install.sh b/install/neko-install.sh deleted file mode 100644 index 1dedf7e2..00000000 --- a/install/neko-install.sh +++ /dev/null @@ -1,255 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: CanbiZ (MickLesk) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://neko.m1k1o.net/ - -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 \ - supervisor \ - pulseaudio \ - dbus-x11 \ - xserver-xorg-video-dummy \ - xdotool \ - xclip \ - libgtk-3-0 \ - gstreamer1.0-plugins-base \ - gstreamer1.0-plugins-good \ - gstreamer1.0-plugins-bad \ - gstreamer1.0-plugins-ugly \ - gstreamer1.0-pulseaudio \ - openbox \ - firefox-esr \ - fonts-noto-color-emoji \ - fonts-wqy-zenhei -msg_ok "Installed Dependencies" -systemctl disable -q --now supervisor - -msg_info "Installing Build Dependencies" -$STD apt install -y \ - build-essential \ - pkg-config \ - libx11-dev \ - libxrandr-dev \ - libxtst-dev \ - libgtk-3-dev \ - libxcvt-dev \ - libgstreamer1.0-dev \ - libgstreamer-plugins-base1.0-dev -msg_ok "Installed Build Dependencies" - -NODE_VERSION="22" setup_nodejs -setup_go - -fetch_and_deploy_gh_release "neko" "m1k1o/neko" "tarball" - -msg_info "Building Client" -cd /opt/neko/client -$STD npm install -$STD npm run build -mkdir -p /var/www -cp -r /opt/neko/client/dist/* /var/www/ -msg_ok "Built Client" - -msg_info "Building Server" -cd /opt/neko/server -$STD ./build -cp /opt/neko/server/bin/neko /usr/bin/neko -mkdir -p /etc/neko/plugins -cp -r /opt/neko/server/bin/plugins/* /etc/neko/plugins/ 2>/dev/null || true -msg_ok "Built Server" - -msg_info "Setting up Runtime" -useradd -m -s /bin/bash neko -usermod -aG audio,video neko - -mkdir -p /etc/neko/supervisord /var/www /var/log/neko /tmp/.X11-unix /tmp/runtime-neko /home/neko/.config/pulse /home/neko/.local/share/xorg -chmod 1777 /tmp/.X11-unix -chmod 1777 /var/log/neko -chmod 0700 /tmp/runtime-neko -chown neko /tmp/.X11-unix /var/log/neko /tmp/runtime-neko -chown -R neko:neko /home/neko - -cp /opt/neko/runtime/xorg.conf /etc/neko/xorg.conf -# Remove the dummy_touchscreen InputDevice section (requires custom "neko" Xorg driver not available bare-metal) -sed -i '/Section "InputDevice"/{N;/dummy_touchscreen/{:l;N;/EndSection/!bl;d}}' /etc/neko/xorg.conf -sed -i '/dummy_touchscreen/d' /etc/neko/xorg.conf -sed -i 's/InputDevice "dummy_mouse"/InputDevice "dummy_mouse" "CorePointer"/' /etc/neko/xorg.conf -cp /opt/neko/runtime/default.pa /etc/pulse/default.pa - -cat </etc/neko/supervisord.conf -[supervisord] -nodaemon=true -user=root -pidfile=/var/run/supervisord.pid -logfile=/dev/null -logfile_maxbytes=0 -loglevel=debug - -[include] -files=/etc/neko/supervisord/*.conf - -[program:x-server] -environment=HOME="/home/neko",USER="neko" -command=/usr/bin/X :99.0 -config /etc/neko/xorg.conf -noreset -nolisten tcp -autorestart=true -priority=300 -user=neko -stdout_logfile=/var/log/neko/xorg.log -stdout_logfile_maxbytes=100MB -stdout_logfile_backups=10 -redirect_stderr=true - -[program:pulseaudio] -environment=HOME="/home/neko",USER="neko",DISPLAY=":99.0" -command=/usr/bin/pulseaudio --log-level=error --disallow-module-loading --disallow-exit --exit-idle-time=-1 -autorestart=true -priority=300 -user=neko -stdout_logfile=/var/log/neko/pulseaudio.log -stdout_logfile_maxbytes=100MB -stdout_logfile_backups=10 -redirect_stderr=true - -[program:neko] -environment=HOME="/home/neko",USER="neko",DISPLAY=":99.0" -command=/usr/bin/neko serve --server.static "/var/www" -stopsignal=INT -stopwaitsecs=3 -autorestart=true -priority=800 -user=neko -stdout_logfile=/var/log/neko/neko.log -stdout_logfile_maxbytes=100MB -stdout_logfile_backups=10 -redirect_stderr=true - -[unix_http_server] -file=/var/run/supervisor.sock -chmod=0770 -chown=root:neko - -[supervisorctl] -serverurl=unix:///var/run/supervisor.sock - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface -EOF - -cat </etc/neko/supervisord/firefox.conf -[program:firefox] -environment=HOME="/home/neko",USER="neko",DISPLAY=":99.0" -command=/usr/bin/firefox-esr --no-remote --display=:99.0 -width 1280 -height 720 -stopsignal=INT -autorestart=true -priority=800 -user=neko -stdout_logfile=/var/log/neko/firefox.log -stdout_logfile_maxbytes=100MB -stdout_logfile_backups=10 -redirect_stderr=true - -[program:openbox] -environment=HOME="/home/neko",USER="neko",DISPLAY=":99.0" -command=/usr/bin/openbox --config-file /etc/neko/openbox.xml -autorestart=true -priority=300 -user=neko -stdout_logfile=/var/log/neko/openbox.log -stdout_logfile_maxbytes=100MB -stdout_logfile_backups=10 -redirect_stderr=true -EOF - -cat <<'EOF' >/etc/neko/openbox.xml - - - - - no - true - yes - normal - - - - yes - no - yes - no - 200 - no - - - Smart -
yes
-
- - 1 - 1 - 0 - -
-EOF - -cat </etc/neko/neko.yaml -server: - bind: "0.0.0.0:8080" - static: "/var/www" -session: - cookie: - enabled: false -webrtc: - icelite: true - nat1to1: - - "${LOCAL_IP}" - epr: "59000-59100" -desktop: - input: - enabled: false -member: - provider: "multiuser" - multiuser: - admin_password: "admin" - user_password: "neko" -EOF -msg_ok "Set up Runtime" - -msg_info "Creating Service" -cat </etc/systemd/system/neko.service -[Unit] -Description=Neko Virtual Browser -After=network.target - -[Service] -Type=simple -User=root -Environment=USER=neko -Environment=DISPLAY=:99.0 -Environment=PULSE_SERVER=unix:/tmp/pulseaudio.socket -Environment=XDG_RUNTIME_DIR=/tmp/runtime-neko -Environment=NEKO_PLUGINS_ENABLED=true -Environment=NEKO_PLUGINS_DIR=/etc/neko/plugins/ -Environment=NEKO_CONFIG=/etc/neko/neko.yaml -ExecStart=/usr/bin/supervisord -c /etc/neko/supervisord.conf -n -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now neko -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/netbird-install.sh b/install/netbird-install.sh deleted file mode 100644 index 48147481..00000000 --- a/install/netbird-install.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://netbird.io - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing NetBird Client" -curl -sSL https://pkgs.netbird.io/debian/public.key | gpg --dearmor --output /usr/share/keyrings/netbird-archive-keyring.gpg -echo 'deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main' >/etc/apt/sources.list.d/netbird.list -$STD apt update -$STD apt install -y netbird -msg_ok "Installed NetBird Client" - -msg_info "Enabling Service" -systemctl enable -q --now netbird -msg_ok "Enabled Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/profilarr-install.sh b/install/profilarr-install.sh deleted file mode 100644 index 307f0bc3..00000000 --- a/install/profilarr-install.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: michelroegl-brunner -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/Dictionarry-Hub/profilarr - -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 \ - git \ - libsqlite3-0 -msg_ok "Installed Dependencies" - -ARCH=$(uname -m) -fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-${ARCH}-unknown-linux-gnu.zip" -fetch_and_deploy_gh_release "profilarr" "Dictionarry-Hub/profilarr" "tarball" -PROFILARR_VERSION=$(cat ~/.profilarr) - -msg_info "Building Profilarr v${PROFILARR_VERSION} (Patience)" -cd /opt/profilarr -cat >src/lib/shared/build.ts </etc/default/profilarr -PORT=6868 -HOST=0.0.0.0 -APP_BASE_PATH=/var/lib/profilarr -DENO_SQLITE_PATH=${SQLITE_PATH} -EOF -msg_ok "Installed Profilarr" - -msg_info "Creating Service" -cat </etc/systemd/system/profilarr.service -[Unit] -Description=Profilarr - Configuration Management for Radarr/Sonarr -After=network.target - -[Service] -Type=simple -WorkingDirectory=/opt/profilarr/app -EnvironmentFile=/etc/default/profilarr -Environment=HOME=/root -ExecStart=/opt/profilarr/app/profilarr -Restart=always -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now profilarr -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/solidtime-install.sh b/install/solidtime-install.sh deleted file mode 100644 index 8879a948..00000000 --- a/install/solidtime-install.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://www.solidtime.io/ - -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 caddy -msg_ok "Installed Dependencies" - -PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULES="bcmath,gd,intl,xml,zip,pdo_pgsql,redis,mbstring,curl" setup_php -setup_composer -NODE_VERSION="22" setup_nodejs -PG_VERSION="16" setup_postgresql -PG_DB_NAME="solidtime" PG_DB_USER="solidtime" setup_postgresql_db - -fetch_and_deploy_gh_release "solidtime" "solidtime-io/solidtime" "tarball" - -msg_info "Setting up SolidTime" -cd /opt/solidtime -cp .env.example .env -sed -i "s|^APP_ENV=.*|APP_ENV=production|" .env -sed -i "s|^APP_DEBUG=.*|APP_DEBUG=false|" .env -sed -i "s|^APP_URL=.*|APP_URL=http://${LOCAL_IP}|" .env -sed -i "s|^APP_ENABLE_REGISTRATION=.*|APP_ENABLE_REGISTRATION=true|" .env -sed -i "s|^DB_CONNECTION=.*|DB_CONNECTION=pgsql|" .env -sed -i "s|^DB_HOST=.*|DB_HOST=127.0.0.1|" .env -sed -i "s|^DB_PORT=.*|DB_PORT=5432|" .env -sed -i "s|^DB_DATABASE=.*|DB_DATABASE=${PG_DB_NAME}|" .env -sed -i "s|^DB_USERNAME=.*|DB_USERNAME=${PG_DB_USER}|" .env -sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=${PG_DB_PASS}|" .env -sed -i "s|^FILESYSTEM_DISK=.*|FILESYSTEM_DISK=local|" .env -sed -i "s|^PUBLIC_FILESYSTEM_DISK=.*|PUBLIC_FILESYSTEM_DISK=public|" .env -sed -i "s|^MAIL_MAILER=.*|MAIL_MAILER=log|" .env -sed -i "s|^SESSION_SECURE_COOKIE=.*|SESSION_SECURE_COOKIE=false|" .env -grep -q "^SESSION_SECURE_COOKIE=" .env || echo "SESSION_SECURE_COOKIE=false" >>.env -sed -i "s|^APP_FORCE_HTTPS=.*|APP_FORCE_HTTPS=false|" .env -grep -q "^APP_FORCE_HTTPS=" .env || echo "APP_FORCE_HTTPS=false" >>.env -$STD composer install --no-dev --optimize-autoloader -php artisan self-host:generate-keys >/tmp/solidtime.keys 2>/dev/null -while IFS= read -r line; do - KEY="${line%%=*}" - [[ -z "$KEY" || "${KEY:0:1}" == "#" ]] && continue - sed -i "/^${KEY}=/d" .env - echo "$line" >>.env -done /etc/caddy/Caddyfile -:80 { - root * /opt/solidtime/public - php_fastcgi unix//run/php/php${PHP_VER}-fpm.sock - file_server - encode gzip -} -EOF -usermod -aG www-data caddy -msg_ok "Configured Caddy" - -systemctl enable -q --now php${PHP_VER}-fpm -systemctl restart caddy - -motd_ssh -customize -cleanup_lxc diff --git a/install/soulsync-install.sh b/install/soulsync-install.sh deleted file mode 100644 index e5b2a329..00000000 --- a/install/soulsync-install.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/Nezreka/SoulSync - -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 \ - gcc \ - libffi-dev \ - libssl-dev \ - libchromaprint-tools \ - ffmpeg -msg_ok "Installed Dependencies" - -UV_PYTHON="3.11" setup_uv - -fetch_and_deploy_gh_release "soulsync" "Nezreka/SoulSync" "tarball" - -msg_info "Setting up Application" -cd /opt/soulsync -$STD uv venv /opt/soulsync/.venv --python 3.11 -$STD uv pip install -r requirements.txt --python /opt/soulsync/.venv/bin/python -mkdir -p /opt/soulsync/{config,data,logs} -msg_ok "Set up Application" - -msg_info "Creating Service" -cat </etc/systemd/system/soulsync.service -[Unit] -Description=SoulSync Music Discovery -After=network.target - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/soulsync -ExecStart=/opt/soulsync/.venv/bin/python web_server.py -Environment=PYTHONPATH=/opt/soulsync PYTHONUNBUFFERED=1 DATABASE_PATH=/opt/soulsync/data/music_library.db -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now soulsync -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/storyteller-install.sh b/install/storyteller-install.sh deleted file mode 100644 index 2468c22a..00000000 --- a/install/storyteller-install.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://gitlab.com/storyteller-platform/storyteller - -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 \ - libsqlite3-dev \ - sqlite3 \ - python3-setuptools \ - ffmpeg -msg_ok "Installed Dependencies" - -NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs - -fetch_and_deploy_gh_release "readium" "readium/cli" "prebuild" "latest" "/opt/readium" "readium_linux_x86_64.tar.gz" -ln -sf /opt/readium/readium /usr/local/bin/readium -fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller" - -msg_info "Setting up Storyteller" -cd /opt/storyteller -$STD yarn install --network-timeout 600000 -$STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so -STORYTELLER_SECRET_KEY=$(openssl rand -base64 32) -cat </opt/storyteller/.env -STORYTELLER_SECRET_KEY=${STORYTELLER_SECRET_KEY} -STORYTELLER_DATA_DIR=/opt/storyteller/data -PORT=8001 -HOSTNAME=0.0.0.0 -READIUM_PORT=9000 -NODE_ENV=production -NEXT_TELEMETRY_DISABLED=1 -EOF -mkdir -p /opt/storyteller/data -{ - echo "Storyteller Credentials" - echo "=======================" - echo "Secret Key: ${STORYTELLER_SECRET_KEY}" -} >~/storyteller.creds -msg_ok "Set up Storyteller" - -msg_info "Building Storyteller" -cd /opt/storyteller -export CI=1 -export NODE_ENV=production -export NEXT_TELEMETRY_DISABLED=1 -export SQLITE_NATIVE_BINDING=/opt/storyteller/node_modules/better-sqlite3/build/Release/better_sqlite3.node -$STD yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build -mkdir -p /opt/storyteller/web/.next/standalone/web/.next/static -cp -rT /opt/storyteller/web/.next/static /opt/storyteller/web/.next/standalone/web/.next/static -if [[ -d /opt/storyteller/web/public ]]; then - mkdir -p /opt/storyteller/web/.next/standalone/web/public - cp -rT /opt/storyteller/web/public /opt/storyteller/web/.next/standalone/web/public -fi -mkdir -p /opt/storyteller/web/.next/standalone/web/migrations -cp -rT /opt/storyteller/web/migrations /opt/storyteller/web/.next/standalone/web/migrations -mkdir -p /opt/storyteller/web/.next/standalone/web/sqlite -cp -rT /opt/storyteller/web/sqlite /opt/storyteller/web/.next/standalone/web/sqlite -ln -sf /opt/storyteller/.env /opt/storyteller/web/.next/standalone/web/.env -msg_ok "Built Storyteller" - -msg_info "Creating Service" -cat </etc/systemd/system/storyteller.service -[Unit] -Description=Storyteller -After=network.target - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/storyteller/web/.next/standalone/web -EnvironmentFile=/opt/storyteller/.env -ExecStart=/usr/bin/node --enable-source-maps server.js -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now storyteller -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/teable-install.sh b/install/teable-install.sh deleted file mode 100644 index 8068679f..00000000 --- a/install/teable-install.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/teableio/teable - -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 \ - python3 \ - git -msg_ok "Installed Dependencies" - -NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs -PG_VERSION="16" setup_postgresql -PG_DB_NAME="teable" PG_DB_USER="teable" setup_postgresql_db - -fetch_and_deploy_gh_release "teable" "teableio/teable" "tarball" - -msg_info "Setting up Teable" -cd /opt/teable -TEABLE_VERSION=$(cat ~/.teable) -echo "NEXT_PUBLIC_BUILD_VERSION=\"${TEABLE_VERSION}\"" >>apps/nextjs-app/.env -export HUSKY=0 -export NODE_OPTIONS="--max-old-space-size=8192" -$STD pnpm install --frozen-lockfile -$STD pnpm -F @teable/db-main-prisma prisma-generate --schema ./prisma/postgres/schema.prisma -msg_ok "Set up Teable" - -msg_info "Building Teable" -NODE_ENV=production NEXT_BUILD_ENV_TYPECHECK=false \ - $STD pnpm -r --filter '!playground' run build -msg_ok "Built Teable" - -msg_info "Running Database Migrations" -PRISMA_DATABASE_URL="postgresql://teable:${PG_DB_PASS}@localhost:5432/teable?schema=public" \ - $STD pnpm -F @teable/db-main-prisma prisma-migrate deploy --schema ./prisma/postgres/schema.prisma -msg_ok "Ran Database Migrations" - -msg_info "Configuring Teable" -mkdir -p /opt/teable/.assets /opt/teable/.temporary -SECRET_KEY=$(openssl rand -base64 32) -cat </opt/teable/.env -PRISMA_DATABASE_URL=postgresql://teable:${PG_DB_PASS}@localhost:5432/teable?schema=public&statement_cache_size=1 -PUBLIC_ORIGIN=http://${LOCAL_IP}:3000 -SECRET_KEY=${SECRET_KEY} -PORT=3000 -NODE_ENV=production -NEXT_TELEMETRY_DISABLED=1 -BACKEND_CACHE_PROVIDER=sqlite -BACKEND_CACHE_SQLITE_URI=sqlite:///opt/teable/.assets/.cache.db -NEXTJS_DIR=apps/nextjs-app -EOF -ln -sf /opt/teable /app -rm -rf /opt/teable/static -if [ -d "/opt/teable/apps/nestjs-backend/static/static" ]; then - ln -sf /opt/teable/apps/nestjs-backend/static/static /opt/teable/static -else - ln -sf /opt/teable/apps/nestjs-backend/static /opt/teable/static -fi -msg_ok "Configured Teable" - -msg_info "Creating Service" -cat </etc/systemd/system/teable.service -[Unit] -Description=Teable -After=network.target postgresql.service - -[Service] -Type=simple -WorkingDirectory=/opt/teable -EnvironmentFile=/opt/teable/.env -ExecStart=/usr/bin/node apps/nestjs-backend/dist/index.js -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now teable -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/tubearchivist-install.sh b/install/tubearchivist-install.sh deleted file mode 100644 index e277447f..00000000 --- a/install/tubearchivist-install.sh +++ /dev/null @@ -1,289 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://github.com/tubearchivist/tubearchivist - -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 \ - nginx \ - redis-server \ - atomicparsley \ - python3-dev \ - libldap2-dev \ - libsasl2-dev \ - libssl-dev \ - sqlite3 \ - ffmpeg -msg_ok "Installed Dependencies" - -UV_PYTHON="3.13" setup_uv -NODE_VERSION="24" setup_nodejs - -fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-x86_64-unknown-linux-gnu.zip" - -msg_info "Installing ElasticSearch" -setup_deb822_repo "elastic-8.x" "https://artifacts.elastic.co/GPG-KEY-elasticsearch" "https://artifacts.elastic.co/packages/8.x/apt" "stable" "main" -ES_JAVA_OPTS="-Xms1g -Xmx1g" $STD apt install -y elasticsearch -msg_ok "Installed ElasticSearch" - -msg_info "Configuring ElasticSearch" -cat </etc/elasticsearch/elasticsearch.yml -cluster.name: tubearchivist -path.data: /var/lib/elasticsearch -path.logs: /var/log/elasticsearch -path.repo: ["/var/lib/elasticsearch/snapshot"] -network.host: 127.0.0.1 -xpack.security.enabled: false -xpack.security.transport.ssl.enabled: false -xpack.security.http.ssl.enabled: false -EOF -mkdir -p /var/lib/elasticsearch/snapshot -chown -R elasticsearch:elasticsearch /var/lib/elasticsearch/snapshot -cat </etc/elasticsearch/jvm.options.d/heap.options --Xms1g --Xmx1g -EOF -sysctl -w vm.max_map_count=262144 2>/dev/null || true -cat </etc/sysctl.d/99-elasticsearch.conf -vm.max_map_count=262144 -EOF -systemctl enable -q --now elasticsearch -msg_ok "Configured ElasticSearch" - -fetch_and_deploy_gh_release "tubearchivist" "tubearchivist/tubearchivist" "tarball" "latest" "/opt/tubearchivist" - -msg_info "Building Frontend" -cd /opt/tubearchivist/frontend -$STD npm install -$STD npm run build:deploy -mkdir -p /opt/tubearchivist/backend/static -cp -r /opt/tubearchivist/frontend/dist/* /opt/tubearchivist/backend/static/ -msg_ok "Built Frontend" - -msg_info "Setting up Tube Archivist" -cp /opt/tubearchivist/docker_assets/backend_start.py /opt/tubearchivist/backend/ -$STD uv venv /opt/tubearchivist/.venv -$STD uv pip install --python /opt/tubearchivist/.venv/bin/python -r /opt/tubearchivist/backend/requirements.txt -if [[ -f /opt/tubearchivist/backend/requirements.plugins.txt ]]; then - mkdir -p /opt/yt_plugins/bgutil - $STD uv pip install --python /opt/tubearchivist/.venv/bin/python --target /opt/yt_plugins/bgutil -r /opt/tubearchivist/backend/requirements.plugins.txt -fi -TA_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) -ES_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) -mkdir -p /opt/tubearchivist/{cache,media} -ln -sf /opt/tubearchivist/cache /cache -ln -sf /opt/tubearchivist/media /youtube -cat </opt/tubearchivist/.env -TA_HOST=http://${LOCAL_IP}:8000 -TA_USERNAME=admin -TA_PASSWORD=${TA_PASSWORD} -TA_BACKEND_PORT=8080 -TA_APP_DIR=/opt/tubearchivist/backend -TA_CACHE_DIR=/cache -TA_MEDIA_DIR=/youtube -ES_SNAPSHOT_DIR=/var/lib/elasticsearch/snapshot -ELASTIC_PASSWORD=${ES_PASSWORD} -REDIS_CON=redis://localhost:6379 -ES_URL=http://localhost:9200 -TZ=UTC -PYTHONUNBUFFERED=1 -YTDLP_PLUGIN_DIRS=/opt/yt_plugins -EOF -{ - echo "Tube Archivist Credentials" - echo "==========================" - echo "Username: admin" - echo "Password: ${TA_PASSWORD}" - echo "Elasticsearch Password: ${ES_PASSWORD}" -} >~/tubearchivist.creds -$STD systemctl enable --now redis-server -msg_ok "Set up Tube Archivist" - -msg_info "Configuring Nginx" -sed -i 's/^user www-data;$/user root;/' /etc/nginx/nginx.conf -cat <<'EOF' >/etc/nginx/sites-available/default -server { - listen 8000; - - location = /_auth { - internal; - proxy_pass http://localhost:8080/api/ping/; - proxy_pass_request_body off; - proxy_set_header Content-Length ""; - proxy_set_header Host $http_host; - proxy_set_header Cookie $http_cookie; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - location /cache/videos/ { - auth_request /_auth; - alias /cache/videos/; - } - - location /cache/channels/ { - auth_request /_auth; - alias /cache/channels/; - } - - location /cache/playlists/ { - auth_request /_auth; - alias /cache/playlists/; - } - - location /media/ { - auth_request /_auth; - alias /youtube/; - types { - text/vtt vtt; - } - } - - location /youtube/ { - auth_request /_auth; - alias /youtube/; - types { - video/mp4 mp4; - } - } - - location /api { - include proxy_params; - proxy_pass http://localhost:8080; - } - - location /admin { - include proxy_params; - proxy_pass http://localhost:8080; - } - - location /static/ { - alias /opt/tubearchivist/backend/staticfiles/; - } - - root /opt/tubearchivist/backend/static; - index index.html; - - location ~* ^/(?!static/|cache/).*\.(?:css|js|png|jpg|jpeg|gif|ico|svg|woff2?)$ { - try_files $uri $uri/ /index.html =404; - } - - location = /index.html { - add_header Cache-Control "no-store, no-cache, must-revalidate"; - add_header Pragma "no-cache"; - expires 0; - } - - location / { - add_header Cache-Control "no-store, no-cache, must-revalidate"; - add_header Pragma "no-cache"; - expires 0; - try_files $uri $uri/ /index.html =404; - } -} -EOF -systemctl enable -q nginx -systemctl restart nginx -msg_ok "Configured Nginx" - -msg_info "Creating Services" -cat <<'RUNEOF' >/opt/tubearchivist/backend/run.sh -#!/bin/bash -set -e -cd /opt/tubearchivist/backend -set -a -source /opt/tubearchivist/.env -set +a -PYTHON=/opt/tubearchivist/.venv/bin/python - -echo "Waiting for ElasticSearch..." -for i in $(seq 1 30); do - if curl -sf http://localhost:9200/_cluster/health >/dev/null 2>&1; then - break - fi - sleep 2 -done - -$PYTHON manage.py migrate -$PYTHON manage.py collectstatic --noinput -c -$PYTHON manage.py ta_envcheck -$PYTHON manage.py ta_connection -$PYTHON manage.py ta_startup - -exec $PYTHON backend_start.py -RUNEOF -chmod +x /opt/tubearchivist/backend/run.sh -ln -sf /opt/tubearchivist/.env /opt/tubearchivist/backend/.env -cat </etc/systemd/system/tubearchivist.service -[Unit] -Description=Tube Archivist Backend -After=network.target elasticsearch.service redis-server.service - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/tubearchivist/backend -EnvironmentFile=/opt/tubearchivist/.env -Environment=PATH=/opt/tubearchivist/.venv/bin:/usr/local/bin:/usr/bin:/bin -ExecStart=/opt/tubearchivist/backend/run.sh -Restart=on-failure -RestartSec=10 - -[Install] -WantedBy=multi-user.target -EOF -cat </etc/systemd/system/tubearchivist-celery.service -[Unit] -Description=Tube Archivist Celery Worker -After=tubearchivist.service redis-server.service elasticsearch.service - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/tubearchivist/backend -EnvironmentFile=/opt/tubearchivist/.env -Environment=PATH=/opt/tubearchivist/.venv/bin:/usr/local/bin:/usr/bin:/bin -ExecStart=/opt/tubearchivist/.venv/bin/celery -A task worker --loglevel=error --concurrency=4 --max-tasks-per-child=5 --max-memory-per-child=150000 -Restart=on-failure -RestartSec=5 - -[Install] -WantedBy=multi-user.target -EOF -cat </etc/systemd/system/tubearchivist-beat.service -[Unit] -Description=Tube Archivist Celery Beat -After=tubearchivist.service redis-server.service - -[Service] -Type=simple -User=root -WorkingDirectory=/opt/tubearchivist/backend -EnvironmentFile=/opt/tubearchivist/.env -Environment=PATH=/opt/tubearchivist/.venv/bin:/usr/local/bin:/usr/bin:/bin -ExecStartPre=/bin/bash -c 'for i in \$(seq 1 60); do sqlite3 /cache/db.sqlite3 "SELECT 1 FROM django_celery_beat_crontabschedule LIMIT 1" 2>/dev/null && exit 0; sleep 2; done; exit 1' -ExecStart=/opt/tubearchivist/.venv/bin/celery -A task beat --loglevel=error --scheduler django_celery_beat.schedulers:DatabaseScheduler -Restart=always -RestartSec=5 -RuntimeMaxSec=3600 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now tubearchivist tubearchivist-celery tubearchivist-beat -msg_ok "Created Services" - -motd_ssh -customize -cleanup_lxc diff --git a/install/web-check-install.sh b/install/web-check-install.sh deleted file mode 100644 index cf360962..00000000 --- a/install/web-check-install.sh +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: CrazyWolf13 -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://github.com/lissy93/web-check - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -export DEBIAN_FRONTEND=noninteractive -$STD apt -y install --no-install-recommends \ - git \ - traceroute \ - make \ - g++ \ - traceroute \ - xvfb \ - dbus \ - xorg \ - xvfb \ - gtk2-engines-pixbuf \ - dbus-x11 \ - xfonts-base \ - xfonts-100dpi \ - xfonts-75dpi \ - xfonts-scalable \ - imagemagick \ - x11-apps -msg_ok "Installed Dependencies" - -NODE_VERSION="22" NODE_MODULE="yarn" setup_nodejs - -msg_info "Setup Python3" -$STD apt install -y python3 -rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Setup Python3" - -msg_info "Installing Chromium" -curl -fsSL https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /usr/share/keyrings/google-chrome-keyring.gpg -cat </dev/null -Types: deb -URIs: http://dl.google.com/linux/chrome/deb/ -Suites: stable -Components: main -Architectures: amd64 -Signed-By: /usr/share/keyrings/google-chrome-keyring.gpg -EOF -$STD apt update -$STD apt -y install \ - chromium \ - libxss1 \ - lsb-release -msg_ok "Installed Chromium" - -msg_info "Setting up Chromium" -/usr/bin/chromium --no-sandbox --version >/etc/chromium-version -chmod 755 /usr/bin/chromium -msg_ok "Setup Chromium" - -fetch_and_deploy_gh_release "web-check" "Lissy93/web-check" "tarball" - -msg_info "Installing Web-Check (Patience)" -cd /opt/web-check -cat <<'EOF' >/opt/web-check/.env -CHROME_PATH=/usr/bin/chromium -PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium -HEADLESS=true -GOOGLE_CLOUD_API_KEY='' -REACT_APP_SHODAN_API_KEY='' -REACT_APP_WHO_API_KEY='' -SECURITY_TRAILS_API_KEY='' -CLOUDMERSIVE_API_KEY='' -TRANCO_USERNAME='' -TRANCO_API_KEY='' -URL_SCAN_API_KEY='' -BUILT_WITH_API_KEY='' -TORRENT_IP_API_KEY='' -PORT='3000' -DISABLE_GUI='false' -API_TIMEOUT_LIMIT='10000' -API_CORS_ORIGIN='*' -API_ENABLE_RATE_LIMIT='false' -REACT_APP_API_ENDPOINT='/api' -ENABLE_ANALYTICS='false' -EOF -$STD yarn install --frozen-lockfile --network-timeout 100000 -msg_ok "Installed Web-Check" - -msg_info "Building Web-Check" -$STD yarn build --production -msg_ok "Built Web-Check" - -msg_info "Creating Service" -cat <<'EOF' >/opt/run_web-check.sh -#!/bin/bash -SCREEN_RESOLUTION="1280x1024x24" -if ! systemctl is-active --quiet dbus; then - echo "Warning: dbus service is not running. Some features may not work properly." -fi -[[ -z "${DISPLAY}" ]] && export DISPLAY=":99" -Xvfb "${DISPLAY}" -screen 0 "${SCREEN_RESOLUTION}" & -XVFB_PID=$! -sleep 2 -cd /opt/web-check -exec yarn start -EOF -chmod +x /opt/run_web-check.sh -cat <<'EOF' >/etc/systemd/system/web-check.service -[Unit] -Description=Web Check Service -After=network.target - -[Service] -Type=simple -User=root -Group=root -WorkingDirectory=/opt/web-check -EnvironmentFile=/opt/web-check/.env -ExecStartPre=/bin/bash -c "service dbus start || true" -ExecStartPre=/bin/bash -c "if ! pgrep -f 'Xvfb.*:99' > /dev/null; then Xvfb :99 -screen 0 1280x1024x24 & fi" -ExecStart=/opt/run_web-check.sh -Restart=on-failure -Environment=DISPLAY=:99 - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now web-check -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/webtrees-install.sh b/install/webtrees-install.sh deleted file mode 100644 index 584eabad..00000000 --- a/install/webtrees-install.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: sudofly -# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -# Source: https://webtrees.net/ - -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 \ - caddy \ - unzip -msg_ok "Installed Dependencies" - -PHP_VERSION="8.3" PHP_FPM="YES" PHP_MODULES="bcmath,gd,intl,xml,zip,pdo_mysql,mbstring,curl" setup_php -setup_mariadb -MARIADB_DB_NAME="webtrees" MARIADB_DB_USER="webtrees" setup_mariadb_db -$STD mariadb -u root -e "GRANT ALL ON \`webtrees\`.* TO 'webtrees'@'127.0.0.1' IDENTIFIED BY '${MARIADB_DB_PASS}'; FLUSH PRIVILEGES;" - -fetch_and_deploy_gh_release "webtrees" "fisharebest/webtrees" "prebuild" "latest" "/opt/webtrees" "webtrees-*.zip" - -msg_info "Setting up Webtrees" -chown -R www-data:www-data /opt/webtrees -msg_ok "Set up Webtrees" - -msg_info "Configuring Caddy" -PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;') -cat </etc/caddy/Caddyfile -:80 { - root * /opt/webtrees - php_fastcgi unix//run/php/php${PHP_VER}-fpm.sock - file_server - encode gzip -} -EOF -usermod -aG www-data caddy -msg_ok "Configured Caddy" - -systemctl enable -q --now php${PHP_VER}-fpm -systemctl restart caddy - -msg_info "Automating Webtrees Setup" -sleep 5 -WT_ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c15) -curl -sS -X POST "http://127.0.0.1/" \ - -d "step=6" \ - --data-urlencode "baseurl=http://${LOCAL_IP}" \ - -d "lang=en-US" \ - -d "dbtype=mysql" \ - -d "dbhost=127.0.0.1" \ - -d "dbport=3306" \ - -d "dbuser=webtrees" \ - --data-urlencode "dbpass=${MARIADB_DB_PASS}" \ - -d "dbname=webtrees" \ - -d "tblpfx=wt_" \ - -d "wtname=Administrator" \ - -d "wtuser=Admin" \ - --data-urlencode "wtpass=${WT_ADMIN_PASS}" \ - -d "wtemail=admin@example.com" >/dev/null - -cat <>~/webtrees.creds - -Webtrees Admin User: Admin -Webtrees Admin Password: ${WT_ADMIN_PASS} -EOF -msg_ok "Webtrees Setup Automated" - -motd_ssh -customize -cleanup_lxc From 9819a07e4d4dfb6a157872b2051d312834f9168d Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Thu, 21 May 2026 14:14:52 +0200 Subject: [PATCH 15/37] add arr-stack expiremtn --- ct/flaresolverr.sh | 59 +++ ct/gluetun.sh | 61 +++ ct/lidarr.sh | 55 ++ ct/prowlarr.sh | 54 ++ ct/qbittorrent.sh | 58 +++ ct/radarr.sh | 56 +++ ct/rdtclient.sh | 63 +++ ct/sabnzbd.sh | 70 +++ ct/seerr.sh | 167 ++++++ ct/slskd.sh | 100 ++++ ct/sonarr.sh | 54 ++ install/flaresolverr-install.sh | 62 +++ install/gluetun-install.sh | 96 ++++ install/lidarr-install.sh | 53 ++ install/prowlarr-install.sh | 49 ++ install/qbittorrent-install.sh | 56 +++ install/radarr-install.sh | 49 ++ install/rdtclient-install.sh | 52 ++ install/sabnzbd-install.sh | 69 +++ install/seerr-install.sh | 69 +++ install/slskd-install.sh | 119 +++++ install/sonarr-install.sh | 45 ++ json/arr-stack.json | 40 ++ tools/arr-stack.sh | 867 ++++++++++++++++++++++++++++++++ 24 files changed, 2423 insertions(+) create mode 100644 ct/flaresolverr.sh create mode 100644 ct/gluetun.sh create mode 100644 ct/lidarr.sh create mode 100644 ct/prowlarr.sh create mode 100644 ct/qbittorrent.sh create mode 100644 ct/radarr.sh create mode 100644 ct/rdtclient.sh create mode 100644 ct/sabnzbd.sh create mode 100644 ct/seerr.sh create mode 100644 ct/slskd.sh create mode 100644 ct/sonarr.sh create mode 100644 install/flaresolverr-install.sh create mode 100644 install/gluetun-install.sh create mode 100644 install/lidarr-install.sh create mode 100644 install/prowlarr-install.sh create mode 100644 install/qbittorrent-install.sh create mode 100644 install/radarr-install.sh create mode 100644 install/rdtclient-install.sh create mode 100644 install/sabnzbd-install.sh create mode 100644 install/seerr-install.sh create mode 100644 install/slskd-install.sh create mode 100644 install/sonarr-install.sh create mode 100644 json/arr-stack.json create mode 100644 tools/arr-stack.sh diff --git a/ct/flaresolverr.sh b/ct/flaresolverr.sh new file mode 100644 index 00000000..de4e5fbd --- /dev/null +++ b/ct/flaresolverr.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) | Co-Author: remz1337 +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/FlareSolverr/FlareSolverr + +APP="FlareSolverr" +var_tags="${var_tags:-proxy}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +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/flaresolverr.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if [[ $(grep -E '^VERSION_ID=' /etc/os-release) == *"12"* ]]; then + msg_error "Wrong Debian version detected!" + msg_error "You must upgrade your LXC to Debian Trixie before updating." + exit + fi + if check_for_gh_release "flaresolverr" "FlareSolverr/FlareSolverr"; then + msg_info "Stopping service" + systemctl stop flaresolverr + msg_ok "Stopped service" + + rm -rf /opt/flaresolverr + fetch_and_deploy_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "prebuild" "latest" "/opt/flaresolverr" "flaresolverr_linux_x64.tar.gz" + + msg_info "Starting service" + systemctl start flaresolverr + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8191${CL}" diff --git a/ct/gluetun.sh b/ct/gluetun.sh new file mode 100644 index 00000000..361e48b3 --- /dev/null +++ b/ct/gluetun.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/qdm12/gluetun + +APP="Gluetun" +var_tags="${var_tags:-vpn;wireguard;openvpn}" +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_unprivileged="${var_unprivileged:-1}" +var_tun="${var_tun:-yes}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -f /usr/local/bin/gluetun ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "gluetun" "qdm12/gluetun"; then + msg_info "Stopping Service" + systemctl stop gluetun + msg_ok "Stopped Service" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gluetun" "qdm12/gluetun" "tarball" + + msg_info "Building Gluetun" + cd /opt/gluetun + $STD go mod download + CGO_ENABLED=0 $STD go build -trimpath -ldflags="-s -w" -o /usr/local/bin/gluetun ./cmd/gluetun/ + msg_ok "Built Gluetun" + + msg_info "Starting Service" + systemctl start gluetun + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}" diff --git a/ct/lidarr.sh b/ct/lidarr.sh new file mode 100644 index 00000000..0ae5996e --- /dev/null +++ b/ct/lidarr.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://lidarr.audio/ | Github: https://github.com/Lidarr/Lidarr + +APP="Lidarr" +var_tags="${var_tags:-arr;torrent;usenet}" +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_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /var/lib/lidarr/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "lidarr" "Lidarr/Lidarr"; then + msg_info "Stopping service" + systemctl stop lidarr + msg_ok "Service stopped" + + fetch_and_deploy_gh_release "lidarr" "Lidarr/Lidarr" "prebuild" "latest" "/opt/Lidarr" "Lidarr.master*linux-core-x64.tar.gz" + chmod 775 /opt/Lidarr + + msg_info "Starting service" + systemctl start lidarr + msg_ok "Service started" + msg_ok "Updated successfully!" + fi + exit +} + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8686${CL}" diff --git a/ct/prowlarr.sh b/ct/prowlarr.sh new file mode 100644 index 00000000..249a3356 --- /dev/null +++ b/ct/prowlarr.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://prowlarr.com/ | Github: https://github.com/Prowlarr/Prowlarr + +APP="Prowlarr" +var_tags="${var_tags:-arr}" +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_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /var/lib/prowlarr/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if check_for_gh_release "prowlarr" "Prowlarr/Prowlarr"; then + msg_info "Stopping Service" + systemctl stop prowlarr + msg_ok "Stopped Service" + + rm -rf /opt/Prowlarr + fetch_and_deploy_gh_release "prowlarr" "Prowlarr/Prowlarr" "prebuild" "latest" "/opt/Prowlarr" "Prowlarr.master*linux-core-x64.tar.gz" + chmod 775 /opt/Prowlarr + + msg_info "Starting Service" + systemctl start prowlarr + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:9696${CL}" diff --git a/ct/qbittorrent.sh b/ct/qbittorrent.sh new file mode 100644 index 00000000..63245083 --- /dev/null +++ b/ct/qbittorrent.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: tteck (tteckster) | Co-Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://www.qbittorrent.org/ | Github: https://github.com/qbittorrent/qBittorrent + +APP="qBittorrent" +var_tags="${var_tags:-torrent}" +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_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/qbittorrent-nox.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if [[ ! -f ~/.qbittorrent ]]; then + msg_error "Please create new qBittorrent LXC. Updating from v4.x to v5.x is not supported!" + exit + fi + if check_for_gh_release "qbittorrent" "userdocs/qbittorrent-nox-static"; then + msg_info "Stopping Service" + systemctl stop qbittorrent-nox + msg_ok "Stopped Service" + + rm -f /opt/qbittorrent/qbittorrent-nox + fetch_and_deploy_gh_release "qbittorrent" "userdocs/qbittorrent-nox-static" "singlefile" "latest" "/opt/qbittorrent" "x86_64-qbittorrent-nox" + mv /opt/qbittorrent/qbittorrent /opt/qbittorrent/qbittorrent-nox + + msg_info "Starting Service" + systemctl start qbittorrent-nox + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8090${CL}" diff --git a/ct/radarr.sh b/ct/radarr.sh new file mode 100644 index 00000000..dc575038 --- /dev/null +++ b/ct/radarr.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://radarr.video/ | Github: https://github.com/Radarr/Radarr + +APP="Radarr" +var_tags="${var_tags:-arr}" +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_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /var/lib/radarr/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "Radarr" "Radarr/Radarr"; then + msg_info "Stopping Service" + systemctl stop radarr + msg_ok "Stopped Service" + + rm -rf /opt/Radarr + fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-x64.tar.gz" + chmod 775 /opt/Radarr + + msg_info "Starting Service" + systemctl start radarr + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:7878${CL}" diff --git a/ct/rdtclient.sh b/ct/rdtclient.sh new file mode 100644 index 00000000..fed85ae3 --- /dev/null +++ b/ct/rdtclient.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/rogerfar/rdt-client + +APP="RDTClient" +var_tags="${var_tags:-torrent}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-4}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +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/rdtc/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if check_for_gh_release "rdt-client" "rogerfar/rdt-client"; then + msg_info "Stopping Service" + systemctl stop rdtc + msg_ok "Stopped Service" + + msg_info "Creating backup" + mkdir -p /opt/rdtc-backup + cp -R /opt/rdtc/appsettings.json /opt/rdtc-backup/ + msg_ok "Backup created" + + fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip" + cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/ + if dpkg-query -W aspnetcore-runtime-9.0 >/dev/null 2>&1; then + $STD apt remove --purge -y aspnetcore-runtime-9.0 + ensure_dependencies aspnetcore-runtime-10.0 + fi + rm -rf /opt/rdtc-backup + + msg_info "Starting Service" + systemctl start rdtc + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:6500${CL}" diff --git a/ct/sabnzbd.sh b/ct/sabnzbd.sh new file mode 100644 index 00000000..db510c0b --- /dev/null +++ b/ct/sabnzbd.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) | Co-Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://sabnzbd.org/ | Github: https://github.com/sabnzbd/sabnzbd + +APP="SABnzbd" +var_tags="${var_tags:-downloader}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-5}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if par2 --version | grep -q "par2cmdline-turbo"; then + fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-amd64.zip" + fi + + if [[ ! -d /opt/sabnzbd ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + if check_for_gh_release "sabnzbd-org" "sabnzbd/sabnzbd"; then + PYTHON_VERSION="3.13" setup_uv + systemctl stop sabnzbd + cp -r /opt/sabnzbd /opt/sabnzbd_backup_$(date +%s) + fetch_and_deploy_gh_release "sabnzbd-org" "sabnzbd/sabnzbd" "prebuild" "latest" "/opt/sabnzbd" "SABnzbd-*-src.tar.gz" + + # Always ensure venv exists + if [[ ! -d /opt/sabnzbd/venv ]]; then + msg_info "Migrating SABnzbd to uv virtual environment" + $STD uv venv --clear /opt/sabnzbd/venv + msg_ok "Created uv venv at /opt/sabnzbd/venv" + fi + + # Always check and fix service file if needed + if [[ -f /etc/systemd/system/sabnzbd.service ]] && grep -q "ExecStart=python3 SABnzbd.py" /etc/systemd/system/sabnzbd.service; then + sed -i "s|ExecStart=python3 SABnzbd.py|ExecStart=/opt/sabnzbd/venv/bin/python SABnzbd.py|" /etc/systemd/system/sabnzbd.service + systemctl daemon-reload + msg_ok "Updated SABnzbd service to use uv venv" + fi + $STD uv pip install --upgrade pip --python=/opt/sabnzbd/venv/bin/python + $STD uv pip install -r /opt/sabnzbd/requirements.txt --python=/opt/sabnzbd/venv/bin/python + + systemctl start sabnzbd + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:7777${CL}" diff --git a/ct/seerr.sh b/ct/seerr.sh new file mode 100644 index 00000000..6c7b2abc --- /dev/null +++ b/ct/seerr.sh @@ -0,0 +1,167 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://docs.seerr.dev/ | Github: https://github.com/seerr-team/seerr + +APP="Seerr" +var_tags="${var_tags:-media}" +var_cpu="${var_cpu:-4}" +var_ram="${var_ram:-4096}" +var_disk="${var_disk:-12}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +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/seerr && ! -d /opt/jellyseerr && ! -d /opt/overseerr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + # Start Migration from Jellyseerr + if [[ -f /etc/systemd/system/jellyseerr.service ]]; then + msg_info "Stopping Jellyseerr" + $STD systemctl stop jellyseerr || true + $STD systemctl disable jellyseerr || true + [ -f /etc/systemd/system/jellyseerr.service ] && rm -f /etc/systemd/system/jellyseerr.service + msg_ok "Stopped Jellyseerr" + + msg_info "Creating Backup (Patience)" + tar -czf /opt/jellyseerr_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /opt jellyseerr + msg_ok "Created Backup" + + msg_info "Migrating Jellyseerr to seerr" + [ -d /opt/jellyseerr ] && mv /opt/jellyseerr /opt/seerr + [ -d /etc/jellyseerr ] && mv /etc/jellyseerr /etc/seerr + [ -f /etc/seerr/jellyseerr.conf ] && mv /etc/seerr/jellyseerr.conf /etc/seerr/seerr.conf + cat </etc/systemd/system/seerr.service +[Unit] +Description=Seerr Service +Wants=network-online.target +After=network-online.target + +[Service] +EnvironmentFile=/etc/seerr/seerr.conf +Environment=NODE_ENV=production +Type=exec +Restart=on-failure +WorkingDirectory=/opt/seerr +ExecStart=/usr/bin/node dist/index.js + +[Install] +WantedBy=multi-user.target +EOF + systemctl daemon-reload + systemctl enable -q --now seerr + msg_ok "Migrated Jellyserr to Seerr" + fi + # END Jellyseerr Migration + + # Start Migration from Overseerr + if [[ -f /etc/systemd/system/overseerr.service ]]; then + msg_info "Stopping Overseerr" + $STD systemctl stop overseerr || true + $STD systemctl disable overseerr || true + [ -f /etc/systemd/system/overseerr.service ] && rm -f /etc/systemd/system/overseerr.service + msg_ok "Stopped Overseerr" + + msg_info "Creating Backup (Patience)" + tar -czf /opt/overseerr_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /opt overseerr + msg_ok "Created Backup" + + msg_info "Migrating Overseerr to seerr" + [ -d /opt/overseerr ] && mv /opt/overseerr /opt/seerr + mkdir -p /etc/seerr + cat </etc/seerr/seerr.conf +## Seerr's default port is 5055, if you want to use both, change this. +## specify on which port to listen +PORT=5055 + +## specify on which interface to listen, by default seerr listens on all interfaces +#HOST=127.0.0.1 + +## Uncomment if you want to force Node.js to resolve IPv4 before IPv6 (advanced users only) +# FORCE_IPV4_FIRST=true +EOF + cat </etc/systemd/system/seerr.service +[Unit] +Description=Seerr Service +Wants=network-online.target +After=network-online.target + +[Service] +EnvironmentFile=/etc/seerr/seerr.conf +Environment=NODE_ENV=production +Type=exec +Restart=on-failure +WorkingDirectory=/opt/seerr +ExecStart=/usr/bin/node dist/index.js + +[Install] +WantedBy=multi-user.target +EOF + systemctl daemon-reload + systemctl enable -q --now seerr + msg_ok "Migrated Overseerr to Seerr" + fi + # END Overseerr Migration + + if check_for_gh_release "seerr" "seerr-team/seerr"; then + msg_info "Stopping Service" + systemctl stop seerr + msg_ok "Stopped Service" + + msg_info "Creating Backup" + cp -a /opt/seerr/config /opt/seerr_backup + msg_ok "Created Backup" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "seerr" "seerr-team/seerr" "tarball" + + ensure_dependencies build-essential python3-setuptools + + msg_info "Updating PNPM Version" + pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/seerr/package.json) + NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs + msg_ok "Updated PNPM Version" + + msg_info "Updating Seerr" + cd /opt/seerr + rm -rf dist .next node_modules + export CYPRESS_INSTALL_BINARY=0 + $STD pnpm install --frozen-lockfile + export NODE_OPTIONS="--max-old-space-size=3072" + $STD pnpm build + msg_ok "Updated Seerr" + + msg_info "Restoring Backup" + rm -rf /opt/seerr/config + mv /opt/seerr_backup /opt/seerr/config + msg_ok "Restored Backup" + + msg_info "Starting Service" + systemctl start seerr + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}" diff --git a/ct/slskd.sh b/ct/slskd.sh new file mode 100644 index 00000000..1b1b983a --- /dev/null +++ b/ct/slskd.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/slskd/slskd/, https://github.com/mrusse/soularr + +APP="slskd" +var_tags="${var_tags:-arr;p2p}" +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_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/slskd ]]; then + msg_error "No Slskd Installation Found!" + exit + fi + + if check_for_gh_release "Slskd" "slskd/slskd"; then + msg_info "Stopping Service(s)" + systemctl stop slskd + [[ -f /etc/systemd/system/soularr.service ]] && systemctl stop soularr.timer soularr.service + msg_ok "Stopped Service(s)" + + msg_info "Backing up config" + cp /opt/slskd/config/slskd.yml /opt/slskd.yml.bak + msg_ok "Backed up config" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-x64.zip" + + msg_info "Restoring config" + mv /opt/slskd.yml.bak /opt/slskd/config/slskd.yml + + # Migrate 0.25.0 breaking config key renames + sed -i 's/^global:/transfers:/' /opt/slskd/config/slskd.yml + sed -i 's/^integration:/integrations:/' /opt/slskd/config/slskd.yml + msg_ok "Restored config" + + msg_info "Starting Service(s)" + systemctl start slskd + [[ -f /etc/systemd/system/soularr.service ]] && systemctl start soularr.timer + msg_ok "Started Service(s)" + msg_ok "Updated Slskd successfully!" + fi + [[ -d /opt/soularr ]] && if check_for_gh_release "Soularr" "mrusse/soularr"; then + if systemctl is-active soularr.timer >/dev/null; then + msg_info "Stopping Timer and Service" + systemctl stop soularr.timer soularr.service + msg_ok "Stopped Timer and Service" + fi + + msg_info "Backing up Soularr config" + cp /opt/soularr/config.ini /opt/soularr_config.ini.bak + cp /opt/soularr/run.sh /opt/soularr_run.sh.bak + msg_ok "Backed up Soularr config" + + PYTHON_VERSION="3.11" setup_uv + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Soularr" "mrusse/soularr" "tarball" "latest" "/opt/soularr" + msg_info "Updating Soularr" + cd /opt/soularr + $STD uv venv -c venv + $STD source venv/bin/activate + $STD uv pip install -r requirements.txt + deactivate + msg_ok "Updated Soularr" + + msg_info "Restoring Soularr config" + mv /opt/soularr_config.ini.bak /opt/soularr/config.ini + mv /opt/soularr_run.sh.bak /opt/soularr/run.sh + msg_ok "Restored Soularr config" + + msg_info "Starting Soularr Timer" + systemctl restart soularr.timer + msg_ok "Started Soularr Timer" + msg_ok "Updated Soularr 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 "${TAB}${GATEWAY}${BGN}http://${IP}:5030${CL}" diff --git a/ct/sonarr.sh b/ct/sonarr.sh new file mode 100644 index 00000000..0688e504 --- /dev/null +++ b/ct/sonarr.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://sonarr.tv/ | Github: https://github.com/Sonarr/Sonarr + +APP="Sonarr" +var_tags="${var_tags:-arr}" +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_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /var/lib/sonarr/ ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "Sonarr" "Sonarr/Sonarr"; then + msg_info "Stopping Service" + systemctl stop sonarr + msg_ok "Stopped Service" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Sonarr" "Sonarr/Sonarr" "prebuild" "latest" "/opt/Sonarr" "Sonarr.main.*.linux-x64.tar.gz" + + msg_info "Starting Service" + systemctl start sonarr + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8989${CL}" diff --git a/install/flaresolverr-install.sh b/install/flaresolverr-install.sh new file mode 100644 index 00000000..e260b515 --- /dev/null +++ b/install/flaresolverr-install.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# Co-Author: remz1337 +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/FlareSolverr/FlareSolverr + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +$STD apt-get install -y \ + apt-transport-https \ + xvfb +msg_ok "Installed Dependencies" + +msg_info "Installing Chrome" +setup_deb822_repo \ + "google-chrome" \ + "https://dl.google.com/linux/linux_signing_key.pub" \ + "https://dl.google.com/linux/chrome/deb/" \ + "stable" +$STD apt update +$STD apt install -y google-chrome-stable +# remove google-chrome.list added by google-chrome-stable +if [ -f /etc/apt/sources.list.d/google-chrome.list ]; then + rm /etc/apt/sources.list.d/google-chrome.list +fi +msg_ok "Installed Chrome" + +fetch_and_deploy_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "prebuild" "latest" "/opt/flaresolverr" "flaresolverr_linux_x64.tar.gz" + +msg_info "Creating Service" +cat </etc/systemd/system/flaresolverr.service +[Unit] +Description=FlareSolverr +After=network.target +[Service] +SyslogIdentifier=flaresolverr +Restart=always +RestartSec=5 +Type=simple +Environment="LOG_LEVEL=info" +Environment="CAPTCHA_SOLVER=none" +WorkingDirectory=/opt/flaresolverr +ExecStart=/opt/flaresolverr/flaresolverr +TimeoutStopSec=30 +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now flaresolverr +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/gluetun-install.sh b/install/gluetun-install.sh new file mode 100644 index 00000000..a249bd3b --- /dev/null +++ b/install/gluetun-install.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/qdm12/gluetun + +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 \ + openvpn \ + wireguard-tools \ + iptables +msg_ok "Installed Dependencies" + +msg_info "Configuring iptables" +$STD update-alternatives --set iptables /usr/sbin/iptables-legacy +$STD update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy +ln -sf /usr/sbin/openvpn /usr/sbin/openvpn2.6 +msg_ok "Configured iptables" + +setup_go + +fetch_and_deploy_gh_release "gluetun" "qdm12/gluetun" "tarball" + +msg_info "Building Gluetun" +cd /opt/gluetun +$STD go mod download +CGO_ENABLED=0 $STD go build -trimpath -ldflags="-s -w" -o /usr/local/bin/gluetun ./cmd/gluetun/ +msg_ok "Built Gluetun" + +msg_info "Configuring Gluetun" +mkdir -p /opt/gluetun-data +touch /etc/alpine-release +ln -sf /opt/gluetun-data /gluetun +cat </opt/gluetun-data/.env +VPN_SERVICE_PROVIDER=custom +VPN_TYPE=openvpn +OPENVPN_CUSTOM_CONFIG=/opt/gluetun-data/custom.ovpn +OPENVPN_USER= +OPENVPN_PASSWORD= +OPENVPN_PROCESS_USER=root +PUID=0 +PGID=0 +HTTP_CONTROL_SERVER_ADDRESS=:8000 +HTTPPROXY=off +SHADOWSOCKS=off +PPROF_ENABLED=no +PPROF_BLOCK_PROFILE_RATE=0 +PPROF_MUTEX_PROFILE_RATE=0 +PPROF_HTTP_SERVER_ADDRESS=:6060 +FIREWALL_ENABLED_DISABLING_IT_SHOOTS_YOU_IN_YOUR_FOOT=on +HEALTH_SERVER_ADDRESS=127.0.0.1:9999 +DNS_UPSTREAM_RESOLVERS=cloudflare +LOG_LEVEL=info +STORAGE_FILEPATH=/gluetun/servers.json +PUBLICIP_FILE=/gluetun/ip +VPN_PORT_FORWARDING_STATUS_FILE=/gluetun/forwarded_port +TZ=UTC +EOF +msg_ok "Configured Gluetun" + +msg_info "Creating Service" +cat </etc/systemd/system/gluetun.service +[Unit] +Description=Gluetun VPN Client +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/gluetun-data +EnvironmentFile=/opt/gluetun-data/.env +UnsetEnvironment=USER +ExecStartPre=/bin/sh -c 'rm -f /etc/openvpn/target.ovpn' +ExecStart=/usr/local/bin/gluetun +Restart=on-failure +RestartSec=5 +AmbientCapabilities=CAP_NET_ADMIN + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now gluetun +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/lidarr-install.sh b/install/lidarr-install.sh new file mode 100644 index 00000000..53d0c137 --- /dev/null +++ b/install/lidarr-install.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://lidarr.audio/ | Github: https://github.com/Lidarr/Lidarr + +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 \ + sqlite3 \ + libchromaprint-tools \ + mediainfo +msg_ok "Installed Dependencies" + +fetch_and_deploy_gh_release "lidarr" "Lidarr/Lidarr" "prebuild" "latest" "/opt/Lidarr" "Lidarr.master*linux-core-x64.tar.gz" + +msg_info "Configuring Lidarr" +mkdir -p /var/lib/lidarr/ +chmod 775 /var/lib/lidarr/ +chmod 775 /opt/Lidarr +msg_ok "Configured Lidarr" + +msg_info "Creating Service" +cat </etc/systemd/system/lidarr.service +[Unit] +Description=Lidarr Daemon +After=syslog.target network.target + +[Service] +UMask=0002 +Type=simple +ExecStart=/opt/Lidarr/Lidarr -nobrowser -data=/var/lib/lidarr/ +TimeoutStopSec=20 +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now lidarr +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/prowlarr-install.sh b/install/prowlarr-install.sh new file mode 100644 index 00000000..3c835404 --- /dev/null +++ b/install/prowlarr-install.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://prowlarr.com/ | Github: https://github.com/Prowlarr/Prowlarr + +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 sqlite3 +msg_ok "Installed Dependencies" + +fetch_and_deploy_gh_release "prowlarr" "Prowlarr/Prowlarr" "prebuild" "latest" "/opt/Prowlarr" "Prowlarr.master*linux-core-x64.tar.gz" + +msg_info "Configuring Prowlarr" +mkdir -p /var/lib/prowlarr/ +chmod 775 /var/lib/prowlarr/ /opt/Prowlarr +msg_ok "Configured Prowlarr" + +msg_info "Creating Service" +cat </etc/systemd/system/prowlarr.service +[Unit] +Description=Prowlarr Daemon +After=syslog.target network.target + +[Service] +UMask=0002 +Type=simple +ExecStart=/opt/Prowlarr/Prowlarr -nobrowser -data=/var/lib/prowlarr/ +TimeoutStopSec=20 +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now prowlarr +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/qbittorrent-install.sh b/install/qbittorrent-install.sh new file mode 100644 index 00000000..905d08dc --- /dev/null +++ b/install/qbittorrent-install.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: tteck (tteckster) | Co-Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://www.qbittorrent.org/ | Github: https://github.com/qbittorrent/qBittorrent + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +fetch_and_deploy_gh_release "qbittorrent" "userdocs/qbittorrent-nox-static" "singlefile" "latest" "/opt/qbittorrent" "x86_64-qbittorrent-nox" + +msg_info "Setup qBittorrent-nox" +mv /opt/qbittorrent/qbittorrent /opt/qbittorrent/qbittorrent-nox +mkdir -p ~/.config/qBittorrent/ +cat <~/.config/qBittorrent/qBittorrent.conf +[LegalNotice] +Accepted=true + +[Preferences] +WebUI\Password_PBKDF2="@ByteArray(amjeuVrF3xRbgzqWQmes5A==:XK3/Ra9jUmqUc4RwzCtrhrkQIcYczBl90DJw2rT8DFVTss4nxpoRhvyxhCf87ahVE3SzD8K9lyPdpyUCfmVsUg==)" +WebUI\Port=8090 +WebUI\UseUPnP=false +WebUI\Username=admin + +[Network] +PortForwardingEnabled=false +EOF +msg_ok "Setup qBittorrent-nox" + +msg_info "Creating Service" +cat </etc/systemd/system/qbittorrent-nox.service +[Unit] +Description=qBittorrent client +After=network.target + +[Service] +Type=simple +User=root +ExecStart=/opt/qbittorrent/qbittorrent-nox +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now qbittorrent-nox +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/radarr-install.sh b/install/radarr-install.sh new file mode 100644 index 00000000..3ac0072c --- /dev/null +++ b/install/radarr-install.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://radarr.video/ | Github: https://github.com/Radarr/Radarr + +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 sqlite3 +msg_ok "Installed Dependencies" + +fetch_and_deploy_gh_release "Radarr" "Radarr/Radarr" "prebuild" "latest" "/opt/Radarr" "Radarr.master*linux-core-x64.tar.gz" + +msg_info "Configuring Radarr" +mkdir -p /var/lib/radarr/ +chmod 775 /var/lib/radarr/ /opt/Radarr/ +msg_ok "Configured Radarr" + +msg_info "Creating Service" +cat </etc/systemd/system/radarr.service +[Unit] +Description=Radarr Daemon +After=syslog.target network.target + +[Service] +UMask=0002 +Type=simple +ExecStart=/opt/Radarr/Radarr -nobrowser -data=/var/lib/radarr/ +TimeoutStopSec=20 +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now radarr +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/rdtclient-install.sh b/install/rdtclient-install.sh new file mode 100644 index 00000000..45af689b --- /dev/null +++ b/install/rdtclient-install.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/rogerfar/rdt-client + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Installing Dependencies" +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 +msg_ok "Installed Dependencies" + +fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip" + +msg_info "Setting up rdtclient" +cd /opt/rdtc +mkdir -p data/{db,downloads} +sed -i 's#/data/db/#/opt/rdtc&#g' /opt/rdtc/appsettings.json +msg_ok "Configured rdtclient" + +msg_info "Creating Service" +cat </etc/systemd/system/rdtc.service +[Unit] +Description=RdtClient Service + +[Service] +WorkingDirectory=/opt/rdtc +ExecStart=/usr/bin/dotnet RdtClient.Web.dll +SyslogIdentifier=RdtClient +User=root + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now rdtc +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/sabnzbd-install.sh b/install/sabnzbd-install.sh new file mode 100644 index 00000000..bf35f0be --- /dev/null +++ b/install/sabnzbd-install.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) | Co-Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://sabnzbd.org/ | Github: https://github.com/sabnzbd/sabnzbd + +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 \ + par2 \ + p7zip-full +msg_ok "Installed Dependencies" + +PYTHON_VERSION="3.13" setup_uv + +msg_info "Setup Unrar" +cat </etc/apt/sources.list.d/non-free.sources +Types: deb +URIs: http://deb.debian.org/debian/ +Suites: trixie +Components: non-free +Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg +EOF +$STD apt update +$STD apt install -y unrar +msg_ok "Setup Unrar" + +fetch_and_deploy_gh_release "sabnzbd-org" "sabnzbd/sabnzbd" "prebuild" "latest" "/opt/sabnzbd" "SABnzbd-*-src.tar.gz" + +msg_info "Installing SABnzbd" +$STD uv venv --clear /opt/sabnzbd/venv +$STD uv pip install -r /opt/sabnzbd/requirements.txt --python=/opt/sabnzbd/venv/bin/python +msg_ok "Installed SABnzbd" + +read -r -p "Would you like to install par2cmdline-turbo? " prompt +if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then + mv /usr/bin/par2 /usr/bin/par2.old + fetch_and_deploy_gh_release "par2cmdline-turbo" "animetosho/par2cmdline-turbo" "prebuild" "latest" "/usr/bin/" "*-linux-amd64.zip" +fi + +msg_info "Creating Service" +cat </etc/systemd/system/sabnzbd.service +[Unit] +Description=SABnzbd +After=network.target + +[Service] +WorkingDirectory=/opt/sabnzbd +ExecStart=/opt/sabnzbd/venv/bin/python SABnzbd.py -s 0.0.0.0:7777 +Restart=always +User=root + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now sabnzbd +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/seerr-install.sh b/install/seerr-install.sh new file mode 100644 index 00000000..c33a6f27 --- /dev/null +++ b/install/seerr-install.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://docs.seerr.dev/ | Github: https://github.com/seerr-team/seerr + +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 \ + python3-setuptools +msg_ok "Installed Dependencies" + +fetch_and_deploy_gh_release "seerr" "seerr-team/seerr" "tarball" +pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/seerr/package.json) +NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs + +msg_info "Installing Seerr (Patience)" +export CYPRESS_INSTALL_BINARY=0 +cd /opt/seerr +$STD pnpm install --frozen-lockfile +export NODE_OPTIONS="--max-old-space-size=3072" +$STD pnpm build +mkdir -p /etc/seerr/ +cat </etc/seerr/seerr.conf +## Seerr's default port is 5055, if you want to use both, change this. +## specify on which port to listen +PORT=5055 + +## specify on which interface to listen, by default seerr listens on all interfaces +HOST=0.0.0.0 + +## Uncomment if you want to force Node.js to resolve IPv4 before IPv6 (advanced users only) +# FORCE_IPV4_FIRST=true +EOF +msg_ok "Installed Seerr" + +msg_info "Creating Service" +cat </etc/systemd/system/seerr.service +[Unit] +Description=Seerr Service +Wants=network-online.target +After=network-online.target + +[Service] +EnvironmentFile=/etc/seerr/seerr.conf +Environment=NODE_ENV=production +Type=exec +Restart=on-failure +WorkingDirectory=/opt/seerr +ExecStart=/usr/bin/node dist/index.js + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now seerr +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/install/slskd-install.sh b/install/slskd-install.sh new file mode 100644 index 00000000..d490937d --- /dev/null +++ b/install/slskd-install.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/slskd/slskd/, https://github.com/mrusse/soularr + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +fetch_and_deploy_gh_release "Slskd" "slskd/slskd" "prebuild" "latest" "/opt/slskd" "slskd-*-linux-x64.zip" + +msg_info "Configuring Slskd" +JWT_KEY=$(openssl rand -base64 44) +SLSKD_API_KEY=$(openssl rand -base64 44) +cp /opt/slskd/config/slskd.example.yml /opt/slskd/config/slskd.yml +sed -i \ + -e '/web:/,/cidr/s/^# //' \ + -e '/https:/,/port: 5031/s/false/true/' \ + -e '/port: 5030/,/socket/s/,.*$//' \ + -e '/content_path:/,/authentication/s/false/true/' \ + -e "\|api_keys|,\|cidr|s|/opt/soularr/run.sh +#!/usr/bin/env bash + +if ps aux | grep "[s]oularr.py" >/dev/null; then + echo "Soularr is already running. Exiting..." >&2 + exit 1 +fi + +# Remove stale lock file from previous ungraceful exit +rm -f "/opt/soularr/.soularr.lock" + +source /opt/soularr/venv/bin/activate +uv run python3 -u /opt/soularr/soularr.py --config-dir /opt/soularr 2>&1 +EOF + chmod +x /opt/soularr/run.sh + deactivate + msg_ok "Installed Soularr" +fi + +msg_info "Creating Service" +cat </etc/systemd/system/slskd.service +[Unit] +Description=Slskd Service +After=network.target +Wants=network.target + +[Service] +WorkingDirectory=/opt/slskd +ExecStart=/opt/slskd/slskd --config /opt/slskd/config/slskd.yml +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + +if [[ -d /opt/soularr ]]; then + cat </etc/systemd/system/soularr.timer +[Unit] +Description=Soularr service timer +RefuseManualStart=no +RefuseManualStop=no + +[Timer] +Persistent=true +# run every 10 minutes +OnCalendar=*-*-* *:0/10:00 +Unit=soularr.service + +[Install] +WantedBy=timers.target +EOF + + cat </etc/systemd/system/soularr.service +[Unit] +Description=Soularr service +After=network.target slskd.service + +[Service] +Type=simple +WorkingDirectory=/opt/soularr +ExecStart=/bin/bash -c /opt/soularr/run.sh + +[Install] +WantedBy=multi-user.target +EOF + msg_warn "Add your Lidarr API key to Soularr in '/opt/soularr/config.ini', then run 'systemctl enable --now soularr.timer'" +fi +systemctl enable -q --now slskd +msg_ok "Created Services" + +motd_ssh +customize +cleanup_lxc diff --git a/install/sonarr-install.sh b/install/sonarr-install.sh new file mode 100644 index 00000000..4027fb2a --- /dev/null +++ b/install/sonarr-install.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 tteck +# Author: tteck (tteckster) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://sonarr.tv/ | Github: https://github.com/Sonarr/Sonarr + +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 sqlite3 +msg_ok "Installed Dependencies" + +fetch_and_deploy_gh_release "Sonarr" "Sonarr/Sonarr" "prebuild" "latest" "/opt/Sonarr" "Sonarr.main.*.linux-x64.tar.gz" +mkdir -p /var/lib/sonarr/ +chmod 775 /var/lib/sonarr/ + +msg_info "Creating Service" +cat </etc/systemd/system/sonarr.service +[Unit] +Description=Sonarr Daemon +After=syslog.target network.target + +[Service] +Type=simple +ExecStart=/opt/Sonarr/Sonarr -nobrowser -data=/var/lib/sonarr/ +TimeoutStopSec=20 +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now sonarr +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/json/arr-stack.json b/json/arr-stack.json new file mode 100644 index 00000000..fa4978d4 --- /dev/null +++ b/json/arr-stack.json @@ -0,0 +1,40 @@ +{ + "name": "ARR-Stack", + "slug": "arr-stack", + "categories": [ + 12 + ], + "date_created": "2026-01-18", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3010, + "documentation": "community-scripts/ProxmoxVED/blob/main/tools/arr-stack.sh", + "website": "https://community-scripts.org", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ProxmoxVE.webp", + "description": "Proxmox VE Helper Scripts for setting up a stack of applications for use with Prowlarr, Sonarr, Radarr, Lidarr, Seerr, and qBittorrent.", + "install_methods": [ + { + "type": "default", + "script": "tools/arr-stack.sh", + "config_path": "", + "resources": { + "cpu": 1, + "ram": 1, + "hdd": 2, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "This script will prompt you to select the applications you want to install and configure the network settings.", + "type": "info" + } + ] +} diff --git a/tools/arr-stack.sh b/tools/arr-stack.sh new file mode 100644 index 00000000..6ffe7735 --- /dev/null +++ b/tools/arr-stack.sh @@ -0,0 +1,867 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: community-scripts +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE + +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func) + +set -eEo pipefail + +color +formatting +icons + +msg_info() { echo -e "${INFO:-[i]} ${YW}${1}${CL}"; } +msg_ok() { echo -e "${CM:-[ok]} ${GN}${1}${CL}"; } +msg_warn() { echo -e "${YW}[WARN]${CL} ${1}"; } +msg_error() { echo -e "${CROSS:-[x]} ${RD}${1}${CL}"; } +msg_step() { echo -e "${BL}==>${CL} ${1}"; } + +var_container_storage="${var_container_storage:-}" +var_template_storage="${var_template_storage:-}" +var_bridge="${var_bridge:-}" +var_gateway="${var_gateway:-}" +var_cidr="${var_cidr:-24}" +var_start_ctid="${var_start_ctid:-}" +var_repo="${var_repo:-ProxmoxVED}" +SUMMARY_FILE="${SUMMARY_FILE:-/root/arr-stack-summary.txt}" + +BACKTITLE="Proxmox VE Helper Scripts — arr Stack" + +TEMP_DIR=$(mktemp -d) +trap 'rm -rf "$TEMP_DIR"' EXIT + +declare -A CTID_BY_SLUG +declare -A IP_BY_SLUG +declare -A PORT_BY_SLUG +declare -A APIKEY_BY_SLUG +declare -A USER_BY_SLUG +declare -A PASS_BY_SLUG +declare -A SCRIPT_BY_SLUG +declare -A IMPL_BY_SLUG +declare -A KIND_BY_SLUG +declare -A ARR_API_VER_BY_SLUG +declare -A NAME_BY_SLUG +declare -A CONFIG_CONTRACT_BY_SLUG + +SELECTED_ARRS="" +SELECTED_CLIENTS="" +ORDERED_SLUGS=() +INSTALLED_SLUGS=() +WIRING_RESULTS=() +WIRING_FAILURES=() + +SYNC_CATEGORIES_SONARR='[5000,5010,5020,5030,5040,5045,5050]' +SYNC_CATEGORIES_RADARR='[2000,2010,2020,2030,2040,2045,2050,2060]' +SYNC_CATEGORIES_LIDARR='[3000,3010,3020,3030,3040]' + +header_info() { + clear + cat <<"EOF" + _ _ + __ _ _ __ _ __ ___| |_ __ _ ___| | __ + / _` | '__| '__|____ / __| __/ _` |/ __| |/ / + | (_| | | | | |_____|\__ \ || (_| | (__| < + \__,_|_| |_| |___/\__\__,_|\___|_|\_\ + +EOF +} + +check_root() { + if [[ $EUID -ne 0 ]]; then + msg_error "Run this script as root." + exit 1 + fi +} + +check_pve_tools() { + local missing=() + for cmd in pct pvesh pvesm; do + command -v "$cmd" >/dev/null 2>&1 || missing+=("$cmd") + done + if (( ${#missing[@]} > 0 )); then + msg_error "Missing Proxmox VE tools: ${missing[*]}. Run this on a PVE node." + exit 1 + fi +} + +wait_for_port() { + local ip=$1 port=$2 timeout=${3:-60} elapsed=0 + while ! (echo > "/dev/tcp/${ip}/${port}") >/dev/null 2>&1; do + sleep 2 + elapsed=$((elapsed + 2)) + if (( elapsed >= timeout )); then return 1; fi + done + return 0 +} + +is_valid_ipv4() { + local ip=$1 + [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$ ]] || return 1 + local a=${BASH_REMATCH[1]} b=${BASH_REMATCH[2]} c=${BASH_REMATCH[3]} d=${BASH_REMATCH[4]} + (( a <= 255 && b <= 255 && c <= 255 && d <= 255 )) || return 1 + return 0 +} + +seed_catalog() { + while IFS='|' read -r slug script port impl apiver kind name contract; do + [[ -z "$slug" ]] && continue + SCRIPT_BY_SLUG[$slug]="$script" + PORT_BY_SLUG[$slug]="$port" + IMPL_BY_SLUG[$slug]="$impl" + ARR_API_VER_BY_SLUG[$slug]="$apiver" + KIND_BY_SLUG[$slug]="$kind" + NAME_BY_SLUG[$slug]="$name" + CONFIG_CONTRACT_BY_SLUG[$slug]="$contract" + done <<'EOF' +prowlarr|prowlarr.sh|9696||v1|indexer|Prowlarr| +sonarr|sonarr.sh|8989|Sonarr|v3|arr|Sonarr|SonarrSettings +radarr|radarr.sh|7878|Radarr|v3|arr|Radarr|RadarrSettings +lidarr|lidarr.sh|8686|Lidarr|v1|arr|Lidarr|LidarrSettings +seerr|seerr.sh|5055||-|requests|Seerr| +qbittorrent|qbittorrent.sh|8090|QBittorrent|-|client|qBittorrent|QBittorrentSettings +sabnzbd|sabnzbd.sh|7777|Sabnzbd|-|client|SABnzbd|SabnzbdSettings +EOF +} + +pick_storage() { + if [[ -n "$var_container_storage" ]]; then + msg_info "Container storage (from env): ${var_container_storage}" + else + local options=() row name type + while IFS= read -r row; do + name=$(awk '{print $1}' <<<"$row") + type=$(awk '{print $2}' <<<"$row") + [[ -z "$name" ]] && continue + options+=("$name" "$type") + done < <(pvesm status -content rootdir 2>/dev/null | awk 'NR>1') + + if (( ${#options[@]} == 0 )); then + msg_error "No PVE storage with content 'rootdir' available." + exit 1 + fi + + if (( ${#options[@]} == 2 )); then + var_container_storage="${options[0]}" + msg_info "Container storage (only option): ${var_container_storage}" + else + var_container_storage=$(whiptail --backtitle "$BACKTITLE" \ + --title "Container Storage" \ + --menu "Pick a PVE storage for the container rootfs:" 20 70 10 \ + "${options[@]}" 3>&1 1>&2 2>&3) || exit 0 + fi + fi + + if [[ -z "$var_template_storage" ]]; then + var_template_storage=$(pvesm status -content vztmpl 2>/dev/null \ + | awk 'NR>1 && $1=="local" {print $1; exit}') + [[ -z "$var_template_storage" ]] && var_template_storage=$(pvesm status -content vztmpl 2>/dev/null \ + | awk 'NR>1 {print $1; exit}') + fi + [[ -n "$var_template_storage" ]] && msg_info "Template storage: ${var_template_storage}" +} + +pick_network_defaults() { + if [[ -z "$var_bridge" ]]; then + local options=() b + while IFS= read -r b; do + [[ -n "$b" ]] && options+=("$b" "") + done < <(awk '/^iface vmbr/ {print $2}' /etc/network/interfaces 2>/dev/null) + + if (( ${#options[@]} == 0 )); then + options=("vmbr0" "") + fi + + var_bridge=$(whiptail --backtitle "$BACKTITLE" \ + --title "Network Bridge" \ + --menu "Pick the Linux bridge for all containers:" 15 60 6 \ + "${options[@]}" 3>&1 1>&2 2>&3) || exit 0 + fi + + while [[ -z "$var_gateway" ]] || ! is_valid_ipv4 "$var_gateway"; do + var_gateway=$(whiptail --backtitle "$BACKTITLE" \ + --title "Gateway" \ + --inputbox "IPv4 gateway for the container subnet:" 10 60 \ + "${var_gateway:-}" 3>&1 1>&2 2>&3) || exit 0 + if ! is_valid_ipv4 "$var_gateway"; then + whiptail --backtitle "$BACKTITLE" --title "Invalid" \ + --msgbox "Not a valid IPv4 address: ${var_gateway}" 8 60 + var_gateway="" + fi + done + + while true; do + var_cidr=$(whiptail --backtitle "$BACKTITLE" \ + --title "CIDR Mask" \ + --inputbox "Network mask (1-32, e.g. 24):" 10 60 \ + "${var_cidr:-24}" 3>&1 1>&2 2>&3) || exit 0 + if [[ "$var_cidr" =~ ^[0-9]+$ ]] && (( var_cidr >= 1 && var_cidr <= 32 )); then + break + fi + whiptail --backtitle "$BACKTITLE" --title "Invalid" \ + --msgbox "CIDR must be an integer between 1 and 32." 8 60 + done + + msg_info "Bridge ${var_bridge} | gateway ${var_gateway} | mask /${var_cidr}" +} + +pick_apps() { + while true; do + local choice + choice=$(whiptail --backtitle "$BACKTITLE" \ + --title "Pick *arr Apps" \ + --checklist "Prowlarr is always installed. Pick additional apps:" 16 70 6 \ + "sonarr" "Sonarr (TV)" ON \ + "radarr" "Radarr (Movies)" ON \ + "lidarr" "Lidarr (Music)" OFF \ + "seerr" "Seerr (Requests)" OFF \ + 3>&1 1>&2 2>&3) || exit 0 + + SELECTED_ARRS=$(echo "$choice" | tr -d '"') + + if [[ -z "$SELECTED_ARRS" ]]; then + if whiptail --backtitle "$BACKTITLE" --title "Confirm" \ + --yesno "You picked no *arr apps. Only Prowlarr will be installed and there will be nothing to wire. Continue anyway?" 10 70; then + return + fi + continue + fi + return + done +} + +pick_clients() { + local choice + choice=$(whiptail --backtitle "$BACKTITLE" \ + --title "Pick Download Clients" \ + --checklist "Optional download clients to install + wire:" 14 70 4 \ + "qbittorrent" "qBittorrent (Torrents)" ON \ + "sabnzbd" "SABnzbd (Usenet)" OFF \ + 3>&1 1>&2 2>&3) || exit 0 + + SELECTED_CLIENTS=$(echo "$choice" | tr -d '"') +} + +compute_ordered_slugs() { + ORDERED_SLUGS=("prowlarr") + local s + for s in $SELECTED_ARRS; do + [[ "$s" == "seerr" ]] && continue + ORDERED_SLUGS+=("$s") + done + for s in $SELECTED_CLIENTS; do + ORDERED_SLUGS+=("$s") + done + for s in $SELECTED_ARRS; do + [[ "$s" == "seerr" ]] && ORDERED_SLUGS+=("seerr") + done +} + +pick_ip_mode_and_ips() { + local mode + mode=$(whiptail --backtitle "$BACKTITLE" \ + --title "IP Entry Mode" \ + --menu "How would you like to enter IP addresses?" 14 70 2 \ + "list" "Enter all IPs at once (space- or comma-separated)" \ + "one_by_one" "Prompt per container" \ + 3>&1 1>&2 2>&3) || exit 0 + + if [[ "$mode" == "list" ]]; then + _collect_ips_list_mode + else + _collect_ips_one_by_one + fi +} + +_collect_ips_list_mode() { + local expected_n=${#ORDERED_SLUGS[@]} + local hint="" s + for s in "${ORDERED_SLUGS[@]}"; do hint+=" ${s}"$'\n'; done + + while true; do + local raw + raw=$(whiptail --backtitle "$BACKTITLE" \ + --title "Enter ${expected_n} IPv4 addresses" \ + --inputbox "Enter ${expected_n} IPs separated by spaces or commas, in this order:"$'\n\n'"${hint}" \ + 22 78 "" 3>&1 1>&2 2>&3) || exit 0 + + local normalized="${raw//,/ }" + local -a ips=() + # shellcheck disable=SC2206 + ips=( $normalized ) + + if (( ${#ips[@]} != expected_n )); then + whiptail --backtitle "$BACKTITLE" --title "Wrong count" \ + --msgbox "Expected ${expected_n} IPs, got ${#ips[@]}. Please re-enter." 8 60 + continue + fi + + local ok=1 i + for i in "${!ips[@]}"; do + if ! is_valid_ipv4 "${ips[$i]}"; then + whiptail --backtitle "$BACKTITLE" --title "Invalid" \ + --msgbox "Entry $((i+1)) is not a valid IPv4: ${ips[$i]}" 8 60 + ok=0; break + fi + if [[ "${ips[$i]}" == "$var_gateway" ]]; then + whiptail --backtitle "$BACKTITLE" --title "Invalid" \ + --msgbox "Entry $((i+1)) collides with the gateway: ${ips[$i]}" 8 60 + ok=0; break + fi + done + (( ok == 0 )) && continue + + local dup + dup=$(printf '%s\n' "${ips[@]}" | sort | uniq -d | head -n1) + if [[ -n "$dup" ]]; then + whiptail --backtitle "$BACKTITLE" --title "Duplicate IP" \ + --msgbox "IP appears more than once: ${dup}" 8 60 + continue + fi + + for i in "${!ORDERED_SLUGS[@]}"; do + IP_BY_SLUG[${ORDERED_SLUGS[$i]}]=${ips[$i]} + done + return + done +} + +_collect_ips_one_by_one() { + local slug ip running="" + for slug in "${ORDERED_SLUGS[@]}"; do + while true; do + ip=$(whiptail --backtitle "$BACKTITLE" \ + --title "IP for ${slug}" \ + --inputbox "Enter IPv4 for ${slug}.${running:+$'\n\nAlready assigned:'}${running}" \ + 16 60 "" 3>&1 1>&2 2>&3) || exit 0 + + if ! is_valid_ipv4 "$ip"; then + whiptail --backtitle "$BACKTITLE" --title "Invalid" \ + --msgbox "Not a valid IPv4: ${ip}" 8 60 + continue + fi + if [[ "$ip" == "$var_gateway" ]]; then + whiptail --backtitle "$BACKTITLE" --title "Invalid" \ + --msgbox "Collides with the gateway: ${ip}" 8 60 + continue + fi + local dup=0 other + for other in "${IP_BY_SLUG[@]}"; do + [[ "$other" == "$ip" ]] && { dup=1; break; } + done + if (( dup )); then + whiptail --backtitle "$BACKTITLE" --title "Duplicate" \ + --msgbox "Already used by another container: ${ip}" 8 60 + continue + fi + + IP_BY_SLUG[$slug]=$ip + running+=$'\n '"${slug} -> ${ip}" + break + done + done +} + +pick_start_ctid() { + local default_start + if [[ -n "$var_start_ctid" ]]; then + default_start="$var_start_ctid" + else + default_start=$(pvesh get /cluster/nextid 2>/dev/null || echo "100") + fi + + local start + start=$(whiptail --backtitle "$BACKTITLE" \ + --title "Starting CTID" \ + --inputbox "Starting Container ID (in-use IDs are skipped):" 10 60 \ + "$default_start" 3>&1 1>&2 2>&3) || exit 0 + + if ! [[ "$start" =~ ^[0-9]+$ ]]; then + msg_error "Invalid CTID: $start" + exit 1 + fi + + local id=$start s + for s in "${ORDERED_SLUGS[@]}"; do + while pct status "$id" >/dev/null 2>&1; do + id=$((id + 1)) + (( id > 999999 )) && { msg_error "Ran out of CTID space."; exit 1; } + done + CTID_BY_SLUG[$s]=$id + id=$((id + 1)) + done +} + +confirm_summary() { + local lines="" s + for s in "${ORDERED_SLUGS[@]}"; do + lines+=" $(printf '%-12s ctid=%-5s ip=%-16s port=%s' \ + "$s" "${CTID_BY_SLUG[$s]}" "${IP_BY_SLUG[$s]}" "${PORT_BY_SLUG[$s]}")"$'\n' + done + + local body="About to create these containers and wire them together:"$'\n\n'"${lines}"$'\n'"Storage: ${var_container_storage} | Bridge: ${var_bridge} | Gateway: ${var_gateway} | Mask: /${var_cidr}" + + whiptail --backtitle "$BACKTITLE" --title "Confirm" \ + --yesno "$body" 22 78 || { msg_warn "User cancelled."; exit 0; } +} + +orphan_report() { + if (( ${#INSTALLED_SLUGS[@]} == 0 )); then return; fi + msg_error "Containers already created (to clean up, run):" + local s + for s in "${INSTALLED_SLUGS[@]}"; do + echo " pct stop ${CTID_BY_SLUG[$s]} && pct destroy ${CTID_BY_SLUG[$s]} # ${s}" + done +} + +install_loop() { + local total=${#ORDERED_SLUGS[@]} idx=0 + local s script_file ip ctid port + + for s in "${ORDERED_SLUGS[@]}"; do + idx=$((idx + 1)) + ip="${IP_BY_SLUG[$s]}" + ctid="${CTID_BY_SLUG[$s]}" + port="${PORT_BY_SLUG[$s]}" + script_file="$TEMP_DIR/${s}.sh" + + msg_step "[${idx}/${total}] Downloading ct/${s}.sh" + curl -fsSL \ + "https://raw.githubusercontent.com/community-scripts/${var_repo}/main/ct/${s}.sh" \ + -o "$script_file" + + if [[ ! -s "$script_file" ]]; then + msg_error "Empty/failed download for ${s}" + orphan_report + exit 1 + fi + + msg_step "[${idx}/${total}] Installing ${s} -> ctid=${ctid} ip=${ip}/${var_cidr}" + if env \ + MODE=generated mode=generated PHS_SILENT=1 \ + var_ctid="$ctid" \ + var_hostname="$s" \ + var_brg="$var_bridge" \ + var_net="${ip}/${var_cidr}" \ + var_gateway="$var_gateway" \ + var_container_storage="$var_container_storage" \ + var_template_storage="$var_template_storage" \ + bash "$script_file"; then + INSTALLED_SLUGS+=("$s") + msg_ok "Installed ${s}" + else + msg_error "Install failed for ${s} (ctid=${ctid})." + orphan_report + exit 1 + fi + + if [[ "${KIND_BY_SLUG[$s]}" == "arr" || "${KIND_BY_SLUG[$s]}" == "indexer" ]]; then + msg_info "Waiting for ${s} to listen on ${port}..." + if ! wait_for_port "$ip" "$port" 90; then + msg_warn "${s} did not open ${port} within 90s; will retry during key extraction." + fi + fi + done +} + +extract_arr_key() { + local slug=$1 ctid=$2 ip=$3 port=$4 + local config_dir="/var/lib/${slug}/config.xml" + + msg_info "Waiting for ${slug} on ${ip}:${port}..." + wait_for_port "$ip" "$port" 240 || { msg_error "${slug} never opened ${port}"; return 1; } + + local i + for ((i=0; i<60; i++)); do + if pct exec "$ctid" -- test -f "$config_dir" 2>/dev/null; then break; fi + sleep 2 + done + + local key + key=$(pct exec "$ctid" -- sed -n 's:.*\([^<]*\).*:\1:p' "$config_dir" 2>/dev/null | head -n1 || true) + if [[ -z "$key" ]]; then + msg_error "Failed to extract API key for ${slug} (config: ${config_dir})" + return 1 + fi + APIKEY_BY_SLUG[$slug]="$key" + msg_ok "${slug} apikey extracted (${key:0:6}…)" +} + +extract_sabnzbd_key() { + local ctid=$1 ip=$2 + + msg_info "Waiting for sabnzbd on ${ip}:7777..." + wait_for_port "$ip" 7777 240 || { msg_warn "sabnzbd never opened 7777"; return 1; } + + local ini="" candidate + for candidate in /opt/sabnzbd/sabnzbd.ini /root/.sabnzbd/sabnzbd.ini /etc/sabnzbd/sabnzbd.ini; do + if pct exec "$ctid" -- test -f "$candidate" 2>/dev/null; then + ini="$candidate"; break + fi + done + if [[ -z "$ini" ]]; then + msg_warn "Could not locate sabnzbd.ini inside ctid ${ctid}; SABnzbd will need manual setup." + return 1 + fi + + local key="" i + for ((i=0; i<60; i++)); do + key=$(pct exec "$ctid" -- awk -F' *= *' '/^api_key/ {print $2; exit}' "$ini" 2>/dev/null || true) + [[ -n "$key" ]] && break + sleep 2 + done + + if [[ -z "$key" ]]; then + msg_warn "sabnzbd api_key not yet written. Open the web wizard once at http://${ip}:7777 and rerun wiring." + return 1 + fi + APIKEY_BY_SLUG[sabnzbd]="$key" + msg_ok "sabnzbd apikey extracted (${key:0:6}…)" +} + +wait_and_extract_keys() { + msg_step "Extracting credentials & API keys" + local s ctid ip port tmp + for s in "${ORDERED_SLUGS[@]}"; do + ctid="${CTID_BY_SLUG[$s]}" + ip="${IP_BY_SLUG[$s]}" + port="${PORT_BY_SLUG[$s]}" + case "${KIND_BY_SLUG[$s]}" in + indexer|arr) + extract_arr_key "$s" "$ctid" "$ip" "$port" || true + ;; + client) + if [[ "$s" == "qbittorrent" ]]; then + USER_BY_SLUG[qbittorrent]="admin" + PASS_BY_SLUG[qbittorrent]="adminadmin" + tmp=$(pct exec "$ctid" -- bash -c "journalctl -u qbittorrent-nox --no-pager 2>/dev/null | grep -i 'temporary password' | tail -n1" 2>/dev/null || true) + if [[ -n "$tmp" ]]; then + msg_warn "qBittorrent journalctl mentioned a temporary password — see summary." + PASS_BY_SLUG[qbittorrent]="" + fi + elif [[ "$s" == "sabnzbd" ]]; then + extract_sabnzbd_key "$ctid" "$ip" || true + fi + ;; + requests) + msg_warn "Seerr requires the web first-run wizard. URL + keys will be in the summary." + ;; + esac + done +} + +record_wiring() { WIRING_RESULTS+=("$1"); } +record_failure() { WIRING_FAILURES+=("$1"); } + +api_post() { + local url=$1 apikey=$2 payload=$3 label=$4 + local resp status="" + resp=$(curl -fsS --max-time 30 --retry 2 \ + -H "X-Api-Key: $apikey" \ + -H "Content-Type: application/json" \ + -X POST "$url" -d "$payload" \ + -w '\n__HTTP__%{http_code}' 2>&1) || status="curl_fail" + + local code="" + if [[ "$resp" =~ __HTTP__([0-9]+)$ ]]; then + code="${BASH_REMATCH[1]}" + fi + + if [[ "$status" == "curl_fail" || -z "$code" || "$code" -ge 400 ]]; then + record_failure "${label} FAIL (http ${code:-?})" + msg_warn "${label} failed (http ${code:-?})" + return 1 + fi + record_wiring "${label} OK" + msg_ok "${label}" +} + +probe_lidarr_api_version() { + if [[ -z "${APIKEY_BY_SLUG[lidarr]:-}" ]]; then return; fi + local ip="${IP_BY_SLUG[lidarr]}" key="${APIKEY_BY_SLUG[lidarr]}" + if curl -fsS --max-time 10 -H "X-Api-Key: $key" \ + "http://${ip}:8686/api/v3/system/status" >/dev/null 2>&1; then + ARR_API_VER_BY_SLUG[lidarr]="v3" + msg_info "Lidarr supports /api/v3 — using v3 for wiring." + fi +} + +wire_arrs_into_prowlarr() { + local prowlarr_ip="${IP_BY_SLUG[prowlarr]}" + local prowlarr_key="${APIKEY_BY_SLUG[prowlarr]:-}" + if [[ -z "$prowlarr_key" ]]; then + msg_warn "Skipping Prowlarr wiring — no Prowlarr API key." + return + fi + + local s sync_cats payload + for s in $SELECTED_ARRS; do + [[ "$s" == "seerr" ]] && continue + local key="${APIKEY_BY_SLUG[$s]:-}" + if [[ -z "$key" ]]; then + record_failure "Prowlarr -> ${NAME_BY_SLUG[$s]} FAIL (no apikey)" + continue + fi + + case "$s" in + sonarr) sync_cats="$SYNC_CATEGORIES_SONARR" ;; + radarr) sync_cats="$SYNC_CATEGORIES_RADARR" ;; + lidarr) sync_cats="$SYNC_CATEGORIES_LIDARR" ;; + *) sync_cats='[]' ;; + esac + + payload=$(jq -n \ + --arg name "${NAME_BY_SLUG[$s]}" \ + --arg impl "${IMPL_BY_SLUG[$s]}" \ + --arg contract "${CONFIG_CONTRACT_BY_SLUG[$s]}" \ + --arg prowlarr_url "http://${prowlarr_ip}:9696" \ + --arg base_url "http://${IP_BY_SLUG[$s]}:${PORT_BY_SLUG[$s]}" \ + --arg apikey "$key" \ + --argjson sync_cats "$sync_cats" \ + '{ + name: $name, + syncLevel: "fullSync", + implementation: $impl, + implementationName: $impl, + configContract: $contract, + tags: [], + fields: [ + { name: "prowlarrUrl", value: $prowlarr_url }, + { name: "baseUrl", value: $base_url }, + { name: "apiKey", value: $apikey }, + { name: "syncCategories", value: $sync_cats } + ] + }') + + api_post "http://${prowlarr_ip}:9696/api/v1/applications" \ + "$prowlarr_key" "$payload" \ + "Prowlarr -> ${NAME_BY_SLUG[$s]}" || true + done +} + +wire_clients_into_arrs() { + local arr client arr_key arr_ip arr_port api_ver category_field category_name payload url sab_key + + for arr in $SELECTED_ARRS; do + [[ "$arr" == "seerr" ]] && continue + arr_key="${APIKEY_BY_SLUG[$arr]:-}" + if [[ -z "$arr_key" ]]; then + msg_warn "Skipping download-client wiring for ${arr} — no API key." + continue + fi + arr_ip="${IP_BY_SLUG[$arr]}" + arr_port="${PORT_BY_SLUG[$arr]}" + api_ver="${ARR_API_VER_BY_SLUG[$arr]}" + + case "$arr" in + sonarr) category_field="tvCategory"; category_name="tv-sonarr" ;; + radarr) category_field="movieCategory"; category_name="radarr" ;; + lidarr) category_field="musicCategory"; category_name="lidarr" ;; + esac + + for client in $SELECTED_CLIENTS; do + url="http://${arr_ip}:${arr_port}/api/${api_ver}/downloadclient" + + if [[ "$client" == "qbittorrent" ]]; then + payload=$(jq -n \ + --arg host "${IP_BY_SLUG[qbittorrent]}" \ + --argjson port 8090 \ + --arg user "${USER_BY_SLUG[qbittorrent]}" \ + --arg pass "${PASS_BY_SLUG[qbittorrent]}" \ + --arg category_field "$category_field" \ + --arg category_name "$category_name" \ + '{ + enable: true, protocol: "torrent", priority: 1, + name: "qBittorrent", + implementation: "QBittorrent", + implementationName: "qBittorrent", + configContract: "QBittorrentSettings", + tags: [], + fields: [ + { name: "host", value: $host }, + { name: "port", value: $port }, + { name: "useSsl", value: false }, + { name: "username", value: $user }, + { name: "password", value: $pass }, + { name: $category_field, value: $category_name } + ] + }') + api_post "$url" "$arr_key" "$payload" \ + "${NAME_BY_SLUG[$arr]} -> qBittorrent" || true + + elif [[ "$client" == "sabnzbd" ]]; then + sab_key="${APIKEY_BY_SLUG[sabnzbd]:-}" + if [[ -z "$sab_key" ]]; then + record_failure "${NAME_BY_SLUG[$arr]} -> SABnzbd FAIL (no sab apikey)" + continue + fi + payload=$(jq -n \ + --arg host "${IP_BY_SLUG[sabnzbd]}" \ + --argjson port 7777 \ + --arg apikey "$sab_key" \ + --arg category_field "$category_field" \ + --arg category_name "$category_name" \ + '{ + enable: true, protocol: "usenet", priority: 1, + name: "SABnzbd", + implementation: "Sabnzbd", + implementationName: "SABnzbd", + configContract: "SabnzbdSettings", + tags: [], + fields: [ + { name: "host", value: $host }, + { name: "port", value: $port }, + { name: "apiKey", value: $apikey }, + { name: "useSsl", value: false }, + { name: $category_field, value: $category_name } + ] + }') + api_post "$url" "$arr_key" "$payload" \ + "${NAME_BY_SLUG[$arr]} -> SABnzbd" || true + fi + done + done +} + +wire_apis() { + msg_step "Wiring apps together via HTTP APIs" + probe_lidarr_api_version + wire_arrs_into_prowlarr + wire_clients_into_arrs + + if [[ " $SELECTED_ARRS " == *" seerr "* ]]; then + record_wiring "Seerr -> (manual via web wizard)" + msg_warn "Seerr can't be wired headlessly. URLs and keys are in the summary." + fi +} + +write_summary() { + msg_step "Writing summary" + local now host + now=$(date '+%Y-%m-%d %H:%M:%S %Z') + host=$(hostname) + + local -a lines=() + lines+=( "============================================================" ) + lines+=( " arr Stack — Provisioning Summary" ) + lines+=( " Generated: ${now}" ) + lines+=( " Host: ${host}" ) + lines+=( "============================================================" ) + lines+=( "" ) + lines+=( "[Shared settings]" ) + lines+=( " Bridge: ${var_bridge}" ) + lines+=( " Gateway: ${var_gateway}" ) + lines+=( " CIDR: /${var_cidr}" ) + lines+=( " CT storage: ${var_container_storage}" ) + lines+=( " Template: ${var_template_storage}" ) + lines+=( "" ) + + lines+=( "[Containers]" ) + local s + for s in "${ORDERED_SLUGS[@]}"; do + lines+=( "$(printf ' %-12s ctid=%-5s ip=%-16s url=http://%s:%s' \ + "$s" "${CTID_BY_SLUG[$s]}" "${IP_BY_SLUG[$s]}" "${IP_BY_SLUG[$s]}" "${PORT_BY_SLUG[$s]}")" ) + done + lines+=( "" ) + + lines+=( "[Credentials & API keys]" ) + for s in "${ORDERED_SLUGS[@]}"; do + case "${KIND_BY_SLUG[$s]}" in + indexer|arr) + if [[ -n "${APIKEY_BY_SLUG[$s]:-}" ]]; then + lines+=( "$(printf ' %-12s apikey: %s' "$s" "${APIKEY_BY_SLUG[$s]}")" ) + else + lines+=( "$(printf ' %-12s apikey: (not extracted)' "$s")" ) + fi + ;; + client) + if [[ "$s" == "qbittorrent" ]]; then + lines+=( "$(printf ' %-12s user: %s' "$s" "${USER_BY_SLUG[qbittorrent]:-admin}")" ) + lines+=( "$(printf ' %-12s pass: %s (CHANGE THIS!)' "" "${PASS_BY_SLUG[qbittorrent]:-adminadmin}")" ) + elif [[ "$s" == "sabnzbd" ]]; then + if [[ -n "${APIKEY_BY_SLUG[sabnzbd]:-}" ]]; then + lines+=( "$(printf ' %-12s apikey: %s' "$s" "${APIKEY_BY_SLUG[sabnzbd]}")" ) + else + lines+=( "$(printf ' %-12s apikey: (open web wizard at http://%s:7777 once)' "$s" "${IP_BY_SLUG[sabnzbd]}")" ) + fi + fi + ;; + requests) + lines+=( "$(printf ' %-12s (set during first-run web wizard)' "$s")" ) + ;; + esac + done + lines+=( "" ) + + lines+=( "[Wired automatically]" ) + if (( ${#WIRING_RESULTS[@]} == 0 )); then + lines+=( " (nothing)" ) + else + local w + for w in "${WIRING_RESULTS[@]}"; do lines+=( " ${w}" ); done + fi + lines+=( "" ) + + lines+=( "[Wiring failures]" ) + if (( ${#WIRING_FAILURES[@]} == 0 )); then + lines+=( " (none)" ) + else + local f + for f in "${WIRING_FAILURES[@]}"; do lines+=( " ${f}" ); done + fi + lines+=( "" ) + + lines+=( "[Manual steps still required]" ) + lines+=( " 1. Prowlarr: add indexers (none ship by default)." ) + lines+=( " 2. Sonarr/Radarr/Lidarr: set root folders and at least one quality profile." ) + if [[ " $SELECTED_CLIENTS " == *" qbittorrent "* ]]; then + lines+=( " 3. qBittorrent: change admin password (default admin/adminadmin)." ) + fi + if [[ " $SELECTED_ARRS " == *" seerr "* ]]; then + lines+=( " 4. Seerr: open http://${IP_BY_SLUG[seerr]}:5055, complete the first-run wizard, then add:" ) + for s in $SELECTED_ARRS; do + [[ "$s" == "seerr" ]] && continue + [[ "$s" == "lidarr" ]] && continue + lines+=( " ${NAME_BY_SLUG[$s]} at http://${IP_BY_SLUG[$s]}:${PORT_BY_SLUG[$s]} apikey: ${APIKEY_BY_SLUG[$s]:-}" ) + done + fi + lines+=( "" ) + lines+=( "Summary written to ${SUMMARY_FILE} (chmod 600)." ) + lines+=( "============================================================" ) + + local body + body=$(printf '%s\n' "${lines[@]}") + + echo + echo "$body" + + ( umask 077; printf '%s\n' "$body" > "$SUMMARY_FILE" ) + chmod 600 "$SUMMARY_FILE" 2>/dev/null || true + + msg_ok "Wrote ${SUMMARY_FILE}" +} + +main() { + header_info + check_root + check_pve_tools + ensure_dependencies curl whiptail jq + seed_catalog + pick_storage + pick_network_defaults + pick_apps + pick_clients + compute_ordered_slugs + pick_ip_mode_and_ips + pick_start_ctid + confirm_summary + install_loop + wait_and_extract_keys + wire_apis + write_summary + msg_ok "arr-stack provisioning finished." +} + +main "$@" From 4b9fd5722045ab2b8fac50cc4a085eacfdb8b472 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 21 May 2026 12:15:42 +0000 Subject: [PATCH 16/37] chore: update app headers [skip ci] --- ct/headers/flaresolverr | 6 ++++++ ct/headers/gluetun | 6 ++++++ ct/headers/lidarr | 6 ++++++ ct/headers/prowlarr | 6 ++++++ ct/headers/qbittorrent | 6 ++++++ ct/headers/radarr | 6 ++++++ ct/headers/rdtclient | 6 ++++++ ct/headers/sabnzbd | 6 ++++++ ct/headers/seerr | 6 ++++++ ct/headers/slskd | 6 ++++++ ct/headers/sonarr | 6 ++++++ 11 files changed, 66 insertions(+) create mode 100644 ct/headers/flaresolverr create mode 100644 ct/headers/gluetun create mode 100644 ct/headers/lidarr create mode 100644 ct/headers/prowlarr create mode 100644 ct/headers/qbittorrent create mode 100644 ct/headers/radarr create mode 100644 ct/headers/rdtclient create mode 100644 ct/headers/sabnzbd create mode 100644 ct/headers/seerr create mode 100644 ct/headers/slskd create mode 100644 ct/headers/sonarr diff --git a/ct/headers/flaresolverr b/ct/headers/flaresolverr new file mode 100644 index 00000000..a710dd62 --- /dev/null +++ b/ct/headers/flaresolverr @@ -0,0 +1,6 @@ + ________ _____ __ + / ____/ /___ _________ / ___/____ / / _____ __________ + / /_ / / __ `/ ___/ _ \\__ \/ __ \/ / | / / _ \/ ___/ ___/ + / __/ / / /_/ / / / __/__/ / /_/ / /| |/ / __/ / / / +/_/ /_/\__,_/_/ \___/____/\____/_/ |___/\___/_/ /_/ + diff --git a/ct/headers/gluetun b/ct/headers/gluetun new file mode 100644 index 00000000..af2775ca --- /dev/null +++ b/ct/headers/gluetun @@ -0,0 +1,6 @@ + ________ __ + / ____/ /_ _____ / /___ ______ + / / __/ / / / / _ \/ __/ / / / __ \ +/ /_/ / / /_/ / __/ /_/ /_/ / / / / +\____/_/\__,_/\___/\__/\__,_/_/ /_/ + diff --git a/ct/headers/lidarr b/ct/headers/lidarr new file mode 100644 index 00000000..92eb4c08 --- /dev/null +++ b/ct/headers/lidarr @@ -0,0 +1,6 @@ + __ _ __ + / / (_)___/ /___ ___________ + / / / / __ / __ `/ ___/ ___/ + / /___/ / /_/ / /_/ / / / / +/_____/_/\__,_/\__,_/_/ /_/ + diff --git a/ct/headers/prowlarr b/ct/headers/prowlarr new file mode 100644 index 00000000..10255b7a --- /dev/null +++ b/ct/headers/prowlarr @@ -0,0 +1,6 @@ + ____ __ + / __ \_________ _ __/ /___ ___________ + / /_/ / ___/ __ \ | /| / / / __ `/ ___/ ___/ + / ____/ / / /_/ / |/ |/ / / /_/ / / / / +/_/ /_/ \____/|__/|__/_/\__,_/_/ /_/ + diff --git a/ct/headers/qbittorrent b/ct/headers/qbittorrent new file mode 100644 index 00000000..c00ae7c3 --- /dev/null +++ b/ct/headers/qbittorrent @@ -0,0 +1,6 @@ + ____ _ __ __ __ + ____ _/ __ )(_) /_/ /_____ _____________ ____ / /_ + / __ `/ __ / / __/ __/ __ \/ ___/ ___/ _ \/ __ \/ __/ +/ /_/ / /_/ / / /_/ /_/ /_/ / / / / / __/ / / / /_ +\__, /_____/_/\__/\__/\____/_/ /_/ \___/_/ /_/\__/ + /_/ diff --git a/ct/headers/radarr b/ct/headers/radarr new file mode 100644 index 00000000..83d2fb6d --- /dev/null +++ b/ct/headers/radarr @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /___ ___________ + / /_/ / __ `/ __ / __ `/ ___/ ___/ + / _, _/ /_/ / /_/ / /_/ / / / / +/_/ |_|\__,_/\__,_/\__,_/_/ /_/ + diff --git a/ct/headers/rdtclient b/ct/headers/rdtclient new file mode 100644 index 00000000..62db3f77 --- /dev/null +++ b/ct/headers/rdtclient @@ -0,0 +1,6 @@ + ____ ____ _______________ __ + / __ \/ __ \/_ __/ ____/ (_)__ ____ / /_ + / /_/ / / / / / / / / / / / _ \/ __ \/ __/ + / _, _/ /_/ / / / / /___/ / / __/ / / / /_ +/_/ |_/_____/ /_/ \____/_/_/\___/_/ /_/\__/ + diff --git a/ct/headers/sabnzbd b/ct/headers/sabnzbd new file mode 100644 index 00000000..bfe5aef0 --- /dev/null +++ b/ct/headers/sabnzbd @@ -0,0 +1,6 @@ + _____ ___ ____ __ __ + / ___// | / __ )____ ____ / /_ ____/ / + \__ \/ /| | / __ / __ \/_ / / __ \/ __ / + ___/ / ___ |/ /_/ / / / / / /_/ /_/ / /_/ / +/____/_/ |_/_____/_/ /_/ /___/_.___/\__,_/ + diff --git a/ct/headers/seerr b/ct/headers/seerr new file mode 100644 index 00000000..c934cee4 --- /dev/null +++ b/ct/headers/seerr @@ -0,0 +1,6 @@ + _____ + / ___/___ ___ __________ + \__ \/ _ \/ _ \/ ___/ ___/ + ___/ / __/ __/ / / / +/____/\___/\___/_/ /_/ + diff --git a/ct/headers/slskd b/ct/headers/slskd new file mode 100644 index 00000000..6ebb289e --- /dev/null +++ b/ct/headers/slskd @@ -0,0 +1,6 @@ + __ __ __ + _____/ /____/ /______/ / + / ___/ / ___/ //_/ __ / + (__ ) (__ ) ,< / /_/ / +/____/_/____/_/|_|\__,_/ + diff --git a/ct/headers/sonarr b/ct/headers/sonarr new file mode 100644 index 00000000..de022f7a --- /dev/null +++ b/ct/headers/sonarr @@ -0,0 +1,6 @@ + _____ + / ___/____ ____ ____ ___________ + \__ \/ __ \/ __ \/ __ `/ ___/ ___/ + ___/ / /_/ / / / / /_/ / / / / +/____/\____/_/ /_/\__,_/_/ /_/ + From fa71af52edfe91c614ba9278260cbf8b8427ebf4 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Thu, 21 May 2026 14:42:56 +0200 Subject: [PATCH 17/37] arr-stack: reuse core/tools.func, use $STD, surface whiptail cancels - Source misc/core.func and misc/tools.func; reuse ensure_dependencies, color/formatting/icons. - Override silent() with a simple log-to-file wrapper so set -e and the EXIT trap own all failure handling; apply $STD to the curl download and the bash install in install_loop. - Replace every "|| exit 0" whiptail bailout with a labeled cancelled() call so silent exits become diagnosable. - EXIT trap now prints orphan CTID cleanup hints + the last 20 lines of the silent log on non-zero exit. - Drop CLI flag parsing (--dry-run/--help) and inline comments. Co-Authored-By: Claude Opus 4.7 (1M context) --- tools/arr-stack.sh | 73 +++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/tools/arr-stack.sh b/tools/arr-stack.sh index 6ffe7735..e3eafc46 100644 --- a/tools/arr-stack.sh +++ b/tools/arr-stack.sh @@ -12,6 +12,10 @@ set -eEo pipefail color formatting icons +set_std_mode + +SILENT_LOGFILE="/tmp/arr-stack-$$.log" +silent() { "$@" >>"$SILENT_LOGFILE" 2>&1; } msg_info() { echo -e "${INFO:-[i]} ${YW}${1}${CL}"; } msg_ok() { echo -e "${CM:-[ok]} ${GN}${1}${CL}"; } @@ -19,6 +23,8 @@ msg_warn() { echo -e "${YW}[WARN]${CL} ${1}"; } msg_error() { echo -e "${CROSS:-[x]} ${RD}${1}${CL}"; } msg_step() { echo -e "${BL}==>${CL} ${1}"; } +cancelled() { msg_warn "Cancelled at $1."; exit 0; } + var_container_storage="${var_container_storage:-}" var_template_storage="${var_template_storage:-}" var_bridge="${var_bridge:-}" @@ -31,7 +37,19 @@ SUMMARY_FILE="${SUMMARY_FILE:-/root/arr-stack-summary.txt}" BACKTITLE="Proxmox VE Helper Scripts — arr Stack" TEMP_DIR=$(mktemp -d) -trap 'rm -rf "$TEMP_DIR"' EXIT +_on_exit() { + local rc=$? + if (( rc != 0 )); then + if (( ${#INSTALLED_SLUGS[@]} > 0 )); then orphan_report; fi + if [[ -s "$SILENT_LOGFILE" ]]; then + echo + msg_error "Last 20 lines of ${SILENT_LOGFILE}:" + tail -n 20 "$SILENT_LOGFILE" + fi + fi + rm -rf "$TEMP_DIR" +} +trap _on_exit EXIT declare -A CTID_BY_SLUG declare -A IP_BY_SLUG @@ -150,7 +168,7 @@ pick_storage() { var_container_storage=$(whiptail --backtitle "$BACKTITLE" \ --title "Container Storage" \ --menu "Pick a PVE storage for the container rootfs:" 20 70 10 \ - "${options[@]}" 3>&1 1>&2 2>&3) || exit 0 + "${options[@]}" 3>&1 1>&2 2>&3) || cancelled "storage pick" fi fi @@ -177,14 +195,14 @@ pick_network_defaults() { var_bridge=$(whiptail --backtitle "$BACKTITLE" \ --title "Network Bridge" \ --menu "Pick the Linux bridge for all containers:" 15 60 6 \ - "${options[@]}" 3>&1 1>&2 2>&3) || exit 0 + "${options[@]}" 3>&1 1>&2 2>&3) || cancelled "bridge pick" fi while [[ -z "$var_gateway" ]] || ! is_valid_ipv4 "$var_gateway"; do var_gateway=$(whiptail --backtitle "$BACKTITLE" \ --title "Gateway" \ --inputbox "IPv4 gateway for the container subnet:" 10 60 \ - "${var_gateway:-}" 3>&1 1>&2 2>&3) || exit 0 + "${var_gateway:-}" 3>&1 1>&2 2>&3) || cancelled "gateway prompt" if ! is_valid_ipv4 "$var_gateway"; then whiptail --backtitle "$BACKTITLE" --title "Invalid" \ --msgbox "Not a valid IPv4 address: ${var_gateway}" 8 60 @@ -196,7 +214,7 @@ pick_network_defaults() { var_cidr=$(whiptail --backtitle "$BACKTITLE" \ --title "CIDR Mask" \ --inputbox "Network mask (1-32, e.g. 24):" 10 60 \ - "${var_cidr:-24}" 3>&1 1>&2 2>&3) || exit 0 + "${var_cidr:-24}" 3>&1 1>&2 2>&3) || cancelled "CIDR prompt" if [[ "$var_cidr" =~ ^[0-9]+$ ]] && (( var_cidr >= 1 && var_cidr <= 32 )); then break fi @@ -217,7 +235,7 @@ pick_apps() { "radarr" "Radarr (Movies)" ON \ "lidarr" "Lidarr (Music)" OFF \ "seerr" "Seerr (Requests)" OFF \ - 3>&1 1>&2 2>&3) || exit 0 + 3>&1 1>&2 2>&3) || cancelled "*arr app pick" SELECTED_ARRS=$(echo "$choice" | tr -d '"') @@ -239,7 +257,7 @@ pick_clients() { --checklist "Optional download clients to install + wire:" 14 70 4 \ "qbittorrent" "qBittorrent (Torrents)" ON \ "sabnzbd" "SABnzbd (Usenet)" OFF \ - 3>&1 1>&2 2>&3) || exit 0 + 3>&1 1>&2 2>&3) || cancelled "download client pick" SELECTED_CLIENTS=$(echo "$choice" | tr -d '"') } @@ -266,7 +284,7 @@ pick_ip_mode_and_ips() { --menu "How would you like to enter IP addresses?" 14 70 2 \ "list" "Enter all IPs at once (space- or comma-separated)" \ "one_by_one" "Prompt per container" \ - 3>&1 1>&2 2>&3) || exit 0 + 3>&1 1>&2 2>&3) || cancelled "IP entry mode pick" if [[ "$mode" == "list" ]]; then _collect_ips_list_mode @@ -285,7 +303,7 @@ _collect_ips_list_mode() { raw=$(whiptail --backtitle "$BACKTITLE" \ --title "Enter ${expected_n} IPv4 addresses" \ --inputbox "Enter ${expected_n} IPs separated by spaces or commas, in this order:"$'\n\n'"${hint}" \ - 22 78 "" 3>&1 1>&2 2>&3) || exit 0 + 22 78 "" 3>&1 1>&2 2>&3) || cancelled "IP list entry" local normalized="${raw//,/ }" local -a ips=() @@ -335,7 +353,7 @@ _collect_ips_one_by_one() { ip=$(whiptail --backtitle "$BACKTITLE" \ --title "IP for ${slug}" \ --inputbox "Enter IPv4 for ${slug}.${running:+$'\n\nAlready assigned:'}${running}" \ - 16 60 "" 3>&1 1>&2 2>&3) || exit 0 + 16 60 "" 3>&1 1>&2 2>&3) || cancelled "IP prompt for ${slug}" if ! is_valid_ipv4 "$ip"; then whiptail --backtitle "$BACKTITLE" --title "Invalid" \ @@ -376,7 +394,7 @@ pick_start_ctid() { start=$(whiptail --backtitle "$BACKTITLE" \ --title "Starting CTID" \ --inputbox "Starting Container ID (in-use IDs are skipped):" 10 60 \ - "$default_start" 3>&1 1>&2 2>&3) || exit 0 + "$default_start" 3>&1 1>&2 2>&3) || cancelled "starting CTID prompt" if ! [[ "$start" =~ ^[0-9]+$ ]]; then msg_error "Invalid CTID: $start" @@ -428,34 +446,29 @@ install_loop() { script_file="$TEMP_DIR/${s}.sh" msg_step "[${idx}/${total}] Downloading ct/${s}.sh" - curl -fsSL \ + $STD curl -fsSL \ "https://raw.githubusercontent.com/community-scripts/${var_repo}/main/ct/${s}.sh" \ -o "$script_file" if [[ ! -s "$script_file" ]]; then msg_error "Empty/failed download for ${s}" - orphan_report exit 1 fi msg_step "[${idx}/${total}] Installing ${s} -> ctid=${ctid} ip=${ip}/${var_cidr}" - if env \ - MODE=generated mode=generated PHS_SILENT=1 \ - var_ctid="$ctid" \ - var_hostname="$s" \ - var_brg="$var_bridge" \ - var_net="${ip}/${var_cidr}" \ - var_gateway="$var_gateway" \ - var_container_storage="$var_container_storage" \ - var_template_storage="$var_template_storage" \ - bash "$script_file"; then - INSTALLED_SLUGS+=("$s") - msg_ok "Installed ${s}" - else - msg_error "Install failed for ${s} (ctid=${ctid})." - orphan_report - exit 1 - fi + $STD env \ + MODE=generated mode=generated PHS_SILENT=1 \ + var_ctid="$ctid" \ + var_hostname="$s" \ + var_brg="$var_bridge" \ + var_net="${ip}/${var_cidr}" \ + var_gateway="$var_gateway" \ + var_container_storage="$var_container_storage" \ + var_template_storage="$var_template_storage" \ + bash "$script_file" + + INSTALLED_SLUGS+=("$s") + msg_ok "Installed ${s}" if [[ "${KIND_BY_SLUG[$s]}" == "arr" || "${KIND_BY_SLUG[$s]}" == "indexer" ]]; then msg_info "Waiting for ${s} to listen on ${port}..." From dbe0c6a37f2768b50f99127aed9b4f851ab26441 Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Thu, 21 May 2026 14:49:38 +0200 Subject: [PATCH 18/37] arr-stack: add auto IP allocation with ping check Third IP entry mode "auto": user supplies a starting IP, a range (10.0.0.50-99), or comma-separated ranges; orchestrator walks the candidates with `ping -c 1 -W 1` and grabs the first N that don't respond. Skips the gateway and any IPs already assigned this run. Confirms the picks via yes/no whiptail before locking them in. Adds iputils-ping to ensure_dependencies. Co-Authored-By: Claude Opus 4.7 (1M context) --- tools/arr-stack.sh | 125 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 113 insertions(+), 12 deletions(-) diff --git a/tools/arr-stack.sh b/tools/arr-stack.sh index e3eafc46..6eb35ee6 100644 --- a/tools/arr-stack.sh +++ b/tools/arr-stack.sh @@ -278,19 +278,120 @@ compute_ordered_slugs() { } pick_ip_mode_and_ips() { - local mode - mode=$(whiptail --backtitle "$BACKTITLE" \ - --title "IP Entry Mode" \ - --menu "How would you like to enter IP addresses?" 14 70 2 \ - "list" "Enter all IPs at once (space- or comma-separated)" \ - "one_by_one" "Prompt per container" \ - 3>&1 1>&2 2>&3) || cancelled "IP entry mode pick" + while true; do + local mode + mode=$(whiptail --backtitle "$BACKTITLE" \ + --title "IP Entry Mode" \ + --menu "How would you like to enter IP addresses?" 15 75 3 \ + "list" "Enter all IPs at once (space- or comma-separated)" \ + "one_by_one" "Prompt per container" \ + "auto" "Auto-pick free IPs from a starting IP or range(s)" \ + 3>&1 1>&2 2>&3) || cancelled "IP entry mode pick" - if [[ "$mode" == "list" ]]; then - _collect_ips_list_mode - else - _collect_ips_one_by_one + case "$mode" in + list) _collect_ips_list_mode; return ;; + one_by_one) _collect_ips_one_by_one; return ;; + auto) _collect_ips_auto && return ;; + esac + done +} + +_parse_ip_ranges() { + local expr=$1 + local -a segments + IFS=',' read -ra segments <<<"$expr" + local seg prefix start end i + for seg in "${segments[@]}"; do + seg="${seg// /}" + [[ -z "$seg" ]] && continue + if [[ "$seg" =~ ^([0-9]+\.[0-9]+\.[0-9]+\.)([0-9]+)-([0-9]+\.[0-9]+\.[0-9]+\.)([0-9]+)$ ]]; then + if [[ "${BASH_REMATCH[1]}" != "${BASH_REMATCH[3]}" ]]; then + echo "ERR: cross-subnet range not supported: $seg" >&2; return 1 + fi + prefix=${BASH_REMATCH[1]}; start=${BASH_REMATCH[2]}; end=${BASH_REMATCH[4]} + elif [[ "$seg" =~ ^([0-9]+\.[0-9]+\.[0-9]+\.)([0-9]+)-([0-9]+)$ ]]; then + prefix=${BASH_REMATCH[1]}; start=${BASH_REMATCH[2]}; end=${BASH_REMATCH[3]} + elif [[ "$seg" =~ ^([0-9]+\.[0-9]+\.[0-9]+\.)([0-9]+)$ ]]; then + prefix=${BASH_REMATCH[1]}; start=${BASH_REMATCH[2]}; end=254 + else + echo "ERR: invalid segment: $seg" >&2; return 1 + fi + if (( start > end || start < 0 || end > 255 )); then + echo "ERR: out-of-range octet: $seg" >&2; return 1 + fi + for ((i=start; i<=end; i++)); do + echo "${prefix}${i}" + done + done +} + +_ip_is_free() { + local ip=$1 + [[ "$ip" == "$var_gateway" ]] && return 1 + if ping -c 1 -W 1 "$ip" >/dev/null 2>&1; then + return 1 fi + return 0 +} + +_collect_ips_auto() { + local expected_n=${#ORDERED_SLUGS[@]} + local hint="Examples:"$'\n'" 10.0.0.50 (start, scans upward to .254)"$'\n'" 10.0.0.50-99 (single range)"$'\n'" 10.0.0.50-60,10.0.0.80-99 (multiple ranges)" + + while true; do + local expr + expr=$(whiptail --backtitle "$BACKTITLE" \ + --title "Auto IP allocation" \ + --inputbox "Need ${expected_n} free IPs. Enter a starting IP or range expression:"$'\n\n'"${hint}" \ + 16 78 "" 3>&1 1>&2 2>&3) || return 1 + + local -a parsed=() + while IFS= read -r ip; do + [[ -n "$ip" ]] && parsed+=("$ip") + done < <(_parse_ip_ranges "$expr" 2>/dev/null) + + if (( ${#parsed[@]} == 0 )); then + whiptail --backtitle "$BACKTITLE" --title "Invalid" \ + --msgbox "Could not parse any IPs from: ${expr}"$'\n\n'"Try a starting IP, a range like 10.0.0.50-99, or comma-separated ranges." 12 70 + continue + fi + + msg_info "Pinging ${#parsed[@]} candidate(s) for ${expected_n} free IP(s)..." + local -a found=() + local ip already used + for ip in "${parsed[@]}"; do + (( ${#found[@]} >= expected_n )) && break + already=0 + for used in "${IP_BY_SLUG[@]}"; do + [[ "$used" == "$ip" ]] && { already=1; break; } + done + (( already )) && continue + if _ip_is_free "$ip"; then + found+=("$ip") + echo " free: ${ip}" + fi + done + + if (( ${#found[@]} < expected_n )); then + whiptail --backtitle "$BACKTITLE" --title "Not enough free IPs" \ + --msgbox "Found ${#found[@]}/${expected_n} free IPs in the range. Widen the range and try again." 10 70 + continue + fi + + local lines="" i + for i in "${!ORDERED_SLUGS[@]}"; do + lines+=" $(printf '%-12s -> %s' "${ORDERED_SLUGS[$i]}" "${found[$i]}")"$'\n' + done + if ! whiptail --backtitle "$BACKTITLE" --title "Confirm auto-assigned IPs" \ + --yesno "Free IPs found:"$'\n\n'"${lines}"$'\n'"Use these?" 22 70; then + continue + fi + + for i in "${!ORDERED_SLUGS[@]}"; do + IP_BY_SLUG[${ORDERED_SLUGS[$i]}]=${found[$i]} + done + return 0 + done } _collect_ips_list_mode() { @@ -860,7 +961,7 @@ main() { header_info check_root check_pve_tools - ensure_dependencies curl whiptail jq + ensure_dependencies curl whiptail jq iputils-ping seed_catalog pick_storage pick_network_defaults From 488884b17589382136de52538b58e5605f651351 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Thu, 21 May 2026 16:24:00 +0200 Subject: [PATCH 19/37] fixes --- install/tolgee-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tolgee-install.sh b/install/tolgee-install.sh index 3ab834da..d5b30af7 100644 --- a/install/tolgee-install.sh +++ b/install/tolgee-install.sh @@ -46,7 +46,7 @@ Type=simple User=root WorkingDirectory=/opt/tolgee EnvironmentFile=/opt/tolgee/.env -ExecStart=/usr/bin/java -jar /opt/tolgee/tolgee.jar +ExecStart=/usr/bin/java -jar /opt/tolgee/tolgee Restart=on-failure RestartSec=5 From 894939d80c107ddcb3683f0ae26eb116f9396965 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Thu, 21 May 2026 16:25:03 +0200 Subject: [PATCH 20/37] finalize --- ct/tolgee.sh | 21 --------------------- install/tolgee-install.sh | 8 ++++---- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/ct/tolgee.sh b/ct/tolgee.sh index e314086d..fe8be6ed 100644 --- a/ct/tolgee.sh +++ b/ct/tolgee.sh @@ -34,30 +34,9 @@ function update_script() { systemctl stop tolgee msg_ok "Stopped Service" - msg_info "Backing up Data" - if [[ -f /opt/tolgee/.env ]]; then - cp /opt/tolgee/.env /opt/tolgee.env.bak - fi - if [[ -d /opt/tolgee/data ]]; then - cp -r /opt/tolgee/data /opt/tolgee_data_backup - fi - msg_ok "Backed up Data" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "tolgee" "tolgee/tolgee-platform" "singlefile" "latest" "/opt/tolgee" "tolgee-*.jar" - find /opt/tolgee -maxdepth 1 -type f -name 'tolgee-*.jar' -exec mv {} /opt/tolgee/tolgee.jar \; - msg_info "Restoring Data" - if [[ -f /opt/tolgee.env.bak ]]; then - cp /opt/tolgee.env.bak /opt/tolgee/.env - rm -f /opt/tolgee.env.bak - fi - if [[ -d /opt/tolgee_data_backup ]]; then - cp -r /opt/tolgee_data_backup/. /opt/tolgee/data - rm -rf /opt/tolgee_data_backup - fi - msg_ok "Restored Data" - msg_info "Starting Service" systemctl start tolgee msg_ok "Started Service" diff --git a/install/tolgee-install.sh b/install/tolgee-install.sh index d5b30af7..4e791c8b 100644 --- a/install/tolgee-install.sh +++ b/install/tolgee-install.sh @@ -20,10 +20,10 @@ PG_DB_NAME="tolgee" PG_DB_USER="tolgee" setup_postgresql_db fetch_and_deploy_gh_release "tolgee" "tolgee/tolgee-platform" "singlefile" "latest" "/opt/tolgee" "tolgee-*.jar" msg_info "Setting up Tolgee" -mkdir -p /opt/tolgee/data +mkdir -p /opt/tolgee_data find /opt/tolgee -maxdepth 1 -type f -name 'tolgee-*.jar' -exec mv {} /opt/tolgee/tolgee.jar \; -cat </opt/tolgee/.env +cat </opt/tolgee_data/.env SERVER_PORT=8080 TOLGEE_POSTGRES_AUTOSTART_ENABLED=false SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/${PG_DB_NAME} @@ -31,7 +31,7 @@ SPRING_DATASOURCE_USERNAME=${PG_DB_USER} SPRING_DATASOURCE_PASSWORD=${PG_DB_PASS} TOLGEE_AUTHENTICATION_ENABLED=true TOLGEE_AUTHENTICATION_INITIAL_USERNAME=admin -TOLGEE_FILE_STORAGE_FS_DATA_PATH=/opt/tolgee/data/ +TOLGEE_FILE_STORAGE_FS_DATA_PATH=/opt/tolgee_data EOF msg_ok "Set up Tolgee" @@ -45,7 +45,7 @@ After=network.target Type=simple User=root WorkingDirectory=/opt/tolgee -EnvironmentFile=/opt/tolgee/.env +EnvironmentFile=/opt/tolgee_data/.env ExecStart=/usr/bin/java -jar /opt/tolgee/tolgee Restart=on-failure RestartSec=5 From bc7e0f5256f5c95beb08c2ed319256233f820a97 Mon Sep 17 00:00:00 2001 From: MickLesk Date: Thu, 21 May 2026 16:30:18 +0200 Subject: [PATCH 21/37] fixes --- json/tolgee.json | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/json/tolgee.json b/json/tolgee.json index cbf4f0ee..8f29d86a 100644 --- a/json/tolgee.json +++ b/json/tolgee.json @@ -29,16 +29,7 @@ ], "default_credentials": { "username": "admin", - "password": "Stored in /opt/tolgee/data/initial.pwd" + "password": "cat /opt/tolgee_data/initial.pwd" }, - "notes": [ - { - "text": "Tolgee listens on port 8080 by default.", - "type": "info" - }, - { - "text": "The initial admin password is generated automatically and stored in /opt/tolgee/data/initial.pwd on first start.", - "type": "info" - } - ] -} + "notes": [] +} \ No newline at end of file From 6e81aff07e9bc0f16b39440ad5d90721bcb09d2f Mon Sep 17 00:00:00 2001 From: MickLesk Date: Thu, 21 May 2026 16:40:30 +0200 Subject: [PATCH 22/37] Add support for Proxmox VE 9.2 Update pve_check logic and messages to allow Proxmox VE 9.2 across scripts. Adjusted version bounds (minor <= 2), regex checks (9\.[0-2]), and user-facing error text in misc/core.func, misc/vm-core.func and multiple vm/* scripts (allstarlink, archlinux, cachyos, debian-13, docker-vm-debug, nextcloud, openwrt, opnsense, owncloud, ubuntu2204, ubuntu2404, ubuntu2410, umbrel-os, unifi-os-server). No functional changes beyond expanding supported PVE minor version range and updating messages. --- misc/core.func | 10 +++++----- misc/vm-core.func | 6 +++--- vm/allstarlink-vm.sh | 4 ++-- vm/archlinux-vm.sh | 4 ++-- vm/cachyos-vm.sh | 4 ++-- vm/debian-13-vm.sh | 10 +++++----- vm/docker-vm-debug.sh | 10 +++++----- vm/nextcloud-vm.sh | 4 ++-- vm/openwrt.sh | 4 ++-- vm/opnsense-vm.sh | 4 ++-- vm/owncloud-vm.sh | 4 ++-- vm/ubuntu2204-vm.sh | 4 ++-- vm/ubuntu2404-vm.sh | 4 ++-- vm/ubuntu2410-vm.sh | 2 +- vm/umbrel-os-vm.sh | 4 ++-- vm/unifi-os-server-vm.sh | 8 ++++---- 16 files changed, 43 insertions(+), 43 deletions(-) diff --git a/misc/core.func b/misc/core.func index af668c42..e42acb84 100644 --- a/misc/core.func +++ b/misc/core.func @@ -301,7 +301,7 @@ root_check() { # pve_check() # # - Validates Proxmox VE version compatibility -# - Supported: PVE 8.0-8.9 and PVE 9.0-9.1 +# - Supported: PVE 8.0-8.9 and PVE 9.0-9.2 # - Exits with error message if unsupported version detected # ------------------------------------------------------------------------------ pve_check() { @@ -319,12 +319,12 @@ pve_check() { return 0 fi - # Check for Proxmox VE 9.x: allow 9.0–9.1 + # Check for Proxmox VE 9.x: allow 9.0–9.2 if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then local MINOR="${BASH_REMATCH[1]}" - if ((MINOR < 0 || MINOR > 1)); then + if ((MINOR < 0 || MINOR > 2)); then msg_error "This version of Proxmox VE is not yet supported." - msg_error "Supported: Proxmox VE version 9.0 – 9.1" + msg_error "Supported: Proxmox VE version 9.0 – 9.2" exit 1 fi return 0 @@ -332,7 +332,7 @@ pve_check() { # All other unsupported versions msg_error "This version of Proxmox VE is not supported." - msg_error "Supported versions: Proxmox VE 8.0 – 8.9 or 9.0 – 9.1" + msg_error "Supported versions: Proxmox VE 8.0 – 8.9 or 9.0 – 9.2" exit 1 } diff --git a/misc/vm-core.func b/misc/vm-core.func index 1383c67e..f3dcd999 100644 --- a/misc/vm-core.func +++ b/misc/vm-core.func @@ -606,16 +606,16 @@ pve_check() { if [[ "$pve_ver" =~ ^9\.([0-9]+) ]]; then local minor="${BASH_REMATCH[1]}" - if ((minor < 0 || minor > 1)); then + if ((minor < 0 || minor > 2)); then msg_error "This version of Proxmox VE is not supported." - msg_error "Supported: Proxmox VE version 9.0 – 9.1" + msg_error "Supported: Proxmox VE version 9.0 – 9.2" exit 105 fi return 0 fi msg_error "This version of Proxmox VE is not supported." - msg_error "Supported versions: Proxmox VE 8.0 – 8.9 or 9.0 – 9.1" + msg_error "Supported versions: Proxmox VE 8.0 – 8.9 or 9.0 – 9.2" exit 105 } diff --git a/vm/allstarlink-vm.sh b/vm/allstarlink-vm.sh index 0d8c92d3..93135136 100644 --- a/vm/allstarlink-vm.sh +++ b/vm/allstarlink-vm.sh @@ -104,9 +104,9 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-3]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-3]|9\.[0-2])(\.[0-9]+)*"; then msg_error "This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.3 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.3 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/archlinux-vm.sh b/vm/archlinux-vm.sh index 0c1a2a3c..b238b448 100644 --- a/vm/archlinux-vm.sh +++ b/vm/archlinux-vm.sh @@ -138,9 +138,9 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/cachyos-vm.sh b/vm/cachyos-vm.sh index fd53ca01..48bb9e67 100644 --- a/vm/cachyos-vm.sh +++ b/vm/cachyos-vm.sh @@ -146,9 +146,9 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/debian-13-vm.sh b/vm/debian-13-vm.sh index c979d939..69829f60 100644 --- a/vm/debian-13-vm.sh +++ b/vm/debian-13-vm.sh @@ -140,7 +140,7 @@ function check_root() { } # This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. -# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 – 9.1 +# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 – 9.2 pve_check() { local PVE_VER PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" @@ -156,12 +156,12 @@ pve_check() { return 0 fi - # Check for Proxmox VE 9.x: allow 9.0–9.1 + # Check for Proxmox VE 9.x: allow 9.0–9.2 if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then local MINOR="${BASH_REMATCH[1]}" - if ((MINOR < 0 || MINOR > 1)); then + if ((MINOR < 0 || MINOR > 2)); then msg_error "This version of Proxmox VE is not yet supported." - msg_error "Supported: Proxmox VE version 9.0 – 9.1" + msg_error "Supported: Proxmox VE version 9.0 – 9.2" exit 1 fi return 0 @@ -169,7 +169,7 @@ pve_check() { # All other unsupported versions msg_error "This version of Proxmox VE is not supported." - msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.2" exit 1 } diff --git a/vm/docker-vm-debug.sh b/vm/docker-vm-debug.sh index 58bfeb85..afb04603 100644 --- a/vm/docker-vm-debug.sh +++ b/vm/docker-vm-debug.sh @@ -162,7 +162,7 @@ function check_root() { } # This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. -# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 – 9.1 +# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 – 9.2 pve_check() { local PVE_VER PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" @@ -179,12 +179,12 @@ pve_check() { return 0 fi - # Check for Proxmox VE 9.x: allow 9.0 – 9.1 + # Check for Proxmox VE 9.x: allow 9.0 – 9.2 if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then local MINOR="${BASH_REMATCH[1]}" - if ((MINOR < 0 || MINOR > 1)); then + if ((MINOR < 0 || MINOR > 2)); then msg_error "This version of Proxmox VE is not yet supported." - msg_error "Supported: Proxmox VE version 9.0 – 9.1" + msg_error "Supported: Proxmox VE version 9.0 – 9.2" exit 1 fi PVE_MAJOR=9 @@ -193,7 +193,7 @@ pve_check() { # All other unsupported versions msg_error "This version of Proxmox VE is not supported." - msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" + msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.2" exit 1 } diff --git a/vm/nextcloud-vm.sh b/vm/nextcloud-vm.sh index 6b7748c2..fc6eb6a0 100644 --- a/vm/nextcloud-vm.sh +++ b/vm/nextcloud-vm.sh @@ -119,9 +119,9 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/openwrt.sh b/vm/openwrt.sh index e11d3620..65409646 100644 --- a/vm/openwrt.sh +++ b/vm/openwrt.sh @@ -186,9 +186,9 @@ function msg_error() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/opnsense-vm.sh b/vm/opnsense-vm.sh index c616ef2b..b946acbe 100644 --- a/vm/opnsense-vm.sh +++ b/vm/opnsense-vm.sh @@ -182,9 +182,9 @@ function msg_error() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/owncloud-vm.sh b/vm/owncloud-vm.sh index 1c15c633..137eada4 100644 --- a/vm/owncloud-vm.sh +++ b/vm/owncloud-vm.sh @@ -120,9 +120,9 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/ubuntu2204-vm.sh b/vm/ubuntu2204-vm.sh index 3012f61a..730228a8 100644 --- a/vm/ubuntu2204-vm.sh +++ b/vm/ubuntu2204-vm.sh @@ -136,9 +136,9 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/ubuntu2404-vm.sh b/vm/ubuntu2404-vm.sh index af2548e5..bf35280c 100644 --- a/vm/ubuntu2404-vm.sh +++ b/vm/ubuntu2404-vm.sh @@ -139,9 +139,9 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/ubuntu2410-vm.sh b/vm/ubuntu2410-vm.sh index 1e83def5..43823fae 100644 --- a/vm/ubuntu2410-vm.sh +++ b/vm/ubuntu2410-vm.sh @@ -139,7 +139,7 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." echo -e "Exiting..." diff --git a/vm/umbrel-os-vm.sh b/vm/umbrel-os-vm.sh index 9474468b..157322d3 100644 --- a/vm/umbrel-os-vm.sh +++ b/vm/umbrel-os-vm.sh @@ -131,9 +131,9 @@ function check_root() { } function pve_check() { - if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-2])(\.[0-9]+)*"; then msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported" - echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.2." echo -e "Exiting..." sleep 2 exit diff --git a/vm/unifi-os-server-vm.sh b/vm/unifi-os-server-vm.sh index 25a8b3c8..f385c05e 100644 --- a/vm/unifi-os-server-vm.sh +++ b/vm/unifi-os-server-vm.sh @@ -148,7 +148,7 @@ function check_root() { } # This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. -# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 – 9.1 +# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 – 9.2 pve_check() { local PVE_VER PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" @@ -162,12 +162,12 @@ pve_check() { exit 1 fi - # Check for Proxmox VE 9.x: allow 9.0–9.1 + # Check for Proxmox VE 9.x: allow 9.0–9.2 elif [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then local MINOR="${BASH_REMATCH[1]}" - if ((MINOR < 0 || MINOR > 1)); then + if ((MINOR < 0 || MINOR > 2)); then msg_error "This version of Proxmox VE is not yet supported." - msg_error "Supported: Proxmox VE version 9.0 – 9.1" + msg_error "Supported: Proxmox VE version 9.0 – 9.2" exit 1 fi From 3a909e4edb3264f3457a3be4b2831d719bdbd65a Mon Sep 17 00:00:00 2001 From: Sam Heinz <54530346+asylumexp@users.noreply.github.com> Date: Fri, 22 May 2026 23:25:59 +1000 Subject: [PATCH 23/37] remove temporary arm64 files --- ct/arm/adguard.sh | 41 ------- ct/arm/bazarr.sh | 70 ------------ ct/arm/bentopdf.sh | 62 ----------- ct/arm/homeassistant.sh | 109 ------------------ ct/arm/jellyfin.sh | 52 --------- ct/arm/kima-hub.sh | 79 ------------- ct/arm/lubelogger.sh | 74 ------------- ct/arm/pihole.sh | 47 -------- ct/arm/rdtclient.sh | 63 ----------- ct/arm/vaultwarden.sh | 119 -------------------- install/arm/adguard-install.sh | 44 -------- install/arm/arm-test.sh | 1 - install/arm/bazarr-install.sh | 56 ---------- install/arm/bentopdf-install.sh | 48 -------- install/arm/homeassistant-install.sh | 81 -------------- install/arm/jellyfin-install.sh | 67 ----------- install/arm/kima-hub-install.sh | 109 ------------------ install/arm/lubelogger-install.sh | 51 --------- install/arm/pihole-install.sh | 160 --------------------------- install/arm/rdtclient-install.sh | 63 ----------- install/arm/vaultwarden-install.sh | 105 ------------------ 21 files changed, 1501 deletions(-) delete mode 100644 ct/arm/adguard.sh delete mode 100644 ct/arm/bazarr.sh delete mode 100644 ct/arm/bentopdf.sh delete mode 100644 ct/arm/homeassistant.sh delete mode 100644 ct/arm/jellyfin.sh delete mode 100644 ct/arm/kima-hub.sh delete mode 100644 ct/arm/lubelogger.sh delete mode 100644 ct/arm/pihole.sh delete mode 100644 ct/arm/rdtclient.sh delete mode 100644 ct/arm/vaultwarden.sh delete mode 100644 install/arm/adguard-install.sh delete mode 100644 install/arm/arm-test.sh delete mode 100644 install/arm/bazarr-install.sh delete mode 100644 install/arm/bentopdf-install.sh delete mode 100644 install/arm/homeassistant-install.sh delete mode 100644 install/arm/jellyfin-install.sh delete mode 100644 install/arm/kima-hub-install.sh delete mode 100644 install/arm/lubelogger-install.sh delete mode 100644 install/arm/pihole-install.sh delete mode 100644 install/arm/rdtclient-install.sh delete mode 100644 install/arm/vaultwarden-install.sh diff --git a/ct/arm/adguard.sh b/ct/arm/adguard.sh deleted file mode 100644 index f0c2b99d..00000000 --- a/ct/arm/adguard.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://adguard.com/ - -APP="Adguard" -var_tags="${var_tags:-adblock}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-512}" -var_disk="${var_disk:-2}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/AdGuardHome ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - msg_error "Adguard Home can only be updated via the user interface." - exit -} - -start -build_container -description - -msg_ok "Completed successfully!\n" -echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" diff --git a/ct/arm/bazarr.sh b/ct/arm/bazarr.sh deleted file mode 100644 index 7c4642af..00000000 --- a/ct/arm/bazarr.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://www.bazarr.media/ - -APP="Bazarr" -var_tags="${var_tags:-arr}" -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_unprivileged="${var_unprivileged:-1}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -d /var/lib/bazarr/ ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - if check_for_gh_release "bazarr" "morpheus65535/bazarr"; then - apt-get install -y libicu76 &>/dev/null - msg_info "Stopping Service" - systemctl stop bazarr - msg_ok "Stopped Service" - - PYTHON_VERSION="3.12" setup_uv - fetch_and_deploy_gh_release "bazarr" "morpheus65535/bazarr" "prebuild" "latest" "/opt/bazarr" "bazarr.zip" - - msg_info "Setup Bazarr" - mkdir -p /var/lib/bazarr/ - chmod 775 /opt/bazarr /var/lib/bazarr/ - # Always ensure venv exists - if [[ ! -d /opt/bazarr/venv/ ]]; then - $STD uv venv --clear /opt/bazarr/venv --python 3.12 - fi - - # Always check and fix service file if needed - if [[ -f /etc/systemd/system/bazarr.service ]] && grep -q "ExecStart=/usr/bin/python3" /etc/systemd/system/bazarr.service; then - sed -i "s|ExecStart=/usr/bin/python3 /opt/bazarr/bazarr.py|ExecStart=/opt/bazarr/venv/bin/python3 /opt/bazarr/bazarr.py|g" /etc/systemd/system/bazarr.service - systemctl daemon-reload - fi - sed -i.bak 's/--only-binary=Pillow//g' /opt/bazarr/requirements.txt - $STD uv pip install -r /opt/bazarr/requirements.txt --python /opt/bazarr/venv/bin/python3 - msg_ok "Setup Bazarr" - - msg_info "Starting Service" - systemctl start bazarr - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:6767${CL}" diff --git a/ct/arm/bentopdf.sh b/ct/arm/bentopdf.sh deleted file mode 100644 index f7fb63e8..00000000 --- a/ct/arm/bentopdf.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: vhsdream -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/alam00000/bentopdf - -APP="BentoPDF" -var_tags="${var_tags:-pdf-editor}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-4096}" -var_disk="${var_disk:-4}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/bentopdf ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - NODE_VERSION="24" setup_nodejs - - if check_for_gh_release "bentopdf" "alam00000/bentopdf"; then - msg_info "Stopping Service" - systemctl stop bentopdf - msg_ok "Stopped Service" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bentopdf" "alam00000/bentopdf" "tarball" "latest" "/opt/bentopdf" - - msg_info "Updating BentoPDF" - cd /opt/bentopdf - $STD npm ci --no-audit --no-fund - export SIMPLE_MODE=true - $STD npm run build -- --mode production - msg_ok "Updated BentoPDF" - - msg_info "Starting Service" - systemctl start bentopdf - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" diff --git a/ct/arm/homeassistant.sh b/ct/arm/homeassistant.sh deleted file mode 100644 index 918f2d55..00000000 --- a/ct/arm/homeassistant.sh +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://www.home-assistant.io/ - -APP="Home Assistant" -var_tags="${var_tags:-automation;smarthome}" -var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-2048}" -var_disk="${var_disk:-16}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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 /var/lib/docker/volumes/hass_config/_data ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - UPD=$(msg_menu "Home Assistant Update Options" \ - "1" "Update ALL Containers" \ - "2" "Remove ALL Unused Images" \ - "3" "Install HACS" \ - "4" "Install FileBrowser") - - if [ "$UPD" == "1" ]; then - msg_info "Updating All Containers" - CONTAINER_LIST="${1:-$(docker ps -q)}" - for container in ${CONTAINER_LIST}; do - CONTAINER_IMAGE="$(docker inspect --format "{{.Config.Image}}" --type container "${container}")" - RUNNING_IMAGE="$(docker inspect --format "{{.Image}}" --type container "${container}")" - docker pull "${CONTAINER_IMAGE}" - LATEST_IMAGE="$(docker inspect --format "{{.Id}}" --type image "${CONTAINER_IMAGE}")" - if [[ "${RUNNING_IMAGE}" != "${LATEST_IMAGE}" ]]; then - pip install -U runlike - echo "Updating ${container} image ${CONTAINER_IMAGE}" - DOCKER_COMMAND="$(runlike --use-volume-id "${container}")" - docker rm --force "${container}" - eval "${DOCKER_COMMAND}" - fi - done - msg_ok "Updated All Containers" - exit - fi - if [ "$UPD" == "2" ]; then - msg_info "Removing ALL Unused Images" - docker image prune -af - msg_ok "Removed ALL Unused Images" - exit - fi - if [ "$UPD" == "3" ]; then - msg_info "Installing Home Assistant Community Store (HACS)" - $STD apt update - cd /var/lib/docker/volumes/hass_config/_data - $STD bash <(curl -fsSL https://get.hacs.xyz) - msg_ok "Installed Home Assistant Community Store (HACS)" - echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n" - exit - fi - if [ "$UPD" == "4" ]; then - msg_info "Installing FileBrowser" - RELEASE=$(curl -fsSL https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g') - $STD curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-arm64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin - $STD filebrowser config init -a '0.0.0.0' - $STD filebrowser config set -a '0.0.0.0' - $STD filebrowser users add admin helper-scripts.com --perm.admin - msg_ok "Installed FileBrowser" - - msg_info "Creating Service" - service_path="/etc/systemd/system/filebrowser.service" - echo "[Unit] -Description=Filebrowser -After=network-online.target -[Service] -User=root -WorkingDirectory=/root/ -ExecStart=/usr/local/bin/filebrowser -r / -[Install] -WantedBy=default.target" >$service_path - - $STD systemctl enable --now filebrowser - msg_ok "Created Service" - - msg_ok "Completed successfully!\n" - echo -e "FileBrowser should be reachable by going to the following URL. - ${BL}http://$LOCAL_IP:8080${CL} admin|helper-scripts.com\n" - exit - 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} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}HA: http://${IP}:8123${CL}" -echo -e "${TAB}${GATEWAY}${BGN}Portainer: https://${IP}:9443${CL}" diff --git a/ct/arm/jellyfin.sh b/ct/arm/jellyfin.sh deleted file mode 100644 index 2bba8fdf..00000000 --- a/ct/arm/jellyfin.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://jellyfin.org/ - -APP="Jellyfin" -var_tags="${var_tags:-media}" -var_cpu="${var_cpu:-2}" -var_ram="${var_ram:-2048}" -var_disk="${var_disk:-16}" -var_os="${var_os:-ubuntu}" -var_version="${var_version:-24.04}" -var_unprivileged="${var_unprivileged:-0}" -var_gpu="${var_gpu:-yes}" - -header_info "$APP" -variables -color -catch_errors - -function update_script() { - header_info - check_container_storage - check_container_resources - if [[ ! -d /usr/lib/jellyfin ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - msg_info "Updating Jellyfin" - ensure_dependencies libjemalloc2 - if [[ ! -f /usr/lib/libjemalloc.so ]]; then - ln -sf /usr/lib/aarch64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so - fi - $STD apt update - $STD apt -y upgrade - $STD apt -y --with-new-pkgs upgrade jellyfin jellyfin-server - msg_ok "Updated Jellyfin" - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8096${CL}" diff --git a/ct/arm/kima-hub.sh b/ct/arm/kima-hub.sh deleted file mode 100644 index c7523027..00000000 --- a/ct/arm/kima-hub.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk (CanbiZ) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/Chevron7Locked/kima-hub - -APP="Kima-Hub" -var_tags="${var_tags:-music;streaming;media}" -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_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/kima-hub ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "kima-hub" "Chevron7Locked/kima-hub"; then - msg_info "Stopping Services" - systemctl stop kima-frontend kima-backend kima-analyzer kima-analyzer-clap - msg_ok "Stopped Services" - - msg_info "Backing up Data" - cp /opt/kima-hub/backend/.env /opt/kima-hub-backend-env.bak - cp /opt/kima-hub/frontend/.env /opt/kima-hub-frontend-env.bak - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "kima-hub" "Chevron7Locked/kima-hub" "tarball" - - msg_info "Restoring Data" - cp /opt/kima-hub-backend-env.bak /opt/kima-hub/backend/.env - cp /opt/kima-hub-frontend-env.bak /opt/kima-hub/frontend/.env - rm -f /opt/kima-hub-backend-env.bak /opt/kima-hub-frontend-env.bak - msg_ok "Restored Data" - - msg_info "Rebuilding Backend" - cd /opt/kima-hub/backend - $STD npm install - $STD npm run build - $STD npx prisma generate - $STD npx prisma migrate deploy - msg_ok "Rebuilt Backend" - - msg_info "Rebuilding Frontend" - cd /opt/kima-hub/frontend - $STD npm install - $STD npm run build - msg_ok "Rebuilt Frontend" - - msg_info "Starting Services" - systemctl start kima-backend kima-frontend kima-analyzer kima-analyzer-clap - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:3030${CL}" diff --git a/ct/arm/lubelogger.sh b/ct/arm/lubelogger.sh deleted file mode 100644 index 5d314abf..00000000 --- a/ct/arm/lubelogger.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 community-scripts ORG -# Author: kristocopani -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://lubelogger.com/ - -APP="LubeLogger" -var_tags="${var_tags:-vehicle;car}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-512}" -var_disk="${var_disk:-2}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/lubelogger.service ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - if check_for_gh_release "lubelogger" "hargata/lubelog"; then - msg_info "Stopping Service" - systemctl stop lubelogger - msg_ok "Stopped Service" - - msg_info "Backing up data" - mkdir -p /tmp/lubeloggerData/data - cp /opt/lubelogger/appsettings.json /tmp/lubeloggerData/appsettings.json - cp -r /opt/lubelogger/data/ /tmp/lubeloggerData/ - - # Lubelogger has moved multiples folders to the 'data' folder, and we need to move them before the update to keep the user data - # Github Discussion: https://github.com/hargata/lubelog/discussions/787 - [[ -e /opt/lubelogger/config ]] && cp -r /opt/lubelogger/config /tmp/lubeloggerData/data/ - [[ -e /opt/lubelogger/wwwroot/translations ]] && cp -r /opt/lubelogger/wwwroot/translations /tmp/lubeloggerData/data/ - [[ -e /opt/lubelogger/wwwroot/documents ]] && cp -r /opt/lubelogger/wwwroot/documents /tmp/lubeloggerData/data/ - [[ -e /opt/lubelogger/wwwroot/images ]] && cp -r /opt/lubelogger/wwwroot/images /tmp/lubeloggerData/data/ - [[ -e /opt/lubelogger/wwwroot/temp ]] && cp -r /opt/lubelogger/wwwroot/temp /tmp/lubeloggerData/data/ - [[ -e /opt/lubelogger/log ]] && cp -r /opt/lubelogger/log /tmp/lubeloggerData/ - rm -rf /opt/lubelogger - msg_ok "Backed up data" - - fetch_and_deploy_gh_release "lubelogger" "hargata/lubelog" "prebuild" "latest" "/opt/lubelogger" "LubeLogger*linux_x64.zip" - - msg_info "Configuring LubeLogger" - chmod 700 /opt/lubelogger/CarCareTracker - cp -rf /tmp/lubeloggerData/* /opt/lubelogger/ - rm -rf /tmp/lubeloggerData - msg_ok "Configured LubeLogger" - - msg_info "Starting Service" - systemctl start lubelogger - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:5000${CL}" diff --git a/ct/arm/pihole.sh b/ct/arm/pihole.sh deleted file mode 100644 index b16aba5c..00000000 --- a/ct/arm/pihole.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://pi-hole.net/ - -APP="Pihole" -var_tags="${var_tags:-adblock}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-512}" -var_disk="${var_disk:-2}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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 /etc/pihole ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - msg_info "Updating PiHole" - set +e - $STD apt update - $STD apt upgrade -y - /usr/local/bin/pihole -up - msg_ok "Updated PiHole" - 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 "${TAB}${GATEWAY}${BGN}http://${IP}/admin${CL}" diff --git a/ct/arm/rdtclient.sh b/ct/arm/rdtclient.sh deleted file mode 100644 index ad669a2b..00000000 --- a/ct/arm/rdtclient.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/rogerfar/rdt-client - -APP="RDTClient" -var_tags="${var_tags:-torrent}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-1024}" -var_disk="${var_disk:-4}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/rdtc/ ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - if check_for_gh_release "rdt-client" "rogerfar/rdt-client"; then - msg_info "Stopping Service" - systemctl stop rdtc - msg_ok "Stopped Service" - - msg_info "Creating backup" - mkdir -p /opt/rdtc-backup - cp -R /opt/rdtc/appsettings.json /opt/rdtc-backup/ - msg_ok "Backup created" - - fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip" - cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/ - if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then - $STD apt remove --purge -y dotnet-sdk-8.0 - ensure_dependencies aspnetcore-runtime-9.0 - fi - rm -rf /opt/rdtc-backup - - msg_info "Starting Service" - systemctl start rdtc - 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 "${TAB}${GATEWAY}${BGN}http://${IP}:6500${CL}" diff --git a/ct/arm/vaultwarden.sh b/ct/arm/vaultwarden.sh deleted file mode 100644 index ed03e84b..00000000 --- a/ct/arm/vaultwarden.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/dani-garcia/vaultwarden - -APP="Vaultwarden" -var_tags="${var_tags:-password-manager}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-6144}" -var_disk="${var_disk:-20}" -var_os="${var_os:-debian}" -var_version="${var_version:-13}" -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/vaultwarden.service ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - VAULT=$(get_latest_github_release "dani-garcia/vaultwarden") - WVRELEASE=$(get_latest_github_release "dani-garcia/bw_web_builds") - - UPD=$(msg_menu "Vaultwarden Update Options" \ - "1" "Update VaultWarden + Web-Vault" \ - "2" "Set Admin Token") - - if [ "$UPD" == "1" ]; then - if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then - msg_info "Stopping Service" - systemctl stop vaultwarden - msg_ok "Stopped Service" - - fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src" - - msg_info "Updating VaultWarden to $VAULT (Patience)" - cd /tmp/vaultwarden-src - VW_VERSION="$VAULT" - export VW_VERSION - $STD cargo build --features "sqlite,mysql,postgresql" --release - if [[ -f /usr/bin/vaultwarden ]]; then - cp target/release/vaultwarden /usr/bin/ - else - cp target/release/vaultwarden /opt/vaultwarden/bin/ - fi - cd ~ && rm -rf /tmp/vaultwarden-src - msg_ok "Updated VaultWarden to ${VAULT}" - - msg_info "Starting Service" - systemctl start vaultwarden - msg_ok "Started Service" - else - msg_ok "VaultWarden is already up-to-date" - fi - - if check_for_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds"; then - msg_info "Stopping Service" - systemctl stop vaultwarden - msg_ok "Stopped Service" - - msg_info "Updating Web-Vault to $WVRELEASE" - rm -rf /opt/vaultwarden/web-vault - mkdir -p /opt/vaultwarden/web-vault - - fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz" - - chown -R root:root /opt/vaultwarden/web-vault/ - msg_ok "Updated Web-Vault to ${WVRELEASE}" - - msg_info "Starting Service" - systemctl start vaultwarden - msg_ok "Started Service" - else - msg_ok "Web-Vault is already up-to-date" - fi - - msg_ok "Updated successfully!" - exit - fi - - if [ "$UPD" == "2" ]; then - if [[ "${PHS_SILENT:-0}" == "1" ]]; then - msg_warn "Set Admin Token requires interactive mode, skipping." - exit - fi - read -r -s -p "Set the ADMIN_TOKEN: " NEWTOKEN - echo "" - if [[ -n "$NEWTOKEN" ]]; then - ensure_dependencies argon2 - TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e) - sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env - if [[ -f /opt/vaultwarden/data/config.json ]]; then - sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json - fi - systemctl restart vaultwarden - msg_ok "Admin token updated" - fi - exit - 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} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8000${CL}" diff --git a/install/arm/adguard-install.sh b/install/arm/adguard-install.sh deleted file mode 100644 index a2e9ee8d..00000000 --- a/install/arm/adguard-install.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://adguard.com/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -fetch_and_deploy_gh_release "AdGuardHome" "AdguardTeam/AdGuardHome" "prebuild" "latest" "/opt/AdGuardHome" "AdGuardHome_linux_arm64.tar.gz" - -msg_info "Creating Service" -cat </etc/systemd/system/AdGuardHome.service -[Unit] -Description=AdGuard Home: Network-level blocker -ConditionFileIsExecutable=/opt/AdGuardHome/AdGuardHome -After=syslog.target network-online.target - -[Service] -StartLimitInterval=5 -StartLimitBurst=10 -ExecStart=/opt/AdGuardHome/AdGuardHome "-s" "run" -WorkingDirectory=/opt/AdGuardHome -StandardOutput=file:/var/log/AdGuardHome.out -StandardError=file:/var/log/AdGuardHome.err -Restart=always -RestartSec=10 -EnvironmentFile=-/etc/sysconfig/AdGuardHome - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now AdGuardHome -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/arm-test.sh b/install/arm/arm-test.sh deleted file mode 100644 index 8b137891..00000000 --- a/install/arm/arm-test.sh +++ /dev/null @@ -1 +0,0 @@ - diff --git a/install/arm/bazarr-install.sh b/install/arm/bazarr-install.sh deleted file mode 100644 index 879bcf59..00000000 --- a/install/arm/bazarr-install.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://www.bazarr.media/ - -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 libicu76 -msg_ok "Installed Dependencies" - -PYTHON_VERSION="3.12" setup_uv -fetch_and_deploy_gh_release "bazarr" "morpheus65535/bazarr" "prebuild" "latest" "/opt/bazarr" "bazarr.zip" - -msg_info "Installing Bazarr" -mkdir -p /var/lib/bazarr/ -chmod 775 /opt/bazarr /var/lib/bazarr/ -sed -i.bak 's/--only-binary=Pillow//g' /opt/bazarr/requirements.txt -$STD uv venv --clear /opt/bazarr/venv --python 3.12 -$STD uv pip install -r /opt/bazarr/requirements.txt --python /opt/bazarr/venv/bin/python3 -msg_ok "Installed Bazarr" - -msg_info "Creating Service" -cat </etc/systemd/system/bazarr.service -[Unit] -Description=Bazarr Daemon -After=syslog.target network.target - -[Service] -WorkingDirectory=/opt/bazarr/ -UMask=0002 -Restart=on-failure -RestartSec=5 -Type=simple -ExecStart=/opt/bazarr/venv/bin/python3 /opt/bazarr/bazarr.py -KillSignal=SIGINT -TimeoutStopSec=20 -SyslogIdentifier=bazarr - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now bazarr -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/bentopdf-install.sh b/install/arm/bentopdf-install.sh deleted file mode 100644 index 39545544..00000000 --- a/install/arm/bentopdf-install.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: vhsdream -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/alam00000/bentopdf - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -NODE_VERSION="24" setup_nodejs -fetch_and_deploy_gh_release "bentopdf" "alam00000/bentopdf" "tarball" "latest" "/opt/bentopdf" - -msg_info "Setup BentoPDF" -cd /opt/bentopdf -$STD npm ci --no-audit --no-fund -export SIMPLE_MODE=true -$STD npm run build -- --mode production -msg_ok "Setup BentoPDF" - -msg_info "Creating Service" -cat </etc/systemd/system/bentopdf.service -[Unit] -Description=BentoPDF Service -After=network.target - -[Service] -Type=simple -WorkingDirectory=/opt/bentopdf -ExecStart=/usr/bin/npx serve dist -p 8080 -Restart=always -RestartSec=10 - -[Install] -WantedBy=multi-user.target -EOF - -systemctl enable -q --now bentopdf -msg_ok "Created & started service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/homeassistant-install.sh b/install/arm/homeassistant-install.sh deleted file mode 100644 index 369ef03c..00000000 --- a/install/arm/homeassistant-install.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://www.home-assistant.io/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Setup Python3" -$STD apt install -y \ - python3 \ - python3-dev \ - python3-pip \ - python3-venv -rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED -msg_ok "Setup Python3" - -msg_info "Installing runlike" -$STD pip install runlike -msg_ok "Installed runlike" - -get_latest_release() { - curl -fsSL https://api.github.com/repos/$1/releases/latest | grep '"tag_name":' | cut -d'"' -f4 -} - -DOCKER_LATEST_VERSION=$(get_latest_release "moby/moby") -CORE_LATEST_VERSION=$(get_latest_release "home-assistant/core") -PORTAINER_LATEST_VERSION=$(get_latest_release "portainer/portainer") - -msg_info "Installing Docker $DOCKER_LATEST_VERSION" -DOCKER_CONFIG_PATH='/etc/docker/daemon.json' -mkdir -p $(dirname $DOCKER_CONFIG_PATH) -echo -e '{\n "log-driver": "journald"\n}' >/etc/docker/daemon.json -$STD sh <(curl -fsSL https://get.docker.com) -msg_ok "Installed Docker $DOCKER_LATEST_VERSION" - -msg_info "Pulling Portainer $PORTAINER_LATEST_VERSION Image" -$STD docker pull portainer/portainer-ce:latest -msg_ok "Pulled Portainer $PORTAINER_LATEST_VERSION Image" - -msg_info "Installing Portainer $PORTAINER_LATEST_VERSION" -$STD docker volume create portainer_data -$STD docker run -d \ - -p 8000:8000 \ - -p 9443:9443 \ - --name=portainer \ - --restart=always \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v portainer_data:/data \ - portainer/portainer-ce:latest -msg_ok "Installed Portainer $PORTAINER_LATEST_VERSION" - -msg_info "Pulling Home Assistant $CORE_LATEST_VERSION Image" -$STD docker pull ghcr.io/home-assistant/home-assistant:stable -msg_ok "Pulled Home Assistant $CORE_LATEST_VERSION Image" - -msg_info "Installing Home Assistant $CORE_LATEST_VERSION" -$STD docker volume create hass_config -$STD docker run -d \ - --name homeassistant \ - --privileged \ - --restart unless-stopped \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v /dev:/dev \ - -v hass_config:/config \ - -v /etc/localtime:/etc/localtime:ro \ - --net=host \ - ghcr.io/home-assistant/home-assistant:stable -mkdir /root/hass_config -msg_ok "Installed Home Assistant $CORE_LATEST_VERSION" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/jellyfin-install.sh b/install/arm/jellyfin-install.sh deleted file mode 100644 index 8a68c47d..00000000 --- a/install/arm/jellyfin-install.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://jellyfin.org/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_custom "ℹ️" "${GN}" "If NVIDIA GPU passthrough is detected, you'll be asked whether to install drivers in the container" -setup_hwaccel - -msg_info "Installing Jellyfin" -VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" -if ! dpkg -s libjemalloc2 >/dev/null 2>&1; then - $STD apt install -y libjemalloc2 -fi -if [[ ! -f /usr/lib/libjemalloc.so ]]; then - ln -sf /usr/lib/aarch64-linux-gnu/libjemalloc.so.2 /usr/lib/libjemalloc.so -fi -if [[ ! -d /etc/apt/keyrings ]]; then - mkdir -p /etc/apt/keyrings -fi -curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | gpg --dearmor --yes --output /etc/apt/keyrings/jellyfin.gpg -cat </etc/apt/sources.list.d/jellyfin.sources -Types: deb -URIs: https://repo.jellyfin.org/${PCT_OSTYPE} -Suites: ${VERSION} -Components: main -Architectures: arm64 -Signed-By: /etc/apt/keyrings/jellyfin.gpg -EOF - -$STD apt update -$STD apt install -y jellyfin -# Configure log rotation to prevent disk fill (keeps fail2ban compatibility) (PR: #1690 / Issue: #11224) -cat </etc/logrotate.d/jellyfin -/var/log/jellyfin/*.log { - daily - rotate 3 - maxsize 100M - missingok - notifempty - compress - delaycompress - copytruncate -} -EOF -chown -R jellyfin:adm /etc/jellyfin -sleep 10 -systemctl restart jellyfin -if [[ "$CTTYPE" == "0" ]]; then - sed -i -e 's/^ssl-cert:x:104:$/render:x:104:root,jellyfin/' -e 's/^render:x:108:root,jellyfin$/ssl-cert:x:108:/' /etc/group -else - sed -i -e 's/^ssl-cert:x:104:$/render:x:104:jellyfin/' -e 's/^render:x:108:jellyfin$/ssl-cert:x:108:/' /etc/group -fi -msg_ok "Installed Jellyfin" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/kima-hub-install.sh b/install/arm/kima-hub-install.sh deleted file mode 100644 index 71f1e9a4..00000000 --- a/install/arm/kima-hub-install.sh +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: MickLesk -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://www.kimai.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 \ - apt-transport-https \ - apache2 \ - git \ - expect -msg_ok "Installed Dependencies" - -setup_mariadb -PHP_VERSION="8.4" PHP_APACHE="YES" setup_php -setup_composer - -msg_info "Setting up database" -DB_NAME=kimai_db -DB_USER=kimai -DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) -MYSQL_VERSION=$(mariadb --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+') -$STD mariadb -e "CREATE DATABASE $DB_NAME;" -$STD mariadb -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';" -$STD mariadb -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;" -{ - echo "Kimai-Credentials" - echo "Kimai Database User: $DB_USER" - echo "Kimai Database Password: $DB_PASS" - echo "Kimai Database Name: $DB_NAME" -} >>~/kimai.creds -msg_ok "Set up database" - -fetch_and_deploy_gh_release "kimai" "kimai/kimai" "tarball" - -msg_info "Setup Kimai" -cd /opt/kimai -echo "export COMPOSER_ALLOW_SUPERUSER=1" >>~/.bashrc -source ~/.bashrc -$STD composer install --no-dev --optimize-autoloader --no-interaction -cp .env.dist .env -sed -i "/^DATABASE_URL=/c\DATABASE_URL=mysql://$DB_USER:$DB_PASS@127.0.0.1:3306/$DB_NAME?charset=utf8mb4&serverVersion=mariadb-$MYSQL_VERSION" /opt/kimai/.env -$STD bin/console kimai:install -n -$STD expect </opt/kimai/config/packages/local.yaml -kimai: - timesheet: - rounding: - default: - begin: 15 - end: 15 - -EOF -msg_ok "Installed Kimai" - -msg_info "Creating Service" -cat </etc/apache2/sites-available/kimai.conf - - ServerAdmin webmaster@localhost - DocumentRoot /opt/kimai/public/ - - - Options FollowSymLinks - AllowOverride All - Require all granted - - - ErrorLog /var/log/apache2/error.log - CustomLog /var/log/apache2/access.log combined - - -EOF -$STD a2ensite kimai.conf -$STD a2dissite 000-default.conf -$STD systemctl reload apache2 -msg_ok "Created Service" - -msg_info "Setup Permissions" -chown -R :www-data /opt/* -chmod -R g+r /opt/* -chmod -R g+rw /opt/* -chown -R www-data:www-data /opt/* -chmod -R 777 /opt/* -msg_ok "Setup Permissions" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/lubelogger-install.sh b/install/arm/lubelogger-install.sh deleted file mode 100644 index 893e5c43..00000000 --- a/install/arm/lubelogger-install.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 community-scripts ORG -# Author: kristocopani -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://lubelogger.com/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -fetch_and_deploy_gh_release "lubelogger" "hargata/lubelog" "prebuild" "latest" "/opt/lubelogger" "LubeLogger*linux_x64.zip" - -msg_info "Configuring LubeLogger" -cd /opt/lubelogger -chmod 700 /opt/lubelogger/CarCareTracker -cp /opt/lubelogger/appsettings.json /opt/lubelogger/appsettings_bak.json -jq '.Kestrel = {"Endpoints": {"Http": {"Url": "http://0.0.0.0:5000"}}}' /opt/lubelogger/appsettings_bak.json >/opt/lubelogger/appsettings.json -rm -rf /opt/lubelogger/appsettings_bak.json -msg_ok "Configured LubeLogger" - -msg_info "Creating Service" -cat </etc/systemd/system/lubelogger.service -[Unit] -Description=LubeLogger Daemon -After=network.target - -[Service] -User=root - -Type=simple -WorkingDirectory=/opt/lubelogger -ExecStart=/opt/lubelogger/CarCareTracker -TimeoutStopSec=20 -KillMode=process -Restart=on-failure - -[Install] -WantedBy=multi-user.target -EOF - -systemctl enable -q --now lubelogger -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/pihole-install.sh b/install/arm/pihole-install.sh deleted file mode 100644 index 24ef9d31..00000000 --- a/install/arm/pihole-install.sh +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://pi-hole.net/ - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_warn "WARNING: This script will run an external installer from a third-party source (https://pi-hole.net/)." -msg_warn "The following code is NOT maintained or audited by our repository." -msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:" -msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→ https://install.pi-hole.net" -echo -read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM -if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then - msg_error "Aborted by user. No changes have been made." - exit 10 -fi - -msg_info "Installing Dependencies" -$STD apt install -y ufw -msg_ok "Installed Dependencies" - -msg_info "Installing Pi-hole" -mkdir -p /etc/pihole -touch /etc/pihole/pihole.toml -$STD bash <(curl -fsSL https://install.pi-hole.net) --unattended -sed -i -E ' -/^\s*upstreams =/ s|=.*|= ["8.8.8.8", "8.8.4.4"]| -/^\s*interface =/ s|=.*|= "eth0"| -/^\s*queryLogging =/ s|=.*|= true| -/^\s*size =/ s|=.*|= 10000| -/^\s*active =/ s|=.*|= true| -/^\s*listeningMode =/ s|=.*|= "LOCAL"| -/^\s*port =/ s|=.*|= "80o,443os,[::]:80o,[::]:443os"| -/^\s*pwhash =/ s|=.*|= ""| - -# DHCP Disable -/^\s*\[dhcp\]/,/^\s*\[/{s/^\s*active = true/ active = false/} - -# NTP Disable -/^\s*\[ntp.ipv4\]/,/^\s*\[/{s/^\s*active = true/ active = false/} -/^\s*\[ntp.ipv6\]/,/^\s*\[/{s/^\s*active = true/ active = false/} -/^\s*\[ntp.sync\]/,/^\s*\[/{s/^\s*active = true/ active = false/} -/^\s*\[ntp.sync\]/,/^\s*\[/{s/^\s*interval = [0-9]+/ interval = 0/} -/^\s*\[ntp.sync.rtc\]/,/^\s*\[/{s/^\s*set = true/ set = false/} - -# set domainNeeded und expandHosts -/^\s*domainNeeded =/ s|=.*|= true| -/^\s*expandHosts =/ s|=.*|= true| -' /etc/pihole/pihole.toml - -cat </etc/dnsmasq.d/01-pihole.conf -server=8.8.8.8 -server=8.8.4.4 -EOF -$STD pihole-FTL --config ntp.sync.interval 0 -systemctl restart pihole-FTL.service -msg_ok "Installed Pi-hole" - -read -r -p "${TAB3}Would you like to add Unbound? " prompt -if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then - read -r -p "${TAB3}Unbound is configured as a recursive DNS server by default, would you like it to be configured as a forwarding DNS server (using DNS-over-TLS (DoT)) instead? " prompt - msg_info "Installing Unbound" - mkdir -p /etc/unbound/unbound.conf.d - cat </etc/unbound/unbound.conf.d/pi-hole.conf -server: - verbosity: 0 - interface: 127.0.0.1 - port: 5335 - do-ip6: no - do-ip4: yes - do-udp: yes - do-tcp: yes - num-threads: 1 - hide-identity: yes - hide-version: yes - harden-glue: yes - harden-dnssec-stripped: yes - harden-referral-path: yes - use-caps-for-id: no - harden-algo-downgrade: no - qname-minimisation: yes - aggressive-nsec: yes - rrset-roundrobin: yes - cache-min-ttl: 300 - cache-max-ttl: 14400 - msg-cache-slabs: 8 - rrset-cache-slabs: 8 - infra-cache-slabs: 8 - key-cache-slabs: 8 - serve-expired: yes - serve-expired-ttl: 3600 - edns-buffer-size: 1232 - prefetch: yes - prefetch-key: yes - target-fetch-policy: "3 2 1 1 1" - unwanted-reply-threshold: 10000000 - rrset-cache-size: 256m - msg-cache-size: 128m - so-rcvbuf: 1m - private-address: 192.168.0.0/16 - private-address: 169.254.0.0/16 - private-address: 172.16.0.0/12 - private-address: 10.0.0.0/8 - private-address: fd00::/8 - private-address: fe80::/10 -EOF - mkdir -p /etc/dnsmasq.d/ - cat </etc/dnsmasq.d/99-edns.conf -edns-packet-max=1232 -EOF - - if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then - cat <>/etc/unbound/unbound.conf.d/pi-hole.conf - tls-cert-bundle: "/etc/ssl/certs/ca-certificates.crt" -forward-zone: - name: "." - forward-tls-upstream: yes - forward-first: no - - forward-addr: 8.8.8.8@853#dns.google - forward-addr: 8.8.4.4@853#dns.google - forward-addr: 2001:4860:4860::8888@853#dns.google - forward-addr: 2001:4860:4860::8844@853#dns.google - - #forward-addr: 1.1.1.1@853#cloudflare-dns.com - #forward-addr: 1.0.0.1@853#cloudflare-dns.com - #forward-addr: 2606:4700:4700::1111@853#cloudflare-dns.com - #forward-addr: 2606:4700:4700::1001@853#cloudflare-dns.com - - #forward-addr: 9.9.9.9@853#dns.quad9.net - #forward-addr: 149.112.112.112@853#dns.quad9.net - #forward-addr: 2620:fe::fe@853#dns.quad9.net - #forward-addr: 2620:fe::9@853#dns.quad9.net -EOF - fi - $STD apt install -y unbound - cat </etc/dnsmasq.d/01-pihole.conf -server=127.0.0.1#5335 -server=8.8.8.8 -server=8.8.4.4 -EOF - - sed -i -E '/^\s*upstreams\s*=\s*\[/,/^\s*\]/c\ upstreams = [\n "127.0.0.1#5335",\n "8.8.4.4"\n ]' /etc/pihole/pihole.toml - systemctl restart unbound - systemctl restart pihole-FTL.service - msg_ok "Installed Unbound" -fi - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/rdtclient-install.sh b/install/arm/rdtclient-install.sh deleted file mode 100644 index 784107f3..00000000 --- a/install/arm/rdtclient-install.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/rogerfar/rdt-client - -source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" -color -verb_ip6 -catch_errors -setting_up_container -network_check -update_os - -msg_info "Installing Dependencies" -$STD apt-get install -y unzip -msg_ok "Installed Dependencies" - -msg_info "Installing ASP.NET Core Runtime" -$STD apt-get install -y libc6 -$STD apt-get install -y libgcc1 -$STD apt-get install -y libgssapi-krb5-2 -$STD apt-get install -y libicu72 -$STD apt-get install -y liblttng-ust1 -$STD apt-get install -y libssl3 -$STD apt-get install -y libstdc++6 -$STD apt-get install -y zlib1g - -curl -SL -o dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/6f79d99b-dc38-4c44-a549-32329419bb9f/a411ec38fb374e3a4676647b236ba021/dotnet-sdk-9.0.100-linux-arm64.tar.gz -mkdir -p /usr/share/dotnet -$STD tar -zxf dotnet.tar.gz -C /usr/share/dotnet -$STD ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet -msg_ok "Installed ASP.NET Core Runtime" - -fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip" - -msg_info "Setting up rdtclient" -cd /opt/rdtc -mkdir -p data/{db,downloads} -sed -i 's#/data/db/#/opt/rdtc&#g' /opt/rdtc/appsettings.json -msg_ok "Configured rdtclient" - -msg_info "Creating Service" -cat </etc/systemd/system/rdtc.service -[Unit] -Description=RdtClient Service - -[Service] -WorkingDirectory=/opt/rdtc -ExecStart=/usr/bin/dotnet RdtClient.Web.dll -SyslogIdentifier=RdtClient -User=root - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now rdtc -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc diff --git a/install/arm/vaultwarden-install.sh b/install/arm/vaultwarden-install.sh deleted file mode 100644 index a2c02db8..00000000 --- a/install/arm/vaultwarden-install.sh +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2021-2026 tteck -# Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE -# Source: https://github.com/dani-garcia/vaultwarden - -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 \ - pkgconf \ - libssl-dev \ - libmariadb-dev-compat \ - libpq-dev \ - argon2 \ - ssl-cert -msg_ok "Installed Dependencies" - -setup_rust -fetch_and_deploy_gh_release "vaultwarden" "dani-garcia/vaultwarden" "tarball" "latest" "/tmp/vaultwarden-src" - -msg_info "Building Vaultwarden (Patience)" -cd /tmp/vaultwarden-src -VW_VERSION=$(get_latest_github_release "dani-garcia/vaultwarden") -export VW_VERSION -$STD cargo build --features "sqlite,mysql,postgresql" --release -msg_ok "Built Vaultwarden" - -msg_info "Setting up Vaultwarden" -$STD addgroup --system vaultwarden -$STD adduser --system --home /opt/vaultwarden --shell /usr/sbin/nologin --no-create-home --gecos 'vaultwarden' --ingroup vaultwarden --disabled-login --disabled-password vaultwarden -mkdir -p /opt/vaultwarden/{bin,data,web-vault} -cp target/release/vaultwarden /opt/vaultwarden/bin/ -cd ~ && rm -rf /tmp/vaultwarden-src -msg_ok "Set up Vaultwarden" - -fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz" - -msg_info "Configuring Vaultwarden" -cat </opt/vaultwarden/.env -ADMIN_TOKEN='' -ROCKET_ADDRESS=0.0.0.0 -ROCKET_TLS='{certs="/opt/vaultwarden/ssl-cert-snakeoil.pem",key="/opt/vaultwarden/ssl-cert-snakeoil.key"}' -DATA_FOLDER=/opt/vaultwarden/data -DATABASE_MAX_CONNS=10 -WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault -WEB_VAULT_ENABLED=true -EOF -mv /etc/ssl/certs/ssl-cert-snakeoil.pem /opt/vaultwarden/ -mv /etc/ssl/private/ssl-cert-snakeoil.key /opt/vaultwarden/ - -chown -R vaultwarden:vaultwarden /opt/vaultwarden/ -chown root:root /opt/vaultwarden/bin/vaultwarden -chmod +x /opt/vaultwarden/bin/vaultwarden -chown -R root:root /opt/vaultwarden/web-vault/ -chmod +r /opt/vaultwarden/.env -msg_ok "Configured Vaultwarden" - -msg_info "Creating Service" -cat </etc/systemd/system/vaultwarden.service -[Unit] -Description=Bitwarden Server (Powered by Vaultwarden) -Documentation=https://github.com/dani-garcia/vaultwarden -After=network.target - -[Service] -User=vaultwarden -Group=vaultwarden -EnvironmentFile=-/opt/vaultwarden/.env -ExecStart=/opt/vaultwarden/bin/vaultwarden -LimitNOFILE=65535 -LimitNPROC=4096 -PrivateTmp=true -PrivateDevices=true -ProtectHome=true -ProtectSystem=strict -DevicePolicy=closed -ProtectControlGroups=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -RestrictNamespaces=yes -RestrictRealtime=yes -MemoryDenyWriteExecute=yes -LockPersonality=yes -WorkingDirectory=/opt/vaultwarden -ReadWriteDirectories=/opt/vaultwarden/data -AmbientCapabilities=CAP_NET_BIND_SERVICE - -[Install] -WantedBy=multi-user.target -EOF -systemctl enable -q --now vaultwarden -msg_ok "Created Service" - -motd_ssh -customize -cleanup_lxc From a9460e9994382ae3f54d14eb7fcdc9b155664fb7 Mon Sep 17 00:00:00 2001 From: Sam Heinz <54530346+asylumexp@users.noreply.github.com> Date: Fri, 22 May 2026 23:26:06 +1000 Subject: [PATCH 24/37] update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fb667408..80fd8294 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ vm/vm-manager.sh vm/debian-13-vm.sh stars.json stars.txt +.DS_Store From 8e477b1fcab9b1b28c9b85ae63e3a982ceb9ac17 Mon Sep 17 00:00:00 2001 From: Sam Heinz <54530346+asylumexp@users.noreply.github.com> Date: Fri, 22 May 2026 23:44:47 +1000 Subject: [PATCH 25/37] set 'var_arm64' to no for all cts --- ct/affine.sh | 1 + ct/airflow.sh | 1 + ct/akaunting.sh | 1 + ct/aliasvault.sh | 1 + ct/almalinux.sh | 1 + ct/alpine-cinny.sh | 1 + ct/alpine.sh | 1 + ct/archlinux.sh | 1 + ct/baserow.sh | 1 + ct/bitfocus-companion.sh | 1 + ct/blinko.sh | 1 + ct/bunkerm.sh | 1 + ct/caddymanager.sh | 1 + ct/centos.sh | 1 + ct/certimate.sh | 1 + ct/clickhouse.sh | 1 + ct/cliproxyapi.sh | 1 + ct/colanode.sh | 1 + ct/cyberchef.sh | 1 + ct/ddns-updater.sh | 1 + ct/debian.sh | 1 + ct/deferred/arm.sh | 1 + ct/deferred/docspell.sh | 1 + ct/deferred/jumpserver.sh | 1 + ct/deferred/maxun.sh | 1 + ct/deferred/ocis.sh | 1 + ct/deferred/piler.sh | 1 + ct/deferred/polaris.sh | 1 + ct/deferred/roundcubemail.sh | 1 + ct/deferred/rybbit.sh | 1 + ct/deferred/transmission-openvpn.sh | 1 + ct/devuan.sh | 1 + ct/discourse.sh | 1 + ct/dynacat.sh | 1 + ct/edit-mind.sh | 1 + ct/ente.sh | 1 + ct/etherpad.sh | 1 + ct/excalidash.sh | 1 + ct/fedora.sh | 1 + ct/flame.sh | 1 + ct/flaresolverr.sh | 1 + ct/fleet.sh | 1 + ct/forgejo-runner.sh | 1 + ct/garmin-grafana.sh | 1 + ct/gentoo.sh | 1 + ct/gluetun.sh | 1 + ct/godoxy.sh | 1 + ct/hermesagent.sh | 1 + ct/invidious.sh | 1 + ct/invoiceshelf.sh | 1 + ct/kan.sh | 1 + ct/lidarr.sh | 1 + ct/localagi.sh | 1 + ct/matterjs-server.sh | 1 + ct/nezha.sh | 1 + ct/openeuler.sh | 1 + ct/opensuse.sh | 1 + ct/oxicloud.sh | 1 + ct/paperclip.sh | 1 + ct/papermark.sh | 1 + ct/pixelfed.sh | 1 + ct/plane.sh | 1 + ct/postiz.sh | 1 + ct/prowlarr.sh | 1 + ct/puter.sh | 1 + ct/qbittorrent.sh | 1 + ct/radarr.sh | 1 + ct/rdtclient.sh | 1 + ct/rockylinux.sh | 1 + ct/rss-bridge.sh | 1 + ct/sabnzbd.sh | 1 + ct/seerr.sh | 1 + ct/shiori.sh | 1 + ct/shlink.sh | 1 + ct/simplelogin.sh | 1 + ct/skylite-ux.sh | 1 + ct/slink.sh | 1 + ct/slskd.sh | 1 + ct/sonarr.sh | 1 + ct/spliit.sh | 1 + ct/squid.sh | 1 + ct/stoatchat.sh | 1 + ct/surrealdb.sh | 1 + ct/tolgee.sh | 1 + ct/tor-snowflake.sh | 1 + ct/twenty.sh | 1 + ct/ubuntu.sh | 1 + ct/web-check.sh | 1 + ct/xyops.sh | 1 + ct/zitadel.sh | 1 + 90 files changed, 90 insertions(+) diff --git a/ct/affine.sh b/ct/affine.sh index 31854548..9a2eeca6 100644 --- a/ct/affine.sh +++ b/ct/affine.sh @@ -13,6 +13,7 @@ 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" diff --git a/ct/airflow.sh b/ct/airflow.sh index e1564786..0e9f55d4 100644 --- a/ct/airflow.sh +++ b/ct/airflow.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-16}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/akaunting.sh b/ct/akaunting.sh index bb6df16e..d939a073 100644 --- a/ct/akaunting.sh +++ b/ct/akaunting.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/aliasvault.sh b/ct/aliasvault.sh index 534c8b79..a03512a8 100644 --- a/ct/aliasvault.sh +++ b/ct/aliasvault.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-6144}" var_disk="${var_disk:-30}" var_os="${var_os:-debian}" var_version="${var_version:-12}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/almalinux.sh b/ct/almalinux.sh index 8e421d59..5522d8a0 100644 --- a/ct/almalinux.sh +++ b/ct/almalinux.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-almalinux}" var_version="${var_version:-10}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/alpine-cinny.sh b/ct/alpine-cinny.sh index bba4869c..6a4e6cce 100644 --- a/ct/alpine-cinny.sh +++ b/ct/alpine-cinny.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-256}" var_disk="${var_disk:-1}" var_os="${var_os:-alpine}" var_version="${var_version:-3.23}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" var_nesting="${var_nesting:-0}" diff --git a/ct/alpine.sh b/ct/alpine.sh index f9a814db..5da30046 100644 --- a/ct/alpine.sh +++ b/ct/alpine.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-5}" var_os="${var_os:-alpine}" var_version="${var_version:-3.22}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/archlinux.sh b/ct/archlinux.sh index 64ff64a9..b9bdfdb0 100644 --- a/ct/archlinux.sh +++ b/ct/archlinux.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-archlinux}" var_version="${var_version:-base}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/baserow.sh b/ct/baserow.sh index 78ec15bb..b83509c2 100644 --- a/ct/baserow.sh +++ b/ct/baserow.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-8192}" var_disk="${var_disk:-15}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/bitfocus-companion.sh b/ct/bitfocus-companion.sh index 2a951cd5..32816275 100644 --- a/ct/bitfocus-companion.sh +++ b/ct/bitfocus-companion.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-8}" var_os="${var_os:-debian}" var_version="${var_version:-12}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/blinko.sh b/ct/blinko.sh index 9e00b180..8b800b07 100644 --- a/ct/blinko.sh +++ b/ct/blinko.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}" 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" diff --git a/ct/bunkerm.sh b/ct/bunkerm.sh index 97c3fadc..f31f4e9b 100644 --- a/ct/bunkerm.sh +++ b/ct/bunkerm.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/caddymanager.sh b/ct/caddymanager.sh index db1a225d..8c0e0c72 100644 --- a/ct/caddymanager.sh +++ b/ct/caddymanager.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/centos.sh b/ct/centos.sh index 6ce04dbf..572cc67b 100644 --- a/ct/centos.sh +++ b/ct/centos.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-centos}" var_version="${var_version:-9}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/certimate.sh b/ct/certimate.sh index cd430ca9..d3f92a2d 100644 --- a/ct/certimate.sh +++ b/ct/certimate.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-256}" var_disk="${var_disk:-2}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/clickhouse.sh b/ct/clickhouse.sh index 4c6ede16..e6f9e4e0 100644 --- a/ct/clickhouse.sh +++ b/ct/clickhouse.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-10}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/cliproxyapi.sh b/ct/cliproxyapi.sh index b23bd31e..67976332 100644 --- a/ct/cliproxyapi.sh +++ b/ct/cliproxyapi.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-2}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/colanode.sh b/ct/colanode.sh index 41f0f7bd..1d23bacb 100644 --- a/ct/colanode.sh +++ b/ct/colanode.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-16}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/cyberchef.sh b/ct/cyberchef.sh index 6abc0758..4b39f909 100644 --- a/ct/cyberchef.sh +++ b/ct/cyberchef.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/ddns-updater.sh b/ct/ddns-updater.sh index 506d3cf9..612e19cf 100644 --- a/ct/ddns-updater.sh +++ b/ct/ddns-updater.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-2}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/debian.sh b/ct/debian.sh index fb7b4785..31fd0db8 100644 --- a/ct/debian.sh +++ b/ct/debian.sh @@ -13,6 +13,7 @@ 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}" var_gpu="${var_gpu:-yes}" #var_fuse="${var_fuse:-no}" diff --git a/ct/deferred/arm.sh b/ct/deferred/arm.sh index 0270a829..142f2413 100644 --- a/ct/deferred/arm.sh +++ b/ct/deferred/arm.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-16}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-0}" header_info "$APP" diff --git a/ct/deferred/docspell.sh b/ct/deferred/docspell.sh index b78d5373..ecd27d20 100644 --- a/ct/deferred/docspell.sh +++ b/ct/deferred/docspell.sh @@ -13,6 +13,7 @@ var_cpu="${var_cpu:-4}" var_ram="${var_ram:-2048}" var_os="${var_os:-debian}" var_version="${var_version:-12}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/deferred/jumpserver.sh b/ct/deferred/jumpserver.sh index dcc3e208..c91ceded 100644 --- a/ct/deferred/jumpserver.sh +++ b/ct/deferred/jumpserver.sh @@ -13,6 +13,7 @@ var_ram="8192" var_disk="60" var_os="debian" var_version="12" +var_arm64="${var_arm64:-no}" var_unprivileged="1" header_info "$APP" diff --git a/ct/deferred/maxun.sh b/ct/deferred/maxun.sh index 226c8dec..b404c4bf 100644 --- a/ct/deferred/maxun.sh +++ b/ct/deferred/maxun.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-10}" var_os="${var_os:-debian}" var_version="${var_version:-12}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/deferred/ocis.sh b/ct/deferred/ocis.sh index ed67ef4a..6f9fb152 100644 --- a/ct/deferred/ocis.sh +++ b/ct/deferred/ocis.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-10}" var_os="${var_os:-debian}" var_version="${var_version:-12}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/deferred/piler.sh b/ct/deferred/piler.sh index a6dfcf65..72bf39c0 100644 --- a/ct/deferred/piler.sh +++ b/ct/deferred/piler.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-20}" var_os="${var_os:-ubuntu}" var_version="${var_version:-24.04}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/deferred/polaris.sh b/ct/deferred/polaris.sh index e0394e05..1ec31952 100644 --- a/ct/deferred/polaris.sh +++ b/ct/deferred/polaris.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-7}" var_os="${var_os:-debian}" var_version="${var_version:-12}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/deferred/roundcubemail.sh b/ct/deferred/roundcubemail.sh index 0c74f702..58214b32 100644 --- a/ct/deferred/roundcubemail.sh +++ b/ct/deferred/roundcubemail.sh @@ -13,6 +13,7 @@ var_cpu="${var_cpu:-1}" var_ram="${var_ram:-1024}" var_os="${var_os:-debian}" var_version="${var_version:-12}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/deferred/rybbit.sh b/ct/deferred/rybbit.sh index aceaf970..9f1109fb 100644 --- a/ct/deferred/rybbit.sh +++ b/ct/deferred/rybbit.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-5}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/deferred/transmission-openvpn.sh b/ct/deferred/transmission-openvpn.sh index 763c7836..e38f5717 100644 --- a/ct/deferred/transmission-openvpn.sh +++ b/ct/deferred/transmission-openvpn.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" 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}" var_tun="${var_tun:-yes}" diff --git a/ct/devuan.sh b/ct/devuan.sh index 5d88e41d..a66e491c 100644 --- a/ct/devuan.sh +++ b/ct/devuan.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-devuan}" var_version="${var_version:-5.0}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/discourse.sh b/ct/discourse.sh index 2ddb8c10..d3c9fd10 100644 --- a/ct/discourse.sh +++ b/ct/discourse.sh @@ -13,6 +13,7 @@ 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}" header_info "$APP" diff --git a/ct/dynacat.sh b/ct/dynacat.sh index ea3b65ac..63969ff8 100644 --- a/ct/dynacat.sh +++ b/ct/dynacat.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-6}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/edit-mind.sh b/ct/edit-mind.sh index 8132844a..c0bc1ec0 100644 --- a/ct/edit-mind.sh +++ b/ct/edit-mind.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-8192}" var_disk="${var_disk:-32}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/ente.sh b/ct/ente.sh index 97a46f4a..8398dce2 100644 --- a/ct/ente.sh +++ b/ct/ente.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-6144}" 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" diff --git a/ct/etherpad.sh b/ct/etherpad.sh index f69eb9a2..d8e6c7fd 100755 --- a/ct/etherpad.sh +++ b/ct/etherpad.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/excalidash.sh b/ct/excalidash.sh index d2a0a942..1720da9a 100644 --- a/ct/excalidash.sh +++ b/ct/excalidash.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/fedora.sh b/ct/fedora.sh index e011ec38..36435690 100644 --- a/ct/fedora.sh +++ b/ct/fedora.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-fedora}" var_version="${var_version:-43}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/flame.sh b/ct/flame.sh index ba2b2227..10ed3ec7 100644 --- a/ct/flame.sh +++ b/ct/flame.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/flaresolverr.sh b/ct/flaresolverr.sh index de4e5fbd..7bfa80ac 100644 --- a/ct/flaresolverr.sh +++ b/ct/flaresolverr.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/fleet.sh b/ct/fleet.sh index 89564429..8cd68f7c 100644 --- a/ct/fleet.sh +++ b/ct/fleet.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-8}" var_os="${var_os:-debian}" var_version="${var_version:-12}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/forgejo-runner.sh b/ct/forgejo-runner.sh index f50c169a..dd7132e2 100644 --- a/ct/forgejo-runner.sh +++ b/ct/forgejo-runner.sh @@ -13,6 +13,7 @@ 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}" var_nesting="${var_nesting:-1}" diff --git a/ct/garmin-grafana.sh b/ct/garmin-grafana.sh index e02047d8..5824b0d4 100644 --- a/ct/garmin-grafana.sh +++ b/ct/garmin-grafana.sh @@ -13,6 +13,7 @@ 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" diff --git a/ct/gentoo.sh b/ct/gentoo.sh index cf6e88e9..43137cb8 100644 --- a/ct/gentoo.sh +++ b/ct/gentoo.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-8}" var_os="${var_os:-gentoo}" var_version="${var_version:-current}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/gluetun.sh b/ct/gluetun.sh index 361e48b3..39052bd0 100644 --- a/ct/gluetun.sh +++ b/ct/gluetun.sh @@ -12,6 +12,7 @@ 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}" var_tun="${var_tun:-yes}" diff --git a/ct/godoxy.sh b/ct/godoxy.sh index e4fa530a..83f795d3 100644 --- a/ct/godoxy.sh +++ b/ct/godoxy.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-2}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/hermesagent.sh b/ct/hermesagent.sh index a2382a34..33c25a7f 100644 --- a/ct/hermesagent.sh +++ b/ct/hermesagent.sh @@ -12,6 +12,7 @@ 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}" header_info "$APP" diff --git a/ct/invidious.sh b/ct/invidious.sh index 35da1a48..7c56db52 100644 --- a/ct/invidious.sh +++ b/ct/invidious.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}" 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" diff --git a/ct/invoiceshelf.sh b/ct/invoiceshelf.sh index ad6338db..6f3012f0 100644 --- a/ct/invoiceshelf.sh +++ b/ct/invoiceshelf.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/kan.sh b/ct/kan.sh index 2fad8f64..d96dc350 100644 --- a/ct/kan.sh +++ b/ct/kan.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-12}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/lidarr.sh b/ct/lidarr.sh index 0ae5996e..b8eb3eeb 100644 --- a/ct/lidarr.sh +++ b/ct/lidarr.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/localagi.sh b/ct/localagi.sh index d6bd7a54..4d3ce7f0 100644 --- a/ct/localagi.sh +++ b/ct/localagi.sh @@ -12,6 +12,7 @@ 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}" diff --git a/ct/matterjs-server.sh b/ct/matterjs-server.sh index f98488ef..b0118683 100644 --- a/ct/matterjs-server.sh +++ b/ct/matterjs-server.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/nezha.sh b/ct/nezha.sh index 6acdf924..438bc392 100644 --- a/ct/nezha.sh +++ b/ct/nezha.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/openeuler.sh b/ct/openeuler.sh index eabe482e..dc3e287b 100644 --- a/ct/openeuler.sh +++ b/ct/openeuler.sh @@ -19,6 +19,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-openeuler}" var_version="${var_version:-25.03}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/opensuse.sh b/ct/opensuse.sh index 3d282472..ebec752c 100644 --- a/ct/opensuse.sh +++ b/ct/opensuse.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-opensuse}" var_version="${var_version:-16.0}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/oxicloud.sh b/ct/oxicloud.sh index 62f5f196..56cd4a03 100644 --- a/ct/oxicloud.sh +++ b/ct/oxicloud.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-3072}" 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" diff --git a/ct/paperclip.sh b/ct/paperclip.sh index 4bae19d8..453e2c89 100644 --- a/ct/paperclip.sh +++ b/ct/paperclip.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/papermark.sh b/ct/papermark.sh index 89014718..3d80a443 100644 --- a/ct/papermark.sh +++ b/ct/papermark.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}" 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" diff --git a/ct/pixelfed.sh b/ct/pixelfed.sh index 9f14ab21..b0d210b2 100644 --- a/ct/pixelfed.sh +++ b/ct/pixelfed.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-10}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/plane.sh b/ct/plane.sh index 556805e5..b17e8741 100644 --- a/ct/plane.sh +++ b/ct/plane.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-6144}" 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" diff --git a/ct/postiz.sh b/ct/postiz.sh index bddd6c6a..56ba0327 100644 --- a/ct/postiz.sh +++ b/ct/postiz.sh @@ -13,6 +13,7 @@ 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" diff --git a/ct/prowlarr.sh b/ct/prowlarr.sh index 249a3356..020e4f10 100644 --- a/ct/prowlarr.sh +++ b/ct/prowlarr.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/puter.sh b/ct/puter.sh index 7c7967e4..830cf183 100644 --- a/ct/puter.sh +++ b/ct/puter.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/qbittorrent.sh b/ct/qbittorrent.sh index 63245083..417a7658 100644 --- a/ct/qbittorrent.sh +++ b/ct/qbittorrent.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/radarr.sh b/ct/radarr.sh index dc575038..5dc8325a 100644 --- a/ct/radarr.sh +++ b/ct/radarr.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/rdtclient.sh b/ct/rdtclient.sh index fed85ae3..52f1a012 100644 --- a/ct/rdtclient.sh +++ b/ct/rdtclient.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/rockylinux.sh b/ct/rockylinux.sh index 4dc9024d..d823cb13 100644 --- a/ct/rockylinux.sh +++ b/ct/rockylinux.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-rockylinux}" var_version="${var_version:-10}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/rss-bridge.sh b/ct/rss-bridge.sh index 8f4aa1f5..2057cf90 100644 --- a/ct/rss-bridge.sh +++ b/ct/rss-bridge.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-2}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/sabnzbd.sh b/ct/sabnzbd.sh index db510c0b..b7e92b75 100644 --- a/ct/sabnzbd.sh +++ b/ct/sabnzbd.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-5}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/seerr.sh b/ct/seerr.sh index 6c7b2abc..d15e3538 100644 --- a/ct/seerr.sh +++ b/ct/seerr.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-4096}" var_disk="${var_disk:-12}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/shiori.sh b/ct/shiori.sh index 6e8e526b..2649fcd4 100644 --- a/ct/shiori.sh +++ b/ct/shiori.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/shlink.sh b/ct/shlink.sh index 8cfdc7ed..76e99fd4 100644 --- a/ct/shlink.sh +++ b/ct/shlink.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/simplelogin.sh b/ct/simplelogin.sh index bfbf148a..29113be8 100644 --- a/ct/simplelogin.sh +++ b/ct/simplelogin.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-10}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/skylite-ux.sh b/ct/skylite-ux.sh index e84df958..3156ae64 100644 --- a/ct/skylite-ux.sh +++ b/ct/skylite-ux.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-4096}" 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" diff --git a/ct/slink.sh b/ct/slink.sh index dc57d972..e297381a 100644 --- a/ct/slink.sh +++ b/ct/slink.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-10}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/slskd.sh b/ct/slskd.sh index 1b1b983a..8d8290de 100644 --- a/ct/slskd.sh +++ b/ct/slskd.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/sonarr.sh b/ct/sonarr.sh index 0688e504..ad2f374a 100644 --- a/ct/sonarr.sh +++ b/ct/sonarr.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/spliit.sh b/ct/spliit.sh index 7a0b9ce7..d3654da6 100755 --- a/ct/spliit.sh +++ b/ct/spliit.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/squid.sh b/ct/squid.sh index f48fe95c..3aab9848 100644 --- a/ct/squid.sh +++ b/ct/squid.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/stoatchat.sh b/ct/stoatchat.sh index 432fcfff..b6b9937e 100644 --- a/ct/stoatchat.sh +++ b/ct/stoatchat.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-10240}" var_disk="${var_disk:-30}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/surrealdb.sh b/ct/surrealdb.sh index 70a35d31..bbccd5b6 100644 --- a/ct/surrealdb.sh +++ b/ct/surrealdb.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-1024}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/tolgee.sh b/ct/tolgee.sh index fe8be6ed..8cdc96f6 100644 --- a/ct/tolgee.sh +++ b/ct/tolgee.sh @@ -12,6 +12,7 @@ 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}" header_info "$APP" diff --git a/ct/tor-snowflake.sh b/ct/tor-snowflake.sh index 20397e45..92cd8637 100644 --- a/ct/tor-snowflake.sh +++ b/ct/tor-snowflake.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-4}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" var_nesting="${var_nesting:-0}" diff --git a/ct/twenty.sh b/ct/twenty.sh index e75af120..715c1e3a 100644 --- a/ct/twenty.sh +++ b/ct/twenty.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-10240}" 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" diff --git a/ct/ubuntu.sh b/ct/ubuntu.sh index bd0e8dd0..83ef79af 100644 --- a/ct/ubuntu.sh +++ b/ct/ubuntu.sh @@ -14,6 +14,7 @@ var_ram="${var_ram:-512}" var_disk="${var_disk:-2}" var_os="${var_os:-ubuntu}" var_version="${var_version:-24.04}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-0}" header_info "$APP" diff --git a/ct/web-check.sh b/ct/web-check.sh index 0764b522..51a95ba7 100644 --- a/ct/web-check.sh +++ b/ct/web-check.sh @@ -12,6 +12,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-12}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" diff --git a/ct/xyops.sh b/ct/xyops.sh index 43861b3a..a63ba696 100644 --- a/ct/xyops.sh +++ b/ct/xyops.sh @@ -12,6 +12,7 @@ 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" diff --git a/ct/zitadel.sh b/ct/zitadel.sh index 881e683b..90e4e2b4 100644 --- a/ct/zitadel.sh +++ b/ct/zitadel.sh @@ -13,6 +13,7 @@ var_ram="${var_ram:-2048}" var_disk="${var_disk:-6}" var_os="${var_os:-debian}" var_version="${var_version:-13}" +var_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" header_info "$APP" From 4eecc6ad702a0938ec8c2a0cedc124e4b629996e Mon Sep 17 00:00:00 2001 From: Sam Heinz <54530346+asylumexp@users.noreply.github.com> Date: Fri, 22 May 2026 23:50:19 +1000 Subject: [PATCH 26/37] update files in .github to support arm64 --- .github/ISSUE_TEMPLATE/new-script.yaml | 11 +++++++++++ .github/agents/pve-script-creator.agent.md | 5 ++++- .github/pull_request_template.md | 8 ++++++++ .github/workflows/push_json_to_pocketbase.yml | 1 + .github/workflows/unmet-pr-close.yml | 13 +++++++++++++ docs/contribution/GUIDE.md | 1 + docs/contribution/templates_ct/AppName.md | 2 ++ docs/contribution/templates_ct/AppName.sh | 2 ++ 8 files changed, 42 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/new-script.yaml b/.github/ISSUE_TEMPLATE/new-script.yaml index 419fd49b..e4ffbc8a 100644 --- a/.github/ISSUE_TEMPLATE/new-script.yaml +++ b/.github/ISSUE_TEMPLATE/new-script.yaml @@ -27,6 +27,17 @@ body: - PVE Tool (tools/pve) validations: required: true + - type: dropdown + id: arm64_support + attributes: + label: Does this script support arm64? + description: amd64 support is assumed. + options: + - arm64 supported + - arm64 not tested + - arm64 not supported + validations: + required: true - type: textarea id: task_details attributes: diff --git a/.github/agents/pve-script-creator.agent.md b/.github/agents/pve-script-creator.agent.md index 0fe427bf..ca88cc71 100644 --- a/.github/agents/pve-script-creator.agent.md +++ b/.github/agents/pve-script-creator.agent.md @@ -36,9 +36,10 @@ You are a specialist for creating and maintaining ProxmoxVED application scripts - All `apt` / `npm` / build commands must be prefixed with `$STD`. ### JSON Metadata -- Must include: `name`, `slug`, `categories`, `date_created`, `type`, `updateable`, `privileged`, `interface_port`, `documentation`, `website`, `logo`, `config_path`, `description`, `install_methods`, `default_credentials`, `notes`. +- Must include: `name`, `slug`, `categories`, `date_created`, `type`, `updateable`, `privileged`, `has_arm`, `interface_port`, `documentation`, `website`, `logo`, `config_path`, `description`, `install_methods`, `default_credentials`, `notes`. - `date_created` uses today's date (YYYY-MM-DD). - Resources in `install_methods` must match `var_*` values in the CT script. +- CT scripts must include `var_arm64="${var_arm64:-no}"` unless arm64 support has been verified. - Logo URL pattern: `https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/.webp` ## Checklist (verify before finishing) @@ -57,6 +58,8 @@ You are a specialist for creating and maintaining ProxmoxVED application scripts - [ ] `update_script()` present with backup/restore - [ ] Footer: `motd_ssh`, `customize`, `cleanup_lxc` - [ ] JSON metadata file matches CT script resources +- [ ] JSON `has_arm` accurately reflects arm64 support +- [ ] CT `var_arm64` accurately reflects arm64 support - [ ] Backups go to `/opt`, not `/tmp` ## Output Format diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0f59af6b..7e48f11e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -16,6 +16,14 @@ Link: # --- +## arm64 Support (**X** in brackets) + +- [ ] **arm64 supported** - Tested and supported on arm64. +- [ ] **arm64 not tested** - Assumed to work on arm64, but testing has not been done. +- [ ] **arm64 not supported** - Confirmed upstream dependencies or binaries do not support arm64. + +--- + ## 🛠️ Type of Change (**X** in brackets) - [ ] 🐞 **Bug fix** – Resolves an issue without breaking functionality. diff --git a/.github/workflows/push_json_to_pocketbase.yml b/.github/workflows/push_json_to_pocketbase.yml index b2fca5a1..67134418 100644 --- a/.github/workflows/push_json_to_pocketbase.yml +++ b/.github/workflows/push_json_to_pocketbase.yml @@ -230,6 +230,7 @@ jobs: if (resolvedType) payload.type = resolvedType; var resolvedCats = (data.categories || []).map(function(n) { return categoryNameToPbId[categoryIdToName[n]]; }).filter(Boolean); if (resolvedCats.length) payload.categories = resolvedCats; + if (data.has_arm !== undefined) payload.has_arm = data.has_arm === true || data.has_arm === 'true'; if (data.version !== undefined) payload.version = data.version; if (data.changelog !== undefined) payload.changelog = data.changelog; if (data.screenshots !== undefined) payload.screenshots = data.screenshots; diff --git a/.github/workflows/unmet-pr-close.yml b/.github/workflows/unmet-pr-close.yml index e107ecc6..a5c70e51 100644 --- a/.github/workflows/unmet-pr-close.yml +++ b/.github/workflows/unmet-pr-close.yml @@ -91,6 +91,19 @@ jobs: } } + const architectureOptions = [ + "**arm64 supported**", + "**arm64 not tested**", + "**arm64 not supported**" + ]; + const hasArchitectureSelection = architectureOptions.some(req => { + const line = findLine(req); + return line && checkboxChecked(line); + }); + if (!hasArchitectureSelection) { + missing.push("One arm64 support option (`arm64 supported`, `arm64 not tested`, or `arm64 not supported`) must be checked"); + } + if (missing.length > 0) { let list = ""; for (const m of missing) { diff --git a/docs/contribution/GUIDE.md b/docs/contribution/GUIDE.md index 52c4d950..52907b40 100644 --- a/docs/contribution/GUIDE.md +++ b/docs/contribution/GUIDE.md @@ -274,6 +274,7 @@ var_ram="2048" # Min RAM needed (MB) var_disk="10" # Min disk (GB) var_os="debian" # OS type var_version="12" # OS version +var_arm64="${var_arm64:-no}" # arm64 support (no unless verified) var_unprivileged="1" # Security (1=unprivileged) header_info "$APP" diff --git a/docs/contribution/templates_ct/AppName.md b/docs/contribution/templates_ct/AppName.md index 8507c7c2..504ac9ab 100644 --- a/docs/contribution/templates_ct/AppName.md +++ b/docs/contribution/templates_ct/AppName.md @@ -101,6 +101,7 @@ Example: >| `var_disk` | Disk capacity | In GB | >| `var_os` | Operating system | alpine, debian, ubuntu | >| `var_version` | OS version | e.g., 3.20, 11, 12, 20.04 | +>| `var_arm64` | arm64 support | `no` unless arm64 support is verified | >| `var_unprivileged` | Container type | 1 = Unprivileged, 0 = Privileged | Example: @@ -113,6 +114,7 @@ var_ram="2048" var_disk="4" var_os="debian" var_version="12" +var_arm64="${var_arm64:-no}" var_unprivileged="1" ``` diff --git a/docs/contribution/templates_ct/AppName.sh b/docs/contribution/templates_ct/AppName.sh index cf9333c4..8155ab30 100644 --- a/docs/contribution/templates_ct/AppName.sh +++ b/docs/contribution/templates_ct/AppName.sh @@ -20,6 +20,8 @@ var_os="[OS]" # Default OS (e.g. debian, ubuntu, alpine) var_version="[VERSION]" # Default OS version (e.g. 12 for debian, 24.04 for ubuntu, 3.20 for alpine) +var_arm64="${var_arm64:-no}" +# arm64 support status; default to no unless verified var_unprivileged="[UNPRIVILEGED]" # 1 = unprivileged container, 0 = privileged container From 7088b1e6b3ee4ad636408c4d31edd62c8ef7f43d Mon Sep 17 00:00:00 2001 From: Sam Heinz <54530346+asylumexp@users.noreply.github.com> Date: Sat, 23 May 2026 00:09:32 +1000 Subject: [PATCH 27/37] add has_arm: false to json files --- json/affine.json | 1 + json/airflow.json | 1 + json/akaunting.json | 1 + json/aliasvault.json | 1 + json/allstarlink.json | 1 + json/almalinux-10-vm.json | 1 + json/alpine-cinny.json | 1 + json/alpine-ntfy.json | 1 + json/archlinux.json | 1 + json/arm.json | 1 + json/arr-stack.json | 1 + json/authentik.json | 1 + json/baserow.json | 1 + json/bitfocus-companion.json | 1 + json/blinko.json | 1 + json/bunkerm.json | 1 + json/caddymanager.json | 1 + json/certimate.json | 1 + json/clickhouse.json | 1 + json/cliproxyapi.json | 1 + json/colanode.json | 1 + json/cyberchef.json | 1 + json/ddclient.json | 1 + json/ddns-updater.json | 1 + json/degoog.json | 1 + json/dependency-check.json | 1 + json/discourse.json | 1 + json/docuseal.json | 1 + json/dynacat.json | 1 + json/edit-mind.json | 1 + json/ente.json | 1 + json/erpnext.json | 1 + json/espconnect.json | 1 + json/etherpad.json | 1 + json/excalidash.json | 1 + json/flame.json | 1 + json/fleet.json | 1 + json/forgejo-runner.json | 1 + json/garmin-grafana.json | 1 + json/godoxy.json | 1 + json/hermesagent.json | 1 + json/invidious.json | 1 + json/invoiceshelf.json | 1 + json/jitsi.json | 1 + json/kan.json | 1 + json/labca.json | 1 + json/librechat.json | 1 + json/lobehub.json | 1 + json/localagi.json | 1 + json/lychee.json | 1 + json/matomo.json | 1 + json/matterjs-server.json | 1 + json/nagios.json | 1 + json/neko.json | 1 + json/netbird-server.json | 1 + json/netbird.json | 1 + json/nezha.json | 1 + json/oxicloud.json | 1 + json/paperclip.json | 1 + json/papermark.json | 1 + json/pixelfed.json | 1 + json/plane.json | 1 + json/postiz.json | 1 + json/puter.json | 1 + json/rss-bridge.json | 1 + json/shiori.json | 1 + json/shlink.json | 1 + json/simplelogin.json | 1 + json/skylite-ux.json | 1 + json/slink.json | 1 + json/solidtime.json | 1 + json/soulsync.json | 1 + json/spliit.json | 1 + json/squid.json | 1 + json/stoatchat.json | 1 + json/storyteller.json | 1 + json/surrealdb.json | 1 + json/teable.json | 1 + json/tolgee.json | 1 + json/tor-snowflake.json | 1 + json/tubearchivist.json | 1 + json/twenty.json | 1 + json/unifi-os-server-vm.json | 1 + json/update-apps.json | 1 + json/webtrees.json | 1 + json/xyops.json | 1 + json/yourls.json | 1 + json/zitadel.json | 1 + 88 files changed, 88 insertions(+) diff --git a/json/affine.json b/json/affine.json index 27846003..2c3252f0 100644 --- a/json/affine.json +++ b/json/affine.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3010, "documentation": "https://affine.pro/docs", "website": "https://affine.pro/", diff --git a/json/airflow.json b/json/airflow.json index 4c4a9b75..501a5809 100644 --- a/json/airflow.json +++ b/json/airflow.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8080, "documentation": "https://airflow.apache.org/docs/", "website": "https://airflow.apache.org/", diff --git a/json/akaunting.json b/json/akaunting.json index ff3e612b..4cf25f6d 100644 --- a/json/akaunting.json +++ b/json/akaunting.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://akaunting.com/hc/docs", "website": "https://akaunting.com/", diff --git a/json/aliasvault.json b/json/aliasvault.json index 0de1f40f..fe0d2168 100644 --- a/json/aliasvault.json +++ b/json/aliasvault.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 443, "documentation": "https://docs.aliasvault.net/", "website": "https://aliasvault.net/", diff --git a/json/allstarlink.json b/json/allstarlink.json index bb888931..1317bb2c 100644 --- a/json/allstarlink.json +++ b/json/allstarlink.json @@ -8,6 +8,7 @@ "type": "vm", "updateable": false, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://allstarlink.github.io/", "website": "https://www.allstarlink.org/", diff --git a/json/almalinux-10-vm.json b/json/almalinux-10-vm.json index bd63826d..e86b210b 100644 --- a/json/almalinux-10-vm.json +++ b/json/almalinux-10-vm.json @@ -8,6 +8,7 @@ "type": "vm", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://wiki.almalinux.org/", "website": "https://almalinux.org/", diff --git a/json/alpine-cinny.json b/json/alpine-cinny.json index ca2c5279..70cb8670 100644 --- a/json/alpine-cinny.json +++ b/json/alpine-cinny.json @@ -9,6 +9,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8080, "documentation": "https://github.com/cinnyapp/cinny", "website": "https://cinny.in/", diff --git a/json/alpine-ntfy.json b/json/alpine-ntfy.json index 0168c3ba..8daef184 100644 --- a/json/alpine-ntfy.json +++ b/json/alpine-ntfy.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://docs.ntfy.sh/", "website": "https://ntfy.sh/", diff --git a/json/archlinux.json b/json/archlinux.json index d34fe530..8d47730e 100644 --- a/json/archlinux.json +++ b/json/archlinux.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://wiki.archlinux.org/", "website": "https://archlinux.org/", diff --git a/json/arm.json b/json/arm.json index 2af2c644..dc5a353e 100644 --- a/json/arm.json +++ b/json/arm.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": true, + "has_arm": false, "interface_port": 8080, "documentation": "https://github.com/automatic-ripping-machine/automatic-ripping-machine/wiki", "website": "https://github.com/automatic-ripping-machine/automatic-ripping-machine", diff --git a/json/arr-stack.json b/json/arr-stack.json index fa4978d4..69ce0dd9 100644 --- a/json/arr-stack.json +++ b/json/arr-stack.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3010, "documentation": "community-scripts/ProxmoxVED/blob/main/tools/arr-stack.sh", "website": "https://community-scripts.org", diff --git a/json/authentik.json b/json/authentik.json index f949fa80..064a2531 100644 --- a/json/authentik.json +++ b/json/authentik.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 9000, "documentation": "https://docs.goauthentik.io/", "website": "https://goauthentik.io/", diff --git a/json/baserow.json b/json/baserow.json index 91a369e1..4808ce6b 100644 --- a/json/baserow.json +++ b/json/baserow.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://baserow.io/docs/index", "website": "https://baserow.io/", diff --git a/json/bitfocus-companion.json b/json/bitfocus-companion.json index ed7390ea..ec7c59f6 100644 --- a/json/bitfocus-companion.json +++ b/json/bitfocus-companion.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8000, "documentation": "https://user.bitfocus.io/docs", "website": "https://bitfocus.io/companion", diff --git a/json/blinko.json b/json/blinko.json index b7b3a570..ee640461 100644 --- a/json/blinko.json +++ b/json/blinko.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 1111, "documentation": "https://docs.blinko.space/", "website": "https://blinko.space/", diff --git a/json/bunkerm.json b/json/bunkerm.json index 399b948f..90671f1f 100644 --- a/json/bunkerm.json +++ b/json/bunkerm.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 2000, "documentation": "https://bunkerai.dev/docs", "website": "https://bunkerai.dev/", diff --git a/json/caddymanager.json b/json/caddymanager.json index 0cd87e29..43393bce 100644 --- a/json/caddymanager.json +++ b/json/caddymanager.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://caddymanager.online/#/docs", "website": "https://caddymanager.online", diff --git a/json/certimate.json b/json/certimate.json index 8d941424..43e44de8 100644 --- a/json/certimate.json +++ b/json/certimate.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8090, "documentation": "https://docs.certimate.me/", "website": "https://certimate.me/", diff --git a/json/clickhouse.json b/json/clickhouse.json index 99a4f82e..4f5ae610 100644 --- a/json/clickhouse.json +++ b/json/clickhouse.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8123, "documentation": "https://clickhouse.com/docs/", "website": "https://clickhouse.com/", diff --git a/json/cliproxyapi.json b/json/cliproxyapi.json index bae6de3f..c8ee3fc5 100644 --- a/json/cliproxyapi.json +++ b/json/cliproxyapi.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8317, "documentation": "https://help.router-for.me/", "website": "https://github.com/router-for-me/CLIProxyAPI", diff --git a/json/colanode.json b/json/colanode.json index 0bad1334..77582c37 100644 --- a/json/colanode.json +++ b/json/colanode.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 4000, "documentation": "https://github.com/colanode/colanode/blob/main/hosting/docker", "website": "https://colanode.com/", diff --git a/json/cyberchef.json b/json/cyberchef.json index ac6b0a2f..589a1384 100644 --- a/json/cyberchef.json +++ b/json/cyberchef.json @@ -9,6 +9,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://github.com/gchq/CyberChef", "website": "https://gchq.github.io/CyberChef", diff --git a/json/ddclient.json b/json/ddclient.json index f5a0e8d7..aef3b05e 100644 --- a/json/ddclient.json +++ b/json/ddclient.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://ddclient.net/", "website": "https://ddclient.net/", diff --git a/json/ddns-updater.json b/json/ddns-updater.json index 3471485a..e1011d22 100644 --- a/json/ddns-updater.json +++ b/json/ddns-updater.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8000, "documentation": "https://github.com/qdm12/ddns-updater/wiki", "website": "https://github.com/qdm12/ddns-updater", diff --git a/json/degoog.json b/json/degoog.json index e23cd9fb..81114189 100644 --- a/json/degoog.json +++ b/json/degoog.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 4444, "documentation": "https://fccview.github.io/degoog/", "website": "https://github.com/fccview/degoog", diff --git a/json/dependency-check.json b/json/dependency-check.json index e258eb8a..d977beef 100644 --- a/json/dependency-check.json +++ b/json/dependency-check.json @@ -8,6 +8,7 @@ "type": "pve", "updateable": false, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": null, "website": null, diff --git a/json/discourse.json b/json/discourse.json index d4302989..fcfa45ba 100644 --- a/json/discourse.json +++ b/json/discourse.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://www.discourse.org/", "website": "https://www.discourse.org/", diff --git a/json/docuseal.json b/json/docuseal.json index 33c5cf41..24c3dc90 100644 --- a/json/docuseal.json +++ b/json/docuseal.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://www.docuseal.com/docs", "website": "https://www.docuseal.com/", diff --git a/json/dynacat.json b/json/dynacat.json index 59736859..62791894 100644 --- a/json/dynacat.json +++ b/json/dynacat.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8080, "documentation": "https://dynacat.artur.zone/", "website": "https://github.com/Panonim/dynacat", diff --git a/json/edit-mind.json b/json/edit-mind.json index 94f20b4d..50a9f6f6 100644 --- a/json/edit-mind.json +++ b/json/edit-mind.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3745, "documentation": "https://github.com/IliasHad/edit-mind", "website": "https://github.com/IliasHad/edit-mind", diff --git a/json/ente.json b/json/ente.json index f0506e2d..18d8ce6b 100644 --- a/json/ente.json +++ b/json/ente.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": false, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://github.com/ente-io/ente", "website": "https://ente.io/", diff --git a/json/erpnext.json b/json/erpnext.json index d2612fb4..da09ad31 100644 --- a/json/erpnext.json +++ b/json/erpnext.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://docs.erpnext.com/", "website": "https://erpnext.com/", diff --git a/json/espconnect.json b/json/espconnect.json index 48c7abef..73a2a4da 100644 --- a/json/espconnect.json +++ b/json/espconnect.json @@ -9,6 +9,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 443, "documentation": "https://github.com/thelastoutpostworkshop/ESPConnect", "website": "https://github.com/thelastoutpostworkshop/ESPConnect", diff --git a/json/etherpad.json b/json/etherpad.json index e3a73321..091cd561 100644 --- a/json/etherpad.json +++ b/json/etherpad.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 9001, "documentation": "https://etherpad.org/doc", "website": "https://etherpad.org", diff --git a/json/excalidash.json b/json/excalidash.json index b888cc19..1786a4e0 100644 --- a/json/excalidash.json +++ b/json/excalidash.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 6767, "documentation": "https://github.com/ZimengXiong/ExcaliDash/blob/main/README.md", "website": "https://github.com/ZimengXiong/ExcaliDash", diff --git a/json/flame.json b/json/flame.json index d71c07c0..78e9435a 100644 --- a/json/flame.json +++ b/json/flame.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 5005, "documentation": "https://github.com/pawelmalak/flame/wiki", "website": "https://github.com/pawelmalak/flame", diff --git a/json/fleet.json b/json/fleet.json index 423cd14f..d60654d5 100644 --- a/json/fleet.json +++ b/json/fleet.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8080, "documentation": "https://fleetdm.com/docs", "website": "https://fleetdm.com/", diff --git a/json/forgejo-runner.json b/json/forgejo-runner.json index f713685b..331d17a4 100644 --- a/json/forgejo-runner.json +++ b/json/forgejo-runner.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://forgejo.org/docs/latest/admin/actions/runner-installation/", "website": "https://forgejo.org/docs/latest/admin/actions/runner-installation/", diff --git a/json/garmin-grafana.json b/json/garmin-grafana.json index 5e7e19af..385c90d5 100644 --- a/json/garmin-grafana.json +++ b/json/garmin-grafana.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://github.com/arpanghosh8453/garmin-grafana", "website": "https://github.com/arpanghosh8453/garmin-grafana", diff --git a/json/godoxy.json b/json/godoxy.json index 46d634be..7bbc57d0 100644 --- a/json/godoxy.json +++ b/json/godoxy.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://docs.godoxy.dev", "website": "https://github.com/yusing/godoxy", diff --git a/json/hermesagent.json b/json/hermesagent.json index 123151a7..6e5ccb1d 100644 --- a/json/hermesagent.json +++ b/json/hermesagent.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://hermes-agent.nousresearch.com/docs", "website": "https://hermes-agent.nousresearch.com", diff --git a/json/invidious.json b/json/invidious.json index 17c914a3..72d0bb21 100644 --- a/json/invidious.json +++ b/json/invidious.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https:/docs.invidious.io", "website": "https://invidious.io", diff --git a/json/invoiceshelf.json b/json/invoiceshelf.json index c9cb022a..1a2d101b 100644 --- a/json/invoiceshelf.json +++ b/json/invoiceshelf.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://docs.invoiceshelf.com/", "website": "https://invoiceshelf.com/", diff --git a/json/jitsi.json b/json/jitsi.json index 2987654f..03f03749 100644 --- a/json/jitsi.json +++ b/json/jitsi.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 443, "documentation": "https://jitsi.github.io/handbook/", "website": "https://jitsi.org/", diff --git a/json/kan.json b/json/kan.json index 67543e1a..ea8e64a0 100644 --- a/json/kan.json +++ b/json/kan.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://github.com/kanbn/kan#readme", "website": "https://kan.bn/", diff --git a/json/labca.json b/json/labca.json index 819fe43b..57393ed9 100644 --- a/json/labca.json +++ b/json/labca.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://github.com/hakwerk/labca", "website": "https://github.com/hakwerk/labca", diff --git a/json/librechat.json b/json/librechat.json index 5b1c57b9..f2229271 100644 --- a/json/librechat.json +++ b/json/librechat.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3080, "documentation": "https://www.librechat.ai/docs", "website": "https://www.librechat.ai/", diff --git a/json/lobehub.json b/json/lobehub.json index e6bb81b2..16ad5ca8 100644 --- a/json/lobehub.json +++ b/json/lobehub.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3210, "documentation": "https://lobehub.com/docs", "website": "https://lobehub.com/", diff --git a/json/localagi.json b/json/localagi.json index a31cebbc..eda9c253 100644 --- a/json/localagi.json +++ b/json/localagi.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://github.com/mudler/LocalAGI#installation-options", "website": "https://github.com/mudler/LocalAGI", diff --git a/json/lychee.json b/json/lychee.json index 540bc497..3011be70 100644 --- a/json/lychee.json +++ b/json/lychee.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://lycheeorg.dev/docs", "website": "https://lycheeorg.github.io/", diff --git a/json/matomo.json b/json/matomo.json index 715c0944..34b5612f 100644 --- a/json/matomo.json +++ b/json/matomo.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://matomo.org/docs/", "website": "https://matomo.org/", diff --git a/json/matterjs-server.json b/json/matterjs-server.json index 3f770918..2dea603f 100644 --- a/json/matterjs-server.json +++ b/json/matterjs-server.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 5580, "documentation": "https://github.com/matter-js/matterjs-server", "website": "https://github.com/matter-js/matterjs-server", diff --git a/json/nagios.json b/json/nagios.json index 771f7491..4993d2bb 100644 --- a/json/nagios.json +++ b/json/nagios.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/quickstart.html", "website": "https://www.nagios.org/projects/nagios-core/", diff --git a/json/neko.json b/json/neko.json index b251dd86..f0a5f686 100644 --- a/json/neko.json +++ b/json/neko.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8080, "documentation": "https://neko.m1k1o.net/docs/v3/configuration", "website": "https://neko.m1k1o.net/", diff --git a/json/netbird-server.json b/json/netbird-server.json index 8f117832..41b9a07b 100644 --- a/json/netbird-server.json +++ b/json/netbird-server.json @@ -8,6 +8,7 @@ "type": "vm", "updateable": false, "privileged": false, + "has_arm": false, "interface_port": 443, "documentation": "https://docs.netbird.io/selfhosted/selfhosted-quickstart", "website": "https://netbird.io/", diff --git a/json/netbird.json b/json/netbird.json index b511e623..9909c278 100644 --- a/json/netbird.json +++ b/json/netbird.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": true, + "has_arm": false, "interface_port": null, "documentation": "https://docs.netbird.io/", "website": "https://netbird.io/", diff --git a/json/nezha.json b/json/nezha.json index 48d4c84b..dfbe358d 100644 --- a/json/nezha.json +++ b/json/nezha.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8008, "documentation": "https://nezha.wiki/en_US/guide/dashboard.html", "website": "https://nezha.wiki/en_US/", diff --git a/json/oxicloud.json b/json/oxicloud.json index 1f718b19..75815dd8 100644 --- a/json/oxicloud.json +++ b/json/oxicloud.json @@ -9,6 +9,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8086, "documentation": "https://github.com/DioCrafts/OxiCloud/tree/main/doc", "website": "https://github.com/DioCrafts/OxiCloud", diff --git a/json/paperclip.json b/json/paperclip.json index b60c621d..49ca3a7c 100644 --- a/json/paperclip.json +++ b/json/paperclip.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3100, "documentation": "https://docs.paperclip.ing/", "website": "https://paperclip.ing/", diff --git a/json/papermark.json b/json/papermark.json index d215aebe..fa05cfe3 100644 --- a/json/papermark.json +++ b/json/papermark.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://www.papermark.com/docs", "website": "https://www.papermark.com/", diff --git a/json/pixelfed.json b/json/pixelfed.json index 46341388..86e7c21f 100644 --- a/json/pixelfed.json +++ b/json/pixelfed.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://docs.pixelfed.org/", "website": "https://pixelfed.org/", diff --git a/json/plane.json b/json/plane.json index f4578d24..a775c47c 100644 --- a/json/plane.json +++ b/json/plane.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://developers.plane.so/self-hosting/overview", "website": "https://plane.so", diff --git a/json/postiz.json b/json/postiz.json index 95bb842c..b4552acd 100644 --- a/json/postiz.json +++ b/json/postiz.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://docs.postiz.com/", "website": "https://postiz.com/", diff --git a/json/puter.json b/json/puter.json index 9028c933..c1424669 100644 --- a/json/puter.json +++ b/json/puter.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 4100, "documentation": "https://docs.puter.com/", "website": "https://puter.com/", diff --git a/json/rss-bridge.json b/json/rss-bridge.json index c8a78b90..b463ca27 100644 --- a/json/rss-bridge.json +++ b/json/rss-bridge.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://rss-bridge.github.io/rss-bridge/", "website": "https://rss-bridge.org/", diff --git a/json/shiori.json b/json/shiori.json index b571945a..1b94114b 100644 --- a/json/shiori.json +++ b/json/shiori.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8080, "documentation": "https://github.com/go-shiori/shiori/tree/master/docs", "website": "https://github.com/go-shiori/shiori", diff --git a/json/shlink.json b/json/shlink.json index 6c9384d3..1506ca04 100644 --- a/json/shlink.json +++ b/json/shlink.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://shlink.io/documentation/", "website": "https://shlink.io/", diff --git a/json/simplelogin.json b/json/simplelogin.json index aad8d5fe..47fe8db0 100644 --- a/json/simplelogin.json +++ b/json/simplelogin.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://github.com/simple-login/app/blob/master/docs/", "website": "https://simplelogin.io/", diff --git a/json/skylite-ux.json b/json/skylite-ux.json index 1768ef83..d8b9d0c6 100644 --- a/json/skylite-ux.json +++ b/json/skylite-ux.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://github.com/Wetzel402/Skylite-UX", "website": "https://github.com/Wetzel402/Skylite-UX", diff --git a/json/slink.json b/json/slink.json index 337012a9..d3387630 100644 --- a/json/slink.json +++ b/json/slink.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://slink.pages.dev", "website": "https://github.com/andrii-kryvoviaz/slink", diff --git a/json/solidtime.json b/json/solidtime.json index fa09ee82..36bd075f 100644 --- a/json/solidtime.json +++ b/json/solidtime.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://docs.solidtime.io/", "website": "https://www.solidtime.io/", diff --git a/json/soulsync.json b/json/soulsync.json index 077505ba..46faa7d7 100644 --- a/json/soulsync.json +++ b/json/soulsync.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8008, "documentation": "https://github.com/Nezreka/SoulSync#readme", "website": "https://github.com/Nezreka/SoulSync", diff --git a/json/spliit.json b/json/spliit.json index 62500854..b0ab483a 100644 --- a/json/spliit.json +++ b/json/spliit.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://github.com/spliit-app/spliit#readme", "website": "https://spliit.app/", diff --git a/json/squid.json b/json/squid.json index 88a3aa82..5805b5ba 100644 --- a/json/squid.json +++ b/json/squid.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3128, "documentation": "https://wiki.squid-cache.org/SquidFaq", "website": "https://www.squid-cache.org/", diff --git a/json/stoatchat.json b/json/stoatchat.json index 412117e8..4fc2e9c9 100644 --- a/json/stoatchat.json +++ b/json/stoatchat.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://github.com/stoatchat/self-hosted", "website": "https://stoat.chat", diff --git a/json/storyteller.json b/json/storyteller.json index a5ad9fe7..351b9a37 100644 --- a/json/storyteller.json +++ b/json/storyteller.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8001, "documentation": "https://storyteller-platform.dev/docs/welcome", "website": "https://storyteller-platform.dev/", diff --git a/json/surrealdb.json b/json/surrealdb.json index 349234c9..9ba9a1a6 100644 --- a/json/surrealdb.json +++ b/json/surrealdb.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8000, "documentation": "https://surrealdb.com/docs", "website": "https://surrealdb.com/", diff --git a/json/teable.json b/json/teable.json index 1045c0e7..d878672d 100644 --- a/json/teable.json +++ b/json/teable.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://help.teable.io/", "website": "https://teable.io/", diff --git a/json/tolgee.json b/json/tolgee.json index 8f29d86a..1c8d6b67 100644 --- a/json/tolgee.json +++ b/json/tolgee.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8080, "documentation": "https://docs.tolgee.io/platform/self_hosting", "website": "https://tolgee.io/", diff --git a/json/tor-snowflake.json b/json/tor-snowflake.json index 680f31a0..da68fe7e 100644 --- a/json/tor-snowflake.json +++ b/json/tor-snowflake.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://community.torproject.org/relay/setup/snowflake/standalone/", "website": "https://snowflake.torproject.org/", diff --git a/json/tubearchivist.json b/json/tubearchivist.json index a23c6c08..944a745a 100644 --- a/json/tubearchivist.json +++ b/json/tubearchivist.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8000, "documentation": "https://docs.tubearchivist.com/", "website": "https://github.com/tubearchivist/tubearchivist", diff --git a/json/twenty.json b/json/twenty.json index be019bdd..085309e0 100644 --- a/json/twenty.json +++ b/json/twenty.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 3000, "documentation": "https://docs.twenty.com/", "website": "https://twenty.com/", diff --git a/json/unifi-os-server-vm.json b/json/unifi-os-server-vm.json index 8b4b1953..ab9a328c 100644 --- a/json/unifi-os-server-vm.json +++ b/json/unifi-os-server-vm.json @@ -8,6 +8,7 @@ "type": "vm", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": "https://help.ui.com/hc/en-us", "website": "https://www.ui.com/", diff --git a/json/update-apps.json b/json/update-apps.json index 0c559ce3..1e9ba365 100644 --- a/json/update-apps.json +++ b/json/update-apps.json @@ -8,6 +8,7 @@ "type": "pve", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": null, "documentation": null, "website": null, diff --git a/json/webtrees.json b/json/webtrees.json index f77d15a5..f50ea8e6 100644 --- a/json/webtrees.json +++ b/json/webtrees.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://webtrees.net/install/", "website": "https://webtrees.net/", diff --git a/json/xyops.json b/json/xyops.json index afc6d490..5bce92dd 100644 --- a/json/xyops.json +++ b/json/xyops.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 5522, "documentation": "https://github.com/pixlcore/xyops/tree/main/docs", "website": "https://github.com/pixlcore/xyops", diff --git a/json/yourls.json b/json/yourls.json index ee9db90d..96bcec69 100644 --- a/json/yourls.json +++ b/json/yourls.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 80, "documentation": "https://yourls.org/", "website": "https://yourls.org/", diff --git a/json/zitadel.json b/json/zitadel.json index b54fe479..67204e53 100644 --- a/json/zitadel.json +++ b/json/zitadel.json @@ -8,6 +8,7 @@ "type": "ct", "updateable": true, "privileged": false, + "has_arm": false, "interface_port": 8080, "documentation": "https://zitadel.com/docs/guides/overview", "website": "https://zitadel.com", From 6116c3f871594287759131a491bcc516f7edbcbf Mon Sep 17 00:00:00 2001 From: Michel Roegl-Brunner Date: Fri, 22 May 2026 20:35:52 +0200 Subject: [PATCH 28/37] add music seerr --- ct/musicseerr.sh | 85 +++++++++++++++++++++++++++++++++++ install/musicseerr-install.sh | 59 ++++++++++++++++++++++++ json/musicseerr.json | 47 +++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 ct/musicseerr.sh create mode 100644 install/musicseerr-install.sh create mode 100644 json/musicseerr.json diff --git a/ct/musicseerr.sh b/ct/musicseerr.sh new file mode 100644 index 00000000..49c09597 --- /dev/null +++ b/ct/musicseerr.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: michelroegl-brunner +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://musicseerr.com/ | Github: https://github.com/HabiRabbu/Musicseerr + +APP="MusicSeerr" +var_tags="${var_tags:-arr;media}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-4096}" +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/musicseerr ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "musicseerr" "HabiRabbu/Musicseerr"; then + msg_info "Stopping Service" + systemctl stop musicseerr + msg_ok "Stopped Service" + + msg_info "Backing up Data" + cp -a /opt/musicseerr/backend/config /opt/musicseerr_config_backup + cp -a /opt/musicseerr/backend/cache /opt/musicseerr_cache_backup + msg_ok "Backed up Data" + + PYTHON_VERSION="3.13" setup_uv + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "musicseerr" "HabiRabbu/Musicseerr" "tarball" + NODE_VERSION="22" NODE_MODULE="pnpm@10.33.0" setup_nodejs + + msg_info "Building Frontend" + cd /opt/musicseerr/frontend + export NODE_OPTIONS="--max-old-space-size=3072" + rm -rf node_modules build + $STD pnpm install --frozen-lockfile + $STD pnpm run build + msg_ok "Built Frontend" + + msg_info "Updating Application" + mkdir -p /opt/musicseerr/backend/config /opt/musicseerr/backend/cache + $STD uv venv --clear /opt/musicseerr/venv + $STD uv pip install -r /opt/musicseerr/backend/requirements.txt --python=/opt/musicseerr/venv/bin/python + rm -rf /opt/musicseerr/backend/static + cp -r /opt/musicseerr/frontend/build /opt/musicseerr/backend/static + msg_ok "Updated Application" + + msg_info "Restoring Data" + rm -rf /opt/musicseerr/backend/config /opt/musicseerr/backend/cache + cp -a /opt/musicseerr_config_backup/. /opt/musicseerr/backend/config/ + cp -a /opt/musicseerr_cache_backup/. /opt/musicseerr/backend/cache/ + rm -rf /opt/musicseerr_config_backup /opt/musicseerr_cache_backup + msg_ok "Restored Data" + + msg_info "Starting Service" + systemctl start musicseerr + 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 "${TAB}${GATEWAY}${BGN}http://${IP}:8688${CL}" diff --git a/install/musicseerr-install.sh b/install/musicseerr-install.sh new file mode 100644 index 00000000..14184486 --- /dev/null +++ b/install/musicseerr-install.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Michel Roegl-Brunner +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://musicseerr.com/ | Github: https://github.com/HabiRabbu/Musicseerr + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +PYTHON_VERSION="3.13" setup_uv +fetch_and_deploy_gh_release "musicseerr" "HabiRabbu/Musicseerr" "tarball" +NODE_VERSION="22" NODE_MODULE="pnpm@10.33.0" setup_nodejs + +msg_info "Building Frontend" +cd /opt/musicseerr/frontend +export NODE_OPTIONS="--max-old-space-size=3072" +$STD pnpm install --frozen-lockfile +$STD pnpm run build +msg_ok "Built Frontend" + +msg_info "Setting up Application" +mkdir -p /opt/musicseerr/backend/config /opt/musicseerr/backend/cache +$STD uv venv /opt/musicseerr/venv +$STD uv pip install -r /opt/musicseerr/backend/requirements.txt --python=/opt/musicseerr/venv/bin/python +rm -rf /opt/musicseerr/backend/static +cp -r /opt/musicseerr/frontend/build /opt/musicseerr/backend/static +msg_ok "Set up Application" + +msg_info "Creating Service" +cat </etc/systemd/system/musicseerr.service +[Unit] +Description=MusicSeerr Service +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/musicseerr/backend +Environment=ROOT_APP_DIR=/opt/musicseerr/backend +Environment=PORT=8688 +ExecStart=/opt/musicseerr/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8688 --loop uvloop --http httptools --workers 1 +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now musicseerr +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc diff --git a/json/musicseerr.json b/json/musicseerr.json new file mode 100644 index 00000000..2c959653 --- /dev/null +++ b/json/musicseerr.json @@ -0,0 +1,47 @@ +{ + "name": "MusicSeerr", + "slug": "musicseerr", + "categories": [14], + "date_created": "2026-05-22", + "type": "ct", + "updateable": true, + "privileged": false, + "has_arm": false, + "interface_port": 8688, + "documentation": "https://musicseerr.com/", + "website": "https://github.com/HabiRabbu/Musicseerr", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/musicseerr.webp", + "description": "MusicSeerr is a self-hosted music request and discovery app for Lidarr. Search MusicBrainz, request albums, stream from Jellyfin, Navidrome, Plex, or local files, and scrobble to ListenBrainz and Last.fm.", + "install_methods": [ + { + "type": "default", + "script": "ct/musicseerr.sh", + "config_path": "/opt/musicseerr/backend/config/config.json", + "resources": { + "cpu": 2, + "ram": 4096, + "hdd": 8, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Requires a running Lidarr instance. Configure Lidarr and other integrations in the web UI after installation.", + "type": "info" + }, + { + "text": "Initial install includes a frontend build and may take several minutes.", + "type": "warning" + }, + { + "text": "For local file playback, mount your music library into the container and set the path in Settings > Local Files.", + "type": "info" + } + ] +} From 863a4ea36e5217f72a2d850521d7c55b87aefbbf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 22 May 2026 18:36:25 +0000 Subject: [PATCH 29/37] chore: update app headers [skip ci] --- ct/headers/musicseerr | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/musicseerr diff --git a/ct/headers/musicseerr b/ct/headers/musicseerr new file mode 100644 index 00000000..a7ceb86e --- /dev/null +++ b/ct/headers/musicseerr @@ -0,0 +1,6 @@ + __ ___ _ _____ + / |/ /_ _______(_)____/ ___/___ ___ __________ + / /|_/ / / / / ___/ / ___/\__ \/ _ \/ _ \/ ___/ ___/ + / / / / /_/ (__ ) / /__ ___/ / __/ __/ / / / +/_/ /_/\__,_/____/_/\___//____/\___/\___/_/ /_/ + From 0487d242e2e339e9e7ac74b2844fac4504dd0726 Mon Sep 17 00:00:00 2001 From: tremor021 Date: Sat, 23 May 2026 21:42:14 +0200 Subject: [PATCH 30/37] add ezBookkeeping script --- ct/ezbookkeeping.sh | 70 ++++++++++++++++++++++++++++++++ install/ezbookkeeping-install.sh | 49 ++++++++++++++++++++++ json/ezbookkeeping.json | 36 ++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 ct/ezbookkeeping.sh create mode 100644 install/ezbookkeeping-install.sh create mode 100644 json/ezbookkeeping.json diff --git a/ct/ezbookkeeping.sh b/ct/ezbookkeeping.sh new file mode 100644 index 00000000..48a40787 --- /dev/null +++ b/ct/ezbookkeeping.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://github.com/mayswind/ezbookkeeping + +APP="ezBookkeeping" +var_tags="${var_tags:-}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-4}" +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/ezbookkeeping ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "ezbookkeeping" "mayswind/ezbookkeeping"; then + msg_info "Stopping Service" + systemctl stop ezbookkeeping + msg_ok "Stopped Service" + + msg_info "Backing up configuration" + mkdir -p /opt/ezbookkeeping-backup + cp /opt/ezbookkeeping/conf/ezbookkeeping.ini /opt/ezbookkeeping-backup/ + cp -r /opt/ezbookkeeping/data /opt/ezbookkeeping-backup/data/ + cp -r /opt/ezbookkeeping/storage /opt/ezbookkeeping-backup/storage/ + msg_ok "Backed up configuration" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ezbookkeeping" "mayswind/ezbookkeeping" "prebuild" "latest" "/opt/ezbookkeeping" "ezbookkeeping-*-linux-amd64.tar.gz" + + msg_info "Restoring configuration" + mv -f /opt/ezbookkeeping-backup/ezbookkeeping.ini /opt/ezbookkeeping/conf/ + mv -f /opt/ezbookkeeping-backup/data /opt/ezbookkeeping/data/ + mv -f /opt/ezbookkeeping-backup/storage /opt/ezbookkeeping/storage/ + rm -rf /opt/ezbookkeeping-backup + msg_ok "Restored configuration" + + msg_info "Starting Service" + systemctl start ezbookkeeping + msg_ok "Started Service" + msg_ok "Updated successfully!" + fi + cleanup_lxc + exit +} + +start +build_container +description + +msg_ok "Completed successfully!\n" +echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" +echo -e "${INFO}${YW} Access it using the following URL:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}https://${IP}${CL}" diff --git a/install/ezbookkeeping-install.sh b/install/ezbookkeeping-install.sh new file mode 100644 index 00000000..fdc7e78d --- /dev/null +++ b/install/ezbookkeeping-install.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE +# Source: https://ezbookkeeping.mayswind.net/ + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +fetch_and_deploy_gh_release "ezbookkeeping" "mayswind/ezbookkeeping" "prebuild" "latest" "/opt/ezbookkeeping" "ezbookkeeping-*-linux-amd64.tar.gz" +create_self_signed_cert + +msg_info "Configuring ezBookkeeping" +SECRET_KEY=$(openssl rand -base64 64 | tr -dc 'a-zA-Z0-9' | head -c50) +sed -i "s/enable_gzip = false/enable_gzip = true/" /opt/ezbookkeeping/conf/ezbookkeeping.ini +sed -i "s/protocol = http/protocol = https/" /opt/ezbookkeeping/conf/ezbookkeeping.ini +sed -i "s/http_port = 8080/http_port = 443/" /opt/ezbookkeeping/conf/ezbookkeeping.ini +sed -i "s/cert_file =/cert_file = \/etc\/ssl\/ezbookkeeping\/ezbookkeeping.crt/" /opt/ezbookkeeping/conf/ezbookkeeping.ini +sed -i "s/cert_key_file =/cert_key_file = \/etc\/ssl\/ezbookkeeping\/ezbookkeeping.key/" /opt/ezbookkeeping/conf/ezbookkeeping.ini +sed -i "s/domain = localhost/domain = ${LOCAL_IP}/" /opt/ezbookkeeping/conf/ezbookkeeping.ini +sed -i "s/secret_key =/secret_key = ${SECRET_KEY}/" /opt/ezbookkeeping/conf/ezbookkeeping.ini +msg_ok "Configured ezBookkeeping" + +msg_info "Creating service" +cat </etc/systemd/system/ezbookkeeping.service +[Unit] +Description=ezBookkeeping Service +After=network.target + +[Service] +WorkingDirectory=/opt/ezbookkeeping +ExecStart=/opt/ezbookkeeping/ezbookkeeping server run +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now ezbookkeeping +msg_ok "Created service" + +motd_ssh +customize +cleanup_lxc diff --git a/json/ezbookkeeping.json b/json/ezbookkeeping.json new file mode 100644 index 00000000..cc149ac5 --- /dev/null +++ b/json/ezbookkeeping.json @@ -0,0 +1,36 @@ +{ + "name": "ezBookkeeping", + "slug": "ezbookkeeping", + "categories": [ + 23 + ], + "date_created": "2026-02-11", + "type": "ct", + "updateable": true, + "privileged": false, + "has_arm": false, + "interface_port": 443, + "documentation": "https://ezbookkeeping.mayswind.net/installation/", + "website": "https://ezbookkeeping.mayswind.net", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/ezbookkeeping.webp", + "description": "ezBookkeeping is a lightweight, self-hosted personal finance app with a user-friendly interface and powerful bookkeeping features. It helps you record daily transactions, import data from various sources, and quickly search and filter your bills. You can analyze historical data using built-in charts or perform custom queries with your own chart dimensions to better understand spending patterns and financial trends.", + "install_methods": [ + { + "type": "default", + "script": "ct/ezbookkeeping.sh", + "config_path": "/opt/ezbookkeeping/conf/ezbookkeeping.ini", + "resources": { + "cpu": 1, + "ram": 512, + "hdd": 2, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} From 9a2657ebc9b78ecb874a2dd791dc59f2c8b49932 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 23 May 2026 19:42:32 +0000 Subject: [PATCH 31/37] chore: update app headers [skip ci] --- ct/headers/ezbookkeeping | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/ezbookkeeping diff --git a/ct/headers/ezbookkeeping b/ct/headers/ezbookkeeping new file mode 100644 index 00000000..9f4d66a5 --- /dev/null +++ b/ct/headers/ezbookkeeping @@ -0,0 +1,6 @@ + ____ __ __ _ + ___ ____ / __ )____ ____ / /__/ /_____ ___ ____ (_)___ ____ _ + / _ \/_ / / __ / __ \/ __ \/ //_/ //_/ _ \/ _ \/ __ \/ / __ \/ __ `/ +/ __/ / /_/ /_/ / /_/ / /_/ / ,< / ,< / __/ __/ /_/ / / / / / /_/ / +\___/ /___/_____/\____/\____/_/|_/_/|_|\___/\___/ .___/_/_/ /_/\__, / + /_/ /____/ From d591db4a18a85f8019c51411d2193cad17e098b9 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Sun, 24 May 2026 09:07:18 +0200 Subject: [PATCH 32/37] wrong Url --- ct/squid.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/squid.sh b/ct/squid.sh index 3aab9848..6260cc17 100644 --- a/ct/squid.sh +++ b/ct/squid.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) # Copyright (c) 2021-2026 community-scripts ORG # Author: 007hacky007 # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE From d9439e793179b334d1cbd2c006ed0537612c3218 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Sun, 24 May 2026 10:52:10 +0200 Subject: [PATCH 33/37] Change Version file --- ct/paperclip.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ct/paperclip.sh b/ct/paperclip.sh index 453e2c89..c48dbca0 100644 --- a/ct/paperclip.sh +++ b/ct/paperclip.sh @@ -30,7 +30,7 @@ function update_script() { exit fi - if check_for_gh_release "paperclip" "paperclipai/paperclip"; then + if check_for_gh_release "paperclip-ai" "paperclipai/paperclip"; then msg_info "Stopping Service" systemctl stop paperclip msg_ok "Stopped Service" @@ -39,7 +39,7 @@ function update_script() { cp /opt/paperclip/.env /opt/paperclip.env.bak msg_ok "Backed up Configuration" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperclip" "paperclipai/paperclip" "tarball" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperclip-ai" "paperclipai/paperclip" "tarball" msg_info "Restoring Configuration" mv /opt/paperclip.env.bak /opt/paperclip/.env From 6a47c177920a0e20766f27eb31f6c737410b3b5c Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Sun, 24 May 2026 10:52:34 +0200 Subject: [PATCH 34/37] versionfile --- install/paperclip-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/paperclip-install.sh b/install/paperclip-install.sh index d9086965..1b642648 100644 --- a/install/paperclip-install.sh +++ b/install/paperclip-install.sh @@ -25,7 +25,7 @@ NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs PG_VERSION="17" setup_postgresql PG_DB_NAME="paperclip" PG_DB_USER="paperclip" setup_postgresql_db -fetch_and_deploy_gh_release "paperclip" "paperclipai/paperclip" "tarball" +fetch_and_deploy_gh_release "paperclip-ai" "paperclipai/paperclip" "tarball" msg_info "Building Paperclip" cd /opt/paperclip From c80dbaa5e6950ae0523c9e93b6307f902d476c20 Mon Sep 17 00:00:00 2001 From: Stephen Chin Date: Sun, 24 May 2026 11:58:58 -0700 Subject: [PATCH 35/37] feat(hermesagent): add hermes-setup helper script for first-time setup - Add /usr/bin/hermes-setup that runs hermes setup as root, allowing optional components (TTS engines, browsers, etc.) to be installed, then restores ownership and permissions on /home/hermes - Update login hint to reference hermes-setup - Update completion message to guide users to hermes-setup and note that the gateway service should be installed as a user service - Update JSON note to reflect new setup flow --- ct/hermesagent.sh | 8 ++++---- install/hermesagent-install.sh | 23 ++++++++++++++++++++++- json/hermesagent.json | 2 +- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/ct/hermesagent.sh b/ct/hermesagent.sh index 33c25a7f..cdf3d87d 100644 --- a/ct/hermesagent.sh +++ b/ct/hermesagent.sh @@ -66,8 +66,8 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}Hermes Agent setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Configure your model provider and gateway server inside the container:${CL}" -echo -e "${TAB}${BGN}su - hermes${CL}" -echo -e "${TAB}${BGN}hermes setup${CL}" -echo -e "${INFO}${YW}Key for Hermes API Server stored in:${CL}" +echo -e "${INFO}${YW} Configure your model provider and gateway server:${CL}" +echo -e "${TAB}${BGN}hermes-setup${CL}" +echo -e "${INFO} When prompted to install the gateway service, choose 'user service'.${CL}" +echo -e "${INFO}${YW} Key for Hermes API Server stored in:${CL}" echo -e "${TAB}${BGN}/home/hermes/.hermes/.env${CL}" diff --git a/install/hermesagent-install.sh b/install/hermesagent-install.sh index 28f6f85e..0707f2f2 100644 --- a/install/hermesagent-install.sh +++ b/install/hermesagent-install.sh @@ -93,10 +93,31 @@ EOF systemctl enable -q --now hermes-dashboard msg_ok "Created Dashboard Service" +msg_info "Creating Setup Helper" +cat <<'SETUP' >/usr/bin/hermes-setup +#!/usr/bin/env bash +if [[ "$(id -u)" -ne 0 ]]; then + echo "Error: hermes-setup must be run as root." >&2 + exit 1 +fi +if [[ ! -x /home/hermes/.local/bin/hermes ]]; then + echo "Error: Hermes Agent is not installed." >&2 + exit 1 +fi +set -a; source /etc/default/hermes; set +a +/home/hermes/.local/bin/hermes setup +chown -R hermes:hermes /home/hermes +chmod 750 /home/hermes +chmod 700 /home/hermes/.hermes +echo "Hermes setup complete. File permissions restored." +SETUP +chmod +x /usr/bin/hermes-setup +msg_ok "Created Setup Helper" + msg_info "Configuring Login Hints" cat <<'HINT' >/etc/profile.d/hermes-hint.sh if [[ "$(id -u)" -eq 0 ]]; then - echo " Use 'su - hermes' to switch to the hermes user for running Hermes Agent." + echo " Run 'hermes-setup' to configure your model provider and gateway server." fi HINT msg_ok "Configured Login Hints" diff --git a/json/hermesagent.json b/json/hermesagent.json index 6e5ccb1d..3bb3cbec 100644 --- a/json/hermesagent.json +++ b/json/hermesagent.json @@ -42,7 +42,7 @@ "type": "warning" }, { - "text": "After container startup, login, switch to the hermes user (su - hermes) and run 'hermes setup' to configure your model provider and gateway server.", + "text": "After container startup, login as root and run 'hermes-setup' to configure your model provider and gateway server. When prompted to install the gateway service, install it as a user service (not a system service).", "type": "info" }, { From 965d0ff1d49afb8dd2e766f31923231d203c2d5b Mon Sep 17 00:00:00 2001 From: Stephen Chin Date: Sun, 24 May 2026 13:18:43 -0700 Subject: [PATCH 36/37] fix(hermesagent): remove redundant guards from hermes-setup; restore completion message wording --- ct/hermesagent.sh | 2 +- install/hermesagent-install.sh | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/ct/hermesagent.sh b/ct/hermesagent.sh index cdf3d87d..85121b4b 100644 --- a/ct/hermesagent.sh +++ b/ct/hermesagent.sh @@ -66,7 +66,7 @@ description msg_ok "Completed successfully!\n" echo -e "${CREATING}${GN}Hermes Agent setup has been successfully initialized!${CL}" -echo -e "${INFO}${YW} Configure your model provider and gateway server:${CL}" +echo -e "${INFO}${YW} Configure your model provider and gateway server inside the container:${CL}" echo -e "${TAB}${BGN}hermes-setup${CL}" echo -e "${INFO} When prompted to install the gateway service, choose 'user service'.${CL}" echo -e "${INFO}${YW} Key for Hermes API Server stored in:${CL}" diff --git a/install/hermesagent-install.sh b/install/hermesagent-install.sh index 0707f2f2..7c4c442d 100644 --- a/install/hermesagent-install.sh +++ b/install/hermesagent-install.sh @@ -96,14 +96,6 @@ msg_ok "Created Dashboard Service" msg_info "Creating Setup Helper" cat <<'SETUP' >/usr/bin/hermes-setup #!/usr/bin/env bash -if [[ "$(id -u)" -ne 0 ]]; then - echo "Error: hermes-setup must be run as root." >&2 - exit 1 -fi -if [[ ! -x /home/hermes/.local/bin/hermes ]]; then - echo "Error: Hermes Agent is not installed." >&2 - exit 1 -fi set -a; source /etc/default/hermes; set +a /home/hermes/.local/bin/hermes setup chown -R hermes:hermes /home/hermes From 5f0200032ef7899e7988d92531975c742a443a81 Mon Sep 17 00:00:00 2001 From: Stephen Chin Date: Sun, 24 May 2026 16:04:14 -0700 Subject: [PATCH 37/37] fix(hermesagent): enable gateway user service after hermes-setup If hermes setup created a user service for the gateway, enable and start it as the hermes user. Linger is pre-enabled so the service survives without an interactive session. --- install/hermesagent-install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install/hermesagent-install.sh b/install/hermesagent-install.sh index 7c4c442d..dc10c4f3 100644 --- a/install/hermesagent-install.sh +++ b/install/hermesagent-install.sh @@ -101,6 +101,9 @@ set -a; source /etc/default/hermes; set +a chown -R hermes:hermes /home/hermes chmod 750 /home/hermes chmod 700 /home/hermes/.hermes +if [[ -f /home/hermes/.config/systemd/user/hermes-gateway.service ]]; then + su - hermes -c 'systemctl --user enable --now hermes-gateway' +fi echo "Hermes setup complete. File permissions restored." SETUP chmod +x /usr/bin/hermes-setup