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/.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 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-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/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/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/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/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/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/arm.sh b/ct/deferred/arm.sh similarity index 98% rename from ct/arm.sh rename to ct/deferred/arm.sh index 0270a829..142f2413 100644 --- a/ct/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/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/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/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/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/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/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/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/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/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/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 new file mode 100644 index 00000000..7bfa80ac --- /dev/null +++ b/ct/flaresolverr.sh @@ -0,0 +1,60 @@ +#!/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_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 [[ ! -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/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/labca.sh b/ct/gluetun.sh similarity index 57% rename from ct/labca.sh rename to ct/gluetun.sh index b14819de..39052bd0 100644 --- a/ct/labca.sh +++ b/ct/gluetun.sh @@ -3,16 +3,18 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV # 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/hakwerk/labca +# Source: https://github.com/qdm12/gluetun -APP="LabCA" -var_tags="${var_tags:-certificate-authority;pki;gui}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-512}" -var_disk="${var_disk:-2}" +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_arm64="${var_arm64:-no}" var_unprivileged="${var_unprivileged:-1}" +var_tun="${var_tun:-yes}" header_info "$APP" variables @@ -24,20 +26,26 @@ function update_script() { check_container_storage check_container_resources - if [[ ! -f /usr/bin/labca-gui ]]; then + if [[ ! -f /usr/local/bin/gluetun ]]; then msg_error "No ${APP} Installation Found!" exit fi - if check_for_gh_release "labca-gui" "hakwerk/labca"; then + if check_for_gh_release "gluetun" "qdm12/gluetun"; then msg_info "Stopping Service" - systemctl stop labca + systemctl stop gluetun msg_ok "Stopped Service" - fetch_and_deploy_gh_release "labca-gui" "hakwerk/labca" "binary" + 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 labca + systemctl start gluetun msg_ok "Started Service" msg_ok "Updated successfully!" fi @@ -51,4 +59,4 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}" 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/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 @@ - __________ ____ _ __ __ - / ____/ __ \/ __ \/ | / /__ _ __/ /_ - / __/ / /_/ / /_/ / |/ / _ \| |/_/ __/ - / /___/ _, _/ ____/ /| / __/> /dev/null) + if [[ "$CURRENT" != "$LATEST" ]]; then msg_info "Stopping Service" - PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;') - systemctl stop caddy php${PHP_VER}-fpm + systemctl stop matterjs-server 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 "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 caddy php${PHP_VER}-fpm + systemctl start matterjs-server msg_ok "Started Service" msg_ok "Updated successfully!" + else + msg_ok "No update required. ${APP} is already at v${LATEST}" fi exit } @@ -62,4 +59,4 @@ description msg_ok "Completed Successfully!\n" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}" -echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" +echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5580${CL}" 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/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/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..c48dbca0 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" @@ -29,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" @@ -38,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 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 new file mode 100644 index 00000000..020e4f10 --- /dev/null +++ b/ct/prowlarr.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://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_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 /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/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 new file mode 100644 index 00000000..417a7658 --- /dev/null +++ b/ct/qbittorrent.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 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_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 [[ ! -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..5dc8325a --- /dev/null +++ b/ct/radarr.sh @@ -0,0 +1,57 @@ +#!/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_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 /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/arm/rdtclient.sh b/ct/rdtclient.sh similarity index 79% rename from ct/arm/rdtclient.sh rename to ct/rdtclient.sh index ad669a2b..52f1a012 100644 --- a/ct/arm/rdtclient.sh +++ b/ct/rdtclient.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash -source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/build.func) +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/asylumexp/Proxmox/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE # Source: https://github.com/rogerfar/rdt-client APP="RDTClient" @@ -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" @@ -39,9 +40,9 @@ function update_script() { 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 + 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 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 new file mode 100644 index 00000000..b7e92b75 --- /dev/null +++ b/ct/sabnzbd.sh @@ -0,0 +1,71 @@ +#!/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_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 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..d15e3538 --- /dev/null +++ b/ct/seerr.sh @@ -0,0 +1,168 @@ +#!/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_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/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/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 new file mode 100644 index 00000000..8d8290de --- /dev/null +++ b/ct/slskd.sh @@ -0,0 +1,101 @@ +#!/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_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/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/solidtime.sh b/ct/solidtime.sh deleted file mode 100644 index 59f40712..00000000 --- a/ct/solidtime.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://www.solidtime.io/ - -APP="SolidTime" -var_tags="${var_tags:-time-tracking;productivity;business}" -var_cpu="${var_cpu:-4}" -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/solidtime ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "solidtime" "solidtime-io/solidtime"; then - msg_info "Stopping Services" - systemctl stop caddy - msg_ok "Stopped Services" - - msg_info "Backing up Data" - cp /opt/solidtime/.env /opt/solidtime.env.bak - cp -r /opt/solidtime/storage /opt/solidtime_storage_backup - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "solidtime" "solidtime-io/solidtime" "tarball" - - msg_info "Restoring Data" - cp /opt/solidtime.env.bak /opt/solidtime/.env - rm -f /opt/solidtime.env.bak - cp -r /opt/solidtime_storage_backup/. /opt/solidtime/storage - rm -rf /opt/solidtime_storage_backup - msg_ok "Restored Data" - - msg_info "Updating Application" - cd /opt/solidtime - $STD composer install --no-dev --optimize-autoloader - $STD npm install - $STD npm run build - $STD php artisan migrate --force - $STD php artisan optimize:clear - chown -R www-data:www-data /opt/solidtime - 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}${CL}" -echo -e "${INFO}${YW}HTTPS is not enabled by default (use domain + reverse proxy/TLS if needed).${CL}" diff --git a/ct/sonarr.sh b/ct/sonarr.sh new file mode 100644 index 00000000..ad2f374a --- /dev/null +++ b/ct/sonarr.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://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_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 /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/ct/soulsync.sh b/ct/soulsync.sh deleted file mode 100644 index ae51f58c..00000000 --- a/ct/soulsync.sh +++ /dev/null @@ -1,68 +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/Nezreka/SoulSync - -APP="SoulSync" -var_tags="${var_tags:-music;automation;media}" -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 ~/.soulsync ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "soulsync" "Nezreka/SoulSync"; then - msg_info "Stopping Service" - systemctl stop soulsync - msg_ok "Stopped Service" - - msg_info "Backing up Data" - mv /opt/soulsync/config /opt/soulsync-config.bak - mv /opt/soulsync/data /opt/soulsync-data.bak - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "soulsync" "Nezreka/SoulSync" "tarball" - - msg_info "Updating Python Dependencies" - cd /opt/soulsync - $STD uv venv --clear /opt/soulsync/.venv --python 3.11 - $STD /opt/soulsync/.venv/bin/pip install -r requirements-webui.txt - msg_ok "Updated Python Dependencies" - - mv /opt/soulsync-config.bak /opt/soulsync/config - mv /opt/soulsync-data.bak /opt/soulsync/data - - msg_info "Starting Service" - systemctl start soulsync - msg_ok "Started Service" - msg_ok "Updated ${APP}" - 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}:8008${CL}" 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..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 @@ -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/storyteller.sh b/ct/storyteller.sh deleted file mode 100644 index daafd6b5..00000000 --- a/ct/storyteller.sh +++ /dev/null @@ -1,85 +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://gitlab.com/storyteller-platform/storyteller - -APP="Storyteller" -var_tags="${var_tags:-media;ebook;audiobook}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-10240}" -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/storyteller ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gl_release "storyteller" "storyteller-platform/storyteller"; then - msg_info "Stopping Service" - systemctl stop storyteller - msg_ok "Stopped Service" - - msg_info "Backing up Data" - cp /opt/storyteller/.env /opt/storyteller_env.bak - msg_ok "Backed up Data" - - CLEAN_INSTALL=1 fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "tarball" "latest" "/opt/storyteller" - - msg_info "Restoring Configuration" - mv /opt/storyteller_env.bak /opt/storyteller/.env - msg_ok "Restored Configuration" - - msg_info "Rebuilding Storyteller" - cd /opt/storyteller - export NODE_OPTIONS="--max-old-space-size=4096" - $STD yarn install --network-timeout 600000 - $STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so - 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 "Rebuilt Storyteller" - - msg_info "Starting Service" - systemctl start storyteller - 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}:8001${CL}" 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/teable.sh b/ct/teable.sh deleted file mode 100644 index 1c15bce8..00000000 --- a/ct/teable.sh +++ /dev/null @@ -1,82 +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/teableio/teable - -APP="Teable" -var_tags="${var_tags:-database;no-code;spreadsheet}" -var_cpu="${var_cpu:-4}" -var_ram="${var_ram:-10240}" -var_disk="${var_disk:-25}" -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/teable ]]; then - msg_error "No ${APP} Installation Found!" - exit - fi - - if check_for_gh_release "teable" "teableio/teable"; then - msg_info "Stopping Service" - systemctl stop teable - msg_ok "Stopped Service" - - msg_info "Backing up Configuration" - cp /opt/teable/.env /opt/teable.env.bak - msg_ok "Backed up Configuration" - - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "teable" "teableio/teable" "tarball" - - msg_info "Restoring Configuration" - mv /opt/teable.env.bak /opt/teable/.env - msg_ok "Restored Configuration" - - msg_info "Rebuilding 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 - 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/tolgee.sh b/ct/tolgee.sh index e314086d..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" @@ -34,30 +35,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/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/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/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" 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 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/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/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 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/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/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/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/hermesagent-install.sh b/install/hermesagent-install.sh index 28f6f85e..dc10c4f3 100644 --- a/install/hermesagent-install.sh +++ b/install/hermesagent-install.sh @@ -93,10 +93,26 @@ 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 +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 +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 +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/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/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/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/matterjs-server-install.sh b/install/matterjs-server-install.sh new file mode 100644 index 00000000..4cd6c0a6 --- /dev/null +++ b/install/matterjs-server-install.sh @@ -0,0 +1,56 @@ +#!/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/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" +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" + +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] +Description=MatterJS Server +After=network.target + +[Service] +Type=simple +User=root +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 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now matterjs-server +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc 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/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/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 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/arm/rdtclient-install.sh b/install/rdtclient-install.sh similarity index 55% rename from install/arm/rdtclient-install.sh rename to install/rdtclient-install.sh index 784107f3..45af689b 100644 --- a/install/arm/rdtclient-install.sh +++ b/install/rdtclient-install.sh @@ -2,7 +2,7 @@ # Copyright (c) 2021-2026 tteck # Author: tteck (tteckster) -# License: MIT | https://github.com/asylumexp/Proxmox/raw/main/LICENSE +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE # Source: https://github.com/rogerfar/rdt-client source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" @@ -14,25 +14,14 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt-get install -y unzip +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" -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" 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/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/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/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/tolgee-install.sh b/install/tolgee-install.sh index 3ab834da..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,8 +45,8 @@ After=network.target Type=simple User=root WorkingDirectory=/opt/tolgee -EnvironmentFile=/opt/tolgee/.env -ExecStart=/usr/bin/java -jar /opt/tolgee/tolgee.jar +EnvironmentFile=/opt/tolgee_data/.env +ExecStart=/usr/bin/java -jar /opt/tolgee/tolgee Restart=on-failure RestartSec=5 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 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 new file mode 100644 index 00000000..69ce0dd9 --- /dev/null +++ b/json/arr-stack.json @@ -0,0 +1,41 @@ +{ + "name": "ARR-Stack", + "slug": "arr-stack", + "categories": [ + 12 + ], + "date_created": "2026-01-18", + "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", + "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/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/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": [] +} 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..3bb3cbec 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", @@ -41,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" }, { 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 new file mode 100644 index 00000000..2dea603f --- /dev/null +++ b/json/matterjs-server.json @@ -0,0 +1,45 @@ +{ + "name": "MatterJS-Server", + "slug": "matterjs-server", + "categories": [ + 16 + ], + "date_created": "2026-05-20", + "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", + "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": [ + { + "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" + } + ] +} \ No newline at end of file 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" + } + ] +} 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 cbf4f0ee..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/", @@ -29,16 +30,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 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", 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/tools/arr-stack.sh b/tools/arr-stack.sh new file mode 100644 index 00000000..6eb35ee6 --- /dev/null +++ b/tools/arr-stack.sh @@ -0,0 +1,981 @@ +#!/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 +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}"; } +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:-}" +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) +_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 +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) || cancelled "storage pick" + 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) || 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) || 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 + 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) || cancelled "CIDR prompt" + 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) || cancelled "*arr app pick" + + 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) || cancelled "download client pick" + + 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() { + 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" + + 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() { + 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) || cancelled "IP list entry" + + 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) || cancelled "IP prompt for ${slug}" + + 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) || cancelled "starting CTID prompt" + + 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" + $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}" + exit 1 + fi + + msg_step "[${idx}/${total}] Installing ${s} -> ctid=${ctid} ip=${ip}/${var_cidr}" + $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}..." + 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 iputils-ping + 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 "$@" 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