diff --git a/CHANGELOG.md b/CHANGELOG.md index e4706d9e1..bc80e0b10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,8 +14,55 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. +## 2025-07-01 + +## 2025-06-30 + +### 🆕 New Scripts + + - Alpine Syncthing [@MickLesk](https://github.com/MickLesk) ([#5586](https://github.com/community-scripts/ProxmoxVE/pull/5586)) +- Kapowarr ([#5584](https://github.com/community-scripts/ProxmoxVE/pull/5584)) + +### 🚀 Updated Scripts + + - Fixing Cloudflare DDNS - lack of resources [@meszolym](https://github.com/meszolym) ([#5600](https://github.com/community-scripts/ProxmoxVE/pull/5600)) + + - #### 🐞 Bug Fixes + + - Immich: make changes to automatically enable QuickSync [@vhsdream](https://github.com/vhsdream) ([#5560](https://github.com/community-scripts/ProxmoxVE/pull/5560)) + - Apache Guacamole: Install auth-jdbc component that matches release version [@tremor021](https://github.com/tremor021) ([#5563](https://github.com/community-scripts/ProxmoxVE/pull/5563)) + + - #### ✨ New Features + + - tools.func: optimize binary installs with fetch_and_deploy helper [@MickLesk](https://github.com/MickLesk) ([#5588](https://github.com/community-scripts/ProxmoxVE/pull/5588)) + - [core]: add ipv6 configuration support [@MickLesk](https://github.com/MickLesk) ([#5575](https://github.com/community-scripts/ProxmoxVE/pull/5575)) + ## 2025-06-29 +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Linkwarden: Add backing up of data folder to the update function [@tremor021](https://github.com/tremor021) ([#5548](https://github.com/community-scripts/ProxmoxVE/pull/5548)) + + - #### ✨ New Features + + - Add cron-job api-key env variable to homarr script [@Meierschlumpf](https://github.com/Meierschlumpf) ([#5204](https://github.com/community-scripts/ProxmoxVE/pull/5204)) + +### 🧰 Maintenance + + - #### 📝 Documentation + + - update readme with valid discord link. other one expired [@BramSuurdje](https://github.com/BramSuurdje) ([#5567](https://github.com/community-scripts/ProxmoxVE/pull/5567)) + +### 🌐 Website + + - Update script-item.tsx [@ape364](https://github.com/ape364) ([#5549](https://github.com/community-scripts/ProxmoxVE/pull/5549)) + + - #### 🐞 Bug Fixes + + - fix bug in tooltip that would always render 'updateable' [@BramSuurdje](https://github.com/BramSuurdje) ([#5552](https://github.com/community-scripts/ProxmoxVE/pull/5552)) + ## 2025-06-28 ### 🚀 Updated Scripts diff --git a/ct/alpine-syncthing.sh b/ct/alpine-syncthing.sh new file mode 100644 index 000000000..3d41f5dba --- /dev/null +++ b/ct/alpine-syncthing.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: MickLesk (CanbiZ) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://syncthing.net/ + +APP="Alpine-Syncthing" +var_tags="${var_tags:-alpine;networking}" +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.22}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + msg_info "Updating Alpine Packages" + $STD apk -U upgrade + msg_ok "Updated Alpine Packages" + + msg_info "Updating Syncthing" + $STD apk upgrade syncthing + msg_ok "Updated Syncthing" + + msg_info "Restarting Syncthing" + $STD rc-service syncthing restart + msg_ok "Restarted Syncthing" + + exit 1 +} + +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}:8384${CL}" diff --git a/ct/cloudflare-ddns.sh b/ct/cloudflare-ddns.sh index 40511f698..1ff2a3668 100644 --- a/ct/cloudflare-ddns.sh +++ b/ct/cloudflare-ddns.sh @@ -7,8 +7,8 @@ source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/mis APP="Cloudflare-DDNS" var_tags="${var_tags:-network}" -var_cpu="${var_cpu:-1}" -var_ram="${var_ram:-512}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-1024}" var_disk="${var_disk:-3}" var_os="${var_os:-debian}" var_version="${var_version:-12}" diff --git a/ct/headers/alpine-syncthing b/ct/headers/alpine-syncthing new file mode 100644 index 000000000..8d684d61b --- /dev/null +++ b/ct/headers/alpine-syncthing @@ -0,0 +1,6 @@ + ___ __ _ _____ __ __ _ + / | / /___ (_)___ ___ / ___/__ ______ _____/ /_/ /_ (_)___ ____ _ + / /| | / / __ \/ / __ \/ _ \______\__ \/ / / / __ \/ ___/ __/ __ \/ / __ \/ __ `/ + / ___ |/ / /_/ / / / / / __/_____/__/ / /_/ / / / / /__/ /_/ / / / / / / / /_/ / +/_/ |_/_/ .___/_/_/ /_/\___/ /____/\__, /_/ /_/\___/\__/_/ /_/_/_/ /_/\__, / + /_/ /____/ /____/ diff --git a/ct/headers/kapowarr b/ct/headers/kapowarr new file mode 100644 index 000000000..e127f3647 --- /dev/null +++ b/ct/headers/kapowarr @@ -0,0 +1,6 @@ + __ __ + / //_/___ _____ ____ _ ______ ___________ + / ,< / __ `/ __ \/ __ \ | /| / / __ `/ ___/ ___/ + / /| / /_/ / /_/ / /_/ / |/ |/ / /_/ / / / / +/_/ |_\__,_/ .___/\____/|__/|__/\__,_/_/ /_/ + /_/ diff --git a/ct/homarr.sh b/ct/homarr.sh index afa498a7e..10484bd64 100644 --- a/ct/homarr.sh +++ b/ct/homarr.sh @@ -48,6 +48,7 @@ source /opt/homarr/.env set +a export DB_DIALECT='sqlite' export AUTH_SECRET=$(openssl rand -base64 32) +export CRON_JOB_API_KEY=$(openssl rand -base64 32) node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT for dir in $(find /opt/homarr_db/migrations/migrations -mindepth 1 -maxdepth 1 -type d); do dirname=$(basename "$dir") @@ -114,6 +115,7 @@ source /opt/homarr/.env set +a export DB_DIALECT='sqlite' export AUTH_SECRET=$(openssl rand -base64 32) +export CRON_JOB_API_KEY=$(openssl rand -base64 32) node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT for dir in $(find /opt/homarr_db/migrations/migrations -mindepth 1 -maxdepth 1 -type d); do dirname=$(basename "$dir") diff --git a/ct/kapowarr.sh b/ct/kapowarr.sh new file mode 100644 index 000000000..d3104fed4 --- /dev/null +++ b/ct/kapowarr.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Casvt/Kapowarr + +APP="Kapowarr" +var_tags="${var_tags:-Arr}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-256}" +var_disk="${var_disk:-2}" +var_os="${var_os:-debian}" +var_version="${var_version:-12}" +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/kapowarr.service ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + RELEASE=$(curl -s https://api.github.com/repos/Casvt/Kapowarr/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') + if [[ "${RELEASE}" != "$(cat $HOME/.kapowarr)" ]] || [[ ! -f $HOME/.kapowarr ]]; then + setup_uv + + msg_info "Stopping $APP" + systemctl stop kapowarr + msg_ok "Stopped $APP" + + msg_info "Creating Backup" + mv /opt/kapowarr/db /opt/ + msg_ok "Backup Created" + + fetch_and_deploy_gh_release "kapowarr" "Casvt/Kapowarr" + msg_info "Updating $APP to ${RELEASE}" + mv /opt/db /opt/kapowarr + msg_ok "Updated $APP to ${RELEASE}" + + msg_info "Starting $APP" + systemctl start kapowarr + msg_ok "Started $APP" + + msg_ok "Update Successful" + else + msg_ok "No update required. ${APP} is already at ${RELEASE}" + 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}:5656${CL}" diff --git a/ct/linkwarden.sh b/ct/linkwarden.sh index a111ffd8b..012dff37a 100644 --- a/ct/linkwarden.sh +++ b/ct/linkwarden.sh @@ -37,6 +37,7 @@ function update_script() { msg_info "Updating ${APP} to ${RELEASE}" mv /opt/linkwarden/.env /opt/.env + [ -d /opt/linkwarden/data ] && mv /opt/linkwarden/data /opt/data.bak rm -rf /opt/linkwarden fetch_and_deploy_gh_release "linkwarden" "linkwarden/linkwarden" cd /opt/linkwarden @@ -47,6 +48,7 @@ function update_script() { $STD yarn prisma:generate $STD yarn web:build $STD yarn prisma:deploy + [ -d /opt/data.bak ] && mv /opt/data.bak /opt/linkwarden/data msg_ok "Updated ${APP} to ${RELEASE}" msg_info "Starting ${APP}" diff --git a/frontend/public/json/cloudflare-ddns.json b/frontend/public/json/cloudflare-ddns.json index 54fb39952..cb0c4a3d3 100644 --- a/frontend/public/json/cloudflare-ddns.json +++ b/frontend/public/json/cloudflare-ddns.json @@ -19,8 +19,8 @@ "type": "default", "script": "ct/cloudflare-ddns.sh", "resources": { - "cpu": 1, - "ram": 512, + "cpu": 2, + "ram": 1024, "hdd": 2, "os": "Debian", "version": "12" diff --git a/frontend/public/json/kapowarr.json b/frontend/public/json/kapowarr.json new file mode 100644 index 000000000..6468f1eac --- /dev/null +++ b/frontend/public/json/kapowarr.json @@ -0,0 +1,35 @@ +{ + "name": "Kapowarr", + "slug": "kapowarr", + "categories": [ + 14 + ], + "date_created": "2025-06-30", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 5656, + "documentation": "https://casvt.github.io/Kapowarr/general_info/workings/", + "website": "https://casvt.github.io/Kapowarr/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/kapowarr.webp", + "config_path": "", + "description": "Kapowarr allows you to build a digital library of comics. You can add volumes, map them to a folder and start managing! Download, rename, move and convert issues of the volume (including TPB's, One Shots, Hard Covers, and more). The whole process is automated and can be customised in the settings.", + "install_methods": [ + { + "type": "default", + "script": "ct/kapowarr.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 2, + "os": "debian", + "version": "12" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/frontend/public/json/syncthing.json b/frontend/public/json/syncthing.json index b6a195b99..4cc6cae25 100644 --- a/frontend/public/json/syncthing.json +++ b/frontend/public/json/syncthing.json @@ -12,7 +12,7 @@ "documentation": null, "website": "https://syncthing.net/", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/syncthing.webp", - "config_path": "/root/.local/state/syncthing/config.xml", + "config_path": "/root/.local/state/syncthing/config.xml - Alpine: /var/lib/syncthing/.local/state/syncthing/config.xml", "description": "Syncthing is an open-source file syncing tool that allows users to keep their files in sync across multiple devices by using peer-to-peer synchronization. It doesn't rely on any central server, so all data transfers are directly between devices.", "install_methods": [ { @@ -25,8 +25,19 @@ "os": "debian", "version": "12" } - } - ], + }, + { + "type": "alpine", + "script": "ct/alpine-syncthing.sh", + "resources": { + "cpu": 1, + "ram": 256, + "hdd": 1, + "os": "alpine", + "version": "3.22" + } + } + ], "default_credentials": { "username": null, "password": null diff --git a/frontend/public/json/versions.json b/frontend/public/json/versions.json index 48f4e6a2f..fd51efbb8 100644 --- a/frontend/public/json/versions.json +++ b/frontend/public/json/versions.json @@ -1,13 +1,123 @@ [ + { + "name": "MagicMirrorOrg/MagicMirror", + "version": "v2.32.0", + "date": "2025-06-30T22:12:48Z" + }, + { + "name": "mongodb/mongo", + "version": "r8.0.11", + "date": "2025-06-30T20:30:31Z" + }, + { + "name": "docker/compose", + "version": "v2.38.1", + "date": "2025-06-30T20:07:35Z" + }, { "name": "home-assistant/core", "version": "2025.6.3", "date": "2025-06-24T13:00:12Z" }, + { + "name": "rcourtman/Pulse", + "version": "v3.33.1", + "date": "2025-06-30T11:29:32Z" + }, + { + "name": "jhuckaby/Cronicle", + "version": "v0.9.81", + "date": "2025-06-30T16:40:33Z" + }, + { + "name": "ollama/ollama", + "version": "v0.9.4-rc2", + "date": "2025-06-27T18:45:33Z" + }, + { + "name": "prometheus/prometheus", + "version": "v2.53.5", + "date": "2025-06-30T11:01:12Z" + }, + { + "name": "n8n-io/n8n", + "version": "n8n@1.100.0", + "date": "2025-06-23T12:48:35Z" + }, + { + "name": "jupyter/notebook", + "version": "v7.4.4", + "date": "2025-06-30T13:04:22Z" + }, + { + "name": "keycloak/keycloak", + "version": "26.3.0", + "date": "2025-06-30T12:53:32Z" + }, + { + "name": "Graylog2/graylog2-server", + "version": "6.3.0", + "date": "2025-06-30T11:26:45Z" + }, + { + "name": "grokability/snipe-it", + "version": "v8.1.17", + "date": "2025-06-30T11:26:27Z" + }, + { + "name": "documenso/documenso", + "version": "v1.12.0-rc.8", + "date": "2025-06-30T09:47:37Z" + }, { "name": "PrivateBin/PrivateBin", - "version": "1.7.7", - "date": "2025-06-28T19:57:56Z" + "version": "1.7.8", + "date": "2025-06-30T09:00:54Z" + }, + { + "name": "fuma-nama/fumadocs", + "version": "fumadocs-mdx@11.6.10", + "date": "2025-06-30T07:07:36Z" + }, + { + "name": "mattermost/mattermost", + "version": "preview-v0.1", + "date": "2025-06-27T14:35:47Z" + }, + { + "name": "Jackett/Jackett", + "version": "v0.22.2097", + "date": "2025-06-30T05:53:30Z" + }, + { + "name": "typesense/typesense", + "version": "v29.0", + "date": "2025-06-30T03:52:33Z" + }, + { + "name": "firefly-iii/firefly-iii", + "version": "v6.2.19", + "date": "2025-06-28T06:53:45Z" + }, + { + "name": "sysadminsmedia/homebox", + "version": "v0.20.0", + "date": "2025-06-29T18:50:03Z" + }, + { + "name": "dgtlmoon/changedetection.io", + "version": "0.50.5", + "date": "2025-06-29T08:54:47Z" + }, + { + "name": "emqx/emqx", + "version": "e5.9.1-rc.1", + "date": "2025-06-29T07:27:21Z" + }, + { + "name": "theonedev/onedev", + "version": "v11.11.2", + "date": "2025-06-29T01:40:39Z" }, { "name": "linkwarden/linkwarden", @@ -19,21 +129,11 @@ "version": "v1.22.5", "date": "2025-06-28T16:06:19Z" }, - { - "name": "Jackett/Jackett", - "version": "v0.22.2075", - "date": "2025-06-28T10:16:17Z" - }, { "name": "Luligu/matterbridge", "version": "3.1.0", "date": "2025-06-28T09:02:38Z" }, - { - "name": "firefly-iii/firefly-iii", - "version": "v6.2.19", - "date": "2025-06-28T06:53:45Z" - }, { "name": "esphome/esphome", "version": "2025.6.2", @@ -59,36 +159,16 @@ "version": "v1.26.0", "date": "2025-06-27T19:15:24Z" }, - { - "name": "ollama/ollama", - "version": "v0.9.4-rc1", - "date": "2025-06-27T18:45:33Z" - }, - { - "name": "mattermost/mattermost", - "version": "preview-v0.1", - "date": "2025-06-27T14:35:47Z" - }, { "name": "goauthentik/authentik", "version": "version/2025.6.3", "date": "2025-06-27T14:01:06Z" }, - { - "name": "keycloak/keycloak", - "version": "26.2.5", - "date": "2025-05-28T06:49:43Z" - }, { "name": "rclone/rclone", "version": "v1.70.2", "date": "2025-06-27T13:21:17Z" }, - { - "name": "documenso/documenso", - "version": "v1.12.0-rc.7", - "date": "2025-06-27T12:17:45Z" - }, { "name": "sabnzbd/sabnzbd", "version": "4.5.1", @@ -119,11 +199,6 @@ "version": "4.9.1.2", "date": "2025-06-26T22:08:00Z" }, - { - "name": "prometheus/prometheus", - "version": "v3.4.2", - "date": "2025-06-26T21:45:21Z" - }, { "name": "home-assistant/operating-system", "version": "15.2", @@ -144,11 +219,6 @@ "version": "v1.84.3", "date": "2025-06-26T16:31:57Z" }, - { - "name": "fuma-nama/fumadocs", - "version": "fumadocs-ui@15.5.5", - "date": "2025-06-26T15:54:17Z" - }, { "name": "traefik/traefik", "version": "v3.5.0-rc1", @@ -174,16 +244,6 @@ "version": "18.0.7", "date": "2025-06-26T09:16:33Z" }, - { - "name": "mongodb/mongo", - "version": "r8.1.2-rc1", - "date": "2025-06-25T22:42:04Z" - }, - { - "name": "rcourtman/Pulse", - "version": "v3.32.0", - "date": "2025-06-25T22:27:01Z" - }, { "name": "gristlabs/grist-core", "version": "v1.6.1", @@ -214,11 +274,6 @@ "version": "testing", "date": "2025-06-16T18:10:42Z" }, - { - "name": "n8n-io/n8n", - "version": "n8n@1.100.0", - "date": "2025-06-23T12:48:35Z" - }, { "name": "moghtech/komodo", "version": "v1.18.4", @@ -249,11 +304,6 @@ "version": "v1.132.0", "date": "2025-06-17T13:49:30Z" }, - { - "name": "docker/compose", - "version": "v2.37.3", - "date": "2025-06-24T14:05:33Z" - }, { "name": "Checkmk/checkmk", "version": "v2.4.0p5", @@ -284,11 +334,6 @@ "version": "pmm-6401-v1.120.0", "date": "2025-06-23T15:12:12Z" }, - { - "name": "Graylog2/graylog2-server", - "version": "6.3.0-rc.2", - "date": "2025-06-23T11:31:38Z" - }, { "name": "gotson/komga", "version": "1.22.0", @@ -329,21 +374,11 @@ "version": "v2.0.114", "date": "2025-06-21T11:20:21Z" }, - { - "name": "theonedev/onedev", - "version": "v11.11.1", - "date": "2025-06-21T09:23:39Z" - }, { "name": "pocketbase/pocketbase", "version": "v0.28.4", "date": "2025-06-21T08:29:04Z" }, - { - "name": "dgtlmoon/changedetection.io", - "version": "0.50.4", - "date": "2025-06-21T07:47:02Z" - }, { "name": "go-gitea/gitea", "version": "v1.24.2", @@ -494,21 +529,11 @@ "version": "2.36.1", "date": "2025-06-16T19:20:54Z" }, - { - "name": "emqx/emqx", - "version": "e5.9.1-alpha.1", - "date": "2025-06-16T15:34:01Z" - }, { "name": "open-webui/open-webui", "version": "v0.6.15", "date": "2025-06-16T14:34:42Z" }, - { - "name": "grokability/snipe-it", - "version": "v8.1.16", - "date": "2025-06-16T13:49:37Z" - }, { "name": "jellyfin/jellyfin", "version": "v10.10.7", @@ -779,11 +804,6 @@ "version": "1.34.1", "date": "2025-05-26T21:40:54Z" }, - { - "name": "jupyter/notebook", - "version": "v7.4.3", - "date": "2025-05-26T14:27:27Z" - }, { "name": "stonith404/pingvin-share", "version": "v1.13.0", @@ -894,11 +914,6 @@ "version": "2025-05-07-r1", "date": "2025-05-07T12:18:42Z" }, - { - "name": "sysadminsmedia/homebox", - "version": "v0.19.0", - "date": "2025-05-06T18:05:42Z" - }, { "name": "garethgeorge/backrest", "version": "v1.8.1", @@ -919,11 +934,6 @@ "version": "v1.13.5", "date": "2025-05-03T09:48:44Z" }, - { - "name": "jhuckaby/Cronicle", - "version": "v0.9.80", - "date": "2025-05-02T16:48:15Z" - }, { "name": "WordPress/WordPress", "version": "6.8.1", @@ -1039,11 +1049,6 @@ "version": "2.3", "date": "2025-04-05T18:05:36Z" }, - { - "name": "MagicMirrorOrg/MagicMirror", - "version": "v2.31.0", - "date": "2025-04-01T18:12:45Z" - }, { "name": "Kometa-Team/Kometa", "version": "v2.2.0", @@ -1184,11 +1189,6 @@ "version": "v2.7.1", "date": "2025-02-22T01:14:41Z" }, - { - "name": "typesense/typesense", - "version": "v28.0", - "date": "2025-02-18T15:49:57Z" - }, { "name": "recyclarr/recyclarr", "version": "v7.4.1", diff --git a/frontend/src/app/scripts/_components/ScriptItems/install-command.tsx b/frontend/src/app/scripts/_components/ScriptItems/install-command.tsx deleted file mode 100644 index 75aafe7c2..000000000 --- a/frontend/src/app/scripts/_components/ScriptItems/install-command.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { Info } from "lucide-react"; - -import type { Script } from "@/lib/types"; - -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { Alert, AlertDescription } from "@/components/ui/alert"; -import CodeCopyButton from "@/components/ui/code-copy-button"; - -import { getDisplayValueFromType } from "../script-info-blocks"; - -function getInstallCommand(scriptPath = "", isAlpine = false, useGitea = false) { - const githubUrl = `https://raw.githubusercontent.com/asylumexp/Proxmox/main/${scriptPath}`; - const giteaUrl = `https://git.community-scripts.org/asylumexp/Proxmox/raw/branch/main/${scriptPath}`; - const url = useGitea ? giteaUrl : githubUrl; - return isAlpine ? `bash -c "$(curl -fsSL ${url})"` : `bash -c "$(curl -fsSL ${url})"`; -} -export default function InstallCommand({ item }: { item: Script }) { - const alpineScript = item.install_methods.find(method => method.type === "alpine"); - const defaultScript = item.install_methods.find(method => method.type === "default"); - - const renderInstructions = (isAlpine = false) => ( - <> -

- {isAlpine - ? ( - <> - As an alternative option, you can use Alpine Linux and the - {" "} - {item.name} - {" "} - package to create a - {" "} - {item.name} - {" "} - {getDisplayValueFromType(item.type)} - {" "} - container with faster creation time and minimal system resource usage. - You are also obliged to adhere to updates provided by the package maintainer. - - ) - : item.type === "pve" - ? ( - <> - To use the - {" "} - {item.name} - {" "} - script, run the command below **only** in the Proxmox VE Shell. This script is - intended for managing or enhancing the host system directly. - - ) - : item.type === "addon" - ? ( - <> - This script enhances an existing setup. You can use it inside a running LXC container or directly on the - Proxmox VE host to extend functionality with - {" "} - {item.name} - . - - ) - : ( - <> - To create a new Proxmox VE - {" "} - {item.name} - {" "} - {getDisplayValueFromType(item.type)} - , run the command below in the - Proxmox VE Shell. - - )} -

- {isAlpine && ( -

- To create a new Proxmox VE Alpine- - {item.name} - {" "} - {getDisplayValueFromType(item.type)} - , run the command below in - the Proxmox VE Shell. -

- )} - - ); - - const renderGiteaInfo = () => ( - - - - When to use Gitea: - {" "} - GitHub may have issues including slow connections, delayed updates after bug - fixes, no IPv6 support, API rate limits (60/hour). Use our Gitea mirror as a reliable alternative when - experiencing these issues. - - - ); - - const renderScriptTabs = (useGitea = false) => { - if (alpineScript) { - return ( - - - Default - Alpine Linux - - - {renderInstructions()} - {getInstallCommand(defaultScript?.script, false, useGitea)} - - - {renderInstructions(true)} - {getInstallCommand(alpineScript.script, true, useGitea)} - - - ); - } - else if (defaultScript?.script) { - return ( - <> - {renderInstructions()} - {getInstallCommand(defaultScript.script, false, useGitea)} - - ); - } - return null; - }; - - return ( -
- - - GitHub - Gitea - - - {renderScriptTabs(false)} - - - {renderGiteaInfo()} - {renderScriptTabs(true)} - - -
- ); -} diff --git a/frontend/src/app/scripts/_components/script-item.tsx b/frontend/src/app/scripts/_components/script-item.tsx index 294686ae7..ea897c65d 100644 --- a/frontend/src/app/scripts/_components/script-item.tsx +++ b/frontend/src/app/scripts/_components/script-item.tsx @@ -77,6 +77,7 @@ function ScriptHeader({ item }: { item: Script }) {
Added + {" "} {extractDate(item.date_created)} diff --git a/frontend/src/app/scripts/_components/script-items/tool-tips.tsx b/frontend/src/app/scripts/_components/script-items/tool-tips.tsx index ad953397b..f4a6be853 100644 --- a/frontend/src/app/scripts/_components/script-items/tool-tips.tsx +++ b/frontend/src/app/scripts/_components/script-items/tool-tips.tsx @@ -39,7 +39,7 @@ export default function Tooltips({ item }: { item: Script }) { {item.privileged && ( )} - {(item.updateable || item.type !== "pve") && ( + {item.updateable && item.type !== "pve" && ( >~/guacamole.creds -cd guacamole-auth-jdbc-1.5.5/mysql/schema +cd guacamole-auth-jdbc-${RELEASE_SERVER}/mysql/schema cat *.sql | mariadb -u root ${DB_NAME} { echo "mysql-hostname: 127.0.0.1" @@ -147,8 +147,8 @@ motd_ssh customize msg_info "Cleaning up" -rm -rf ~/mysql-connector-java-8.0.26{,.tar.gz} -rm -rf ~/guacamole-auth-jdbc-1.5.5{,.tar.gz} +rm -rf ~/mysql-connector-j-9.3.0{,.tar.gz} +rm -rf ~/guacamole-auth-jdbc-$RELEASE_SERVER{,.tar.gz} $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned" diff --git a/install/homarr-install.sh b/install/homarr-install.sh index 2521f064e..ddc34408a 100644 --- a/install/homarr-install.sh +++ b/install/homarr-install.sh @@ -76,6 +76,7 @@ source /opt/homarr/.env set +a export DB_DIALECT='sqlite' export AUTH_SECRET=$(openssl rand -base64 32) +export CRON_JOB_API_KEY=$(openssl rand -base64 32) node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT for dir in $(find /opt/homarr_db/migrations/migrations -mindepth 1 -maxdepth 1 -type d); do dirname=$(basename "$dir") diff --git a/install/immich-install.sh b/install/immich-install.sh index 5fd9fd9c1..4a75d0e5f 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -84,6 +84,13 @@ $STD apt-get update $STD apt-get install -y jellyfin-ffmpeg7 ln -s /usr/lib/jellyfin-ffmpeg/ffmpeg /usr/bin/ffmpeg ln -s /usr/lib/jellyfin-ffmpeg/ffprobe /usr/bin/ffprobe +if [[ "$CTTYPE" == "0" ]]; then + chgrp video /dev/dri + chmod 755 /dev/dri + chmod 660 /dev/dri/* + $STD adduser "$(id -u -n)" video + $STD adduser "$(id -u -n)" render +fi msg_ok "Dependencies Installed" NODE_VERSION="22" setup_nodejs @@ -329,9 +336,8 @@ msg_ok "Installed ${APPLICATION}" msg_info "Creating user, env file, scripts & services" $STD useradd -U -s /usr/sbin/nologin -r -M -d "$INSTALL_DIR" immich -if [[ -f ~/.openvino ]]; then - usermod -aG video,render immich -fi +usermod -aG video,render immich + cat <"${INSTALL_DIR}"/.env TZ=$(cat /etc/timezone) IMMICH_VERSION=release diff --git a/install/kapowarr-install.sh b/install/kapowarr-install.sh new file mode 100644 index 000000000..c5f29a7b3 --- /dev/null +++ b/install/kapowarr-install.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2025 community-scripts ORG +# Author: Slaviša Arežina (tremor021) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/Casvt/Kapowarr + +source /dev/stdin <<<"$FUNCTIONS_FILE_PATH" +color +verb_ip6 +catch_errors +setting_up_container +network_check +update_os + +msg_info "Setup Python3" +$STD apt-get install -y python3-pip +msg_ok "Setup Python3" + +setup_uv +fetch_and_deploy_gh_release "kapowarr" "Casvt/Kapowarr" + +msg_info "Setup Kapowarr" +cd /opt/kapowarr +$STD uv venv .venv +$STD source .venv/bin/activate +$STD uv pip install --upgrade pip +$STD uv pip install --no-cache-dir -r requirements.txt +msg_ok "Installed Kapowarr" + +msg_info "Creating Service" +cat </etc/systemd/system/kapowarr.service +[Unit] +Description=Kapowarr Service +After=network.target + +[Service] +WorkingDirectory=/opt/kapowarr/ +ExecStart=/opt/kapowarr/.venv/bin/python3 Kapowarr.py +Restart=always + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now kapowarr +msg_ok "Created Service" + +motd_ssh +customize + +msg_info "Cleaning up" +$STD apt-get -y autoremove +$STD apt-get -y autoclean +msg_ok "Cleaned" diff --git a/misc/api.func b/misc/api.func index 3d492511a..0996eed23 100644 --- a/misc/api.func +++ b/misc/api.func @@ -30,7 +30,7 @@ post_to_api() { "ram_size": $RAM_SIZE, "os_type": "$var_os-arm64", "os_version": "$var_version", - "disableip6": "$DISABLEIP6", + "disableip6": "", "nsapp": "$NSAPP", "method": "$METHOD", "pve_version": "$pve_version", diff --git a/misc/build.func b/misc/build.func index 3ace386ad..c3307f6f7 100644 --- a/misc/build.func +++ b/misc/build.func @@ -19,11 +19,9 @@ source <(curl -s https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/a if command -v curl >/dev/null 2>&1; then source <(curl -fsSL https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/core.func) load_functions - #echo "(build.func) Loaded core.func via curl" elif command -v wget >/dev/null 2>&1; then source <(wget -qO- https://raw.githubusercontent.com/asylumexp/Proxmox/main/misc/core.func) load_functions - #echo "(build.func) Loaded core.func via wget" fi # This function enables error handling in the script by setting options and defining a trap for the ERR signal. catch_errors() { @@ -188,10 +186,12 @@ base_settings() { HN=$NSAPP BRG="vmbr0" NET="dhcp" + IPV6_METHOD="none" + IPV6_STATIC="" GATE="" APT_CACHER="" APT_CACHER_IP="" - DISABLEIP6="no" + #DISABLEIP6="no" MTU="" SD="" NS="" @@ -238,7 +238,7 @@ RAM_SIZE="${RAM_SIZE}" HN="${HN}" BRG="${BRG}" APT_CACHER_IP="${APT_CACHER_IP:-none}" -DISABLEIP6="${DISABLEIP6}" +DISABLEIP6="" PW='${PW:-none}' SSH="${SSH}" SSH_AUTHORIZED_KEY="${SSH_AUTHORIZED_KEY}" @@ -270,7 +270,7 @@ RAM_SIZE="${RAM_SIZE}" HN="${HN}" BRG="${BRG}" APT_CACHER_IP="${APT_CACHER_IP:-none}" -DISABLEIP6="${DISABLEIP6}" +DISABLEIP6="" PW='${PW:-none}' SSH="${SSH}" SSH_AUTHORIZED_KEY="${SSH_AUTHORIZED_KEY}" @@ -530,43 +530,130 @@ advanced_settings() { fi fi + # IPv4 methods: dhcp, static, none while true; do - NET=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Static IPv4 CIDR Address (/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3) + IPV4_METHOD=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + --title "IPv4 Address Management" \ + --menu "Select IPv4 Address Assignment Method:" 12 60 2 \ + "dhcp" "Automatic (DHCP, recommended)" \ + "static" "Static (manual entry)" \ + 3>&1 1>&2 2>&3) + exit_status=$? - if [ $exit_status -eq 0 ]; then - if [ "$NET" = "dhcp" ]; then - echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}$NET${CL}" - break - else - if [[ "$NET" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}/([0-9]|[1-2][0-9]|3[0-2])$ ]]; then - echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}$NET${CL}" - break - else - whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "$NET is an invalid IPv4 CIDR address. Please enter a valid IPv4 CIDR address or 'dhcp'" 8 58 - fi - fi - else + if [ $exit_status -ne 0 ]; then exit_script fi + + case "$IPV4_METHOD" in + dhcp) + NET="dhcp" + GATE="" + echo -e "${NETWORK}${BOLD}${DGN}IPv4: DHCP${CL}" + break + ;; + static) + # Static: call and validate CIDR address + while true; do + NET=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + --inputbox "Enter Static IPv4 CIDR Address (e.g. 192.168.100.50/24)" 8 58 "" \ + --title "IPv4 ADDRESS" 3>&1 1>&2 2>&3) + if [ -z "$NET" ]; then + whiptail --msgbox "IPv4 address must not be empty." 8 58 + continue + elif [[ "$NET" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}/([0-9]|[1-2][0-9]|3[0-2])$ ]]; then + echo -e "${NETWORK}${BOLD}${DGN}IPv4 Address: ${BGN}$NET${CL}" + break + else + whiptail --msgbox "$NET is not a valid IPv4 CIDR address. Please enter a correct value!" 8 58 + fi + done + + # call and validate Gateway + while true; do + GATE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" \ + --inputbox "Enter Gateway IP address for static IPv4" 8 58 "" \ + --title "Gateway IP" 3>&1 1>&2 2>&3) + if [ -z "$GATE1" ]; then + whiptail --msgbox "Gateway IP address cannot be empty." 8 58 + elif [[ ! "$GATE1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then + whiptail --msgbox "Invalid Gateway IP address format." 8 58 + else + GATE=",gw=$GATE1" + echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}$GATE1${CL}" + break + fi + done + break + ;; + esac done - if [ "$NET" != "dhcp" ]; then - while true; do - GATE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Enter gateway IP address" 8 58 --title "Gateway IP" 3>&1 1>&2 2>&3) - if [ -z "$GATE1" ]; then - whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "Gateway IP address cannot be empty" 8 58 - elif [[ ! "$GATE1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then - whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "Invalid IP address format" 8 58 - else - GATE=",gw=$GATE1" - echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}$GATE1${CL}" - break - fi - done - else - GATE="" - echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}Default${CL}" - fi + # IPv6 Address Management selection + while true; do + IPV6_METHOD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --menu \ + "Select IPv6 Address Management Type:" 15 58 4 \ + "auto" "SLAAC/AUTO (recommended, default)" \ + "dhcp" "DHCPv6" \ + "static" "Static (manual entry)" \ + "none" "Disabled" \ + --default-item "auto" 3>&1 1>&2 2>&3) + [ $? -ne 0 ] && exit_script + + case "$IPV6_METHOD" in + auto) + echo -e "${NETWORK}${BOLD}${DGN}IPv6: ${BGN}SLAAC/AUTO${CL}" + IPV6_ADDR="" + IPV6_GATE="" + break + ;; + dhcp) + echo -e "${NETWORK}${BOLD}${DGN}IPv6: ${BGN}DHCPv6${CL}" + IPV6_ADDR="dhcp" + IPV6_GATE="" + break + ;; + static) + # Ask for static IPv6 address (CIDR notation, e.g., 2001:db8::1234/64) + while true; do + IPV6_ADDR=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox \ + "Set a static IPv6 CIDR address (e.g., 2001:db8::1234/64)" 8 58 "" \ + --title "IPv6 STATIC ADDRESS" 3>&1 1>&2 2>&3) || exit_script + if [[ "$IPV6_ADDR" =~ ^([0-9a-fA-F:]+:+)+[0-9a-fA-F]+(/[0-9]{1,3})$ ]]; then + echo -e "${NETWORK}${BOLD}${DGN}IPv6 Address: ${BGN}$IPV6_ADDR${CL}" + break + else + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox \ + "$IPV6_ADDR is an invalid IPv6 CIDR address. Please enter a valid IPv6 CIDR address (e.g., 2001:db8::1234/64)" 8 58 + fi + done + # Optional: ask for IPv6 gateway for static config + while true; do + IPV6_GATE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox \ + "Enter IPv6 gateway address (optional, leave blank for none)" 8 58 "" --title "IPv6 GATEWAY" 3>&1 1>&2 2>&3) + if [ -z "$IPV6_GATE" ]; then + IPV6_GATE="" + break + elif [[ "$IPV6_GATE" =~ ^([0-9a-fA-F:]+:+)+[0-9a-fA-F]+$ ]]; then + break + else + whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox \ + "Invalid IPv6 gateway format." 8 58 + + fi + done + break + ;; + none) + echo -e "${NETWORK}${BOLD}${DGN}IPv6: ${BGN}Disabled${CL}" + IPV6_ADDR="none" + IPV6_GATE="" + break + ;; + *) + exit_script + ;; + esac + done if [ "$var_os" == "alpine" ]; then APT_CACHER="" @@ -580,12 +667,12 @@ advanced_settings() { fi fi - if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then - DISABLEIP6="yes" - else - DISABLEIP6="no" - fi - echo -e "${DISABLEIPV6}${BOLD}${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}" + # if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then + # DISABLEIP6="yes" + # else + # DISABLEIP6="no" + # fi + # echo -e "${DISABLEIPV6}${BOLD}${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}" if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default [The MTU of your selected vmbr, default is 1500])" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then if [ -z "$MTU1" ]; then @@ -947,6 +1034,16 @@ start() { build_container() { # if [ "$VERBOSE" == "yes" ]; then set -x; fi + NET_STRING="-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU" + case "$IPV6_METHOD" in + auto) NET_STRING="$NET_STRING,ip6=auto" ;; + dhcp) NET_STRING="$NET_STRING,ip6=dhcp" ;; + static) + NET_STRING="$NET_STRING,ip6=$IPV6_ADDR" + [ -n "$IPV6_GATE" ] && NET_STRING="$NET_STRING,gw6=$IPV6_GATE" + ;; + none) ;; + esac if [ "$CT_TYPE" == "1" ]; then FEATURES="keyctl=1,nesting=1" else @@ -974,7 +1071,7 @@ build_container() { export CACHER="$APT_CACHER" export CACHER_IP="$APT_CACHER_IP" export tz="$timezone" - export DISABLEIPV6="$DISABLEIP6" + #export DISABLEIPV6="$DISABLEIP6" export APPLICATION="$APP" export app="$NSAPP" export PASSWORD="$PW" @@ -994,7 +1091,7 @@ build_container() { -tags $TAGS $SD $NS - -net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU + $NET_STRING -onboot 1 -cores $CORE_COUNT -memory $RAM_SIZE diff --git a/misc/config-file.func b/misc/config-file.func index 401cd73cb..5e7d6d7cc 100644 --- a/misc/config-file.func +++ b/misc/config-file.func @@ -424,19 +424,6 @@ config_file() { fi fi - if [[ "${DISABLEIP6-}" == "yes" ]]; then - echo -e "${DISABLEIPV6}${BOLD}${DGN}Disable IPv6: ${BGN}Yes${CL}" - elif [[ "${DISABLEIP6-}" == "no" ]]; then - echo -e "${DISABLEIPV6}${BOLD}${DGN}Disable IPv6: ${BGN}No${CL}" - else - if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then - DISABLEIP6="yes" - else - DISABLEIP6="no" - fi - echo -e "${DISABLEIPV6}${BOLD}${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}" - fi - if [[ -n "${MTU-}" ]]; then if [[ "$MTU" =~ ^-?[0-9]+$ ]]; then echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU${CL}" diff --git a/misc/tools.func b/misc/tools.func index bd3e3669b..76e5c666b 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -828,19 +828,30 @@ function fetch_and_deploy_gh_release() { elif [[ "$mode" == "binary" ]]; then local arch arch=$(dpkg --print-architecture 2>/dev/null || uname -m) - [[ "$arch" == "x86_64" ]] && arch="x86_64" + [[ "$arch" == "x86_64" ]] && arch="amd64" [[ "$arch" == "aarch64" ]] && arch="arm64" local assets url_match="" assets=$(echo "$json" | jq -r '.assets[].browser_download_url') - for u in $assets; do - if [[ "$u" =~ ($arch|amd64|x86_64|aarch64|arm64).*\.deb$ ]]; then - url_match="$u" - break - fi - done + # If explicit filename pattern is provided (param $6), match that first + if [[ -n "$6" ]]; then + for u in $assets; do + [[ "$u" =~ $6 || "$u" == *"$6" ]] && url_match="$u" && break + done + fi + # If no match via explicit pattern, fall back to architecture heuristic + if [[ -z "$url_match" ]]; then + for u in $assets; do + if [[ "$u" =~ ($arch|amd64|x86_64|aarch64|arm64).*\.deb$ ]]; then + url_match="$u" + break + fi + done + fi + + # Fallback: any .deb file if [[ -z "$url_match" ]]; then for u in $assets; do [[ "$u" =~ \.deb$ ]] && url_match="$u" && break diff --git a/tools/addon/filebrowser-quantum.sh b/tools/addon/filebrowser-quantum.sh index 9fae0e4bc..6dc03af2d 100644 --- a/tools/addon/filebrowser-quantum.sh +++ b/tools/addon/filebrowser-quantum.sh @@ -163,7 +163,7 @@ server: disableIndexing: false indexingIntervalMinutes: 240 exclude: - folders: + folderPaths: - "/proc" - "/sys" - "/dev" @@ -185,7 +185,7 @@ server: disableIndexing: false indexingIntervalMinutes: 240 exclude: - folders: + folderPaths: - "/proc" - "/sys" - "/dev"