-
+
Website built by the community. The source code is avaliable on{" "}
-
-
-
-
-
Proxmox ARM64 Helper-Scripts
-
-
-
-
- {navbarLinks.map(({ href, event, icon, text }) => (
-
-
-
-
-
-
- {text}
-
-
-
- ))}
-
-
-
-
- >
- );
+ <>
+
+
+
+
+
Proxmox ARM64 Helper-Scripts
+
+
+
+
+ {navbarLinks.map(({ href, event, icon, text, mobileHidden }) => (
+
+
+
+
+
+
+ {text}
+
+
+
+ ))}
+
+
+
+
+ >
+ );
}
export default Navbar;
diff --git a/frontend/src/config/siteConfig.tsx b/frontend/src/config/siteConfig.tsx
index 2e32cc7a5..4076d4650 100644
--- a/frontend/src/config/siteConfig.tsx
+++ b/frontend/src/config/siteConfig.tsx
@@ -1,7 +1,7 @@
import { OperatingSystem } from "@/lib/types";
import { MessagesSquare, Scroll } from "lucide-react";
-import { FaDiscord, FaGithub } from "react-icons/fa";
import React from "react";
+import { FaDiscord, FaGithub } from "react-icons/fa";
export const basePath = process.env.BASE_PATH;
diff --git a/install/actualbudget-install.sh b/install/actualbudget-install.sh
index f8ca7f61c..7cb40070d 100644
--- a/install/actualbudget-install.sh
+++ b/install/actualbudget-install.sh
@@ -18,9 +18,8 @@ $STD apt-get install -y \
curl \
sudo \
mc \
+ tini \
gpg \
- git \
- jq \
build-essential \
wget \
openssh-server
@@ -29,7 +28,7 @@ msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository"
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
-echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
+echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
msg_ok "Set up Node.js Repository"
msg_info "Installing Node.js"
@@ -38,10 +37,12 @@ $STD apt-get install -y nodejs
$STD npm install --global yarn
msg_ok "Installed Node.js"
-RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual-server/tags | jq --raw-output '.[0].name')
-msg_info "Installing Actual Budget $RELEASE"
-wget -q https://codeload.github.com/actualbudget/actual-server/legacy.tar.gz/refs/tags/${RELEASE} -O - | tar -xz
-mv actualbudget-actual-server-* /opt/actualbudget
+msg_info "Installing Actual Budget"
+cd /opt
+RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+wget -q https://github.com/actualbudget/actual-server/archive/refs/tags/v${RELEASE}.tar.gz
+tar -xzf v${RELEASE}.tar.gz
+mv *ctual-server-* /opt/actualbudget
mkdir -p /opt/actualbudget/server-files
mkdir -p /opt/actualbudget-data
chown -R root:root /opt/actualbudget/server-files
@@ -54,6 +55,7 @@ PORT=5006
EOF
cd /opt/actualbudget
$STD yarn install
+echo "${RELEASE}" >"/opt/actualbudget_version.txt"
msg_ok "Installed Actual Budget"
msg_info "Creating Service"
@@ -82,6 +84,7 @@ motd_ssh
customize
msg_info "Cleaning up"
+rm -rf /opt/v${RELEASE}.tar.gz
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
diff --git a/install/bazarr-install.sh b/install/bazarr-install.sh
index 7ae07552e..a05dde468 100644
--- a/install/bazarr-install.sh
+++ b/install/bazarr-install.sh
@@ -21,13 +21,13 @@ $STD apt-get install -y wget
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-pip
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing Bazarr"
mkdir -p /var/lib/bazarr/
diff --git a/install/beszel-install.sh b/install/beszel-install.sh
new file mode 100644
index 000000000..378570cf6
--- /dev/null
+++ b/install/beszel-install.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Michelle Zitzerman (Sinofage)
+# License: MIT
+# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+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 \
+ curl \
+ tar \
+ sudo \
+ mc
+msg_ok "Installed Dependencies"
+
+msg_info "Installing Beszel"
+mkdir -p /opt/beszel
+curl -sL "https://github.com/henrygd/beszel/releases/latest/download/beszel_$(uname -s)_$(uname -m | sed -e 's/x86_64/amd64/' -e 's/armv6l/arm/' -e 's/armv7l/arm/' -e 's/aarch64/arm64/').tar.gz" | tar -xz -O beszel | tee /opt/beszel/beszel >/dev/null
+chmod +x /opt/beszel/beszel
+msg_ok "Installed Beszel"
+
+msg_info "Creating Service"
+cat <
/etc/systemd/system/beszel-hub.service
+[Unit]
+Description=Beszel Hub Service
+After=network.target
+
+[Service]
+ExecStart=/opt/beszel/beszel serve --http "0.0.0.0:8090"
+WorkingDirectory=/opt/beszel
+Restart=always
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now beszel-hub.service
+msg_ok "Created Service"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
\ No newline at end of file
diff --git a/install/caddy-install.sh b/install/caddy-install.sh
index 5f1b6da3e..113485c96 100644
--- a/install/caddy-install.sh
+++ b/install/caddy-install.sh
@@ -1,9 +1,8 @@
#!/usr/bin/env bash
-# Copyright (c) 2021-2024 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/tteck/Proxmox/raw/main/LICENSE
+# Copyright (c) 2021-2025 tteck
+# Author: tteck (tteckster) | Co-Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
color
@@ -14,7 +13,16 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt-get install -y {debian-keyring,debian-archive-keyring,apt-transport-https,gpg,curl,sudo,mc,wget,openssh-server}
+$STD apt-get install -y \
+ debian-keyring \
+ debian-archive-keyring \
+ apt-transport-https \
+ gpg \
+ curl \
+ sudo \
+ mc \
+ wget \
+ openssh-server
msg_ok "Installed Dependencies"
msg_info "Installing Caddy"
@@ -24,6 +32,29 @@ $STD apt-get update
$STD apt-get install -y caddy
msg_ok "Installed Caddy"
+read -r -p "Would you like to install xCaddy Addon? " prompt
+if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Installing Golang"
+ cd /opt
+ set +o pipefail
+ GOLANG=$(curl -s https://go.dev/dl/ | grep -o "go.*\linux-amd64.tar.gz" | head -n 1)
+ wget -q https://golang.org/dl/$GOLANG
+ tar -xzf $GOLANG -C /usr/local
+ ln -s /usr/local/go/bin/go /usr/local/bin/go
+ set -o pipefail
+ rm -rf /opt/go*
+ msg_ok "Installed Golang"
+
+ msg_info "Setup xCaddy"
+ cd /opt
+ RELEASE=$(curl -s https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
+ wget -q https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${RELEASE:1}_linux_amd64.deb
+ $STD dpkg -i xcaddy_${RELEASE:1}_linux_amd64.deb
+ rm -rf /opt/xcaddy*
+ $STD xcaddy build
+ msg_ok "Setup xCaddy"
+fi
+
motd_ssh
customize
diff --git a/install/calibre-web-install.sh b/install/calibre-web-install.sh
index 21e214a98..05d25b02d 100644
--- a/install/calibre-web-install.sh
+++ b/install/calibre-web-install.sh
@@ -37,6 +37,7 @@ msg_ok "Installed Kepubify"
msg_info "Installing Calibre-Web"
mkdir -p /opt/calibre-web
+$STD apt-get install -y calibre
$STD wget https://github.com/janeczku/calibre-web/raw/master/library/metadata.db -P /opt/calibre-web
$STD pip install calibreweb
$STD pip install jsonschema
diff --git a/install/changedetection-install.sh b/install/changedetection-install.sh
index c34132d8e..c9a4e8042 100644
--- a/install/changedetection-install.sh
+++ b/install/changedetection-install.sh
@@ -49,13 +49,13 @@ $STD apt-get install -y \
openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-pip
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Setting up Node.js Repository"
mkdir -p /etc/apt/keyrings
diff --git a/install/deluge-install.sh b/install/deluge-install.sh
index 271af84d9..704502069 100644
--- a/install/deluge-install.sh
+++ b/install/deluge-install.sh
@@ -21,13 +21,13 @@ $STD apt-get install -y python3-libtorrent
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-pip
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing Deluge"
$STD pip install deluge[all]
diff --git a/install/esphome-install.sh b/install/esphome-install.sh
index b3068ae57..b519c33f2 100644
--- a/install/esphome-install.sh
+++ b/install/esphome-install.sh
@@ -22,14 +22,14 @@ $STD apt-get install -y wget
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-pip \
python3-venv
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing ESPHome"
mkdir /root/config
diff --git a/install/frigate-install.sh b/install/frigate-install.sh
index 722c05b61..67e4c331e 100644
--- a/install/frigate-install.sh
+++ b/install/frigate-install.sh
@@ -18,11 +18,11 @@ msg_info "Installing Dependencies (Patience)"
$STD apt-get install -y {curl,sudo,mc,git,gpg,automake,build-essential,xz-utils,libtool,ccache,pkg-config,libgtk-3-dev,libavcodec-dev,libavformat-dev,libswscale-dev,libv4l-dev,libxvidcore-dev,libx264-dev,libjpeg-dev,libpng-dev,libtiff-dev,gfortran,openexr,libatlas-base-dev,libssl-dev,libtbb2,libtbb-dev,libdc1394-22-dev,libopenexr-dev,libgstreamer-plugins-base1.0-dev,libgstreamer1.0-dev,gcc,gfortran,libopenblas-dev,liblapack-dev,libusb-1.0-0-dev,jq,moreutils,wget,openssh-server,ca-certificates}
msg_ok "Installed Dependencies"
-msg_info "Installing Python3 Dependencies"
+msg_info "Setup Python3"
$STD apt-get install -y {python3,python3-dev,python3-setuptools,python3-distutils,python3-pip}
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
$STD pip install --upgrade pip
-msg_ok "Installed Python3 Dependencies"
+msg_ok "Setup Python3"
msg_info "Installing Node.js"
mkdir -p /etc/apt/keyrings
diff --git a/install/homarr-install.sh b/install/homarr-install.sh
index c4d206f97..20c6278cf 100644
--- a/install/homarr-install.sh
+++ b/install/homarr-install.sh
@@ -1,10 +1,8 @@
#!/usr/bin/env bash
-# Copyright (c) 2021-2025 tteck
-# Author: tteck (tteckster)
-# Co-Author: MickLesk (Canbiz)
-# License: MIT
-# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/ajnart/homarr
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
@@ -20,6 +18,7 @@ $STD apt-get install -y \
sudo \
mc \
curl \
+ redis-server \
ca-certificates \
gnupg \
make \
@@ -32,32 +31,40 @@ msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository"
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
-echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
+echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
msg_ok "Set up Node.js Repository"
-msg_info "Installing Node.js/Yarn"
+msg_info "Installing Node.js/pnpm"
$STD apt-get update
$STD apt-get install -y nodejs
-$STD npm install -g yarn
-msg_ok "Installed Node.js/Yarn"
+$STD npm install -g pnpm@latest
+msg_ok "Installed Node.js/pnpm"
msg_info "Installing Homarr (Patience)"
-RELEASE=$(curl -s https://api.github.com/repos/ajnart/homarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
-wget -q "https://github.com/ajnart/homarr/archive/refs/tags/v${RELEASE}.zip"
+cd /opt
+RELEASE=$(curl -s https://api.github.com/repos/homarr-labs/homarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+wget -q "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip"
unzip -q v${RELEASE}.zip
-rm -rf v${RELEASE}.zip
mv homarr-${RELEASE} /opt/homarr
+mkdir -p /opt/homarr_db
+touch /opt/homarr_db/db.sqlite
+AUTH_SECRET="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)"
+SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)"
+
cat </opt/homarr/.env
-DATABASE_URL="file:./database/db.sqlite"
-NEXTAUTH_URL="http://localhost:3000"
-NEXTAUTH_SECRET="$(openssl rand -base64 32)"
-NEXT_PUBLIC_DISABLE_ANALYTICS="true"
-DEFAULT_COLOR_SCHEME="dark"
+AUTH_SECRET='${AUTH_SECRET}'
+DB_DRIVER='better-sqlite3'
+SECRET_ENCRYPTION_KEY='${SECRET_ENCRYPTION_KEY}'
+DB_URL='/opt/homarr_db/db.sqlite'
+TURBO_TELEMETRY_DISABLED=1
EOF
+
cd /opt/homarr
-$STD yarn install
-$STD yarn build
-$STD yarn db:migrate
+$STD pnpm install
+$STD pnpm run db:migration:sqlite:run
+$STD pnpm build
+mkdir build
+cp ./node_modules/better-sqlite3/build/Release/better_sqlite3.node ./build/better_sqlite3.node
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
msg_ok "Installed Homarr"
@@ -71,18 +78,19 @@ After=network.target
Type=exec
WorkingDirectory=/opt/homarr
EnvironmentFile=-/opt/homarr/.env
-ExecStart=/usr/bin/yarn start
+ExecStart=/usr/bin/pnpm start
[Install]
WantedBy=multi-user.target
EOF
-systemctl enable -q --now homarr.service
+systemctl enable -q --now homarr
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
+rm -rf /opt/v${RELEASE}.zip
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
diff --git a/install/homeassistant-core-install.sh b/install/homeassistant-core-install.sh
index 5c75b0f91..1bf8805bf 100644
--- a/install/homeassistant-core-install.sh
+++ b/install/homeassistant-core-install.sh
@@ -51,7 +51,7 @@ $STD apt-get install -y \
openssh-server
msg_ok "Installed Dependencies"
-msg_info "Setup Python3/pip"
+msg_info "Setup Python3"
$STD apt-get update
$STD rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
$STD apt-get remove --purge -y python3.12 python3.12-dev python3.12-venv
diff --git a/install/homeassistant-install.sh b/install/homeassistant-install.sh
index a8a2fd736..47c2f8428 100644
--- a/install/homeassistant-install.sh
+++ b/install/homeassistant-install.sh
@@ -21,14 +21,14 @@ $STD apt-get install -y wget
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-pip \
python3-venv
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing runlike"
$STD pip install runlike
diff --git a/install/jellyfin-install.sh b/install/jellyfin-install.sh
index 031ca1b44..17d81ea3f 100644
--- a/install/jellyfin-install.sh
+++ b/install/jellyfin-install.sh
@@ -53,6 +53,7 @@ EOF
# Install Jellyfin using the metapackage (which will fetch jellyfin-server, jellyfin-web, and jellyfin-ffmpeg5)
$STD apt-get update
$STD apt-get install -y jellyfin
+sed -i 's/"MinimumLevel": "Information"/"MinimumLevel": "Error"/g' /etc/jellyfin/logging.json
chown -R jellyfin:adm /etc/jellyfin
sleep 10
systemctl restart jellyfin
diff --git a/install/kimai-install.sh b/install/kimai-install.sh
index 266675bc0..2a31aa06f 100644
--- a/install/kimai-install.sh
+++ b/install/kimai-install.sh
@@ -24,12 +24,27 @@ $STD apt-get install -y \
expect \
composer \
mariadb-server \
- libapache2-mod-php \
- php8.2-{mbstring,gd,intl,pdo,mysql,tokenizer,zip,xml} \
+ lsb-release \
wget \
openssh-server
msg_ok "Installed Dependencies"
+msg_info "Setup PHP8.4 Repository"
+$STD curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
+$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
+$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
+$STD apt-get update
+msg_ok "Setup PHP8.4 Repository"
+
+msg_info "Setup PHP"
+$STD apt-get remove -y php8.2*
+#$STD apt-get remove -y php8.3*
+$STD apt-get install -y \
+ php8.3 \
+ php8.3-{mbstring,gd,intl,common,mysql,zip,xml} \
+ libapache2-mod-php8.3
+msg_info "Setup PHP"
+
msg_info "Setting up database"
DB_NAME=kimai_db
DB_USER=kimai
@@ -74,6 +89,7 @@ send "helper-scripts.com\r"
expect eof
EOF
+$STD composer update --no-interaction
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
msg_ok "Installed Kimai"
diff --git a/install/monica-install.sh b/install/monica-install.sh
new file mode 100644
index 000000000..586bb7c53
--- /dev/null
+++ b/install/monica-install.sh
@@ -0,0 +1,104 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: bvdberg01
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+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 \
+ curl \
+ sudo \
+ mc \
+ gnupg2\
+ mariadb-server \
+ apache2 \
+ libapache2-mod-php \
+ php-{bcmath,curl,dom,gd,gmp,iconv,intl,json,mbstring,mysqli,opcache,pdo-mysql,redis,tokenizer,xml,zip} \
+ composer
+msg_ok "Installed Dependencies"
+
+msg_info "Setting up MariaDB"
+DB_NAME=monica
+DB_USER=monica
+DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
+$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');"
+$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
+{
+ echo "monica-Credentials"
+ echo "monica Database User: $DB_USER"
+ echo "monica Database Password: $DB_PASS"
+ echo "monica Database Name: $DB_NAME"
+} >> ~/monica.creds
+msg_ok "Set up MariaDB"
+
+msg_info "Setting up Node.js/Yarn"
+mkdir -p /etc/apt/keyrings
+curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
+echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
+$STD apt-get update
+$STD apt-get install -y nodejs
+$STD npm install -g npm@latest
+$STD npm install -g yarn
+msg_ok "Installed Node.js/Yarn"
+
+msg_info "Installing monica"
+RELEASE=$(curl -s https://api.github.com/repos/monicahq/monica/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+cd /opt
+wget -q "https://github.com/monicahq/monica/releases/download/v${RELEASE}/monica-v${RELEASE}.tar.bz2"
+tar -xjf "monica-v${RELEASE}.tar.bz2"
+mv "/opt/monica-v${RELEASE}" /opt/monica
+cd /opt/monica
+cp /opt/monica/.env.example /opt/monica/.env
+HASH_SALT=$(openssl rand -base64 32)
+sed -i -e "s|^DB_USERNAME=.*|DB_USERNAME=${DB_USER}|" \
+ -e "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" \
+ -e "s|^HASH_SALT=.*|HASH_SALT=${HASH_SALT}|" \
+ /opt/monica/.env
+$STD composer install --no-dev -o --no-interaction
+$STD yarn install
+$STD yarn run production
+$STD php artisan key:generate
+$STD php artisan setup:production --email=admin@helper-scripts.com --password=helper-scripts.com --force
+chown -R www-data:www-data /opt/monica
+chmod -R 775 /opt/monica/storage
+echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
+msg_ok "Installed monica"
+
+msg_info "Creating Service"
+cat </etc/apache2/sites-available/monica.conf
+
+ ServerName monica
+ DocumentRoot /opt/monica/public
+
+ Options Indexes FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+
+ ErrorLog /var/log/apache2/monica_error.log
+ CustomLog /var/log/apache2/monica_access.log combined
+
+EOF
+$STD a2ensite monica
+$STD a2enmod rewrite
+$STD a2dissite 000-default.conf
+$STD systemctl reload apache2
+msg_ok "Created Service"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+rm -rf "/opt/monica-v${RELEASE}.tar.bz2"
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
diff --git a/install/motioneye-install.sh b/install/motioneye-install.sh
index bc297b1cb..0b107a0dd 100644
--- a/install/motioneye-install.sh
+++ b/install/motioneye-install.sh
@@ -23,13 +23,13 @@ $STD apt-get install -y wget
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-pip
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing Motion"
$STD apt-get install -y motion
diff --git a/install/mylar3-install.sh b/install/mylar3-install.sh
index 7687deeac..2faa4674c 100644
--- a/install/mylar3-install.sh
+++ b/install/mylar3-install.sh
@@ -28,11 +28,11 @@ $STD apt-get install -y unrar
rm /etc/apt/sources.list.d/non-free.list
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y python3-pip
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
$STD pip install -U --no-cache-dir pip
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing ${APPLICATION}"
mkdir -p /opt/mylar3
diff --git a/install/nodebb-install.sh b/install/nodebb-install.sh
new file mode 100644
index 000000000..a7a5008e1
--- /dev/null
+++ b/install/nodebb-install.sh
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2024 tteck
+# Author: MickLesk (Canbiz)
+# License: MIT | https://github.com/tteck/Proxmox/raw/main/LICENSE
+# Source: https://github.com/NodeBB/NodeBB
+
+source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+msg_info "Installing Dependencies (Patience)"
+$STD apt-get install -y \
+ build-essential \
+ curl \
+ sudo \
+ make \
+ redis-server \
+ expect \
+ gnupg \
+ ca-certificates \
+ mc
+msg_ok "Installed Dependencies"
+
+msg_info "Setting up Node.js & MongoDB Repository"
+mkdir -p /etc/apt/keyrings
+curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
+echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
+
+curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | gpg --dearmor -o /etc/apt/keyrings/mongodb-server-8.0.gpg
+echo "deb [arch=amd64,arm64 signed-by=/etc/apt/keyrings/mongodb-server-8.0.gpg] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-8.0.list
+$STD apt-get update
+msg_ok "Set up Repositories"
+
+msg_info "Installing Node.js"
+$STD apt-get install -y nodejs
+msg_ok "Installed Node.js"
+
+msg_info "Installing MongoDB"
+$STD apt-get install -y mongodb-org
+systemctl enable -q --now mongod
+sleep 10 # MongoDB needs some secounds to start, if not sleep it collide with following mongosh
+msg_ok "Installed MongoDB"
+
+msg_info "Configure MongoDB"
+MONGO_ADMIN_USER="admin"
+MONGO_ADMIN_PWD="$(openssl rand -base64 18 | cut -c1-13)"
+NODEBB_USER="nodebb"
+NODEBB_PWD="$(openssl rand -base64 18 | cut -c1-13)"
+MONGO_CONNECTION_STRING="mongodb://${NODEBB_USER}:${NODEBB_PWD}@localhost:27017/nodebb"
+NODEBB_SECRET=$(uuidgen)
+{
+ echo "NodeBB-Credentials"
+ echo "Mongo Database User: $MONGO_ADMIN_USER"
+ echo "Mongo Database Password: $MONGO_ADMIN_PWD"
+ echo "NodeBB User: $NODEBB_USER"
+ echo "NodeBB Password: $NODEBB_PWD"
+ echo "NodeBB Secret: $NODEBB_SECRET"
+} >> ~/nodebb.creds
+
+$STD mongosh <> /etc/mongod.conf'
+systemctl restart mongod
+msg_ok "MongoDB successfully configurated"
+
+msg_info "Install NodeBB"
+cd /opt
+RELEASE=$(curl -s https://api.github.com/repos/NodeBB/NodeBB/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+wget -q "https://github.com/NodeBB/NodeBB/archive/refs/tags/v${RELEASE}.zip"
+unzip -q v${RELEASE}.zip
+mv NodeBB-${RELEASE} /opt/nodebb
+cd /opt/nodebb
+touch pidfile
+expect < /dev/null 2>&1
+log_file /dev/null
+set timeout -1
+
+spawn ./nodebb setup
+expect "URL used to access this NodeBB" {
+ send "http://localhost:4567\r"
+}
+expect "Please enter a NodeBB secret" {
+ send "$NODEBB_SECRET\r"
+}
+expect "Would you like to submit anonymous plugin usage to nbbpm? (yes)" {
+ send "no\r"
+}
+expect "Which database to use (mongo)" {
+ send "mongo\r"
+}
+expect "Format: mongodb://*" {
+ send "$MONGO_CONNECTION_STRING\r"
+}
+expect "Administrator username" {
+ send "helper-scripts\r"
+}
+expect "Administrator email address" {
+ send "helper-scripts@local.com\r"
+}
+expect "Password" {
+ send "helper-scripts\r"
+}
+expect "Confirm Password" {
+ send "helper-scripts\r"
+}
+expect eof
+EOF
+echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
+msg_ok "Installed NodeBB"
+
+msg_info "Creating Services"
+cat </etc/systemd/system/nodebb.service
+[Unit]
+Description=NodeBB
+Documentation=https://docs.nodebb.org
+After=system.slice multi-user.target mongod.service
+
+[Service]
+Type=forking
+User=root
+
+WorkingDirectory=/opt/nodebb
+PIDFile=/opt/nodebb/pidfile
+ExecStart=/usr/bin/node /opt/nodebb/loader.js
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now nodebb
+msg_ok "Created Service"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+rm -R /opt/v${RELEASE}.zip
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
\ No newline at end of file
diff --git a/install/octoprint-install.sh b/install/octoprint-install.sh
index ede7d9eb5..7ad48f165 100644
--- a/install/octoprint-install.sh
+++ b/install/octoprint-install.sh
@@ -24,7 +24,7 @@ $STD apt-get install -y wget
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
@@ -33,7 +33,7 @@ $STD apt-get install -y \
$STD apt-get install -y python3-setuptools
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Creating user octoprint"
useradd -m -s /bin/bash -p $(openssl passwd -1 octoprint) octoprint
diff --git a/install/openhab-install.sh b/install/openhab-install.sh
index dcab412f1..4c5dfd60a 100644
--- a/install/openhab-install.sh
+++ b/install/openhab-install.sh
@@ -23,13 +23,13 @@ $STD apt-get install -y wget
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Installing Azul Zulu"
+msg_info "Installing Azul Zulu21"
wget -qO /etc/apt/trusted.gpg.d/zulu-repo.asc "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9"
wget -q https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
$STD dpkg -i zulu-repo_1.0.0-3_all.deb
$STD apt-get update
-$STD apt-get -y install zulu17-jdk
-msg_ok "Installed Azul Zulu"
+$STD apt-get -y install zulu21-jdk
+msg_ok "Installed Azul Zulu21"
msg_info "Installing openHAB"
curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor >openhab.gpg
diff --git a/install/paperless-ngx-install.sh b/install/paperless-ngx-install.sh
index a70d5b232..0545b98c7 100644
--- a/install/paperless-ngx-install.sh
+++ b/install/paperless-ngx-install.sh
@@ -14,7 +14,7 @@ network_check
update_os
msg_info "Installing Dependencies (Patience)"
-$STD apt-get install -y --no-install-recommends \
+$STD apt-get install -y \
redis \
postgresql \
build-essential \
@@ -43,7 +43,7 @@ $STD apt-get install -y --no-install-recommends \
msg_ok "Installed Dependencies"
msg_info "Installing Python3 Dependencies (Patience)"
-$STD apt-get install -y --no-install-recommends \
+$STD apt-get install -y \
python3 \
python3-pip \
python3-dev \
@@ -52,7 +52,7 @@ $STD apt-get install -y --no-install-recommends \
msg_ok "Installed Python3 Dependencies"
msg_info "Installing OCR Dependencies (Patience)"
-$STD apt-get install -y --no-install-recommends \
+$STD apt-get install -y \
unpaper \
icc-profiles-free \
qpdf \
@@ -62,7 +62,7 @@ $STD apt-get install -y --no-install-recommends \
zlib1g \
tesseract-ocr \
tesseract-ocr-eng
-
+
cd /tmp
wget -q https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz
$STD tar -xzf ghostscript-10.04.0.tar.gz
@@ -199,6 +199,7 @@ Requires=redis.service
[Service]
WorkingDirectory=/opt/paperless/src
+ExecStartPre=/bin/sleep 2
ExecStart=python3 manage.py document_consumer
[Install]
@@ -223,7 +224,7 @@ EOF
sed -i -e 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/' /etc/ImageMagick-6/policy.xml
systemctl daemon-reload
-$STD systemctl enable --now paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service
+$STD systemctl enable -q --now paperless-webserver paperless-scheduler paperless-task-queue paperless-consumer
msg_ok "Created Services"
motd_ssh
diff --git a/install/photoprism-install.sh b/install/photoprism-install.sh
index 38d1559e7..8b6069a8b 100644
--- a/install/photoprism-install.sh
+++ b/install/photoprism-install.sh
@@ -14,35 +14,37 @@ network_check
update_os
msg_info "Installing Dependencies (Patience)"
-$STD apt-get install -y curl
-$STD apt-get install -y sudo
-$STD apt-get install -y mc
-$STD apt-get install -y exiftool
-$STD apt-get install -y ffmpeg
-$STD apt-get install -y libheif1
-$STD apt-get install -y libpng-dev
-$STD apt-get install -y libjpeg-dev
-$STD apt-get install -y libtiff-dev
-$STD apt-get install -y imagemagick
-$STD apt-get install -y darktable
-$STD apt-get install -y rawtherapee
-$STD apt-get install -y libvips42
-$STD apt-get install -y wget
-$STD apt-get install -y openssh-server
+$STD apt-get install -y \
+ curl \
+ sudo \
+ mc \
+ exiftool \
+ ffmpeg \
+ libheif1 \
+ libpng-dev \
+ libjpeg-dev \
+ libtiff-dev \
+ imagemagick \
+ darktable \
+ rawtherapee \
+ libvips42 \
+ lsb-release \
+ wget \
+ openssh-server
echo 'export PATH=/usr/local:$PATH' >>~/.bashrc
export PATH=/usr/local:$PATH
msg_ok "Installed Dependencies"
msg_info "Installing PhotoPrism (Patience)"
-mkdir -p /opt/photoprism/{cache,config,photos/originals,photos/import,storage,temp}
+mkdir -p /opt/photoprism/{cache,config,photos,storage,temp}
+mkdir -p /opt/photoprism/photos/{originals,import}
+mkdir -p /opt/photoprism_backups
wget -q -cO - https://dl.photoprism.app/pkg/linux/arm64.tar.gz | tar -xz -C /opt/photoprism --strip-components=1
-if [[ ${PCT_OSTYPE} == "ubuntu" ]]; then
- wget -q -cO - https://dl.photoprism.app/dist/libheif/libheif-jammy-arm64-v1.17.1.tar.gz | tar -xzf - -C /usr/local --strip-components=1
-else
- wget -q -cO - https://dl.photoprism.app/dist/libheif/libheif-bookworm-arm64-v1.17.1.tar.gz | tar -xzf - -C /usr/local --strip-components=1
-fi
+LIBHEIF_URL=$(wget -q -O - "https://dl.photoprism.app/dist/libheif/" | grep -oP "libheif-$(lsb_release -cs)-arm64-v[0-9\.]+\.tar\.gz" | sort -V | tail -n 1)
+wget -q -cO - "https://dl.photoprism.app/dist/libheif/$LIBHEIF_URL" | tar -xzf - -C /usr/local --strip-components=1
ldconfig
+chmod -R 755 /opt/photoprism/photos/originals
cat </opt/photoprism/config/.env
PHOTOPRISM_AUTH_MODE='password'
PHOTOPRISM_ADMIN_PASSWORD='helper-scripts.com'
@@ -52,6 +54,14 @@ PHOTOPRISM_SITE_CAPTION='https://tteck.github.io/Proxmox/'
PHOTOPRISM_STORAGE_PATH='/opt/photoprism/storage'
PHOTOPRISM_ORIGINALS_PATH='/opt/photoprism/photos/originals'
PHOTOPRISM_IMPORT_PATH='/opt/photoprism/photos/import'
+PHOTOPRISM_BACKUP_PATH='/opt/photoprism_backups'
+PHOTOPRISM_DATABASE_DRIVER='sqlite'
+PHOTOPRISM_DISABLE_WEBDAV='false'
+PHOTOPRISM_DISABLE_FACES='false'
+PHOTOPRISM_AUTO_INDEX='300'
+PHOTOPRISM_AUTO_IMPORT='-1'
+PHOTOPRISM_PUBLIC='false'
+PHOTOPRISM_DEBUG='false'
EOF
ln -sf /opt/photoprism/bin/photoprism /usr/local/bin/photoprism
msg_ok "Installed PhotoPrism"
diff --git a/install/pingvin-install.sh b/install/pingvin-install.sh
index b6cfa583b..befeabceb 100644
--- a/install/pingvin-install.sh
+++ b/install/pingvin-install.sh
@@ -2,6 +2,7 @@
# Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster)
+# Co-Author: michelroegl-brunner
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
@@ -14,13 +15,14 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt-get install -y curl
-$STD apt-get install -y sudo
-$STD apt-get install -y mc
-$STD apt-get install -y git
-$STD apt-get install -y gnupg
-$STD apt-get install -y wget
-$STD apt-get install -y openssh-server
+$STD apt-get install -y \
+ curl \
+ sudo \
+ mc \
+ git \
+ gnupg \
+ wget \
+ openssh-server
msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository"
@@ -36,11 +38,14 @@ $STD npm install pm2 -g
msg_ok "Installed Node.js"
msg_info "Installing Pingvin Share (Patience)"
-git clone -q https://github.com/stonith404/pingvin-share /opt/pingvin-share
-cd /opt/pingvin-share
-$STD git fetch --tags
-$STD git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
-cd backend
+cd /opt
+RELEASE=$(curl -s https://api.github.com/repos/stonith404/pingvin-share/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
+wget -q "https://github.com/stonith404/pingvin-share/archive/refs/tags/v${RELEASE}.zip"
+unzip -q v${RELEASE}.zip
+echo "${RELEASE}" >"/opt/pingvin_version.txt"
+mv pingvin-share-${RELEASE} /opt/pingvin-share
+cd /opt/pingvin-share/backend
$STD npm install
$STD npm run build
$STD pm2 start --name="pingvin-share-backend" npm -- run prod
@@ -59,6 +64,7 @@ motd_ssh
customize
msg_info "Cleaning up"
+rm -rf /opt/v${RELEASE}.zip
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
diff --git a/install/pocketid-install.sh b/install/pocketid-install.sh
new file mode 100644
index 000000000..c330ad365
--- /dev/null
+++ b/install/pocketid-install.sh
@@ -0,0 +1,130 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Snarkenfaugister
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/stonith404/pocket-id
+
+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 \
+ curl \
+ sudo \
+ mc \
+ gpg \
+ caddy \
+ gcc
+msg_ok "Installed Dependencies"
+
+msg_info "Setting up Node.js Repository"
+mkdir -p /etc/apt/keyrings
+curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
+echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
+msg_ok "Set up Node.js Repository"
+
+msg_info "Installing Node.js"
+$STD apt-get update
+$STD apt-get install -y nodejs
+msg_ok "Installed Node.js"
+
+msg_info "Installing Golang"
+cd /tmp
+set +o pipefail
+GO_RELEASE=$(curl -s https://go.dev/dl/ | grep -o -m 1 "go.*\linux-amd64.tar.gz")
+wget -q https://golang.org/dl/${GO_RELEASE}
+tar -xzf ${GO_RELEASE} -C /usr/local
+ln -s /usr/local/go/bin/go /usr/bin/go
+set -o pipefail
+msg_ok "Installed Golang"
+
+read -r -p "What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url
+msg_info "Setup Pocket ID"
+cd /opt
+RELEASE=$(curl -s https://api.github.com/repos/stonith404/pocket-id/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+wget -q "https://github.com/stonith404/pocket-id/archive/refs/tags/v${RELEASE}.zip"
+unzip -q v${RELEASE}.zip
+mv pocket-id-${RELEASE}/ /opt/pocket-id
+
+cd /opt/pocket-id/backend
+cp .env.example .env
+sed -i "s/PUBLIC_APP_URL=http:\/\/localhost/PUBLIC_APP_URL=https:\/\/${public_url}/" .env
+cd cmd
+CGO_ENABLED=1
+GOOS=linux
+$STD go build -o ../pocket-id-backend
+
+cd ../../frontend
+cp .env.example .env
+sed -i "s/PUBLIC_APP_URL=http:\/\/localhost/PUBLIC_APP_URL=https:\/\/${public_url}/" .env
+$STD npm install
+$STD npm run build
+
+cd ..
+cp reverse-proxy/Caddyfile /etc/caddy/Caddyfile
+echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
+msg_ok "Setup Pocket ID"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/pocketid-backend.service
+[Unit]
+Description=Pocket ID Backend
+After=network.target
+
+[Service]
+Type=simple
+User=root
+Group=root
+WorkingDirectory=/opt/pocket-id/backend
+EnvironmentFile=/opt/pocket-id/backend/.env
+ExecStart=/opt/pocket-id/backend/pocket-id-backend
+Restart=always
+RestartSec=10
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+cat </etc/systemd/system/pocketid-frontend.service
+[Unit]
+Description=Pocket ID Frontend
+After=network.target
+
+[Service]
+Type=simple
+User=root
+Group=root
+WorkingDirectory=/opt/pocket-id/frontend
+EnvironmentFile=/opt/pocket-id/frontend/.env
+ExecStart=/usr/bin/node build/index.js
+Restart=always
+RestartSec=10
+
+[Install]
+WantedBy=multi-user.target
+EOF
+msg_ok "Created Service"
+
+msg_info "Starting Services"
+systemctl enable -q --now pocketid-backend
+systemctl enable -q --now pocketid-frontend
+systemctl restart caddy
+msg_ok "Started Services"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+rm -f /opt/v${RELEASE}.zip
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
+
+motd_ssh
+customize
diff --git a/install/projectsend-install.sh b/install/projectsend-install.sh
new file mode 100644
index 000000000..e6f11732d
--- /dev/null
+++ b/install/projectsend-install.sh
@@ -0,0 +1,91 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: bvdberg01
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+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 \
+ curl \
+ sudo \
+ mc \
+ mariadb-server \
+ apache2 \
+ libapache2-mod-php \
+ php8.2-{pdo,mysql,mbstring,gettext,fileinfo,gd,xml,zip}
+msg_ok "Installed Dependencies"
+
+msg_info "Setting up MariaDB"
+DB_NAME=projectsend
+DB_USER=projectsend
+DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+$STD mysql -u root -e "CREATE DATABASE $DB_NAME;"
+$STD mysql -u root -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED WITH mysql_native_password AS PASSWORD('$DB_PASS');"
+$STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"
+{
+ echo "projectsend-Credentials"
+ echo "projectsend Database User: $DB_USER"
+ echo "projectsend Database Password: $DB_PASS"
+ echo "projectsend Database Name: $DB_NAME"
+} >> ~/projectsend.creds
+msg_ok "Set up MariaDB"
+
+msg_info "Installing projectsend"
+RELEASE=$(curl -s https://api.github.com/repos/projectsend/projectsend/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
+cd /opt
+wget -q "https://github.com/projectsend/projectsend/releases/download/r${RELEASE}/projectsend-r${RELEASE}.zip"
+mkdir projectsend
+unzip -q "projectsend-r${RELEASE}.zip" -d projectsend
+mv /opt/projectsend/includes/sys.config.sample.php /opt/projectsend/includes/sys.config.php
+chown -R www-data:www-data /opt/projectsend
+chmod -R 775 /opt/projectsend
+chmod 644 /opt/projectsend/includes/sys.config.php
+sed -i -e "s/\(define('DB_NAME', \).*/\1'$DB_NAME');/" \
+ -e "s/\(define('DB_USER', \).*/\1'$DB_USER');/" \
+ -e "s/\(define('DB_PASSWORD', \).*/\1'$DB_PASS');/" \
+ /opt/projectsend/includes/sys.config.php
+sed -i -e "s/^\(memory_limit = \).*/\1 256M/" \
+ -e "s/^\(post_max_size = \).*/\1 256M/" \
+ -e "s/^\(upload_max_filesize = \).*/\1 256M/" \
+ -e "s/^\(max_execution_time = \).*/\1 300/" \
+ /etc/php/8.2/apache2/php.ini
+echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
+msg_ok "Installed projectsend"
+
+msg_info "Creating Service"
+cat </etc/apache2/sites-available/projectsend.conf
+
+ ServerName projectsend
+ DocumentRoot /opt/projectsend
+
+ Options FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+
+ ErrorLog /var/log/apache2/projectsend_error.log
+ CustomLog /var/log/apache2/projectsend_access.log combined
+
+EOF
+$STD a2ensite projectsend
+$STD a2enmod rewrite
+$STD a2dissite 000-default.conf
+$STD systemctl reload apache2
+msg_ok "Created Service"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+rm -rf "/opt/projectsend-r${RELEASE}.zip"
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
diff --git a/install/prometheus-pve-exporter-install.sh b/install/prometheus-pve-exporter-install.sh
new file mode 100644
index 000000000..a1e3c8918
--- /dev/null
+++ b/install/prometheus-pve-exporter-install.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Andy Grunwald (andygrunwald)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/prometheus-pve/prometheus-pve-exporter
+
+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 \
+ curl \
+ sudo \
+ mc
+msg_ok "Installed Dependencies"
+
+msg_info "Setup Python3"
+$STD apt-get install -y \
+ python3 \
+ python3-pip
+rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
+msg_ok "Setup Python3"
+
+msg_info "Installing Prometheus Proxmox VE Exporter"
+python3 -m pip install --quiet --root-user-action=ignore prometheus-pve-exporter
+mkdir -p /opt/prometheus-pve-exporter
+cat < /opt/prometheus-pve-exporter/pve.yml
+default:
+ user: prometheus@pve
+ password: sEcr3T!
+ verify_ssl: false
+EOF
+msg_ok "Installed Prometheus Proxmox VE Exporter"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/prometheus-pve-exporter.service
+[Unit]
+Description=Prometheus Proxmox VE Exporter
+Documentation=https://github.com/znerol/prometheus-pve-exporter
+After=syslog.target network.target
+
+[Service]
+User=root
+Restart=always
+Type=simple
+ExecStart=pve_exporter \
+ --config.file=/opt/prometheus-pve-exporter/pve.yml \
+ --web.listen-address=0.0.0.0:9221
+ExecReload=/bin/kill -HUP \$MAINPID
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+systemctl enable -q --now prometheus-pve-exporter
+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/install/sabnzbd-install.sh b/install/sabnzbd-install.sh
index ad4bc475b..d0c6c8a68 100644
--- a/install/sabnzbd-install.sh
+++ b/install/sabnzbd-install.sh
@@ -29,13 +29,13 @@ $STD apt-get install -y unrar
rm /etc/apt/sources.list.d/non-free.list
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3-dev \
python3-pip
$STD apt-get install -y python3-setuptools
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing SABnzbd"
RELEASE=$(curl -s https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
diff --git a/install/sqlserver2022-install.sh b/install/sqlserver2022-install.sh
new file mode 100644
index 000000000..7e06fe03d
--- /dev/null
+++ b/install/sqlserver2022-install.sh
@@ -0,0 +1,64 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Kristian Skov
+# License: MIT
+# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+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 \
+ curl \
+ mc \
+ sudo \
+ gpg \
+ coreutils
+msg_ok "Installed Dependencies"
+
+msg_info "Setup SQL Server 2022"
+$STD curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
+$STD curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc
+$STD curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | tee /etc/apt/sources.list.d/mssql-server-2022.list
+$STD apt-get clean *
+$STD apt-get update -y
+$STD apt-get install -y mssql-server
+msg_ok "Setup Server 2022"
+
+msg_info "Installing SQL Server Tools"
+export DEBIAN_FRONTEND=noninteractive
+export ACCEPT_EULA=Y
+curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc
+curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | tee /etc/apt/sources.list.d/mssql-release.list
+$STD apt-get update
+$STD apt-get install -y -qq \
+ mssql-tools18 \
+ unixodbc-dev
+echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
+source ~/.bash_profile
+msg_ok "Installed SQL Server Tools"
+
+read -r -p "Do you want to run the SQL server setup now? (Later is also possible) " prompt
+if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
+ /opt/mssql/bin/mssql-conf setup
+else
+ msg_ok "Skipping SQL Server setup. You can run it later with '/opt/mssql/bin/mssql-conf setup'."
+fi
+
+msg_info "Start Service"
+systemctl enable -q --now mssql-server
+msg_ok "Service started"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
diff --git a/install/tandoor-install.sh b/install/tandoor-install.sh
index ae5fbbffd..8ccd813fc 100644
--- a/install/tandoor-install.sh
+++ b/install/tandoor-install.sh
@@ -34,14 +34,14 @@ $STD apt-get install -y --no-install-recommends \
openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-setuptools \
python3-pip
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Setting up Node.js Repository"
mkdir -p /etc/apt/keyrings
diff --git a/install/tautulli-install.sh b/install/tautulli-install.sh
index 945b7a4df..1184e93fb 100644
--- a/install/tautulli-install.sh
+++ b/install/tautulli-install.sh
@@ -23,13 +23,13 @@ $STD apt-get install -y wget
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-pip
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing Tautulli"
cd /opt
diff --git a/install/teddycloud-install.sh b/install/teddycloud-install.sh
index 75c04b12d..533ff7a83 100644
--- a/install/teddycloud-install.sh
+++ b/install/teddycloud-install.sh
@@ -32,6 +32,7 @@ VERSION="${RELEASE#tc_v}"
wget -q "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip"
unzip -q -d "/opt/teddycloud-${VERSION}" "teddycloud.amd64.release_v${VERSION}.zip"
ln -fns "/opt/teddycloud-${VERSION}" /opt/teddycloud
+rm -rf teddycloud.amd64.release_v${VERSION}.zip
echo "${VERSION}" >"/opt/${APPLICATION}_version.txt"
msg_ok "Installed TeddyCloud"
diff --git a/install/urbackupserver-install.sh b/install/urbackupserver-install.sh
new file mode 100644
index 000000000..120e1b933
--- /dev/null
+++ b/install/urbackupserver-install.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: Kristian Skov
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+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 \
+ curl \
+ sudo \
+ mc \
+ gnupg \
+ coreutils
+msg_ok "Installed Dependencies"
+
+msg_info "Installing UrBackup Server"
+curl -fsSL https://download.opensuse.org/repositories/home:uroni/Debian_12/Release.key | gpg --dearmor >/etc/apt/trusted.gpg.d/home_uroni.gpg
+echo 'deb [signed-by=/etc/apt/trusted.gpg.d/home_uroni.gpg] http://download.opensuse.org/repositories/home:/uroni/Debian_12/ /' >/etc/apt/sources.list.d/home:uroni.list
+$STD apt-get update -y
+apt-get install -y -qq urbackup-server
+msg_ok "Installed UrBackup Server"
+
+motd_ssh
+customize
+
+msg_info "Cleaning up"
+$STD apt-get -y autoremove
+$STD apt-get -y autoclean
+msg_ok "Cleaned"
diff --git a/install/whoogle-install.sh b/install/whoogle-install.sh
index 0c2b51e89..d08953da5 100644
--- a/install/whoogle-install.sh
+++ b/install/whoogle-install.sh
@@ -21,13 +21,13 @@ $STD apt-get install -y wget
$STD apt-get install -y openssh-server
msg_ok "Installed Dependencies"
-msg_info "Updating Python3"
+msg_info "Setup Python3"
$STD apt-get install -y \
python3 \
python3-dev \
python3-pip
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
-msg_ok "Updated Python3"
+msg_ok "Setup Python3"
msg_info "Installing Whoogle"
$STD pip install brotli
diff --git a/json/2fauth.json b/json/2fauth.json
index 12bd22c36..bb1e6def6 100644
--- a/json/2fauth.json
+++ b/json/2fauth.json
@@ -2,7 +2,7 @@
"name": "2FAuth",
"slug": "2fauth",
"categories": [
- 0
+ 6
],
"date_created": "2024-12-20",
"type": "ct",
diff --git a/json/5etools.json b/json/5etools.json
index dcc371f13..be9e0fab1 100644
--- a/json/5etools.json
+++ b/json/5etools.json
@@ -2,7 +2,7 @@
"name": "5etools",
"slug": "5etools",
"categories": [
- 0
+ 24
],
"date_created": "2025-01-02",
"type": "ct",
diff --git a/json/actualbudget.json b/json/actualbudget.json
index 5142d8a22..4eb7684b4 100644
--- a/json/actualbudget.json
+++ b/json/actualbudget.json
@@ -2,7 +2,7 @@
"name": "Actual Budget",
"slug": "actualbudget",
"categories": [
- 0
+ 23
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/add-netbird-lxc.json b/json/add-netbird-lxc.json
index c9db163a1..e66a492d1 100644
--- a/json/add-netbird-lxc.json
+++ b/json/add-netbird-lxc.json
@@ -2,7 +2,7 @@
"name": "NetBird",
"slug": "add-netbird-lxc",
"categories": [
- 11
+ 1
],
"date_created": "2024-05-19",
"type": "misc",
diff --git a/json/add-tailscale-lxc.json b/json/add-tailscale-lxc.json
index 8bdc5e473..d95295da4 100644
--- a/json/add-tailscale-lxc.json
+++ b/json/add-tailscale-lxc.json
@@ -2,7 +2,7 @@
"name": "Tailscale",
"slug": "add-tailscale-lxc",
"categories": [
- 11
+ 1
],
"date_created": "2024-05-02",
"type": "misc",
diff --git a/json/adguard.json b/json/adguard.json
index 0e9499e0a..bb7ac45af 100644
--- a/json/adguard.json
+++ b/json/adguard.json
@@ -2,7 +2,7 @@
"name": "AdGuard Home",
"slug": "adguard",
"categories": [
- 13
+ 5
],
"date_created": "2024-04-28",
"type": "ct",
diff --git a/json/adventurelog.json b/json/adventurelog.json
index f85645796..dc2bb4e21 100644
--- a/json/adventurelog.json
+++ b/json/adventurelog.json
@@ -2,7 +2,7 @@
"name": "AdventureLog",
"slug": "adventurelog",
"categories": [
- 0
+ 24
],
"date_created": "2024-10-26",
"type": "ct",
diff --git a/json/agentdvr.json b/json/agentdvr.json
index 991377339..71a8826f9 100644
--- a/json/agentdvr.json
+++ b/json/agentdvr.json
@@ -2,7 +2,7 @@
"name": "AgentDVR",
"slug": "agentdvr",
"categories": [
- 17
+ 15
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/all-templates.json b/json/all-templates.json
index 7f9367760..e3c6e59db 100644
--- a/json/all-templates.json
+++ b/json/all-templates.json
@@ -2,7 +2,7 @@
"name": "All Templates",
"slug": "all-templates",
"categories": [
- 10
+ 1
],
"date_created": "2024-05-02",
"type": "misc",
diff --git a/json/alpine.json b/json/alpine.json
index 8c1756cb9..93f0ce30d 100644
--- a/json/alpine.json
+++ b/json/alpine.json
@@ -2,7 +2,7 @@
"name": "Alpine",
"slug": "alpine",
"categories": [
- 9
+ 2
],
"date_created": "2024-05-02",
"type": "ct",
@@ -22,7 +22,7 @@
"ram": 512,
"hdd": 0.1,
"os": "alpine",
- "version": "3.19"
+ "version": "3.21"
}
}
],
diff --git a/json/apache-cassandra.json b/json/apache-cassandra.json
index ad76772f0..7ce90c8f4 100644
--- a/json/apache-cassandra.json
+++ b/json/apache-cassandra.json
@@ -2,7 +2,7 @@
"name": "Apache-Cassandra",
"slug": "apache-cassandra",
"categories": [
- 5
+ 8
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/apache-couchdb.json b/json/apache-couchdb.json
index be43aeaaa..f1fcfcb9b 100644
--- a/json/apache-couchdb.json
+++ b/json/apache-couchdb.json
@@ -2,7 +2,7 @@
"name": "Apache-CouchDB",
"slug": "apache-couchdb",
"categories": [
- 5
+ 8
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/apache-guacamole.json b/json/apache-guacamole.json
index a49744ed7..5bf24bcff 100644
--- a/json/apache-guacamole.json
+++ b/json/apache-guacamole.json
@@ -1,35 +1,35 @@
{
- "name": "Apache Guacamole",
- "slug": "apache-guacamole",
- "categories": [
- 11
- ],
- "date_created": "2024-12-19",
- "type": "ct",
- "updateable": false,
- "privileged": false,
- "interface_port": 8080,
- "documentation": null,
- "website": "https://guacamole.apache.org/",
- "logo": "https://guacamole.apache.org/images/logos/guac-tricolor-logo.svg",
- "description": "Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/apache-guacamole.sh",
- "resources": {
- "cpu": 1,
- "ram": 2048,
- "hdd": 4,
- "os": "Debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": "guacadmin",
- "password": "guacadmin"
- },
- "notes": [],
- "status": "β
"
-}
\ No newline at end of file
+ "name": "Apache Guacamole",
+ "slug": "apache-guacamole",
+ "categories": [
+ 0
+ ],
+ "date_created": "2024-12-19",
+ "type": "ct",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": 8080,
+ "documentation": null,
+ "website": "https://guacamole.apache.org/",
+ "logo": "https://guacamole.apache.org/images/logos/guac-tricolor-logo.svg",
+ "description": "Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/apache-guacamole.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 2048,
+ "hdd": 4,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": "guacadmin",
+ "password": "guacadmin"
+ },
+ "notes": [],
+ "status": "β
"
+}
diff --git a/json/apt-cacher-ng.json b/json/apt-cacher-ng.json
index 82aea6459..9dab05b22 100644
--- a/json/apt-cacher-ng.json
+++ b/json/apt-cacher-ng.json
@@ -2,7 +2,7 @@
"name": "Apt-Cacher-NG",
"slug": "apt-cacher-ng",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/archivebox.json b/json/archivebox.json
index a7e9f3a99..cdd28e1bc 100644
--- a/json/archivebox.json
+++ b/json/archivebox.json
@@ -2,7 +2,7 @@
"name": "ArchiveBox",
"slug": "archivebox",
"categories": [
- 0
+ 12
],
"date_created": "2024-10-19",
"type": "ct",
diff --git a/json/archlinux-vm.json b/json/archlinux-vm.json
new file mode 100644
index 000000000..ddd910672
--- /dev/null
+++ b/json/archlinux-vm.json
@@ -0,0 +1,39 @@
+{
+ "name": "Arch Linux",
+ "slug": "archlinux-vm",
+ "categories": [
+ 2
+ ],
+ "date_created": "2025-01-27",
+ "type": "vm",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": null,
+ "documentation": null,
+ "website": null,
+ "logo": "https://raw.githubusercontent.com/ArchLinuxStudio/ArchLinuxTutorial/refs/heads/master/docs/arch_seo.png",
+ "description": "Arch Linux is a highly customizable, independent Linux distribution that gives users complete control over their system. Known for its rolling release model, Arch Linux is always up-to-date with the latest software. It's favored by experienced users who appreciate its minimalist approach, demanding a hands-on installation and configuration process. This level of control and flexibility makes it a popular choice for those who want to tailor their Linux system to their exact needs.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "vm/archlinux-vm.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 1024,
+ "hdd": 4,
+ "os": null,
+ "version": null
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "doesnt work with lvm and lvmthin disks!",
+ "type": "warning"
+ }
+ ]
+}
diff --git a/json/aria2.json b/json/aria2.json
index 141c6a6e1..ee198b0d9 100644
--- a/json/aria2.json
+++ b/json/aria2.json
@@ -2,7 +2,7 @@
"name": "Aria2",
"slug": "aria2",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/authentik.json b/json/authentik.json
index 0c07bf13d..2a2a12612 100644
--- a/json/authentik.json
+++ b/json/authentik.json
@@ -2,7 +2,7 @@
"name": "authentik",
"slug": "authentik",
"categories": [
- 11
+ 6
],
"date_created": "2024-12-27",
"type": "ct",
diff --git a/json/autobrr.json b/json/autobrr.json
index fe897f78b..d5cda8d75 100644
--- a/json/autobrr.json
+++ b/json/autobrr.json
@@ -2,7 +2,7 @@
"name": "Autobrr",
"slug": "autobrr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/bazarr.json b/json/bazarr.json
index fb5fe826c..79cbe2a58 100644
--- a/json/bazarr.json
+++ b/json/bazarr.json
@@ -2,7 +2,7 @@
"name": "Bazarr",
"slug": "bazarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/beszel.json b/json/beszel.json
new file mode 100644
index 000000000..8a67b41b1
--- /dev/null
+++ b/json/beszel.json
@@ -0,0 +1,34 @@
+{
+ "name": "Beszel",
+ "slug": "beszel",
+ "categories": [
+ 9
+ ],
+ "date_created": "2025-01-20",
+ "type": "ct",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": 8090,
+ "documentation": "https://beszel.dev/guide/what-is-beszel",
+ "website": "https://beszel.dev/",
+ "logo": "https://beszel.dev/icon.svg",
+ "description": "A lightweight server monitoring platform that provides Docker statistics, historical data, and alert functions\n ",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/beszel.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 512,
+ "hdd": 5,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": []
+ }
\ No newline at end of file
diff --git a/json/blocky.json b/json/blocky.json
index 107b45d61..f177b100e 100644
--- a/json/blocky.json
+++ b/json/blocky.json
@@ -2,7 +2,7 @@
"name": "Blocky",
"slug": "blocky",
"categories": [
- 13
+ 5
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/bookstack.json b/json/bookstack.json
index 083d09381..7abcbce68 100644
--- a/json/bookstack.json
+++ b/json/bookstack.json
@@ -2,7 +2,7 @@
"name": "BookStack",
"slug": "bookstack",
"categories": [
- 14
+ 12
],
"date_created": "2024-11-05",
"type": "ct",
diff --git a/json/bunkerweb.json b/json/bunkerweb.json
index 7747c8d20..26fccc94a 100644
--- a/json/bunkerweb.json
+++ b/json/bunkerweb.json
@@ -2,7 +2,7 @@
"name": "BunkerWeb",
"slug": "bunkerweb",
"categories": [
- 11
+ 6
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/caddy.json b/json/caddy.json
index 51a83605c..b9e8c7435 100644
--- a/json/caddy.json
+++ b/json/caddy.json
@@ -2,7 +2,7 @@
"name": "Caddy",
"slug": "caddy",
"categories": [
- 11
+ 21
],
"date_created": "2024-05-11",
"type": "ct",
@@ -20,7 +20,7 @@
"resources": {
"cpu": 1,
"ram": 512,
- "hdd": 2,
+ "hdd": 4,
"os": "debian",
"version": "12"
}
@@ -30,6 +30,15 @@
"username": null,
"password": null
},
- "notes": [],
- "status": "β
"
-}
\ No newline at end of file
+ "notes": [
+ {
+ "text": "if you need an internal module run: `caddy add-package PACKAGENAME`",
+ "type": "info"
+ },
+ {
+ "text": "if you need an external module run: `xcaddy build --with github.com/caddy-dns/cloudflare`",
+ "type": "info"
+ }
+ ],
+ "status": "β
"
+}
diff --git a/json/calibre-web.json b/json/calibre-web.json
index 70a080a78..c8d485f7d 100644
--- a/json/calibre-web.json
+++ b/json/calibre-web.json
@@ -2,7 +2,7 @@
"name": "Calibre-Web",
"slug": "calibre-web",
"categories": [
- 12
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/casaos.json b/json/casaos.json
index f9c9d1f1c..8e572b3c8 100644
--- a/json/casaos.json
+++ b/json/casaos.json
@@ -2,7 +2,7 @@
"name": "CasaOS",
"slug": "casaos",
"categories": [
- 8
+ 2
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/changedetection.json b/json/changedetection.json
index 03823a22e..f9cc987d9 100644
--- a/json/changedetection.json
+++ b/json/changedetection.json
@@ -2,7 +2,7 @@
"name": "Change Detection",
"slug": "changedetection",
"categories": [
- 7
+ 24
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/channels.json b/json/channels.json
index bf908c64c..f7a620baf 100644
--- a/json/channels.json
+++ b/json/channels.json
@@ -2,7 +2,7 @@
"name": "Channels DVR Server",
"slug": "channels",
"categories": [
- 17
+ 15
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/checkmk.json b/json/checkmk.json
index 9885e26e1..d7ac2d27b 100644
--- a/json/checkmk.json
+++ b/json/checkmk.json
@@ -1,35 +1,35 @@
{
- "name": "Checkmk",
- "slug": "checkmk",
- "categories": [
- 7
- ],
- "date_created": "2024-12-19",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": 80,
- "documentation": "https://docs.checkmk.com/",
- "website": "https://checkmk.com/",
- "logo": "https://checkmk.com/application/files/cache/thumbnails/67fc39c599afdf20557d538416e3efd3.png",
- "description": "Checkmk is an IT monitoring software that tracks the health and performance of your systems, networks, servers, applications, and cloud services. It provides real-time insights, alerts for issues, and tools for troubleshooting, helping ensure smooth operations across your infrastructure.",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/checkmk.sh",
- "resources": {
- "cpu": 2,
- "ram": 2048,
- "hdd": 4,
- "os": null,
- "version": null
- }
- }
- ],
- "default_credentials": {
- "username": null,
- "password": null
- },
+ "name": "Checkmk",
+ "slug": "checkmk",
+ "categories": [
+ 9
+ ],
+ "date_created": "2024-12-19",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 80,
+ "documentation": "https://docs.checkmk.com/",
+ "website": "https://checkmk.com/",
+ "logo": "https://checkmk.com/application/files/cache/thumbnails/67fc39c599afdf20557d538416e3efd3.png",
+ "description": "Checkmk is an IT monitoring software that tracks the health and performance of your systems, networks, servers, applications, and cloud services. It provides real-time insights, alerts for issues, and tools for troubleshooting, helping ensure smooth operations across your infrastructure.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/checkmk.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 4,
+ "os": null,
+ "version": null
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
"notes": [
{
"text": "Login Credentials : `cat ~/checkmk.creds`",
diff --git a/json/clean-orphaned-lvm.json b/json/clean-orphaned-lvm.json
new file mode 100644
index 000000000..4382ce3f2
--- /dev/null
+++ b/json/clean-orphaned-lvm.json
@@ -0,0 +1,39 @@
+{
+ "name": "Proxmox Clean Orphaned LVM",
+ "slug": "clean-orphaned-lvm",
+ "categories": [
+ 1
+ ],
+ "date_created": "2025-01-29",
+ "type": "misc",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": null,
+ "documentation": null,
+ "website": null,
+ "logo": "https://raw.githubusercontent.com/home-assistant/brands/master/core_integrations/proxmoxve/icon.png",
+ "description": "This script helps Proxmox users identify and remove orphaned LVM volumes that are no longer associated with any VM or LXC container. It scans all LVM volumes, detects unused ones, and provides an interactive prompt to delete them safely. System-critical volumes like root, swap, and data are excluded to prevent accidental deletion.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "misc/clean-orphaned-lvm.sh",
+ "resources": {
+ "cpu": null,
+ "ram": null,
+ "hdd": null,
+ "os": null,
+ "version": null
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "Execute within the Proxmox shell",
+ "type": "info"
+ }
+ ]
+}
diff --git a/json/cloudflared.json b/json/cloudflared.json
index 5e6328169..acdad10b5 100644
--- a/json/cloudflared.json
+++ b/json/cloudflared.json
@@ -2,7 +2,7 @@
"name": "Cloudflared",
"slug": "cloudflared",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/cockpit.json b/json/cockpit.json
index c9086d0b5..7add4b248 100644
--- a/json/cockpit.json
+++ b/json/cockpit.json
@@ -2,7 +2,7 @@
"name": "Cockpit",
"slug": "cockpit",
"categories": [
- 16
+ 10
],
"date_created": "2024-10-20",
"type": "ct",
diff --git a/json/code-server.json b/json/code-server.json
index f49e01481..8ad175d2b 100644
--- a/json/code-server.json
+++ b/json/code-server.json
@@ -2,7 +2,9 @@
"name": "VS Code Server",
"slug": "code-server",
"categories": [
- 19
+ 1,
+ 20,
+ 11
],
"date_created": "2024-05-02",
"type": "misc",
@@ -37,4 +39,4 @@
}
],
"status": "β
"
-}
\ No newline at end of file
+}
diff --git a/json/commafeed.json b/json/commafeed.json
index 6d9ce1816..b6f7559da 100644
--- a/json/commafeed.json
+++ b/json/commafeed.json
@@ -2,7 +2,7 @@
"name": "CommaFeed",
"slug": "commafeed",
"categories": [
- 0
+ 19
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/cronicle.json b/json/cronicle.json
index 160fffdc1..34af19164 100644
--- a/json/cronicle.json
+++ b/json/cronicle.json
@@ -2,7 +2,7 @@
"name": "Cronicle Primary",
"slug": "cronicle",
"categories": [
- 11
+ 19
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/crowdsec.json b/json/crowdsec.json
index 23ce134c6..db9b9ae91 100644
--- a/json/crowdsec.json
+++ b/json/crowdsec.json
@@ -2,7 +2,7 @@
"name": "CrowdSec",
"slug": "crowdsec",
"categories": [
- 11
+ 6
],
"date_created": "2024-05-02",
"type": "misc",
diff --git a/json/daemonsync.json b/json/daemonsync.json
index 33e254862..3da729122 100644
--- a/json/daemonsync.json
+++ b/json/daemonsync.json
@@ -2,7 +2,7 @@
"name": "Daemon Sync Server",
"slug": "daemonsync",
"categories": [
- 16
+ 19
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/dashy.json b/json/dashy.json
index 821b58523..aa850f279 100644
--- a/json/dashy.json
+++ b/json/dashy.json
@@ -2,7 +2,7 @@
"name": "Dashy",
"slug": "dashy",
"categories": [
- 15
+ 10
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/debian-vm.json b/json/debian-vm.json
index c375aa7b6..01b9052a3 100644
--- a/json/debian-vm.json
+++ b/json/debian-vm.json
@@ -2,7 +2,7 @@
"name": "Debian 12",
"slug": "debian-vm",
"categories": [
- 9
+ 2
],
"date_created": "2024-05-02",
"type": "vm",
diff --git a/json/debian.json b/json/debian.json
index 9aaf7e823..75cb722f6 100644
--- a/json/debian.json
+++ b/json/debian.json
@@ -2,7 +2,7 @@
"name": "Debian",
"slug": "debian",
"categories": [
- 9
+ 2
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/deconz.json b/json/deconz.json
index 622d38f47..91cac88f6 100644
--- a/json/deconz.json
+++ b/json/deconz.json
@@ -2,7 +2,7 @@
"name": "deCONZ",
"slug": "deconz",
"categories": [
- 6
+ 17
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/deluge.json b/json/deluge.json
index d64f2750c..670c456c7 100644
--- a/json/deluge.json
+++ b/json/deluge.json
@@ -2,7 +2,7 @@
"name": "Deluge",
"slug": "deluge",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/docker-vm.json b/json/docker-vm.json
new file mode 100644
index 000000000..b53107214
--- /dev/null
+++ b/json/docker-vm.json
@@ -0,0 +1,43 @@
+{
+ "name": "Docker",
+ "slug": "docker-vm",
+ "categories": [
+ 2, 3
+ ],
+ "date_created": "2025-01-20",
+ "type": "vm",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": null,
+ "documentation": null,
+ "website": "https://www.docker.com/",
+ "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/docker.svg",
+ "description": "Docker is an open-source project for automating the deployment of applications as portable, self-sufficient containers. This Template includes Docker Engine and Docker Compose Plugin.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "vm/docker-vm.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 4096,
+ "hdd": 8,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": "root",
+ "password": "docker"
+ },
+ "notes": [
+ {
+ "text": "After the script completes, click on the VM, then on the Summary or Console tab to find the VM IP.",
+ "type": "info"
+ },
+ {
+ "text": "This Script works on amd64 and arm64 Architecture.",
+ "type": "info"
+ }
+ ]
+}
diff --git a/json/docker.json b/json/docker.json
index 03e3e4391..bf2182538 100644
--- a/json/docker.json
+++ b/json/docker.json
@@ -2,7 +2,7 @@
"name": "Docker",
"slug": "docker",
"categories": [
- 8
+ 3
],
"date_created": "2024-05-02",
"type": "ct",
@@ -33,7 +33,7 @@
"ram": 1024,
"hdd": 2,
"os": "alpine",
- "version": "3.19"
+ "version": "3.21"
}
}
],
diff --git a/json/dockge.json b/json/dockge.json
index 4af90484c..9bd37978b 100644
--- a/json/dockge.json
+++ b/json/dockge.json
@@ -2,7 +2,7 @@
"name": "Dockge",
"slug": "dockge",
"categories": [
- 8
+ 3
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/dotnetaspwebapi.json b/json/dotnetaspwebapi.json
index dd117d1db..8181f1309 100644
--- a/json/dotnetaspwebapi.json
+++ b/json/dotnetaspwebapi.json
@@ -2,7 +2,7 @@
"name":"Dotnet ASP Web API",
"slug":"dotnetaspwebapi",
"categories":[
- 0
+ 20
],
"date_created":"2025-01-15",
"type":"ct",
diff --git a/json/emby.json b/json/emby.json
index d0c07676f..62843a099 100644
--- a/json/emby.json
+++ b/json/emby.json
@@ -2,7 +2,7 @@
"name": "Emby Media Server",
"slug": "emby",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/emqx.json b/json/emqx.json
index da2074d3c..0d3113779 100644
--- a/json/emqx.json
+++ b/json/emqx.json
@@ -2,7 +2,7 @@
"name": "EMQX",
"slug": "emqx",
"categories": [
- 4
+ 18
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/ersatztv.json b/json/ersatztv.json
index e912616f0..76481936e 100644
--- a/json/ersatztv.json
+++ b/json/ersatztv.json
@@ -2,7 +2,7 @@
"name": "ErsatzTV",
"slug": "ersatztv",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/esphome.json b/json/esphome.json
index 4145cc721..a4866cdf9 100644
--- a/json/esphome.json
+++ b/json/esphome.json
@@ -2,7 +2,7 @@
"name": "ESPHome",
"slug": "esphome",
"categories": [
- 3
+ 16
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/evcc.json b/json/evcc.json
index 014aca046..3ae4cd9c4 100644
--- a/json/evcc.json
+++ b/json/evcc.json
@@ -2,7 +2,7 @@
"name": "evcc",
"slug": "evcc",
"categories": [
- 0
+ 16
],
"date_created": "2024-10-15",
"type": "ct",
diff --git a/json/fenrus.json b/json/fenrus.json
index ae2563cb1..8eee43456 100644
--- a/json/fenrus.json
+++ b/json/fenrus.json
@@ -2,7 +2,7 @@
"name": "Fenrus",
"slug": "fenrus",
"categories": [
- 15
+ 10
],
"date_created": "2024-05-05",
"type": "ct",
diff --git a/json/fhem.json b/json/fhem.json
index 11273a969..2d82a527c 100644
--- a/json/fhem.json
+++ b/json/fhem.json
@@ -2,7 +2,7 @@
"name": "FHEM",
"slug": "fhem",
"categories": [
- 3
+ 16
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/filebrowser.json b/json/filebrowser.json
index 0718123de..1600a8750 100644
--- a/json/filebrowser.json
+++ b/json/filebrowser.json
@@ -2,7 +2,7 @@
"name": "File Browser",
"slug": "filebrowser",
"categories": [
- 16
+ 1
],
"date_created": "2024-05-02",
"type": "misc",
diff --git a/json/firefly.json b/json/firefly.json
index 2ad158489..de83e530a 100644
--- a/json/firefly.json
+++ b/json/firefly.json
@@ -1,40 +1,40 @@
{
- "name": "Firefly III",
- "slug": "firefly",
- "categories": [
- 0
- ],
- "date_created": "2025-01-01",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": 80,
- "documentation": "https://docs.firefly-iii.org/",
- "website": "https://firefly-iii.org/",
- "logo": "https://raw.githubusercontent.com/firefly-iii/firefly-iii/develop/.github/assets/img/logo-small.png",
- "description": "Firefly III is a free, self-hosted tool for managing your finances. Track expenses, plan budgets, and get detailed reports.",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/firefly.sh",
- "resources": {
- "cpu": 1,
- "ram": 1024,
- "hdd": 2,
- "os": "Debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": null,
- "password": null
- },
- "notes": [
- {
- "text": "Database credentials: `cat ~/firefly.creds`",
- "type": "info"
- }
- ],
- "status": "β
"
-}
\ No newline at end of file
+ "name": "Firefly III",
+ "slug": "firefly",
+ "categories": [
+ 23
+ ],
+ "date_created": "2025-01-01",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 80,
+ "documentation": "https://docs.firefly-iii.org/",
+ "website": "https://firefly-iii.org/",
+ "logo": "https://raw.githubusercontent.com/firefly-iii/firefly-iii/develop/.github/assets/img/logo-small.png",
+ "description": "Firefly III is a free, self-hosted tool for managing your finances. Track expenses, plan budgets, and get detailed reports.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/firefly.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 1024,
+ "hdd": 2,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "Database credentials: `cat ~/firefly.creds`",
+ "type": "info"
+ }
+ ],
+ "status": "β
"
+}
diff --git a/json/flaresolverr.json b/json/flaresolverr.json
index 9c4f317b0..ece8a4227 100644
--- a/json/flaresolverr.json
+++ b/json/flaresolverr.json
@@ -2,7 +2,7 @@
"name": "FlareSolverr",
"slug": "flaresolverr",
"categories": [
- 11
+ 14
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/flowiseai.json b/json/flowiseai.json
index 164ccc672..9e04b6b1e 100644
--- a/json/flowiseai.json
+++ b/json/flowiseai.json
@@ -2,7 +2,7 @@
"name": "FlowiseAI",
"slug": "flowiseai",
"categories": [
- 19
+ 20
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/forgejo.json b/json/forgejo.json
index 7f2a36bfe..c56e944c0 100644
--- a/json/forgejo.json
+++ b/json/forgejo.json
@@ -2,7 +2,7 @@
"name": "Forgejo",
"slug": "forgejo",
"categories": [
- 19
+ 20
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/frigate.json b/json/frigate.json
index 90f6da0c6..9c4e9700f 100644
--- a/json/frigate.json
+++ b/json/frigate.json
@@ -2,7 +2,7 @@
"name": "Frigate",
"slug": "frigate",
"categories": [
- 17
+ 15
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/fstrim.json b/json/fstrim.json
index c63692272..535e352fe 100644
--- a/json/fstrim.json
+++ b/json/fstrim.json
@@ -41,4 +41,4 @@
}
],
"status": "β
"
-}
\ No newline at end of file
+}
diff --git a/json/ghost.json b/json/ghost.json
index 21340d404..fdbc461a9 100644
--- a/json/ghost.json
+++ b/json/ghost.json
@@ -2,7 +2,7 @@
"name": "Ghost",
"slug": "ghost",
"categories": [
- 12
+ 25
],
"date_created": "2025-01-10",
"type": "ct",
diff --git a/json/gitea.json b/json/gitea.json
index 668dccba5..6d4a29b4c 100644
--- a/json/gitea.json
+++ b/json/gitea.json
@@ -2,7 +2,7 @@
"name": "Gitea",
"slug": "gitea",
"categories": [
- 19
+ 20
],
"date_created": "2024-07-26",
"type": "ct",
diff --git a/json/glance.json b/json/glance.json
index 886d25cfb..50921ef8d 100644
--- a/json/glance.json
+++ b/json/glance.json
@@ -2,7 +2,7 @@
"name": "Glance",
"slug": "glance",
"categories": [
- 15
+ 9
],
"date_created": "2024-12-02",
"type": "ct",
diff --git a/json/glances.json b/json/glances.json
index b9b337327..dda85650f 100644
--- a/json/glances.json
+++ b/json/glances.json
@@ -2,7 +2,7 @@
"name": "Glances",
"slug": "glances",
"categories": [
- 7
+ 9
],
"date_created": "2024-05-02",
"type": "misc",
diff --git a/json/glpi.json b/json/glpi.json
index 0e46ecd5b..29b2ad9b0 100644
--- a/json/glpi.json
+++ b/json/glpi.json
@@ -1,35 +1,35 @@
{
- "name": "GLPI",
- "slug": "glpi",
- "categories": [
- 0
- ],
- "date_created": "2025-01-06",
- "type": "ct",
- "updateable": false,
- "privileged": false,
- "interface_port": 80,
- "documentation": "https://glpi-project.org/documentation/",
- "website": "https://glpi-project.org/",
- "logo": "https://raw.githubusercontent.com/glpi-project/glpi/refs/heads/main/public/pics/login_logo_glpi.png",
- "description": "GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/glpi.sh",
- "resources": {
- "cpu": 2,
- "ram": 2048,
- "hdd": 10,
- "os": "Debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": "glpi",
- "password": "glpi"
- },
- "notes": [],
- "status": "β
"
-}
\ No newline at end of file
+ "name": "GLPI",
+ "slug": "glpi",
+ "categories": [
+ 25
+ ],
+ "date_created": "2025-01-06",
+ "type": "ct",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": 80,
+ "documentation": "https://glpi-project.org/documentation/",
+ "website": "https://glpi-project.org/",
+ "logo": "https://raw.githubusercontent.com/glpi-project/glpi/refs/heads/main/public/pics/login_logo_glpi.png",
+ "description": "GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/glpi.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 10,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": "glpi",
+ "password": "glpi"
+ },
+ "notes": [],
+ "status": "β
"
+}
diff --git a/json/go2rtc.json b/json/go2rtc.json
index b594bf9ef..2e1ac4678 100644
--- a/json/go2rtc.json
+++ b/json/go2rtc.json
@@ -2,7 +2,7 @@
"name": "go2rtc",
"slug": "go2rtc",
"categories": [
- 0
+ 15
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/gokapi.json b/json/gokapi.json
index 334c9023f..52c64a51b 100644
--- a/json/gokapi.json
+++ b/json/gokapi.json
@@ -2,7 +2,7 @@
"name": "Gokapi",
"slug": "gokapi",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/gotify.json b/json/gotify.json
index 1ec204c94..d51cca1e0 100644
--- a/json/gotify.json
+++ b/json/gotify.json
@@ -2,7 +2,7 @@
"name": "Gotify",
"slug": "gotify",
"categories": [
- 0
+ 19
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/grafana.json b/json/grafana.json
index 49870f80e..fb2f9237d 100644
--- a/json/grafana.json
+++ b/json/grafana.json
@@ -2,11 +2,11 @@
"name": "Grafana",
"slug": "grafana",
"categories": [
- 7
+ 9
],
"date_created": "2024-05-02",
"type": "ct",
- "updateable": false,
+ "updateable": true,
"privileged": false,
"interface_port": 3000,
"documentation": null,
@@ -33,7 +33,7 @@
"ram": 256,
"hdd": 1,
"os": "alpine",
- "version": "3.19"
+ "version": "3.21"
}
}
],
diff --git a/json/grist.json b/json/grist.json
index 7eeed63b7..b78d01bb1 100644
--- a/json/grist.json
+++ b/json/grist.json
@@ -1,35 +1,35 @@
{
- "name": "Grist",
- "slug": "grist",
- "categories": [
- 5
- ],
- "date_created": "2024-12-27",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": 8484,
- "documentation": null,
- "website": "https://www.getgrist.com/",
- "logo": "https://github.com/gristlabs/grist-core/blob/main/static/img/logo-grist.png?raw=true",
- "description": "Grist is a modern, open source spreadsheet that goes beyond the grid",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/grist.sh",
- "resources": {
- "cpu": 1,
- "ram": 1024,
- "hdd": 4,
- "os": "debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": null,
- "password": null
- },
- "notes": [],
- "status": "π§"
-}
\ No newline at end of file
+ "name": "Grist",
+ "slug": "grist",
+ "categories": [
+ 12
+ ],
+ "date_created": "2024-12-27",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 8484,
+ "documentation": null,
+ "website": "https://www.getgrist.com/",
+ "logo": "https://github.com/gristlabs/grist-core/blob/main/static/img/logo-grist.png?raw=true",
+ "description": "Grist is a modern, open source spreadsheet that goes beyond the grid",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/grist.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 1024,
+ "hdd": 4,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [],
+ "status": "π§"
+}
diff --git a/json/grocy.json b/json/grocy.json
index 63cd60474..bfdf81b66 100644
--- a/json/grocy.json
+++ b/json/grocy.json
@@ -2,7 +2,7 @@
"name": "grocy",
"slug": "grocy",
"categories": [
- 0
+ 24
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/haos-vm.json b/json/haos-vm.json
index efa822365..d9dbf0b91 100644
--- a/json/haos-vm.json
+++ b/json/haos-vm.json
@@ -2,7 +2,7 @@
"name": "Home Assistant OS",
"slug": "haos-vm",
"categories": [
- 2
+ 16
],
"date_created": "2024-04-29",
"type": "vm",
@@ -41,4 +41,4 @@
}
],
"status": "β"
-}
\ No newline at end of file
+}
diff --git a/json/headscale.json b/json/headscale.json
index 4b18aabb5..c079827fb 100644
--- a/json/headscale.json
+++ b/json/headscale.json
@@ -2,7 +2,7 @@
"name": "Headscale",
"slug": "headscale",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-13",
"type": "ct",
diff --git a/json/heimdall-dashboard.json b/json/heimdall-dashboard.json
index 042ce0971..ca7556294 100644
--- a/json/heimdall-dashboard.json
+++ b/json/heimdall-dashboard.json
@@ -2,7 +2,7 @@
"name": "Heimdall Dashboard",
"slug": "heimdall-dashboard",
"categories": [
- 15
+ 10
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/hivemq.json b/json/hivemq.json
index 0e5ec1546..e197c3236 100644
--- a/json/hivemq.json
+++ b/json/hivemq.json
@@ -2,7 +2,7 @@
"name": "HiveMQ CE",
"slug": "hivemq",
"categories": [
- 4
+ 18
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/hoarder.json b/json/hoarder.json
index 09c1d4c5c..3f59a61c2 100644
--- a/json/hoarder.json
+++ b/json/hoarder.json
@@ -1,38 +1,35 @@
{
- "name": "Hoarder",
- "slug": "hoarder",
- "categories": [
- 14
- ],
- "date_created": "2024-12-02",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": 3000,
- "documentation": "https://docs.hoarder.app/",
- "website": "https://hoarder.app/",
- "logo": "https://raw.githubusercontent.com/hoarder-app/hoarder/refs/heads/main/screenshots/logo.png",
- "description": "Hoarder is an AI-powered bookmarking tool that helps you save and organize your digital content. It automatically tags your links, notes, and images, making them easy to find later. With features like auto-fetching, lists, and full-text search, Hoarder is the perfect tool for anyone who wants to keep track of their digital life.",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/hoarder.sh",
- "resources": {
- "cpu": 2,
- "ram": 4096,
- "hdd": 8,
- "os": "debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": null,
- "password": null
- },
- "notes": [{
- "text": "No arm64 version of dependency available",
- "type": "warning"
- }],
- "status": "β"
-}
\ No newline at end of file
+ "name": "Hoarder",
+ "slug": "hoarder",
+ "categories": [
+ 12
+ ],
+ "date_created": "2024-12-02",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 3000,
+ "documentation": "https://docs.hoarder.app/",
+ "website": "https://hoarder.app/",
+ "logo": "https://raw.githubusercontent.com/hoarder-app/hoarder/refs/heads/main/screenshots/logo.png",
+ "description": "Hoarder is an AI-powered bookmarking tool that helps you save and organize your digital content. It automatically tags your links, notes, and images, making them easy to find later. With features like auto-fetching, lists, and full-text search, Hoarder is the perfect tool for anyone who wants to keep track of their digital life.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/hoarder.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 4096,
+ "hdd": 8,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [],
+ "status": "β"
+}
diff --git a/json/homarr.json b/json/homarr.json
index d9c52d911..01964ddd7 100644
--- a/json/homarr.json
+++ b/json/homarr.json
@@ -2,9 +2,9 @@
"name": "Homarr",
"slug": "homarr",
"categories": [
- 15
+ 10
],
- "date_created": "2024-05-02",
+ "date_created": "2025-01-28",
"type": "ct",
"updateable": true,
"privileged": false,
@@ -19,7 +19,7 @@
"script": "ct/homarr.sh",
"resources": {
"cpu": 2,
- "ram": 2048,
+ "ram": 4096,
"hdd": 8,
"os": "debian",
"version": "12"
diff --git a/json/homeassistant-core.json b/json/homeassistant-core.json
index a0a880176..ae63974b3 100644
--- a/json/homeassistant-core.json
+++ b/json/homeassistant-core.json
@@ -2,7 +2,7 @@
"name": "Home Assistant Core",
"slug": "homeassistant-core",
"categories": [
- 2
+ 16
],
"date_created": "2025-01-17",
"type": "ct",
diff --git a/json/homeassistant.json b/json/homeassistant.json
index 22febd982..99bd23536 100644
--- a/json/homeassistant.json
+++ b/json/homeassistant.json
@@ -2,7 +2,7 @@
"name": "Home Assistant Container",
"slug": "homeassistant",
"categories": [
- 2
+ 16
],
"date_created": "2024-04-29",
"type": "ct",
diff --git a/json/homebox.json b/json/homebox.json
index 934cd94f1..78838f0ab 100644
--- a/json/homebox.json
+++ b/json/homebox.json
@@ -2,7 +2,7 @@
"name": "HomeBox",
"slug": "homebox",
"categories": [
- 14
+ 24
],
"date_created": "2024-09-16",
"type": "ct",
diff --git a/json/homebridge.json b/json/homebridge.json
index fa7a19b31..c78f2fdb4 100644
--- a/json/homebridge.json
+++ b/json/homebridge.json
@@ -2,7 +2,7 @@
"name": "Homebridge",
"slug": "homebridge",
"categories": [
- 3
+ 16
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/homepage.json b/json/homepage.json
index 842e5baad..f39436779 100644
--- a/json/homepage.json
+++ b/json/homepage.json
@@ -2,7 +2,7 @@
"name": "Homepage",
"slug": "homepage",
"categories": [
- 15
+ 10
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/homer.json b/json/homer.json
index 96941ff7e..50efd2e37 100644
--- a/json/homer.json
+++ b/json/homer.json
@@ -2,7 +2,7 @@
"name": "Homer",
"slug": "homer",
"categories": [
- 15
+ 10
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/hyperhdr.json b/json/hyperhdr.json
index fc41abc1b..b5f14ad81 100644
--- a/json/hyperhdr.json
+++ b/json/hyperhdr.json
@@ -2,7 +2,7 @@
"name": "HyperHDR",
"slug": "hyperhdr",
"categories": [
- 0
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/hyperion.json b/json/hyperion.json
index af9fe8513..a36af0569 100644
--- a/json/hyperion.json
+++ b/json/hyperion.json
@@ -2,7 +2,7 @@
"name": "Hyperion",
"slug": "hyperion",
"categories": [
- 0
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/influxdb.json b/json/influxdb.json
index 310ac3872..ad5b671b2 100644
--- a/json/influxdb.json
+++ b/json/influxdb.json
@@ -2,7 +2,7 @@
"name": "InfluxDB",
"slug": "influxdb",
"categories": [
- 5
+ 8
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/inspircd.json b/json/inspircd.json
index d7314da91..b69a83842 100644
--- a/json/inspircd.json
+++ b/json/inspircd.json
@@ -2,7 +2,7 @@
"name": "InspIRCd 4",
"slug": "inspircd",
"categories": [
- 0
+ 24
],
"date_created": "2024-11-29",
"type": "ct",
diff --git a/json/iobroker.json b/json/iobroker.json
index 2a08d2c60..60384b111 100644
--- a/json/iobroker.json
+++ b/json/iobroker.json
@@ -2,7 +2,7 @@
"name": "ioBroker",
"slug": "iobroker",
"categories": [
- 3
+ 16
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/iventoy.json b/json/iventoy.json
index b7fd17c27..3644f7b76 100644
--- a/json/iventoy.json
+++ b/json/iventoy.json
@@ -2,7 +2,7 @@
"name": "iVentoy",
"slug": "iventoy",
"categories": [
- 11
+ 2
],
"date_created": "2024-05-16",
"type": "ct",
diff --git a/json/jackett.json b/json/jackett.json
index 3aa16c35a..885e7874a 100644
--- a/json/jackett.json
+++ b/json/jackett.json
@@ -2,7 +2,7 @@
"name": "Jackett",
"slug": "jackett",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/jellyfin.json b/json/jellyfin.json
index ef1a13f18..1a932ca00 100644
--- a/json/jellyfin.json
+++ b/json/jellyfin.json
@@ -2,7 +2,7 @@
"name": "Jellyfin Media Server",
"slug": "jellyfin",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/jellyseerr.json b/json/jellyseerr.json
index c40feb67f..93ea1ea6e 100644
--- a/json/jellyseerr.json
+++ b/json/jellyseerr.json
@@ -2,7 +2,7 @@
"name": "Jellyseerr",
"slug": "jellyseerr",
"categories": [
- 12
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/jenkins.json b/json/jenkins.json
index 0464c64a9..b4101eea2 100644
--- a/json/jenkins.json
+++ b/json/jenkins.json
@@ -2,7 +2,7 @@
"name": "Jenkins",
"slug": "jenkins",
"categories": [
- 3
+ 22
],
"date_created": "2024-12-26",
"type": "ct",
diff --git a/json/kavita.json b/json/kavita.json
index 688cc36d3..0389306cf 100644
--- a/json/kavita.json
+++ b/json/kavita.json
@@ -2,7 +2,7 @@
"name": "Kavita",
"slug": "kavita",
"categories": [
- 14
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/kernel-clean.json b/json/kernel-clean.json
index 2f4d67396..76f564a15 100644
--- a/json/kernel-clean.json
+++ b/json/kernel-clean.json
@@ -37,4 +37,4 @@
}
],
"status": "β
"
-}
\ No newline at end of file
+}
diff --git a/json/kernel-pin.json b/json/kernel-pin.json
index 4599365ad..8ee396ce0 100644
--- a/json/kernel-pin.json
+++ b/json/kernel-pin.json
@@ -37,4 +37,4 @@
}
],
"status": "π§"
-}
\ No newline at end of file
+}
diff --git a/json/keycloak.json b/json/keycloak.json
index 8c32b7ee2..de71f1247 100644
--- a/json/keycloak.json
+++ b/json/keycloak.json
@@ -2,7 +2,7 @@
"name": "Keycloak",
"slug": "keycloak",
"categories": [
- 11
+ 6
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/kimai.json b/json/kimai.json
index efcc68b17..f76dc381c 100644
--- a/json/kimai.json
+++ b/json/kimai.json
@@ -1,35 +1,35 @@
{
- "name": "Kimai",
- "slug": "kimai",
- "categories": [
- 0
- ],
- "date_created": "2024-11-20",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": null,
- "documentation": "https://www.kimai.org/documentation/",
- "website": "https://www.kimai.org/",
- "logo": "https://raw.githubusercontent.com/kimai/images/refs/heads/main/logo-transparent.png",
- "description": "Kimai is an open-source time-tracking software designed for freelancers, small teams, and businesses to efficiently track, manage, and analyze work hours. This web-based tool enables users to log their work time with ease, associating entries with specific clients, projects, and tasks.",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/kimai.sh",
- "resources": {
- "cpu": 2,
- "ram": 2048,
- "hdd": 7,
- "os": "Debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": "admin@helper-scripts.com",
- "password": "helper-scripts.com"
- },
- "notes": [],
- "status": "π§"
+ "name": "Kimai",
+ "slug": "kimai",
+ "categories": [
+ 25
+ ],
+ "date_created": "2024-11-20",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": null,
+ "documentation": "https://www.kimai.org/documentation/",
+ "website": "https://www.kimai.org/",
+ "logo": "https://raw.githubusercontent.com/kimai/images/refs/heads/main/logo-transparent.png",
+ "description": "Kimai is an open-source time-tracking software designed for freelancers, small teams, and businesses to efficiently track, manage, and analyze work hours. This web-based tool enables users to log their work time with ease, associating entries with specific clients, projects, and tasks.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/kimai.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 7,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": "admin@helper-scripts.com",
+ "password": "helper-scripts.com"
+ },
+ "notes": [],
+ "status": "π§"
}
\ No newline at end of file
diff --git a/json/komga.json b/json/komga.json
index 10f86dbea..2bf38dd68 100644
--- a/json/komga.json
+++ b/json/komga.json
@@ -2,7 +2,7 @@
"name": "Komga",
"slug": "komga",
"categories": [
- 12
+ 13
],
"date_created": "2024-11-15",
"type": "ct",
diff --git a/json/komodo.json b/json/komodo.json
index 31020169f..a87d3a3a5 100644
--- a/json/komodo.json
+++ b/json/komodo.json
@@ -1,40 +1,40 @@
{
- "name": "Komodo",
- "slug": "komodo",
- "categories": [
- 8
- ],
- "date_created": "2025-01-01",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": 9120,
- "documentation": "https://komo.do/docs/intro",
- "website": "https://komo.do",
- "logo": "https://komo.do/img/logo512.png",
- "description": "Komodo is a build and deployment system that automates the creation of versioned Docker images from Git repositories and facilitates the deployment of Docker containers and Docker Compose setups. It provides features such as build automation triggered by Git pushes, deployment management, and monitoring of uptime and logs across multiple servers. The core API and associated agent are developed in Rust.",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/komodo.sh",
- "resources": {
- "cpu": 2,
- "ram": 2048,
- "hdd": 10,
- "os": "Debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": null,
- "password": null
- },
- "notes": [
- {
- "text": "After the initial installation: Enter your desired admin user and password and then click on Sign Up",
- "type": "info"
- }
- ],
- "status": "π§"
+ "name": "Komodo",
+ "slug": "komodo",
+ "categories": [
+ 3
+ ],
+ "date_created": "2025-01-01",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 9120,
+ "documentation": "https://komo.do/docs/intro",
+ "website": "https://komo.do",
+ "logo": "https://komo.do/img/logo512.png",
+ "description": "Komodo is a build and deployment system that automates the creation of versioned Docker images from Git repositories and facilitates the deployment of Docker containers and Docker Compose setups. It provides features such as build automation triggered by Git pushes, deployment management, and monitoring of uptime and logs across multiple servers. The core API and associated agent are developed in Rust.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/komodo.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 10,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "After the initial installation: Enter your desired admin user and password and then click on Sign Up",
+ "type": "info"
+ }
+ ],
+ "status": "π§"
}
\ No newline at end of file
diff --git a/json/kubo.json b/json/kubo.json
index ae1cfcfc7..554923c45 100644
--- a/json/kubo.json
+++ b/json/kubo.json
@@ -2,7 +2,7 @@
"name": "Kubo",
"slug": "kubo",
"categories": [
- 16
+ 4
],
"date_created": "2024-06-27",
"type": "ct",
diff --git a/json/lazylibrarian.json b/json/lazylibrarian.json
index 13a515c20..d2675f26a 100644
--- a/json/lazylibrarian.json
+++ b/json/lazylibrarian.json
@@ -2,7 +2,7 @@
"name": "LazyLibrarian",
"slug": "lazylibrarian",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/lidarr.json b/json/lidarr.json
index 5f168fa45..c64c1d858 100644
--- a/json/lidarr.json
+++ b/json/lidarr.json
@@ -2,7 +2,7 @@
"name": "Lidarr",
"slug": "lidarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/linkwarden.json b/json/linkwarden.json
index a31bc4845..3ec555040 100644
--- a/json/linkwarden.json
+++ b/json/linkwarden.json
@@ -2,7 +2,7 @@
"name": "Linkwarden",
"slug": "linkwarden",
"categories": [
- 15
+ 12
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/listmonk.json b/json/listmonk.json
index 97330e41f..3397e832c 100644
--- a/json/listmonk.json
+++ b/json/listmonk.json
@@ -2,7 +2,7 @@
"name": "listmonk",
"slug": "listmonk",
"categories": [
- 14
+ 0
],
"date_created": "2024-11-22",
"type": "ct",
diff --git a/json/lldap.json b/json/lldap.json
index c2c95654c..573aee312 100644
--- a/json/lldap.json
+++ b/json/lldap.json
@@ -2,7 +2,7 @@
"name": "lldap",
"slug": "lldap",
"categories": [
- 11
+ 6
],
"date_created": "2024-08-06",
"type": "ct",
diff --git a/json/lubelogger.json b/json/lubelogger.json
index 3dfb2b759..0baeb98d4 100644
--- a/json/lubelogger.json
+++ b/json/lubelogger.json
@@ -2,7 +2,7 @@
"name": "LubeLogger",
"slug": "lubelogger",
"categories": [
- 0
+ 24
],
"date_created": "2024-11-29",
"type": "ct",
diff --git a/json/lxc-delete.json b/json/lxc-delete.json
new file mode 100644
index 000000000..f2010dbe3
--- /dev/null
+++ b/json/lxc-delete.json
@@ -0,0 +1,39 @@
+{
+ "name": "Container LXC Deletion",
+ "slug": "lxc-delete",
+ "categories": [
+ 1
+ ],
+ "date_created": "2025-01-21",
+ "type": "misc",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": null,
+ "documentation": null,
+ "website": null,
+ "logo": "https://raw.githubusercontent.com/home-assistant/brands/master/core_integrations/proxmoxve/icon.png",
+ "description": "This script helps manage and delete LXC containers on a Proxmox VE server. It lists all available containers, allowing the user to select one or more for deletion through an interactive menu. Running containers are automatically stopped before deletion, and the user is asked to confirm each action. The script ensures a controlled and efficient container management process.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "misc/lxc-delete.sh",
+ "resources": {
+ "cpu": null,
+ "ram": null,
+ "hdd": null,
+ "os": null,
+ "version": null
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "Execute within the Proxmox shell",
+ "type": "info"
+ }
+ ]
+}
diff --git a/json/mafl.json b/json/mafl.json
index 126d2ce42..21dfad6f3 100644
--- a/json/mafl.json
+++ b/json/mafl.json
@@ -2,7 +2,7 @@
"name": "Mafl",
"slug": "mafl",
"categories": [
- 15
+ 10
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/magicmirror.json b/json/magicmirror.json
index d399ab668..e5b42be08 100644
--- a/json/magicmirror.json
+++ b/json/magicmirror.json
@@ -2,7 +2,7 @@
"name": "MagicMirror Server",
"slug": "magicmirror",
"categories": [
- 0
+ 24
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/mariadb.json b/json/mariadb.json
index 0d3ab6032..0322a0a77 100644
--- a/json/mariadb.json
+++ b/json/mariadb.json
@@ -2,7 +2,7 @@
"name": "Mariadb",
"slug": "mariadb",
"categories": [
- 5
+ 8
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/matterbridge.json b/json/matterbridge.json
index b01d96a4a..b695bce8c 100644
--- a/json/matterbridge.json
+++ b/json/matterbridge.json
@@ -2,7 +2,7 @@
"name": "Matterbridge",
"slug": "matterbridge",
"categories": [
- 6
+ 17
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/mediamtx.json b/json/mediamtx.json
index 888d4ef69..0647cde19 100644
--- a/json/mediamtx.json
+++ b/json/mediamtx.json
@@ -2,7 +2,7 @@
"name": "MediaMTX",
"slug": "mediamtx",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/medusa.json b/json/medusa.json
index 4a94ec7f1..fcad277ef 100644
--- a/json/medusa.json
+++ b/json/medusa.json
@@ -2,7 +2,7 @@
"name": "Medusa",
"slug": "medusa",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/memos.json b/json/memos.json
index e665a7874..f40d92ede 100644
--- a/json/memos.json
+++ b/json/memos.json
@@ -2,7 +2,7 @@
"name": "Memos",
"slug": "memos",
"categories": [
- 14
+ 12
],
"date_created": "2024-10-31",
"type": "ct",
diff --git a/json/meshcentral.json b/json/meshcentral.json
index 7a79e2d1e..136135cc7 100644
--- a/json/meshcentral.json
+++ b/json/meshcentral.json
@@ -2,7 +2,7 @@
"name": "MeshCentral",
"slug": "meshcentral",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/metadata.json b/json/metadata.json
index 910be1c0b..e25f0ee70 100644
--- a/json/metadata.json
+++ b/json/metadata.json
@@ -1,105 +1,30 @@
{
- "categories": [
- {
- "name": "Proxmox VE Tools",
- "id": 1,
- "sort_order": 1.0
- },
- {
- "name": "AdBlocker & DNS",
- "id": 13,
- "sort_order": 2.0
- },
- {
- "name": "*Arr Suite",
- "id": 18,
- "sort_order": 3.0
- },
- {
- "name": "Automation",
- "id": 3,
- "sort_order": 4.0
- },
- {
- "name": "Coding & AI",
- "id": 19,
- "sort_order": 5.0
- },
- {
- "name": "Dashboards",
- "id": 15,
- "sort_order": 5.0
- },
- {
- "name": "Database",
- "id": 5,
- "sort_order": 6.0
- },
- {
- "name": "Docker & Kubernetes",
- "id": 8,
- "sort_order": 7.0
- },
- {
- "name": "Document & Notes",
- "id": 14,
- "sort_order": 8.0
- },
- {
- "name": "File & Downloads",
- "id": 16,
- "sort_order": 9.0
- },
- {
- "name": "Home Assistant",
- "id": 2,
- "sort_order": 10.0
- },
- {
- "name": "Media & Photo",
- "id": 12,
- "sort_order": 11.0
- },
- {
- "name": "Monitoring & Analytics",
- "id": 7,
- "sort_order": 12.0
- },
- {
- "name": "MQTT",
- "id": 4,
- "sort_order": 13.0
- },
- {
- "name": "NVR & DVR",
- "id": 17,
- "sort_order": 14.0
- },
- {
- "name": "Operating System",
- "id": 9,
- "sort_order": 15.0
- },
- {
- "name": "Server & Networking",
- "id": 11,
- "sort_order": 16.0
- },
- {
- "name": "TurnKey",
- "id": 10,
- "sort_order": 17.0
- },
- {
- "name": "Matter, Zigbee & ZWave",
- "id": 6,
- "sort_order": 18.0
- },
- {
- "name": "Miscellaneous",
- "id": 0,
- "sort_order": 99.0
- }
- ],
- "status": "π§"
-}
\ No newline at end of file
+ "categories": [
+ { "name": "Proxmox & Virtualization", "id": 1, "sort_order": 1.0, "description": "Tools and scripts to manage Proxmox VE and virtualization platforms effectively." },
+ { "name": "Operating Systems", "id": 2, "sort_order": 2.0, "description": "Scripts for deploying and managing various operating systems." },
+ { "name": "Containers & Docker", "id": 3, "sort_order": 3.0, "description": "Solutions for containerization using Docker and related technologies." },
+ { "name": "Network & Firewall", "id": 4, "sort_order": 4.0, "description": "Enhance network security and configure firewalls with ease." },
+ { "name": "Adblock & DNS", "id": 5, "sort_order": 5.0, "description": "Optimize your network with DNS and ad-blocking solutions." },
+ { "name": "Authentication & Security", "id": 6, "sort_order": 6.0, "description": "Secure your infrastructure with authentication and security tools." },
+ { "name": "Backup & Recovery", "id": 7, "sort_order": 7.0, "description": "Reliable backup and recovery scripts to protect your data." },
+ { "name": "Databases", "id": 8, "sort_order": 8.0, "description": "Deploy and manage robust database systems with ease." },
+ { "name": "Monitoring & Analytics", "id": 9, "sort_order": 9.0, "description": "Monitor system performance and analyze data seamlessly." },
+ { "name": "Dashboards & Frontends", "id": 10, "sort_order": 10.0, "description": "Create interactive dashboards and user-friendly frontends." },
+ { "name": "Files & Downloads", "id": 11, "sort_order": 11.0, "description": "Manage file sharing and downloading solutions efficiently." },
+ { "name": "Documents & Notes", "id": 12, "sort_order": 12.0, "description": "Organize and manage documents and note-taking tools." },
+ { "name": "Media & Streaming", "id": 13, "sort_order": 13.0, "description": "Stream and manage media effortlessly across devices." },
+ { "name": "*Arr Suite", "id": 14, "sort_order": 14.0, "description": "Automated media management with the popular *Arr suite tools." },
+ { "name": "NVR & Cameras", "id": 15, "sort_order": 15.0, "description": "Manage network video recorders and camera setups." },
+ { "name": "IoT & Smart Home", "id": 16, "sort_order": 16.0, "description": "Control and automate IoT devices and smart home systems." },
+ { "name": "ZigBee, Z-Wave & Matter", "id": 17, "sort_order": 17.0, "description": "Solutions for ZigBee, Z-Wave, and Matter-based device management." },
+ { "name": "MQTT & Messaging", "id": 18, "sort_order": 18.0, "description": "Set up reliable messaging and MQTT-based communication systems." },
+ { "name": "Automation & Scheduling", "id": 19, "sort_order": 19.0, "description": "Automate tasks and manage scheduling with powerful tools." },
+ { "name": "AI / Coding & Dev-Tools", "id": 20, "sort_order": 20.0, "description": "Leverage AI and developer tools for smarter coding workflows." },
+ { "name": "Webservers & Proxies", "id": 21, "sort_order": 21.0, "description": "Deploy and configure web servers and proxy solutions." },
+ { "name": "Bots & ChatOps", "id": 22, "sort_order": 22.0, "description": "Enhance collaboration with bots and ChatOps integrations." },
+ { "name": "Finance & Budgeting", "id": 23, "sort_order": 23.0, "description": "Track expenses and manage budgets efficiently." },
+ { "name": "Gaming & Leisure", "id": 24, "sort_order": 24.0, "description": "Scripts for gaming servers and leisure-related tools." },
+ { "name": "Business & ERP", "id": 25, "sort_order": 25.0, "description": "Streamline business operations with ERP and management tools." },
+ { "name": "Miscellaneous", "id": 0, "sort_order": 99.0, "description": "General scripts and tools that don't fit into other categories." }
+ ]
+}
diff --git a/json/metube.json b/json/metube.json
index ce51021d5..643e52c08 100644
--- a/json/metube.json
+++ b/json/metube.json
@@ -2,7 +2,7 @@
"name": "MeTube",
"slug": "metube",
"categories": [
- 12
+ 11
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/microcode.json b/json/microcode.json
index 56c13ae61..cb09aeac7 100644
--- a/json/microcode.json
+++ b/json/microcode.json
@@ -41,4 +41,4 @@
}
],
"status": "β"
-}
\ No newline at end of file
+}
diff --git a/json/mikrotik-routeros.json b/json/mikrotik-routeros.json
index c96f5dfe2..b6e2c071a 100644
--- a/json/mikrotik-routeros.json
+++ b/json/mikrotik-routeros.json
@@ -2,7 +2,7 @@
"name": "Mikrotik RouterOS CHR",
"slug": "mikrotik-routeros",
"categories": [
- 11
+ 2
],
"date_created": "2024-05-02",
"type": "vm",
diff --git a/json/mongodb.json b/json/mongodb.json
index c9535d00d..835461892 100644
--- a/json/mongodb.json
+++ b/json/mongodb.json
@@ -2,7 +2,7 @@
"name": "MongoDB",
"slug": "mongodb",
"categories": [
- 5
+ 8
],
"date_created": "2024-05-18",
"type": "ct",
diff --git a/json/monica.json b/json/monica.json
new file mode 100644
index 000000000..6e91b210a
--- /dev/null
+++ b/json/monica.json
@@ -0,0 +1,34 @@
+{
+ "name": "Monica",
+ "slug": "monica",
+ "categories": [
+ 24
+ ],
+ "date_created": "2025-01-28",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 80,
+ "documentation": "https://github.com/monicahq/monica/tree/4.x/docs",
+ "website": "https://www.monicahq.com/",
+ "logo": "https://raw.githubusercontent.com/monicahq/monica/0400350b4f9bf02300b030b9924b66ef2960b188/public/img/favicon.svg",
+ "description": "Monica is an open-source personal CRM designed to help you manage and strengthen your relationships. It allows you to store important details about your contacts, track interactions, set reminders for special dates, and log activitiesβall in one secure, private place. Perfect for busy individuals, Monica helps you stay organized, remember meaningful moments, and nurture your connections without ads or data mining. Install it on your own server for full control!",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/monica.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 8,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": "admin@helper-scripts.com",
+ "password": "helper-scripts.com"
+ },
+ "notes": []
+}
diff --git a/json/motioneye.json b/json/motioneye.json
index dacf8ea62..5f899639e 100644
--- a/json/motioneye.json
+++ b/json/motioneye.json
@@ -2,7 +2,7 @@
"name": "MotionEye NVR",
"slug": "motioneye",
"categories": [
- 17
+ 15
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/mqtt.json b/json/mqtt.json
index d53a2d653..abc002c90 100644
--- a/json/mqtt.json
+++ b/json/mqtt.json
@@ -2,7 +2,7 @@
"name": "MQTT",
"slug": "mqtt",
"categories": [
- 4
+ 18
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/mylar3.json b/json/mylar3.json
index 9feb4dce7..74a1152b8 100644
--- a/json/mylar3.json
+++ b/json/mylar3.json
@@ -2,7 +2,7 @@
"name": "Mylar3",
"slug": "mylar3",
"categories": [
- 12
+ 14
],
"date_created": "2024-12-02",
"type": "ct",
diff --git a/json/myspeed.json b/json/myspeed.json
index 4044a66db..f4249a3b3 100644
--- a/json/myspeed.json
+++ b/json/myspeed.json
@@ -2,7 +2,7 @@
"name": "MySpeed",
"slug": "myspeed",
"categories": [
- 7
+ 4
],
"date_created": "2024-06-14",
"type": "ct",
diff --git a/json/mysql.json b/json/mysql.json
index d5ad13c34..5bec4a00d 100644
--- a/json/mysql.json
+++ b/json/mysql.json
@@ -2,7 +2,7 @@
"name": "MySQL",
"slug": "mysql",
"categories": [
- 5
+ 8
],
"date_created": "2024-10-10",
"type": "ct",
diff --git a/json/n8n.json b/json/n8n.json
index d3a4f2dd5..a3bdcad30 100644
--- a/json/n8n.json
+++ b/json/n8n.json
@@ -2,7 +2,7 @@
"name": "n8n",
"slug": "n8n",
"categories": [
- 3
+ 16
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/navidrome.json b/json/navidrome.json
index b412612f7..3e7c646dc 100644
--- a/json/navidrome.json
+++ b/json/navidrome.json
@@ -2,7 +2,7 @@
"name": "Navidrome",
"slug": "navidrome",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/neo4j.json b/json/neo4j.json
index 7da7cc260..01b9adb01 100644
--- a/json/neo4j.json
+++ b/json/neo4j.json
@@ -2,7 +2,7 @@
"name": "Neo4j",
"slug": "neo4j",
"categories": [
- 5
+ 8
],
"date_created": "2024-10-20",
"type": "ct",
diff --git a/json/netbox.json b/json/netbox.json
index 78ddb7b6b..7afa04392 100644
--- a/json/netbox.json
+++ b/json/netbox.json
@@ -2,7 +2,7 @@
"name": "NetBox",
"slug": "netbox",
"categories": [
- 11
+ 4
],
"date_created": "2024-11-17",
"type": "ct",
diff --git a/json/nextcloud-vm.json b/json/nextcloud-vm.json
index fc639387b..bf337b2e5 100644
--- a/json/nextcloud-vm.json
+++ b/json/nextcloud-vm.json
@@ -2,7 +2,7 @@
"name": "Nextcloud",
"slug": "nextcloud-vm",
"categories": [
- 12
+ 2
],
"date_created": "2023-11-14",
"type": "vm",
@@ -37,4 +37,4 @@
}
],
"status": "β
"
-}
\ No newline at end of file
+}
diff --git a/json/nextcloudpi.json b/json/nextcloudpi.json
index 625f951b7..d58cab9c3 100644
--- a/json/nextcloudpi.json
+++ b/json/nextcloudpi.json
@@ -2,7 +2,7 @@
"name": "Nextcloud",
"slug": "nextcloudpi",
"categories": [
- 12
+ 2
],
"date_created": "2024-05-02",
"type": "ct",
@@ -33,7 +33,7 @@
"ram": 1024,
"hdd": 2,
"os": "alpine",
- "version": "3.19"
+ "version": "3.21"
}
}
],
diff --git a/json/nextpvr.json b/json/nextpvr.json
index 0581b321b..60680701e 100644
--- a/json/nextpvr.json
+++ b/json/nextpvr.json
@@ -1,35 +1,35 @@
{
- "name": "NextPVR",
- "slug": "nextpvr",
- "categories": [
- 17
- ],
- "date_created": "2024-11-20",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": 8866,
- "documentation": "https://github.com/sub3/NextPVR/wiki",
- "website": "https://nextpvr.com/",
- "logo": null,
- "description": "NextPVR is a personal video recorder application for Microsoft Windows, Linux, Mac and Docker. NextPVR makes it easy to watch or record live TV, and provides great features like series recordings, web scheduling, iPhone/iPad client application, Kodi/Emby integration etc.",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/nextpvr.sh",
- "resources": {
- "cpu": 1,
- "ram": 1024,
- "hdd": 5,
- "os": "Debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": null,
- "password": null
- },
- "notes": [],
- "status": "π§"
-}
\ No newline at end of file
+ "name": "NextPVR",
+ "slug": "nextpvr",
+ "categories": [
+ 15
+ ],
+ "date_created": "2024-11-20",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 8866,
+ "documentation": "https://github.com/sub3/NextPVR/wiki",
+ "website": "https://nextpvr.com/",
+ "logo": null,
+ "description": "NextPVR is a personal video recorder application for Microsoft Windows, Linux, Mac and Docker. NextPVR makes it easy to watch or record live TV, and provides great features like series recordings, web scheduling, iPhone/iPad client application, Kodi/Emby integration etc.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/nextpvr.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 1024,
+ "hdd": 5,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [],
+ "status": "π§"
+}
diff --git a/json/nginxproxymanager.json b/json/nginxproxymanager.json
index 91c3113ab..fbc3b19b6 100644
--- a/json/nginxproxymanager.json
+++ b/json/nginxproxymanager.json
@@ -2,7 +2,7 @@
"name": "Nginx Proxy Manager",
"slug": "nginxproxymanager",
"categories": [
- 11
+ 21
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/nocodb.json b/json/nocodb.json
index fd5763421..6896590ae 100644
--- a/json/nocodb.json
+++ b/json/nocodb.json
@@ -2,7 +2,7 @@
"name": "NocoDB",
"slug": "nocodb",
"categories": [
- 14
+ 25
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/node-red.json b/json/node-red.json
index 8b3c784c5..93d890639 100644
--- a/json/node-red.json
+++ b/json/node-red.json
@@ -2,7 +2,7 @@
"name": "Node-Red",
"slug": "node-red",
"categories": [
- 3
+ 16
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/nodebb.json b/json/nodebb.json
new file mode 100644
index 000000000..85b8c1294
--- /dev/null
+++ b/json/nodebb.json
@@ -0,0 +1,40 @@
+{
+ "name": "NodeBB",
+ "slug": "nodebb",
+ "categories": [
+ 10,
+ 25
+ ],
+ "date_created": "2025-01-28",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 4567,
+ "documentation": "https://docs.nodebb.org/",
+ "website": "https://nodebb.org/",
+ "logo": "https://raw.githubusercontent.com/NodeBB/NodeBB/refs/heads/master/public/logo.png",
+ "description": "NodeBB Forum Software is powered by Node.js and supports either Redis, MongoDB, or a PostgreSQL database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB takes the best of the modern web: real-time streaming discussions, mobile responsiveness, and rich RESTful read/write APIs, while staying true to the original bulletin board/forum format β categorical hierarchies, local user accounts, and asynchronous messaging.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/nodebb.sh",
+ "resources": {
+ "cpu": 4,
+ "ram": 2048,
+ "hdd": 10,
+ "os": "Ubuntu",
+ "version": "24.04"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": "helper-scripts",
+ "password": "helper-scripts"
+ },
+ "notes": [
+ {
+ "text": "Only use Ubuntu 24.04!",
+ "type": "warning"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/json/notifiarr.json b/json/notifiarr.json
index eec092f01..e564f62ed 100644
--- a/json/notifiarr.json
+++ b/json/notifiarr.json
@@ -2,7 +2,7 @@
"name": "Notifiarr",
"slug": "notifiarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/ntfy.json b/json/ntfy.json
index 567d8c757..f3a350cc7 100644
--- a/json/ntfy.json
+++ b/json/ntfy.json
@@ -2,7 +2,7 @@
"name": "ntfy",
"slug": "ntfy",
"categories": [
- 0
+ 19
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/nzbget.json b/json/nzbget.json
index 031eb6e83..18d2f3689 100644
--- a/json/nzbget.json
+++ b/json/nzbget.json
@@ -2,7 +2,7 @@
"name": "NZBGet",
"slug": "nzbget",
"categories": [
- 16
+ 11
],
"date_created": "2024-10-31",
"type": "ct",
diff --git a/json/octoprint.json b/json/octoprint.json
index f130da279..42ab14ba4 100644
--- a/json/octoprint.json
+++ b/json/octoprint.json
@@ -2,7 +2,7 @@
"name": "OctoPrint",
"slug": "octoprint",
"categories": [
- 0
+ 24
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/olivetin.json b/json/olivetin.json
index 0b06a78a2..a7ca707e9 100644
--- a/json/olivetin.json
+++ b/json/olivetin.json
@@ -2,7 +2,7 @@
"name": "OliveTin",
"slug": "olivetin",
"categories": [
- 15
+ 10
],
"date_created": "2024-05-02",
"type": "misc",
diff --git a/json/omada.json b/json/omada.json
index 9dc4a76fb..693b7fb37 100644
--- a/json/omada.json
+++ b/json/omada.json
@@ -2,7 +2,7 @@
"name": "Omada Controller",
"slug": "omada",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/ombi.json b/json/ombi.json
index 93f050007..f057af1aa 100644
--- a/json/ombi.json
+++ b/json/ombi.json
@@ -2,7 +2,7 @@
"name": "Ombi",
"slug": "ombi",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/omv.json b/json/omv.json
index c1cd8f0af..610eb68aa 100644
--- a/json/omv.json
+++ b/json/omv.json
@@ -2,7 +2,7 @@
"name": "OpenMediaVault",
"slug": "omv",
"categories": [
- 12
+ 2
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/onedev.json b/json/onedev.json
index ce46108d2..a7ae2134f 100644
--- a/json/onedev.json
+++ b/json/onedev.json
@@ -2,7 +2,7 @@
"name": "OneDev",
"slug": "onedev",
"categories": [
- 3
+ 20
],
"date_created": "2024-11-30",
"type": "ct",
diff --git a/json/opengist.json b/json/opengist.json
index 02e2f841b..dc279e248 100644
--- a/json/opengist.json
+++ b/json/opengist.json
@@ -2,11 +2,11 @@
"name": "Opengist",
"slug": "opengist",
"categories": [
- 3
+ 20
],
"date_created": "2025-01-14",
"type": "ct",
- "updateable": false,
+ "updateable": true,
"privileged": false,
"interface_port": 6157,
"documentation": null,
diff --git a/json/openhab.json b/json/openhab.json
index c00187352..1c4ac536a 100644
--- a/json/openhab.json
+++ b/json/openhab.json
@@ -2,14 +2,14 @@
"name": "openHAB",
"slug": "openhab",
"categories": [
- 3
+ 16
],
"date_created": "2024-05-02",
"type": "ct",
"updateable": false,
"privileged": false,
- "interface_port": 8080,
- "documentation": null,
+ "interface_port": 8443,
+ "documentation": "https://www.openhab.org/docs/",
"website": "https://www.openhab.org/",
"logo": "https://www.coxprod.org/domotique/wp-content/uploads/2019/01/openhab-logo-square.png",
"description": "openHAB is a popular open-source home automation platform that provides a vendor and technology agnostic solution for integrating and automating various smart home devices and services. It supports a wide range of devices and protocols, making it easy to bring together different systems and devices into a unified smart home ecosystem. With its user-friendly interface and powerful automation capabilities, openHAB makes it easy to create custom automations and monitor and control your smart home devices and systems, all from a single interface.",
@@ -32,4 +32,4 @@
},
"notes": [],
"status": "β
"
-}
\ No newline at end of file
+}
diff --git a/json/openobserve.json b/json/openobserve.json
index 74480438b..474a0add9 100644
--- a/json/openobserve.json
+++ b/json/openobserve.json
@@ -2,7 +2,7 @@
"name": "OpenObserve",
"slug": "openobserve",
"categories": [
- 7
+ 9
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/openwebui.json b/json/openwebui.json
index cf6d24d57..87bec494c 100644
--- a/json/openwebui.json
+++ b/json/openwebui.json
@@ -2,7 +2,7 @@
"name": "Open WebUI",
"slug": "openwebui",
"categories": [
- 19
+ 20
],
"date_created": "2024-10-24",
"type": "ct",
diff --git a/json/openwrt.json b/json/openwrt.json
index 9fb1dba75..a0f2f8943 100644
--- a/json/openwrt.json
+++ b/json/openwrt.json
@@ -2,7 +2,7 @@
"name": "OpenWrt",
"slug": "openwrt",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-02",
"type": "vm",
diff --git a/json/overseerr.json b/json/overseerr.json
index 264f67b62..a8bce16ba 100644
--- a/json/overseerr.json
+++ b/json/overseerr.json
@@ -2,7 +2,7 @@
"name": "Overseerr",
"slug": "overseerr",
"categories": [
- 12
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/owncast.json b/json/owncast.json
index e4baf4993..5a27c089c 100644
--- a/json/owncast.json
+++ b/json/owncast.json
@@ -2,7 +2,7 @@
"name": "Owncast",
"slug": "owncast",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/owncloud-vm.json b/json/owncloud-vm.json
index da8c6783a..caee53ea2 100644
--- a/json/owncloud-vm.json
+++ b/json/owncloud-vm.json
@@ -2,7 +2,7 @@
"name": "ownCloud",
"slug": "owncloud-vm",
"categories": [
- 12
+ 2
],
"date_created": "2024-05-02",
"type": "vm",
@@ -37,4 +37,4 @@
}
],
"status": "β"
-}
\ No newline at end of file
+}
diff --git a/json/pairdrop.json b/json/pairdrop.json
index 43bf89805..cb7368a45 100644
--- a/json/pairdrop.json
+++ b/json/pairdrop.json
@@ -2,7 +2,7 @@
"name": "PairDrop",
"slug": "pairdrop",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/paperless-ngx.json b/json/paperless-ngx.json
index 4990642b6..bcd658895 100644
--- a/json/paperless-ngx.json
+++ b/json/paperless-ngx.json
@@ -2,7 +2,7 @@
"name": "Paperless-ngx",
"slug": "paperless-ngx",
"categories": [
- 14
+ 12
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/part-db.json b/json/part-db.json
index 2cd3e7ad9..24fd83332 100644
--- a/json/part-db.json
+++ b/json/part-db.json
@@ -2,7 +2,7 @@
"name": "Part-DB",
"slug": "part-db",
"categories": [
- 0
+ 25
],
"date_created": "2024-12-18",
"type": "ct",
diff --git a/json/pbs.json b/json/pbs.json
index a7d6ff65c..8039ad527 100644
--- a/json/pbs.json
+++ b/json/pbs.json
@@ -2,7 +2,7 @@
"name": "Proxmox Backup Server",
"slug": "pbs",
"categories": [
- 11
+ 1
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/peanut.json b/json/peanut.json
index cd369591f..cf9750cc6 100644
--- a/json/peanut.json
+++ b/json/peanut.json
@@ -2,7 +2,7 @@
"name": "PeaNUT",
"slug": "peanut",
"categories": [
- 7
+ 4
],
"date_created": "2024-06-14",
"type": "ct",
diff --git a/json/petio.json b/json/petio.json
index 2192a3ba2..bca6fc38c 100644
--- a/json/petio.json
+++ b/json/petio.json
@@ -2,7 +2,7 @@
"name": "Petio",
"slug": "petio",
"categories": [
- 12
+ 13
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/pf2etools.json b/json/pf2etools.json
index 5654209ae..a9e4473c9 100644
--- a/json/pf2etools.json
+++ b/json/pf2etools.json
@@ -2,7 +2,7 @@
"name": "Pf2eTools",
"slug": "Pf2eTools",
"categories": [
- 0
+ 24
],
"date_created": "2025-01-02",
"type": "ct",
diff --git a/json/photoprism.json b/json/photoprism.json
index 995439d9d..6c617b10f 100644
--- a/json/photoprism.json
+++ b/json/photoprism.json
@@ -2,7 +2,7 @@
"name": "PhotoPrism",
"slug": "photoprism",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/phpipam.json b/json/phpipam.json
index 43a792137..9c63cf626 100644
--- a/json/phpipam.json
+++ b/json/phpipam.json
@@ -2,7 +2,7 @@
"name": "phpIPAM",
"slug": "phpipam",
"categories": [
- 11
+ 4
],
"date_created": "2025-01-15",
"type": "ct",
diff --git a/json/pialert.json b/json/pialert.json
index 64e5d93bd..d279de990 100644
--- a/json/pialert.json
+++ b/json/pialert.json
@@ -2,7 +2,7 @@
"name": "Pi.Alert",
"slug": "pialert",
"categories": [
- 7
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/pihole.json b/json/pihole.json
index 46e4391f2..19124d1ed 100644
--- a/json/pihole.json
+++ b/json/pihole.json
@@ -2,7 +2,7 @@
"name": "Pi-Hole",
"slug": "pihole",
"categories": [
- 13
+ 5
],
"date_created": "2024-04-28",
"type": "ct",
diff --git a/json/pimox-haos-vm.json b/json/pimox-haos-vm.json
index a44d0d7fb..59a2630bd 100644
--- a/json/pimox-haos-vm.json
+++ b/json/pimox-haos-vm.json
@@ -2,7 +2,7 @@
"name": "PiMox HAOS",
"slug": "pimox-haos-vm",
"categories": [
- 2
+ 16
],
"date_created": "2024-04-29",
"type": "vm",
@@ -37,4 +37,4 @@
}
],
"status": "β
"
-}
\ No newline at end of file
+}
diff --git a/json/pingvin.json b/json/pingvin.json
index e251c1355..aed1a3461 100644
--- a/json/pingvin.json
+++ b/json/pingvin.json
@@ -2,7 +2,7 @@
"name": "Pingvin Share",
"slug": "pingvin",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/plex.json b/json/plex.json
index 2516249de..4f6ec2c3a 100644
--- a/json/plex.json
+++ b/json/plex.json
@@ -2,7 +2,7 @@
"name": "Plex Media Server",
"slug": "plex",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/pocketbase.json b/json/pocketbase.json
index 4f447d72e..210b580b4 100644
--- a/json/pocketbase.json
+++ b/json/pocketbase.json
@@ -2,7 +2,7 @@
"name": "Pocketbase",
"slug": "pocketbase",
"categories": [
- 5
+ 8
],
"date_created": "2024-05-07",
"type": "ct",
diff --git a/json/pocketid.json b/json/pocketid.json
new file mode 100644
index 000000000..2e9880aa9
--- /dev/null
+++ b/json/pocketid.json
@@ -0,0 +1,43 @@
+{
+ "name": "Pocket ID",
+ "slug": "pocketid",
+ "categories": [
+ 6
+ ],
+ "date_created": "2025-01-28",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 80,
+ "documentation": "https://stonith404.github.io/pocket-id/introduction",
+ "website": "https://github.com/stonith404/pocket-id",
+ "logo": "https://raw.githubusercontent.com/stonith404/pocket-id/refs/heads/main/docs/static/img/pocket-id.png",
+ "description": "Pocket ID is a simple OIDC provider that allows users to authenticate with their passkeys to your services.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/pocketid.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 4,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "Pocket ID requires https to work.",
+ "type": "warning"
+ },
+ {
+ "text": "Configuration Path: `/opt/pocket-id/backend/.env`, `/opt/pocket-id/frontend/.env`.",
+ "type": "info"
+ }
+ ]
+}
diff --git a/json/podman-homeassistant.json b/json/podman-homeassistant.json
index f8b33c19e..65817a45f 100644
--- a/json/podman-homeassistant.json
+++ b/json/podman-homeassistant.json
@@ -2,7 +2,7 @@
"name": "Podman Home Assistant Container",
"slug": "podman-homeassistant",
"categories": [
- 2
+ 16
],
"date_created": "2024-04-29",
"type": "ct",
diff --git a/json/podman.json b/json/podman.json
index cc2fd82e9..74141f2c2 100644
--- a/json/podman.json
+++ b/json/podman.json
@@ -2,7 +2,7 @@
"name": "Podman",
"slug": "podman",
"categories": [
- 8
+ 3
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/post-pmg-install.json b/json/post-pmg-install.json
new file mode 100644
index 000000000..442a4c9bf
--- /dev/null
+++ b/json/post-pmg-install.json
@@ -0,0 +1,47 @@
+{
+ "name": "Proxmox Mail Gateway Post Install",
+ "slug": "post-pmg-install",
+ "categories": [
+ 1
+ ],
+ "date_created": "2025-01-20",
+ "type": "misc",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": null,
+ "documentation": null,
+ "website": null,
+ "logo": "https://raw.githubusercontent.com/home-assistant/brands/master/core_integrations/proxmoxve/icon.png",
+ "description": "The script will give options to Disable the Enterprise Repo, Add/Correct PMG Sources, Enable the No-Subscription Repo, Add Test Repo, Disable Subscription Nag, Update Proxmox Mail Gateway and Reboot PMG.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "misc/post-pmg-install.sh",
+ "resources": {
+ "cpu": null,
+ "ram": null,
+ "hdd": null,
+ "os": null,
+ "version": null
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "Proxmox Mail Gateway ONLY",
+ "type": "warning"
+ },
+ {
+ "text": "Execute within the Proxmox Mail Gateway Shell",
+ "type": "info"
+ },
+ {
+ "text": "It is recommended to answer βyesβ (y) to all options presented during the process.",
+ "type": "info"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/json/postgresql.json b/json/postgresql.json
index 268911902..e258c0b2d 100644
--- a/json/postgresql.json
+++ b/json/postgresql.json
@@ -2,7 +2,7 @@
"name": "PostgreSQL",
"slug": "postgresql",
"categories": [
- 5
+ 8
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/projectsend.json b/json/projectsend.json
new file mode 100644
index 000000000..fe3ab3a20
--- /dev/null
+++ b/json/projectsend.json
@@ -0,0 +1,39 @@
+{
+ "name": "ProjectSend",
+ "slug": "projectsend",
+ "categories": [
+ 12
+ ],
+ "date_created": "2025-01-20",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 80,
+ "documentation": "https://docs.projectsend.org/",
+ "website": "https://projectsend.org/",
+ "logo": "https://camo.githubusercontent.com/378a455e1cf6f36c5427b2bdfd78b0defd829be9b8c6b073f83931693e1665d5/68747470733a2f2f7777772e70726f6a65637473656e642e6f72672f70726f6a65637473656e642d6c6f676f2d6e65772e706e67",
+ "description": "ProjectSend is a free, open source software that lets you share files with your clients, focused on ease of use and privacy. It supports clients groups, system users roles, statistics, multiple languages, detailed logs... and much more!",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/projectsend.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 1024,
+ "hdd": 8,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "After running the update script, logging in as a system user in ProjectSend is necessary to upgrade the database.",
+ "type": "info"
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/json/prometheus-alertmanager.json b/json/prometheus-alertmanager.json
index 5d073a399..7ae2fd13a 100644
--- a/json/prometheus-alertmanager.json
+++ b/json/prometheus-alertmanager.json
@@ -2,7 +2,7 @@
"name": "Prometheus Alertmanager",
"slug": "prometheus-alertmanager",
"categories": [
- 7
+ 9
],
"date_created": "2025-01-09",
"type": "ct",
diff --git a/json/prometheus-pve-exporter.json b/json/prometheus-pve-exporter.json
new file mode 100644
index 000000000..cc028b4b3
--- /dev/null
+++ b/json/prometheus-pve-exporter.json
@@ -0,0 +1,40 @@
+{
+ "name": "Prometheus Proxmox VE Exporter",
+ "slug": "prometheus-proxmox-ve-exporter",
+ "categories": [
+ 1,
+ 9
+ ],
+ "date_created": "2025-01-28",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 9221,
+ "documentation": "https://github.com/prometheus-pve/prometheus-pve-exporter",
+ "website": "https://github.com/prometheus-pve/prometheus-pve-exporter",
+ "logo": "https://raw.githubusercontent.com/home-assistant/brands/master/core_integrations/proxmoxve/icon.png",
+ "description": "An exporter that exposes information gathered from Proxmox VE node for use by the Prometheus monitoring system.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/prometheus-pve-exporter.sh",
+ "resources": {
+ "cpu": 1,
+ "ram": 1024,
+ "hdd": 2,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "Please adjust the Proxmox credentials in the configuration file: /opt/prometheus-pve-exporter/pve.yml",
+ "type": "info"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/json/prometheus.json b/json/prometheus.json
index ce41b474b..b66cef993 100644
--- a/json/prometheus.json
+++ b/json/prometheus.json
@@ -2,7 +2,7 @@
"name": "Prometheus",
"slug": "prometheus",
"categories": [
- 7
+ 9
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/prowlarr.json b/json/prowlarr.json
index f65004e3e..0b2717146 100644
--- a/json/prowlarr.json
+++ b/json/prowlarr.json
@@ -2,7 +2,7 @@
"name": "Prowlarr",
"slug": "prowlarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/ps5-mqtt.json b/json/ps5-mqtt.json
index e29aa977e..65b44e30f 100644
--- a/json/ps5-mqtt.json
+++ b/json/ps5-mqtt.json
@@ -2,7 +2,7 @@
"name": "PS5-MQTT",
"slug": "ps5-mqtt",
"categories": [
- 3
+ 18
],
"date_created": "2025-01-09",
"type": "ct",
diff --git a/json/qbittorrent.json b/json/qbittorrent.json
index c302a5b33..dd56cc108 100644
--- a/json/qbittorrent.json
+++ b/json/qbittorrent.json
@@ -2,7 +2,7 @@
"name": "qBittorrent",
"slug": "qbittorrent",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/rabbitmq.json b/json/rabbitmq.json
index 8a91a11e4..5a306f4d1 100644
--- a/json/rabbitmq.json
+++ b/json/rabbitmq.json
@@ -2,7 +2,7 @@
"name": "RabbitMQ",
"slug": "rabbitmq",
"categories": [
- 4
+ 18
],
"date_created": "2024-06-27",
"type": "ct",
diff --git a/json/radarr.json b/json/radarr.json
index 3f1e37cb5..9d0388e51 100644
--- a/json/radarr.json
+++ b/json/radarr.json
@@ -2,7 +2,7 @@
"name": "Radarr",
"slug": "radarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/rdtclient.json b/json/rdtclient.json
index 81a714daa..a7dc74350 100644
--- a/json/rdtclient.json
+++ b/json/rdtclient.json
@@ -2,7 +2,7 @@
"name": "Real-Debrid Torrent Client",
"slug": "rdtclient",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/readarr.json b/json/readarr.json
index 359b4a8ce..269cbaee1 100644
--- a/json/readarr.json
+++ b/json/readarr.json
@@ -2,7 +2,7 @@
"name": "Readarr",
"slug": "readarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/readeck.json b/json/readeck.json
index 298ba8a1b..21bf077cd 100644
--- a/json/readeck.json
+++ b/json/readeck.json
@@ -2,7 +2,7 @@
"name": "Readeck",
"slug": "readeck",
"categories": [
- 0
+ 12
],
"date_created": "2024-05-02",
"type": "ct",
@@ -12,7 +12,7 @@
"documentation": null,
"website": "https://readeck.org/",
"logo": "https://codeberg.org/readeck/readeck/raw/branch/main/web/media/logo-square.svg",
- "description": "Readeck helps you keep all that web content youβll want to revisit in an hour, tomorrow, or in 20 years.",
+ "description": "Readeck helps you keep all that web content you want to revisit in an hour, tomorrow, or in 20 years.",
"install_methods": [
{
"type": "default",
diff --git a/json/recyclarr.json b/json/recyclarr.json
index 604a1a2c0..5f39ae520 100644
--- a/json/recyclarr.json
+++ b/json/recyclarr.json
@@ -2,7 +2,7 @@
"name": "Recyclarr",
"slug": "recyclarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-11-15",
"type": "ct",
diff --git a/json/redis.json b/json/redis.json
index 9d6d8ef71..ee4f164d2 100644
--- a/json/redis.json
+++ b/json/redis.json
@@ -2,7 +2,7 @@
"name": "Redis ",
"slug": "redis",
"categories": [
- 5
+ 8
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/rtsptoweb.json b/json/rtsptoweb.json
index 513186c16..aa3546b1a 100644
--- a/json/rtsptoweb.json
+++ b/json/rtsptoweb.json
@@ -2,7 +2,7 @@
"name": "RTSPtoWeb",
"slug": "rtsptoweb",
"categories": [
- 0
+ 24
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/runtipi.json b/json/runtipi.json
index 27fafedd9..016886442 100644
--- a/json/runtipi.json
+++ b/json/runtipi.json
@@ -2,7 +2,7 @@
"name": "Runtipi",
"slug": "runtipi",
"categories": [
- 8
+ 2
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/sabnzbd.json b/json/sabnzbd.json
index e43893094..7fcfb00ee 100644
--- a/json/sabnzbd.json
+++ b/json/sabnzbd.json
@@ -2,7 +2,7 @@
"name": "SABnzbd",
"slug": "sabnzbd",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/scaling-governor.json b/json/scaling-governor.json
index 601562503..a289d6ba1 100644
--- a/json/scaling-governor.json
+++ b/json/scaling-governor.json
@@ -37,4 +37,4 @@
}
],
"status": "π§ͺ"
-}
\ No newline at end of file
+}
diff --git a/json/semaphore.json b/json/semaphore.json
index 5cabdb6f5..f792bf720 100644
--- a/json/semaphore.json
+++ b/json/semaphore.json
@@ -1,44 +1,45 @@
{
- "name": "Semaphore",
- "slug": "semaphore",
- "categories": [
- 7
- ],
- "date_created": "2025-01-01",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": 3000,
- "documentation": "https://docs.semaphoreui.com/",
- "website": "https://semaphoreui.com/",
- "logo": "https://docs.semaphoreui.com/favicon.png?x=",
- "description": "Semaphore UI is a modern web interface for managing popular DevOps tools",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/semaphore.sh",
- "resources": {
- "cpu": 2,
- "ram": 2048,
- "hdd": 4,
- "os": "Debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": "admin",
- "password": null
+ "name": "Semaphore",
+ "slug": "semaphore",
+ "categories": [
+ 19
+ ],
+ "date_created": "2025-01-01",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": 3000,
+ "documentation": "https://docs.semaphoreui.com/",
+ "website": "https://semaphoreui.com/",
+ "logo": "https://docs.semaphoreui.com/favicon.png?x=",
+ "description": "Semaphore UI is a modern web interface for managing popular DevOps tools",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/semaphore.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 4,
+ "os": "Debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": "admin",
+ "password": null
+ },
+ "notes": [
+ {
+ "text": "This instance uses BoltDB",
+ "type": "info",
+
},
- "notes": [
- {
- "text": "This instance uses BoltDB",
- "type": "info"
- },
- {
- "text": "Admin password: `cat ~/semaphore.creds`",
- "type": "info"
- }
- ],
- "status": "π§"
+ {
+ "text": "Admin password: `cat ~/semaphore.creds`",
+ "type": "info"
+ }
+ ],
+ "status": "π§"
}
\ No newline at end of file
diff --git a/json/sftpgo.json b/json/sftpgo.json
index 7031db077..8ee62be99 100644
--- a/json/sftpgo.json
+++ b/json/sftpgo.json
@@ -2,7 +2,7 @@
"name": "SFTPGo",
"slug": "sftpgo",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/shinobi.json b/json/shinobi.json
index 86049593f..016af2504 100644
--- a/json/shinobi.json
+++ b/json/shinobi.json
@@ -2,7 +2,7 @@
"name": "Shinobi NVR",
"slug": "shinobi",
"categories": [
- 17
+ 15
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/silverbullet.json b/json/silverbullet.json
index 9f6eaf274..f3777db0b 100644
--- a/json/silverbullet.json
+++ b/json/silverbullet.json
@@ -2,7 +2,7 @@
"name": "Silverbullet",
"slug": "silverbullet",
"categories": [
- 14
+ 12
],
"date_created": "2024-12-03",
"type": "ct",
diff --git a/json/smokeping.json b/json/smokeping.json
index f02fdd5ea..32e0d6313 100644
--- a/json/smokeping.json
+++ b/json/smokeping.json
@@ -2,7 +2,7 @@
"name": "SmokePing",
"slug": "smokeping",
"categories": [
- 7
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/snipeit.json b/json/snipeit.json
index b925f6855..563e05aa7 100644
--- a/json/snipeit.json
+++ b/json/snipeit.json
@@ -2,7 +2,7 @@
"name": "SnipeIT",
"slug": "snipeit",
"categories": [
- 8
+ 25
],
"date_created": "2024-12-02",
"type": "ct",
diff --git a/json/sonarr.json b/json/sonarr.json
index c463163b2..d1312674a 100644
--- a/json/sonarr.json
+++ b/json/sonarr.json
@@ -2,7 +2,7 @@
"name": "Sonarr",
"slug": "sonarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/spoolman.json b/json/spoolman.json
index 6bb15d607..5c04e5a1c 100644
--- a/json/spoolman.json
+++ b/json/spoolman.json
@@ -2,7 +2,7 @@
"name": "Spoolman",
"slug": "spoolman",
"categories": [
- 0
+ 24
],
"date_created": "2024-06-13",
"type": "ct",
diff --git a/json/sqlserver2022.json b/json/sqlserver2022.json
new file mode 100644
index 000000000..818b88c4d
--- /dev/null
+++ b/json/sqlserver2022.json
@@ -0,0 +1,47 @@
+{
+ "name":"SQL Server 2022",
+ "slug":"sqlserver2022",
+ "categories":[
+ 8
+ ],
+ "date_created":"2025-01-14",
+ "type":"ct",
+ "updateable":true,
+ "privileged":true,
+ "interface_port":1433,
+ "documentation":"https://learn.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver16",
+ "website":"https://www.microsoft.com/en-us/sql-server/sql-server-2022",
+ "logo":"https://www.svgrepo.com/show/303229/microsoft-sql-server-logo.svg",
+ "description":"Script to automatically set up a SQL Server 2022 installation.",
+ "install_methods":[
+ {
+ "type":"default",
+ "script":"ct/sqlserver2022.sh",
+ "resources":{
+ "cpu":1,
+ "ram":2048,
+ "hdd":10,
+ "os":"Ubuntu",
+ "version":"22.04"
+ }
+ }
+ ],
+ "default_credentials":{
+ "username":null,
+ "password":null
+ },
+ "notes":[
+ {
+ "text":"if you not choose the install setup, execute: `/opt/mssql/bin/mssql-conf setup` in LXC shell.",
+ "type":"info"
+ },
+ {
+ "text":"You can setup the admin account 'SA' during installation",
+ "type":"info"
+ },
+ {
+ "text":"Do disable the SA account if you intent to use this in production!",
+ "type":"warning"
+ }
+ ]
+}
diff --git a/json/stirling-pdf.json b/json/stirling-pdf.json
index 28969df8d..4fddbb783 100644
--- a/json/stirling-pdf.json
+++ b/json/stirling-pdf.json
@@ -2,7 +2,7 @@
"name": "Stirling-PDF",
"slug": "stirling-pdf",
"categories": [
- 14
+ 12
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/syncthing.json b/json/syncthing.json
index 70bb0535a..a450e3959 100644
--- a/json/syncthing.json
+++ b/json/syncthing.json
@@ -2,7 +2,7 @@
"name": "Syncthing",
"slug": "syncthing",
"categories": [
- 16
+ 12
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/tandoor.json b/json/tandoor.json
index fb0bfc554..09319641b 100644
--- a/json/tandoor.json
+++ b/json/tandoor.json
@@ -2,7 +2,7 @@
"name": "Tandoor Recipes",
"slug": "tandoor",
"categories": [
- 0
+ 24
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/tasmoadmin.json b/json/tasmoadmin.json
index 5aa9faf95..50fd57bb3 100644
--- a/json/tasmoadmin.json
+++ b/json/tasmoadmin.json
@@ -2,7 +2,7 @@
"name": "TasmoAdmin",
"slug": "tasmoadmin",
"categories": [
- 0
+ 16
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/tautulli.json b/json/tautulli.json
index 383c807f7..90c353f76 100644
--- a/json/tautulli.json
+++ b/json/tautulli.json
@@ -2,7 +2,7 @@
"name": "Tautulli",
"slug": "tautulli",
"categories": [
- 12
+ 13
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/tdarr.json b/json/tdarr.json
index 34aeee951..65cfb5581 100644
--- a/json/tdarr.json
+++ b/json/tdarr.json
@@ -2,7 +2,7 @@
"name": "Tdarr",
"slug": "tdarr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/technitiumdns.json b/json/technitiumdns.json
index 4f76c94e3..507e93fad 100644
--- a/json/technitiumdns.json
+++ b/json/technitiumdns.json
@@ -2,7 +2,7 @@
"name": "Technitium DNS",
"slug": "technitiumdns",
"categories": [
- 13
+ 5
],
"date_created": "2024-04-28",
"type": "ct",
diff --git a/json/teddycloud.json b/json/teddycloud.json
index f6195adfc..0664cc29d 100644
--- a/json/teddycloud.json
+++ b/json/teddycloud.json
@@ -2,7 +2,7 @@
"name": "TeddyCloud",
"slug": "teddycloud",
"categories": [
- 12
+ 13
],
"date_created": "2024-12-28",
"type": "ct",
diff --git a/json/the-lounge.json b/json/the-lounge.json
index c59f520f3..8adb24625 100644
--- a/json/the-lounge.json
+++ b/json/the-lounge.json
@@ -2,7 +2,7 @@
"name": "The Lounge",
"slug": "the-lounge",
"categories": [
- 0
+ 22
],
"date_created": "2024-11-28",
"type": "ct",
@@ -31,10 +31,10 @@
"password": null
},
"notes": [
- {
- "text": "The Lounge is running in private mode. Use `sudo -u thelounge thelounge add name` to create users.",
- "type": "info"
- }
+ {
+ "text": "The Lounge is running in private mode. Use `runuser -u thelounge -- thelounge add usernamehere` to create users.",
+ "type": "info"
+ }
],
"status": "π§"
-}
\ No newline at end of file
+ }
diff --git a/json/threadfin.json b/json/threadfin.json
index 55470f74c..35fb240f9 100644
--- a/json/threadfin.json
+++ b/json/threadfin.json
@@ -2,7 +2,7 @@
"name": "Threadfin",
"slug": "threadfin",
"categories": [
- 12
+ 13
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/tianji.json b/json/tianji.json
index 30eefbb36..0444772d2 100644
--- a/json/tianji.json
+++ b/json/tianji.json
@@ -2,7 +2,7 @@
"name": "Tianji",
"slug": "tianji",
"categories": [
- 7
+ 9
],
"date_created": "2024-09-14",
"type": "ct",
diff --git a/json/traefik.json b/json/traefik.json
index 4f14e5c2f..2b13205a7 100644
--- a/json/traefik.json
+++ b/json/traefik.json
@@ -2,7 +2,7 @@
"name": "Traefik",
"slug": "traefik",
"categories": [
- 11
+ 21
],
"date_created": "2024-05-20",
"type": "ct",
diff --git a/json/transmission.json b/json/transmission.json
index d9b2609b2..10fb0c0db 100644
--- a/json/transmission.json
+++ b/json/transmission.json
@@ -2,7 +2,7 @@
"name": "Transmission",
"slug": "transmission",
"categories": [
- 16
+ 11
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/trilium.json b/json/trilium.json
index 30d818e99..b6d2b32e6 100644
--- a/json/trilium.json
+++ b/json/trilium.json
@@ -2,7 +2,7 @@
"name": "Trilium",
"slug": "trilium",
"categories": [
- 14
+ 12
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/turnkey.json b/json/turnkey.json
index 1df89e872..9290f5d92 100644
--- a/json/turnkey.json
+++ b/json/turnkey.json
@@ -2,7 +2,7 @@
"name": "TurnKey",
"slug": "turnkey",
"categories": [
- 10
+ 2
],
"date_created": "2024-05-02",
"type": "turnkey",
diff --git a/json/typesense.json b/json/typesense.json
index a25af31e7..b813c0b71 100644
--- a/json/typesense.json
+++ b/json/typesense.json
@@ -2,7 +2,7 @@
"name": "TypeSense",
"slug": "typesense",
"categories": [
- 5
+ 20
],
"date_created": "2025-01-06",
"type": "ct",
diff --git a/json/ubuntu.json b/json/ubuntu.json
index ac2a46b85..b6fbf5064 100644
--- a/json/ubuntu.json
+++ b/json/ubuntu.json
@@ -2,7 +2,7 @@
"name": "Ubuntu",
"slug": "ubuntu",
"categories": [
- 9
+ 2
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/ubuntu2204-vm.json b/json/ubuntu2204-vm.json
index afbcc3654..401881c76 100644
--- a/json/ubuntu2204-vm.json
+++ b/json/ubuntu2204-vm.json
@@ -2,7 +2,7 @@
"name": "Ubuntu 22.04",
"slug": "ubuntu2204-vm",
"categories": [
- 9
+ 2
],
"date_created": "2024-05-02",
"type": "vm",
@@ -20,7 +20,7 @@
"resources": {
"cpu": 2,
"ram": 2048,
- "hdd": 2,
+ "hdd": 5,
"os": null,
"version": null
}
@@ -32,4 +32,4 @@
},
"notes": [],
"status": "π§ͺ"
-}
\ No newline at end of file
+}
diff --git a/json/ubuntu2404-vm.json b/json/ubuntu2404-vm.json
index 012ce4eab..e6c967dd1 100644
--- a/json/ubuntu2404-vm.json
+++ b/json/ubuntu2404-vm.json
@@ -2,7 +2,7 @@
"name": "Ubuntu 24.04",
"slug": "ubuntu2404-vm",
"categories": [
- 9
+ 2
],
"date_created": "2024-05-02",
"type": "vm",
@@ -20,7 +20,7 @@
"resources": {
"cpu": 2,
"ram": 2048,
- "hdd": 2,
+ "hdd": 7,
"os": null,
"version": null
}
@@ -32,4 +32,4 @@
},
"notes": [],
"status": "π§ͺ"
-}
\ No newline at end of file
+}
diff --git a/json/ubuntu2410-vm.json b/json/ubuntu2410-vm.json
new file mode 100644
index 000000000..a1715368a
--- /dev/null
+++ b/json/ubuntu2410-vm.json
@@ -0,0 +1,34 @@
+{
+ "name": "Ubuntu 24.10",
+ "slug": "ubuntu2410-vm",
+ "categories": [
+ 2
+ ],
+ "date_created": "2025-01-24",
+ "type": "vm",
+ "updateable": false,
+ "privileged": false,
+ "interface_port": null,
+ "documentation": null,
+ "website": "https://ubuntu.com/",
+ "logo": "https://assets.ubuntu.com/v1/29985a98-ubuntu-logo32.png",
+ "description": "Ubuntu is a distribution based on Debian, designed to have regular releases and a consistent user experience.",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "vm/ubuntu2410-vm.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 2048,
+ "hdd": 8,
+ "os": null,
+ "version": null
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": []
+}
diff --git a/json/umami.json b/json/umami.json
index ebb878bd1..db38f1041 100644
--- a/json/umami.json
+++ b/json/umami.json
@@ -2,7 +2,7 @@
"name": "Umami",
"slug": "umami",
"categories": [
- 7
+ 9
],
"date_created": "2024-05-09",
"type": "ct",
diff --git a/json/unbound.json b/json/unbound.json
index 0e2b8766f..58b228397 100644
--- a/json/unbound.json
+++ b/json/unbound.json
@@ -2,7 +2,7 @@
"name": "Unbound",
"slug": "unbound",
"categories": [
- 13
+ 5
],
"date_created": "2024-12-02",
"type": "ct",
diff --git a/json/unifi.json b/json/unifi.json
index a78af0eed..a68854e35 100644
--- a/json/unifi.json
+++ b/json/unifi.json
@@ -2,7 +2,7 @@
"name": "UniFi Network Server",
"slug": "unifi",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/unmanic.json b/json/unmanic.json
index 46baf26ab..fb6ee683f 100644
--- a/json/unmanic.json
+++ b/json/unmanic.json
@@ -2,7 +2,7 @@
"name": "Unmanic",
"slug": "unmanic",
"categories": [
- 12
+ 0
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/uptimekuma.json b/json/uptimekuma.json
index 59505c409..2e4dde7b8 100644
--- a/json/uptimekuma.json
+++ b/json/uptimekuma.json
@@ -2,7 +2,7 @@
"name": "Uptime Kuma",
"slug": "uptimekuma",
"categories": [
- 7
+ 9
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/urbackupserver.json b/json/urbackupserver.json
new file mode 100644
index 000000000..14c35bfba
--- /dev/null
+++ b/json/urbackupserver.json
@@ -0,0 +1,39 @@
+{
+ "name":"UrBackup Server",
+ "slug":"urbackupserver",
+ "categories":[
+ 7
+ ],
+ "date_created":"2025-01-18",
+ "type":"ct",
+ "updateable":true,
+ "privileged":true,
+ "interface_port":55414,
+ "documentation":"https://www.urbackup.org/documentation.html",
+ "website":"https://www.urbackup.org/",
+ "logo":"https://forums.urbackup.org/uploads/default/original/2X/1/1051fd74d1dcbc3ad4220b43007fcab5287272b0.png",
+ "description":"URBackup is an open-source backup software designed for creating reliable and efficient backups of both files and system images. It supports client-server architecture, allowing you to back up multiple computers to a central server. It offers features such as incremental backups, real-time file backup, and scheduling, ensuring minimal data loss and quick recovery",
+ "install_methods":[
+ {
+ "type":"default",
+ "script":"ct/urbackupserver.sh",
+ "resources":{
+ "cpu":1,
+ "ram":1024,
+ "hdd":16,
+ "os":"Debian",
+ "version":"12"
+ }
+ }
+ ],
+ "default_credentials":{
+ "username":null,
+ "password":null
+ },
+ "notes":[
+ {
+ "text":"You probably want to drastically extend the storage space to fit whatever clients you want to back up",
+ "type":"info"
+ }
+ ]
+}
diff --git a/json/vaultwarden.json b/json/vaultwarden.json
index 0419c6ab7..26e1d904e 100644
--- a/json/vaultwarden.json
+++ b/json/vaultwarden.json
@@ -2,7 +2,7 @@
"name": "Vaultwarden",
"slug": "vaultwarden",
"categories": [
- 0
+ 6
],
"date_created": "2024-05-02",
"type": "ct",
@@ -31,9 +31,9 @@
"resources": {
"cpu": 1,
"ram": 256,
- "hdd": 0.3,
+ "hdd": 0.5,
"os": "alpine",
- "version": "3.19"
+ "version": "3.21"
}
}
],
diff --git a/json/vikunja.json b/json/vikunja.json
index df8928d9b..645f9f661 100644
--- a/json/vikunja.json
+++ b/json/vikunja.json
@@ -2,7 +2,7 @@
"name": "Vikunja",
"slug": "vikunja",
"categories": [
- 14
+ 12
],
"date_created": "2024-11-05",
"type": "ct",
diff --git a/json/wallos.json b/json/wallos.json
index f87b3268a..83fdd8d37 100644
--- a/json/wallos.json
+++ b/json/wallos.json
@@ -30,6 +30,5 @@
"username": null,
"password": null
},
- "notes": [],
- "status": "π§"
-}
\ No newline at end of file
+ "notes": []
+}
diff --git a/json/wastebin.json b/json/wastebin.json
index 35b22baf8..51291a1da 100644
--- a/json/wastebin.json
+++ b/json/wastebin.json
@@ -2,7 +2,7 @@
"name": "Wastebin",
"slug": "wastebin",
"categories": [
- 0
+ 12
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/watchyourlan.json b/json/watchyourlan.json
index e065dfe1d..edc36cc64 100644
--- a/json/watchyourlan.json
+++ b/json/watchyourlan.json
@@ -2,7 +2,7 @@
"name": "WatchYourLAN",
"slug": "watchyourlan",
"categories": [
- 7
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/wavelog.json b/json/wavelog.json
index 1d97e92fd..e4d173e66 100644
--- a/json/wavelog.json
+++ b/json/wavelog.json
@@ -2,7 +2,7 @@
"name": "Wavelog",
"slug": "wavelog",
"categories": [
- 0
+ 24
],
"date_created": "2024-11-12",
"type": "ct",
diff --git a/json/webmin.json b/json/webmin.json
index 21715efa6..524d10e71 100644
--- a/json/webmin.json
+++ b/json/webmin.json
@@ -2,7 +2,7 @@
"name": "Webmin System Administration",
"slug": "webmin",
"categories": [
- 11
+ 1
],
"date_created": "2024-05-02",
"type": "misc",
diff --git a/json/whisparr.json b/json/whisparr.json
index d65d3df5f..cc82644fe 100644
--- a/json/whisparr.json
+++ b/json/whisparr.json
@@ -2,7 +2,7 @@
"name": "Whisparr",
"slug": "whisparr",
"categories": [
- 18
+ 14
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/wikijs.json b/json/wikijs.json
index c690d2ffd..6bad2d320 100644
--- a/json/wikijs.json
+++ b/json/wikijs.json
@@ -2,7 +2,7 @@
"name": "Wiki.js",
"slug": "wikijs",
"categories": [
- 14
+ 12
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/wireguard.json b/json/wireguard.json
index 50fba321e..49192bd2f 100644
--- a/json/wireguard.json
+++ b/json/wireguard.json
@@ -2,7 +2,7 @@
"name": "WireGuard",
"slug": "wireguard",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/wordpress.json b/json/wordpress.json
index fcf3ca039..188b493b8 100644
--- a/json/wordpress.json
+++ b/json/wordpress.json
@@ -2,7 +2,7 @@
"name": "Wordpress",
"slug": "wordpress",
"categories": [
- 14
+ 21
],
"date_created": "2025-01-14",
"type": "ct",
diff --git a/json/yunohost.json b/json/yunohost.json
index 9cc90d0f8..0570f4926 100644
--- a/json/yunohost.json
+++ b/json/yunohost.json
@@ -2,7 +2,7 @@
"name": "YunoHost",
"slug": "yunohost",
"categories": [
- 11
+ 2
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/zabbix.json b/json/zabbix.json
index 7319ac567..6b95be7c0 100644
--- a/json/zabbix.json
+++ b/json/zabbix.json
@@ -2,7 +2,7 @@
"name": "Zabbix",
"slug": "zabbix",
"categories": [
- 7
+ 9
],
"date_created": "2024-06-12",
"type": "ct",
diff --git a/json/zammad.json b/json/zammad.json
index d32e2b099..4537a740e 100644
--- a/json/zammad.json
+++ b/json/zammad.json
@@ -1,35 +1,35 @@
{
- "name": "Zammad",
- "slug": "zammad",
- "categories": [
- 11
- ],
- "date_created": "2024-12-18",
- "type": "ct",
- "updateable": true,
- "privileged": false,
- "interface_port": null,
- "documentation": "https://docs.zammad.org/en/latest/",
- "website": "https://zammad.com/",
- "logo": "https://raw.githubusercontent.com/zammad/zammad/refs/heads/develop/public/assets/images/logo.svg",
- "description": "Zammad is a web based open source helpdesk/customer support system with many features to manage customer communication via several channels like telephone, facebook, twitter, chat and emails. It is distributed under version 3 of the GNU AFFERO General Public License (GNU AGPLv3).",
- "install_methods": [
- {
- "type": "default",
- "script": "ct/zammad.sh",
- "resources": {
- "cpu": 2,
- "ram": 4096,
- "hdd": 8,
- "os": "debian",
- "version": "12"
- }
- }
- ],
- "default_credentials": {
- "username": null,
- "password": null
- },
- "notes": [],
- "status": "π§"
-}
\ No newline at end of file
+ "name": "Zammad",
+ "slug": "zammad",
+ "categories": [
+ 25
+ ],
+ "date_created": "2024-12-18",
+ "type": "ct",
+ "updateable": true,
+ "privileged": false,
+ "interface_port": null,
+ "documentation": "https://docs.zammad.org/en/latest/",
+ "website": "https://zammad.com/",
+ "logo": "https://raw.githubusercontent.com/zammad/zammad/refs/heads/develop/public/assets/images/logo.svg",
+ "description": "Zammad is a web based open source helpdesk/customer support system with many features to manage customer communication via several channels like telephone, facebook, twitter, chat and emails. It is distributed under version 3 of the GNU AFFERO General Public License (GNU AGPLv3).",
+ "install_methods": [
+ {
+ "type": "default",
+ "script": "ct/zammad.sh",
+ "resources": {
+ "cpu": 2,
+ "ram": 4096,
+ "hdd": 8,
+ "os": "debian",
+ "version": "12"
+ }
+ }
+ ],
+ "default_credentials": {
+ "username": null,
+ "password": null
+ },
+ "notes": [],
+ "status": "π§"
+}
diff --git a/json/zigbee2mqtt.json b/json/zigbee2mqtt.json
index aee10ccfe..30b2bdf68 100644
--- a/json/zigbee2mqtt.json
+++ b/json/zigbee2mqtt.json
@@ -2,7 +2,7 @@
"name": "Zigbee2MQTT",
"slug": "zigbee2mqtt",
"categories": [
- 6
+ 17
],
"date_created": "2024-05-02",
"type": "ct",
@@ -33,7 +33,7 @@
"ram": 256,
"hdd": 0.3,
"os": "alpine",
- "version": "3.19"
+ "version": "3.21"
}
}
],
diff --git a/json/zipline.json b/json/zipline.json
index 1127ab03d..dc5ac62f2 100644
--- a/json/zipline.json
+++ b/json/zipline.json
@@ -2,7 +2,7 @@
"name": "Zipline",
"slug": "zipline",
"categories": [
- 16
+ 11
],
"date_created": "2024-09-16",
"type": "ct",
diff --git a/json/zoraxy.json b/json/zoraxy.json
index a7d2bf8ae..32fa62742 100644
--- a/json/zoraxy.json
+++ b/json/zoraxy.json
@@ -2,7 +2,7 @@
"name": "Zoraxy",
"slug": "zoraxy",
"categories": [
- 11
+ 4
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/json/zwave-js-ui.json b/json/zwave-js-ui.json
index db0ef066e..94a5ee23e 100644
--- a/json/zwave-js-ui.json
+++ b/json/zwave-js-ui.json
@@ -2,7 +2,7 @@
"name": "Z-Wave JS UI",
"slug": "zwave-js-ui",
"categories": [
- 6
+ 17
],
"date_created": "2024-05-02",
"type": "ct",
diff --git a/misc/.app-headers b/misc/.app-headers
index 642c14ae0..ebdb0ed60 100644
--- a/misc/.app-headers
+++ b/misc/.app-headers
@@ -1,4 +1,4 @@
-### Generated on 01-18-2025
+### Generated on 01-24-2025
##################################################
### 2fauth.sh
@@ -235,6 +235,15 @@ APP=Bazarr
/_____/\__,_/ /___/\__,_/_/ /_/
+### beszel.sh
+APP=Beszel
+ ____ __
+ / __ )___ _________ ___ / /
+ / __ / _ \/ ___/_ / / _ \/ /
+ / /_/ / __(__ ) / /_/ __/ /
+/_____/\___/____/ /___/\___/_/
+
+
### blocky.sh
APP=Blocky
____ __ __
@@ -1459,6 +1468,15 @@ APP=PostgreSQL
/_/ \____/____/\__/\__, /_/ \___/____/\___\_\/_____/
/____/
+### projectsend.sh
+APP=ProjectSend
+ ____ _ __ _____ __
+ / __ \_________ (_)__ _____/ /_/ ___/___ ____ ____/ /
+ / /_/ / ___/ __ \ / / _ \/ ___/ __/\__ \/ _ \/ __ \/ __ /
+ / ____/ / / /_/ / / / __/ /__/ /_ ___/ / __/ / / / /_/ /
+/_/ /_/ \____/_/ /\___/\___/\__//____/\___/_/ /_/\__,_/
+ /___/
+
### prometheus-alertmanager.sh
APP=Prometheus-Alertmanager
____ __ __ ___ __
@@ -1693,6 +1711,21 @@ APP=Spoolman
/____/ .___/\____/\____/_/_/ /_/ /_/\__,_/_/ /_/
/_/
+### sqlserver2022.sh
+APP=SQL Server 2022
+ _____ ____ __ _____
+ / ___// __ \ / / / ___/___ ______ _____ _____
+ \__ \/ / / / / / \__ \/ _ \/ ___/ | / / _ \/ ___/
+ ___/ / /_/ / / /___ ___/ / __/ / | |/ / __/ /
+/____/\___\_\/_____/ /____/\___/_/ |___/\___/_/
+
+ ___ ____ ___ ___
+ |__ \ / __ \__ \|__ \
+ __/ // / / /_/ /__/ /
+ / __// /_/ / __// __/
+/____/\____/____/____/
+
+
### stirling-pdf.sh
APP=Stirling-PDF
_____ __ _ ___ ____ ____ ______
@@ -1900,6 +1933,21 @@ APP=Uptime Kuma
\____/ .___/\__/_/_/ /_/ /_/\___/ /_/ |_\__,_/_/ /_/ /_/\__,_/
/_/
+### urbackupserver.sh
+APP=UrBackup Server
+ __ __ ____ __
+ / / / /____/ __ )____ ______/ /____ ______
+ / / / / ___/ __ / __ `/ ___/ //_/ / / / __ \
+/ /_/ / / / /_/ / /_/ / /__/ ,< / /_/ / /_/ /
+\____/_/ /_____/\__,_/\___/_/|_|\__,_/ .___/
+ /_/
+ _____
+ / ___/___ ______ _____ _____
+ \__ \/ _ \/ ___/ | / / _ \/ ___/
+ ___/ / __/ / | |/ / __/ /
+/____/\___/_/ |___/\___/_/
+
+
### vaultwarden.sh
APP=Vaultwarden
_ __ ____ __
diff --git a/misc/alpine-install.func b/misc/alpine-install.func
index 25922b386..b727b8eca 100644
--- a/misc/alpine-install.func
+++ b/misc/alpine-install.func
@@ -145,17 +145,16 @@ motd_ssh() {
OS_NAME="Alpine Linux"
OS_VERSION="Unknown"
fi
- # Set MOTD with application info and system details
- MOTD_FILE="/etc/motd"
- if [ -f "$MOTD_FILE" ]; then
- echo -e "\n${BOLD}${APPLICATION} LXC Container${CL}" > "$MOTD_FILE"
- echo -e "${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| Project: ${GN}ProxmoxVE ${YW}| GitHub: ${GN}https://github.com/asylumexp/Proxmox${CL}\n" >> "$MOTD_FILE"
- echo -e "${TAB}${OS}${YW} OS: ${GN}${OS_NAME} ${OS_VERSION}${CL}" >> "$MOTD_FILE"
- echo -e "${TAB}${HOSTNAME}${YW} Hostname: ${GN}$(hostname)${CL}" >> "$MOTD_FILE"
- echo -e "${TAB}${INFO}${YW} IP Address: ${GN}${IP}${CL}" >> "$MOTD_FILE"
- else
- echo -e "${RD}[WARNING] MOTD file does not exist!${CL}" >&2
- fi
+
+ PROFILE_FILE="/etc/profile.d/00_lxc-details.sh"
+ echo "echo -e \"\"" > "$PROFILE_FILE"
+ echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >> "$PROFILE_FILE"
+ echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts & pimox-scripts ${YW}| GitHub: ${GN}https://github.com/asylumexp/Proxmox${CL}\"" >> "$PROFILE_FILE"
+ echo "echo \"\"" >> "$PROFILE_FILE"
+ echo -e "echo -e \"${TAB}${OS}${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}\"" >> "$PROFILE_FILE"
+ echo -e "echo -e \"${TAB}${HOSTNAME}${YW} Hostname: ${GN}\$(hostname)${CL}\"" >> "$PROFILE_FILE"
+ echo -e "echo -e \"${TAB}${INFO}${YW} IP Address: ${GN}\$(ip -4 addr show eth0 | awk '/inet / {print \$2}' | cut -d/ -f1 | head -n 1)${CL}\"" >> "$PROFILE_FILE"
+
# Configure SSH if enabled
if [[ "${SSH_ROOT}" == "yes" ]]; then
# Enable sshd service
diff --git a/misc/build.func b/misc/build.func
index ed5879673..5936ebd36 100644
--- a/misc/build.func
+++ b/misc/build.func
@@ -7,7 +7,9 @@ variables() {
NSAPP=$(echo ${APP,,} | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces.
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
- PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
+ PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
+ DIAGNOSTICS="yes" # sets the DIAGNOSTICS variable to "yes", used for the API call.
+ METHOD="default" # sets the METHOD variable to "default", used for the API call.
}
# This function sets various color variables using ANSI escape codes for formatting text in the terminal.
@@ -142,7 +144,53 @@ pve_check() {
echo -e "Exiting..."
sleep 2
exit
-fi
+ fi
+}
+
+# When a node is running tens of containers, it's possible to exceed the kernel's cryptographic key storage allocations.
+# These are tuneable, so verify if the currently deployment is approaching the limits, advise the user on how to tune the limits, and exit the script.
+# https://cleveruptime.com/docs/files/proc-key-users | https://docs.kernel.org/security/keys/core.html
+maxkeys_check() {
+ # Read kernel parameters
+ per_user_maxkeys=$(cat /proc/sys/kernel/keys/maxkeys 2>/dev/null || echo 0)
+ per_user_maxbytes=$(cat /proc/sys/kernel/keys/maxbytes 2>/dev/null || echo 0)
+
+ # Exit if kernel parameters are unavailable
+ if [[ "$per_user_maxkeys" -eq 0 || "$per_user_maxbytes" -eq 0 ]]; then
+ echo -e "${CROSS}${RD} Error: Unable to read kernel parameters. Ensure proper permissions.${CL}"
+ exit 1
+ fi
+
+ # Fetch key usage for user ID 100000 (typical for containers)
+ used_lxc_keys=$(awk '/100000:/ {print $2}' /proc/key-users 2>/dev/null || echo 0)
+ used_lxc_bytes=$(awk '/100000:/ {split($5, a, "/"); print a[1]}' /proc/key-users 2>/dev/null || echo 0)
+
+ # Calculate thresholds and suggested new limits
+ threshold_keys=$((per_user_maxkeys - 100))
+ threshold_bytes=$((per_user_maxbytes - 1000))
+ new_limit_keys=$((per_user_maxkeys * 2))
+ new_limit_bytes=$((per_user_maxbytes * 2))
+
+ # Check if key or byte usage is near limits
+ failure=0
+ if [[ "$used_lxc_keys" -gt "$threshold_keys" ]]; then
+ echo -e "${CROSS}${RD} Warning: Key usage is near the limit (${used_lxc_keys}/${per_user_maxkeys}).${CL}"
+ echo -e "${INFO} Suggested action: Set ${GN}kernel.keys.maxkeys=${new_limit_keys}${CL} in ${BOLD}/etc/sysctl.d/98-community-scripts.conf${CL}."
+ failure=1
+ fi
+ if [[ "$used_lxc_bytes" -gt "$threshold_bytes" ]]; then
+ echo -e "${CROSS}${RD} Warning: Key byte usage is near the limit (${used_lxc_bytes}/${per_user_maxbytes}).${CL}"
+ echo -e "${INFO} Suggested action: Set ${GN}kernel.keys.maxbytes=${new_limit_bytes}${CL} in ${BOLD}/etc/sysctl.d/98-community-scripts.conf${CL}."
+ failure=1
+ fi
+
+ # Provide next steps if issues are detected
+ if [[ "$failure" -eq 1 ]]; then
+ echo -e "${INFO} To apply changes, run: ${BOLD}service procps force-reload${CL}"
+ exit 1
+ fi
+
+ echo -e "${CM}${GN} All kernel key limits are within safe thresholds.${CL}"
}
# This function checks the system architecture and exits if it's not "amd64".
@@ -175,76 +223,52 @@ get_current_ip() {
# Function to update the IP address in the MOTD file
update_motd_ip() {
MOTD_FILE="/etc/motd"
-
+
if [ -f "$MOTD_FILE" ]; then
# Remove existing IP Address lines to prevent duplication
sed -i '/IP Address:/d' "$MOTD_FILE"
-
+
IP=$(get_current_ip)
# Add the new IP address
echo -e "${TAB}${NETWORK}${YW} IP Address: ${GN}${IP}${CL}" >> "$MOTD_FILE"
fi
}
-# This function sets the APP-Name into an ASCII Header in Slant, figlet needed on proxmox main node.
-header_info() {
- # Helper function: Install FIGlet and download fonts
- install_figlet() {
- echo -e "${INFO}${BOLD}${DGN}Installing FIGlet...${CL}"
+# Function to download & save header files
+get_header() {
+ local app_name=$(echo ${APP,,} | tr -d ' ')
+ local header_url="https://github.com/community-scripts/ProxmoxVE/raw/main/ct/headers/${app_name}"
+ local local_header_path="/usr/local/community-scripts/headers/${app_name}"
- temp_dir=$(mktemp -d)
- curl -sL https://github.com/asylumexp/Proxmox/raw/refs/heads/main/misc/figlet.tar.xz -o "$temp_dir/figlet.tar.xz"
- mkdir -p /tmp/figlet
- tar -xf "$temp_dir/figlet.tar.xz" -C /tmp/figlet --strip-components=1
- cd /tmp/figlet
- make >/dev/null
+ mkdir -p "/usr/local/community-scripts/headers"
- if [ -f "figlet" ]; then
- chmod +x figlet
- mv figlet /usr/local/bin/
- mkdir -p /usr/local/share/figlet
- cp -r /tmp/figlet/fonts/*.flf /usr/local/share/figlet/
- echo -e "${CM}${BOLD}${DGN}FIGlet successfully installed.${CL}"
- else
- echo -e "${ERR}${BOLD}${RED}Failed to install FIGlet.${CL}"
+ # Check if local file already present
+ if [ ! -f "$local_header_path" ]; then
+ wget -qO "$local_header_path" "$header_url"
+ if [ $? -ne 0 ]; then
+ echo -e "${WARN}${BOLD}${YLW}Failed to download header for ${app_name}. No header will be displayed.${CL}"
return 1
fi
- rm -rf "$temp_dir"
- }
-
- # Check if figlet and the slant font are available
- if ! figlet -f slant "Test" &>/dev/null; then
- echo -e "${INFO}${BOLD}${DGN}FIGlet or the slant font is missing. Installing...${CL}"
-
- if [ -f /etc/debian_version ] || [ -f /etc/lsb-release ]; then
- # Debian/Ubuntu-based systems
- apt-get update -y &>/dev/null
- apt-get install -y wget build-essential &>/dev/null
- install_figlet
-
- elif [ -f /etc/alpine-release ]; then
- # Alpine-based systems
- apk add --no-cache tar xz build-base wget &>/dev/null
- export TERM=xterm
- install_figlet
-
- else
- echo -e "${ERR}${BOLD}${RED}Unsupported operating system.${CL}"
- return 1
- fi
-
- # Ensure the slant font is available
- if [ ! -f "/usr/share/figlet/slant.flf" ]; then
- echo -e "${INFO}${BOLD}${DGN}Downloading slant font...${CL}"
- wget -qO /usr/share/figlet/slant.flf "http://www.figlet.org/fonts/slant.flf"
- fi
fi
+ cat "$local_header_path"
+}
- # Display ASCII header
+# This function sets the APP-Name into an ASCII Header in Slant, figlet needed on proxmox main node.
+header_info() {
+ local app_name=$(echo ${APP,,} | tr -d ' ')
+ local header_content
+
+ # Download & save Header-File locally
+ header_content=$(get_header "$app_name")
+ if [ $? -ne 0 ]; then
+ # Fallback: Doesn't show Header
+ return 0
+ fi
+
+ # Show ASCII-Header
term_width=$(tput cols 2>/dev/null || echo 120)
- ascii_art=$(figlet -f slant -w "$term_width" "$APP")
clear
- echo "$ascii_art"
+ echo "$header_content"
}
# This function checks if the script is running through SSH and prompts the user to confirm if they want to proceed or exit.
@@ -335,74 +359,164 @@ exit_script() {
# This function allows the user to configure advanced settings for the script.
advanced_settings() {
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Here is an instructional tip:" "To make a selection, use the Spacebar." 8 58
- whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Default distribution for $APP" "${var_os} ${var_version} \n \nIf the default Linux distribution is not adhered to, script support will be discontinued. \n" 10 58
+ whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Default distribution for $APP" "Default is: ${var_os} ${var_version} \n \nIf the default Linux distribution is not adhered to, script support will be discontinued. \n" 10 58
if [ "$var_os" != "alpine" ]; then
+ var_default_os="${var_os}"
var_os=""
while [ -z "$var_os" ]; do
- if var_os=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISTRIBUTION" --radiolist "Choose Distribution:" 10 58 2 \
- "debian" "" OFF \
- "ubuntu" "" OFF \
- 3>&1 1>&2 2>&3); then
- if [ -n "$var_os" ]; then
- echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}"
+ if [ "$var_default_os" == "debian" ]; then
+ if var_os=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISTRIBUTION" --radiolist "Choose Distribution" 10 58 2 \
+ "debian" "" ON \
+ "ubuntu" "" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$var_os" ]; then
+ echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}"
+ fi
+ else
+ exit_script
+ fi
+ fi
+ if [ "$var_default_os" == "ubuntu" ]; then
+ if var_os=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISTRIBUTION" --radiolist "Choose Distribution" 10 58 2 \
+ "debian" "" OFF \
+ "ubuntu" "" ON \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$var_os" ]; then
+ echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}"
+ fi
+ else
+ exit_script
fi
- else
- exit_script
fi
done
fi
if [ "$var_os" == "debian" ]; then
+ var_default_version="${var_version}"
var_version=""
while [ -z "$var_version" ]; do
- if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DEBIAN VERSION" --radiolist "Choose Version" 10 58 2 \
- "11" "Bullseye" OFF \
- "12" "Bookworm" OFF \
- 3>&1 1>&2 2>&3); then
- if [ -n "$var_version" ]; then
- echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
+ if [ "$var_default_version" == "11" ]; then
+ if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DEBIAN VERSION" --radiolist "Choose Version" 10 58 2 \
+ "11" "Bullseye" ON \
+ "12" "Bookworm" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$var_version" ]; then
+ echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
+ fi
+ else
+ exit_script
+ fi
+ fi
+ if [ "$var_default_version" == "12" ]; then
+ if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DEBIAN VERSION" --radiolist "Choose Version" 10 58 2 \
+ "11" "Bullseye" OFF \
+ "12" "Bookworm" ON \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$var_version" ]; then
+ echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
+ fi
+ else
+ exit_script
fi
- else
- exit_script
fi
done
fi
if [ "$var_os" == "ubuntu" ]; then
+ var_default_version="${var_version}"
var_version=""
while [ -z "$var_version" ]; do
- if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \
- "20.04" "Focal" OFF \
- "22.04" "Jammy" OFF \
- "24.04" "Noble" OFF \
- "24.10" "Oracular" OFF \
- 3>&1 1>&2 2>&3); then
- if [ -n "$var_version" ]; then
- echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
+ if [ "$var_default_version" == "20.04" ]; then
+ if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \
+ "20.04" "Focal" ON \
+ "22.04" "Jammy" OFF \
+ "24.04" "Noble" OFF \
+ "24.10" "Oracular" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$var_version" ]; then
+ echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
+ fi
+ else
+ exit_script
+ fi
+ elif [ "$var_default_version" == "22.04" ]; then
+ if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \
+ "20.04" "Focal" OFF \
+ "22.04" "Jammy" ON \
+ "24.04" "Noble" OFF \
+ "24.10" "Oracular" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$var_version" ]; then
+ echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
+ fi
+ else
+ exit_script
+ fi
+ elif [ "$var_default_version" == "24.04" ]; then
+ if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \
+ "20.04" "Focal" OFF \
+ "22.04" "Jammy" OFF \
+ "24.04" "Noble" ON \
+ "24.10" "Oracular" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$var_version" ]; then
+ echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
+ fi
+ else
+ exit_script
fi
else
- exit_script
+ if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 4 \
+ "20.04" "Focal" OFF \
+ "22.04" "Jammy" OFF \
+ "24.04" "Noble" OFF \
+ "24.10" "Oracular" ON \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$var_version" ]; then
+ echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
+ fi
+ else
+ exit_script
+ fi
fi
done
fi
# Setting Default Tag for Advanced Settings
TAGS="community-script;${var_tags:-}"
-
+ CT_DEFAULT_TYPE="${CT_TYPE}"
CT_TYPE=""
while [ -z "$CT_TYPE" ]; do
- if CT_TYPE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
- "1" "Unprivileged" OFF \
- "0" "Privileged" OFF \
- 3>&1 1>&2 2>&3); then
- if [ -n "$CT_TYPE" ]; then
- CT_TYPE_DESC="Unprivileged"
- if [ "$CT_TYPE" -eq 0 ]; then
- CT_TYPE_DESC="Privileged"
+ if [ "$CT_DEFAULT_TYPE" == "1" ]; then
+ if CT_TYPE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
+ "1" "Unprivileged" ON \
+ "0" "Privileged" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$CT_TYPE" ]; then
+ CT_TYPE_DESC="Unprivileged"
+ if [ "$CT_TYPE" -eq 0 ]; then
+ CT_TYPE_DESC="Privileged"
+ fi
+ echo -e "${CONTAINERTYPE}${BOLD}${DGN}Container Type: ${BGN}$CT_TYPE_DESC${CL}"
fi
- echo -e "${CONTAINERTYPE}${BOLD}${DGN}Container Type: ${BGN}$CT_TYPE_DESC${CL}"
+ else
+ exit_script
+ fi
+ fi
+ if [ "$CT_DEFAULT_TYPE" == "0" ]; then
+ if CT_TYPE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
+ "1" "Unprivileged" OFF \
+ "0" "Privileged" ON \
+ 3>&1 1>&2 2>&3); then
+ if [ -n "$CT_TYPE" ]; then
+ CT_TYPE_DESC="Unprivileged"
+ if [ "$CT_TYPE" -eq 0 ]; then
+ CT_TYPE_DESC="Privileged"
+ fi
+ echo -e "${CONTAINERTYPE}${BOLD}${DGN}Container Type: ${BGN}$CT_TYPE_DESC${CL}"
+ fi
+ else
+ exit_script
fi
- else
- exit_script
fi
done
@@ -437,7 +551,6 @@ advanced_settings() {
fi
done
-
if CT_ID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
if [ -z "$CT_ID" ]; then
CT_ID="$NEXTID"
@@ -550,7 +663,7 @@ advanced_settings() {
APT_CACHER=""
APT_CACHER_IP=""
else
- if APT_CACHER_IP=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set APT-Cacher IP (leave blank for default)" 8 58 --title "APT-Cacher IP" 3>&1 1>&2 2>&3); then
+ if APT_CACHER_IP=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set APT-Cacher IP (leave blank for none)" 8 58 --title "APT-Cacher IP" 3>&1 1>&2 2>&3); then
APT_CACHER="${APT_CACHER_IP:+yes}"
echo -e "${NETWORK}${BOLD}${DGN}APT-Cacher IP Address: ${BGN}${APT_CACHER_IP:-Default}${CL}"
else
@@ -565,7 +678,7 @@ advanced_settings() {
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)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
+ if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default [1500])" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
if [ -z $MTU1 ]; then
MTU1="Default"
MTU=""
@@ -602,7 +715,7 @@ advanced_settings() {
exit_script
fi
- if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
+ if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address(leave blank for generated MAC)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
if [ -z $MAC1 ]; then
MAC1="Default"
MAC=""
@@ -614,7 +727,7 @@ advanced_settings() {
exit_script
fi
- if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
+ if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for no VLAN)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
if [ -z $VLAN1 ]; then
VLAN1="Default"
VLAN=""
@@ -628,18 +741,14 @@ advanced_settings() {
if ADV_TAGS=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Custom Tags?[If you remove all, there will be no tags!]" 8 58 ${TAGS} --title "Advanced Tags" 3>&1 1>&2 2>&3); then
if [ -n "${ADV_TAGS}" ]; then
- ADV_TAGS=$(echo "$ADV_TAGS" | tr -d '[:space:]') # Remove whitespace from ADV_TAGS
- if [[ "$ADV_TAGS" != *"community-script"* ]]; then
- TAGS="community-script;${ADV_TAGS}"
- else
- TAGS="${ADV_TAGS}" # ADV_TAGS already contains "community-script"
- fi
+ ADV_TAGS=$(echo "$ADV_TAGS" | tr -d '[:space:]')
+ TAGS="${ADV_TAGS}"
else
- TAGS="community-script;"
+ TAGS=";"
fi
- echo -e "${NETWORK}${BOLD}${DGN}Tags: ${BGN}$TAGS${CL}"
- else
- exit_script
+ echo -e "${NETWORK}${BOLD}${DGN}Tags: ${BGN}$TAGS${CL}"
+ else
+ exit_script
fi
if [[ "$PW" == -password* ]]; then
@@ -662,7 +771,7 @@ advanced_settings() {
fi
else
SSH_AUTHORIZED_KEY=""
- fi
+ fi
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
VERB="yes"
else
@@ -680,11 +789,123 @@ advanced_settings() {
fi
}
+post_to_api() {
+ local API_URL="http://api.community-scripts.org/upload"
+ local pve_version="not found"
+ pve_version=$(pveversion | awk -F'[/ ]' '{print $2}')
+
+ JSON_PAYLOAD=$(
+ cat </usr/local/community-scripts/diagnostics
+DIAGNOSTICS=yes
+
+#This file is used to store the diagnostics settings for the Community-Scripts API.
+#https://github.com/community-scripts/ProxmoxVE/discussions/1836
+#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes.
+#You can review the data at https://community-scripts.github.io/ProxmoxVE/data
+#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue.
+#This will disable the diagnostics feature.
+#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue.
+#This will enable the diagnostics feature.
+#The following information will be sent:
+#"ct_type"
+#"disk_size"
+#"core_count"
+#"ram_size"
+#"verbose"
+#"os_type"
+#"os_version"
+#"hn"
+#"disableip6"
+#"ssh"
+#"tags"
+#"nsapp"
+#"method"
+#"pve_version"
+#If you have any concerns, please review the source code at /misc/build.func
+EOF
+ DIAGNOSTICS="yes"
+ else
+ cat </usr/local/community-scripts/diagnostics
+DIAGNOSTICS=no
+
+#This file is used to store the diagnostics settings for the Community-Scripts API.
+#https://github.com/community-scripts/ProxmoxVE/discussions/1836
+#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes.
+#You can review the data at https://community-scripts.github.io/ProxmoxVE/data
+#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue.
+#This will disable the diagnostics feature.
+#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue.
+#This will enable the diagnostics feature.
+#The following information will be sent:
+#"ct_type"
+#"disk_size"
+#"core_count"
+#"ram_size"
+#"verbose"
+#"os_type"
+#"os_version"
+#"hn"
+#"disableip6"
+#"ssh"
+#"tags"
+#"nsapp"
+#"method"
+#"pve_version"
+#If you have any concerns, please review the source code at /misc/build.func
+EOF
+ DIAGNOSTICS="no"
+ fi
+ else
+ DIAGNOSTICS=$(awk -F '=' '/^DIAGNOSTICS/ {print $2}' /usr/local/community-scripts/diagnostics)
+
+ fi
+
+}
+
install_script() {
pve_check
shell_check
root_check
ssh_check
+ maxkeys_check
+ diagnostics_check
if systemctl is-active -q ping-instances.service; then
systemctl -q stop ping-instances.service
@@ -693,12 +914,14 @@ install_script() {
timezone=$(cat /etc/timezone)
header_info
while true; do
+
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --menu "Choose an option:" \
- 12 50 4 \
+ 12 50 5 \
"1" "Default Settings" \
"2" "Default Settings (with verbose)" \
"3" "Advanced Settings" \
- "4" "Exit" --nocancel --default-item "1" 3>&1 1>&2 2>&3)
+ "4" "Diagnostic Settings" \
+ "5" "Exit" --nocancel --default-item "1" 3>&1 1>&2 2>&3)
if [ $? -ne 0 ]; then
echo -e "${CROSS}${RD} Menu canceled. Exiting.${CL}"
@@ -706,35 +929,55 @@ install_script() {
fi
case $CHOICE in
- 1)
- header_info
- echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME${CL}"
- VERB="no"
- base_settings "$VERB"
- echo_default
- break
- ;;
- 2)
- header_info
- echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME (${SEARCH}Verbose)${CL}"
- VERB="yes"
- base_settings "$VERB"
- echo_default
- break
- ;;
- 3)
- header_info
- echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings on node $PVEHOST_NAME${CL}"
- advanced_settings
- break
- ;;
- 4)
- echo -e "${CROSS}${RD}Exiting.${CL}"
- exit 0
- ;;
- *)
- echo -e "${CROSS}${RD}Invalid option, please try again.${CL}"
+ 1)
+ header_info
+ echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME${CL}"
+ VERB="no"
+ METHOD="default"
+ base_settings "$VERB"
+ echo_default
+ break
+ ;;
+ 2)
+ header_info
+ echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME (${SEARCH}Verbose)${CL}"
+ VERB="yes"
+ METHOD="default"
+ base_settings "$VERB"
+ echo_default
+ break
+ ;;
+ 3)
+ header_info
+ echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings on node $PVEHOST_NAME${CL}"
+ METHOD="advanced"
+ advanced_settings
+ break
+ ;;
+ 4)
+ if [[ $DIAGNOSTICS == "yes" ]]; then
+ if whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --yesno "Send Diagnostics of LXC Installation?\n\nCurrent setting: ${DIAGNOSTICS}" 10 58 \
+ --yes-button "No" --no-button "Back" ; then
+ DIAGNOSTICS="no"
+ sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics
+ whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --msgbox "Diagnostics settings changed to ${DIAGNOSTICS}." 8 58
+ fi
+ else
+ if whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --yesno "Send Diagnostics of LXC Installation?\n\nCurrent setting: ${DIAGNOSTICS}" 10 58 \
+ --yes-button "Yes" --no-button "Back" ; then
+ DIAGNOSTICS="yes"
+ sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics
+ whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --msgbox "Diagnostics settings changed to ${DIAGNOSTICS}." 8 58
+ fi
+ fi
;;
+ 5)
+ echo -e "${CROSS}${RD}Exiting.${CL}"
+ exit 0
+ ;;
+ *)
+ echo -e "${CROSS}${RD}Invalid option, please try again.${CL}"
+ ;;
esac
done
}
@@ -805,7 +1048,7 @@ start() {
# This function collects user settings and integrates all the collected information.
build_container() {
-# if [ "$VERB" == "yes" ]; then set -x; fi
+ # if [ "$VERB" == "yes" ]; then set -x; fi
if [ "$CT_TYPE" == "1" ]; then
FEATURES="keyctl=1,nesting=1"
@@ -813,6 +1056,9 @@ build_container() {
FEATURES="nesting=1"
fi
+ if [[ $DIAGNOSTICS == "yes" ]]; then
+ post_to_api
+ fi
TEMP_DIR=$(mktemp -d)
pushd $TEMP_DIR >/dev/null
@@ -906,7 +1152,7 @@ EOF
msg_ok "Started LXC Container"
if [ "$var_os" == "alpine" ]; then
sleep 3
- pct exec "$CTID" -- /bin/sh -c 'cat </etc/apk/repositories
+ pct exec "$CTID" -- /bin/sh -c 'cat </etc/apk/repositories
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
EOF'
@@ -921,7 +1167,8 @@ description() {
IP=$(pct exec "$CTID" ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
# Generate LXC Description
- DESCRIPTION=$(cat <
@@ -949,7 +1196,7 @@ description() {
EOF
-)
+ )
# Set Description in LXC
pct set "$CTID" -description "$DESCRIPTION"
diff --git a/misc/clean-orphaned-lvm.sh b/misc/clean-orphaned-lvm.sh
new file mode 100644
index 000000000..d8ad78207
--- /dev/null
+++ b/misc/clean-orphaned-lvm.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+function header_info {
+ clear
+ cat <<"EOF"
+ ____ ________ ____ __ __ __ _ ____ ___
+ / __ \_________ _ ______ ___ ____ _ __ / ____/ /__ ____ _____ / __ \_________ / /_ ____ _____ ___ ____/ / / /| | / / |/ /____
+ / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / / / / _ \/ __ `/ __ \ / / / / ___/ __ \/ __ \/ __ `/ __ \/ _ \/ __ / / / | | / / /|_/ / ___/
+ / ____/ / / /_/ /> / / / / / /_/ /> < / /___/ / __/ /_/ / / / / / /_/ / / / /_/ / / / / /_/ / / / / __/ /_/ / / /__| |/ / / / (__ )
+/_/ /_/ \____/_/|_/_/ /_/ /_/\____/_/|_| \____/_/\___/\__,_/_/ /_/ \____/_/ / .___/_/ /_/\__,_/_/ /_/\___/\__,_/ /_____/___/_/ /_/____/
+ /_/
+EOF
+}
+
+# Function to check for orphaned LVM volumes
+function find_orphaned_lvm {
+ echo -e "\nπ Scanning for orphaned LVM volumes...\n"
+
+ orphaned_volumes=()
+ while read -r lv vg size; do
+ container_id=$(echo "$lv" | grep -oE "[0-9]+" | head -1)
+
+ # Exclude system-critical LVs
+ if [[ "$lv" == "data" || "$lv" == "root" || "$lv" == "swap" ]]; then
+ continue
+ fi
+
+ # Check if the ID exists as a VM or LXC container
+ if [ -f "/etc/pve/lxc/${container_id}.conf" ] || [ -f "/etc/pve/qemu-server/${container_id}.conf" ]; then
+ continue
+ fi
+
+ orphaned_volumes+=("$lv" "$vg" "$size")
+ done < <(lvs --noheadings -o lv_name,vg_name,lv_size --separator ' ' | awk '{print $1, $2, $3}')
+
+ if [ ${#orphaned_volumes[@]} -eq 0 ]; then
+ echo -e "β
No orphaned LVM volumes found.\n"
+ exit 0
+ fi
+
+ # Display orphaned volumes
+ echo -e "β The following orphaned LVM volumes were found:\n"
+ printf "%-25s %-10s %-10s\n" "LV Name" "VG" "Size"
+ printf "%-25s %-10s %-10s\n" "-------------------------" "----------" "----------"
+
+ for ((i = 0; i < ${#orphaned_volumes[@]}; i+=3)); do
+ printf "%-25s %-10s %-10s\n" "${orphaned_volumes[i]}" "${orphaned_volumes[i+1]}" "${orphaned_volumes[i+2]}"
+ done
+ echo ""
+}
+
+# Function to delete selected volumes
+function delete_orphaned_lvm {
+ for ((i = 0; i < ${#orphaned_volumes[@]}; i+=3)); do
+ lv="${orphaned_volumes[i]}"
+ vg="${orphaned_volumes[i+1]}"
+ size="${orphaned_volumes[i+2]}"
+
+ read -p "β Do you want to delete $lv (VG: $vg, Size: $size)? [y/N]: " confirm
+ if [[ "$confirm" =~ ^[Yy]$ ]]; then
+ echo -e "ποΈ Deleting $lv from $vg..."
+ lvremove -f "$vg/$lv"
+ if [ $? -eq 0 ]; then
+ echo -e "β
Successfully deleted $lv.\n"
+ else
+ echo -e "β Failed to delete $lv.\n"
+ fi
+ else
+ echo -e "β οΈ Skipping $lv.\n"
+ fi
+ done
+}
+
+# Run script
+header_info
+find_orphaned_lvm
+delete_orphaned_lvm
+
+echo -e "β
Cleanup process completed!\n"
diff --git a/misc/filebrowser.sh b/misc/filebrowser.sh
index c1e3e858f..a9ea1186b 100644
--- a/misc/filebrowser.sh
+++ b/misc/filebrowser.sh
@@ -1,9 +1,8 @@
#!/usr/bin/env bash
-# Copyright (c) 2021-2025 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: tteck (tteckster) | Co-Author: MickLesk
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
function header_info {
clear
@@ -11,79 +10,88 @@ function header_info {
_______ __ ____
/ ____(_) /__ / __ )_________ _ __________ _____
/ /_ / / / _ \/ __ / ___/ __ \ | /| / / ___/ _ \/ ___/
- / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ /
-/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/
-
+ / __/ / / / __/ /_/ / / / /_/ / |/ |/ (__ ) __/ /
+/_/ /_/_/\___/_____/_/ \____/|__/|__/____/\___/_/
EOF
}
-IP=$(hostname -I | awk '{print $1}')
YW=$(echo "\033[33m")
-BL=$(echo "\033[36m")
-RD=$(echo "\033[01;31m")
-BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m")
-DGN=$(echo "\033[32m")
+RD=$(echo "\033[01;31m")
+BL=$(echo "\033[36m")
CL=$(echo "\033[m")
-BFR="\\r\\033[K"
-HOLD="-"
-CM="${GN}β${CL}"
+CM="${GN}βοΈ${CL}"
+CROSS="${RD}βοΈ${CL}"
+INFO="${BL}βΉοΈ${CL}"
+
APP="FileBrowser"
-hostname="$(hostname)"
-header_info
-if [ -f /root/filebrowser.db ]; then
- read -r -p "Would you like to uninstall ${APP} on $hostname.?
" prompt
- if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- systemctl disable -q --now filebrowser.service
- rm -rf /usr/local/bin/filebrowser /root/filebrowser.db /etc/systemd/system/filebrowser.service
- echo "$APP Removed"
- sleep 2
- clear
- exit
- else
- clear
- exit
- fi
-fi
-while true; do
- read -p "This will Install ${APP} on $hostname. Proceed(y/n)?" yn
- case $yn in
- [Yy]*) break ;;
- [Nn]*) exit ;;
- *) echo "Please answer yes or no." ;;
- esac
-done
+INSTALL_PATH="/usr/local/bin/filebrowser"
+SERVICE_PATH="/etc/systemd/system/filebrowser.service"
+DB_PATH="/root/filebrowser.db"
+IP=$(hostname -I | awk '{print $1}')
header_info
+
function msg_info() {
local msg="$1"
- echo -ne " ${HOLD} ${YW}${msg}..."
+ echo -e "${INFO} ${YW}${msg}...${CL}"
}
function msg_ok() {
local msg="$1"
- echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
+ echo -e "${CM} ${GN}${msg}${CL}"
}
-read -r -p "Would you like to use No Authentication? " prompt
-msg_info "Installing ${APP}"
-apt-get install -y curl &>/dev/null
-RELEASE=$(curl -fsSL https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g')
-curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/$RELEASE/linux-arm64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
+function msg_error() {
+ local msg="$1"
+ echo -e "${CROSS} ${RD}${msg}${CL}"
+}
-if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
- filebrowser config init -a '0.0.0.0' &>/dev/null
- filebrowser config set -a '0.0.0.0' &>/dev/null
- filebrowser config init --auth.method=noauth &>/dev/null
- filebrowser config set --auth.method=noauth &>/dev/null
- filebrowser users add ID 1 --perm.admin &>/dev/null
-else
- filebrowser config init -a '0.0.0.0' &>/dev/null
- filebrowser config set -a '0.0.0.0' &>/dev/null
- filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null
+if [ -f "$INSTALL_PATH" ]; then
+ echo -e "${YW}β οΈ ${APP} is already installed.${CL}"
+ read -r -p "Would you like to uninstall ${APP}? (y/N): " uninstall_prompt
+ if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Uninstalling ${APP}"
+ systemctl disable -q --now filebrowser.service
+ rm -f "$INSTALL_PATH" "$DB_PATH" "$SERVICE_PATH"
+ msg_ok "${APP} has been uninstalled."
+ exit 0
+ fi
+
+ read -r -p "Would you like to update ${APP}? (y/N): " update_prompt
+ if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Updating ${APP}"
+ curl -fsSL https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
+ msg_ok "Updated ${APP}"
+ exit 0
+ else
+ echo -e "${YW}β οΈ Update skipped. Exiting.${CL}"
+ exit 0
+ fi
fi
-msg_ok "Installed ${APP} on $hostname"
-msg_info "Creating Service"
-cat </etc/systemd/system/filebrowser.service
+echo -e "${YW}β οΈ ${APP} is not installed.${CL}"
+read -r -p "Would you like to install ${APP}? (y/n): " install_prompt
+if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Installing ${APP}"
+ apt-get install -y curl &>/dev/null
+ curl -fsSL https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
+ msg_ok "Installed ${APP}"
+
+ read -r -p "Would you like to use No Authentication? (y/N): " auth_prompt
+ if [[ "${auth_prompt,,}" =~ ^(y|yes)$ ]]; then
+ msg_info "Configuring No Authentication"
+ filebrowser config init -a '0.0.0.0' &>/dev/null
+ filebrowser config set -a '0.0.0.0' --auth.method=noauth &>/dev/null
+ msg_ok "No Authentication configured"
+ else
+ msg_info "Setting up default authentication"
+ filebrowser config init -a '0.0.0.0' &>/dev/null
+ filebrowser config set -a '0.0.0.0' &>/dev/null
+ filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null
+ msg_ok "Default authentication configured (admin:helper-scripts.com)"
+ fi
+
+ msg_info "Creating service"
+ cat </etc/systemd/system/filebrowser.service
[Unit]
Description=Filebrowser
After=network-online.target
@@ -96,9 +104,11 @@ ExecStart=/usr/local/bin/filebrowser -r /
[Install]
WantedBy=default.target
EOF
-systemctl enable -q --now filebrowser.service
-msg_ok "Created Service"
+ systemctl enable -q --now filebrowser.service
+ msg_ok "Service created successfully"
-msg_ok "Completed Successfully!\n"
-echo -e "${APP} should be reachable by going to the following URL.
- ${BL}http://$IP:8080${CL} \n"
+ echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:8080${CL}"
+else
+ echo -e "${YW}β οΈ Installation skipped. Exiting.${CL}"
+ exit 0
+fi
diff --git a/misc/install.func b/misc/install.func
index df5f2629e..2ab1dca71 100644
--- a/misc/install.func
+++ b/misc/install.func
@@ -201,9 +201,6 @@ motd_ssh() {
# Set terminal to 256-color mode
grep -qxF "export TERM='xterm-256color'" /root/.bashrc || echo "export TERM='xterm-256color'" >> /root/.bashrc
- # Get the current private IP address
- IP=$(hostname -I | awk '{print $1}') # Private IP
-
# Get OS information (Debian / Ubuntu)
if [ -f "/etc/os-release" ]; then
OS_NAME=$(grep ^NAME /etc/os-release | cut -d= -f2 | tr -d '"')
@@ -213,20 +210,14 @@ motd_ssh() {
OS_VERSION=$(cat /etc/debian_version)
fi
- # Set MOTD with application info, system details
- MOTD_FILE="/etc/motd"
- if [ -f "$MOTD_FILE" ]; then
- # Start MOTD with application info and link
- echo -e "\n${BOLD}${APPLICATION} LXC Container${CL}" > "$MOTD_FILE"
- echo -e "${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts & Pimox Scripts ${YW}| GitHub: ${GN}https://github.com/asylumexp/Proxmox${CL}\n" >> "$MOTD_FILE"
-
- # Add system information with icons
- echo -e "${TAB}${OS}${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}" >> "$MOTD_FILE"
- echo -e "${TAB}${HOSTNAME}${YW} Hostname: ${GN}$(hostname)${CL}" >> "$MOTD_FILE"
- echo -e "${TAB}${INFO}${YW} IP Address: ${GN}${IP}${CL}" >> "$MOTD_FILE"
- else
- echo "MotD file does not exist!" >&2
- fi
+ PROFILE_FILE="/etc/profile.d/00_lxc-details.sh"
+ echo "echo -e \"\"" > "$PROFILE_FILE"
+ echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >> "$PROFILE_FILE"
+ echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts & pimox-scripts ${YW}| GitHub: ${GN}https://github.com/asylumexp/Proxmox${CL}\"" >> "$PROFILE_FILE"
+ echo "echo \"\"" >> "$PROFILE_FILE"
+ echo -e "echo -e \"${TAB}${OS}${YW} OS: ${GN}${OS_NAME} - Version: ${OS_VERSION}${CL}\"" >> "$PROFILE_FILE"
+ echo -e "echo -e \"${TAB}${HOSTNAME}${YW} Hostname: ${GN}\$(hostname)${CL}\"" >> "$PROFILE_FILE"
+ echo -e "echo -e \"${TAB}${INFO}${YW} IP Address: ${GN}\$(hostname -I | awk '{print \$1}')${CL}\"" >> "$PROFILE_FILE"
# Disable default MOTD scripts
chmod -x /etc/update-motd.d/*
diff --git a/misc/lxc-delete.sh b/misc/lxc-delete.sh
new file mode 100644
index 000000000..2e76d5963
--- /dev/null
+++ b/misc/lxc-delete.sh
@@ -0,0 +1,112 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+function header_info {
+ clear
+ cat <<"EOF"
+ ____ ____ ____ _ __ __ _______ _ __ __ _ ________ ____ ________ __________________
+ / __ \/ __ \/ __ \ |/ // |/ / __ \ |/ / / / | |/ / ____/ / __ \/ ____/ / / ____/_ __/ ____/
+ / /_/ / /_/ / / / / // /|_/ / / / / / / / | / / / / / / __/ / / / __/ / / / __/
+ / ____/ _, _/ /_/ / |/ / / / /_/ / | / /___/ / /___ / /_/ / /___/ /___/ /___ / / / /___
+/_/ /_/ |_|\____/_/|_/_/ /_/\____/_/|_| /_____/_/|_\____/ /_____/_____/_____/_____/ /_/ /_____/
+
+EOF
+}
+
+spinner() {
+ local pid=$1
+ local delay=0.1
+ local spinstr='|/-\'
+ while ps -p $pid > /dev/null; do
+ printf " [%c] " "$spinstr"
+ spinstr=${spinstr#?}${spinstr%"${spinstr#?}"}
+ sleep $delay
+ printf "\r"
+ done
+ printf " \r"
+}
+
+set -eEuo pipefail
+YW=$(echo "\033[33m")
+BL=$(echo "\033[36m")
+RD=$(echo "\033[01;31m")
+CM='\xE2\x9C\x94\033'
+GN=$(echo "\033[1;92m")
+CL=$(echo "\033[m")
+
+header_info
+echo "Loading..."
+whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This Will Delete LXC Containers. Proceed?" 10 58 || exit
+
+NODE=$(hostname)
+
+# Get list of containers with ID and hostname
+containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}')
+
+# Exit if no containers are found
+if [ -z "$containers" ]; then
+ whiptail --title "LXC Container Delete" --msgbox "There are no LXC Container available!" 10 60
+ exit 1
+fi
+
+menu_items=()
+FORMAT="%-10s %-15s %-10s"
+
+# Format container data for menu display
+while read -r container; do
+ container_id=$(echo $container | awk '{print $1}')
+ container_name=$(echo $container | awk '{print $2}')
+ container_status=$(echo $container | awk '{print $3}')
+ formatted_line=$(printf "$FORMAT" "$container_name" "$container_status")
+ menu_items+=("$container_id" "$formatted_line" "OFF")
+done <<< "$containers"
+
+# Display selection menu
+CHOICES=$(whiptail --title "LXC Container Delete" \
+ --checklist "Choose LXC container to delete:" 25 60 13 \
+ "${menu_items[@]}" 3>&2 2>&1 1>&3)
+
+if [ -z "$CHOICES" ]; then
+ whiptail --title "LXC Container Delete" \
+ --msgbox "No containers have been selected!" 10 60
+ exit 1
+fi
+
+# Process selected containers
+selected_ids=$(echo "$CHOICES" | tr -d '"' | tr -s ' ' '\n')
+
+for container_id in $selected_ids; do
+ status=$(pct status $container_id)
+
+ # Stop container if running
+ if [ "$status" == "status: running" ]; then
+ echo -e "${BL}[Info]${GN} Stop container $container_id...${CL}"
+ pct stop $container_id &
+ sleep 5
+ echo -e "${BL}[Info]${GN} Container $container_id stopped.${CL}"
+ fi
+
+ # Confirm deletion
+ read -p "Are you sure you want to delete Container $container_id? (y/N): " CONFIRM
+ if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
+ echo -e "${BL}[Info]${GN} Deleting container $container_id...${CL}"
+ pct destroy "$container_id" -f &
+ pid=$!
+ spinner $pid
+ if [ $? -eq 0 ]; then
+ echo "Container $container_id was successfully deleted."
+ else
+ whiptail --title "Error" --msgbox "Error deleting container $container_id." 10 60
+ fi
+ elif [[ "$CONFIRM" =~ ^[Nn]$ ]]; then
+ echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}"
+ else
+ echo -e "${RD}[Error]${CL} Invalid input, skipping container $container_id."
+ fi
+done
+
+header_info
+echo -e "${GN}The deletion process has been completed.${CL}\n"
diff --git a/misc/post-pmg-install.sh b/misc/post-pmg-install.sh
new file mode 100644
index 000000000..c5f4ed302
--- /dev/null
+++ b/misc/post-pmg-install.sh
@@ -0,0 +1,180 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: thost96 (thost96)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+header_info() {
+ clear
+ cat <<"EOF"
+ ____ __ _________ ____ __ ____ __ ____
+ / __ \/ |/ / ____/ / __ \____ _____/ /_ / _/___ _____/ /_____ _/ / /
+ / /_/ / /|_/ / / __ / /_/ / __ \/ ___/ __/ / // __ \/ ___/ __/ __ `/ / /
+ / ____/ / / / /_/ / / ____/ /_/ (__ ) /_ _/ // / / (__ ) /_/ /_/ / / /
+/_/ /_/ /_/\____/ /_/ \____/____/\__/ /___/_/ /_/____/\__/\__,_/_/_/
+
+EOF
+}
+
+RD=$(echo "\033[01;31m")
+YW=$(echo "\033[33m")
+GN=$(echo "\033[1;92m")
+CL=$(echo "\033[m")
+BFR="\\r\\033[K"
+HOLD="-"
+CM="${GN}β${CL}"
+CROSS="${RD}β${CL}"
+
+set -euo pipefail
+shopt -s inherit_errexit nullglob
+
+msg_info() {
+ local msg="$1"
+ echo -ne " ${HOLD} ${YW}${msg}..."
+}
+
+msg_ok() {
+ local msg="$1"
+ echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
+}
+
+msg_error() {
+ local msg="$1"
+ echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
+}
+
+start_routines() {
+ header_info
+ VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
+ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PMG SOURCES" --menu "This will set the correct sources to update and install Proxmox Mail Gateway.\n \nChange to Proxmox Mail Gateway sources?" 14 58 2 \
+ "yes" " " \
+ "no" " " 3>&2 2>&1 1>&3)
+ case $CHOICE in
+ yes)
+ msg_info "Changing to Proxmox Mail Gateway Sources"
+ cat </etc/apt/sources.list
+deb http://deb.debian.org/debian ${VERSION} main contrib
+deb http://deb.debian.org/debian ${VERSION}-updates main contrib
+deb http://security.debian.org/debian-security ${VERSION}-security main contrib
+EOF
+ msg_ok "Changed to Proxmox Mail Gateway Sources"
+ ;;
+ no)
+ msg_error "Selected no to Correcting Proxmox Mail Gateway Sources"
+ ;;
+ esac
+
+ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PMG-ENTERPRISE" --menu "The 'pmg-enterprise' repository is only available to users who have purchased a Proxmox Mail Gateway subscription.\n \nDisable 'pmg-enterprise' repository?" 14 58 2 \
+ "yes" " " \
+ "no" " " 3>&2 2>&1 1>&3)
+ case $CHOICE in
+ yes)
+ msg_info "Disabling 'pmg-enterprise' repository"
+ cat </etc/apt/sources.list.d/pmg-enterprise.list
+# deb https://enterprise.proxmox.com/debian/pmg ${VERSION} pmg-enterprise
+EOF
+ msg_ok "Disabled 'pmg-enterprise' repository"
+ ;;
+ no)
+ msg_error "Selected no to disabling 'pmg-enterprise' repository"
+ ;;
+ esac
+
+ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PMG-NO-SUBSCRIPTION" --menu "The 'pmg-no-subscription' repository provides access to all of the open-source components of Proxmox Mail Gateway.\n \nEnable 'pmg-no-subscription' repository?" 14 58 2 \
+ "yes" " " \
+ "no" " " 3>&2 2>&1 1>&3)
+ case $CHOICE in
+ yes)
+ msg_info "Enabling 'pmg-no-subscription' repository"
+ cat </etc/apt/sources.list.d/pmg-install-repo.list
+deb http://download.proxmox.com/debian/pmg ${VERSION} pmg-no-subscription
+EOF
+ msg_ok "Enabled 'pmg-no-subscription' repository"
+ ;;
+ no)
+ msg_error "Selected no to enabling 'pmg-no-subscription' repository"
+ ;;
+ esac
+
+ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PMG TEST" --menu "The 'pmgtest' repository can give advanced users access to new features and updates before they are officially released.\n \nAdd (Disabled) 'pmgtest' repository?" 14 58 2 \
+ "yes" " " \
+ "no" " " 3>&2 2>&1 1>&3)
+ case $CHOICE in
+ yes)
+ msg_info "Adding 'pmgtest' repository and set disabled"
+ cat </etc/apt/sources.list.d/pmgtest-for-beta.list
+# deb http://download.proxmox.com/debian/pmg ${VERSION} pmgtest
+EOF
+ msg_ok "Added 'pmgtest' repository"
+ ;;
+ no)
+ msg_error "Selected no to adding 'pmgtest' repository"
+ ;;
+ esac
+
+ if [[ ! -f /etc/apt/apt.conf.d/no-nag-script ]]; then
+ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUBSCRIPTION NAG" --menu "This will disable the nag message reminding you to purchase a subscription every time you log in to the web interface.\n \nDisable subscription nag?" 14 58 2 \
+ "yes" " " \
+ "no" " " 3>&2 2>&1 1>&3)
+ case $CHOICE in
+ yes)
+ whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
+ msg_info "Disabling subscription nag"
+ # Normal GUI:
+ echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script
+ # JS-Library used when accessing via mobile device browser
+ echo "DPkg::Post-Invoke { \"dpkg -V pmg-gui | grep -q '/pmgmanagerlib-mobile\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from Mobile UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script
+ apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null
+ msg_ok "Disabled subscription nag (Delete browser cache)"
+ ;;
+ no)
+ whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
+ msg_error "Selected no to disabling subscription nag"
+ ;;
+ esac
+ fi
+
+ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --menu "\nUpdate Proxmox Mail Gateway now?" 11 58 2 \
+ "yes" " " \
+ "no" " " 3>&2 2>&1 1>&3)
+ case $CHOICE in
+ yes)
+ msg_info "Updating Proxmox Mail Gateway (Patience)"
+ apt-get update &>/dev/null
+ apt-get -y dist-upgrade &>/dev/null
+ msg_ok "Updated Proxmox Mail Gateway"
+ ;;
+ no)
+ msg_error "Selected no to updating Proxmox Mail Gateway"
+ ;;
+ esac
+
+ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "REBOOT" --menu "\nReboot Proxmox Mail Gateway now? (recommended)" 11 58 2 \
+ "yes" " " \
+ "no" " " 3>&2 2>&1 1>&3)
+ case $CHOICE in
+ yes)
+ msg_info "Rebooting Proxmox Mail Gateway"
+ sleep 2
+ msg_ok "Completed Post Install Routines"
+ reboot
+ ;;
+ no)
+ msg_error "Selected no to reboot Proxmox Mail Gateway (Reboot recommended)"
+ msg_ok "Completed Post Install Routines"
+ ;;
+ esac
+}
+
+header_info
+echo -e "\nThis script will Perform Post Install Routines.\n"
+while true; do
+ read -p "Start the Proxmox Mail Gateway Post Install Script (y/n)?" yn
+ case $yn in
+ [Yy]*) break ;;
+ [Nn]*) clear; exit ;;
+ *) echo "Please answer yes or no." ;;
+ esac
+done
+
+start_routines
diff --git a/vm/archlinux-vm.sh b/vm/archlinux-vm.sh
new file mode 100644
index 000000000..6f08a0023
--- /dev/null
+++ b/vm/archlinux-vm.sh
@@ -0,0 +1,497 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+function header_info {
+ clear
+ cat <<"EOF"
+ ___ __ __ _ _ ____ ___
+ / | __________/ /_ / / (_)___ __ ___ __ | | / / |/ /
+ / /| | / ___/ ___/ __ \ / / / / __ \/ / / / |/_/ | | / / /|_/ /
+ / ___ |/ / / /__/ / / / / /___/ / / / / /_/ /> < | |/ / / / /
+/_/ |_/_/ \___/_/ /_/ /_____/_/_/ /_/\__,_/_/|_| |___/_/ /_/
+
+EOF
+}
+header_info
+echo -e "\n Loading..."
+GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
+NEXTID=$(pvesh get /cluster/nextid)
+
+YW=$(echo "\033[33m")
+BL=$(echo "\033[36m")
+RD=$(echo "\033[01;31m")
+BGN=$(echo "\033[4;92m")
+GN=$(echo "\033[1;92m")
+DGN=$(echo "\033[32m")
+CL=$(echo "\033[m")
+
+CL=$(echo "\033[m")
+BOLD=$(echo "\033[1m")
+BFR="\\r\\033[K"
+HOLD=" "
+TAB=" "
+
+CM="${TAB}βοΈ${TAB}${CL}"
+CROSS="${TAB}βοΈ${TAB}${CL}"
+INFO="${TAB}π‘${TAB}${CL}"
+OS="${TAB}π₯οΈ${TAB}${CL}"
+CONTAINERTYPE="${TAB}π¦${TAB}${CL}"
+DISKSIZE="${TAB}πΎ${TAB}${CL}"
+CPUCORE="${TAB}π§ ${TAB}${CL}"
+RAMSIZE="${TAB}π οΈ${TAB}${CL}"
+CONTAINERID="${TAB}π${TAB}${CL}"
+HOSTNAME="${TAB}π ${TAB}${CL}"
+BRIDGE="${TAB}π${TAB}${CL}"
+GATEWAY="${TAB}π${TAB}${CL}"
+DEFAULT="${TAB}βοΈ${TAB}${CL}"
+MACADDRESS="${TAB}π${TAB}${CL}"
+VLANTAG="${TAB}π·οΈ${TAB}${CL}"
+CREATING="${TAB}π${TAB}${CL}"
+ADVANCED="${TAB}π§©${TAB}${CL}"
+
+THIN="discard=on,ssd=1,"
+set -e
+trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
+trap cleanup EXIT
+function error_handler() {
+ local exit_code="$?"
+ local line_number="$1"
+ local command="$2"
+ local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
+ echo -e "\n$error_message\n"
+ cleanup_vmid
+}
+
+function cleanup_vmid() {
+ if qm status $VMID &>/dev/null; then
+ qm stop $VMID &>/dev/null
+ qm destroy $VMID &>/dev/null
+ fi
+}
+
+function cleanup() {
+ popd >/dev/null
+ rm -rf $TEMP_DIR
+}
+
+TEMP_DIR=$(mktemp -d)
+pushd $TEMP_DIR >/dev/null
+if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Arch Linux VM" --yesno "This will create a New Arch Linux VM. Proceed?" 10 58; then
+ :
+else
+ header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit
+fi
+
+function msg_info() {
+ local msg="$1"
+ echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}"
+}
+
+function msg_ok() {
+ local msg="$1"
+ echo -e "${BFR}${CM}${GN}${msg}${CL}"
+}
+
+function msg_error() {
+ local msg="$1"
+ echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
+}
+
+function check_root() {
+ if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then
+ clear
+ msg_error "Please run this script as root."
+ echo -e "\nExiting..."
+ sleep 2
+ exit
+ fi
+}
+
+function pve_check() {
+ if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then
+ msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
+ echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
+ echo -e "Exiting..."
+ sleep 2
+ exit
+ fi
+}
+
+function arch_check() {
+ if [ "$(dpkg --print-architecture)" != "amd64" ]; then
+ echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n"
+ echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n"
+ echo -e "Exiting..."
+ sleep 2
+ exit
+ fi
+}
+
+function ssh_check() {
+ if command -v pveversion >/dev/null 2>&1; then
+ if [ -n "${SSH_CLIENT:+x}" ]; then
+ if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then
+ echo "you've been warned"
+ else
+ clear
+ exit
+ fi
+ fi
+ fi
+}
+
+function exit-script() {
+ clear
+ echo -e "\n${CROSS}${RD}User exited script${CL}\n"
+ exit
+}
+
+function default_settings() {
+ VMID="$NEXTID"
+ FORMAT=",efitype=4m"
+ MACHINE=""
+ DISK_SIZE="4G"
+ DISK_CACHE=""
+ HN="arch-linux"
+ CPU_TYPE=""
+ CORE_COUNT="1"
+ RAM_SIZE="1024"
+ BRG="vmbr0"
+ MAC="$GEN_MAC"
+ VLAN=""
+ MTU=""
+ START_VM="yes"
+ echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
+ echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
+ echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}"
+ echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
+ echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
+ echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}"
+ echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}"
+ echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}"
+ echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}"
+ echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}"
+ echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
+ echo -e "${CREATING}${BOLD}${DGN}Creating a Arch Linux VM using the above default settings${CL}"
+}
+
+function advanced_settings() {
+ while true; do
+ if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z "$VMID" ]; then
+ VMID="$NEXTID"
+ fi
+ if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
+ echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
+ sleep 2
+ continue
+ fi
+ echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}"
+ break
+ else
+ exit-script
+ fi
+ done
+
+ if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \
+ "i440fx" "Machine i440fx" ON \
+ "q35" "Machine q35" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ $MACH = q35 ]; then
+ echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
+ FORMAT=""
+ MACHINE=" -machine q35"
+ else
+ echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
+ FORMAT=",efitype=4m"
+ MACHINE=""
+ fi
+ else
+ exit-script
+ fi
+
+ if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ')
+ if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then
+ DISK_SIZE="${DISK_SIZE}G"
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}"
+ elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}"
+ else
+ echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}"
+ exit-script
+ fi
+ else
+ exit-script
+ fi
+
+ if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
+ "0" "None (Default)" ON \
+ "1" "Write Through" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ $DISK_CACHE = "1" ]; then
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}"
+ DISK_CACHE="cache=writethrough,"
+ else
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
+ DISK_CACHE=""
+ fi
+ else
+ exit-script
+ fi
+
+ if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 arch-linux --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $VM_NAME ]; then
+ HN="arch-linux"
+ echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}"
+ else
+ HN=$(echo ${VM_NAME,,} | tr -d ' ')
+ echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
+ "0" "KVM64 (Default)" ON \
+ "1" "Host" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ $CPU_TYPE1 = "1" ]; then
+ echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}"
+ CPU_TYPE=" -cpu host"
+ else
+ echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
+ CPU_TYPE=""
+ fi
+ else
+ exit-script
+ fi
+
+ if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $CORE_COUNT ]; then
+ CORE_COUNT="2"
+ echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}"
+ else
+ echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $RAM_SIZE ]; then
+ RAM_SIZE="2048"
+ echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}"
+ else
+ echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $BRG ]; then
+ BRG="vmbr0"
+ echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
+ else
+ echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $MAC1 ]; then
+ MAC="$GEN_MAC"
+ echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}"
+ else
+ MAC="$MAC1"
+ echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $VLAN1 ]; then
+ VLAN1="Default"
+ VLAN=""
+ echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}"
+ else
+ VLAN=",tag=$VLAN1"
+ echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $MTU1 ]; then
+ MTU1="Default"
+ MTU=""
+ echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}"
+ else
+ MTU=",mtu=$MTU1"
+ echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then
+ echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
+ START_VM="yes"
+ else
+ echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}"
+ START_VM="no"
+ fi
+
+ if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Arch Linux VM?" --no-button Do-Over 10 58); then
+ echo -e "${CREATING}${BOLD}${DGN}Creating a Arch Linux VM using the above advanced settings${CL}"
+ else
+ header_info
+ echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}"
+ advanced_settings
+ fi
+}
+
+function start_script() {
+ if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
+ header_info
+ echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}"
+ default_settings
+ else
+ header_info
+ echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}"
+ advanced_settings
+ fi
+}
+
+check_root
+arch_check
+pve_check
+ssh_check
+start_script
+
+msg_info "Validating Storage"
+while read -r line; do
+ TAG=$(echo $line | awk '{print $1}')
+ TYPE=$(echo $line | awk '{printf "%-10s", $2}')
+ FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}')
+ ITEM=" Type: $TYPE Free: $FREE "
+ OFFSET=2
+ if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
+ MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
+ fi
+ STORAGE_MENU+=("$TAG" "$ITEM" "OFF")
+done < <(pvesm status -content images | awk 'NR>1')
+VALID=$(pvesm status -content images | awk 'NR>1')
+if [ -z "$VALID" ]; then
+ msg_error "Unable to detect a valid storage location."
+ exit
+elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then
+ STORAGE=${STORAGE_MENU[0]}
+else
+ while [ -z "${STORAGE:+x}" ]; do
+ STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \
+ "Which storage pool you would like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \
+ 16 $(($MSG_MAX_LENGTH + 23)) 6 \
+ "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit
+ done
+fi
+msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location."
+msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
+msg_info "Retrieving the URL for the Arch Linux .iso File"
+URL=https://geo.mirror.pkgbuild.com/iso/latest/archlinux-x86_64.iso
+sleep 2
+msg_ok "${CL}${BL}${URL}${CL}"
+wget -q --show-progress $URL
+echo -en "\e[1A\e[0K"
+FILE=$(basename $URL)
+msg_ok "Downloaded ${CL}${BL}${FILE}${CL}"
+
+STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}')
+case $STORAGE_TYPE in
+nfs | dir | cifs)
+ DISK_EXT=".qcow2"
+ DISK_REF="$VMID/"
+ DISK_IMPORT="-format qcow2"
+ THIN=""
+ ;;
+btrfs)
+ DISK_EXT=".raw"
+ DISK_REF="$VMID/"
+ DISK_IMPORT="-format raw"
+ FORMAT=",efitype=4m"
+ THIN=""
+ ;;
+esac
+for i in {0,1}; do
+ disk="DISK$i"
+ eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-}
+ eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk}
+done
+
+msg_info "Creating a Arch Linux VM"
+qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
+ -name $HN -tags community-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
+pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
+qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
+qm set $VMID \
+ -efidisk0 ${DISK0_REF}${FORMAT} \
+ -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \
+ -ide2 ${STORAGE}:cloudinit \
+ -boot order=scsi0 \
+ -serial0 socket >/dev/null
+DESCRIPTION=$(
+ cat <
+
+
+
+
+ Arch Linux VM
+
+
+
+
+
+
+
+
+
+ GitHub
+
+
+
+ Discussions
+
+
+
+ Issues
+
+
+EOF
+)
+qm set "$VMID" -description "$DESCRIPTION" >/dev/null
+if [ -n "$DISK_SIZE" ]; then
+ msg_info "Resizing disk to $DISK_SIZE GB"
+ qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null
+else
+ msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB"
+ qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null
+fi
+
+msg_ok "Created a Arch Linux VM ${CL}${BL}(${HN})"
+if [ "$START_VM" == "yes" ]; then
+ msg_info "Starting Arch Linux VM"
+ qm start $VMID
+ msg_ok "Started Arch Linux VM"
+fi
+
+msg_ok "Completed Successfully!\n"
diff --git a/vm/debian-vm.sh b/vm/debian-vm.sh
index 57d373fd9..857c0ad60 100644
--- a/vm/debian-vm.sh
+++ b/vm/debian-vm.sh
@@ -1,9 +1,8 @@
#!/usr/bin/env bash
-# Copyright (c) 2021-2025 tteck
-# Author: tteck (tteckster)
-# License: MIT
-# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
function header_info {
clear
@@ -23,16 +22,36 @@ NEXTID=$(pvesh get /cluster/nextid)
YW=$(echo "\033[33m")
BL=$(echo "\033[36m")
-HA=$(echo "\033[1;34m")
RD=$(echo "\033[01;31m")
BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m")
DGN=$(echo "\033[32m")
CL=$(echo "\033[m")
+
+CL=$(echo "\033[m")
+BOLD=$(echo "\033[1m")
BFR="\\r\\033[K"
-HOLD="-"
-CM="${GN}β${CL}"
-CROSS="${RD}β${CL}"
+HOLD=" "
+TAB=" "
+
+CM="${TAB}βοΈ${TAB}${CL}"
+CROSS="${TAB}βοΈ${TAB}${CL}"
+INFO="${TAB}π‘${TAB}${CL}"
+OS="${TAB}π₯οΈ${TAB}${CL}"
+CONTAINERTYPE="${TAB}π¦${TAB}${CL}"
+DISKSIZE="${TAB}πΎ${TAB}${CL}"
+CPUCORE="${TAB}π§ ${TAB}${CL}"
+RAMSIZE="${TAB}π οΈ${TAB}${CL}"
+CONTAINERID="${TAB}π${TAB}${CL}"
+HOSTNAME="${TAB}π ${TAB}${CL}"
+BRIDGE="${TAB}π${TAB}${CL}"
+GATEWAY="${TAB}π${TAB}${CL}"
+DEFAULT="${TAB}βοΈ${TAB}${CL}"
+MACADDRESS="${TAB}π${TAB}${CL}"
+VLANTAG="${TAB}π·οΈ${TAB}${CL}"
+CREATING="${TAB}π${TAB}${CL}"
+ADVANCED="${TAB}π§©${TAB}${CL}"
+
THIN="discard=on,ssd=1,"
set -e
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
@@ -63,22 +82,22 @@ pushd $TEMP_DIR >/dev/null
if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Debian 12 VM" --yesno "This will create a New Debian 12 VM. Proceed?" 10 58; then
:
else
- header_info && echo -e "β User exited script \n" && exit
+ header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit
fi
function msg_info() {
local msg="$1"
- echo -ne " ${HOLD} ${YW}${msg}..."
+ echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}"
}
function msg_ok() {
local msg="$1"
- echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
+ echo -e "${BFR}${CM}${GN}${msg}${CL}"
}
function msg_error() {
local msg="$1"
- echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
+ echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
}
function check_root() {
@@ -93,17 +112,18 @@ function check_root() {
function pve_check() {
if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then
- msg_error "This version of Proxmox Virtual Environment is not supported"
+ msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
echo -e "Exiting..."
sleep 2
exit
-fi
+ fi
}
function arch_check() {
if [ "$(dpkg --print-architecture)" != "amd64" ]; then
- msg_error "This script will not work with PiMox! \n"
+ echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n"
+ echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n"
echo -e "Exiting..."
sleep 2
exit
@@ -125,7 +145,7 @@ function ssh_check() {
function exit-script() {
clear
- echo -e "β User exited script \n"
+ echo -e "\n${CROSS}${RD}User exited script${CL}\n"
exit
}
@@ -133,6 +153,7 @@ function default_settings() {
VMID="$NEXTID"
FORMAT=",efitype=4m"
MACHINE=""
+ DISK_SIZE="8G"
DISK_CACHE=""
HN="debian"
CPU_TYPE=""
@@ -143,19 +164,20 @@ function default_settings() {
VLAN=""
MTU=""
START_VM="yes"
- echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
- echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}"
- echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
- echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}"
- echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}"
- echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}"
- echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}"
- echo -e "${DGN}Using Bridge: ${BGN}${BRG}${CL}"
- echo -e "${DGN}Using MAC Address: ${BGN}${MAC}${CL}"
- echo -e "${DGN}Using VLAN: ${BGN}Default${CL}"
- echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
- echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}"
- echo -e "${BL}Creating a Debian 12 VM using the above default settings${CL}"
+ echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
+ echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
+ echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}"
+ echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
+ echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
+ echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}"
+ echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}"
+ echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}"
+ echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}"
+ echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}"
+ echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
+ echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above default settings${CL}"
}
function advanced_settings() {
@@ -169,7 +191,7 @@ function advanced_settings() {
sleep 2
continue
fi
- echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}"
+ echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}"
break
else
exit-script
@@ -181,27 +203,42 @@ function advanced_settings() {
"q35" "Machine q35" OFF \
3>&1 1>&2 2>&3); then
if [ $MACH = q35 ]; then
- echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}"
+ echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
FORMAT=""
MACHINE=" -machine q35"
else
- echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}"
+ echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
FORMAT=",efitype=4m"
MACHINE=""
fi
else
exit-script
fi
+
+ if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ')
+ if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then
+ DISK_SIZE="${DISK_SIZE}G"
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}"
+ elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}"
+ else
+ echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}"
+ exit-script
+ fi
+ else
+ exit-script
+ fi
if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
"0" "None (Default)" ON \
"1" "Write Through" OFF \
3>&1 1>&2 2>&3); then
if [ $DISK_CACHE = "1" ]; then
- echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}"
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}"
DISK_CACHE="cache=writethrough,"
else
- echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
+ echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
DISK_CACHE=""
fi
else
@@ -211,10 +248,10 @@ function advanced_settings() {
if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 debian --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z $VM_NAME ]; then
HN="debian"
- echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
+ echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}"
else
HN=$(echo ${VM_NAME,,} | tr -d ' ')
- echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
+ echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}"
fi
else
exit-script
@@ -225,10 +262,10 @@ function advanced_settings() {
"1" "Host" OFF \
3>&1 1>&2 2>&3); then
if [ $CPU_TYPE1 = "1" ]; then
- echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}"
+ echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}"
CPU_TYPE=" -cpu host"
else
- echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}"
+ echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
CPU_TYPE=""
fi
else
@@ -238,9 +275,9 @@ function advanced_settings() {
if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z $CORE_COUNT ]; then
CORE_COUNT="2"
- echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
+ echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}"
else
- echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
+ echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}"
fi
else
exit-script
@@ -249,9 +286,9 @@ function advanced_settings() {
if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z $RAM_SIZE ]; then
RAM_SIZE="2048"
- echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
+ echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}"
else
- echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
+ echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}"
fi
else
exit-script
@@ -260,9 +297,9 @@ function advanced_settings() {
if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z $BRG ]; then
BRG="vmbr0"
- echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
+ echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
else
- echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
+ echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
fi
else
exit-script
@@ -271,10 +308,10 @@ function advanced_settings() {
if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z $MAC1 ]; then
MAC="$GEN_MAC"
- echo -e "${DGN}Using MAC Address: ${BGN}$MAC${CL}"
+ echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}"
else
MAC="$MAC1"
- echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
+ echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}"
fi
else
exit-script
@@ -284,10 +321,10 @@ function advanced_settings() {
if [ -z $VLAN1 ]; then
VLAN1="Default"
VLAN=""
- echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
+ echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}"
else
VLAN=",tag=$VLAN1"
- echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
+ echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}"
fi
else
exit-script
@@ -297,28 +334,28 @@ function advanced_settings() {
if [ -z $MTU1 ]; then
MTU1="Default"
MTU=""
- echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
+ echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}"
else
MTU=",mtu=$MTU1"
- echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
+ echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}"
fi
else
exit-script
fi
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then
- echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}"
+ echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
START_VM="yes"
else
- echo -e "${DGN}Start VM when completed: ${BGN}no${CL}"
+ echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}"
START_VM="no"
fi
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Debian 12 VM?" --no-button Do-Over 10 58); then
- echo -e "${RD}Creating a Debian 12 VM using the above advanced settings${CL}"
+ echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above advanced settings${CL}"
else
header_info
- echo -e "${RD}Using Advanced Settings${CL}"
+ echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}"
advanced_settings
fi
}
@@ -326,11 +363,11 @@ function advanced_settings() {
function start_script() {
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
header_info
- echo -e "${BL}Using Default Settings${CL}"
+ echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}"
default_settings
else
header_info
- echo -e "${RD}Using Advanced Settings${CL}"
+ echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}"
advanced_settings
fi
}
@@ -402,16 +439,16 @@ done
msg_info "Creating a Debian 12 VM"
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
- -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
+ -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
qm set $VMID \
-efidisk0 ${DISK0_REF}${FORMAT} \
- -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \
+ -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \
-boot order=scsi0 \
-serial0 socket >/dev/null
-qm resize $VMID scsi0 4G >/dev/null
- DESCRIPTION=$(cat <
@@ -440,13 +477,21 @@ qm resize $VMID scsi0 4G >/dev/null
EOF
)
- qm set "$VMID" -description "$DESCRIPTION" >/dev/null
-
+qm set "$VMID" -description "$DESCRIPTION" >/dev/null
+if [ -n "$DISK_SIZE" ]; then
+ msg_info "Resizing disk to $DISK_SIZE GB"
+ qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null
+else
+ msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB"
+ qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null
+fi
+
msg_ok "Created a Debian 12 VM ${CL}${BL}(${HN})"
if [ "$START_VM" == "yes" ]; then
msg_info "Starting Debian 12 VM"
qm start $VMID
msg_ok "Started Debian 12 VM"
fi
+
msg_ok "Completed Successfully!\n"
echo "More Info at https://github.com/community-scripts/ProxmoxVE/discussions/836"
diff --git a/vm/docker-vm.sh b/vm/docker-vm.sh
new file mode 100644
index 000000000..db855d504
--- /dev/null
+++ b/vm/docker-vm.sh
@@ -0,0 +1,468 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2025 community-scripts ORG
+# Author: thost96 (thost96)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+function header_info {
+ clear
+ cat <<"EOF"
+ ____ __ _ ____ ___
+ / __ \____ _____/ /_____ _____ | | / / |/ /
+ / / / / __ \/ ___/ //_/ _ \/ ___/ | | / / /|_/ /
+ / /_/ / /_/ / /__/ ,< / __/ / | |/ / / / /
+/_____/\____/\___/_/|_|\___/_/ |___/_/ /_/
+
+EOF
+}
+header_info
+echo -e "\n Loading..."
+GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
+NEXTID=$(pvesh get /cluster/nextid)
+
+YW=$(echo "\033[33m")
+BL=$(echo "\033[36m")
+HA=$(echo "\033[1;34m")
+RD=$(echo "\033[01;31m")
+BGN=$(echo "\033[4;92m")
+GN=$(echo "\033[1;92m")
+DGN=$(echo "\033[32m")
+CL=$(echo "\033[m")
+BFR="\\r\\033[K"
+HOLD="-"
+CM="${GN}β${CL}"
+CROSS="${RD}β${CL}"
+THIN="discard=on,ssd=1,"
+set -e
+trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
+trap cleanup EXIT
+function error_handler() {
+ local exit_code="$?"
+ local line_number="$1"
+ local command="$2"
+ local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
+ echo -e "\n$error_message\n"
+ cleanup_vmid
+}
+
+function cleanup_vmid() {
+ if qm status $VMID &>/dev/null; then
+ qm stop $VMID &>/dev/null
+ qm destroy $VMID &>/dev/null
+ fi
+}
+
+function cleanup() {
+ popd >/dev/null
+ rm -rf $TEMP_DIR
+}
+
+TEMP_DIR=$(mktemp -d)
+pushd $TEMP_DIR >/dev/null
+if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Docker VM" --yesno "This will create a New Docker VM. Proceed?" 10 58; then
+ :
+else
+ header_info && echo -e "β User exited script \n" && exit
+fi
+
+function msg_info() {
+ local msg="$1"
+ echo -ne " ${HOLD} ${YW}${msg}..."
+}
+
+function msg_ok() {
+ local msg="$1"
+ echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
+}
+
+function msg_error() {
+ local msg="$1"
+ echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
+}
+
+function check_root() {
+ if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then
+ clear
+ msg_error "Please run this script as root."
+ echo -e "\nExiting..."
+ sleep 2
+ exit
+ fi
+}
+
+function pve_check() {
+ if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then
+ msg_error "This version of Proxmox Virtual Environment is not supported"
+ echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
+ echo -e "Exiting..."
+ sleep 2
+ exit
+fi
+}
+
+function arch_check() {
+ if [ "$(dpkg --print-architecture)" != "amd64" ]; then
+ if [ "$(dpkg --print-architecture)" != "arm64" ]; then
+ msg_error "This script will not work with your CPU Architekture \n"
+ echo -e "Exiting..."
+ sleep 2
+ exit
+ fi
+ fi
+}
+
+function ssh_check() {
+ if command -v pveversion >/dev/null 2>&1; then
+ if [ -n "${SSH_CLIENT:+x}" ]; then
+ if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then
+ echo "you've been warned"
+ else
+ clear
+ exit
+ fi
+ fi
+ fi
+}
+
+function exit-script() {
+ clear
+ echo -e "β User exited script \n"
+ exit
+}
+
+function default_settings() {
+ VMID="$NEXTID"
+ FORMAT=",efitype=4m"
+ MACHINE=""
+ DISK_CACHE=""
+ HN="docker"
+ CPU_TYPE=""
+ CORE_COUNT="2"
+ RAM_SIZE="4096"
+ BRG="vmbr0"
+ MAC="$GEN_MAC"
+ VLAN=""
+ MTU=""
+ START_VM="yes"
+ echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
+ echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}"
+ echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
+ echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}"
+ echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}"
+ echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}"
+ echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}"
+ echo -e "${DGN}Using Bridge: ${BGN}${BRG}${CL}"
+ echo -e "${DGN}Using MAC Address: ${BGN}${MAC}${CL}"
+ echo -e "${DGN}Using VLAN: ${BGN}Default${CL}"
+ echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
+ echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}"
+ echo -e "${BL}Creating a Docker VM using the above default settings${CL}"
+}
+
+function advanced_settings() {
+ while true; do
+ if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z "$VMID" ]; then
+ VMID="$NEXTID"
+ fi
+ if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
+ echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
+ sleep 2
+ continue
+ fi
+ echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}"
+ break
+ else
+ exit-script
+ fi
+ done
+
+ if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \
+ "i440fx" "Machine i440fx" ON \
+ "q35" "Machine q35" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ $MACH = q35 ]; then
+ echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}"
+ FORMAT=""
+ MACHINE=" -machine q35"
+ else
+ echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}"
+ FORMAT=",efitype=4m"
+ MACHINE=""
+ fi
+ else
+ exit-script
+ fi
+
+ if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
+ "0" "None (Default)" ON \
+ "1" "Write Through" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ $DISK_CACHE = "1" ]; then
+ echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}"
+ DISK_CACHE="cache=writethrough,"
+ else
+ echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
+ DISK_CACHE=""
+ fi
+ else
+ exit-script
+ fi
+
+ if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 docker --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $VM_NAME ]; then
+ HN="docker"
+ echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
+ else
+ HN=$(echo ${VM_NAME,,} | tr -d ' ')
+ echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
+ "0" "KVM64 (Default)" ON \
+ "1" "Host" OFF \
+ 3>&1 1>&2 2>&3); then
+ if [ $CPU_TYPE1 = "1" ]; then
+ echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}"
+ CPU_TYPE=" -cpu host"
+ else
+ echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}"
+ CPU_TYPE=""
+ fi
+ else
+ exit-script
+ fi
+
+ if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $CORE_COUNT ]; then
+ CORE_COUNT="2"
+ echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
+ else
+ echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 4096 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $RAM_SIZE ]; then
+ RAM_SIZE="4096"
+ echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
+ else
+ echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $BRG ]; then
+ BRG="vmbr0"
+ echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
+ else
+ echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $MAC1 ]; then
+ MAC="$GEN_MAC"
+ echo -e "${DGN}Using MAC Address: ${BGN}$MAC${CL}"
+ else
+ MAC="$MAC1"
+ echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $VLAN1 ]; then
+ VLAN1="Default"
+ VLAN=""
+ echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
+ else
+ VLAN=",tag=$VLAN1"
+ echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
+ if [ -z $MTU1 ]; then
+ MTU1="Default"
+ MTU=""
+ echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
+ else
+ MTU=",mtu=$MTU1"
+ echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
+ fi
+ else
+ exit-script
+ fi
+
+ if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then
+ echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}"
+ START_VM="yes"
+ else
+ echo -e "${DGN}Start VM when completed: ${BGN}no${CL}"
+ START_VM="no"
+ fi
+
+ if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Docker VM?" --no-button Do-Over 10 58); then
+ echo -e "${RD}Creating a Docker VM using the above advanced settings${CL}"
+ else
+ header_info
+ echo -e "${RD}Using Advanced Settings${CL}"
+ advanced_settings
+ fi
+}
+
+function start_script() {
+ if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
+ header_info
+ echo -e "${BL}Using Default Settings${CL}"
+ default_settings
+ else
+ header_info
+ echo -e "${RD}Using Advanced Settings${CL}"
+ advanced_settings
+ fi
+}
+
+check_root
+arch_check
+pve_check
+ssh_check
+start_script
+
+msg_info "Validating Storage"
+while read -r line; do
+ TAG=$(echo $line | awk '{print $1}')
+ TYPE=$(echo $line | awk '{printf "%-10s", $2}')
+ FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}')
+ ITEM=" Type: $TYPE Free: $FREE "
+ OFFSET=2
+ if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
+ MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
+ fi
+ STORAGE_MENU+=("$TAG" "$ITEM" "OFF")
+done < <(pvesm status -content images | awk 'NR>1')
+VALID=$(pvesm status -content images | awk 'NR>1')
+if [ -z "$VALID" ]; then
+ msg_error "Unable to detect a valid storage location."
+ exit
+elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then
+ STORAGE=${STORAGE_MENU[0]}
+else
+ while [ -z "${STORAGE:+x}" ]; do
+ STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \
+ "Which storage pool you would like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \
+ 16 $(($MSG_MAX_LENGTH + 23)) 6 \
+ "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit
+ done
+fi
+msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location."
+msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
+msg_info "Retrieving the URL for the Debian 12 Qcow2 Disk Image"
+URL="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-nocloud-$(dpkg --print-architecture).qcow2"
+sleep 2
+msg_ok "${CL}${BL}${URL}${CL}"
+wget -q --show-progress $URL
+echo -en "\e[1A\e[0K"
+FILE=$(basename $URL)
+msg_ok "Downloaded ${CL}${BL}${FILE}${CL}"
+
+STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}')
+case $STORAGE_TYPE in
+nfs | dir)
+ DISK_EXT=".qcow2"
+ DISK_REF="$VMID/"
+ DISK_IMPORT="-format qcow2"
+ THIN=""
+ ;;
+btrfs)
+ DISK_EXT=".raw"
+ DISK_REF="$VMID/"
+ DISK_IMPORT="-format raw"
+ FORMAT=",efitype=4m"
+ THIN=""
+ ;;
+esac
+for i in {0,1}; do
+ disk="DISK$i"
+ eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-}
+ eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk}
+done
+
+msg_info "Installing Pre-Requisite libguestfs-tools onto Host"
+apt-get -qq update && apt-get -qq install libguestfs-tools lsb-release -y >/dev/null
+msg_ok "Installed libguestfs-tools successfully"
+
+msg_info "Adding Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image"
+virt-customize -q -a "${FILE}" --install qemu-guest-agent,apt-transport-https,ca-certificates,curl,gnupg,software-properties-common,lsb-release >/dev/null &&
+virt-customize -q -a "${FILE}" --run-command "mkdir -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg" >/dev/null &&
+virt-customize -q -a "${FILE}" --run-command "echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable' > /etc/apt/sources.list.d/docker.list" >/dev/null &&
+virt-customize -q -a "${FILE}" --run-command "apt-get update -qq && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin" >/dev/null &&
+virt-customize -q -a "${FILE}" --run-command "systemctl enable docker" >/dev/null &&
+virt-customize -q -a "${FILE}" --run-command "echo -n > /etc/machine-id" >/dev/null
+msg_ok "Added Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image successfully"
+
+
+msg_info "Creating a Docker VM"
+qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
+ -name $HN -tags proxmox-helper-scripts,debian12,docker -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
+pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
+qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
+qm set $VMID \
+ -efidisk0 ${DISK0_REF}${FORMAT} \
+ -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \
+ -boot order=scsi0 \
+ -serial0 socket >/dev/null
+qm resize $VMID scsi0 8G >/dev/null
+qm set $VMID --agent enabled=1 >/dev/null
+
+ DESCRIPTION=$(cat <