mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	Compare commits
	
		
			80 Commits
		
	
	
		
			2025-08-01
			...
			2025-08-06
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					bd41b236df | ||
| 
						 | 
					229c7ce4b3 | ||
| 
						 | 
					cc8381d7f7 | ||
| 
						 | 
					dc5b9be9ae | ||
| 
						 | 
					993aff59d7 | ||
| 
						 | 
					f3844c664c | ||
| 
						 | 
					47b3f71992 | ||
| 
						 | 
					09c815e935 | ||
| 
						 | 
					f59d4960f1 | ||
| 
						 | 
					c53d1d004a | ||
| 
						 | 
					bbdda06297 | ||
| 
						 | 
					daab80aaf4 | ||
| 
						 | 
					9250f9fae9 | ||
| 
						 | 
					6fa371fffc | ||
| 
						 | 
					e85263078e | ||
| 
						 | 
					f9b0916885 | ||
| 
						 | 
					964e29cd9e | ||
| 
						 | 
					31932499a9 | ||
| 
						 | 
					b155881de9 | ||
| 
						 | 
					010435ecaf | ||
| 
						 | 
					0863d080a4 | ||
| 
						 | 
					99837db81a | ||
| 
						 | 
					b4df862579 | ||
| 
						 | 
					01c6eb3a67 | ||
| 
						 | 
					5aabc88723 | ||
| 
						 | 
					23340f5d24 | ||
| 
						 | 
					77dcf87e6a | ||
| 
						 | 
					d9cefc3777 | ||
| 
						 | 
					7d6806e1fb | ||
| 
						 | 
					86d438c3a1 | ||
| 
						 | 
					fdc381e501 | ||
| 
						 | 
					3b1b8a7da2 | ||
| 
						 | 
					96f2c9c990 | ||
| 
						 | 
					349827aa97 | ||
| 
						 | 
					4dc458c605 | ||
| 
						 | 
					b5b6048697 | ||
| 
						 | 
					dc5fcb83e8 | ||
| 
						 | 
					db86049a3e | ||
| 
						 | 
					e6ceca0bc7 | ||
| 
						 | 
					d24425efad | ||
| 
						 | 
					3dda41df94 | ||
| 
						 | 
					fc77ca85e4 | ||
| 
						 | 
					db09b9cc36 | ||
| 
						 | 
					9f933c1e56 | ||
| 
						 | 
					efe45185fc | ||
| 
						 | 
					0a56fee31e | ||
| 
						 | 
					20048d442a | ||
| 
						 | 
					b1be93155c | ||
| 
						 | 
					1e2eb31560 | ||
| 
						 | 
					ca701632e1 | ||
| 
						 | 
					c3c5a7584b | ||
| 
						 | 
					3cd1fc7bce | ||
| 
						 | 
					1c7a39438c | ||
| 
						 | 
					46728b01fe | ||
| 
						 | 
					e0abf63778 | ||
| 
						 | 
					4451f07990 | ||
| 
						 | 
					6776912a42 | ||
| 
						 | 
					b914fd95df | ||
| 
						 | 
					f33afd9163 | ||
| 
						 | 
					c811b51a0a | ||
| 
						 | 
					ccbf86196b | ||
| 
						 | 
					64366a0b34 | ||
| 
						 | 
					183c459549 | ||
| 
						 | 
					44e62f73d4 | ||
| 
						 | 
					2f97e14f4d | ||
| 
						 | 
					7cd5a8d771 | ||
| 
						 | 
					9846bfd067 | ||
| 
						 | 
					77c37a5552 | ||
| 
						 | 
					8efcab38a4 | ||
| 
						 | 
					201782552c | ||
| 
						 | 
					7433f7df0c | ||
| 
						 | 
					dde882f9e5 | ||
| 
						 | 
					b8bdf56297 | ||
| 
						 | 
					df504635a5 | ||
| 
						 | 
					158bdfc88e | ||
| 
						 | 
					4eaffda82d | ||
| 
						 | 
					074bb615e7 | ||
| 
						 | 
					7c0869e29b | ||
| 
						 | 
					7862d23866 | ||
| 
						 | 
					e1669c22de | 
							
								
								
									
										92
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -10,8 +10,100 @@
 | 
			
		||||
> [!CAUTION]
 | 
			
		||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
 | 
			
		||||
 | 
			
		||||
## 2025-08-07
 | 
			
		||||
 | 
			
		||||
## 2025-08-06
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - [core] better y/N handling for ressource check [@MickLesk](https://github.com/MickLesk) ([#6608](https://github.com/community-scripts/ProxmoxVE/pull/6608))
 | 
			
		||||
    - fix: update Pulse scripts for v4 Go rewrite support [@rcourtman](https://github.com/rcourtman) ([#6574](https://github.com/community-scripts/ProxmoxVE/pull/6574))
 | 
			
		||||
    - OpenProject: Fix missing apt update [@tremor021](https://github.com/tremor021) ([#6598](https://github.com/community-scripts/ProxmoxVE/pull/6598))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - PVE9: Remove Beta Whiptail / add correct version check [@MickLesk](https://github.com/MickLesk) ([#6599](https://github.com/community-scripts/ProxmoxVE/pull/6599))
 | 
			
		||||
 | 
			
		||||
## 2025-08-05
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - NIC offloading: e1000 support [@rcastley](https://github.com/rcastley) ([#6575](https://github.com/community-scripts/ProxmoxVE/pull/6575))
 | 
			
		||||
 | 
			
		||||
  - #### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
    - Temporary Remove: SearXNG [@MickLesk](https://github.com/MickLesk) ([#6578](https://github.com/community-scripts/ProxmoxVE/pull/6578))
 | 
			
		||||
 | 
			
		||||
  - #### 🔧 Refactor
 | 
			
		||||
 | 
			
		||||
    - Refactor: Prometheus Alertmanager [@tremor021](https://github.com/tremor021) ([#6577](https://github.com/community-scripts/ProxmoxVE/pull/6577))
 | 
			
		||||
 | 
			
		||||
## 2025-08-04
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
  - Tududi ([#6534](https://github.com/community-scripts/ProxmoxVE/pull/6534))
 | 
			
		||||
- ots ([#6532](https://github.com/community-scripts/ProxmoxVE/pull/6532))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - MySpeed: fix update and copy old tests back [@MickLesk](https://github.com/MickLesk) ([#6550](https://github.com/community-scripts/ProxmoxVE/pull/6550))
 | 
			
		||||
    - Composer: PATH Issues when updating [@MickLesk](https://github.com/MickLesk) ([#6543](https://github.com/community-scripts/ProxmoxVE/pull/6543))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - Feat: enable tun for VPN services (wireguard) [@MickLesk](https://github.com/MickLesk) ([#6562](https://github.com/community-scripts/ProxmoxVE/pull/6562))
 | 
			
		||||
    - turnkey: add hostname & Fix TUN access [@masterofrpm](https://github.com/masterofrpm) ([#6512](https://github.com/community-scripts/ProxmoxVE/pull/6512))
 | 
			
		||||
    - Increase: Core Network check (pre-LXC Creation)  [@MickLesk](https://github.com/MickLesk) ([#6546](https://github.com/community-scripts/ProxmoxVE/pull/6546))
 | 
			
		||||
 | 
			
		||||
  - #### 🔧 Refactor
 | 
			
		||||
 | 
			
		||||
    - Refactor: PrivateBin [@tremor021](https://github.com/tremor021) ([#6559](https://github.com/community-scripts/ProxmoxVE/pull/6559))
 | 
			
		||||
    - Refactor: PocketID [@tremor021](https://github.com/tremor021) ([#6556](https://github.com/community-scripts/ProxmoxVE/pull/6556))
 | 
			
		||||
    - Refactor: Pocketbase [@tremor021](https://github.com/tremor021) ([#6554](https://github.com/community-scripts/ProxmoxVE/pull/6554))
 | 
			
		||||
    - Refactor: NocoDB [@tremor021](https://github.com/tremor021) ([#6548](https://github.com/community-scripts/ProxmoxVE/pull/6548))
 | 
			
		||||
    - Refactor: PairDrop [@tremor021](https://github.com/tremor021) ([#6528](https://github.com/community-scripts/ProxmoxVE/pull/6528))
 | 
			
		||||
 | 
			
		||||
## 2025-08-03
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - docmost: remove build step due new version [@MickLesk](https://github.com/MickLesk) ([#6513](https://github.com/community-scripts/ProxmoxVE/pull/6513))
 | 
			
		||||
    - Fix: Komga uses .komga as storage / so it fails after install [@MickLesk](https://github.com/MickLesk) ([#6517](https://github.com/community-scripts/ProxmoxVE/pull/6517))
 | 
			
		||||
 | 
			
		||||
  - #### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
    - Remove: Ubuntu 24.10-VM [@MickLesk](https://github.com/MickLesk) ([#6515](https://github.com/community-scripts/ProxmoxVE/pull/6515))
 | 
			
		||||
 | 
			
		||||
  - #### 🔧 Refactor
 | 
			
		||||
 | 
			
		||||
    - Refactor: openHAB [@tremor021](https://github.com/tremor021) ([#6524](https://github.com/community-scripts/ProxmoxVE/pull/6524))
 | 
			
		||||
    - Refactor: OpenProject [@tremor021](https://github.com/tremor021) ([#6525](https://github.com/community-scripts/ProxmoxVE/pull/6525))
 | 
			
		||||
 | 
			
		||||
## 2025-08-02
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - Alternative connectivity checks for LXC [@mariano-dagostino](https://github.com/mariano-dagostino) ([#6472](https://github.com/community-scripts/ProxmoxVE/pull/6472))
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Immich: fix copy error during install [@vhsdream](https://github.com/vhsdream) ([#6497](https://github.com/community-scripts/ProxmoxVE/pull/6497))
 | 
			
		||||
    - MagicMirror: Fix install process [@tremor021](https://github.com/tremor021) ([#6492](https://github.com/community-scripts/ProxmoxVE/pull/6492))
 | 
			
		||||
    - chore: BookLore repo change [@vhsdream](https://github.com/vhsdream) ([#6493](https://github.com/community-scripts/ProxmoxVE/pull/6493))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - VictoriaMetrics: Make VictoriaLogs optional add-on [@tremor021](https://github.com/tremor021) ([#6489](https://github.com/community-scripts/ProxmoxVE/pull/6489))
 | 
			
		||||
 | 
			
		||||
## 2025-08-01
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ var_disk="${var_disk:-1}"
 | 
			
		||||
var_os="${var_os:-alpine}"
 | 
			
		||||
var_version="${var_version:-3.22}"
 | 
			
		||||
var_unprivileged="${var_unprivileged:-1}"
 | 
			
		||||
var_tun="${var_tun:-1}"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
 | 
			
		||||
# 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/adityachandelgit/BookLore
 | 
			
		||||
# Source: https://github.com/booklore-app/BookLore
 | 
			
		||||
 | 
			
		||||
APP="BookLore"
 | 
			
		||||
var_tags="${var_tags:-books;library}"
 | 
			
		||||
@@ -29,13 +29,13 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/adityachandelgit/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//')
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/booklore-app/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat ~/.booklore 2>/dev/null)" ]] || [[ ! -f ~/.booklore ]]; then
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop booklore
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "booklore" "adityachandelgit/BookLore"
 | 
			
		||||
    fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore"
 | 
			
		||||
 | 
			
		||||
    msg_info "Building Frontend"
 | 
			
		||||
    cd /opt/booklore/booklore-ui
 | 
			
		||||
@@ -45,7 +45,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    msg_info "Building Backend"
 | 
			
		||||
    cd /opt/booklore/booklore-api
 | 
			
		||||
    APP_VERSION=$(curl -fsSL https://api.github.com/repos/adityachandelgit/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//')
 | 
			
		||||
    APP_VERSION=$(curl -fsSL https://api.github.com/repos/booklore-app/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//')
 | 
			
		||||
    yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml
 | 
			
		||||
    $STD ./gradlew clean build --no-daemon
 | 
			
		||||
    mkdir -p /opt/booklore/dist
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ function update_script() {
 | 
			
		||||
        systemctl stop cleanuparr
 | 
			
		||||
        msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
        fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "$RELEASE" "/opt/cleanuparr" "*linux-amd64.zip"
 | 
			
		||||
        fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "latest" "/opt/cleanuparr" "*linux-amd64.zip"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting ${APP}"
 | 
			
		||||
        systemctl start cleanuparr
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,6 @@ function update_script() {
 | 
			
		||||
    mv /opt/.env /opt/docmost/.env
 | 
			
		||||
    mv /opt/data /opt/docmost/data
 | 
			
		||||
    $STD pnpm install --force
 | 
			
		||||
    $STD pnpm nx run server:build # Dirty fix https://github.com/community-scripts/ProxmoxVE/issues/6377
 | 
			
		||||
    $STD pnpm build
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/ots
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/ots
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
   ____  ___________
 | 
			
		||||
  / __ \/_  __/ ___/
 | 
			
		||||
 / / / / / /  \__ \ 
 | 
			
		||||
/ /_/ / / /  ___/ / 
 | 
			
		||||
\____/ /_/  /____/  
 | 
			
		||||
                    
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/tududi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/tududi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
  ______          __          ___ 
 | 
			
		||||
 /_  __/_  ______/ /_  ______/ (_)
 | 
			
		||||
  / / / / / / __  / / / / __  / / 
 | 
			
		||||
 / / / /_/ / /_/ / /_/ / /_/ / /  
 | 
			
		||||
/_/  \__,_/\__,_/\__,_/\__,_/_/   
 | 
			
		||||
                                  
 | 
			
		||||
@@ -35,7 +35,7 @@ function update_script() {
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    rm -f /opt/komga/komga.jar
 | 
			
		||||
    USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "komga" "gotson/komga" "singlefile" "latest" "/opt/komga" "komga*.jar"
 | 
			
		||||
    USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "komga-org" "gotson/komga" "singlefile" "latest" "/opt/komga" "komga*.jar"
 | 
			
		||||
    mv /opt/komga/komga-*.jar /opt/komga/komga.jar
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
 
 | 
			
		||||
@@ -51,6 +51,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    msg_info "Configuring MagicMirror"
 | 
			
		||||
    cd /opt/magicmirror
 | 
			
		||||
    sed -i -E 's/("postinstall": )".*"/\1""/; s/("prepare": )".*"/\1""/' package.json
 | 
			
		||||
    $STD npm run install-mm
 | 
			
		||||
    cp /opt/magicmirror-backup/config.js /opt/magicmirror/config/
 | 
			
		||||
    if [[ -f /opt/magicmirror-backup/custom.css ]]; then
 | 
			
		||||
 
 | 
			
		||||
@@ -44,6 +44,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Updating ${APP} to ${RELEASE}"
 | 
			
		||||
    cd /opt/myspeed
 | 
			
		||||
    $STD npm install
 | 
			
		||||
    cp -r /opt/myspeed_bak/data/* /opt/myspeed/data/
 | 
			
		||||
    msg_ok "Updated ${APP} to ${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP} Service"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								ct/nocodb.sh
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								ct/nocodb.sh
									
									
									
									
									
								
							@@ -27,15 +27,24 @@ function update_script() {
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    systemctl stop nocodb.service
 | 
			
		||||
    cd /opt/nocodb
 | 
			
		||||
    rm -rf nocodb
 | 
			
		||||
    curl -fsSL http://get.nocodb.com/linux-x64 -o nocodb -L
 | 
			
		||||
    chmod +x nocodb
 | 
			
		||||
    systemctl start nocodb.service
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/nocodb/nocodb/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
    if [[ ! -f ~/.nocodb ]] || [[ "${RELEASE}" != "$(cat ~/.nocodb)" ]]; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    systemctl stop nocodb
 | 
			
		||||
    msg_ok "Stopped Service"
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "nocodb" "nocodb/nocodb" "singlefile" "latest" "/opt/nocodb/" "Noco-linux-x64"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start nocodb
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
    exit
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -45,4 +54,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/dashboard${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/dashboard${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -42,4 +42,4 @@ msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using one of the following URLs:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8443${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										58
									
								
								ct/ots.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ct/ots.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: bvdberg01
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/Luzifer/ots
 | 
			
		||||
 | 
			
		||||
APP="OTS"
 | 
			
		||||
var_tags="${var_tags:-secrets-sharer}"
 | 
			
		||||
var_cpu="${var_cpu:-1}"
 | 
			
		||||
var_ram="${var_ram:-512}"
 | 
			
		||||
var_disk="${var_disk:-3}"
 | 
			
		||||
var_os="${var_os:-debian}"
 | 
			
		||||
var_version="${var_version:-12}"
 | 
			
		||||
var_unprivileged="${var_unprivileged:-1}"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/ots ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/Luzifer/ots/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat ~/.ots 2>/dev/null)" ]] || [[ ! -f ~/.ots ]]; then
 | 
			
		||||
        msg_info "Stopping ${APP} Service"
 | 
			
		||||
        systemctl stop ots
 | 
			
		||||
        systemctl stop nginx
 | 
			
		||||
        msg_ok "Stopped ${APP} Service"
 | 
			
		||||
 | 
			
		||||
        fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_amd64.tgz"
 | 
			
		||||
 | 
			
		||||
        msg_info "Stopping ${APP} Service"
 | 
			
		||||
        systemctl start ots
 | 
			
		||||
        systemctl start nginx
 | 
			
		||||
        msg_ok "Stopped ${APP} Service"
 | 
			
		||||
        msg_ok "Updated Successfully"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}${CL}"
 | 
			
		||||
@@ -27,13 +27,28 @@ function update_script() {
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP"
 | 
			
		||||
    systemctl stop pairdrop
 | 
			
		||||
    cd /opt/pairdrop
 | 
			
		||||
    git pull
 | 
			
		||||
    npm install
 | 
			
		||||
    systemctl start pairdrop
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/schlagmichdoch/PairDrop/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    if [[ ! -f ~/.pairdrop ]] || [[ "${RELEASE}" != "$(cat ~/.pairdrop)" ]]; then
 | 
			
		||||
      msg_info "Stopping ${APP}"
 | 
			
		||||
      systemctl stop pairdrop
 | 
			
		||||
      msg_ok "Stopped ${APP}"
 | 
			
		||||
      
 | 
			
		||||
      fetch_and_deploy_gh_release "pairdrop" "schlagmichdoch/PairDrop" "tarball"
 | 
			
		||||
 | 
			
		||||
      msg_info "Configuring PairDrop"
 | 
			
		||||
      cd /opt/pairdrop
 | 
			
		||||
      $STD npm install
 | 
			
		||||
      msg_ok "Configured PairDrop"
 | 
			
		||||
 | 
			
		||||
      msg_info "Starting ${APP}"
 | 
			
		||||
      systemctl start pairdrop
 | 
			
		||||
      msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
      msg_ok "Updated Successfully"
 | 
			
		||||
    else
 | 
			
		||||
      msg_ok "No update required. ${APP} is already at ${RELEASE}."
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -44,4 +59,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,18 +27,26 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Stopping ${APP}"
 | 
			
		||||
  systemctl stop pocketbase
 | 
			
		||||
  msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
  /opt/pocketbase/pocketbase update
 | 
			
		||||
  msg_ok "Updated ${APP}"
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/pocketbase/pocketbase/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat ~/.pocketbase 2>/dev/null)" ]] || [[ ! -f ~/.pocketbase ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop pocketbase
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
  msg_info "Starting ${APP}"
 | 
			
		||||
  systemctl start pocketbase
 | 
			
		||||
  msg_ok "Started ${APP}"
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    /opt/pocketbase/pocketbase update
 | 
			
		||||
    echo "${RELEASE}" > ~/.pocketbase
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start pocketbase
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
    
 | 
			
		||||
    msg_ok "Update Successful"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -49,4 +57,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/_/${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/_/${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -29,9 +29,10 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  [[ -f /opt/${APP}_version.txt ]] && mv /opt/${APP}_version.txt ~/.pocket-id
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/pocket-id/pocket-id/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
    if [[ "$(cat /opt/${APP}_version.txt)" < "1.0.0" ]]; then
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat ~/.pocket-id)" ]] || [[ ! -f ~/.pocket-id ]]; then
 | 
			
		||||
    if [[ "$(cat ~/.pocket-id)" < "1.0.0" ]]; then
 | 
			
		||||
      msg_info "Migrating ${APP} to v${RELEASE}"
 | 
			
		||||
      systemctl -q disable --now pocketid-backend pocketid-frontend caddy
 | 
			
		||||
      mv /etc/caddy/Caddyfile ~/Caddyfile.bak
 | 
			
		||||
@@ -58,19 +59,19 @@ function update_script() {
 | 
			
		||||
      mv /opt/data /opt/pocket-id
 | 
			
		||||
      msg_ok "Migration complete. The reverse proxy port has been changed to 1411."
 | 
			
		||||
    else
 | 
			
		||||
      msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
      msg_info "Stopping ${APP}"
 | 
			
		||||
      systemctl stop pocketid
 | 
			
		||||
      msg_ok "Stopped ${APP}"
 | 
			
		||||
      cp /opt/pocket-id/.env /opt/env
 | 
			
		||||
    fi
 | 
			
		||||
    curl -fsSL "https://github.com/pocket-id/pocket-id/releases/download/v${RELEASE}/pocket-id-linux-amd64" -o /opt/pocket-id/pocket-id
 | 
			
		||||
    chmod u+x /opt/pocket-id/pocket-id
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-amd64"
 | 
			
		||||
    mv /opt/env /opt/pocket-id/.env
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start pocketid
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Update Successful"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,22 +27,25 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/PrivateBin/PrivateBin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
  if [[ ! -f ~/.privatebin ]] || [[ "${RELEASE}" != "$(cat ~/.privatebin)" ]]; then
 | 
			
		||||
    msg_info "Creating backup"
 | 
			
		||||
    cp -f /opt/privatebin/cfg/conf.php /tmp/privatebin_conf.bak
 | 
			
		||||
    curl -fsSL "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${RELEASE}.zip")
 | 
			
		||||
    $STD unzip ${RELEASE}.zip
 | 
			
		||||
    msg_ok "Backup created"
 | 
			
		||||
 | 
			
		||||
    rm -rf /opt/privatebin/*
 | 
			
		||||
    mv PrivateBin-${RELEASE}/* /opt/privatebin/
 | 
			
		||||
    fetch_and_deploy_gh_release "privatebin" "PrivateBin/PrivateBin" "tarball"
 | 
			
		||||
 | 
			
		||||
    msg_info "Configuring ${APP}"
 | 
			
		||||
    mkdir -p /opt/privatebin/data
 | 
			
		||||
    mv /tmp/privatebin_conf.bak /opt/privatebin/cfg/conf.php
 | 
			
		||||
    chown -R www-data:www-data /opt/privatebin
 | 
			
		||||
    chmod -R 0755 /opt/privatebin/data
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    rm -rf ${RELEASE}.zip PrivateBin-${RELEASE}
 | 
			
		||||
    chmod -R 0755 /opt/privatebin/data}
 | 
			
		||||
    systemctl reload nginx php8.2-fpm
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
    msg_ok "Configured ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Successfully updated"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -27,24 +27,19 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/prometheus/alertmanager/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
  if [[ ! -f ~/.alertmanager ]] || [[ "${RELEASE}" != "$(cat ~/.alertmanager)" ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop prometheus-alertmanager
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    curl -fsSL "https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz" -o $(basename "https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz")
 | 
			
		||||
    tar -xf alertmanager-${RELEASE}.linux-amd64.tar.gz
 | 
			
		||||
    cp -rf alertmanager-${RELEASE}.linux-amd64/alertmanager alertmanager-${RELEASE}.linux-amd64/amtool /usr/local/bin/
 | 
			
		||||
    rm -rf alertmanager-${RELEASE}.linux-amd64 alertmanager-${RELEASE}.linux-amd64.tar.gz
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
    fetch_and_deploy_gh_release "alertmanager" "prometheus/alertmanager" "prebuild" "latest" "/usr/local/bin/" "alertmanager*linux-amd64.tar.gz"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start prometheus-alertmanager
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
    
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								ct/pulse.sh
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								ct/pulse.sh
									
									
									
									
									
								
							@@ -23,42 +23,34 @@ function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ -d /opt/pulse-monitor ]]; then
 | 
			
		||||
  msg_error "An old installation was detected. Please recreate the LXC from scratch (https://github.com/community-scripts/ProxmoxVE/pull/4848)"
 | 
			
		||||
  exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  if [[ ! -d /opt/pulse ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/rcourtman/Pulse/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
 | 
			
		||||
  if [[ ! -f ~/.pulse ]]; then
 | 
			
		||||
    msg_error "Old Installation Found! Please recreate the container due big changes in the software."
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/rcourtman/Pulse/releases/latest | jq -r '.tag_name' | sed 's/^v//')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat ~/.pulse 2>/dev/null)" ]] || [[ ! -f ~/.pulse ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop pulse
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating Pulse"
 | 
			
		||||
    temp_file=$(mktemp)
 | 
			
		||||
    mkdir -p /opt/pulse
 | 
			
		||||
    rm -rf /opt/pulse/*
 | 
			
		||||
    curl -fsSL "https://github.com/rcourtman/Pulse/releases/download/v${RELEASE}/pulse-v${RELEASE}.tar.gz" -o "$temp_file"
 | 
			
		||||
    tar zxf "$temp_file" --strip-components=1 -C /opt/pulse
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated Pulse to ${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Setting permissions for /opt/pulse..."
 | 
			
		||||
    chown -R pulse:pulse "/opt/pulse"
 | 
			
		||||
    find "/opt/pulse" -type d -exec chmod 755 {} \;
 | 
			
		||||
    find "/opt/pulse" -type f -exec chmod 644 {} \;
 | 
			
		||||
    msg_ok "Set permissions."
 | 
			
		||||
    fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "*-linux-amd64.tar.gz"
 | 
			
		||||
    chown -R pulse:pulse /etc/pulse /opt/pulse
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start pulse
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}."
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit  
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -27,10 +27,11 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  sed -i 's/^\([[:space:]]*limiter:\)[[:space:]]*true/\1 false/' /etc/searxng/settings.yml
 | 
			
		||||
  if cd /usr/local/searxng/searxng-src && git pull | grep -q 'Already up to date'; then
 | 
			
		||||
    msg_ok "There is currently no update available."
 | 
			
		||||
  fi
 | 
			
		||||
  msg_ok "There is currently no update available."
 | 
			
		||||
  # sed -i 's/^\([[:space:]]*limiter:\)[[:space:]]*true/\1 false/' /etc/searxng/settings.yml
 | 
			
		||||
  # if cd /usr/local/searxng/searxng-src && git pull | grep -q 'Already up to date'; then
 | 
			
		||||
  #   msg_ok "There is currently no update available."
 | 
			
		||||
  # fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										72
									
								
								ct/tududi.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								ct/tududi.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: vhsdream
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://tududi.com
 | 
			
		||||
 | 
			
		||||
APP="Tududi"
 | 
			
		||||
var_tags="${var_tags:-todo-app}"
 | 
			
		||||
var_cpu="${var_cpu:-2}"
 | 
			
		||||
var_ram="${var_ram:-2048}"
 | 
			
		||||
var_disk="${var_disk:-4}"
 | 
			
		||||
var_os="${var_os:-debian}"
 | 
			
		||||
var_version="${var_version:-12}"
 | 
			
		||||
var_unprivileged="${var_unprivileged:-1}"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/tududi ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/chrisvel/tududi/releases/latest | yq '.tag_name' | sed 's/^v//')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat ~/.tududi 2>/dev/null)" ]] || [[ ! -f ~/.tududi ]]; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    systemctl stop tududi
 | 
			
		||||
    msg_ok "Stopped Service"
 | 
			
		||||
 | 
			
		||||
    msg_info "Remove and backup Files"
 | 
			
		||||
    cp /opt/tududi/backend/.env /opt/tududi.env
 | 
			
		||||
    rm -rf /opt/tududi/backend/dist
 | 
			
		||||
    msg_ok "Backup and removed Files"
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "tududi" "chrisvel/tududi"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    cd /opt/tududi
 | 
			
		||||
    $STD npm install
 | 
			
		||||
    export NODE_ENV=production
 | 
			
		||||
    $STD npm run frontend:build
 | 
			
		||||
    mv ./dist ./backend
 | 
			
		||||
    mv ./public/locales ./backend/dist
 | 
			
		||||
    mv ./public/favicon.* ./backend/dist
 | 
			
		||||
    mv /opt/tududi.env /opt/tududi/.env
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start tududi
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "Already up to date"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3002${CL}"
 | 
			
		||||
@@ -37,8 +37,11 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-amd64-v+([0-9.]).tar.gz"
 | 
			
		||||
    fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-amd64-v+([0-9.]).tar.gz"
 | 
			
		||||
    fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-amd64*.tar.gz"
 | 
			
		||||
    fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-amd64*.tar.gz"
 | 
			
		||||
 | 
			
		||||
    if [[ -f /etc/systemd/system/victoriametrics-logs.service ]]; then
 | 
			
		||||
      fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-amd64*.tar.gz"
 | 
			
		||||
      fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-amd64*.tar.gz"
 | 
			
		||||
    fi
 | 
			
		||||
    chmod +x /opt/victoriametrics/*
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ var_disk="${var_disk:-4}"
 | 
			
		||||
var_os="${var_os:-debian}"
 | 
			
		||||
var_version="${var_version:-12}"
 | 
			
		||||
var_unprivileged="${var_unprivileged:-1}"
 | 
			
		||||
var_tun="${var_tun:-1}"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
@@ -20,20 +21,20 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /etc/wireguard ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    apt-get update
 | 
			
		||||
    apt-get -y upgrade
 | 
			
		||||
    sleep 2
 | 
			
		||||
    cd /etc/wgdashboard/src
 | 
			
		||||
    ./wgd.sh update
 | 
			
		||||
    ./wgd.sh start
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /etc/wireguard ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  apt-get update
 | 
			
		||||
  apt-get -y upgrade
 | 
			
		||||
  sleep 2
 | 
			
		||||
  cd /etc/wgdashboard/src
 | 
			
		||||
  ./wgd.sh update
 | 
			
		||||
  ./wgd.sh start
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -43,4 +44,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} WGDashboard Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:10086${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:10086${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,8 @@
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 6060,
 | 
			
		||||
  "documentation": "https://github.com/adityachandelgit/BookLore",
 | 
			
		||||
  "website": "https://github.com/adityachandelgit/BookLore",
 | 
			
		||||
  "documentation": "https://booklore-app.github.io/booklore-docs/docs/getting-started",
 | 
			
		||||
  "website": "https://github.com/booklore-app/booklore",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/booklore.webp",
 | 
			
		||||
  "config_path": "/opt/booklore_storage/.env",
 | 
			
		||||
  "description": "BookLore is a self-hosted digital library for managing and reading books, offering a beautiful interface and support for metadata management. Built with a modern tech stack, it provides support for importing, organizing, and reading EPUBs and PDFs, while also managing cover images and book metadata.",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								frontend/public/json/ots.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								frontend/public/json/ots.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "OTS",
 | 
			
		||||
  "slug": "ots",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    6
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-08-04",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 443,
 | 
			
		||||
  "documentation": "https://github.com/Luzifer/ots/wiki",
 | 
			
		||||
  "config_path": "/opt/ots/.env",
 | 
			
		||||
  "website": "https://github.com/Luzifer/ots",
 | 
			
		||||
  "logo": null,
 | 
			
		||||
  "description": "One-Time-Secret sharing platform with a symmetric 256bit AES encryption in the browser.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/ots.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 512,
 | 
			
		||||
        "hdd": 3,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "When it is in used external please use it behind reverse proxy or create your own certificates",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2024-05-02",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": false,
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 3000,
 | 
			
		||||
  "documentation": "https://github.com/schlagmichdoch/PairDrop/blob/master/docs/host-your-own.md",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,35 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "SearXNG",
 | 
			
		||||
  "slug": "searxng",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    0
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-02-07",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 8888,
 | 
			
		||||
  "documentation": "https://docs.searxng.org/",
 | 
			
		||||
  "website": "https://github.com/searxng/searxng",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/searxng.webp",
 | 
			
		||||
  "config_path": "/etc/searxng/settings.yml",
 | 
			
		||||
  "description": "SearXNG is a free internet metasearch engine which aggregates results from up to 215 search services. Users are neither tracked nor profiled. Additionally, SearXNG can be used over Tor for online anonymity.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/searxng.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 7,
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								frontend/public/json/tududi.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								frontend/public/json/tududi.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "Tududi",
 | 
			
		||||
  "slug": "tududi",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    12
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-08-04",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 3002,
 | 
			
		||||
  "documentation": null,
 | 
			
		||||
  "config_path": "/opt/tududi/backend/.env",
 | 
			
		||||
  "website": "https://tududi.com/",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/tududi.webp",
 | 
			
		||||
  "description": "Self-hosted task management with functional programming architecture, hierarchical organization, and multi-language support.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/tududi.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 4,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "Create users like this: `cd /opt/tududi` => `npm run user:create <email> <password>`",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "text": "Database location: `/opt/tududi-db`. Uploads: `/opt/tududi-uploads`",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,40 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "Ubuntu 24.10",
 | 
			
		||||
  "slug": "ubuntu2410-vm",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    2
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-01-24",
 | 
			
		||||
  "type": "vm",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": null,
 | 
			
		||||
  "documentation": null,
 | 
			
		||||
  "website": "https://ubuntu.com/",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/ubuntu.webp",
 | 
			
		||||
  "config_path": "",
 | 
			
		||||
  "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": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "after installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/272´",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -31,5 +31,10 @@
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "Included option to install VictoriaLogs.",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
# 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/adityachandelgit/BookLore
 | 
			
		||||
# Source: https://github.com/booklore-app/BookLore
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
@@ -17,7 +17,7 @@ msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y nginx
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
fetch_and_deploy_gh_release "booklore" "adityachandelgit/BookLore"
 | 
			
		||||
fetch_and_deploy_gh_release "booklore" "booklore-app/BookLore"
 | 
			
		||||
JAVA_VERSION="21" setup_java
 | 
			
		||||
NODE_VERSION="22" setup_nodejs
 | 
			
		||||
setup_mariadb
 | 
			
		||||
@@ -59,7 +59,7 @@ msg_ok "Created Environment"
 | 
			
		||||
 | 
			
		||||
msg_info "Building Backend"
 | 
			
		||||
cd /opt/booklore/booklore-api
 | 
			
		||||
APP_VERSION=$(curl -fsSL https://api.github.com/repos/adityachandelgit/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//')
 | 
			
		||||
APP_VERSION=$(curl -fsSL https://api.github.com/repos/booklore-app/BookLore/releases/latest | yq '.tag_name' | sed 's/^v//')
 | 
			
		||||
yq eval ".app.version = \"${APP_VERSION}\"" -i src/main/resources/application.yaml
 | 
			
		||||
$STD ./gradlew clean build --no-daemon
 | 
			
		||||
mkdir -p /opt/booklore/dist
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,6 @@ sed -i -e "s|APP_SECRET=.*|APP_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z
 | 
			
		||||
  /opt/docmost/.env
 | 
			
		||||
export NODE_OPTIONS="--max-old-space-size=2048"
 | 
			
		||||
$STD pnpm install
 | 
			
		||||
$STD pnpm nx run server:build # Dirty fix https://github.com/community-scripts/ProxmoxVE/issues/6377
 | 
			
		||||
$STD pnpm build
 | 
			
		||||
msg_ok "Configured Docmost"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -301,7 +301,8 @@ $STD npm run build
 | 
			
		||||
cd "$SRC_DIR"/web
 | 
			
		||||
$STD npm ci
 | 
			
		||||
$STD npm run build
 | 
			
		||||
cp -a web "$APP_DIR"/www
 | 
			
		||||
cd "$SRC_DIR"
 | 
			
		||||
cp -a web/build "$APP_DIR"/www
 | 
			
		||||
cp LICENSE "$APP_DIR"
 | 
			
		||||
cd "$APP_DIR"
 | 
			
		||||
export SHARP_FORCE_GLOBAL_LIBVIPS=true
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
JAVA_VERSION="21" setup_java
 | 
			
		||||
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "komga" "gotson/komga" "singlefile" "latest" "/opt/komga" "komga*.jar"
 | 
			
		||||
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "komga-org" "gotson/komga" "singlefile" "latest" "/opt/komga" "komga*.jar"
 | 
			
		||||
mv /opt/komga/komga-*.jar /opt/komga/komga.jar
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
 
 | 
			
		||||
@@ -13,15 +13,12 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Dependencies"
 | 
			
		||||
$STD apt-get install -y git 
 | 
			
		||||
msg_ok "Setup Dependencies"
 | 
			
		||||
 | 
			
		||||
NODE_VERSION="22" setup_nodejs
 | 
			
		||||
fetch_and_deploy_gh_release "magicmirror" "MagicMirrorOrg/MagicMirror" "tarball"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring MagicMirror"
 | 
			
		||||
cd /opt/magicmirror
 | 
			
		||||
sed -i -E 's/("postinstall": )".*"/\1""/; s/("prepare": )".*"/\1""/' package.json
 | 
			
		||||
$STD npm run install-mm
 | 
			
		||||
cat <<EOF >/opt/magicmirror/config/config.js
 | 
			
		||||
let config = {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,15 +13,10 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing NocoDB"
 | 
			
		||||
mkdir -p /opt/nocodb
 | 
			
		||||
cd /opt/nocodb
 | 
			
		||||
curl -fsSL http://get.nocodb.com/linux-x64 -o nocodb -L
 | 
			
		||||
chmod +x nocodb
 | 
			
		||||
msg_ok "Installed NocoDB"
 | 
			
		||||
fetch_and_deploy_gh_release "nocodb" "nocodb/nocodb" "singlefile" "latest" "/opt/nocodb/" "Noco-linux-x64"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
service_path="/etc/systemd/system/nocodb.service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/nocodb.service
 | 
			
		||||
echo "[Unit]
 | 
			
		||||
Description=nocodb
 | 
			
		||||
 | 
			
		||||
@@ -33,7 +28,8 @@ WorkingDirectory=/opt/nocodb
 | 
			
		||||
ExecStart=/opt/nocodb/./nocodb
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target" >$service_path
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now nocodb
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,12 +19,7 @@ $STD apt-get install -y \
 | 
			
		||||
  apt-transport-https
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Azul Zulu17"
 | 
			
		||||
curl -fsSL https://repos.azul.com/azul-repo.key | gpg --dearmor -o /usr/share/keyrings/azul.gpg
 | 
			
		||||
echo "deb [signed-by=/usr/share/keyrings/azul.gpg] https://repos.azul.com/zulu/deb stable main" >/etc/apt/sources.list.d/zulu.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get -y install zulu17-jdk
 | 
			
		||||
msg_ok "Installed Azul Zulu17"
 | 
			
		||||
JAVA_VERSION="21" setup_java
 | 
			
		||||
 | 
			
		||||
msg_info "Installing openHAB"
 | 
			
		||||
curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor -o /usr/share/keyrings/openhab.gpg
 | 
			
		||||
 
 | 
			
		||||
@@ -19,21 +19,7 @@ $STD apt-get install -y \
 | 
			
		||||
  ca-certificates
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up OpenProject Repository"
 | 
			
		||||
curl -fsSL "https://dl.packager.io/srv/opf/openproject/key" | gpg --dearmor >/etc/apt/trusted.gpg.d/packager-io.gpg
 | 
			
		||||
curl -fsSL "https://dl.packager.io/srv/opf/openproject/stable/15/installer/debian/12.repo" -o "/etc/apt/sources.list.d/openproject.list"
 | 
			
		||||
msg_ok "Setup OpenProject Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PostgreSQL Repository"
 | 
			
		||||
VERSION="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
 | 
			
		||||
echo "deb http://apt.postgresql.org/pub/repos/apt ${VERSION}-pgdg main" >/etc/apt/sources.list.d/pgdg.list
 | 
			
		||||
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor --output /etc/apt/trusted.gpg.d/postgresql.gpg
 | 
			
		||||
msg_ok "Setup PostgreSQL Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing PostgreSQL"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y postgresql
 | 
			
		||||
msg_ok "Installed PostgreSQL"
 | 
			
		||||
PG_VERSION="17" setup_postgresql
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PostgreSQL"
 | 
			
		||||
DB_NAME=openproject
 | 
			
		||||
@@ -51,6 +37,12 @@ $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMP
 | 
			
		||||
} >>~/openproject.creds
 | 
			
		||||
msg_ok "Set up PostgreSQL"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up OpenProject Repository"
 | 
			
		||||
curl -fsSL "https://dl.packager.io/srv/opf/openproject/key" | gpg --dearmor >/etc/apt/trusted.gpg.d/packager-io.gpg
 | 
			
		||||
curl -fsSL "https://dl.packager.io/srv/opf/openproject/stable/15/installer/debian/12.repo" -o "/etc/apt/sources.list.d/openproject.list"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
msg_ok "Setup OpenProject Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing OpenProject"
 | 
			
		||||
$STD apt-get install -y openproject
 | 
			
		||||
msg_ok "Installed OpenProject"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										103
									
								
								install/ots-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								install/ots-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: bvberg01
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/Luzifer/ots
 | 
			
		||||
 | 
			
		||||
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 \
 | 
			
		||||
    redis-server \
 | 
			
		||||
    nginx \
 | 
			
		||||
    openssl
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
fetch_and_deploy_gh_release "ots" "Luzifer/ots" "prebuild" "latest" "/opt/ots" "ots_linux_amd64.tgz"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup OTS"
 | 
			
		||||
cat <<EOF >/opt/ots/.env
 | 
			
		||||
LISTEN=127.0.0.1:3000
 | 
			
		||||
REDIS_URL=redis://127.0.0.1:6379
 | 
			
		||||
SECRET_EXPIRY=604800
 | 
			
		||||
STORAGE_TYPE=redis
 | 
			
		||||
EOF
 | 
			
		||||
msg_ok "Setup OTS"
 | 
			
		||||
 | 
			
		||||
msg_info "Generating Universal SSL Certificate"
 | 
			
		||||
mkdir -p /etc/ssl/ots
 | 
			
		||||
$STD openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
 | 
			
		||||
    -keyout /etc/ssl/ots/key.pem \
 | 
			
		||||
    -out /etc/ssl/ots/cert.pem \
 | 
			
		||||
    -subj "/CN=ots"
 | 
			
		||||
msg_ok "Certificate Generated"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up nginx"
 | 
			
		||||
cat <<EOF >/etc/nginx/sites-available/ots.conf
 | 
			
		||||
server {
 | 
			
		||||
    listen 80;
 | 
			
		||||
    listen [::]:80;
 | 
			
		||||
    server_name ots;
 | 
			
		||||
    return 301 https://\$host\$request_uri;
 | 
			
		||||
}
 | 
			
		||||
server {
 | 
			
		||||
  listen 443 ssl;
 | 
			
		||||
  listen [::]:443 ssl;
 | 
			
		||||
  server_name ots;
 | 
			
		||||
 | 
			
		||||
  ssl_certificate /etc/ssl/ots/cert.pem;
 | 
			
		||||
  ssl_certificate_key /etc/ssl/ots/key.pem;
 | 
			
		||||
 | 
			
		||||
  location / {
 | 
			
		||||
    add_header X-Robots-Tag noindex;
 | 
			
		||||
 | 
			
		||||
    proxy_set_header Upgrade \$http_upgrade;
 | 
			
		||||
    proxy_set_header Connection "Upgrade";
 | 
			
		||||
    proxy_set_header Host \$host;
 | 
			
		||||
    proxy_set_header X-Real-IP \$remote_addr;
 | 
			
		||||
    proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
 | 
			
		||||
    proxy_set_header X-Forwarded-Proto \$scheme;
 | 
			
		||||
    client_max_body_size 64M;
 | 
			
		||||
    proxy_pass http://127.0.0.1:3000/;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
ln -s /etc/nginx/sites-available/ots.conf /etc/nginx/sites-enabled/
 | 
			
		||||
rm -f /etc/nginx/sites-enabled/default
 | 
			
		||||
$STD systemctl reload nginx
 | 
			
		||||
msg_ok "Configured nginx"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Services"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/ots.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=One-Time-Secret Service
 | 
			
		||||
After=network-online.target
 | 
			
		||||
Requires=network-online.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
EnvironmentFile=/opt/ots/.env
 | 
			
		||||
ExecStart=/opt/ots/ots
 | 
			
		||||
Restart=Always
 | 
			
		||||
RestartSecs=5
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now ots
 | 
			
		||||
msg_ok "Created Services"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -13,15 +13,10 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  git
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
NODE_VERSION="22" setup_nodejs
 | 
			
		||||
fetch_and_deploy_gh_release "pairdrop" "schlagmichdoch/PairDrop" "tarball"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing PairDrop"
 | 
			
		||||
git clone -q https://github.com/schlagmichdoch/PairDrop.git /opt/pairdrop
 | 
			
		||||
msg_info "Configuring PairDrop"
 | 
			
		||||
cd /opt/pairdrop
 | 
			
		||||
$STD npm install
 | 
			
		||||
msg_ok "Installed PairDrop"
 | 
			
		||||
 
 | 
			
		||||
@@ -13,12 +13,13 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Pocketbase"
 | 
			
		||||
RELEASE="$(curl -fsSL https://api.github.com/repos/pocketbase/pocketbase/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')"
 | 
			
		||||
curl -fsSL "https://github.com/pocketbase/pocketbase/releases/download/v${RELEASE}/pocketbase_${RELEASE}_linux_amd64.zip" -o "/tmp/pocketbase.zip"
 | 
			
		||||
mkdir -p /opt/pocketbase/{pb_public,pb_migrations,pb_hooks}
 | 
			
		||||
$STD unzip -o /tmp/pocketbase.zip -d /opt/pocketbase
 | 
			
		||||
fetch_and_deploy_gh_release "pocketbase" "pocketbase/pocketbase" "prebuild" "latest" "/opt/pocketbase" "pocketbase*linux_amd64.zip"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Pocketbase"
 | 
			
		||||
mkdir -p /opt/pocketbase/{pb_public,pb_migrations,pb_hooks}
 | 
			
		||||
msg_ok "Configured Pocketbase"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/pocketbase.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description = pocketbase
 | 
			
		||||
@@ -35,15 +36,13 @@ ExecStart      = /opt/pocketbase/pocketbase serve --http=0.0.0.0:8080
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy = multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
systemctl enable -q --now pocketbase
 | 
			
		||||
msg_ok "Installed Pocketbase"
 | 
			
		||||
msg_ok "Service created"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf /tmp/pocketbase.zip
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -14,12 +14,9 @@ network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
read -r -p "${TAB3}What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url
 | 
			
		||||
msg_info "Setup Pocket ID"
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/pocket-id/pocket-id/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
mkdir -p /opt/pocket-id
 | 
			
		||||
curl -fsSL "https://github.com/pocket-id/pocket-id/releases/download/v${RELEASE}/pocket-id-linux-amd64" -o /opt/pocket-id/pocket-id
 | 
			
		||||
chmod u+x /opt/pocket-id/pocket-id
 | 
			
		||||
fetch_and_deploy_gh_release "pocket-id" "pocket-id/pocket-id" "singlefile" "latest" "/opt/pocket-id/" "pocket-id-linux-amd64"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Pocket ID"
 | 
			
		||||
cat <<EOF >/opt/pocket-id/.env
 | 
			
		||||
APP_ENV=production
 | 
			
		||||
APP_URL=https://${public_url}
 | 
			
		||||
@@ -28,8 +25,7 @@ TRUST_PROXY=false
 | 
			
		||||
PORT=1411
 | 
			
		||||
HOST=0.0.0.0
 | 
			
		||||
EOF
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Setup Pocket ID"
 | 
			
		||||
msg_ok "Configured Pocket ID"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/pocketid.service
 | 
			
		||||
@@ -63,6 +59,3 @@ msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 
 | 
			
		||||
@@ -16,20 +16,11 @@ update_os
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  nginx \
 | 
			
		||||
  php8.2-fpm \
 | 
			
		||||
  php8.2-{common,cli,gd,mbstring,xml,fpm,curl,zip} \
 | 
			
		||||
  openssl
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing PrivateBin"
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/PrivateBin/PrivateBin/releases/latest | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
mkdir -p /opt/privatebin
 | 
			
		||||
cd /opt/privatebin
 | 
			
		||||
curl -fsSL "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${RELEASE}.zip" -o "${RELEASE}.zip"
 | 
			
		||||
$STD unzip ${RELEASE}.zip
 | 
			
		||||
mv PrivateBin-${RELEASE}/* .
 | 
			
		||||
msg_ok "Installed PrivateBin"
 | 
			
		||||
PHP_VERSION="8.2" PHP_MODULE="common,fpm" setup_php
 | 
			
		||||
fetch_and_deploy_gh_release "privatebin" "PrivateBin/PrivateBin" "tarball"
 | 
			
		||||
 | 
			
		||||
msg_info "Generating Universal SSL Certificate"
 | 
			
		||||
mkdir -p /etc/ssl/privatebin
 | 
			
		||||
@@ -41,7 +32,7 @@ msg_ok "Certificate Generated"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Environment"
 | 
			
		||||
mkdir -p /opt/privatebin/data
 | 
			
		||||
cp cfg/conf.sample.php /opt/privatebin/cfg/conf.php
 | 
			
		||||
cp /opt/privatebin/cfg/conf.sample.php /opt/privatebin/cfg/conf.php
 | 
			
		||||
sed -i "s|// 'traffic'|'traffic'|g" /opt/privatebin/cfg/conf.php
 | 
			
		||||
chown -R www-data:www-data /opt/privatebin
 | 
			
		||||
chmod -R 0755 /opt/privatebin/data
 | 
			
		||||
@@ -96,12 +87,10 @@ rm -f /etc/nginx/sites-enabled/default
 | 
			
		||||
systemctl reload nginx
 | 
			
		||||
msg_ok "Nginx Configured"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf /opt/privatebin/${RELEASE}.zip
 | 
			
		||||
rm -rf /opt/privatebin/PrivateBin-${RELEASE}
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 
 | 
			
		||||
@@ -13,16 +13,12 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Prometheus Alertmanager"
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/prometheus/alertmanager/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
mkdir -p /etc/alertmanager
 | 
			
		||||
mkdir -p /var/lib/alertmanager
 | 
			
		||||
curl -fsSL "https://github.com/prometheus/alertmanager/releases/download/v${RELEASE}/alertmanager-${RELEASE}.linux-amd64.tar.gz" -o "alertmanager-${RELEASE}.linux-amd64.tar.gz"
 | 
			
		||||
tar -xf alertmanager-${RELEASE}.linux-amd64.tar.gz
 | 
			
		||||
mv alertmanager-${RELEASE}.linux-amd64/alertmanager alertmanager-${RELEASE}.linux-amd64/amtool /usr/local/bin/
 | 
			
		||||
mv alertmanager-${RELEASE}.linux-amd64/alertmanager.yml /etc/alertmanager/alertmanager.yml
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Installed Prometheus Alertmanager"
 | 
			
		||||
fetch_and_deploy_gh_release "alertmanager" "prometheus/alertmanager" "prebuild" "latest" "/usr/local/bin/" "alertmanager*linux-amd64.tar.gz"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Prometheus Alertmanager"
 | 
			
		||||
mkdir -p /etc/alertmanager /var/lib/alertmanager
 | 
			
		||||
mv /usr/local/bin/alertmanager.yml /etc/alertmanager/alertmanager.yml
 | 
			
		||||
msg_ok "Configured Prometheus Alertmanager"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/prometheus-alertmanager.service
 | 
			
		||||
@@ -53,5 +49,4 @@ customize
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
rm -rf alertmanager-${RELEASE}.linux-amd64 alertmanager-${RELEASE}.linux-amd64.tar.gz
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,37 +20,23 @@ $STD apt-get install -y \
 | 
			
		||||
  policykit-1
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating dedicated user pulse..."
 | 
			
		||||
msg_info "Creating User"
 | 
			
		||||
if useradd -r -m -d /opt/pulse-home -s /bin/bash pulse; then
 | 
			
		||||
  msg_ok "User created."
 | 
			
		||||
  msg_ok "Created User"
 | 
			
		||||
else
 | 
			
		||||
  msg_error "User creation failed."
 | 
			
		||||
  msg_error "User creation failed"
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
NODE_VERSION="20" setup_nodejs
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Pulse"
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/rcourtman/Pulse/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
mkdir -p /opt/pulse
 | 
			
		||||
curl -fsSL "https://github.com/rcourtman/Pulse/releases/download/v${RELEASE}/pulse-v${RELEASE}.tar.gz" -o "$temp_file"
 | 
			
		||||
tar zxf "$temp_file" --strip-components=1 -C /opt/pulse
 | 
			
		||||
touch /opt/pulse/.env
 | 
			
		||||
chown pulse:pulse /opt/pulse/.env
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
mkdir -p /etc/pulse
 | 
			
		||||
fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "*-linux-amd64.tar.gz"
 | 
			
		||||
chown -R pulse:pulse /etc/pulse /opt/pulse
 | 
			
		||||
msg_ok "Installed Pulse"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting permissions for /opt/pulse..."
 | 
			
		||||
chown -R pulse:pulse "/opt/pulse"
 | 
			
		||||
find "/opt/pulse" -type d -exec chmod 755 {} \;
 | 
			
		||||
find "/opt/pulse" -type f -exec chmod 644 {} \;
 | 
			
		||||
msg_ok "Set permissions."
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/pulse.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Pulse Monitoring Application
 | 
			
		||||
Description=Pulse Monitoring Server
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
@@ -58,12 +44,13 @@ Type=simple
 | 
			
		||||
User=pulse
 | 
			
		||||
Group=pulse
 | 
			
		||||
WorkingDirectory=/opt/pulse
 | 
			
		||||
EnvironmentFile=/opt/pulse/.env
 | 
			
		||||
ExecStart=/usr/bin/npm run start
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
RestartSec=5
 | 
			
		||||
ExecStart=/opt/pulse/pulse
 | 
			
		||||
Restart=always
 | 
			
		||||
RestartSec=3
 | 
			
		||||
StandardOutput=journal
 | 
			
		||||
StandardError=journal
 | 
			
		||||
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 | 
			
		||||
Environment="PULSE_DATA_DIR=/etc/pulse"
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
@@ -75,7 +62,6 @@ motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										76
									
								
								install/tududi-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								install/tududi-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2025 Community Scripts ORG
 | 
			
		||||
# Author: vhsdream
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://tududi.com/
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  sqlite3 \
 | 
			
		||||
  yq
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
NODE_VERSION="20" setup_nodejs
 | 
			
		||||
fetch_and_deploy_gh_release "tududi" "chrisvel/tududi"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Tududi"
 | 
			
		||||
cd /opt/tududi
 | 
			
		||||
$STD npm install
 | 
			
		||||
export NODE_ENV=production
 | 
			
		||||
$STD npm run frontend:build
 | 
			
		||||
mv ./dist ./backend
 | 
			
		||||
mv ./public/locales ./backend/dist
 | 
			
		||||
mv ./public/favicon.* ./backend/dist
 | 
			
		||||
msg_ok "Configured Tududi"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating env and database"
 | 
			
		||||
DB_LOCATION="/opt/tududi-db"
 | 
			
		||||
UPLOAD_DIR="/opt/tududi-uploads"
 | 
			
		||||
mkdir -p {"$DB_LOCATION","$UPLOAD_DIR"}
 | 
			
		||||
SECRET="$(openssl rand -hex 64)"
 | 
			
		||||
sed -e 's/^GOOGLE/# &/' \
 | 
			
		||||
  -e '/TUDUDI_SESSION/s/^# //' \
 | 
			
		||||
  -e '/NODE_ENV/s/^# //' \
 | 
			
		||||
  -e "s/your_session_secret_here/$SECRET/" \
 | 
			
		||||
  -e 's/development/production/' \
 | 
			
		||||
  -e "\$a\DB_FILE=$DB_LOCATION/production.sqlite3" \
 | 
			
		||||
  -e "\$a\TUDUDI_UPLOAD_PATH=$UPLOAD_DIR" \
 | 
			
		||||
  /opt/tududi/backend/.env.example >/opt/tududi/backend/.env
 | 
			
		||||
export DB_FILE="$DB_LOCATION/production.sqlite3"
 | 
			
		||||
$STD npm run db:init
 | 
			
		||||
msg_ok "Created env and database"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/tududi.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Tududi Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
WorkingDirectory=/opt/tududi
 | 
			
		||||
EnvironmentFile=/opt/tududi/backend/.env
 | 
			
		||||
ExecStart=/usr/bin/npm run start
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now tududi
 | 
			
		||||
msg_ok "Created service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -15,8 +15,13 @@ update_os
 | 
			
		||||
 | 
			
		||||
fetch_and_deploy_gh_release "victoriametrics" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "victoria-metrics-linux-amd64-v+([0-9.]).tar.gz"
 | 
			
		||||
fetch_and_deploy_gh_release "vmutils" "VictoriaMetrics/VictoriaMetrics" "prebuild" "latest" "/opt/victoriametrics" "vmutils-linux-amd64-v+([0-9.]).tar.gz"
 | 
			
		||||
fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-amd64*.tar.gz"
 | 
			
		||||
fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-amd64*.tar.gz"
 | 
			
		||||
 | 
			
		||||
read -r -p "${TAB3}Would you like to add VictoriaLogs? <y/N> " prompt
 | 
			
		||||
 | 
			
		||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
 | 
			
		||||
  fetch_and_deploy_gh_release "victorialogs" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "victoria-logs-linux-amd64*.tar.gz"
 | 
			
		||||
  fetch_and_deploy_gh_release "vlutils" "VictoriaMetrics/VictoriaLogs" "prebuild" "latest" "/opt/victoriametrics" "vlutils-linux-amd64*.tar.gz"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
msg_info "Setup VictoriaMetrics"
 | 
			
		||||
mkdir -p /opt/victoriametrics/data
 | 
			
		||||
@@ -38,8 +43,10 @@ ExecStart=/opt/victoriametrics/victoria-metrics-prod --storageDataPath="/opt/vic
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now victoriametrics
 | 
			
		||||
 | 
			
		||||
cat <<EOF >/etc/systemd/system/victoriametrics-logs.service
 | 
			
		||||
if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
 | 
			
		||||
  cat <<EOF >/etc/systemd/system/victoriametrics-logs.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=VictoriaMetrics Service
 | 
			
		||||
 | 
			
		||||
@@ -53,15 +60,14 @@ ExecStart=/opt/victoriametrics/victoria-logs-prod
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now victoriametrics
 | 
			
		||||
systemctl enable -q --now victoriametrics-logs
 | 
			
		||||
  systemctl enable -q --now victoriametrics-logs
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf $temp_dir
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -65,36 +65,36 @@ root_check() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1030,10 +1030,9 @@ check_container_resources() {
 | 
			
		||||
  if [[ "$current_ram" -lt "$var_ram" ]] || [[ "$current_cpu" -lt "$var_cpu" ]]; then
 | 
			
		||||
    echo -e "\n${INFO}${HOLD} ${GN}Required: ${var_cpu} CPU, ${var_ram}MB RAM ${CL}| ${RD}Current: ${current_cpu} CPU, ${current_ram}MB RAM${CL}"
 | 
			
		||||
    echo -e "${YWB}Please ensure that the ${APP} LXC is configured with at least ${var_cpu} vCPU and ${var_ram} MB RAM for the build process.${CL}\n"
 | 
			
		||||
    echo -ne "${INFO}${HOLD} May cause data loss! ${INFO} Continue update with under-provisioned LXC? <yes/No>  "
 | 
			
		||||
    echo -ne "${INFO}${HOLD} May cause data loss! ${INFO} Continue update with under-provisioned LXC? [y/N] "
 | 
			
		||||
    read -r prompt
 | 
			
		||||
    # Check if the input is 'yes', otherwise exit with status 1
 | 
			
		||||
    if [[ ! ${prompt,,} =~ ^(yes)$ ]]; then
 | 
			
		||||
    if [[ ! "${prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
			
		||||
      echo -e "${CROSS}${HOLD} ${YWB}Exiting based on user input.${CL}"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
@@ -1050,10 +1049,9 @@ check_container_storage() {
 | 
			
		||||
  if ((usage > 80)); then
 | 
			
		||||
    # Prompt the user for confirmation to continue
 | 
			
		||||
    echo -e "${INFO}${HOLD} ${YWB}Warning: Storage is dangerously low (${usage}%).${CL}"
 | 
			
		||||
    echo -ne "Continue anyway? <y/N>  "
 | 
			
		||||
    echo -ne "Continue anyway? [y/N] "
 | 
			
		||||
    read -r prompt
 | 
			
		||||
    # Check if the input is 'y' or 'yes', otherwise exit with status 1
 | 
			
		||||
    if [[ ! ${prompt,,} =~ ^(y|yes)$ ]]; then
 | 
			
		||||
    if [[ ! "${prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
			
		||||
      echo -e "${CROSS}${HOLD}${YWB}Exiting based on user input.${CL}"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
@@ -1282,32 +1280,42 @@ EOF
 | 
			
		||||
  if [ "$var_os" != "alpine" ]; then
 | 
			
		||||
    msg_info "Waiting for network in LXC container"
 | 
			
		||||
    for i in {1..10}; do
 | 
			
		||||
      # 1. Primary check: ICMP ping (fastest, but may be blocked by ISP/firewall)
 | 
			
		||||
      if pct exec "$CTID" -- ping -c1 -W1 deb.debian.org >/dev/null 2>&1; then
 | 
			
		||||
        msg_ok "Network in LXC is reachable"
 | 
			
		||||
        msg_ok "Network in LXC is reachable (ping)"
 | 
			
		||||
        break
 | 
			
		||||
      fi
 | 
			
		||||
      # Wait and retry if not reachable yet
 | 
			
		||||
      if [ "$i" -lt 10 ]; then
 | 
			
		||||
        msg_warn "No network yet in LXC (try $i/10) – waiting..."
 | 
			
		||||
        msg_warn "No network in LXC yet (try $i/10) – waiting..."
 | 
			
		||||
        sleep 3
 | 
			
		||||
      else
 | 
			
		||||
        msg_error "No network in LXC after waiting."
 | 
			
		||||
        read -r -p "Set fallback DNS (1.1.1.1/8.8.8.8)? [y/N]: " choice
 | 
			
		||||
        case "$choice" in
 | 
			
		||||
        [yY]*)
 | 
			
		||||
          pct set "$CTID" --nameserver 1.1.1.1
 | 
			
		||||
          pct set "$CTID" --nameserver 8.8.8.8
 | 
			
		||||
          if pct exec "$CTID" -- ping -c1 -W1 deb.debian.org >/dev/null 2>&1; then
 | 
			
		||||
            msg_ok "Network reachable after DNS fallback"
 | 
			
		||||
          else
 | 
			
		||||
            msg_error "Still no network/DNS in LXC! Aborting customization."
 | 
			
		||||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          ;;
 | 
			
		||||
        *)
 | 
			
		||||
          msg_error "Aborted by user – no DNS fallback set."
 | 
			
		||||
          exit 1
 | 
			
		||||
          ;;
 | 
			
		||||
        esac
 | 
			
		||||
        # After 10 unsuccessful ping attempts, try HTTP connectivity via wget as fallback
 | 
			
		||||
        msg_warn "Ping failed 10 times. Trying HTTP connectivity check (wget) as fallback..."
 | 
			
		||||
        if pct exec "$CTID" -- wget -q --spider http://deb.debian.org; then
 | 
			
		||||
          msg_ok "Network in LXC is reachable (wget fallback)"
 | 
			
		||||
        else
 | 
			
		||||
          msg_error "No network in LXC after all checks."
 | 
			
		||||
          read -r -p "Set fallback DNS (1.1.1.1/8.8.8.8)? [y/N]: " choice
 | 
			
		||||
          case "$choice" in
 | 
			
		||||
          [yY]*)
 | 
			
		||||
            pct set "$CTID" --nameserver 1.1.1.1
 | 
			
		||||
            pct set "$CTID" --nameserver 8.8.8.8
 | 
			
		||||
            # Final attempt with wget after DNS change
 | 
			
		||||
            if pct exec "$CTID" -- wget -q --spider http://deb.debian.org; then
 | 
			
		||||
              msg_ok "Network reachable after DNS fallback"
 | 
			
		||||
            else
 | 
			
		||||
              msg_error "Still no network/DNS in LXC! Aborting customization."
 | 
			
		||||
              exit_script
 | 
			
		||||
            fi
 | 
			
		||||
            ;;
 | 
			
		||||
          *)
 | 
			
		||||
            msg_error "Aborted by user – no DNS fallback set."
 | 
			
		||||
            exit_script
 | 
			
		||||
            ;;
 | 
			
		||||
          esac
 | 
			
		||||
        fi
 | 
			
		||||
        break
 | 
			
		||||
      fi
 | 
			
		||||
    done
 | 
			
		||||
  fi
 | 
			
		||||
@@ -1342,7 +1350,7 @@ EOF'
 | 
			
		||||
  fi
 | 
			
		||||
  msg_ok "Customized LXC Container"
 | 
			
		||||
 | 
			
		||||
  lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/"$var_install".sh)" $?
 | 
			
		||||
  lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/${var_install}.sh)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function sets the description of the container.
 | 
			
		||||
 
 | 
			
		||||
@@ -492,39 +492,50 @@ function setup_php() {
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ------------------------------------------------------------------------------
 | 
			
		||||
# Installs or updates Composer globally.
 | 
			
		||||
# Installs or updates Composer globally (robust, idempotent).
 | 
			
		||||
#
 | 
			
		||||
# Description:
 | 
			
		||||
#   - Downloads latest version from getcomposer.org
 | 
			
		||||
#   - Installs to /usr/local/bin/composer
 | 
			
		||||
# - Installs to /usr/local/bin/composer
 | 
			
		||||
# - Removes old binaries/symlinks in /usr/bin, /bin, /root/.composer, etc.
 | 
			
		||||
# - Ensures /usr/local/bin is in PATH (permanent)
 | 
			
		||||
# ------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
function setup_composer() {
 | 
			
		||||
  local COMPOSER_BIN="/usr/local/bin/composer"
 | 
			
		||||
  export COMPOSER_ALLOW_SUPERUSER=1
 | 
			
		||||
 | 
			
		||||
  # Clean up old Composer binaries/symlinks (if any)
 | 
			
		||||
  for old in /usr/bin/composer /bin/composer /root/.composer/vendor/bin/composer; do
 | 
			
		||||
    [[ -e "$old" && "$old" != "$COMPOSER_BIN" ]] && rm -f "$old"
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  # Ensure /usr/local/bin is in PATH for future logins (and current shell)
 | 
			
		||||
  ensure_usr_local_bin_persist
 | 
			
		||||
  export PATH="/usr/local/bin:$PATH"
 | 
			
		||||
 | 
			
		||||
  # Check if composer is already installed
 | 
			
		||||
  if [[ -x "$COMPOSER_BIN" ]]; then
 | 
			
		||||
    local CURRENT_VERSION
 | 
			
		||||
    CURRENT_VERSION=$("$COMPOSER_BIN" --version | awk '{print $3}')
 | 
			
		||||
    $STD msg_info "Old Composer $CURRENT_VERSION found, updating to latest"
 | 
			
		||||
  else
 | 
			
		||||
    msg_info "Setup Composer"
 | 
			
		||||
    msg_info "Installing Composer"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Download and install latest composer
 | 
			
		||||
  # Download and install latest Composer
 | 
			
		||||
  curl -fsSL https://getcomposer.org/installer -o /tmp/composer-setup.php
 | 
			
		||||
  php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer >/dev/null 2>&1
 | 
			
		||||
 | 
			
		||||
  if [[ $? -ne 0 ]]; then
 | 
			
		||||
    msg_error "Failed to install Composer"
 | 
			
		||||
  if [[ ! -x "$COMPOSER_BIN" ]]; then
 | 
			
		||||
    msg_error "Composer was not successfully installed (no binary at $COMPOSER_BIN)"
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  chmod +x "$COMPOSER_BIN"
 | 
			
		||||
  composer diagnose >/dev/null 2>&1
 | 
			
		||||
  msg_ok "Setup Composer"
 | 
			
		||||
  $STD "$COMPOSER_BIN" self-update --no-interaction || true # safe if already latest
 | 
			
		||||
  $STD "$COMPOSER_BIN" diagnose
 | 
			
		||||
  msg_ok "Composer is ready at $COMPOSER_BIN"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ------------------------------------------------------------------------------
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Creates a systemd service to disable NIC offloading features for Intel e1000e interfaces
 | 
			
		||||
# Creates a systemd service to disable NIC offloading features for Intel e1000e and e1000 interfaces
 | 
			
		||||
# Author: rcastley
 | 
			
		||||
# License: MIT
 | 
			
		||||
 | 
			
		||||
@@ -19,8 +19,8 @@ INFO="${TAB}ℹ️${TAB}${CL}"
 | 
			
		||||
WARN="${TAB}⚠️${TAB}${CL}"
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
clear
 | 
			
		||||
cat <<"EOF"
 | 
			
		||||
 | 
			
		||||
    _   ____________   ____  __________                ___                ____  _            __    __
 | 
			
		||||
   / | / /  _/ ____/  / __ \/ __/ __/ /___  ____ _____/ (_)___  ____ _   / __ \(_)________ _/ /_  / /__  _____
 | 
			
		||||
@@ -28,6 +28,7 @@ function header_info {
 | 
			
		||||
 / /|  // // /___   / /_/ / __/ __/ / /_/ / /_/ / /_/ / / / / / /_/ /  / /_/ / (__  ) /_/ / /_/ / /  __/ /
 | 
			
		||||
/_/ |_/___/\____/   \____/_/ /_/ /_/\____/\__,_/\__,_/_/_/ /_/\__, /  /_____/_/____/\__,_/_.___/_/\___/_/
 | 
			
		||||
                                                             /____/
 | 
			
		||||
Enhanced version supporting both e1000e and e1000 drivers
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -52,36 +53,36 @@ if ! command -v ethtool >/dev/null 2>&1; then
 | 
			
		||||
    msg_ok "ethtool installed successfully"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Get list of network interfaces using Intel e1000e driver
 | 
			
		||||
# Get list of network interfaces using Intel e1000e or e1000 drivers
 | 
			
		||||
INTERFACES=()
 | 
			
		||||
COUNT=0
 | 
			
		||||
 | 
			
		||||
msg_info "Searching for Intel e1000e interfaces"
 | 
			
		||||
msg_info "Searching for Intel e1000e and e1000 interfaces"
 | 
			
		||||
 | 
			
		||||
for device in /sys/class/net/*; do
 | 
			
		||||
    interface="$(basename "$device")"  # or adjust the rest of the usages below, as mostly you'll use the path anyway
 | 
			
		||||
    # Skip loopback interface and virtual interfaces
 | 
			
		||||
    if [[ "$interface" != "lo" ]] && [[ ! "$interface" =~ ^(tap|fwbr|veth|vmbr|bonding_masters) ]]; then
 | 
			
		||||
        # Check if the interface uses the e1000e driver
 | 
			
		||||
        # Check if the interface uses the e1000e or e1000 driver
 | 
			
		||||
        driver=$(basename $(readlink -f /sys/class/net/$interface/device/driver 2>/dev/null) 2>/dev/null)
 | 
			
		||||
 | 
			
		||||
        if [[ "$driver" == "e1000e" ]]; then
 | 
			
		||||
        
 | 
			
		||||
        if [[ "$driver" == "e1000e" ]] || [[ "$driver" == "e1000" ]]; then
 | 
			
		||||
            # Get MAC address for additional identification
 | 
			
		||||
            mac=$(cat /sys/class/net/$interface/address 2>/dev/null)
 | 
			
		||||
            INTERFACES+=("$interface" "Intel e1000e NIC ($mac)")
 | 
			
		||||
            INTERFACES+=("$interface" "Intel $driver NIC ($mac)")
 | 
			
		||||
            ((COUNT++))
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Check if any Intel e1000e interfaces were found
 | 
			
		||||
# Check if any Intel e1000e/e1000 interfaces were found
 | 
			
		||||
if [ ${#INTERFACES[@]} -eq 0 ]; then
 | 
			
		||||
    whiptail --title "Error" --msgbox "No Intel e1000e network interfaces found!" 10 60
 | 
			
		||||
    msg_error "No Intel e1000e network interfaces found! Exiting."
 | 
			
		||||
    whiptail --title "Error" --msgbox "No Intel e1000e or e1000 network interfaces found!" 10 60
 | 
			
		||||
    msg_error "No Intel e1000e or e1000 network interfaces found! Exiting."
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
msg_ok "Found ${BL}$COUNT${GN} Intel e1000e interfaces"
 | 
			
		||||
msg_ok "Found ${BL}$COUNT${GN} Intel e1000e/e1000 interfaces"
 | 
			
		||||
 | 
			
		||||
# Create a checklist for interface selection with all interfaces initially checked
 | 
			
		||||
INTERFACES_CHECKLIST=()
 | 
			
		||||
@@ -90,9 +91,9 @@ for ((i=0; i<${#INTERFACES[@]}; i+=2)); do
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Show interface selection checklist
 | 
			
		||||
SELECTED_INTERFACES=$(whiptail --backtitle "Intel e1000e NIC Offloading Disabler" --title "Network Interfaces" \
 | 
			
		||||
                    --separate-output --checklist "Select Intel e1000e network interfaces\n(Space to toggle, Enter to confirm):" 15 80 6 \
 | 
			
		||||
                    "${INTERFACES_CHECKLIST[@]}" 3>&1 1>&2 2>&3)
 | 
			
		||||
SELECTED_INTERFACES=$(whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --title "Network Interfaces" \
 | 
			
		||||
    --separate-output --checklist "Select Intel e1000e/e1000 network interfaces\n(Space to toggle, Enter to confirm):" 15 80 6 \
 | 
			
		||||
    "${INTERFACES_CHECKLIST[@]}" 3>&1 1>&2 2>&3)
 | 
			
		||||
 | 
			
		||||
exitstatus=$?
 | 
			
		||||
if [ $exitstatus != 0 ]; then
 | 
			
		||||
@@ -112,21 +113,23 @@ readarray -t INTERFACE_ARRAY <<< "$SELECTED_INTERFACES"
 | 
			
		||||
# Show the number of selected interfaces
 | 
			
		||||
INTERFACE_COUNT=${#INTERFACE_ARRAY[@]}
 | 
			
		||||
 | 
			
		||||
# Print selected interfaces
 | 
			
		||||
# Print selected interfaces with their driver types
 | 
			
		||||
for iface in "${INTERFACE_ARRAY[@]}"; do
 | 
			
		||||
    msg_ok "Selected interface: ${BL}$iface${CL}"
 | 
			
		||||
    driver=$(basename $(readlink -f /sys/class/net/$iface/device/driver 2>/dev/null) 2>/dev/null)
 | 
			
		||||
    msg_ok "Selected interface: ${BL}$iface${GN} (${BL}$driver${GN})"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Ask for confirmation with the list of selected interfaces
 | 
			
		||||
CONFIRMATION_MSG="You have selected the following interface(s):\n\n"
 | 
			
		||||
for iface in "${INTERFACE_ARRAY[@]}"; do
 | 
			
		||||
    SPEED=$(cat /sys/class/net/$iface/speed 2>/dev/null)
 | 
			
		||||
    SPEED=$(cat /sys/class/net/$iface/speed 2>/dev/null || echo "Unknown")
 | 
			
		||||
    MAC=$(cat /sys/class/net/$iface/address 2>/dev/null)
 | 
			
		||||
    CONFIRMATION_MSG+="- $iface (MAC: $MAC, Speed: ${SPEED}Mbps)\n"
 | 
			
		||||
    DRIVER=$(basename $(readlink -f /sys/class/net/$iface/device/driver 2>/dev/null) 2>/dev/null)
 | 
			
		||||
    CONFIRMATION_MSG+="- $iface (Driver: $DRIVER, MAC: $MAC, Speed: ${SPEED}Mbps)\n"
 | 
			
		||||
done
 | 
			
		||||
CONFIRMATION_MSG+="\nThis will create systemd service(s) to disable offloading features.\n\nProceed?"
 | 
			
		||||
 | 
			
		||||
if ! whiptail --backtitle "Intel e1000e NIC Offloading Disabler" --title "Confirmation" \
 | 
			
		||||
if ! whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --title "Confirmation" \
 | 
			
		||||
    --yesno "$CONFIRMATION_MSG" 20 80; then
 | 
			
		||||
    msg_info "User canceled. Exiting."
 | 
			
		||||
    exit 0
 | 
			
		||||
@@ -134,22 +137,25 @@ fi
 | 
			
		||||
 | 
			
		||||
# Loop through all selected interfaces and create services for each
 | 
			
		||||
for SELECTED_INTERFACE in "${INTERFACE_ARRAY[@]}"; do
 | 
			
		||||
    # Get the driver type for this specific interface
 | 
			
		||||
    DRIVER=$(basename $(readlink -f /sys/class/net/$SELECTED_INTERFACE/device/driver 2>/dev/null) 2>/dev/null)
 | 
			
		||||
    
 | 
			
		||||
    # Create service name for this interface
 | 
			
		||||
    SERVICE_NAME="disable-nic-offload-$SELECTED_INTERFACE.service"
 | 
			
		||||
    SERVICE_PATH="/etc/systemd/system/$SERVICE_NAME"
 | 
			
		||||
 | 
			
		||||
    # Create the service file with e1000e specific optimizations
 | 
			
		||||
    msg_info "Creating systemd service for interface: ${BL}$SELECTED_INTERFACE${YW}"
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    # Create the service file with driver-specific optimizations
 | 
			
		||||
    msg_info "Creating systemd service for interface: ${BL}$SELECTED_INTERFACE${YW} (${BL}$DRIVER${YW})"
 | 
			
		||||
    
 | 
			
		||||
    # Start with the common part of the service file
 | 
			
		||||
    cat > "$SERVICE_PATH" << EOF
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Disable NIC offloading for Intel e1000e interface $SELECTED_INTERFACE
 | 
			
		||||
Description=Disable NIC offloading for Intel $DRIVER interface $SELECTED_INTERFACE
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=oneshot
 | 
			
		||||
# Disable all offloading features for Intel e1000e
 | 
			
		||||
# Disable all offloading features for Intel $DRIVER
 | 
			
		||||
ExecStart=/sbin/ethtool -K $SELECTED_INTERFACE gso off gro off tso off tx off rx off rxvlan off txvlan off sg off
 | 
			
		||||
RemainAfterExit=true
 | 
			
		||||
 | 
			
		||||
@@ -176,7 +182,7 @@ EOF
 | 
			
		||||
        # Enable the service to start on boot
 | 
			
		||||
        systemctl enable "$SERVICE_NAME"
 | 
			
		||||
        echo "100"; sleep 0.2
 | 
			
		||||
    } | whiptail --backtitle "Intel e1000e NIC Offloading Disabler" --gauge "Configuring service for $SELECTED_INTERFACE..." 10 80 0
 | 
			
		||||
    } | whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --gauge "Configuring service for $SELECTED_INTERFACE..." 10 80 0
 | 
			
		||||
 | 
			
		||||
    # Individual service status
 | 
			
		||||
    if systemctl is-active --quiet "$SERVICE_NAME"; then
 | 
			
		||||
@@ -192,7 +198,7 @@ EOF
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Show individual service results
 | 
			
		||||
    msg_ok "Service for ${BL}$SELECTED_INTERFACE${GN} created and enabled!"
 | 
			
		||||
    msg_ok "Service for ${BL}$SELECTED_INTERFACE${GN} (${BL}$DRIVER${GN}) created and enabled!"
 | 
			
		||||
    msg_info "${TAB}Service: ${BL}$SERVICE_NAME${YW}"
 | 
			
		||||
    msg_info "${TAB}Status: ${BL}$SERVICE_STATUS${YW}"
 | 
			
		||||
    msg_info "${TAB}Start on boot: ${BL}$BOOT_STATUS${YW}"
 | 
			
		||||
@@ -204,6 +210,8 @@ SUMMARY_MSG+="Configured Interfaces:\n"
 | 
			
		||||
 | 
			
		||||
for iface in "${INTERFACE_ARRAY[@]}"; do
 | 
			
		||||
    SERVICE_NAME="disable-nic-offload-$iface.service"
 | 
			
		||||
    DRIVER=$(basename $(readlink -f /sys/class/net/$iface/device/driver 2>/dev/null) 2>/dev/null)
 | 
			
		||||
    
 | 
			
		||||
    if systemctl is-active --quiet "$SERVICE_NAME"; then
 | 
			
		||||
        SVC_STATUS="Active"
 | 
			
		||||
    else
 | 
			
		||||
@@ -216,12 +224,20 @@ for iface in "${INTERFACE_ARRAY[@]}"; do
 | 
			
		||||
        BOOT_SVC_STATUS="Disabled"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    SUMMARY_MSG+="- $iface: $SVC_STATUS, Boot: $BOOT_SVC_STATUS\n"
 | 
			
		||||
    SUMMARY_MSG+="- $iface ($DRIVER): $SVC_STATUS, Boot: $BOOT_SVC_STATUS\n"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
# Show summary results
 | 
			
		||||
whiptail --backtitle "Intel e1000e NIC Offloading Disabler" --title "Success" --msgbox "$SUMMARY_MSG" 20 80
 | 
			
		||||
whiptail --backtitle "Intel e1000e/e1000 NIC Offloading Disabler" --title "Success" --msgbox "$SUMMARY_MSG" 22 80
 | 
			
		||||
 | 
			
		||||
msg_ok "Intel e1000e optimization complete for ${#INTERFACE_ARRAY[@]} interface(s)!"
 | 
			
		||||
msg_ok "Intel e1000e/e1000 optimization complete for ${#INTERFACE_ARRAY[@]} interface(s)!"
 | 
			
		||||
 | 
			
		||||
# Show verification commands
 | 
			
		||||
echo ""
 | 
			
		||||
msg_info "Verification commands:"
 | 
			
		||||
for iface in "${INTERFACE_ARRAY[@]}"; do
 | 
			
		||||
    echo -e "${TAB}${BL}ethtool -k $iface${CL} ${YW}# Check offloading status${CL}"
 | 
			
		||||
    echo -e "${TAB}${BL}systemctl status disable-nic-offload-$iface.service${CL} ${YW}# Check service status${CL}"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
 
 | 
			
		||||
@@ -98,11 +98,14 @@ turnkey=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "TurnKey LXCs
 | 
			
		||||
 | 
			
		||||
# Setup script environment
 | 
			
		||||
PASS="$(openssl rand -base64 8)"
 | 
			
		||||
CTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
# Prompt user to confirm container ID
 | 
			
		||||
  CTID=$(whiptail --backtitle "Container ID" --title "Choose the Container ID" --inputbox "Enter the conatiner ID..." 8 40 $(pvesh get /cluster/nextid) 3>&1 1>&2 2>&3)
 | 
			
		||||
# Prompt user to confirm Hostname
 | 
			
		||||
  HOST_NAME=$(whiptail --backtitle "Hostname" --title "Choose the Hostname" --inputbox "Enter the containers Hostname..." 8 40 "turnkey-${turnkey}" 3>&1 1>&2 2>&3)
 | 
			
		||||
PCT_OPTIONS="
 | 
			
		||||
    -features keyctl=1,nesting=1
 | 
			
		||||
    -hostname turnkey-${turnkey}
 | 
			
		||||
    -tags proxmox-helper-scripts
 | 
			
		||||
    -hostname $HOST_NAME
 | 
			
		||||
    -tags community-script
 | 
			
		||||
    -onboot 1
 | 
			
		||||
    -cores 2
 | 
			
		||||
    -memory 2048
 | 
			
		||||
@@ -199,6 +202,15 @@ pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} ${PCT_OPTIONS[@]} >/dev/
 | 
			
		||||
# Save password
 | 
			
		||||
echo "TurnKey ${turnkey} password: ${PASS}" >>~/turnkey-${turnkey}.creds # file is located in the Proxmox root directory
 | 
			
		||||
 | 
			
		||||
# If turnkey is "OpenVPN", add access to the tun device
 | 
			
		||||
TUN_DEVICE_REQUIRED=("openvpn") # Setup this way in case future turnkeys also need tun access
 | 
			
		||||
if printf '%s\n' "${TUN_DEVICE_REQUIRED[@]}" | grep -qw "${turnkey}"; then
 | 
			
		||||
  info "${turnkey} requires access to /dev/net/tun on the host. Modifying the container configuration to allow this."
 | 
			
		||||
  echo "lxc.cgroup2.devices.allow: c 10:200 rwm" >> /etc/pve/lxc/${CTID}.conf
 | 
			
		||||
  echo "lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file 0 0" >> /etc/pve/lxc/${CTID}.conf
 | 
			
		||||
  sleep 5
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Start container
 | 
			
		||||
msg "Starting LXC Container..."
 | 
			
		||||
pct start "$CTID"
 | 
			
		||||
@@ -239,4 +251,5 @@ info "Proceed to the LXC console to complete the setup."
 | 
			
		||||
echo
 | 
			
		||||
info "login: root"
 | 
			
		||||
info "password: $PASS"
 | 
			
		||||
info "(credentials also stored in the root user's root directory in the 'turnkey-${turnkey}.creds' file.)"
 | 
			
		||||
echo
 | 
			
		||||
 
 | 
			
		||||
@@ -138,36 +138,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -138,36 +138,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -139,36 +139,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -142,36 +142,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -139,36 +139,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -138,36 +138,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -184,36 +184,37 @@ function msg_error() {
 | 
			
		||||
  echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -180,36 +180,37 @@ function msg_error() {
 | 
			
		||||
  echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -139,36 +139,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -147,36 +147,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -134,36 +134,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -137,36 +137,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,552 +0,0 @@
 | 
			
		||||
#!/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
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
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/.$//')
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="ubuntu-2410-vm"
 | 
			
		||||
var_os="ubuntu"
 | 
			
		||||
var_version="2410"
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "$command"
 | 
			
		||||
  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 get_valid_nextid() {
 | 
			
		||||
  local try_id
 | 
			
		||||
  try_id=$(pvesh get /cluster/nextid)
 | 
			
		||||
  while true; do
 | 
			
		||||
    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
			
		||||
      try_id=$((try_id + 1))
 | 
			
		||||
      continue
 | 
			
		||||
    fi
 | 
			
		||||
    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
			
		||||
      try_id=$((try_id + 1))
 | 
			
		||||
      continue
 | 
			
		||||
    fi
 | 
			
		||||
    break
 | 
			
		||||
  done
 | 
			
		||||
  echo "$try_id"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 "Ubuntu 24.10 VM" --yesno "This will create a New Ubuntu 24.10 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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=$(get_valid_nextid)
 | 
			
		||||
  FORMAT=",efitype=4m"
 | 
			
		||||
  MACHINE=""
 | 
			
		||||
  DISK_SIZE="8G"
 | 
			
		||||
  DISK_CACHE=""
 | 
			
		||||
  HN="ubuntu"
 | 
			
		||||
  CPU_TYPE=""
 | 
			
		||||
  CORE_COUNT="2"
 | 
			
		||||
  RAM_SIZE="2048"
 | 
			
		||||
  BRG="vmbr0"
 | 
			
		||||
  MAC="$GEN_MAC"
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  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 Ubuntu 24.10 VM using the above default settings${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
        VMID=$(get_valid_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 ubuntu --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $VM_NAME ]; then
 | 
			
		||||
      HN="ubuntu"
 | 
			
		||||
      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 Ubuntu 24.10 VM?" --no-button Do-Over 10 58); then
 | 
			
		||||
    echo -e "${CREATING}${BOLD}${DGN}Creating a Ubuntu 24.10 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
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
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 would you 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)
 | 
			
		||||
  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 Ubuntu 24.10 Disk Image"
 | 
			
		||||
URL=https://cloud-images.ubuntu.com/oracular/current/oracular-server-cloudimg-amd64.img
 | 
			
		||||
sleep 2
 | 
			
		||||
msg_ok "${CL}${BL}${URL}${CL}"
 | 
			
		||||
curl -f#SL -o "$(basename "$URL")" "$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 Ubuntu 24.10 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
 | 
			
		||||
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 <<EOF
 | 
			
		||||
<div align='center'>
 | 
			
		||||
  <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'>
 | 
			
		||||
    <img src='https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/>
 | 
			
		||||
  </a>
 | 
			
		||||
 | 
			
		||||
  <h2 style='font-size: 24px; margin: 20px 0;'>Ubuntu 24.10 VM</h2>
 | 
			
		||||
 | 
			
		||||
  <p style='margin: 16px 0;'>
 | 
			
		||||
    <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'>
 | 
			
		||||
      <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' />
 | 
			
		||||
    </a>
 | 
			
		||||
  </p>
 | 
			
		||||
  
 | 
			
		||||
  <span style='margin: 0 10px;'>
 | 
			
		||||
    <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i>
 | 
			
		||||
    <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a>
 | 
			
		||||
  </span>
 | 
			
		||||
  <span style='margin: 0 10px;'>
 | 
			
		||||
    <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i>
 | 
			
		||||
    <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a>
 | 
			
		||||
  </span>
 | 
			
		||||
  <span style='margin: 0 10px;'>
 | 
			
		||||
    <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i>
 | 
			
		||||
    <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a>
 | 
			
		||||
  </span>
 | 
			
		||||
</div>
 | 
			
		||||
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 Ubuntu 24.10 VM ${CL}${BL}(${HN})"
 | 
			
		||||
if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  msg_info "Starting Ubuntu 24.10 VM"
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Ubuntu 24.10 VM"
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "Setup Cloud-Init before starting \n
 | 
			
		||||
More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n"
 | 
			
		||||
@@ -136,36 +136,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -138,36 +138,37 @@ function check_root() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
 | 
			
		||||
# Supported: Proxmox VE 8.0.x – 8.9.x and 9.0 (NOT 9.1+)
 | 
			
		||||
pve_check() {
 | 
			
		||||
  local PVE_VER
 | 
			
		||||
  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 8.x
 | 
			
		||||
  # Check for Proxmox VE 8.x: allow 8.0–8.9
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR < 1 || MINOR > 4)); then
 | 
			
		||||
    if ((MINOR < 0 || MINOR > 9)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
      echo -e "Required: Proxmox VE version 8.1 – 8.4"
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Check for Proxmox VE 9.x (Beta) — require confirmation
 | 
			
		||||
  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
			
		||||
  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
			
		||||
    if whiptail --title "Proxmox 9.x Detected (Beta)" \
 | 
			
		||||
      --yesno "You are using Proxmox VE $PVE_VER, which is currently in Beta state.\n\nThis version is experimentally supported.\n\nDo you want to proceed anyway?" 12 70; then
 | 
			
		||||
      msg_ok "Confirmed: Continuing with Proxmox VE $PVE_VER"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Aborted by user: Proxmox VE 9.x was not confirmed."
 | 
			
		||||
    local MINOR="${BASH_REMATCH[1]}"
 | 
			
		||||
    if ((MINOR != 0)); then
 | 
			
		||||
      msg_error "This version of Proxmox VE is not yet supported."
 | 
			
		||||
      msg_error "Supported: Proxmox VE version 9.0"
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # All other unsupported versions
 | 
			
		||||
  msg_error "This version of Proxmox VE is not supported."
 | 
			
		||||
  echo -e "Supported versions: Proxmox VE 8.1 – 8.4 or 9.x (Beta, with confirmation)"
 | 
			
		||||
  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user