mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 02:12:49 +00:00 
			
		
		
		
	Compare commits
	
		
			111 Commits
		
	
	
		
			2025-08-17
			...
			2025-08-21
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					21d2159f22 | ||
| 
						 | 
					a42ceeac98 | ||
| 
						 | 
					6e7ad44d36 | ||
| 
						 | 
					9ea852ffad | ||
| 
						 | 
					d4bd7a6fda | ||
| 
						 | 
					316f4043d4 | ||
| 
						 | 
					f799c90712 | ||
| 
						 | 
					7de8934105 | ||
| 
						 | 
					15dedc1e16 | ||
| 
						 | 
					13f46d2c58 | ||
| 
						 | 
					ff7e7a6e10 | ||
| 
						 | 
					c49519a7de | ||
| 
						 | 
					8ce4776a87 | ||
| 
						 | 
					9cda1a8680 | ||
| 
						 | 
					c9b5e27d74 | ||
| 
						 | 
					70ec048aa9 | ||
| 
						 | 
					89af0c466b | ||
| 
						 | 
					93a1710e20 | ||
| 
						 | 
					91a5c9c48f | ||
| 
						 | 
					e85353856b | ||
| 
						 | 
					bf99523a94 | ||
| 
						 | 
					c1b3321801 | ||
| 
						 | 
					beb9189c72 | ||
| 
						 | 
					186c82d156 | ||
| 
						 | 
					9d431458ca | ||
| 
						 | 
					9c86eea347 | ||
| 
						 | 
					e20af295f0 | ||
| 
						 | 
					68832d71fa | ||
| 
						 | 
					2e13483f19 | ||
| 
						 | 
					c7643ae88c | ||
| 
						 | 
					f16f7a130a | ||
| 
						 | 
					94a8fe7132 | ||
| 
						 | 
					059d297305 | ||
| 
						 | 
					2bd2a763a1 | ||
| 
						 | 
					452ba92a6f | ||
| 
						 | 
					d27a875987 | ||
| 
						 | 
					14418411f6 | ||
| 
						 | 
					f13c8ff3ce | ||
| 
						 | 
					28dc145811 | ||
| 
						 | 
					170543bb66 | ||
| 
						 | 
					c783024ef0 | ||
| 
						 | 
					19403a627b | ||
| 
						 | 
					cc08395a1d | ||
| 
						 | 
					d5093a3d9d | ||
| 
						 | 
					52c4f3e0c2 | ||
| 
						 | 
					76a4ec9e06 | ||
| 
						 | 
					bebf6f65aa | ||
| 
						 | 
					34582c4dc4 | ||
| 
						 | 
					4495878c4f | ||
| 
						 | 
					3c33e8b826 | ||
| 
						 | 
					be6cc7ddbb | ||
| 
						 | 
					615049ce5c | ||
| 
						 | 
					f9e5c46b21 | ||
| 
						 | 
					913102d66f | ||
| 
						 | 
					07628f3b76 | ||
| 
						 | 
					291d364158 | ||
| 
						 | 
					98c4a2ccae | ||
| 
						 | 
					c60098d8eb | ||
| 
						 | 
					7df1dbaf17 | ||
| 
						 | 
					304c90a1af | ||
| 
						 | 
					01fe1b1f62 | ||
| 
						 | 
					fd85e71fcf | ||
| 
						 | 
					66c03ce1b4 | ||
| 
						 | 
					067f9eb209 | ||
| 
						 | 
					cd3dbc864f | ||
| 
						 | 
					f42f06343d | ||
| 
						 | 
					e46648ecdc | ||
| 
						 | 
					206751f517 | ||
| 
						 | 
					6a06afcbb9 | ||
| 
						 | 
					bd3e93215b | ||
| 
						 | 
					94b9aa4025 | ||
| 
						 | 
					36523dfd33 | ||
| 
						 | 
					618fa65bc2 | ||
| 
						 | 
					1dd417fdaa | ||
| 
						 | 
					4480a70ceb | ||
| 
						 | 
					5d423888d9 | ||
| 
						 | 
					81876d6992 | ||
| 
						 | 
					b777d74dce | ||
| 
						 | 
					c904da6b94 | ||
| 
						 | 
					4591b58e66 | ||
| 
						 | 
					8f7cd0bff9 | ||
| 
						 | 
					60318fd77b | ||
| 
						 | 
					50c41cec72 | ||
| 
						 | 
					ef2e9803d0 | ||
| 
						 | 
					e428a05b45 | ||
| 
						 | 
					37e5f7272e | ||
| 
						 | 
					5560c4eb12 | ||
| 
						 | 
					be6e2e3cb1 | ||
| 
						 | 
					7086a15321 | ||
| 
						 | 
					23f29b14fe | ||
| 
						 | 
					9aafb65a98 | ||
| 
						 | 
					296f4577d0 | ||
| 
						 | 
					1ea1429874 | ||
| 
						 | 
					3f70f92fbb | ||
| 
						 | 
					23c6994835 | ||
| 
						 | 
					70cd362d3e | ||
| 
						 | 
					aed25098e5 | ||
| 
						 | 
					a79392149e | ||
| 
						 | 
					f32647a3d3 | ||
| 
						 | 
					bb3c77f1b6 | ||
| 
						 | 
					66a582dd09 | ||
| 
						 | 
					06eb76c5d9 | ||
| 
						 | 
					a37f921aff | ||
| 
						 | 
					5c7e221efa | ||
| 
						 | 
					7e00889967 | ||
| 
						 | 
					f1d855e331 | ||
| 
						 | 
					a33bbd603d | ||
| 
						 | 
					472ad02d44 | ||
| 
						 | 
					aed2fbc4b1 | ||
| 
						 | 
					dabb49d7eb | ||
| 
						 | 
					61b7b96780 | 
							
								
								
									
										104
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -10,8 +10,112 @@
 | 
				
			|||||||
> [!CAUTION]
 | 
					> [!CAUTION]
 | 
				
			||||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
 | 
					Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-08-22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-08-21
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - LiteLLM ([#7052](https://github.com/community-scripts/ProxmoxVE/pull/7052))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - tianji: add uv deps [@MickLesk](https://github.com/MickLesk) ([#7066](https://github.com/community-scripts/ProxmoxVE/pull/7066))
 | 
				
			||||||
 | 
					    - Zitadel: installer for v4 [@MickLesk](https://github.com/MickLesk) ([#7058](https://github.com/community-scripts/ProxmoxVE/pull/7058))
 | 
				
			||||||
 | 
					    - Paperless-NGX: create direction for nltk [@MickLesk](https://github.com/MickLesk) ([#7064](https://github.com/community-scripts/ProxmoxVE/pull/7064))
 | 
				
			||||||
 | 
					    - Immich: hotfix - revert 7035 [@vhsdream](https://github.com/vhsdream) ([#7054](https://github.com/community-scripts/ProxmoxVE/pull/7054))
 | 
				
			||||||
 | 
					    - duplicati: fix release pattern [@MickLesk](https://github.com/MickLesk) ([#7049](https://github.com/community-scripts/ProxmoxVE/pull/7049))
 | 
				
			||||||
 | 
					    - technitiumdns: fix unbound variable [@MickLesk](https://github.com/MickLesk) ([#7047](https://github.com/community-scripts/ProxmoxVE/pull/7047))
 | 
				
			||||||
 | 
					    - [core]: improve binary globbing for gh releases [@MickLesk](https://github.com/MickLesk) ([#7044](https://github.com/community-scripts/ProxmoxVE/pull/7044))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-08-20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Post-Install, change pve-test for trixie [@MickLesk](https://github.com/MickLesk) ([#7031](https://github.com/community-scripts/ProxmoxVE/pull/7031))
 | 
				
			||||||
 | 
					    - Immich: fix small issue with immich-admin "start" script [@vhsdream](https://github.com/vhsdream) ([#7035](https://github.com/community-scripts/ProxmoxVE/pull/7035))
 | 
				
			||||||
 | 
					    - WasteBin: Small fixes [@tremor021](https://github.com/tremor021) ([#7018](https://github.com/community-scripts/ProxmoxVE/pull/7018))
 | 
				
			||||||
 | 
					    - Komga: Fix update [@tremor021](https://github.com/tremor021) ([#7027](https://github.com/community-scripts/ProxmoxVE/pull/7027))
 | 
				
			||||||
 | 
					    - Barcode Buddy: Fix missing dependency [@tremor021](https://github.com/tremor021) ([#7020](https://github.com/community-scripts/ProxmoxVE/pull/7020))
 | 
				
			||||||
 | 
					    - PBS: ifupdown2 reload [@MickLesk](https://github.com/MickLesk) ([#7013](https://github.com/community-scripts/ProxmoxVE/pull/7013))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Feature: Netdata support PVE9 (Debian 13 Trixie) [@MickLesk](https://github.com/MickLesk) ([#7012](https://github.com/community-scripts/ProxmoxVE/pull/7012))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🔧 Refactor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Refactor: RustDesk Server [@tremor021](https://github.com/tremor021) ([#7008](https://github.com/community-scripts/ProxmoxVE/pull/7008))
 | 
				
			||||||
 | 
					    - ghost: fix: verbose [@CrazyWolf13](https://github.com/CrazyWolf13) ([#7023](https://github.com/community-scripts/ProxmoxVE/pull/7023))
 | 
				
			||||||
 | 
					    - Refactor: Paperless-ngx [@MickLesk](https://github.com/MickLesk) ([#6938](https://github.com/community-scripts/ProxmoxVE/pull/6938))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-08-19
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Debian 13 VM [@MickLesk](https://github.com/MickLesk) ([#6970](https://github.com/community-scripts/ProxmoxVE/pull/6970))
 | 
				
			||||||
 | 
					- Swizzin ([#6962](https://github.com/community-scripts/ProxmoxVE/pull/6962))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - [core]: create_lxc - fix offline issue with alpine packages [@MickLesk](https://github.com/MickLesk) ([#6994](https://github.com/community-scripts/ProxmoxVE/pull/6994))
 | 
				
			||||||
 | 
					    - OpenObserve: Fix release fetching [@tremor021](https://github.com/tremor021) ([#6961](https://github.com/community-scripts/ProxmoxVE/pull/6961))
 | 
				
			||||||
 | 
					    - Update hev-socks5-server-install.sh [@iAzamat2](https://github.com/iAzamat2) ([#6953](https://github.com/community-scripts/ProxmoxVE/pull/6953))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Refactor: Glances (+ Feature Bump) [@MickLesk](https://github.com/MickLesk) ([#6976](https://github.com/community-scripts/ProxmoxVE/pull/6976))
 | 
				
			||||||
 | 
					    - [core]: add new features to create_lxc [@MickLesk](https://github.com/MickLesk) ([#6979](https://github.com/community-scripts/ProxmoxVE/pull/6979))
 | 
				
			||||||
 | 
					    - [core]: extend setup_uv to work with alpine [@MickLesk](https://github.com/MickLesk) ([#6978](https://github.com/community-scripts/ProxmoxVE/pull/6978))
 | 
				
			||||||
 | 
					    - Immich: Bump version to 1.138.1 [@vhsdream](https://github.com/vhsdream) ([#6984](https://github.com/community-scripts/ProxmoxVE/pull/6984))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🔧 Refactor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Refactor: Tdarr [@MickLesk](https://github.com/MickLesk) ([#6969](https://github.com/community-scripts/ProxmoxVE/pull/6969))
 | 
				
			||||||
 | 
					    - Refactor: The Lounge [@tremor021](https://github.com/tremor021) ([#6958](https://github.com/community-scripts/ProxmoxVE/pull/6958))
 | 
				
			||||||
 | 
					    - Refactor: TeddyCloud [@tremor021](https://github.com/tremor021) ([#6963](https://github.com/community-scripts/ProxmoxVE/pull/6963))
 | 
				
			||||||
 | 
					    - Refactor: Technitium DNS [@tremor021](https://github.com/tremor021) ([#6968](https://github.com/community-scripts/ProxmoxVE/pull/6968))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - [web]: update logos from reactive-resume & slskd [@MickLesk](https://github.com/MickLesk) ([#6990](https://github.com/community-scripts/ProxmoxVE/pull/6990))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 2025-08-18
 | 
					## 2025-08-18
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - CopyParty [@MickLesk](https://github.com/MickLesk) ([#6929](https://github.com/community-scripts/ProxmoxVE/pull/6929))
 | 
				
			||||||
 | 
					- Twingate-Connector ([#6921](https://github.com/community-scripts/ProxmoxVE/pull/6921))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Keycloak: fix update function [@MickLesk](https://github.com/MickLesk) ([#6943](https://github.com/community-scripts/ProxmoxVE/pull/6943))
 | 
				
			||||||
 | 
					    - Immich: add message to indicate image-processing library update check [@vhsdream](https://github.com/vhsdream) ([#6935](https://github.com/community-scripts/ProxmoxVE/pull/6935))
 | 
				
			||||||
 | 
					    - fix(uptimekuma): unbound env variable [@vidonnus](https://github.com/vidonnus) ([#6922](https://github.com/community-scripts/ProxmoxVE/pull/6922))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🔧 Refactor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Refactor: Traefik [@tremor021](https://github.com/tremor021) ([#6940](https://github.com/community-scripts/ProxmoxVE/pull/6940))
 | 
				
			||||||
 | 
					    - Refactor: Traccar [@tremor021](https://github.com/tremor021) ([#6942](https://github.com/community-scripts/ProxmoxVE/pull/6942))
 | 
				
			||||||
 | 
					    - Refactor: Umami [@tremor021](https://github.com/tremor021) ([#6939](https://github.com/community-scripts/ProxmoxVE/pull/6939))
 | 
				
			||||||
 | 
					    - Refactor: GoMFT [@tremor021](https://github.com/tremor021) ([#6916](https://github.com/community-scripts/ProxmoxVE/pull/6916))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - OpenWRT: add info for VLAN-aware in frontend [@MickLesk](https://github.com/MickLesk) ([#6944](https://github.com/community-scripts/ProxmoxVE/pull/6944))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 2025-08-17
 | 
					## 2025-08-17
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 2025-08-16
 | 
					## 2025-08-16
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@ function update_script() {
 | 
				
			|||||||
        systemctl stop duplicati
 | 
					        systemctl stop duplicati
 | 
				
			||||||
        msg_ok "Stopped $APP"
 | 
					        msg_ok "Stopped $APP"
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "linux-x64-gui.deb"
 | 
					        fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "duplicati-*-linux-x64-gui.deb"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        msg_info "Starting $APP"
 | 
					        msg_info "Starting $APP"
 | 
				
			||||||
        systemctl start duplicati
 | 
					        systemctl start duplicati
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										75
									
								
								ct/gomft.sh
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								ct/gomft.sh
									
									
									
									
									
								
							@@ -28,83 +28,14 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  if ! dpkg -l | grep -q "^ii.*build-essential"; then
 | 
					  
 | 
				
			||||||
    $STD apt-get install -y build-essential
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  if [[ ! -f "/usr/bin/node" ]]; then
 | 
					 | 
				
			||||||
    mkdir -p /etc/apt/keyrings
 | 
					 | 
				
			||||||
    curl -fsSL "https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key" | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
					 | 
				
			||||||
    echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
					 | 
				
			||||||
    $STD apt-get update
 | 
					 | 
				
			||||||
    $STD apt-get install -y nodejs
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  RELEASE=$(curl -fsSL "https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest" | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					  RELEASE=$(curl -fsSL "https://api.github.com/repos/StarFleetCPTN/GoMFT/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 [[ "${RELEASE}" != "$(cat ~/.gomft)" ]] || [[ ! -f ~/.gomft ]]; then
 | 
				
			||||||
    msg_info "Stopping $APP"
 | 
					    msg_info "Stopping $APP"
 | 
				
			||||||
    systemctl stop gomft
 | 
					    systemctl stop gomft
 | 
				
			||||||
    msg_ok "Stopped $APP"
 | 
					    msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating $APP to ${RELEASE}"
 | 
					    fetch_and_deploy_gh_release "gomft" "StarFleetCPTN/GoMFT" "singlefile" "latest" "/opt/gomft" "gomft*linux-amd64"
 | 
				
			||||||
    if ! command -v git >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
      $STD apt-get install -y git
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    rm -f /opt/gomft/gomft
 | 
					 | 
				
			||||||
    temp_file=$(mktemp)
 | 
					 | 
				
			||||||
    curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
					 | 
				
			||||||
    tar -xzf "$temp_file"
 | 
					 | 
				
			||||||
    cp -rf "GoMFT-${RELEASE}"/* /opt/gomft/
 | 
					 | 
				
			||||||
    cd /opt/gomft
 | 
					 | 
				
			||||||
    $STD npm install
 | 
					 | 
				
			||||||
    $STD npm run build
 | 
					 | 
				
			||||||
    TEMPL_VERSION="$(awk '/github.com\/a-h\/templ/{print $2}' go.mod)"
 | 
					 | 
				
			||||||
    $STD go install github.com/a-h/templ/cmd/templ@${TEMPL_VERSION}
 | 
					 | 
				
			||||||
    # dirty hack to fix templ
 | 
					 | 
				
			||||||
    cat <<'EOF' >/opt/gomft/components/file_metadata/search/file_metadata_search_content.templ
 | 
					 | 
				
			||||||
package search
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
    "context"
 | 
					 | 
				
			||||||
    "github.com/starfleetcptn/gomft/components/file_metadata"
 | 
					 | 
				
			||||||
    "github.com/starfleetcptn/gomft/components/file_metadata/list"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ FileMetadataSearchContent(ctx context.Context, data file_metadata.FileMetadataSearchData) {
 | 
					 | 
				
			||||||
    <!-- Search Results -->
 | 
					 | 
				
			||||||
    <div id="search-results">
 | 
					 | 
				
			||||||
        if len(data.Files) > 0 {
 | 
					 | 
				
			||||||
            @list.FileMetadataListPartial(ctx, file_metadata.FileMetadataListData{
 | 
					 | 
				
			||||||
                Files:      data.Files,
 | 
					 | 
				
			||||||
                Page:       data.Page,
 | 
					 | 
				
			||||||
                Limit:      data.Limit,
 | 
					 | 
				
			||||||
                TotalCount: data.TotalCount,
 | 
					 | 
				
			||||||
                TotalPages: data.TotalPages,
 | 
					 | 
				
			||||||
                Filter:     data.Filter,
 | 
					 | 
				
			||||||
                SortBy:     data.SortBy,
 | 
					 | 
				
			||||||
                SortDir:    data.SortDir,
 | 
					 | 
				
			||||||
            }, "/files/search/partial", "#search-results-container")
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            <div class="p-6 text-center text-gray-500 dark:text-gray-400">
 | 
					 | 
				
			||||||
                <svg class="mx-auto mb-4 w-12 h-12 text-gray-400" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
 | 
					 | 
				
			||||||
                    <path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" />
 | 
					 | 
				
			||||||
                </svg>
 | 
					 | 
				
			||||||
                <p>No files found matching your search criteria.</p>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
    $STD "$HOME"/go/bin/templ generate
 | 
					 | 
				
			||||||
    export CGO_ENABLED=1
 | 
					 | 
				
			||||||
    export GOOS=linux
 | 
					 | 
				
			||||||
    $STD go build -o gomft
 | 
					 | 
				
			||||||
    chmod +x /opt/gomft/gomft
 | 
					 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					 | 
				
			||||||
    msg_ok "Updated $APP to ${RELEASE}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Cleaning Up"
 | 
					 | 
				
			||||||
    rm -f "$temp_file"
 | 
					 | 
				
			||||||
    rm -rf "$HOME/GoMFT-v.${RELEASE}/"
 | 
					 | 
				
			||||||
    msg_ok "Cleanup Complete"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting $APP"
 | 
					    msg_info "Starting $APP"
 | 
				
			||||||
    systemctl start gomft
 | 
					    systemctl start gomft
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								ct/headers/litellm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/litellm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    __    _ __       __    __    __  ___
 | 
				
			||||||
 | 
					   / /   (_) /____  / /   / /   /  |/  /
 | 
				
			||||||
 | 
					  / /   / / __/ _ \/ /   / /   / /|_/ / 
 | 
				
			||||||
 | 
					 / /___/ / /_/  __/ /___/ /___/ /  / /  
 | 
				
			||||||
 | 
					/_____/_/\__/\___/_____/_____/_/  /_/   
 | 
				
			||||||
 | 
					                                        
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/swizzin
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/swizzin
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					   _____         _           _     
 | 
				
			||||||
 | 
					  / ___/      __(_)_______  (_)___ 
 | 
				
			||||||
 | 
					  \__ \ | /| / / /_  /_  / / / __ \
 | 
				
			||||||
 | 
					 ___/ / |/ |/ / / / /_/ /_/ / / / /
 | 
				
			||||||
 | 
					/____/|__/|__/_/ /___/___/_/_/ /_/ 
 | 
				
			||||||
 | 
					                                   
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/twingate-connector
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/twingate-connector
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					  ______         _                   __             ______                            __            
 | 
				
			||||||
 | 
					 /_  __/      __(_)___  ____ _____ _/ /____        / ____/___  ____  ____  ___  _____/ /_____  _____
 | 
				
			||||||
 | 
					  / / | | /| / / / __ \/ __ `/ __ `/ __/ _ \______/ /   / __ \/ __ \/ __ \/ _ \/ ___/ __/ __ \/ ___/
 | 
				
			||||||
 | 
					 / /  | |/ |/ / / / / / /_/ / /_/ / /_/  __/_____/ /___/ /_/ / / / / / / /  __/ /__/ /_/ /_/ / /    
 | 
				
			||||||
 | 
					/_/   |__/|__/_/_/ /_/\__, /\__,_/\__/\___/      \____/\____/_/ /_/_/ /_/\___/\___/\__/\____/_/     
 | 
				
			||||||
 | 
					                     /____/                                                                         
 | 
				
			||||||
@@ -52,13 +52,14 @@ function update_script() {
 | 
				
			|||||||
  if [[ -f ~/.immich_library_revisions ]]; then
 | 
					  if [[ -f ~/.immich_library_revisions ]]; then
 | 
				
			||||||
    libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips")
 | 
					    libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips")
 | 
				
			||||||
    cd "$BASE_DIR"
 | 
					    cd "$BASE_DIR"
 | 
				
			||||||
 | 
					    msg_info "Checking for updates to custom image-processing libraries"
 | 
				
			||||||
    $STD git pull
 | 
					    $STD git pull
 | 
				
			||||||
    for library in "${libraries[@]}"; do
 | 
					    for library in "${libraries[@]}"; do
 | 
				
			||||||
      compile_"$library"
 | 
					      compile_"$library"
 | 
				
			||||||
    done
 | 
					    done
 | 
				
			||||||
    msg_ok "Image-processing libraries updated"
 | 
					    msg_ok "Image-processing libraries up to date"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  RELEASE="1.138.0"
 | 
					  RELEASE="1.138.1"
 | 
				
			||||||
  #RELEASE=$(curl -fsSL https://api.github.com/repos/immich-app/immich/releases?per_page=1 | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					  #RELEASE=$(curl -fsSL https://api.github.com/repos/immich-app/immich/releases?per_page=1 | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
  if [[ -f ~/.immich && "$RELEASE" == "$(cat ~/.immich)" ]]; then
 | 
					  if [[ -f ~/.immich && "$RELEASE" == "$(cat ~/.immich)" ]]; then
 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
@@ -108,10 +109,10 @@ function update_script() {
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -a
 | 
					set -a
 | 
				
			||||||
. "$INSTALL_DIR"/.env
 | 
					. ${INSTALL_DIR}/.env
 | 
				
			||||||
set +a
 | 
					set +a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/usr/bin/node "$APP_DIR"/dist/main.js "\$@"
 | 
					/usr/bin/node ${APP_DIR}/dist/main.js "\$@"
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
    chmod +x "$INSTALL_DIR"/start.sh
 | 
					    chmod +x "$INSTALL_DIR"/start.sh
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,38 +27,50 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					  if ! command -v jq &>/dev/null; then
 | 
				
			||||||
  msg_info "Stopping Keycloak"
 | 
					    $STD apt-get install -y jq
 | 
				
			||||||
  systemctl stop keycloak
 | 
					  fi
 | 
				
			||||||
  msg_ok "Stopped Keycloak"
 | 
					  
 | 
				
			||||||
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/keycloak/keycloak/releases/latest | jq -r '.tag_name' | sed 's/^v//')
 | 
				
			||||||
  msg_info "Updating packages"
 | 
					  if [[ "${RELEASE}" != "$(cat ~/.keycloak_app 2>/dev/null)" ]] || [[ ! -f ~/.keycloak_app ]]; then
 | 
				
			||||||
  $STD apt-get update
 | 
					    msg_info "Stopping Keycloak"
 | 
				
			||||||
  $STD apt-get -y upgrade
 | 
					    systemctl stop keycloak
 | 
				
			||||||
  msg_ok "Updated packages"
 | 
					    msg_ok "Stopped Keycloak"
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  msg_info "Backup old Keycloak"
 | 
					    msg_info "Updating packages"
 | 
				
			||||||
  cd /opt
 | 
					    $STD apt-get update
 | 
				
			||||||
  mv keycloak keycloak.old
 | 
					    $STD apt-get -y upgrade
 | 
				
			||||||
  tar -czf keycloak_conf_backup.tar.gz keycloak.old/conf
 | 
					    msg_ok "Updated packages"
 | 
				
			||||||
  msg_ok "Backup done"
 | 
					  
 | 
				
			||||||
 | 
					    msg_info "Backup old Keycloak"
 | 
				
			||||||
  fetch_and_deploy_gh_release "keycloak" "keycloak/keycloak" "prebuild" "latest" "/opt/keycloak" "keycloak-*.tar.gz"
 | 
					    cd /opt
 | 
				
			||||||
 | 
					    mv keycloak keycloak.old
 | 
				
			||||||
  msg_info "Updating ${APP}"
 | 
					    msg_ok "Backup done"
 | 
				
			||||||
  cd /opt
 | 
					  
 | 
				
			||||||
  mv keycloak_conf_backup.tar.gz keycloak/conf
 | 
					    fetch_and_deploy_gh_release "keycloak_app" "keycloak/keycloak" "prebuild" "latest" "/opt/keycloak" "keycloak-*.tar.gz"
 | 
				
			||||||
  cp -r keycloak.old/providers keycloak
 | 
					  
 | 
				
			||||||
  cp -r keycloak.old/themes keycloak
 | 
					    msg_info "Updating ${APP}"
 | 
				
			||||||
  rm -rf keycloak.old
 | 
					    cd /opt
 | 
				
			||||||
  msg_ok "Updated ${APP} LXC"
 | 
					    cp -a keycloak.old/conf/. keycloak/conf/
 | 
				
			||||||
 | 
					    cp -a keycloak.old/providers/. keycloak/providers/ 2>/dev/null || true
 | 
				
			||||||
  msg_info "Restarting Keycloak"
 | 
					    cp -a keycloak.old/themes/. keycloak/themes/ 2>/dev/null || true
 | 
				
			||||||
  systemctl restart keycloak
 | 
					    msg_ok "Updated ${APP} LXC"
 | 
				
			||||||
  msg_ok "Restarted Keycloak"
 | 
					  
 | 
				
			||||||
 | 
					    msg_info "Restarting Keycloak"
 | 
				
			||||||
 | 
					    systemctl restart keycloak
 | 
				
			||||||
 | 
					    msg_ok "Restarted Keycloak"
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    msg_info "Cleaning up"
 | 
				
			||||||
 | 
					    rm -rf keycloak.old
 | 
				
			||||||
 | 
					    msg_ok "Cleanup complete"
 | 
				
			||||||
 | 
					    msg_ok "Update Successful"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start
 | 
					start
 | 
				
			||||||
build_container
 | 
					build_container
 | 
				
			||||||
description
 | 
					description
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ function update_script() {
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/gotson/komga/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/gotson/komga/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
  if [[ ! -f ~/.komga ]] || [[ "${RELEASE}" != "$(cat ~/.komga)" ]]; then
 | 
					  if [[ ! -f ~/.komga-org ]] || [[ "${RELEASE}" != "$(cat ~/.komga-org)" ]]; then
 | 
				
			||||||
    msg_info "Stopping ${APP}"
 | 
					    msg_info "Stopping ${APP}"
 | 
				
			||||||
    systemctl stop komga
 | 
					    systemctl stop komga
 | 
				
			||||||
    msg_ok "Stopped ${APP}"
 | 
					    msg_ok "Stopped ${APP}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										60
									
								
								ct/litellm.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								ct/litellm.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					#!/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: stout01
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/BerriAI/litellm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="LiteLLM"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-ai;interface}"
 | 
				
			||||||
 | 
					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 [[ ! -f /etc/systemd/system/litellm.service ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Stopping ${APP}"
 | 
				
			||||||
 | 
					  systemctl stop litellm
 | 
				
			||||||
 | 
					  msg_ok "Stopped ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  VENV_PATH="/opt/litellm/.venv"
 | 
				
			||||||
 | 
					  PYTHON_VERSION="3.13" setup_uv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating $APP"
 | 
				
			||||||
 | 
					  $STD "$VENV_PATH/bin/python" -m pip install --upgrade litellm[proxy] prisma
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating DB Schema"
 | 
				
			||||||
 | 
					  $STD uv --directory=/opt/litellm run litellm --config /opt/litellm/litellm.yaml --use_prisma_db_push --skip_server_startup
 | 
				
			||||||
 | 
					  msg_ok "DB Schema Updated"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Starting ${APP}"
 | 
				
			||||||
 | 
					  systemctl start litellm
 | 
				
			||||||
 | 
					  msg_ok "Started ${APP}"
 | 
				
			||||||
 | 
					  msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					  exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4000${CL}"
 | 
				
			||||||
@@ -30,7 +30,7 @@ function update_script() {
 | 
				
			|||||||
    msg_info "Updating $APP"
 | 
					    msg_info "Updating $APP"
 | 
				
			||||||
    systemctl stop openobserve
 | 
					    systemctl stop openobserve
 | 
				
			||||||
    LATEST=$(curl -fsSL https://api.github.com/repos/openobserve/openobserve/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
 | 
					    LATEST=$(curl -fsSL https://api.github.com/repos/openobserve/openobserve/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
 | 
				
			||||||
    tar zxvf <(curl -fsSL https://github.com/openobserve/openobserve/releases/download/$LATEST/openobserve-${LATEST}-linux-amd64.tar.gz) -C /opt/openobserve
 | 
					    $STD tar zxvf <(curl -fsSL https://downloads.openobserve.ai/releases/openobserve/$LATEST/openobserve-$LATEST-linux-amd64.tar.gz) -C /opt/openobserve
 | 
				
			||||||
    systemctl start openobserve
 | 
					    systemctl start openobserve
 | 
				
			||||||
    msg_ok "Updated $APP"
 | 
					    msg_ok "Updated $APP"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ APP="Paperless-ngx"
 | 
				
			|||||||
var_tags="${var_tags:-document;management}"
 | 
					var_tags="${var_tags:-document;management}"
 | 
				
			||||||
var_cpu="${var_cpu:-2}"
 | 
					var_cpu="${var_cpu:-2}"
 | 
				
			||||||
var_ram="${var_ram:-2048}"
 | 
					var_ram="${var_ram:-2048}"
 | 
				
			||||||
var_disk="${var_disk:-10}"
 | 
					var_disk="${var_disk:-12}"
 | 
				
			||||||
var_os="${var_os:-debian}"
 | 
					var_os="${var_os:-debian}"
 | 
				
			||||||
var_version="${var_version:-12}"
 | 
					var_version="${var_version:-12}"
 | 
				
			||||||
var_unprivileged="${var_unprivileged:-1}"
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
@@ -20,70 +20,115 @@ color
 | 
				
			|||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function update_script() {
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
  if [[ ! -d /opt/paperless ]]; then
 | 
					  if [[ ! -d /opt/paperless ]]; then
 | 
				
			||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					  if ! command -v jq &>/dev/null; then
 | 
				
			||||||
 | 
					    $STD apt-get install -y jq
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest | jq -r .tag_name | sed 's/^v//')
 | 
				
			||||||
 | 
					  if [[ "${RELEASE}" != "$(cat ~/.paperless 2>/dev/null)" ]] || [[ ! -f ~/.paperless ]]; then
 | 
				
			||||||
 | 
					    msg_info "Stopping all Paperless-ngx Services"
 | 
				
			||||||
 | 
					    systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue
 | 
				
			||||||
 | 
					    msg_ok "Stopped all Paperless-ngx Services"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \
 | 
					    if grep -q "uv run" /etc/systemd/system/paperless-webserver.service; then
 | 
				
			||||||
    "1" "Update Paperless-ngx to $RELEASE" ON \
 | 
					
 | 
				
			||||||
    "2" "Paperless-ngx Credentials" OFF \
 | 
					      msg_info "Backing up data"
 | 
				
			||||||
    3>&1 1>&2 2>&3)
 | 
					      mkdir -p /opt/paperless/backup
 | 
				
			||||||
  header_info
 | 
					      cp -r /opt/paperless/data /opt/paperless/backup/
 | 
				
			||||||
  check_container_storage
 | 
					      cp -r /opt/paperless/media /opt/paperless/backup/
 | 
				
			||||||
  check_container_resources
 | 
					      cp -r /opt/paperless/paperless.conf /opt/paperless/backup/
 | 
				
			||||||
  if [ "$UPD" == "1" ]; then
 | 
					      msg_ok "Backup completed"
 | 
				
			||||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
					
 | 
				
			||||||
      if [[ "$(gs --version 2>/dev/null)" != "10.04.0" ]]; then
 | 
					      PYTHON_VERSION="3.13" setup_uv
 | 
				
			||||||
        msg_info "Updating Ghostscript (Patience)"
 | 
					      fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "latest" "/opt/paperless" "paperless*tar.xz"
 | 
				
			||||||
        cd /tmp
 | 
					      fetch_and_deploy_gh_release "jbig2enc" "ie13/jbig2enc" "tarball" "latest" "/opt/jbig2enc"
 | 
				
			||||||
        curl -fsSL "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz" -o $(basename "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz")
 | 
					      setup_gs
 | 
				
			||||||
        tar -xzf ghostscript-10.04.0.tar.gz
 | 
					 | 
				
			||||||
        cd ghostscript-10.04.0
 | 
					 | 
				
			||||||
        $STD ./configure
 | 
					 | 
				
			||||||
        $STD make
 | 
					 | 
				
			||||||
        $STD sudo make install
 | 
					 | 
				
			||||||
        rm -rf /tmp/ghostscript*
 | 
					 | 
				
			||||||
        msg_ok "Ghostscript updated to 10.04.0"
 | 
					 | 
				
			||||||
      fi
 | 
					 | 
				
			||||||
      msg_info "Stopping all Paperless-ngx Services"
 | 
					 | 
				
			||||||
      systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service
 | 
					 | 
				
			||||||
      msg_ok "Stopped all Paperless-ngx Services"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      msg_info "Updating to ${RELEASE}"
 | 
					      msg_info "Updating to ${RELEASE}"
 | 
				
			||||||
      cd ~
 | 
					      cp -r /opt/paperless/backup/* /opt/paperless/
 | 
				
			||||||
      curl -fsSL "https://github.com/paperless-ngx/paperless-ngx/releases/download/$RELEASE/paperless-ngx-$RELEASE.tar.xz" -o $(basename "https://github.com/paperless-ngx/paperless-ngx/releases/download/$RELEASE/paperless-ngx-$RELEASE.tar.xz")
 | 
					 | 
				
			||||||
      tar -xf paperless-ngx-$RELEASE.tar.xz
 | 
					 | 
				
			||||||
      cp -r /opt/paperless/paperless.conf paperless-ngx/
 | 
					 | 
				
			||||||
      cp -r paperless-ngx/* /opt/paperless/
 | 
					 | 
				
			||||||
      cd /opt/paperless
 | 
					      cd /opt/paperless
 | 
				
			||||||
      $STD pip install -r requirements.txt
 | 
					      $STD uv sync --all-extras
 | 
				
			||||||
      cd /opt/paperless/src
 | 
					      cd /opt/paperless/src
 | 
				
			||||||
      $STD /usr/bin/python3 manage.py migrate
 | 
					      $STD uv run -- python manage.py migrate
 | 
				
			||||||
      echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					 | 
				
			||||||
      msg_ok "Updated to ${RELEASE}"
 | 
					      msg_ok "Updated to ${RELEASE}"
 | 
				
			||||||
 | 
					 | 
				
			||||||
      msg_info "Cleaning up"
 | 
					 | 
				
			||||||
      cd ~
 | 
					 | 
				
			||||||
      rm paperless-ngx-$RELEASE.tar.xz
 | 
					 | 
				
			||||||
      rm -rf paperless-ngx
 | 
					 | 
				
			||||||
      msg_ok "Cleaned"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      msg_info "Starting all Paperless-ngx Services"
 | 
					 | 
				
			||||||
      systemctl start paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue.service
 | 
					 | 
				
			||||||
      sleep 1
 | 
					 | 
				
			||||||
      msg_ok "Started all Paperless-ngx Services"
 | 
					 | 
				
			||||||
      msg_ok "Updated Successfully!\n"
 | 
					 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
					      msg_warn "You are about to migrate your Paperless-ngx installation to uv!"
 | 
				
			||||||
 | 
					      msg_custom "🔒" "It is strongly recommended to take a Proxmox snapshot first:"
 | 
				
			||||||
 | 
					      echo -e "   1. Stop the container:  pct stop <CTID>"
 | 
				
			||||||
 | 
					      echo -e "   2. Create a snapshot:  pct snapshot <CTID> pre-paperless-uv-migration"
 | 
				
			||||||
 | 
					      echo -e "   3. Start the container again\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      read -rp "Have you created a snapshot? [y/N]: " confirm
 | 
				
			||||||
 | 
					      if [[ ! "$confirm" =~ ^([yY]|[yY][eE][sS])$ ]]; then
 | 
				
			||||||
 | 
					        msg_error "Migration aborted. Please create a snapshot first."
 | 
				
			||||||
 | 
					        exit 1
 | 
				
			||||||
 | 
					      fi
 | 
				
			||||||
 | 
					      msg_info "Migrating old Paperless-ngx installation to uv"
 | 
				
			||||||
 | 
					      rm -rf /opt/paperless/venv
 | 
				
			||||||
 | 
					      find /opt/paperless -name "__pycache__" -type d -exec rm -rf {} +
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      declare -A PATCHES=(
 | 
				
			||||||
 | 
					        ["paperless-consumer.service"]="ExecStart=uv run -- python manage.py document_consumer"
 | 
				
			||||||
 | 
					        ["paperless-scheduler.service"]="ExecStart=uv run -- celery --app paperless beat --loglevel INFO"
 | 
				
			||||||
 | 
					        ["paperless-task-queue.service"]="ExecStart=uv run -- celery --app paperless worker --loglevel INFO"
 | 
				
			||||||
 | 
					        ["paperless-webserver.service"]="ExecStart=uv run -- granian --interface asgi --ws \"paperless.asgi:application\""
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      for svc in "${!PATCHES[@]}"; do
 | 
				
			||||||
 | 
					        path=$(systemctl show -p FragmentPath "$svc" | cut -d= -f2)
 | 
				
			||||||
 | 
					        if [[ -n "$path" && -f "$path" ]]; then
 | 
				
			||||||
 | 
					          sed -i "s|^ExecStart=.*|${PATCHES[$svc]}|" "$path"
 | 
				
			||||||
 | 
					          if [[ "$svc" == "paperless-webserver.service" ]]; then
 | 
				
			||||||
 | 
					            grep -q "^Environment=GRANIAN_HOST=" "$path" ||
 | 
				
			||||||
 | 
					              sed -i '/^\[Service\]/a Environment=GRANIAN_HOST=::' "$path"
 | 
				
			||||||
 | 
					            grep -q "^Environment=GRANIAN_PORT=" "$path" ||
 | 
				
			||||||
 | 
					              sed -i '/^\[Service\]/a Environment=GRANIAN_PORT=8000' "$path"
 | 
				
			||||||
 | 
					            grep -q "^Environment=GRANIAN_WORKERS=" "$path" ||
 | 
				
			||||||
 | 
					              sed -i '/^\[Service\]/a Environment=GRANIAN_WORKERS=1' "$path"
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
 | 
					          msg_ok "Patched $svc"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          msg_error "Service file for $svc not found!"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					      done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      $STD systemctl daemon-reload
 | 
				
			||||||
 | 
					      msg_info "Backing up data"
 | 
				
			||||||
 | 
					      mkdir -p /opt/paperless/backup
 | 
				
			||||||
 | 
					      cp -r /opt/paperless/data /opt/paperless/backup/
 | 
				
			||||||
 | 
					      cp -r /opt/paperless/media /opt/paperless/backup/
 | 
				
			||||||
 | 
					      cp -r /opt/paperless/paperless.conf /opt/paperless/backup/
 | 
				
			||||||
 | 
					      msg_ok "Backup completed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      PYTHON_VERSION="3.13" setup_uv
 | 
				
			||||||
 | 
					      fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "latest" "/opt/paperless" "paperless*tar.xz"
 | 
				
			||||||
 | 
					      fetch_and_deploy_gh_release "jbig2enc" "ie13/jbig2enc" "tarball" "latest" "/opt/jbig2enc"
 | 
				
			||||||
 | 
					      setup_gs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      msg_info "Updating Paperless-ngx"
 | 
				
			||||||
 | 
					      cp -r /opt/paperless/backup/* /opt/paperless/
 | 
				
			||||||
 | 
					      cd /opt/paperless
 | 
				
			||||||
 | 
					      $STD uv sync --all-extras
 | 
				
			||||||
 | 
					      cd /opt/paperless/src
 | 
				
			||||||
 | 
					      $STD uv run -- python manage.py migrate
 | 
				
			||||||
 | 
					      msg_ok "Paperless-ngx migration and update to ${RELEASE} completed"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    exit
 | 
					
 | 
				
			||||||
  fi
 | 
					    msg_info "Starting all Paperless-ngx Services"
 | 
				
			||||||
  if [ "$UPD" == "2" ]; then
 | 
					    systemctl start paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue
 | 
				
			||||||
    cat paperless.creds
 | 
					    sleep 1
 | 
				
			||||||
    exit
 | 
					    msg_ok "Started all Paperless-ngx Services"
 | 
				
			||||||
 | 
					    msg_ok "Updated Successfully!\n"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start
 | 
					start
 | 
				
			||||||
@@ -94,3 +139,4 @@ msg_ok "Completed Successfully!\n"
 | 
				
			|||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,13 +28,10 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  if [[ ! -f /opt/rustdeskapi_version.txt ]]; then
 | 
					  
 | 
				
			||||||
    touch /opt/rustdeskapi_version.txt
 | 
					 | 
				
			||||||
    exit
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/rustdesk/rustdesk-server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/rustdesk/rustdesk-server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
  APIRELEASE=$(curl -fsSL https://api.github.com/repos/lejianwen/rustdesk-api/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					  APIRELEASE=$(curl -fsSL https://api.github.com/repos/lejianwen/rustdesk-api/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
  if [[ "${RELEASE}" != "$(cat /opt/rustdesk_version.txt)" ]] || [[ "${APIRELEASE}" != "$(cat /opt/rustdeskapi_version.txt)" ]] || [[ ! -f /opt/rustdesk_version.txt ]] || [[ ! -f /opt/rustdeskapi_version.txt ]]; then
 | 
					  if [[ "${RELEASE}" != "$(cat ~/.rustdesk-hbbr)" ]] || [[ "${APIRELEASE}" != "$(cat ~/.rustdesk-api)" ]] || [[ ! -f ~/.rustdesk-hbbr ]] || [[ ! -f ~/.rustdesk-api ]]; then
 | 
				
			||||||
    msg_info "Stopping $APP"
 | 
					    msg_info "Stopping $APP"
 | 
				
			||||||
    systemctl stop rustdesk-hbbr
 | 
					    systemctl stop rustdesk-hbbr
 | 
				
			||||||
    systemctl stop rustdesk-hbbs
 | 
					    systemctl stop rustdesk-hbbs
 | 
				
			||||||
@@ -43,28 +40,15 @@ function update_script() {
 | 
				
			|||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_ok "Stopped $APP"
 | 
					    msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating $APP to v${RELEASE}"
 | 
					    fetch_and_deploy_gh_release "rustdesk-hbbr" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*amd64.deb"
 | 
				
			||||||
    TEMPDIR=$(mktemp -d)
 | 
					    fetch_and_deploy_gh_release "rustdesk-hbbs" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*amd64.deb"
 | 
				
			||||||
    curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-hbbr_${RELEASE}_amd64.deb" \
 | 
					    fetch_and_deploy_gh_release "rustdesk-utils" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*amd64.deb"
 | 
				
			||||||
      -o "${TEMPDIR}/rustdesk-server-hbbr_${RELEASE}_amd64.deb"
 | 
					    fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*amd64.deb"
 | 
				
			||||||
    curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-hbbs_${RELEASE}_amd64.deb" \
 | 
					 | 
				
			||||||
      -o "${TEMPDIR}/rustdesk-server-hbbs_${RELEASE}_amd64.deb"
 | 
					 | 
				
			||||||
    curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-utils_${RELEASE}_amd64.deb" \
 | 
					 | 
				
			||||||
      -o "${TEMPDIR}/rustdesk-server-utils_${RELEASE}_amd64.deb"
 | 
					 | 
				
			||||||
    curl -fsSL "https://github.com/lejianwen/rustdesk-api/releases/download/v${APIRELEASE}/rustdesk-api-server_${APIRELEASE}_amd64.deb" \
 | 
					 | 
				
			||||||
      -o "${TEMPDIR}/rustdesk-api-server_${APIRELEASE}_amd64.deb"
 | 
					 | 
				
			||||||
    $STD dpkg -i $TEMPDIR/*.deb
 | 
					 | 
				
			||||||
    echo "${RELEASE}" >/opt/rustdesk_version.txt
 | 
					 | 
				
			||||||
    echo "${APIRELEASE}" >/opt/rustdeskapi_version.txt
 | 
					 | 
				
			||||||
    msg_ok "Updated $APP to v${RELEASE}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Cleaning Up"
 | 
					 | 
				
			||||||
    rm -rf $TEMPDIR
 | 
					 | 
				
			||||||
    msg_ok "Cleanup Completed"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting services"
 | 
					    msg_info "Starting services"
 | 
				
			||||||
    systemctl start -q rustdesk-* --all
 | 
					    systemctl start -q rustdesk-* --all
 | 
				
			||||||
    msg_ok "Services started"
 | 
					    msg_ok "Services started"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_ok "Update Successful"
 | 
					    msg_ok "Update Successful"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										43
									
								
								ct/swizzin.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								ct/swizzin.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					#!/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: EEJoshua
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://swizzin.ltd/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Swizzin"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-seedbox}"
 | 
				
			||||||
 | 
					var_cpu="${var_cpu:-2}"
 | 
				
			||||||
 | 
					var_ram="${var_ram:-4096}"
 | 
				
			||||||
 | 
					var_disk="${var_disk:-20}"
 | 
				
			||||||
 | 
					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 ! command -v sudo box >/dev/null 2>&1; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} installation found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  msg_info "Running 'sudo box update' inside the container"
 | 
				
			||||||
 | 
					  $STD sudo box update
 | 
				
			||||||
 | 
					  msg_ok "Update finished"
 | 
				
			||||||
 | 
					  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}If installed panel, access through the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
				
			||||||
							
								
								
									
										36
									
								
								ct/tdarr.sh
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								ct/tdarr.sh
									
									
									
									
									
								
							@@ -20,18 +20,30 @@ color
 | 
				
			|||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function update_script() {
 | 
					function update_script() {
 | 
				
			||||||
    header_info
 | 
					  header_info
 | 
				
			||||||
    check_container_storage
 | 
					  check_container_storage
 | 
				
			||||||
    check_container_resources
 | 
					  check_container_resources
 | 
				
			||||||
    if [[ ! -d /opt/tdarr ]]; then
 | 
					  if [[ ! -d /opt/tdarr ]]; then
 | 
				
			||||||
        msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    msg_info "Updating $APP LXC"
 | 
					 | 
				
			||||||
    $STD apt-get update
 | 
					 | 
				
			||||||
    $STD apt-get -y upgrade
 | 
					 | 
				
			||||||
    msg_ok "Updated $APP LXC"
 | 
					 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  msg_info "Updating $APP LXC"
 | 
				
			||||||
 | 
					  $STD apt-get update
 | 
				
			||||||
 | 
					  $STD apt-get -y upgrade
 | 
				
			||||||
 | 
					  rm -rf /opt/tdarr/Tdarr_Updater
 | 
				
			||||||
 | 
					  cd /opt/tdarr
 | 
				
			||||||
 | 
					  RELEASE=$(curl -fsSL https://f000.backblazeb2.com/file/tdarrs/versions.json | grep -oP '(?<="Tdarr_Updater": ")[^"]+' | grep linux_x64 | head -n 1)
 | 
				
			||||||
 | 
					  curl -fsSL "$RELEASE" -o Tdarr_Updater.zip
 | 
				
			||||||
 | 
					  $STD unzip Tdarr_Updater.zip
 | 
				
			||||||
 | 
					  chmod +x Tdarr_Updater
 | 
				
			||||||
 | 
					  $STD ./Tdarr_Updater
 | 
				
			||||||
 | 
					  msg_ok "Updated $APP LXC"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Cleaning up"
 | 
				
			||||||
 | 
					  rm -rf /opt/tdarr/Tdarr_Updater.zip
 | 
				
			||||||
 | 
					  msg_ok "Cleaned"
 | 
				
			||||||
 | 
					  msg_ok "$APP has been successfully updated!"
 | 
				
			||||||
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start
 | 
					start
 | 
				
			||||||
@@ -41,4 +53,4 @@ description
 | 
				
			|||||||
msg_ok "Completed Successfully!\n"
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8265${CL}"
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8265${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,17 +27,20 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  msg_info "Updating ${APP}"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ! dpkg -s aspnetcore-runtime-8.0 >/dev/null 2>&1; then
 | 
					  RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+')
 | 
				
			||||||
    curl -fsSL "https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb" -o $(basename "https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb")
 | 
					  if [[ ! -f ~/.technitium || "${RELEASE}" != "$(cat ~/.technitium)" ]]; then
 | 
				
			||||||
    $STD dpkg -i packages-microsoft-prod.deb
 | 
					    msg_info "Updating ${APP}"
 | 
				
			||||||
    $STD apt-get update
 | 
					    curl -fsSL "https://download.technitium.com/dns/DnsServerPortable.tar.gz" -o /opt/DnsServerPortable.tar.gz
 | 
				
			||||||
    $STD apt-get install -y aspnetcore-runtime-8.0
 | 
					    $STD tar zxvf /opt/DnsServerPortable.tar.gz -C /opt/technitium/dns/
 | 
				
			||||||
    rm packages-microsoft-prod.deb
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Cleaning up"
 | 
				
			||||||
 | 
					    rm -f /opt/DnsServerPortable.tar.gz
 | 
				
			||||||
 | 
					    msg_ok "Cleaned up"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_ok "No update required.  ${APP} is already at v${RELEASE}."
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  $STD bash <(curl -fsSL https://download.technitium.com/dns/install.sh)
 | 
					 | 
				
			||||||
  msg_ok "Updated Successfully"
 | 
					 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,32 +26,34 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  RELEASE="$(curl -fsSL https://api.github.com/repos/toniebox-reverse-engineering/teddycloud/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')"
 | 
					  RELEASE="$(curl -fsSL https://api.github.com/repos/toniebox-reverse-engineering/teddycloud/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')"
 | 
				
			||||||
  VERSION="${RELEASE#tc_v}"
 | 
					  if [[ ! -f ~/.teddycloud || "${RELEASE}" != "$(cat ~/.teddycloud)" ]]; then
 | 
				
			||||||
  if [[ ! -f "/opt/${APP}_version.txt" || "${VERSION}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
					 | 
				
			||||||
    msg_info "Stopping ${APP}"
 | 
					    msg_info "Stopping ${APP}"
 | 
				
			||||||
    systemctl stop teddycloud
 | 
					    systemctl stop teddycloud
 | 
				
			||||||
    msg_ok "Stopped ${APP}"
 | 
					    msg_ok "Stopped ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating ${APP} to v${VERSION}"
 | 
					    msg_info "Creating backup"
 | 
				
			||||||
    cd /opt
 | 
					 | 
				
			||||||
    mv /opt/teddycloud /opt/teddycloud_bak
 | 
					    mv /opt/teddycloud /opt/teddycloud_bak
 | 
				
			||||||
    curl -fsSL "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip" -o $(basename "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip")
 | 
					    msg_ok "Backup created"
 | 
				
			||||||
    $STD unzip -d /opt/teddycloud teddycloud.amd64.release_v${VERSION}.zip
 | 
					
 | 
				
			||||||
 | 
					    fetch_and_deploy_gh_release "teddycloud" "toniebox-reverse-engineering/teddycloud" "prebuild" "latest" "/opt/teddycloud" "teddycloud.amd64.release*.zip"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Restoring data"
 | 
				
			||||||
    cp -R /opt/teddycloud_bak/certs /opt/teddycloud_bak/config /opt/teddycloud_bak/data /opt/teddycloud
 | 
					    cp -R /opt/teddycloud_bak/certs /opt/teddycloud_bak/config /opt/teddycloud_bak/data /opt/teddycloud
 | 
				
			||||||
    echo "${VERSION}" >"/opt/${APP}_version.txt"
 | 
					    msg_ok "Data restored"
 | 
				
			||||||
    msg_ok "Updated ${APP} to v${VERSION}"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting ${APP}"
 | 
					    msg_info "Starting ${APP}"
 | 
				
			||||||
    systemctl start teddycloud
 | 
					    systemctl start teddycloud
 | 
				
			||||||
    msg_ok "Started ${APP}"
 | 
					    msg_ok "Started ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Cleaning up"
 | 
					    msg_info "Cleaning up"
 | 
				
			||||||
    rm -rf /opt/teddycloud.amd64.release_v${VERSION}.zip
 | 
					 | 
				
			||||||
    rm -rf /opt/teddycloud_bak
 | 
					    rm -rf /opt/teddycloud_bak
 | 
				
			||||||
    msg_ok "Cleaned"
 | 
					    msg_ok "Cleaned"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_ok "Updated successfully"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at v${VERSION}"
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,33 +27,15 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  if ! dpkg -l build-essential >/dev/null 2>&1; then
 | 
					
 | 
				
			||||||
    $STD apt-get update
 | 
					 | 
				
			||||||
    $STD apt-get install -y build-essential
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  if ! npm list -g node-gyp >/dev/null 2>&1; then
 | 
					 | 
				
			||||||
    $STD npm install -g node-gyp
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/thelounge/thelounge-deb/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/thelounge/thelounge-deb/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 ~/.thelounge ]] || [[ "${RELEASE}" != "$(cat ~/.thelounge)" ]]; then
 | 
				
			||||||
    msg_info "Stopping Service"
 | 
					    msg_info "Stopping Service"
 | 
				
			||||||
    systemctl stop thelounge
 | 
					    systemctl stop thelounge
 | 
				
			||||||
    msg_ok "Stopped Service"
 | 
					    msg_ok "Stopped Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
					    fetch_and_deploy_gh_release "thelounge" "thelounge/thelounge-deb" "binary"
 | 
				
			||||||
    $STD apt-get install --only-upgrade nodejs
 | 
					 | 
				
			||||||
    cd /opt
 | 
					 | 
				
			||||||
    curl -fsSL "https://github.com/thelounge/thelounge-deb/releases/download/v${RELEASE}/thelounge_${RELEASE}_all.deb" -o $(basename "https://github.com/thelounge/thelounge-deb/releases/download/v${RELEASE}/thelounge_${RELEASE}_all.deb")
 | 
					 | 
				
			||||||
    dpkg -i ./thelounge_${RELEASE}_all.deb
 | 
					 | 
				
			||||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting Service"
 | 
					 | 
				
			||||||
    systemctl start thelounge
 | 
					 | 
				
			||||||
    msg_ok "Started Service"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Cleaning up"
 | 
					 | 
				
			||||||
    rm -rf "/opt/thelounge_${RELEASE}_all.deb"
 | 
					 | 
				
			||||||
    msg_ok "Cleaned"
 | 
					 | 
				
			||||||
    msg_ok "Updated Successfully"
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    msg_ok "No update required.  ${APP} is already at v${RELEASE}."
 | 
					    msg_ok "No update required.  ${APP} is already at v${RELEASE}."
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,42 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
					    
 | 
				
			||||||
 | 
					    RELEASE=$(curl -fsSL https://api.github.com/repos/traccar/traccar/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					    if [[ "${RELEASE}" != "$(cat ~/.traccar)" ]] || [[ ! -f ~/.traccar ]]; then
 | 
				
			||||||
 | 
					      msg_info "Stopping service"
 | 
				
			||||||
 | 
					      systemctl stop traccar
 | 
				
			||||||
 | 
					      msg_ok "Service stopped"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      msg_info "Creating backup"
 | 
				
			||||||
 | 
					      mv /opt/traccar/conf/traccar.xml /opt
 | 
				
			||||||
 | 
					      [[ -d /opt/traccar/data ]] && mv /opt/traccar/data /opt
 | 
				
			||||||
 | 
					      [[ -d /opt/traccar/media ]] && mv /opt/traccar/media /opt
 | 
				
			||||||
 | 
					      msg_ok "Backup created"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      rm -rf /opt/traccar
 | 
				
			||||||
 | 
					      fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-64*.zip"
 | 
				
			||||||
 | 
					      cd /opt/traccar
 | 
				
			||||||
 | 
					      $STD ./traccar.run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      msg_info "Restoring data"
 | 
				
			||||||
 | 
					      mv /opt/traccar.xml /opt/traccar/conf
 | 
				
			||||||
 | 
					      [[ -d /opt/data ]] && mv /opt/data /opt/traccar
 | 
				
			||||||
 | 
					      [[ -d /opt/media ]] && mv /opt/media /opt/traccar
 | 
				
			||||||
 | 
					      msg_ok "Data restored"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      msg_info "Starting ${APP}"
 | 
				
			||||||
 | 
					      systemctl start traccar
 | 
				
			||||||
 | 
					      msg_ok "Started ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      msg_info "Cleaning up"
 | 
				
			||||||
 | 
					      [ -f README.txt ] || [ -f traccar.run ] && rm -f README.txt traccar.run
 | 
				
			||||||
 | 
					      msg_ok "Cleaned up"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      msg_ok "Successfully updated ${APP}"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -38,4 +73,4 @@ description
 | 
				
			|||||||
msg_ok "Completed Successfully!\n"
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8082${CL}"
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8082${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,16 +27,20 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/traefik/traefik/releases | grep -oP '"tag_name":\s*"v\K[\d.]+?(?=")' | sort -V | tail -n 1)
 | 
					
 | 
				
			||||||
  msg_info "Updating $APP LXC"
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/traefik/traefik/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 [[ "${RELEASE}" != "$(cat ~/.traefik)" ]] || [[ ! -f ~/.traefik ]]; then
 | 
				
			||||||
    curl -fsSL "https://github.com/traefik/traefik/releases/download/v${RELEASE}/traefik_v${RELEASE}_linux_amd64.tar.gz" -o $(basename "https://github.com/traefik/traefik/releases/download/v${RELEASE}/traefik_v${RELEASE}_linux_amd64.tar.gz")
 | 
					    msg_info "Stopping service"
 | 
				
			||||||
    tar -C /tmp -xzf traefik*.tar.gz
 | 
					    systemctl stop traefik
 | 
				
			||||||
    mv /tmp/traefik /usr/bin/
 | 
					    msg_ok "Service stopped"
 | 
				
			||||||
    rm -rf traefik*.tar.gz
 | 
					
 | 
				
			||||||
    systemctl restart traefik.service
 | 
					    fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_amd64.tar.gz"
 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					
 | 
				
			||||||
    msg_ok "Updated $APP LXC"
 | 
					    msg_info "Starting ${APP}"
 | 
				
			||||||
 | 
					    systemctl start traefik
 | 
				
			||||||
 | 
					    msg_ok "Started ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_ok "Successfully updated ${APP}"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
					    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										44
									
								
								ct/twingate-connector.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								ct/twingate-connector.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					#!/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: twingate-andrewb
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://www.twingate.com/docs/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Twingate-Connector"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-network;connector;twingate}"
 | 
				
			||||||
 | 
					var_cpu="${var_cpu:-1}"
 | 
				
			||||||
 | 
					var_ram="${var_ram:-1024}"
 | 
				
			||||||
 | 
					var_disk="${var_disk:-3}"
 | 
				
			||||||
 | 
					var_os="${var_os:-ubuntu}"
 | 
				
			||||||
 | 
					var_version="${var_version:-24.04}"
 | 
				
			||||||
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ ! -f /lib/systemd/system/twingate-connector.service ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating ${APP}"
 | 
				
			||||||
 | 
					  $STD apt update
 | 
				
			||||||
 | 
					  $STD apt install -yq twingate-connector
 | 
				
			||||||
 | 
					  $STD systemctl restart twingate-connector
 | 
				
			||||||
 | 
					  msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					  exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "All Finished! If you need to update your access or refresh tokens, they can be found in /etc/twingate/connector.conf"
 | 
				
			||||||
@@ -32,11 +32,12 @@ function update_script() {
 | 
				
			|||||||
    systemctl stop umami
 | 
					    systemctl stop umami
 | 
				
			||||||
    msg_ok "Stopped $APP"
 | 
					    msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fetch_and_deploy_gh_release "umami" "umami-software/umami" "tarball"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating ${APP}"
 | 
					    msg_info "Updating ${APP}"
 | 
				
			||||||
    cd /opt/umami
 | 
					    cd /opt/umami
 | 
				
			||||||
    git pull
 | 
					    $STD yarn install
 | 
				
			||||||
    yarn install
 | 
					    $STD yarn run build
 | 
				
			||||||
    yarn build
 | 
					 | 
				
			||||||
    msg_ok "Updated ${APP}"
 | 
					    msg_ok "Updated ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting ${APP}"
 | 
					    msg_info "Starting ${APP}"
 | 
				
			||||||
@@ -54,4 +55,4 @@ description
 | 
				
			|||||||
msg_ok "Completed Successfully!\n"
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
echo -e "${INFO}${YW} Access it using the following URL:${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}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,7 +44,7 @@ function update_script() {
 | 
				
			|||||||
    fetch_and_deploy_gh_release "uptime-kuma" "louislam/uptime-kuma" "tarball"
 | 
					    fetch_and_deploy_gh_release "uptime-kuma" "louislam/uptime-kuma" "tarball"
 | 
				
			||||||
    cd /opt/uptime-kuma
 | 
					    cd /opt/uptime-kuma
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating ${APP} to ${LATEST}"
 | 
					    msg_info "Updating ${APP} to ${RELEASE}"
 | 
				
			||||||
    $STD npm install --omit dev
 | 
					    $STD npm install --omit dev
 | 
				
			||||||
    $STD npm run download-dist
 | 
					    $STD npm run download-dist
 | 
				
			||||||
    msg_ok "Updated ${APP}"
 | 
					    msg_ok "Updated ${APP}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,10 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					  if ! [[ $(dpkg -s zstd 2>/dev/null) ]]; then
 | 
				
			||||||
 | 
					    $STD apt-get update
 | 
				
			||||||
 | 
					    $STD apt-get install -y zstd
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
  # Dirty-Fix 03/2025 for missing APP_version.txt on old installations, set to pre-latest release
 | 
					  # Dirty-Fix 03/2025 for missing APP_version.txt on old installations, set to pre-latest release
 | 
				
			||||||
  msg_info "Running Migration"
 | 
					  msg_info "Running Migration"
 | 
				
			||||||
@@ -66,8 +70,9 @@ EOF
 | 
				
			|||||||
    temp_file=$(mktemp)
 | 
					    temp_file=$(mktemp)
 | 
				
			||||||
    curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst" -o "$temp_file"
 | 
					    curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst" -o "$temp_file"
 | 
				
			||||||
    tar -xf $temp_file
 | 
					    tar -xf $temp_file
 | 
				
			||||||
    cp -f wastebin /opt/wastebin/
 | 
					    cp -f wastebin* /opt/wastebin/
 | 
				
			||||||
    chmod +x /opt/wastebin/wastebin
 | 
					    chmod +x /opt/wastebin/wastebin
 | 
				
			||||||
 | 
					    chmod +x /opt/wastebin/wastebin-ctl
 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
    msg_ok "Updated Wastebin"
 | 
					    msg_ok "Updated Wastebin"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								frontend/public/json/copyparty.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								frontend/public/json/copyparty.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "Copyparty",
 | 
				
			||||||
 | 
					  "slug": "copyparty",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    11
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-08-18",
 | 
				
			||||||
 | 
					  "type": "addon",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": null,
 | 
				
			||||||
 | 
					  "documentation": "https://github.com/9001/copyparty?tab=readme-ov-file#the-browser",
 | 
				
			||||||
 | 
					  "website": "https://github.com/9001/copyparty",
 | 
				
			||||||
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/copyparty.webp",
 | 
				
			||||||
 | 
					  "config_path": "/etc/copyparty.conf",
 | 
				
			||||||
 | 
					  "description": "Copyparty is a lightweight, portable HTTP file server with a browser-based interface. It supports drag-and-drop uploads, downloads, deduplication, media playback, and advanced search, making it ideal for quickly sharing and managing files.",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "tools/addon/copyparty.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": null,
 | 
				
			||||||
 | 
					        "ram": null,
 | 
				
			||||||
 | 
					        "hdd": null,
 | 
				
			||||||
 | 
					        "os": null,
 | 
				
			||||||
 | 
					        "version": null
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": null,
 | 
				
			||||||
 | 
					    "password": null
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "Execute within the Proxmox shell or in LXC",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										48
									
								
								frontend/public/json/debian-13-vm.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								frontend/public/json/debian-13-vm.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "Debian 13",
 | 
				
			||||||
 | 
					  "slug": "debian-13-vm",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    2
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-08-19",
 | 
				
			||||||
 | 
					  "type": "vm",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": null,
 | 
				
			||||||
 | 
					  "documentation": null,
 | 
				
			||||||
 | 
					  "website": "https://www.debian.org/",
 | 
				
			||||||
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/debian.webp",
 | 
				
			||||||
 | 
					  "config_path": "",
 | 
				
			||||||
 | 
					  "description": "Debian 13 (Trixie) Linux is a distribution that emphasizes free software. It supports many hardware platforms",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "vm/debian-13-vm.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 2,
 | 
				
			||||||
 | 
					        "ram": 2048,
 | 
				
			||||||
 | 
					        "hdd": 4,
 | 
				
			||||||
 | 
					        "os": null,
 | 
				
			||||||
 | 
					        "version": null
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": null,
 | 
				
			||||||
 | 
					    "password": null
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "VM has no root password set. To login type in user `root` and just press enter",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "After installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/836´ for useful Debian commands",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					      "text": "If you use Cloud-init, checkout after installation: ´https://github.com/community-scripts/ProxmoxVE/discussions/272´",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -6,7 +6,7 @@
 | 
				
			|||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "date_created": "2024-05-02",
 | 
					  "date_created": "2024-05-02",
 | 
				
			||||||
  "type": "addon",
 | 
					  "type": "addon",
 | 
				
			||||||
  "updateable": false,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 61208,
 | 
					  "interface_port": 61208,
 | 
				
			||||||
  "documentation": "https://glances.readthedocs.io/en/latest/",
 | 
					  "documentation": "https://glances.readthedocs.io/en/latest/",
 | 
				
			||||||
@@ -33,12 +33,8 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "notes": [
 | 
					  "notes": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      "text": "Execute within an existing LXC Console",
 | 
					      "text": "Execute within an existing LXC Console (Debian / Ubuntu / Alpine supported)",
 | 
				
			||||||
      "type": "warning"
 | 
					      "type": "info"
 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
 | 
					 | 
				
			||||||
      "type": "warning"
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								frontend/public/json/litellm.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								frontend/public/json/litellm.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "LiteLLM",
 | 
				
			||||||
 | 
					  "slug": "litellm",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    20
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-08-21",
 | 
				
			||||||
 | 
					  "type": "ct",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": 4000,
 | 
				
			||||||
 | 
					  "documentation": "https://docs.litellm.ai/",
 | 
				
			||||||
 | 
					  "config_path": "/opt/litellm/litellm.yaml",
 | 
				
			||||||
 | 
					  "website": "https://www.litellm.ai/",
 | 
				
			||||||
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/litellm-light.webp",
 | 
				
			||||||
 | 
					  "description": "LLM proxy to call 100+ LLMs in a unified interface & track spend, set budgets per virtual key/user",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "ct/litellm.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 2,
 | 
				
			||||||
 | 
					        "ram": 2048,
 | 
				
			||||||
 | 
					        "hdd": 4,
 | 
				
			||||||
 | 
					        "os": "Debian",
 | 
				
			||||||
 | 
					        "version": "12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": "admin",
 | 
				
			||||||
 | 
					    "password": "sk-1234"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "Update master key in the config file",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
  "updateable": true,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 5080,
 | 
					  "interface_port": 5080,
 | 
				
			||||||
  "documentation": null,
 | 
					  "documentation": "https://openobserve.ai/docs/",
 | 
				
			||||||
  "website": "https://openobserve.ai/",
 | 
					  "website": "https://openobserve.ai/",
 | 
				
			||||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/openobserve.webp",
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/openobserve.webp",
 | 
				
			||||||
  "config_path": "/opt/openobserve/data/.env",
 | 
					  "config_path": "/opt/openobserve/data/.env",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,5 +32,10 @@
 | 
				
			|||||||
    "username": null,
 | 
					    "username": null,
 | 
				
			||||||
    "password": null
 | 
					    "password": null
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "notes": []
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "If you use VLANs (default LAN is set to VLAN 999), make sure the Proxmox Linux Bridge is configured as VLAN-aware, otherwise the VM may fail to start.",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
    "updateable": true,
 | 
					    "updateable": true,
 | 
				
			||||||
    "privileged": false,
 | 
					    "privileged": false,
 | 
				
			||||||
    "interface_port": 8000,
 | 
					    "interface_port": 8000,
 | 
				
			||||||
    "documentation": null,
 | 
					    "documentation": "https://docs.paperless-ngx.com/",
 | 
				
			||||||
    "website": "https://docs.paperless-ngx.com/",
 | 
					    "website": "https://docs.paperless-ngx.com/",
 | 
				
			||||||
    "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/paperless-ngx.webp",
 | 
					    "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/paperless-ngx.webp",
 | 
				
			||||||
    "config_path": "/opt/paperless/paperless.conf",
 | 
					    "config_path": "/opt/paperless/paperless.conf",
 | 
				
			||||||
@@ -21,19 +21,19 @@
 | 
				
			|||||||
            "resources": {
 | 
					            "resources": {
 | 
				
			||||||
                "cpu": 2,
 | 
					                "cpu": 2,
 | 
				
			||||||
                "ram": 2048,
 | 
					                "ram": 2048,
 | 
				
			||||||
                "hdd": 10,
 | 
					                "hdd": 12,
 | 
				
			||||||
                "os": "debian",
 | 
					                "os": "debian",
 | 
				
			||||||
                "version": "12"
 | 
					                "version": "12"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "default_credentials": {
 | 
					    "default_credentials": {
 | 
				
			||||||
        "username": null,
 | 
					        "username": "admin",
 | 
				
			||||||
        "password": null
 | 
					        "password": null
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "notes": [
 | 
					    "notes": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "text": "Show Login Credentials, type `update` in the LXC console",
 | 
					            "text": "Show Login Credentials, type `cat ~/paperless.creds` in the LXC console",
 | 
				
			||||||
            "type": "info"
 | 
					            "type": "info"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,8 +11,8 @@
 | 
				
			|||||||
  "interface_port": 3000,
 | 
					  "interface_port": 3000,
 | 
				
			||||||
  "documentation": "https://docs.rxresume.org/",
 | 
					  "documentation": "https://docs.rxresume.org/",
 | 
				
			||||||
  "website": "https://rxresume.org",
 | 
					  "website": "https://rxresume.org",
 | 
				
			||||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/reactive-resume-light.png",
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/reactive-resume.webp",
 | 
				
			||||||
    "config_path": "/opt/reactive-resume/.env",
 | 
					  "config_path": "/opt/reactive-resume/.env",
 | 
				
			||||||
  "description": "A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever.",
 | 
					  "description": "A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever.",
 | 
				
			||||||
  "install_methods": [
 | 
					  "install_methods": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -33,4 +33,3 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "notes": []
 | 
					  "notes": []
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,8 +11,8 @@
 | 
				
			|||||||
  "interface_port": 5030,
 | 
					  "interface_port": 5030,
 | 
				
			||||||
  "documentation": "https://github.com/slskd/slskd/tree/master/docs",
 | 
					  "documentation": "https://github.com/slskd/slskd/tree/master/docs",
 | 
				
			||||||
  "website": "https://github.com/slskd/slskd",
 | 
					  "website": "https://github.com/slskd/slskd",
 | 
				
			||||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/slskd.png",
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/slskd.webp",
 | 
				
			||||||
    "config_path": "/opt/slskd/config/slskd.yml",
 | 
					  "config_path": "/opt/slskd/config/slskd.yml",
 | 
				
			||||||
  "description": "A modern client-server application for the Soulseek file sharing network. ",
 | 
					  "description": "A modern client-server application for the Soulseek file sharing network. ",
 | 
				
			||||||
  "install_methods": [
 | 
					  "install_methods": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -42,4 +42,3 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										52
									
								
								frontend/public/json/swizzin.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								frontend/public/json/swizzin.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "Swizzin",
 | 
				
			||||||
 | 
					  "slug": "swizzin",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    15
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-08-19",
 | 
				
			||||||
 | 
					  "type": "ct",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": 80,
 | 
				
			||||||
 | 
					  "documentation": "https://swizzin.ltd/getting-started",
 | 
				
			||||||
 | 
					  "config_path": "/etc/swizzin/",
 | 
				
			||||||
 | 
					  "website": "https://swizzin.ltd/",
 | 
				
			||||||
 | 
					  "logo": "https://swizzin.ltd/img/logo-sm.png",
 | 
				
			||||||
 | 
					  "description": "Swizzin is a light-weight, modular, and user-friendly seedbox solution for Debian-based servers. It allows for the easy installation and management of a wide variety of applications commonly used for torrenting and media management, such as rTorrent, Sonarr, Radarr, and Plex, all accessible through a command-line utility or a web-based dashboard.",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "ct/swizzin.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 2,
 | 
				
			||||||
 | 
					        "ram": 4096,
 | 
				
			||||||
 | 
					        "hdd": 20,
 | 
				
			||||||
 | 
					        "os": "Debian",
 | 
				
			||||||
 | 
					        "version": "12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": null,
 | 
				
			||||||
 | 
					    "password": null
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "Installation might take a long time if choosing to install many apps. Be patient.",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "Swizzin is a management suite, not a single application. Use the 'box' command inside the container to install/manage individual apps like rTorrent, Sonarr, etc. A full list can be found in documentation.",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "It is very recommended to install at least the 'panel' for web access, and 'nginx' for easy access to other apps.",
 | 
				
			||||||
 | 
					      "type": "warning"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
 | 
				
			||||||
 | 
					      "type": "warning"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -6,7 +6,7 @@
 | 
				
			|||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "date_created": "2024-05-02",
 | 
					  "date_created": "2024-05-02",
 | 
				
			||||||
  "type": "ct",
 | 
					  "type": "ct",
 | 
				
			||||||
  "updateable": false,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 8265,
 | 
					  "interface_port": 8265,
 | 
				
			||||||
  "documentation": null,
 | 
					  "documentation": null,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,10 +31,5 @@
 | 
				
			|||||||
    "username": null,
 | 
					    "username": null,
 | 
				
			||||||
    "password": null
 | 
					    "password": null
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "notes": [
 | 
					  "notes": []
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
 | 
					 | 
				
			||||||
      "type": "warning"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,10 +6,10 @@
 | 
				
			|||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "date_created": "2024-05-02",
 | 
					  "date_created": "2024-05-02",
 | 
				
			||||||
  "type": "ct",
 | 
					  "type": "ct",
 | 
				
			||||||
  "updateable": false,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 8082,
 | 
					  "interface_port": 8082,
 | 
				
			||||||
  "documentation": null,
 | 
					  "documentation": "https://www.traccar.org/documentation/",
 | 
				
			||||||
  "website": "https://www.traccar.org/",
 | 
					  "website": "https://www.traccar.org/",
 | 
				
			||||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/traccar.webp",
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/traccar.webp",
 | 
				
			||||||
  "config_path": "/opt/traccar/conf/traccar.xml",
 | 
					  "config_path": "/opt/traccar/conf/traccar.xml",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
  "updateable": true,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 8080,
 | 
					  "interface_port": 8080,
 | 
				
			||||||
  "documentation": null,
 | 
					  "documentation": "https://doc.traefik.io/",
 | 
				
			||||||
  "website": "https://traefik.io/",
 | 
					  "website": "https://traefik.io/",
 | 
				
			||||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/traefik.webp",
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/traefik.webp",
 | 
				
			||||||
  "config_path": "/etc/traefik/traefik.yaml",
 | 
					  "config_path": "/etc/traefik/traefik.yaml",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										44
									
								
								frontend/public/json/twingate-connector.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								frontend/public/json/twingate-connector.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "twingate-connector",
 | 
				
			||||||
 | 
					  "slug": "twingate-connector",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    4
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-08-18",
 | 
				
			||||||
 | 
					  "type": "ct",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": null,
 | 
				
			||||||
 | 
					  "documentation": "https://www.twingate.com/docs/",
 | 
				
			||||||
 | 
					  "config_path": "/etc/twingate/connector.conf",
 | 
				
			||||||
 | 
					  "website": "https://www.twingate.com",
 | 
				
			||||||
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/twingate.webp",
 | 
				
			||||||
 | 
					  "description": "Twingate Connectors are lightweight software components that establish secure, least-privileged access between private network resources and authorized users without exposing the network to the internet. They act as outbound-only bridges between your protected resources and the Twingate infrastructure, ensuring zero-trust access without the need for a VPN.",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "ct/twingate-connector.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 1,
 | 
				
			||||||
 | 
					        "ram": 1024,
 | 
				
			||||||
 | 
					        "hdd": 3,
 | 
				
			||||||
 | 
					        "os": "Ubuntu",
 | 
				
			||||||
 | 
					        "version": "24.04"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": null,
 | 
				
			||||||
 | 
					    "password": null
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "You can get your Twingate access or refresh tokens from the Twingate Admin Console. `https://auth.twingate.com/signup-v2`",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "If you need to update your access or refresh tokens, they can be found in /etc/twingate/connector.conf",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,40 +1,40 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "name": "Umami",
 | 
					  "name": "Umami",
 | 
				
			||||||
    "slug": "umami",
 | 
					  "slug": "umami",
 | 
				
			||||||
    "categories": [
 | 
					  "categories": [
 | 
				
			||||||
        9
 | 
					    9
 | 
				
			||||||
    ],
 | 
					  ],
 | 
				
			||||||
    "date_created": "2024-05-09",
 | 
					  "date_created": "2024-05-09",
 | 
				
			||||||
    "type": "ct",
 | 
					  "type": "ct",
 | 
				
			||||||
    "updateable": false,
 | 
					  "updateable": true,
 | 
				
			||||||
    "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
    "interface_port": 3000,
 | 
					  "interface_port": 3000,
 | 
				
			||||||
    "documentation": null,
 | 
					  "documentation": "https://umami.is/docs",
 | 
				
			||||||
    "website": "https://umami.is/",
 | 
					  "website": "https://umami.is/",
 | 
				
			||||||
    "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/umami.webp",
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/umami.webp",
 | 
				
			||||||
    "config_path": "/opt/umami/.env",
 | 
					  "config_path": "/opt/umami/.env",
 | 
				
			||||||
    "description": "Umami makes it easy to collect, analyze, and understand your web data while maintaining visitor privacy and data ownership.",
 | 
					  "description": "Umami makes it easy to collect, analyze, and understand your web data while maintaining visitor privacy and data ownership.",
 | 
				
			||||||
    "install_methods": [
 | 
					  "install_methods": [
 | 
				
			||||||
        {
 | 
					    {
 | 
				
			||||||
            "type": "default",
 | 
					      "type": "default",
 | 
				
			||||||
            "script": "ct/umami.sh",
 | 
					      "script": "ct/umami.sh",
 | 
				
			||||||
            "resources": {
 | 
					      "resources": {
 | 
				
			||||||
                "cpu": 2,
 | 
					        "cpu": 2,
 | 
				
			||||||
                "ram": 2048,
 | 
					        "ram": 2048,
 | 
				
			||||||
                "hdd": 12,
 | 
					        "hdd": 12,
 | 
				
			||||||
                "os": "debian",
 | 
					        "os": "debian",
 | 
				
			||||||
                "version": "12"
 | 
					        "version": "12"
 | 
				
			||||||
            }
 | 
					      }
 | 
				
			||||||
        }
 | 
					    }
 | 
				
			||||||
    ],
 | 
					  ],
 | 
				
			||||||
    "default_credentials": {
 | 
					  "default_credentials": {
 | 
				
			||||||
        "username": "admin",
 | 
					    "username": "admin",
 | 
				
			||||||
        "password": "umami"
 | 
					    "password": "umami"
 | 
				
			||||||
    },
 | 
					  },
 | 
				
			||||||
    "notes": [
 | 
					  "notes": [
 | 
				
			||||||
        {
 | 
					    {
 | 
				
			||||||
            "text": "To view the database credentials : `cat umami.creds`",
 | 
					      "text": "To view the database credentials : `cat umami.creds`",
 | 
				
			||||||
            "type": "info"
 | 
					      "type": "info"
 | 
				
			||||||
        }
 | 
					    }
 | 
				
			||||||
    ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,344 @@
 | 
				
			|||||||
[
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "9001/copyparty",
 | 
				
			||||||
 | 
					    "version": "v1.19.5",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T23:45:57Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "rcourtman/Pulse",
 | 
				
			||||||
 | 
					    "version": "v4.6.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T20:53:43Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "immich-app/immich",
 | 
				
			||||||
 | 
					    "version": "v1.139.2",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T22:35:59Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "ipfs/kubo",
 | 
				
			||||||
 | 
					    "version": "v0.36.0",
 | 
				
			||||||
 | 
					    "date": "2025-07-14T18:59:57Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "runtipi/runtipi",
 | 
				
			||||||
 | 
					    "version": "nightly",
 | 
				
			||||||
 | 
					    "date": "2025-08-16T16:04:53Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "HabitRPG/habitica",
 | 
				
			||||||
 | 
					    "version": "v5.39.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T18:40:00Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "zitadel/zitadel",
 | 
				
			||||||
 | 
					    "version": "v4.0.2",
 | 
				
			||||||
 | 
					    "date": "2025-08-15T14:12:26Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "home-assistant/core",
 | 
				
			||||||
 | 
					    "version": "2025.8.3",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T18:23:10Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "open-webui/open-webui",
 | 
				
			||||||
 | 
					    "version": "v0.6.23",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T18:21:20Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "hargata/lubelog",
 | 
				
			||||||
 | 
					    "version": "v1.5.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T17:33:22Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "evcc-io/evcc",
 | 
				
			||||||
 | 
					    "version": "0.207.4",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T17:20:43Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "kyantech/Palmr",
 | 
				
			||||||
 | 
					    "version": "v3.2.0-beta",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T16:51:45Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "cloudflare/cloudflared",
 | 
				
			||||||
 | 
					    "version": "2025.8.1",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T15:39:34Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "gethomepage/homepage",
 | 
				
			||||||
 | 
					    "version": "v1.4.6",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T14:05:58Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "prometheus/prometheus",
 | 
				
			||||||
 | 
					    "version": "v0.306.0-rc.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T13:31:03Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "glpi-project/glpi",
 | 
				
			||||||
 | 
					    "version": "10.0.19",
 | 
				
			||||||
 | 
					    "date": "2025-07-16T09:45:14Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "mattermost/mattermost",
 | 
				
			||||||
 | 
					    "version": "v10.5.10",
 | 
				
			||||||
 | 
					    "date": "2025-08-15T12:12:06Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "fuma-nama/fumadocs",
 | 
				
			||||||
 | 
					    "version": "fumadocs-core@15.7.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T10:12:00Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "emqx/emqx",
 | 
				
			||||||
 | 
					    "version": "e6.0.0-M2.202508-rc.1",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T18:02:55Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "semaphoreui/semaphore",
 | 
				
			||||||
 | 
					    "version": "v2.16.18",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T08:19:58Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "theonedev/onedev",
 | 
				
			||||||
 | 
					    "version": "v12.0.5",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T07:12:27Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "morpheus65535/bazarr",
 | 
				
			||||||
 | 
					    "version": "v1.5.3-beta.10",
 | 
				
			||||||
 | 
					    "date": "2025-07-15T06:07:03Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "Jackett/Jackett",
 | 
				
			||||||
 | 
					    "version": "v0.22.2319",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T05:52:32Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "jeedom/core",
 | 
				
			||||||
 | 
					    "version": "4.4.19",
 | 
				
			||||||
 | 
					    "date": "2025-08-21T00:27:08Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "steveiliop56/tinyauth",
 | 
				
			||||||
 | 
					    "version": "v3.6.2",
 | 
				
			||||||
 | 
					    "date": "2025-07-17T12:08:03Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "keycloak/keycloak",
 | 
				
			||||||
 | 
					    "version": "26.3.3",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T10:12:51Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "ollama/ollama",
 | 
				
			||||||
 | 
					    "version": "v0.11.6",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T21:00:13Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "YunoHost/yunohost",
 | 
				
			||||||
 | 
					    "version": "debian/12.1.14",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T20:52:44Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "MediaBrowser/Emby.Releases",
 | 
				
			||||||
 | 
					    "version": "4.9.1.2",
 | 
				
			||||||
 | 
					    "date": "2025-06-26T22:08:00Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "goauthentik/authentik",
 | 
				
			||||||
 | 
					    "version": "version/2025.8.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T18:09:17Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "jenkinsci/jenkins",
 | 
				
			||||||
 | 
					    "version": "jenkins-2.516.2",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T17:15:26Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "Checkmk/checkmk",
 | 
				
			||||||
 | 
					    "version": "v2.4.0p10",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T14:05:06Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "AdguardTeam/AdGuardHome",
 | 
				
			||||||
 | 
					    "version": "v0.107.65",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T14:02:28Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "n8n-io/n8n",
 | 
				
			||||||
 | 
					    "version": "n8n@1.107.4",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T12:23:06Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "cockpit-project/cockpit",
 | 
				
			||||||
 | 
					    "version": "345",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T11:52:24Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "openhab/openhab-core",
 | 
				
			||||||
 | 
					    "version": "4.3.7",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T10:26:21Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "apache/cassandra",
 | 
				
			||||||
 | 
					    "version": "4.1.10-tentative",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T10:20:25Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "duplicati/duplicati",
 | 
				
			||||||
 | 
					    "version": "v2.1.2.0-2.1.2.0_beta_2025-08-20",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T08:15:46Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "esphome/esphome",
 | 
				
			||||||
 | 
					    "version": "2025.8.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T07:58:12Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "Luligu/matterbridge",
 | 
				
			||||||
 | 
					    "version": "3.2.3",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T07:57:58Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "gtsteffaniak/filebrowser",
 | 
				
			||||||
 | 
					    "version": "v0.8.0-beta",
 | 
				
			||||||
 | 
					    "date": "2025-08-20T01:02:10Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "TwiN/gatus",
 | 
				
			||||||
 | 
					    "version": "v5.23.2",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T21:24:45Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "mealie-recipes/mealie",
 | 
				
			||||||
 | 
					    "version": "v3.1.1",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T20:23:43Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "wazuh/wazuh",
 | 
				
			||||||
 | 
					    "version": "v4.10.3",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T18:51:00Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "cross-seed/cross-seed",
 | 
				
			||||||
 | 
					    "version": "v6.13.2",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T18:18:40Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "Threadfin/Threadfin",
 | 
				
			||||||
 | 
					    "version": "1.3.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T17:37:44Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "dgtlmoon/changedetection.io",
 | 
				
			||||||
 | 
					    "version": "0.50.10",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T17:21:44Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "msgbyte/tianji",
 | 
				
			||||||
 | 
					    "version": "v1.24.18",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T16:57:09Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "karlomikus/bar-assistant",
 | 
				
			||||||
 | 
					    "version": "v5.8.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T16:46:00Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "sabnzbd/sabnzbd",
 | 
				
			||||||
 | 
					    "version": "4.5.2",
 | 
				
			||||||
 | 
					    "date": "2025-07-09T19:08:28Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "traccar/traccar",
 | 
				
			||||||
 | 
					    "version": "v6.9.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T14:22:26Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "fallenbagel/jellyseerr",
 | 
				
			||||||
 | 
					    "version": "preview-dns-cache-manager",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T11:57:00Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "element-hq/synapse",
 | 
				
			||||||
 | 
					    "version": "v1.136.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-12T14:26:27Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "zabbix/zabbix",
 | 
				
			||||||
 | 
					    "version": "7.2.12",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T11:16:17Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "crowdsecurity/crowdsec",
 | 
				
			||||||
 | 
					    "version": "v1.6.11",
 | 
				
			||||||
 | 
					    "date": "2025-07-22T12:11:38Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "chrisvel/tududi",
 | 
				
			||||||
 | 
					    "version": "v0.80",
 | 
				
			||||||
 | 
					    "date": "2025-07-24T14:12:39Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "oauth2-proxy/oauth2-proxy",
 | 
				
			||||||
 | 
					    "version": "v7.12.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T06:57:20Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "firefly-iii/firefly-iii",
 | 
				
			||||||
 | 
					    "version": "v6.3.2",
 | 
				
			||||||
 | 
					    "date": "2025-08-19T04:08:36Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "plexguide/Huntarr.io",
 | 
				
			||||||
 | 
					    "version": "8.2.6",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T23:31:31Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "bunkerity/bunkerweb",
 | 
				
			||||||
 | 
					    "version": "v1.6.4",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T20:22:07Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "ventoy/Ventoy",
 | 
				
			||||||
 | 
					    "version": "v1.1.07",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T16:13:54Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "FreshRSS/FreshRSS",
 | 
				
			||||||
 | 
					    "version": "1.27.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T16:03:26Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "redis/redis",
 | 
				
			||||||
 | 
					    "version": "8.2.1",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T15:42:48Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "nzbgetcom/nzbget",
 | 
				
			||||||
 | 
					    "version": "v25.2",
 | 
				
			||||||
 | 
					    "date": "2025-07-04T08:21:42Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "meilisearch/meilisearch",
 | 
				
			||||||
 | 
					    "version": "prototype-arroy-becomes-hannoy-with-sharding-0",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T14:48:37Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "VictoriaMetrics/VictoriaMetrics",
 | 
				
			||||||
 | 
					    "version": "pmm-6401-v1.124.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T12:14:50Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "jupyter/notebook",
 | 
				
			||||||
 | 
					    "version": "@jupyter-notebook/ui-components@7.5.0-alpha.2",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T07:39:41Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "moghtech/komodo",
 | 
				
			||||||
 | 
					    "version": "v1.19.0",
 | 
				
			||||||
 | 
					    "date": "2025-08-18T01:22:47Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "lldap/lldap",
 | 
					    "name": "lldap/lldap",
 | 
				
			||||||
    "version": "v0.6.2",
 | 
					    "version": "v0.6.2",
 | 
				
			||||||
@@ -14,6 +354,11 @@
 | 
				
			|||||||
    "version": "2025.8.3",
 | 
					    "version": "2025.8.3",
 | 
				
			||||||
    "date": "2025-08-14T22:05:27Z"
 | 
					    "date": "2025-08-14T22:05:27Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "deluge-torrent/deluge",
 | 
				
			||||||
 | 
					    "version": "deluge-2.2.1.dev0",
 | 
				
			||||||
 | 
					    "date": "2025-08-17T20:22:28Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "go-vikunja/vikunja",
 | 
					    "name": "go-vikunja/vikunja",
 | 
				
			||||||
    "version": "v1.0.0-rc0",
 | 
					    "version": "v1.0.0-rc0",
 | 
				
			||||||
@@ -24,11 +369,6 @@
 | 
				
			|||||||
    "version": "3.3.0",
 | 
					    "version": "3.3.0",
 | 
				
			||||||
    "date": "2025-08-17T19:57:11Z"
 | 
					    "date": "2025-08-17T19:57:11Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "rcourtman/Pulse",
 | 
					 | 
				
			||||||
    "version": "v4.4.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-17T18:47:35Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "Radarr/Radarr",
 | 
					    "name": "Radarr/Radarr",
 | 
				
			||||||
    "version": "v5.26.2.10099",
 | 
					    "version": "v5.26.2.10099",
 | 
				
			||||||
@@ -44,31 +384,11 @@
 | 
				
			|||||||
    "version": "v2.12.4.4658",
 | 
					    "version": "v2.12.4.4658",
 | 
				
			||||||
    "date": "2025-06-09T17:27:45Z"
 | 
					    "date": "2025-06-09T17:27:45Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "plexguide/Huntarr.io",
 | 
					 | 
				
			||||||
    "version": "8.2.2",
 | 
					 | 
				
			||||||
    "date": "2025-08-17T16:33:42Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "Ombi-app/Ombi",
 | 
					    "name": "Ombi-app/Ombi",
 | 
				
			||||||
    "version": "v4.47.1",
 | 
					    "version": "v4.47.1",
 | 
				
			||||||
    "date": "2025-01-05T21:14:23Z"
 | 
					    "date": "2025-01-05T21:14:23Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "firefly-iii/firefly-iii",
 | 
					 | 
				
			||||||
    "version": "v6.3.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-16T17:54:45Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "semaphoreui/semaphore",
 | 
					 | 
				
			||||||
    "version": "v2.16.17",
 | 
					 | 
				
			||||||
    "date": "2025-08-17T13:13:52Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "fuma-nama/fumadocs",
 | 
					 | 
				
			||||||
    "version": "fumadocs-core@15.6.12",
 | 
					 | 
				
			||||||
    "date": "2025-08-17T10:37:31Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "TandoorRecipes/recipes",
 | 
					    "name": "TandoorRecipes/recipes",
 | 
				
			||||||
    "version": "2.0.2",
 | 
					    "version": "2.0.2",
 | 
				
			||||||
@@ -79,31 +399,6 @@
 | 
				
			|||||||
    "version": "v0.8.3",
 | 
					    "version": "v0.8.3",
 | 
				
			||||||
    "date": "2025-08-17T06:24:54Z"
 | 
					    "date": "2025-08-17T06:24:54Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "Jackett/Jackett",
 | 
					 | 
				
			||||||
    "version": "v0.22.2301",
 | 
					 | 
				
			||||||
    "date": "2025-08-17T05:54:52Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "cross-seed/cross-seed",
 | 
					 | 
				
			||||||
    "version": "v6.13.1",
 | 
					 | 
				
			||||||
    "date": "2025-07-17T21:36:42Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "steveiliop56/tinyauth",
 | 
					 | 
				
			||||||
    "version": "v3.6.2",
 | 
					 | 
				
			||||||
    "date": "2025-07-17T12:08:03Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "MediaBrowser/Emby.Releases",
 | 
					 | 
				
			||||||
    "version": "4.9.1.2",
 | 
					 | 
				
			||||||
    "date": "2025-06-26T22:08:00Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "runtipi/runtipi",
 | 
					 | 
				
			||||||
    "version": "nightly",
 | 
					 | 
				
			||||||
    "date": "2025-08-16T16:04:53Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "blakeblackshear/frigate",
 | 
					    "name": "blakeblackshear/frigate",
 | 
				
			||||||
    "version": "v0.14.1",
 | 
					    "version": "v0.14.1",
 | 
				
			||||||
@@ -119,26 +414,11 @@
 | 
				
			|||||||
    "version": "v1.12.2-rc.4",
 | 
					    "version": "v1.12.2-rc.4",
 | 
				
			||||||
    "date": "2025-08-16T09:16:29Z"
 | 
					    "date": "2025-08-16T09:16:29Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "msgbyte/tianji",
 | 
					 | 
				
			||||||
    "version": "v1.24.15",
 | 
					 | 
				
			||||||
    "date": "2025-08-16T08:57:56Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "karlomikus/bar-assistant",
 | 
					 | 
				
			||||||
    "version": "v5.7.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-16T07:59:43Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "syncthing/syncthing",
 | 
					    "name": "syncthing/syncthing",
 | 
				
			||||||
    "version": "v2.0.2",
 | 
					    "version": "v2.0.2",
 | 
				
			||||||
    "date": "2025-08-16T05:32:58Z"
 | 
					    "date": "2025-08-16T05:32:58Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "nzbgetcom/nzbget",
 | 
					 | 
				
			||||||
    "version": "v25.2",
 | 
					 | 
				
			||||||
    "date": "2025-07-04T08:21:42Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "coder/code-server",
 | 
					    "name": "coder/code-server",
 | 
				
			||||||
    "version": "v4.103.1",
 | 
					    "version": "v4.103.1",
 | 
				
			||||||
@@ -149,11 +429,6 @@
 | 
				
			|||||||
    "version": "r8.2.0",
 | 
					    "version": "r8.2.0",
 | 
				
			||||||
    "date": "2025-08-15T22:02:15Z"
 | 
					    "date": "2025-08-15T22:02:15Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "keycloak/keycloak",
 | 
					 | 
				
			||||||
    "version": "26.2.7",
 | 
					 | 
				
			||||||
    "date": "2025-08-07T08:19:29Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "homarr-labs/homarr",
 | 
					    "name": "homarr-labs/homarr",
 | 
				
			||||||
    "version": "v1.33.0",
 | 
					    "version": "v1.33.0",
 | 
				
			||||||
@@ -169,36 +444,6 @@
 | 
				
			|||||||
    "version": "v4.3.6",
 | 
					    "version": "v4.3.6",
 | 
				
			||||||
    "date": "2025-08-12T17:16:42Z"
 | 
					    "date": "2025-08-12T17:16:42Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "home-assistant/core",
 | 
					 | 
				
			||||||
    "version": "2025.8.2",
 | 
					 | 
				
			||||||
    "date": "2025-08-15T16:00:26Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "evcc-io/evcc",
 | 
					 | 
				
			||||||
    "version": "0.207.3",
 | 
					 | 
				
			||||||
    "date": "2025-08-15T15:32:33Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "zitadel/zitadel",
 | 
					 | 
				
			||||||
    "version": "v3.3.6",
 | 
					 | 
				
			||||||
    "date": "2025-08-15T14:18:31Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "n8n-io/n8n",
 | 
					 | 
				
			||||||
    "version": "n8n@1.106.3",
 | 
					 | 
				
			||||||
    "date": "2025-08-11T15:16:06Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "mattermost/mattermost",
 | 
					 | 
				
			||||||
    "version": "v10.5.10",
 | 
					 | 
				
			||||||
    "date": "2025-08-15T12:12:06Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "zabbix/zabbix",
 | 
					 | 
				
			||||||
    "version": "7.0.18rc2",
 | 
					 | 
				
			||||||
    "date": "2025-08-15T11:50:47Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "intri-in/manage-my-damn-life-nextjs",
 | 
					    "name": "intri-in/manage-my-damn-life-nextjs",
 | 
				
			||||||
    "version": "v0.8.0-release",
 | 
					    "version": "v0.8.0-release",
 | 
				
			||||||
@@ -209,26 +454,6 @@
 | 
				
			|||||||
    "version": "4.5.1",
 | 
					    "version": "4.5.1",
 | 
				
			||||||
    "date": "2025-08-15T05:53:22Z"
 | 
					    "date": "2025-08-15T05:53:22Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "ollama/ollama",
 | 
					 | 
				
			||||||
    "version": "v0.11.5-rc0",
 | 
					 | 
				
			||||||
    "date": "2025-08-14T22:24:01Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "esphome/esphome",
 | 
					 | 
				
			||||||
    "version": "2025.7.5",
 | 
					 | 
				
			||||||
    "date": "2025-08-05T03:37:52Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "fallenbagel/jellyseerr",
 | 
					 | 
				
			||||||
    "version": "v2.7.3",
 | 
					 | 
				
			||||||
    "date": "2025-08-14T20:43:46Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "immich-app/immich",
 | 
					 | 
				
			||||||
    "version": "v1.138.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-14T19:34:54Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "gristlabs/grist-core",
 | 
					    "name": "gristlabs/grist-core",
 | 
				
			||||||
    "version": "v1.7.2",
 | 
					    "version": "v1.7.2",
 | 
				
			||||||
@@ -239,31 +464,6 @@
 | 
				
			|||||||
    "version": "v2.11.7",
 | 
					    "version": "v2.11.7",
 | 
				
			||||||
    "date": "2025-08-14T17:14:33Z"
 | 
					    "date": "2025-08-14T17:14:33Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "meilisearch/meilisearch",
 | 
					 | 
				
			||||||
    "version": "prototype-arroy-becomes-hannoy-11",
 | 
					 | 
				
			||||||
    "date": "2025-08-14T13:10:45Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "AdguardTeam/AdGuardHome",
 | 
					 | 
				
			||||||
    "version": "v0.107.64",
 | 
					 | 
				
			||||||
    "date": "2025-07-28T14:24:56Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "goauthentik/authentik",
 | 
					 | 
				
			||||||
    "version": "version/2025.8.0-rc2",
 | 
					 | 
				
			||||||
    "date": "2025-08-12T21:12:08Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "Luligu/matterbridge",
 | 
					 | 
				
			||||||
    "version": "Matter-1.4.1",
 | 
					 | 
				
			||||||
    "date": "2025-08-14T07:37:23Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "morpheus65535/bazarr",
 | 
					 | 
				
			||||||
    "version": "v1.5.3-beta.10",
 | 
					 | 
				
			||||||
    "date": "2025-07-15T06:07:03Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "booklore-app/booklore",
 | 
					    "name": "booklore-app/booklore",
 | 
				
			||||||
    "version": "v0.37.0",
 | 
					    "version": "v0.37.0",
 | 
				
			||||||
@@ -274,21 +474,11 @@
 | 
				
			|||||||
    "version": "v10.10.7",
 | 
					    "version": "v10.10.7",
 | 
				
			||||||
    "date": "2025-04-05T19:14:59Z"
 | 
					    "date": "2025-04-05T19:14:59Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "wazuh/wazuh",
 | 
					 | 
				
			||||||
    "version": "coverity-w33-4.13.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-13T21:46:59Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "Kometa-Team/Kometa",
 | 
					    "name": "Kometa-Team/Kometa",
 | 
				
			||||||
    "version": "v2.2.1",
 | 
					    "version": "v2.2.1",
 | 
				
			||||||
    "date": "2025-08-13T19:49:01Z"
 | 
					    "date": "2025-08-13T19:49:01Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "redis/redis",
 | 
					 | 
				
			||||||
    "version": "8.2.1-int",
 | 
					 | 
				
			||||||
    "date": "2025-08-13T19:27:27Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "grafana/grafana",
 | 
					    "name": "grafana/grafana",
 | 
				
			||||||
    "version": "v12.1.1",
 | 
					    "version": "v12.1.1",
 | 
				
			||||||
@@ -304,11 +494,6 @@
 | 
				
			|||||||
    "version": "v1.17.3",
 | 
					    "version": "v1.17.3",
 | 
				
			||||||
    "date": "2025-08-13T14:04:44Z"
 | 
					    "date": "2025-08-13T14:04:44Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "gethomepage/homepage",
 | 
					 | 
				
			||||||
    "version": "v1.4.5",
 | 
					 | 
				
			||||||
    "date": "2025-08-13T13:52:09Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "ellite/Wallos",
 | 
					    "name": "ellite/Wallos",
 | 
				
			||||||
    "version": "v4.1.1",
 | 
					    "version": "v4.1.1",
 | 
				
			||||||
@@ -334,16 +519,6 @@
 | 
				
			|||||||
    "version": "v5.12.0",
 | 
					    "version": "v5.12.0",
 | 
				
			||||||
    "date": "2025-08-12T15:09:35Z"
 | 
					    "date": "2025-08-12T15:09:35Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "jenkinsci/jenkins",
 | 
					 | 
				
			||||||
    "version": "jenkins-2.523",
 | 
					 | 
				
			||||||
    "date": "2025-08-12T14:54:07Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "element-hq/synapse",
 | 
					 | 
				
			||||||
    "version": "v1.136.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-12T14:26:27Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "bluenviron/mediamtx",
 | 
					    "name": "bluenviron/mediamtx",
 | 
				
			||||||
    "version": "v1.14.0",
 | 
					    "version": "v1.14.0",
 | 
				
			||||||
@@ -364,50 +539,20 @@
 | 
				
			|||||||
    "version": "REL_13_22",
 | 
					    "version": "REL_13_22",
 | 
				
			||||||
    "date": "2025-08-11T21:10:58Z"
 | 
					    "date": "2025-08-11T21:10:58Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "TwiN/gatus",
 | 
					 | 
				
			||||||
    "version": "v5.22.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-11T14:05:35Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "BookStackApp/BookStack",
 | 
					    "name": "BookStackApp/BookStack",
 | 
				
			||||||
    "version": "v25.07.1",
 | 
					    "version": "v25.07.1",
 | 
				
			||||||
    "date": "2025-08-11T13:53:22Z"
 | 
					    "date": "2025-08-11T13:53:22Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "open-webui/open-webui",
 | 
					 | 
				
			||||||
    "version": "v0.6.22",
 | 
					 | 
				
			||||||
    "date": "2025-08-11T13:15:39Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "FlowiseAI/Flowise",
 | 
					    "name": "FlowiseAI/Flowise",
 | 
				
			||||||
    "version": "flowise@3.0.5",
 | 
					    "version": "flowise@3.0.5",
 | 
				
			||||||
    "date": "2025-08-11T13:01:45Z"
 | 
					    "date": "2025-08-11T13:01:45Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "Checkmk/checkmk",
 | 
					    "name": "Cleanuparr/Cleanuparr",
 | 
				
			||||||
    "version": "v2.2.0p45",
 | 
					    "version": "v2.1.6",
 | 
				
			||||||
    "date": "2025-08-11T12:10:07Z"
 | 
					    "date": "2025-08-11T08:04:09Z"
 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "jupyter/notebook",
 | 
					 | 
				
			||||||
    "version": "@jupyter-notebook/ui-components@7.5.0-alpha.1",
 | 
					 | 
				
			||||||
    "date": "2025-08-11T11:44:30Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "emqx/emqx",
 | 
					 | 
				
			||||||
    "version": "e5.10.1-beta.1",
 | 
					 | 
				
			||||||
    "date": "2025-08-11T11:35:41Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "sabnzbd/sabnzbd",
 | 
					 | 
				
			||||||
    "version": "4.5.2",
 | 
					 | 
				
			||||||
    "date": "2025-07-09T19:08:28Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "moghtech/komodo",
 | 
					 | 
				
			||||||
    "version": "v1.18.4",
 | 
					 | 
				
			||||||
    "date": "2025-06-25T00:06:56Z"
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "slskd/slskd",
 | 
					    "name": "slskd/slskd",
 | 
				
			||||||
@@ -419,11 +564,6 @@
 | 
				
			|||||||
    "version": "v2.28.0",
 | 
					    "version": "v2.28.0",
 | 
				
			||||||
    "date": "2025-08-10T23:09:55Z"
 | 
					    "date": "2025-08-10T23:09:55Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "YunoHost/yunohost",
 | 
					 | 
				
			||||||
    "version": "debian/12.1.9",
 | 
					 | 
				
			||||||
    "date": "2025-08-10T20:17:50Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "pocket-id/pocket-id",
 | 
					    "name": "pocket-id/pocket-id",
 | 
				
			||||||
    "version": "v1.7.0",
 | 
					    "version": "v1.7.0",
 | 
				
			||||||
@@ -464,36 +604,16 @@
 | 
				
			|||||||
    "version": "v0.29.2",
 | 
					    "version": "v0.29.2",
 | 
				
			||||||
    "date": "2025-08-09T07:28:08Z"
 | 
					    "date": "2025-08-09T07:28:08Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "duplicati/duplicati",
 | 
					 | 
				
			||||||
    "version": "v2.1.1.100-2.1.1.100_canary_2025-08-08",
 | 
					 | 
				
			||||||
    "date": "2025-08-08T22:04:15Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "kimai/kimai",
 | 
					    "name": "kimai/kimai",
 | 
				
			||||||
    "version": "2.38.0",
 | 
					    "version": "2.38.0",
 | 
				
			||||||
    "date": "2025-08-08T21:47:19Z"
 | 
					    "date": "2025-08-08T21:47:19Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "HabitRPG/habitica",
 | 
					 | 
				
			||||||
    "version": "v5.38.2",
 | 
					 | 
				
			||||||
    "date": "2025-08-08T19:09:53Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "bunkerity/bunkerweb",
 | 
					 | 
				
			||||||
    "version": "v1.6.3",
 | 
					 | 
				
			||||||
    "date": "2025-08-08T17:41:35Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "docker/compose",
 | 
					    "name": "docker/compose",
 | 
				
			||||||
    "version": "v2.39.2",
 | 
					    "version": "v2.39.2",
 | 
				
			||||||
    "date": "2025-08-08T16:06:06Z"
 | 
					    "date": "2025-08-08T16:06:06Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "cloudflare/cloudflared",
 | 
					 | 
				
			||||||
    "version": "2025.8.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-08T15:50:42Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "apache/tika",
 | 
					    "name": "apache/tika",
 | 
				
			||||||
    "version": "3.2.2",
 | 
					    "version": "3.2.2",
 | 
				
			||||||
@@ -519,16 +639,6 @@
 | 
				
			|||||||
    "version": "v11.1.0",
 | 
					    "version": "v11.1.0",
 | 
				
			||||||
    "date": "2025-08-07T14:57:29Z"
 | 
					    "date": "2025-08-07T14:57:29Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "glpi-project/glpi",
 | 
					 | 
				
			||||||
    "version": "10.0.19",
 | 
					 | 
				
			||||||
    "date": "2025-07-16T09:45:14Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "crowdsecurity/crowdsec",
 | 
					 | 
				
			||||||
    "version": "v1.6.11",
 | 
					 | 
				
			||||||
    "date": "2025-07-22T12:11:38Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "influxdata/influxdb",
 | 
					    "name": "influxdata/influxdb",
 | 
				
			||||||
    "version": "v1.12.2rc2",
 | 
					    "version": "v1.12.2rc2",
 | 
				
			||||||
@@ -554,11 +664,6 @@
 | 
				
			|||||||
    "version": "6.1.14",
 | 
					    "version": "6.1.14",
 | 
				
			||||||
    "date": "2025-08-06T14:24:58Z"
 | 
					    "date": "2025-08-06T14:24:58Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "cockpit-project/cockpit",
 | 
					 | 
				
			||||||
    "version": "344",
 | 
					 | 
				
			||||||
    "date": "2025-08-06T13:09:25Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "TryGhost/Ghost-CLI",
 | 
					    "name": "TryGhost/Ghost-CLI",
 | 
				
			||||||
    "version": "v1.28.3",
 | 
					    "version": "v1.28.3",
 | 
				
			||||||
@@ -569,11 +674,6 @@
 | 
				
			|||||||
    "version": "v0.15.0-rc5",
 | 
					    "version": "v0.15.0-rc5",
 | 
				
			||||||
    "date": "2025-08-06T08:55:10Z"
 | 
					    "date": "2025-08-06T08:55:10Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "theonedev/onedev",
 | 
					 | 
				
			||||||
    "version": "v12.0.4",
 | 
					 | 
				
			||||||
    "date": "2025-08-06T06:30:07Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "garethgeorge/backrest",
 | 
					    "name": "garethgeorge/backrest",
 | 
				
			||||||
    "version": "v1.9.1",
 | 
					    "version": "v1.9.1",
 | 
				
			||||||
@@ -594,11 +694,6 @@
 | 
				
			|||||||
    "version": "v25.4.0",
 | 
					    "version": "v25.4.0",
 | 
				
			||||||
    "date": "2025-08-05T17:10:01Z"
 | 
					    "date": "2025-08-05T17:10:01Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "apache/cassandra",
 | 
					 | 
				
			||||||
    "version": "cassandra-5.0.5",
 | 
					 | 
				
			||||||
    "date": "2025-08-05T12:08:49Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "binwiederhier/ntfy",
 | 
					    "name": "binwiederhier/ntfy",
 | 
				
			||||||
    "version": "v2.14.0",
 | 
					    "version": "v2.14.0",
 | 
				
			||||||
@@ -609,11 +704,6 @@
 | 
				
			|||||||
    "version": "v2.0.116",
 | 
					    "version": "v2.0.116",
 | 
				
			||||||
    "date": "2025-08-05T04:45:21Z"
 | 
					    "date": "2025-08-05T04:45:21Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "VictoriaMetrics/VictoriaMetrics",
 | 
					 | 
				
			||||||
    "version": "pmm-6401-v1.123.0",
 | 
					 | 
				
			||||||
    "date": "2025-08-04T15:11:36Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "apache/tomcat",
 | 
					    "name": "apache/tomcat",
 | 
				
			||||||
    "version": "10.1.44",
 | 
					    "version": "10.1.44",
 | 
				
			||||||
@@ -704,25 +794,15 @@
 | 
				
			|||||||
    "version": "2.1.1",
 | 
					    "version": "2.1.1",
 | 
				
			||||||
    "date": "2025-06-14T17:45:06Z"
 | 
					    "date": "2025-06-14T17:45:06Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "gtsteffaniak/filebrowser",
 | 
					 | 
				
			||||||
    "version": "v0.7.18-beta",
 | 
					 | 
				
			||||||
    "date": "2025-07-30T21:26:00Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "oauth2-proxy/oauth2-proxy",
 | 
					 | 
				
			||||||
    "version": "v7.11.0",
 | 
					 | 
				
			||||||
    "date": "2025-07-30T18:16:38Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "leiweibau/Pi.Alert",
 | 
					    "name": "leiweibau/Pi.Alert",
 | 
				
			||||||
    "version": "v2025-07-30",
 | 
					    "version": "v2025-07-30",
 | 
				
			||||||
    "date": "2025-07-30T17:13:40Z"
 | 
					    "date": "2025-07-30T17:13:40Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "dgtlmoon/changedetection.io",
 | 
					    "name": "danielbrendel/hortusfox-web",
 | 
				
			||||||
    "version": "0.50.8",
 | 
					    "version": "v5.2",
 | 
				
			||||||
    "date": "2025-07-30T11:33:00Z"
 | 
					    "date": "2025-07-30T10:40:00Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "dani-garcia/vaultwarden",
 | 
					    "name": "dani-garcia/vaultwarden",
 | 
				
			||||||
@@ -804,16 +884,6 @@
 | 
				
			|||||||
    "version": "v3.2.5r2",
 | 
					    "version": "v3.2.5r2",
 | 
				
			||||||
    "date": "2025-07-21T12:52:26Z"
 | 
					    "date": "2025-07-21T12:52:26Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "mealie-recipes/mealie",
 | 
					 | 
				
			||||||
    "version": "v3.0.2",
 | 
					 | 
				
			||||||
    "date": "2025-07-21T12:33:19Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "openhab/openhab-core",
 | 
					 | 
				
			||||||
    "version": "5.0.0",
 | 
					 | 
				
			||||||
    "date": "2025-07-21T07:16:58Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "wavelog/wavelog",
 | 
					    "name": "wavelog/wavelog",
 | 
				
			||||||
    "version": "2.0.7",
 | 
					    "version": "2.0.7",
 | 
				
			||||||
@@ -844,16 +914,6 @@
 | 
				
			|||||||
    "version": "v6.1.4",
 | 
					    "version": "v6.1.4",
 | 
				
			||||||
    "date": "2025-07-14T21:22:17Z"
 | 
					    "date": "2025-07-14T21:22:17Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "ipfs/kubo",
 | 
					 | 
				
			||||||
    "version": "v0.36.0",
 | 
					 | 
				
			||||||
    "date": "2025-07-14T18:59:57Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "prometheus/prometheus",
 | 
					 | 
				
			||||||
    "version": "v3.5.0",
 | 
					 | 
				
			||||||
    "date": "2025-07-14T16:54:21Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "homebridge/homebridge",
 | 
					    "name": "homebridge/homebridge",
 | 
				
			||||||
    "version": "v1.11.0",
 | 
					    "version": "v1.11.0",
 | 
				
			||||||
@@ -874,16 +934,16 @@
 | 
				
			|||||||
    "version": "v1.7.2",
 | 
					    "version": "v1.7.2",
 | 
				
			||||||
    "date": "2025-07-10T19:29:26Z"
 | 
					    "date": "2025-07-10T19:29:26Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "saltstack/salt",
 | 
				
			||||||
 | 
					    "version": "v3007.6",
 | 
				
			||||||
 | 
					    "date": "2025-07-10T18:37:08Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "NginxProxyManager/nginx-proxy-manager",
 | 
					    "name": "NginxProxyManager/nginx-proxy-manager",
 | 
				
			||||||
    "version": "v2.12.6",
 | 
					    "version": "v2.12.6",
 | 
				
			||||||
    "date": "2025-07-09T21:52:15Z"
 | 
					    "date": "2025-07-09T21:52:15Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "hargata/lubelog",
 | 
					 | 
				
			||||||
    "version": "v1.4.9",
 | 
					 | 
				
			||||||
    "date": "2025-07-09T16:27:46Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "nicolargo/glances",
 | 
					    "name": "nicolargo/glances",
 | 
				
			||||||
    "version": "v4.3.3",
 | 
					    "version": "v4.3.3",
 | 
				
			||||||
@@ -904,11 +964,6 @@
 | 
				
			|||||||
    "version": "250707-d28b3101e",
 | 
					    "version": "250707-d28b3101e",
 | 
				
			||||||
    "date": "2025-07-07T15:15:21Z"
 | 
					    "date": "2025-07-07T15:15:21Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "traccar/traccar",
 | 
					 | 
				
			||||||
    "version": "v6.8.1",
 | 
					 | 
				
			||||||
    "date": "2025-07-07T14:40:11Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "Kareadita/Kavita",
 | 
					    "name": "Kareadita/Kavita",
 | 
				
			||||||
    "version": "v0.8.7",
 | 
					    "version": "v0.8.7",
 | 
				
			||||||
@@ -924,11 +979,6 @@
 | 
				
			|||||||
    "version": "v0.20.2",
 | 
					    "version": "v0.20.2",
 | 
				
			||||||
    "date": "2025-07-02T00:37:07Z"
 | 
					    "date": "2025-07-02T00:37:07Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "Threadfin/Threadfin",
 | 
					 | 
				
			||||||
    "version": "1.2.35",
 | 
					 | 
				
			||||||
    "date": "2025-07-01T21:37:20Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "hivemq/hivemq-community-edition",
 | 
					    "name": "hivemq/hivemq-community-edition",
 | 
				
			||||||
    "version": "2025.4",
 | 
					    "version": "2025.4",
 | 
				
			||||||
@@ -1074,11 +1124,6 @@
 | 
				
			|||||||
    "version": "v0.9.0",
 | 
					    "version": "v0.9.0",
 | 
				
			||||||
    "date": "2025-06-03T11:49:40Z"
 | 
					    "date": "2025-06-03T11:49:40Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "FreshRSS/FreshRSS",
 | 
					 | 
				
			||||||
    "version": "1.26.3",
 | 
					 | 
				
			||||||
    "date": "2025-06-02T22:00:14Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "release-argus/Argus",
 | 
					    "name": "release-argus/Argus",
 | 
				
			||||||
    "version": "0.26.3",
 | 
					    "version": "0.26.3",
 | 
				
			||||||
@@ -1144,11 +1189,6 @@
 | 
				
			|||||||
    "version": "3.5.0",
 | 
					    "version": "3.5.0",
 | 
				
			||||||
    "date": "2025-05-05T16:28:24Z"
 | 
					    "date": "2025-05-05T16:28:24Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "deluge-torrent/deluge",
 | 
					 | 
				
			||||||
    "version": "deluge-2.2.0",
 | 
					 | 
				
			||||||
    "date": "2025-04-28T21:31:06Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "gotify/server",
 | 
					    "name": "gotify/server",
 | 
				
			||||||
    "version": "v2.6.3",
 | 
					    "version": "v2.6.3",
 | 
				
			||||||
@@ -1284,11 +1324,6 @@
 | 
				
			|||||||
    "version": "v2.6.6",
 | 
					    "version": "v2.6.6",
 | 
				
			||||||
    "date": "2025-02-24T19:14:46Z"
 | 
					    "date": "2025-02-24T19:14:46Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    "name": "ventoy/Ventoy",
 | 
					 | 
				
			||||||
    "version": "v1.1.05",
 | 
					 | 
				
			||||||
    "date": "2025-02-24T11:53:12Z"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "babybuddy/babybuddy",
 | 
					    "name": "babybuddy/babybuddy",
 | 
				
			||||||
    "version": "v2.7.1",
 | 
					    "version": "v2.7.1",
 | 
				
			||||||
@@ -1344,6 +1379,11 @@
 | 
				
			|||||||
    "version": "0.6.24",
 | 
					    "version": "0.6.24",
 | 
				
			||||||
    "date": "2024-11-16T06:47:56Z"
 | 
					    "date": "2024-11-16T06:47:56Z"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "swizzin/swizzin",
 | 
				
			||||||
 | 
					    "version": "stable",
 | 
				
			||||||
 | 
					    "date": "2021-06-14T23:31:47Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    "name": "sabre-io/Baikal",
 | 
					    "name": "sabre-io/Baikal",
 | 
				
			||||||
    "version": "0.10.1",
 | 
					    "version": "0.10.1",
 | 
				
			||||||
@@ -1398,5 +1438,15 @@
 | 
				
			|||||||
    "name": "pterodactyl/wings",
 | 
					    "name": "pterodactyl/wings",
 | 
				
			||||||
    "version": "v1.11.13",
 | 
					    "version": "v1.11.13",
 | 
				
			||||||
    "date": "2024-05-08T04:20:34Z"
 | 
					    "date": "2024-05-08T04:20:34Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "CrazyWolf13/web-check",
 | 
				
			||||||
 | 
					    "version": "1.0.0",
 | 
				
			||||||
 | 
					    "date": "2024-05-05T02:01:51Z"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "name": "thelounge/thelounge-deb",
 | 
				
			||||||
 | 
					    "version": "v4.4.3",
 | 
				
			||||||
 | 
					    "date": "2024-04-06T12:24:35Z"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,9 @@ network_check
 | 
				
			|||||||
update_os
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Dependencies"
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
$STD apt-get install -y redis
 | 
					$STD apt-get install -y \
 | 
				
			||||||
 | 
					  redis \
 | 
				
			||||||
 | 
					  sqlite3
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PHP_VERSION="8.2" PHP_APACHE="YES" PHP_MODULE="redis, sqlite3" setup_php
 | 
					PHP_VERSION="8.2" PHP_APACHE="YES" PHP_MODULE="redis, sqlite3" setup_php
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ $STD apt-get install -y \
 | 
				
			|||||||
  libfontconfig1
 | 
					  libfontconfig1
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "linux-x64-gui.deb"
 | 
					fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "duplicati-*-linux-x64-gui.deb"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Configuring duplicati"
 | 
					msg_info "Configuring duplicati"
 | 
				
			||||||
DECRYPTKEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
 | 
					DECRYPTKEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,7 +50,7 @@ echo "ghost-user ALL=(ALL) NOPASSWD:ALL" | tee /etc/sudoers.d/ghost-user
 | 
				
			|||||||
mkdir -p /var/www/ghost
 | 
					mkdir -p /var/www/ghost
 | 
				
			||||||
chown -R ghost-user:ghost-user /var/www/ghost
 | 
					chown -R ghost-user:ghost-user /var/www/ghost
 | 
				
			||||||
chmod 775 /var/www/ghost
 | 
					chmod 775 /var/www/ghost
 | 
				
			||||||
sudo -u ghost-user -H sh -c "cd /var/www/ghost && ghost install --db=mysql --dbhost=localhost --dbuser=$DB_USER --dbpass=$DB_PASS --dbname=ghost --url=http://localhost:2368 --no-prompt --no-setup-nginx --no-setup-ssl --no-setup-mysql --enable --start --ip 0.0.0.0"
 | 
					$STD sudo -u ghost-user -H sh -c "cd /var/www/ghost && ghost install --db=mysql --dbhost=localhost --dbuser=$DB_USER --dbpass=$DB_PASS --dbname=ghost --url=http://localhost:2368 --no-prompt --no-setup-nginx --no-setup-ssl --no-setup-mysql --enable --start --ip 0.0.0.0"
 | 
				
			||||||
rm /etc/sudoers.d/ghost-user
 | 
					rm /etc/sudoers.d/ghost-user
 | 
				
			||||||
msg_ok "Creating Service"
 | 
					msg_ok "Creating Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,64 +18,13 @@ $STD apt-get install -y \
 | 
				
			|||||||
  sqlite3 \
 | 
					  sqlite3 \
 | 
				
			||||||
  rclone \
 | 
					  rclone \
 | 
				
			||||||
  tzdata \
 | 
					  tzdata \
 | 
				
			||||||
  ca-certificates \
 | 
					  ca-certificates
 | 
				
			||||||
  build-essential \
 | 
					 | 
				
			||||||
  git
 | 
					 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
setup_go
 | 
					fetch_and_deploy_gh_release "gomft" "StarFleetCPTN/GoMFT" "singlefile" "latest" "/opt/gomft" "gomft*linux-amd64"
 | 
				
			||||||
NODE_VERSION="22" setup_nodejs
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setup ${APPLICATION} (Patience)"
 | 
					msg_info "Configuring ${APPLICATION}"
 | 
				
			||||||
temp_file=$(mktemp)
 | 
					 | 
				
			||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/StarFleetCPTN/GoMFT/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					 | 
				
			||||||
curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
					 | 
				
			||||||
tar -xzf "$temp_file"
 | 
					 | 
				
			||||||
mv GoMFT-"${RELEASE}"/ /opt/gomft
 | 
					 | 
				
			||||||
cd /opt/gomft
 | 
					 | 
				
			||||||
TEMPL_VERSION="$(awk '/github.com\/a-h\/templ/{print $2}' go.mod)"
 | 
					 | 
				
			||||||
$STD go install github.com/a-h/templ/cmd/templ@${TEMPL_VERSION}
 | 
					 | 
				
			||||||
cp /opt/gomft/components/file_metadata/search/file_metadata_search_content.templ{,.bak}
 | 
					 | 
				
			||||||
# dirty hack to fix templ
 | 
					 | 
				
			||||||
cat <<'EOF' >/opt/gomft/components/file_metadata/search/file_metadata_search_content.templ
 | 
					 | 
				
			||||||
package search
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
    "context"
 | 
					 | 
				
			||||||
    "github.com/starfleetcptn/gomft/components/file_metadata"
 | 
					 | 
				
			||||||
    "github.com/starfleetcptn/gomft/components/file_metadata/list"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
templ FileMetadataSearchContent(ctx context.Context, data file_metadata.FileMetadataSearchData) {
 | 
					 | 
				
			||||||
    <!-- Search Results -->
 | 
					 | 
				
			||||||
    <div id="search-results">
 | 
					 | 
				
			||||||
        if len(data.Files) > 0 {
 | 
					 | 
				
			||||||
            @list.FileMetadataListPartial(ctx, file_metadata.FileMetadataListData{
 | 
					 | 
				
			||||||
                Files:      data.Files,
 | 
					 | 
				
			||||||
                Page:       data.Page,
 | 
					 | 
				
			||||||
                Limit:      data.Limit,
 | 
					 | 
				
			||||||
                TotalCount: data.TotalCount,
 | 
					 | 
				
			||||||
                TotalPages: data.TotalPages,
 | 
					 | 
				
			||||||
                Filter:     data.Filter,
 | 
					 | 
				
			||||||
                SortBy:     data.SortBy,
 | 
					 | 
				
			||||||
                SortDir:    data.SortDir,
 | 
					 | 
				
			||||||
            }, "/files/search/partial", "#search-results-container")
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            <div class="p-6 text-center text-gray-500 dark:text-gray-400">
 | 
					 | 
				
			||||||
                <svg class="mx-auto mb-4 w-12 h-12 text-gray-400" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
 | 
					 | 
				
			||||||
                    <path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" />
 | 
					 | 
				
			||||||
                </svg>
 | 
					 | 
				
			||||||
                <p>No files found matching your search criteria.</p>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EOF
 | 
					 | 
				
			||||||
$STD "$HOME"/go/bin/templ generate
 | 
					 | 
				
			||||||
$STD go build -o gomft main.go
 | 
					 | 
				
			||||||
chmod +x /opt/gomft/gomft
 | 
					 | 
				
			||||||
JWT_SECRET_KEY=$(openssl rand -base64 24 | tr -d '/+=')
 | 
					JWT_SECRET_KEY=$(openssl rand -base64 24 | tr -d '/+=')
 | 
				
			||||||
 | 
					 | 
				
			||||||
cat <<EOF >/opt/gomft/.env
 | 
					cat <<EOF >/opt/gomft/.env
 | 
				
			||||||
SERVER_ADDRESS=:8080
 | 
					SERVER_ADDRESS=:8080
 | 
				
			||||||
DATA_DIR=/opt/gomft/data/gomft
 | 
					DATA_DIR=/opt/gomft/data/gomft
 | 
				
			||||||
@@ -95,9 +44,7 @@ EMAIL_REQUIRE_AUTH=true
 | 
				
			|||||||
EMAIL_USERNAME=smtp_username
 | 
					EMAIL_USERNAME=smtp_username
 | 
				
			||||||
EMAIL_PASSWORD=smtp_password
 | 
					EMAIL_PASSWORD=smtp_password
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
 | 
					msg_ok "Configured ${APPLICATION}"
 | 
				
			||||||
echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
 | 
					 | 
				
			||||||
msg_ok "Setup ${APPLICATION}"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Service"
 | 
					msg_info "Creating Service"
 | 
				
			||||||
cat <<EOF >/etc/systemd/system/gomft.service
 | 
					cat <<EOF >/etc/systemd/system/gomft.service
 | 
				
			||||||
@@ -108,8 +55,9 @@ After=network.target
 | 
				
			|||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
Type=simple
 | 
					Type=simple
 | 
				
			||||||
User=root
 | 
					User=root
 | 
				
			||||||
 | 
					EnvironmentFile=/opt/gomft/.env
 | 
				
			||||||
WorkingDirectory=/opt/gomft
 | 
					WorkingDirectory=/opt/gomft
 | 
				
			||||||
ExecStart=/opt/gomft/./gomft
 | 
					ExecStart=/opt/gomft/gomft
 | 
				
			||||||
Restart=always
 | 
					Restart=always
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
@@ -122,7 +70,6 @@ motd_ssh
 | 
				
			|||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
rm -f "$temp_file"
 | 
					 | 
				
			||||||
$STD apt-get -y autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
$STD apt-get -y autoclean
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
msg_ok "Cleaned"
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@ curl -L -o "${APPLICATION}" "https://github.com/heiher/${APPLICATION}/releases/d
 | 
				
			|||||||
mv ${APPLICATION} /opt/${APPLICATION}
 | 
					mv ${APPLICATION} /opt/${APPLICATION}
 | 
				
			||||||
chmod +x /opt/${APPLICATION}
 | 
					chmod +x /opt/${APPLICATION}
 | 
				
			||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
					echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
				
			||||||
curl -L -o "main.yml" "https://raw.githubusercontent.com/heiher/${APPLICATION}/refs/heads/master/conf/main.yml"
 | 
					curl -L -o "main.yml" "https://raw.githubusercontent.com/heiher/${APPLICATION}/refs/heads/main/conf/main.yml"
 | 
				
			||||||
sed -i 's/^#auth:/auth:/; s/^#  file: conf\/auth.txt/  file: \/root\/hev.creds/' main.yml
 | 
					sed -i 's/^#auth:/auth:/; s/^#  file: conf\/auth.txt/  file: \/root\/hev.creds/' main.yml
 | 
				
			||||||
mkdir -p /etc/${APPLICATION}
 | 
					mkdir -p /etc/${APPLICATION}
 | 
				
			||||||
USERNAME="admin"
 | 
					USERNAME="admin"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -283,7 +283,7 @@ GEO_DIR="${INSTALL_DIR}/geodata"
 | 
				
			|||||||
mkdir -p "$INSTALL_DIR"
 | 
					mkdir -p "$INSTALL_DIR"
 | 
				
			||||||
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${ML_DIR}","${INSTALL_DIR}"/cache}
 | 
					mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${ML_DIR}","${INSTALL_DIR}"/cache}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.138.0" "$SRC_DIR"
 | 
					fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.138.1" "$SRC_DIR"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing ${APPLICATION} (more patience please)"
 | 
					msg_info "Installing ${APPLICATION} (more patience please)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ $STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCO
 | 
				
			|||||||
$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;"
 | 
					$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;"
 | 
				
			||||||
msg_ok "Configured PostgreSQL"
 | 
					msg_ok "Configured PostgreSQL"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fetch_and_deploy_gh_release "keycloak" "keycloak/keycloak" "prebuild" "latest" "/opt/keycloak" "keycloak-*.tar.gz"
 | 
					fetch_and_deploy_gh_release "keycloak_app" "keycloak/keycloak" "prebuild" "latest" "/opt/keycloak" "keycloak-*.tar.gz"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Service"
 | 
					msg_info "Creating Service"
 | 
				
			||||||
cat <<EOF >/etc/systemd/system/keycloak.service
 | 
					cat <<EOF >/etc/systemd/system/keycloak.service
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										80
									
								
								install/litellm-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								install/litellm-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: stout01
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/BerriAI/litellm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PG_VERSION="17" setup_postgresql
 | 
				
			||||||
 | 
					PYTHON_VERSION="3.13" setup_uv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Setting up PostgreSQL"
 | 
				
			||||||
 | 
					DB_NAME="litellm_db"
 | 
				
			||||||
 | 
					DB_USER="litellm"
 | 
				
			||||||
 | 
					DB_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)"
 | 
				
			||||||
 | 
					$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
 | 
				
			||||||
 | 
					$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER ENCODING 'UTF8' TEMPLATE template0;"
 | 
				
			||||||
 | 
					$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8';"
 | 
				
			||||||
 | 
					$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';"
 | 
				
			||||||
 | 
					$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC';"
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  echo "${APPLICATION} Credentials"
 | 
				
			||||||
 | 
					  echo "Database Name: $DB_NAME"
 | 
				
			||||||
 | 
					  echo "Database User: $DB_USER"
 | 
				
			||||||
 | 
					  echo "Database Password: $DB_PASS"
 | 
				
			||||||
 | 
					} >>~/litellm.creds
 | 
				
			||||||
 | 
					msg_ok "Set up PostgreSQL"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Setting up Virtual Environment"
 | 
				
			||||||
 | 
					mkdir -p /opt/litellm
 | 
				
			||||||
 | 
					cd /opt/litellm
 | 
				
			||||||
 | 
					$STD uv venv /opt/litellm/.venv
 | 
				
			||||||
 | 
					$STD /opt/litellm/.venv/bin/python -m ensurepip --upgrade
 | 
				
			||||||
 | 
					$STD /opt/litellm/.venv/bin/python -m pip install --upgrade pip
 | 
				
			||||||
 | 
					$STD /opt/litellm/.venv/bin/python -m pip install litellm[proxy] prisma
 | 
				
			||||||
 | 
					msg_ok "Installed LiteLLM"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Configuring LiteLLM"
 | 
				
			||||||
 | 
					mkdir -p /opt
 | 
				
			||||||
 | 
					cat <<EOF >/opt/litellm/litellm.yaml
 | 
				
			||||||
 | 
					general_settings:
 | 
				
			||||||
 | 
					  master_key: sk-1234
 | 
				
			||||||
 | 
					  database_url: postgresql://$DB_USER:$DB_PASS@127.0.0.1:5432/$DB_NAME
 | 
				
			||||||
 | 
					  store_model_in_db: true
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uv --directory=/opt/litellm run litellm --config /opt/litellm/litellm.yaml --use_prisma_db_push --skip_server_startup
 | 
				
			||||||
 | 
					msg_ok "Configured LiteLLM"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Creating Service"
 | 
				
			||||||
 | 
					cat <<EOF >/etc/systemd/system/litellm.service
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=LiteLLM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					Type=simple
 | 
				
			||||||
 | 
					ExecStart=uv --directory=/opt/litellm run litellm --config /opt/litellm/litellm.yaml
 | 
				
			||||||
 | 
					Restart=always
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					systemctl enable -q --now litellm
 | 
				
			||||||
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster) | MickLesk (CanbiZ)
 | 
				
			||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# Source: https://docs.paperless-ngx.com/
 | 
					# Source: https://docs.paperless-ngx.com/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,22 +29,16 @@ $STD apt-get install -y \
 | 
				
			|||||||
  automake \
 | 
					  automake \
 | 
				
			||||||
  libtool \
 | 
					  libtool \
 | 
				
			||||||
  pkg-config \
 | 
					  pkg-config \
 | 
				
			||||||
  git \
 | 
					 | 
				
			||||||
  libtiff-dev \
 | 
					  libtiff-dev \
 | 
				
			||||||
  libpng-dev \
 | 
					  libpng-dev \
 | 
				
			||||||
  libleptonica-dev
 | 
					  libleptonica-dev
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PG_VERSION="16" setup_postgresql
 | 
					PG_VERSION="16" setup_postgresql
 | 
				
			||||||
 | 
					PYTHON_VERSION="3.13" setup_uv
 | 
				
			||||||
msg_info "Setup Python3"
 | 
					fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "latest" "/opt/paperless" "paperless*tar.xz"
 | 
				
			||||||
$STD apt-get install -y \
 | 
					fetch_and_deploy_gh_release "jbig2enc" "ie13/jbig2enc" "tarball" "latest" "/opt/jbig2enc"
 | 
				
			||||||
  python3 \
 | 
					setup_gs
 | 
				
			||||||
  python3-pip \
 | 
					 | 
				
			||||||
  python3-dev \
 | 
					 | 
				
			||||||
  python3-setuptools \
 | 
					 | 
				
			||||||
  python3-wheel
 | 
					 | 
				
			||||||
msg_ok "Setup Python3"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing OCR Dependencies (Patience)"
 | 
					msg_info "Installing OCR Dependencies (Patience)"
 | 
				
			||||||
$STD apt-get install -y \
 | 
					$STD apt-get install -y \
 | 
				
			||||||
@@ -57,50 +51,18 @@ $STD apt-get install -y \
 | 
				
			|||||||
  zlib1g \
 | 
					  zlib1g \
 | 
				
			||||||
  tesseract-ocr \
 | 
					  tesseract-ocr \
 | 
				
			||||||
  tesseract-ocr-eng
 | 
					  tesseract-ocr-eng
 | 
				
			||||||
 | 
					 | 
				
			||||||
cd /tmp
 | 
					 | 
				
			||||||
curl -fsSL "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs10040/ghostscript-10.04.0.tar.gz" -o "ghostscript-10.04.0.tar.gz"
 | 
					 | 
				
			||||||
$STD tar -xzf ghostscript-10.04.0.tar.gz
 | 
					 | 
				
			||||||
cd ghostscript-10.04.0
 | 
					 | 
				
			||||||
$STD ./configure
 | 
					 | 
				
			||||||
$STD make
 | 
					 | 
				
			||||||
$STD sudo make install
 | 
					 | 
				
			||||||
msg_ok "Installed OCR Dependencies"
 | 
					msg_ok "Installed OCR Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing JBIG2"
 | 
					msg_info "Setup JBIG2"
 | 
				
			||||||
$STD git clone https://github.com/ie13/jbig2enc /opt/jbig2enc
 | 
					 | 
				
			||||||
cd /opt/jbig2enc
 | 
					cd /opt/jbig2enc
 | 
				
			||||||
$STD bash ./autogen.sh
 | 
					$STD bash ./autogen.sh
 | 
				
			||||||
$STD bash ./configure
 | 
					$STD bash ./configure
 | 
				
			||||||
$STD make
 | 
					$STD make
 | 
				
			||||||
$STD make install
 | 
					$STD make install
 | 
				
			||||||
rm -rf /opt/jbig2enc
 | 
					rm -rf /opt/jbig2enc
 | 
				
			||||||
 | 
					cd /
 | 
				
			||||||
msg_ok "Installed JBIG2"
 | 
					msg_ok "Installed JBIG2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Paperless-ngx (Patience)"
 | 
					 | 
				
			||||||
Paperlessngx=$(curl -fsSL "https://github.com/paperless-ngx/paperless-ngx/releases/latest" | grep "title>Release" | cut -d " " -f 5)
 | 
					 | 
				
			||||||
cd /opt
 | 
					 | 
				
			||||||
$STD curl -fsSL "https://github.com/paperless-ngx/paperless-ngx/releases/download/$Paperlessngx/paperless-ngx-$Paperlessngx.tar.xz" -o "paperless-ngx-$Paperlessngx.tar.xz"
 | 
					 | 
				
			||||||
$STD tar -xf "paperless-ngx-$Paperlessngx.tar.xz" -C /opt/
 | 
					 | 
				
			||||||
mv paperless-ngx paperless
 | 
					 | 
				
			||||||
rm "paperless-ngx-$Paperlessngx.tar.xz"
 | 
					 | 
				
			||||||
cd /opt/paperless
 | 
					 | 
				
			||||||
$STD pip install --upgrade pip
 | 
					 | 
				
			||||||
$STD pip install -r requirements.txt
 | 
					 | 
				
			||||||
curl -fsSL "https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/paperless.conf.example" -o /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
mkdir -p {consume,data,media,static}
 | 
					 | 
				
			||||||
sed -i -e 's|#PAPERLESS_REDIS=redis://localhost:6379|PAPERLESS_REDIS=redis://localhost:6379|' /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e "s|#PAPERLESS_CONSUMPTION_DIR=../consume|PAPERLESS_CONSUMPTION_DIR=/opt/paperless/consume|" /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e "s|#PAPERLESS_DATA_DIR=../data|PAPERLESS_DATA_DIR=/opt/paperless/data|" /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e "s|#PAPERLESS_MEDIA_ROOT=../media|PAPERLESS_MEDIA_ROOT=/opt/paperless/media|" /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e "s|#PAPERLESS_STATICDIR=../static|PAPERLESS_STATICDIR=/opt/paperless/static|" /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
echo "${Paperlessngx}" >/opt/"${APPLICATION}"_version.txt
 | 
					 | 
				
			||||||
msg_ok "Installed Paperless-ngx"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Installing Natural Language Toolkit (Patience)"
 | 
					 | 
				
			||||||
$STD python3 -m nltk.downloader -d /usr/share/nltk_data all
 | 
					 | 
				
			||||||
msg_ok "Installed Natural Language Toolkit"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Setting up PostgreSQL database"
 | 
					msg_info "Setting up PostgreSQL database"
 | 
				
			||||||
DB_NAME=paperlessdb
 | 
					DB_NAME=paperlessdb
 | 
				
			||||||
DB_USER=paperless
 | 
					DB_USER=paperless
 | 
				
			||||||
@@ -115,36 +77,37 @@ echo "" >>~/paperless.creds
 | 
				
			|||||||
echo -e "Paperless-ngx Database User: \e[32m$DB_USER\e[0m" >>~/paperless.creds
 | 
					echo -e "Paperless-ngx Database User: \e[32m$DB_USER\e[0m" >>~/paperless.creds
 | 
				
			||||||
echo -e "Paperless-ngx Database Password: \e[32m$DB_PASS\e[0m" >>~/paperless.creds
 | 
					echo -e "Paperless-ngx Database Password: \e[32m$DB_PASS\e[0m" >>~/paperless.creds
 | 
				
			||||||
echo -e "Paperless-ngx Database Name: \e[32m$DB_NAME\e[0m" >>~/paperless.creds
 | 
					echo -e "Paperless-ngx Database Name: \e[32m$DB_NAME\e[0m" >>~/paperless.creds
 | 
				
			||||||
sed -i -e 's|#PAPERLESS_DBHOST=localhost|PAPERLESS_DBHOST=localhost|' /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e 's|#PAPERLESS_DBPORT=5432|PAPERLESS_DBPORT=5432|' /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e "s|#PAPERLESS_DBNAME=paperless|PAPERLESS_DBNAME=$DB_NAME|" /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e "s|#PAPERLESS_DBUSER=paperless|PAPERLESS_DBUSER=$DB_USER|" /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e "s|#PAPERLESS_DBPASS=paperless|PAPERLESS_DBPASS=$DB_PASS|" /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
sed -i -e "s|#PAPERLESS_SECRET_KEY=change-me|PAPERLESS_SECRET_KEY=$SECRET_KEY|" /opt/paperless/paperless.conf
 | 
					 | 
				
			||||||
cd /opt/paperless/src
 | 
					 | 
				
			||||||
$STD python3 manage.py migrate
 | 
					 | 
				
			||||||
msg_ok "Set up PostgreSQL database"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
read -r -p "${TAB3}Would you like to add Adminer? <y/N> " prompt
 | 
					msg_info "Installing Natural Language Toolkit (Patience)"
 | 
				
			||||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
					mkdir -p /usr/share/nltk_data
 | 
				
			||||||
  msg_info "Installing Adminer"
 | 
					$STD uv run -- python -m nltk.downloader -d /usr/share/nltk_data all
 | 
				
			||||||
  $STD apt install -y adminer
 | 
					sed -i -e 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/' /etc/ImageMagick-6/policy.xml
 | 
				
			||||||
  $STD a2enconf adminer
 | 
					msg_ok "Installed Natural Language Toolkit"
 | 
				
			||||||
  systemctl reload apache2
 | 
					
 | 
				
			||||||
  IP=$(hostname -I | awk '{print $1}')
 | 
					msg_info "Setup Paperless-ngx"
 | 
				
			||||||
  echo "" >>~/paperless.creds
 | 
					cd /opt/paperless
 | 
				
			||||||
  echo -e "Adminer Interface: \e[32m$IP/adminer/\e[0m" >>~/paperless.creds
 | 
					$STD uv sync --all-extras
 | 
				
			||||||
  echo -e "Adminer System: \e[32mPostgreSQL\e[0m" >>~/paperless.creds
 | 
					curl -fsSL "https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/paperless.conf.example" -o /opt/paperless/paperless.conf
 | 
				
			||||||
  echo -e "Adminer Server: \e[32mlocalhost:5432\e[0m" >>~/paperless.creds
 | 
					mkdir -p {consume,data,media,static}
 | 
				
			||||||
  echo -e "Adminer Username: \e[32m$DB_USER\e[0m" >>~/paperless.creds
 | 
					sed -i \
 | 
				
			||||||
  echo -e "Adminer Password: \e[32m$DB_PASS\e[0m" >>~/paperless.creds
 | 
					  -e 's|#PAPERLESS_REDIS=redis://localhost:6379|PAPERLESS_REDIS=redis://localhost:6379|' \
 | 
				
			||||||
  echo -e "Adminer Database: \e[32m$DB_NAME\e[0m" >>~/paperless.creds
 | 
					  -e "s|#PAPERLESS_CONSUMPTION_DIR=../consume|PAPERLESS_CONSUMPTION_DIR=/opt/paperless/consume|" \
 | 
				
			||||||
  msg_ok "Installed Adminer"
 | 
					  -e "s|#PAPERLESS_DATA_DIR=../data|PAPERLESS_DATA_DIR=/opt/paperless/data|" \
 | 
				
			||||||
fi
 | 
					  -e "s|#PAPERLESS_MEDIA_ROOT=../media|PAPERLESS_MEDIA_ROOT=/opt/paperless/media|" \
 | 
				
			||||||
 | 
					  -e "s|#PAPERLESS_STATICDIR=../static|PAPERLESS_STATICDIR=/opt/paperless/static|" \
 | 
				
			||||||
 | 
					  -e 's|#PAPERLESS_DBHOST=localhost|PAPERLESS_DBHOST=localhost|' \
 | 
				
			||||||
 | 
					  -e 's|#PAPERLESS_DBPORT=5432|PAPERLESS_DBPORT=5432|' \
 | 
				
			||||||
 | 
					  -e "s|#PAPERLESS_DBNAME=paperless|PAPERLESS_DBNAME=$DB_NAME|" \
 | 
				
			||||||
 | 
					  -e "s|#PAPERLESS_DBUSER=paperless|PAPERLESS_DBUSER=$DB_USER|" \
 | 
				
			||||||
 | 
					  -e "s|#PAPERLESS_DBPASS=paperless|PAPERLESS_DBPASS=$DB_PASS|" \
 | 
				
			||||||
 | 
					  -e "s|#PAPERLESS_SECRET_KEY=change-me|PAPERLESS_SECRET_KEY=$SECRET_KEY|" \
 | 
				
			||||||
 | 
					  /opt/paperless/paperless.conf
 | 
				
			||||||
 | 
					cd /opt/paperless/src
 | 
				
			||||||
 | 
					$STD uv run -- python manage.py migrate
 | 
				
			||||||
 | 
					msg_ok "Setup Paperless-ngx"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setting up admin Paperless-ngx User & Password"
 | 
					msg_info "Setting up admin Paperless-ngx User & Password"
 | 
				
			||||||
## From https://github.com/linuxserver/docker-paperless-ngx/blob/main/root/etc/cont-init.d/99-migrations
 | 
					cat <<EOF | uv run -- python /opt/paperless/src/manage.py shell
 | 
				
			||||||
cat <<EOF | python3 /opt/paperless/src/manage.py shell
 | 
					 | 
				
			||||||
from django.contrib.auth import get_user_model
 | 
					from django.contrib.auth import get_user_model
 | 
				
			||||||
UserModel = get_user_model()
 | 
					UserModel = get_user_model()
 | 
				
			||||||
user = UserModel.objects.create_user('admin', password='$DB_PASS')
 | 
					user = UserModel.objects.create_user('admin', password='$DB_PASS')
 | 
				
			||||||
@@ -152,10 +115,15 @@ user.is_superuser = True
 | 
				
			|||||||
user.is_staff = True
 | 
					user.is_staff = True
 | 
				
			||||||
user.save()
 | 
					user.save()
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
echo "" >>~/paperless.creds
 | 
					{
 | 
				
			||||||
echo -e "Paperless-ngx WebUI User: \e[32madmin\e[0m" >>~/paperless.creds
 | 
					  echo "Paperless-ngx-Credentials"
 | 
				
			||||||
echo -e "Paperless-ngx WebUI Password: \e[32m$DB_PASS\e[0m" >>~/paperless.creds
 | 
					  echo "Paperless-ngx Database Name: $DB_NAME"
 | 
				
			||||||
echo "" >>~/paperless.creds
 | 
					  echo "Paperless-ngx Database User: $DB_USER"
 | 
				
			||||||
 | 
					  echo "Paperless-ngx Database Password: $DB_PASS"
 | 
				
			||||||
 | 
					  echo "Paperless-ngx Secret Key: $SECRET_KEY\n"
 | 
				
			||||||
 | 
					  echo "Paperless-ngx WebUI User: admin"
 | 
				
			||||||
 | 
					  echo "Paperless-ngx WebUI Password: $DB_PASS"
 | 
				
			||||||
 | 
					} >>~/paperless-ngx.creds
 | 
				
			||||||
msg_ok "Set up admin Paperless-ngx User & Password"
 | 
					msg_ok "Set up admin Paperless-ngx User & Password"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Services"
 | 
					msg_info "Creating Services"
 | 
				
			||||||
@@ -166,7 +134,7 @@ Requires=redis.service
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
WorkingDirectory=/opt/paperless/src
 | 
					WorkingDirectory=/opt/paperless/src
 | 
				
			||||||
ExecStart=celery --app paperless beat --loglevel INFO
 | 
					ExecStart=uv run -- celery --app paperless beat --loglevel INFO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
@@ -180,7 +148,7 @@ After=postgresql.service
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
WorkingDirectory=/opt/paperless/src
 | 
					WorkingDirectory=/opt/paperless/src
 | 
				
			||||||
ExecStart=celery --app paperless worker --loglevel INFO
 | 
					ExecStart=uv run -- celery --app paperless worker --loglevel INFO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
@@ -194,7 +162,7 @@ Requires=redis.service
 | 
				
			|||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
WorkingDirectory=/opt/paperless/src
 | 
					WorkingDirectory=/opt/paperless/src
 | 
				
			||||||
ExecStartPre=/bin/sleep 2
 | 
					ExecStartPre=/bin/sleep 2
 | 
				
			||||||
ExecStart=python3 manage.py document_consumer
 | 
					ExecStart=uv run -- python manage.py document_consumer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
@@ -209,7 +177,7 @@ Requires=redis.service
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
WorkingDirectory=/opt/paperless/src
 | 
					WorkingDirectory=/opt/paperless/src
 | 
				
			||||||
ExecStart=granian --interface asginl --ws "paperless.asgi:application"
 | 
					ExecStart=uv run -- granian --interface asginl --ws "paperless.asgi:application"
 | 
				
			||||||
Environment=GRANIAN_HOST=::
 | 
					Environment=GRANIAN_HOST=::
 | 
				
			||||||
Environment=GRANIAN_PORT=8000
 | 
					Environment=GRANIAN_PORT=8000
 | 
				
			||||||
Environment=GRANIAN_WORKERS=1
 | 
					Environment=GRANIAN_WORKERS=1
 | 
				
			||||||
@@ -217,13 +185,14 @@ Environment=GRANIAN_WORKERS=1
 | 
				
			|||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
 | 
					systemctl enable -q --now paperless-webserver paperless-scheduler paperless-task-queue paperless-consumer
 | 
				
			||||||
sed -i -e 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/' /etc/ImageMagick-6/policy.xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
systemctl daemon-reload
 | 
					 | 
				
			||||||
$STD systemctl enable -q --now paperless-webserver paperless-scheduler paperless-task-queue paperless-consumer
 | 
					 | 
				
			||||||
msg_ok "Created Services"
 | 
					msg_ok "Created Services"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					read -r -p "${TAB3}Would you like to add Adminer? <y/N> " prompt
 | 
				
			||||||
 | 
					if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
				
			||||||
 | 
					  setup_adminer
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,8 @@ cat <<EOF >>/etc/apt/sources.list
 | 
				
			|||||||
deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription
 | 
					deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
$STD apt-get update
 | 
					$STD apt-get update
 | 
				
			||||||
 | 
					export DEBIAN_FRONTEND=noninteractive
 | 
				
			||||||
 | 
					export IFUPDOWN2_NO_IFRELOAD=1
 | 
				
			||||||
$STD apt-get install -y proxmox-backup-server
 | 
					$STD apt-get install -y proxmox-backup-server
 | 
				
			||||||
msg_ok "Installed Proxmox Backup Server"
 | 
					msg_ok "Installed Proxmox Backup Server"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,21 +13,12 @@ setting_up_container
 | 
				
			|||||||
network_check
 | 
					network_check
 | 
				
			||||||
update_os
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setup RustDesk"
 | 
					fetch_and_deploy_gh_release "rustdesk-hbbr" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbr*amd64.deb"
 | 
				
			||||||
 | 
					fetch_and_deploy_gh_release "rustdesk-hbbs" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-hbbs*amd64.deb"
 | 
				
			||||||
 | 
					fetch_and_deploy_gh_release "rustdesk-utils" "rustdesk/rustdesk-server" "binary" "latest" "/opt/rustdesk" "rustdesk-server-utils*amd64.deb"
 | 
				
			||||||
 | 
					fetch_and_deploy_gh_release "rustdesk-api" "lejianwen/rustdesk-api" "binary" "latest" "/opt/rustdesk" "rustdesk-api-server*amd64.deb"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/rustdesk/rustdesk-server/releases/latest | grep "tag_name" | awk -F '"' '{print $4}')
 | 
					msg_info "Configuring RustDesk Server"
 | 
				
			||||||
APIRELEASE=$(curl -fsSL https://api.github.com/repos/lejianwen/rustdesk-api/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					 | 
				
			||||||
TEMPDIR=$(mktemp -d)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-hbbr_${RELEASE}_amd64.deb" \
 | 
					 | 
				
			||||||
  -o "${TEMPDIR}/rustdesk-server-hbbr_${RELEASE}_amd64.deb"
 | 
					 | 
				
			||||||
curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-hbbs_${RELEASE}_amd64.deb" \
 | 
					 | 
				
			||||||
  -o "${TEMPDIR}/rustdesk-server-hbbs_${RELEASE}_amd64.deb"
 | 
					 | 
				
			||||||
curl -fsSL "https://github.com/rustdesk/rustdesk-server/releases/download/${RELEASE}/rustdesk-server-utils_${RELEASE}_amd64.deb" \
 | 
					 | 
				
			||||||
  -o "${TEMPDIR}/rustdesk-server-utils_${RELEASE}_amd64.deb"
 | 
					 | 
				
			||||||
curl -fsSL "https://github.com/lejianwen/rustdesk-api/releases/download/v${APIRELEASE}/rustdesk-api-server_${APIRELEASE}_amd64.deb" \
 | 
					 | 
				
			||||||
  -o "${TEMPDIR}/rustdesk-api-server_${APIRELEASE}_amd64.deb"
 | 
					 | 
				
			||||||
$STD dpkg -i "${TEMPDIR}"/*.deb
 | 
					 | 
				
			||||||
ADMINPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
 | 
					ADMINPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
 | 
				
			||||||
cd /var/lib/rustdesk-api
 | 
					cd /var/lib/rustdesk-api
 | 
				
			||||||
$STD rustdesk-api reset-admin-pwd $ADMINPASS
 | 
					$STD rustdesk-api reset-admin-pwd $ADMINPASS
 | 
				
			||||||
@@ -37,14 +28,12 @@ $STD rustdesk-api reset-admin-pwd $ADMINPASS
 | 
				
			|||||||
  echo "Username: admin"
 | 
					  echo "Username: admin"
 | 
				
			||||||
  echo "Password: $ADMINPASS"
 | 
					  echo "Password: $ADMINPASS"
 | 
				
			||||||
} >>~/rustdesk.creds
 | 
					} >>~/rustdesk.creds
 | 
				
			||||||
echo "${RELEASE}" >/opt/rustdesk_version.txt
 | 
					msg_ok "Configured RustDesk Server"
 | 
				
			||||||
msg_ok "Setup RustDesk"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
rm -rf $TEMPDIR
 | 
					 | 
				
			||||||
$STD apt-get -y autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
$STD apt-get -y autoclean
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
msg_ok "Cleaned"
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										34
									
								
								install/swizzin-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								install/swizzin-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: EEJoshua
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://swizzin.ltd/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_warn "WARNING: This script will run an external installer from a third-party source (https://swizzin.ltd/)."
 | 
				
			||||||
 | 
					msg_warn "The following code is NOT maintained or audited by our repository."
 | 
				
			||||||
 | 
					msg_warn "If you have any doubts or concerns, please review the installer code before proceeding:"
 | 
				
			||||||
 | 
					msg_custom "${TAB3}${GATEWAY}${BGN}${CL}" "\e[1;34m" "→  https://s5n.sh"
 | 
				
			||||||
 | 
					echo
 | 
				
			||||||
 | 
					read -r -p "${TAB3}Do you want to continue? [y/N]: " CONFIRM
 | 
				
			||||||
 | 
					if [[ ! "$CONFIRM" =~ ^([yY][eE][sS]|[yY])$ ]]; then
 | 
				
			||||||
 | 
					  msg_error "Aborted by user. No changes have been made."
 | 
				
			||||||
 | 
					  exit 10
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					bash <(curl -sL s5n.sh)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
@@ -17,6 +17,16 @@ msg_info "Installing Dependencies"
 | 
				
			|||||||
$STD apt-get install -y handbrake-cli
 | 
					$STD apt-get install -y handbrake-cli
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing Tdarr"
 | 
				
			||||||
 | 
					mkdir -p /opt/tdarr
 | 
				
			||||||
 | 
					cd /opt/tdarr
 | 
				
			||||||
 | 
					RELEASE=$(curl -fsSL https://f000.backblazeb2.com/file/tdarrs/versions.json | grep -oP '(?<="Tdarr_Updater": ")[^"]+' | grep linux_x64 | head -n 1)
 | 
				
			||||||
 | 
					curl -fsSL "$RELEASE" -o Tdarr_Updater.zip
 | 
				
			||||||
 | 
					$STD unzip Tdarr_Updater.zip
 | 
				
			||||||
 | 
					chmod +x Tdarr_Updater
 | 
				
			||||||
 | 
					$STD ./Tdarr_Updater
 | 
				
			||||||
 | 
					msg_ok "Installed Tdarr"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setting Up Hardware Acceleration"
 | 
					msg_info "Setting Up Hardware Acceleration"
 | 
				
			||||||
$STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
 | 
					$STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
 | 
				
			||||||
if [[ "$CTTYPE" == "0" ]]; then
 | 
					if [[ "$CTTYPE" == "0" ]]; then
 | 
				
			||||||
@@ -25,29 +35,14 @@ if [[ "$CTTYPE" == "0" ]]; then
 | 
				
			|||||||
  chmod 660 /dev/dri/*
 | 
					  chmod 660 /dev/dri/*
 | 
				
			||||||
  $STD adduser $(id -u -n) video
 | 
					  $STD adduser $(id -u -n) video
 | 
				
			||||||
  $STD adduser $(id -u -n) render
 | 
					  $STD adduser $(id -u -n) render
 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
msg_ok "Set Up Hardware Acceleration"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Installing Tdarr"
 | 
					 | 
				
			||||||
mkdir -p /opt/tdarr
 | 
					 | 
				
			||||||
cd /opt/tdarr
 | 
					 | 
				
			||||||
RELEASE=$(curl -fsSL https://f000.backblazeb2.com/file/tdarrs/versions.json | grep -oP '(?<="Tdarr_Updater": ")[^"]+' | grep linux_x64 | head -n 1)
 | 
					 | 
				
			||||||
curl -fsSL "$RELEASE" -o $(basename "$RELEASE")
 | 
					 | 
				
			||||||
$STD unzip Tdarr_Updater.zip
 | 
					 | 
				
			||||||
rm -rf Tdarr_Updater.zip
 | 
					 | 
				
			||||||
chmod +x Tdarr_Updater
 | 
					 | 
				
			||||||
./Tdarr_Updater &>/dev/null
 | 
					 | 
				
			||||||
if [[ "$CTTYPE" == "0" ]]; then
 | 
					 | 
				
			||||||
  sed -i -e 's/^sgx:x:104:$/render:x:104:root/' -e 's/^render:x:106:root$/sgx:x:106:/' /etc/group
 | 
					  sed -i -e 's/^sgx:x:104:$/render:x:104:root/' -e 's/^render:x:106:root$/sgx:x:106:/' /etc/group
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
  sed -i -e 's/^sgx:x:104:$/render:x:104:/' -e 's/^render:x:106:$/sgx:x:106:/' /etc/group
 | 
					  sed -i -e 's/^sgx:x:104:$/render:x:104:/' -e 's/^render:x:106:$/sgx:x:106:/' /etc/group
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					msg_ok "Set Up Hardware Acceleration"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_ok "Installed Tdarr"
 | 
					cat <<EOF >/etc/systemd/system/tdarr-server.service
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
msg_info "Creating Service"
 | 
					 | 
				
			||||||
service_path="/etc/systemd/system/tdarr-server.service"
 | 
					 | 
				
			||||||
echo "[Unit]
 | 
					 | 
				
			||||||
Description=Tdarr Server Daemon
 | 
					Description=Tdarr Server Daemon
 | 
				
			||||||
After=network.target
 | 
					After=network.target
 | 
				
			||||||
# Enable if using ZFS, edit and enable if other FS mounting is required to access directory
 | 
					# Enable if using ZFS, edit and enable if other FS mounting is required to access directory
 | 
				
			||||||
@@ -56,20 +51,20 @@ After=network.target
 | 
				
			|||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
User=root
 | 
					User=root
 | 
				
			||||||
Group=root
 | 
					Group=root
 | 
				
			||||||
 | 
					 | 
				
			||||||
Type=simple
 | 
					Type=simple
 | 
				
			||||||
WorkingDirectory=/opt/tdarr/Tdarr_Server
 | 
					WorkingDirectory=/opt/tdarr/Tdarr_Server
 | 
				
			||||||
ExecStartPre=/opt/tdarr/Tdarr_Updater                  
 | 
					ExecStartPre=/opt/tdarr/Tdarr_Updater
 | 
				
			||||||
ExecStart=/opt/tdarr/Tdarr_Server/Tdarr_Server
 | 
					ExecStart=/opt/tdarr/Tdarr_Server/Tdarr_Server
 | 
				
			||||||
TimeoutStopSec=20
 | 
					TimeoutStopSec=20
 | 
				
			||||||
KillMode=process
 | 
					KillMode=process
 | 
				
			||||||
Restart=on-failure
 | 
					Restart=on-failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target" >$service_path
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
service_path="/etc/systemd/system/tdarr-node.service"
 | 
					cat <<EOF >/etc/systemd/system/tdarr-node.service
 | 
				
			||||||
echo "[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description=Tdarr Node Daemon
 | 
					Description=Tdarr Node Daemon
 | 
				
			||||||
After=network.target
 | 
					After=network.target
 | 
				
			||||||
Requires=tdarr-server.service
 | 
					Requires=tdarr-server.service
 | 
				
			||||||
@@ -77,7 +72,6 @@ Requires=tdarr-server.service
 | 
				
			|||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
User=root
 | 
					User=root
 | 
				
			||||||
Group=root
 | 
					Group=root
 | 
				
			||||||
 | 
					 | 
				
			||||||
Type=simple
 | 
					Type=simple
 | 
				
			||||||
WorkingDirectory=/opt/tdarr/Tdarr_Node
 | 
					WorkingDirectory=/opt/tdarr/Tdarr_Node
 | 
				
			||||||
ExecStart=/opt/tdarr/Tdarr_Node/Tdarr_Node
 | 
					ExecStart=/opt/tdarr/Tdarr_Node/Tdarr_Node
 | 
				
			||||||
@@ -86,16 +80,16 @@ KillMode=process
 | 
				
			|||||||
Restart=on-failure
 | 
					Restart=on-failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target" >$service_path
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
systemctl enable --now -q tdarr-server.service
 | 
					EOF
 | 
				
			||||||
systemctl enable --now -q tdarr-node.service
 | 
					systemctl enable --now -q tdarr-server tdarr-node
 | 
				
			||||||
msg_ok "Created Service"
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
rm -rf Tdarr_Updater.zip
 | 
					rm -rf /opt/tdarr/Tdarr_Updater.zip
 | 
				
			||||||
$STD apt-get -y autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
$STD apt-get -y autoclean
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
msg_ok "Cleaned"
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,14 +21,24 @@ $STD apt-get update
 | 
				
			|||||||
$STD apt-get install -y aspnetcore-runtime-8.0
 | 
					$STD apt-get install -y aspnetcore-runtime-8.0
 | 
				
			||||||
msg_ok "Installed ASP.NET Core Runtime"
 | 
					msg_ok "Installed ASP.NET Core Runtime"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+')
 | 
				
			||||||
msg_info "Installing Technitium DNS"
 | 
					msg_info "Installing Technitium DNS"
 | 
				
			||||||
$STD bash <(curl -fsSL https://download.technitium.com/dns/install.sh)
 | 
					mkdir -p /opt/technitium/dns
 | 
				
			||||||
 | 
					curl -fsSL "https://download.technitium.com/dns/DnsServerPortable.tar.gz" -o /opt/DnsServerPortable.tar.gz
 | 
				
			||||||
 | 
					$STD tar zxvf /opt/DnsServerPortable.tar.gz -C /opt/technitium/dns/
 | 
				
			||||||
 | 
					echo "${RELEASE}" > ~/.technitium
 | 
				
			||||||
msg_ok "Installed Technitium DNS"
 | 
					msg_ok "Installed Technitium DNS"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Creating service"
 | 
				
			||||||
 | 
					cp /opt/technitium/dns/systemd.service /etc/systemd/system/technitium.service
 | 
				
			||||||
 | 
					systemctl enable -q --now technitium
 | 
				
			||||||
 | 
					msg_ok "Service created"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					rm -f /opt/DnsServerPortable.tar.gz
 | 
				
			||||||
$STD apt-get -y autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
$STD apt-get -y autoclean
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
msg_ok "Cleaned"
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,15 +20,7 @@ $STD apt-get install -y \
 | 
				
			|||||||
  ca-certificates
 | 
					  ca-certificates
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing TeddyCloud"
 | 
					fetch_and_deploy_gh_release "teddycloud" "toniebox-reverse-engineering/teddycloud" "prebuild" "latest" "/opt/teddycloud" "teddycloud.amd64.release*.zip"
 | 
				
			||||||
RELEASE="$(curl -fsSL https://api.github.com/repos/toniebox-reverse-engineering/teddycloud/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')"
 | 
					 | 
				
			||||||
VERSION="${RELEASE#tc_v}"
 | 
					 | 
				
			||||||
curl -fsSL "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip" -o "teddycloud.amd64.release_v${VERSION}.zip"
 | 
					 | 
				
			||||||
$STD unzip -d "/opt/teddycloud-${VERSION}" "teddycloud.amd64.release_v${VERSION}.zip"
 | 
					 | 
				
			||||||
ln -fns "/opt/teddycloud-${VERSION}" /opt/teddycloud
 | 
					 | 
				
			||||||
rm -rf teddycloud.amd64.release_v${VERSION}.zip
 | 
					 | 
				
			||||||
echo "${VERSION}" >"/opt/${APPLICATION}_version.txt"
 | 
					 | 
				
			||||||
msg_ok "Installed TeddyCloud"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Service"
 | 
					msg_info "Creating Service"
 | 
				
			||||||
cat <<EOF >/etc/systemd/system/teddycloud.service
 | 
					cat <<EOF >/etc/systemd/system/teddycloud.service
 | 
				
			||||||
@@ -53,7 +45,6 @@ motd_ssh
 | 
				
			|||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
$STD apt-get --yes autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
$STD apt-get --yes autoclean
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
rm -rf "teddycloud.amd64.release_v${VERSION}.zip"
 | 
					 | 
				
			||||||
msg_ok "Cleaned"
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,26 +13,12 @@ setting_up_container
 | 
				
			|||||||
network_check
 | 
					network_check
 | 
				
			||||||
update_os
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Dependencies"
 | 
					fetch_and_deploy_gh_release "thelounge" "thelounge/thelounge-deb" "binary"
 | 
				
			||||||
$STD apt-get install -y \
 | 
					 | 
				
			||||||
  build-essential
 | 
					 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NODE_VERSION="22" NODE_MODULE="yarn@latest,node-gyp" setup_nodejs
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Installing The Lounge"
 | 
					 | 
				
			||||||
cd /opt
 | 
					 | 
				
			||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/thelounge/thelounge-deb/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					 | 
				
			||||||
curl -fsSL "https://github.com/thelounge/thelounge-deb/releases/download/v${RELEASE}/thelounge_${RELEASE}_all.deb" -o "./thelounge_${RELEASE}_all.deb"
 | 
					 | 
				
			||||||
$STD dpkg -i ./thelounge_${RELEASE}_all.deb
 | 
					 | 
				
			||||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
 | 
					 | 
				
			||||||
msg_ok "Installed The Lounge"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
rm -rf /opt/thelounge_${RELEASE}_all.deb
 | 
					 | 
				
			||||||
$STD apt-get -y autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
$STD apt-get -y autoclean
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
msg_ok "Cleaned"
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ msg_ok "Installed Dependencies"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
NODE_VERSION="22" NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/msgbyte/tianji/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs
 | 
					NODE_VERSION="22" NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/msgbyte/tianji/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs
 | 
				
			||||||
PG_VERSION="16" setup_postgresql
 | 
					PG_VERSION="16" setup_postgresql
 | 
				
			||||||
 | 
					PYTHON_VERSION="3.12" setup_uv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setting up PostgreSQL"
 | 
					msg_info "Setting up PostgreSQL"
 | 
				
			||||||
DB_NAME=tianji_db
 | 
					DB_NAME=tianji_db
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,19 +13,22 @@ setting_up_container
 | 
				
			|||||||
network_check
 | 
					network_check
 | 
				
			||||||
update_os
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/traccar/traccar/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-64*.zip"
 | 
				
			||||||
msg_info "Installing Traccar v${RELEASE}"
 | 
					
 | 
				
			||||||
curl -fsSL "https://github.com/traccar/traccar/releases/download/v${RELEASE}/traccar-linux-64-${RELEASE}.zip" -o "traccar-linux-64-${RELEASE}.zip"
 | 
					msg_info "Configuring Traccar"
 | 
				
			||||||
$STD unzip traccar-linux-64-${RELEASE}.zip
 | 
					cd /opt/traccar
 | 
				
			||||||
$STD ./traccar.run
 | 
					$STD ./traccar.run
 | 
				
			||||||
 | 
					msg_ok "Configured Traccar"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Starting service"
 | 
				
			||||||
systemctl enable -q --now traccar
 | 
					systemctl enable -q --now traccar
 | 
				
			||||||
rm -rf README.txt traccar-linux-64-${RELEASE}.zip traccar.run
 | 
					msg_ok "Service started"
 | 
				
			||||||
msg_ok "Installed Traccar v${RELEASE}"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					[ -f README.txt ] || [ -f traccar.run ] && rm -f README.txt traccar.run
 | 
				
			||||||
$STD apt-get -y autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
$STD apt-get -y autoclean
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
msg_ok "Cleaned"
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,15 +17,8 @@ msg_info "Installing Dependencies"
 | 
				
			|||||||
$STD apt-get install -y apt-transport-https
 | 
					$STD apt-get install -y apt-transport-https
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/traefik/traefik/releases | grep -oP '"tag_name":\s*"v\K[\d.]+?(?=")' | sort -V | tail -n 1)
 | 
					fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_amd64.tar.gz"
 | 
				
			||||||
msg_info "Installing Traefik v${RELEASE}"
 | 
					 | 
				
			||||||
mkdir -p /etc/traefik/{conf.d,ssl}
 | 
					mkdir -p /etc/traefik/{conf.d,ssl}
 | 
				
			||||||
curl -fsSL "https://github.com/traefik/traefik/releases/download/v${RELEASE}/traefik_v${RELEASE}_linux_amd64.tar.gz" -o "traefik_v${RELEASE}_linux_amd64.tar.gz"
 | 
					 | 
				
			||||||
tar -C /tmp -xzf traefik*.tar.gz
 | 
					 | 
				
			||||||
mv /tmp/traefik /usr/bin/
 | 
					 | 
				
			||||||
rm -rf traefik*.tar.gz
 | 
					 | 
				
			||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
					 | 
				
			||||||
msg_ok "Installed Traefik v${RELEASE}"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Traefik configuration"
 | 
					msg_info "Creating Traefik configuration"
 | 
				
			||||||
cat <<EOF >/etc/traefik/traefik.yaml
 | 
					cat <<EOF >/etc/traefik/traefik.yaml
 | 
				
			||||||
@@ -84,7 +77,7 @@ EOF
 | 
				
			|||||||
msg_ok "Created Traefik configuration"
 | 
					msg_ok "Created Traefik configuration"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Service"
 | 
					msg_info "Creating Service"
 | 
				
			||||||
cat <<EOF >/etc/systemd/system/traefik.service
 | 
					cat <<'EOF' >/etc/systemd/system/traefik.service
 | 
				
			||||||
[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description=Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience
 | 
					Description=Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -97,7 +90,6 @@ ExecReload=/bin/kill -USR1 \$MAINPID
 | 
				
			|||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
 | 
					 | 
				
			||||||
systemctl enable -q --now traefik
 | 
					systemctl enable -q --now traefik
 | 
				
			||||||
msg_ok "Created Service"
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										61
									
								
								install/twingate-connector-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								install/twingate-connector-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: MickLesk (CanbiZ), twingate-andrewb
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://www.twingate.com/docs/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install -d -m 0700 /etc/twingate
 | 
				
			||||||
 | 
					access_token=""
 | 
				
			||||||
 | 
					refresh_token=""
 | 
				
			||||||
 | 
					network=""
 | 
				
			||||||
 | 
					while [[ -z "$access_token" ]]; do
 | 
				
			||||||
 | 
					  read -rp "${TAB3}Please enter your access token: " access_token
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					while [[ -z "$refresh_token" ]]; do
 | 
				
			||||||
 | 
					  read -rp "${TAB3}Please enter your refresh token: " refresh_token
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					while [[ -z "$network" ]]; do
 | 
				
			||||||
 | 
					  read -rp "${TAB3}Please enter your network name: " network
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Setup Twingate Repository"
 | 
				
			||||||
 | 
					curl -fsSL "https://packages.twingate.com/apt/gpg.key" | gpg --dearmor -o /usr/share/keyrings/twingate-connector-keyring.gpg
 | 
				
			||||||
 | 
					echo "deb [signed-by=/usr/share/keyrings/twingate-connector-keyring.gpg] https://packages.twingate.com/apt/ /" > /etc/apt/sources.list.d/twingate.list
 | 
				
			||||||
 | 
					$STD apt-get update
 | 
				
			||||||
 | 
					msg_ok "Setup Twingate Repository"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Setup Twingate Connector"
 | 
				
			||||||
 | 
					$STD apt-get install -y twingate-connector
 | 
				
			||||||
 | 
					msg_ok "Setup Twingate Connector"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Configure Twingate-Connector"
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  echo "TWINGATE_NETWORK=${network}"
 | 
				
			||||||
 | 
					  echo "TWINGATE_ACCESS_TOKEN=${access_token}"
 | 
				
			||||||
 | 
					  echo "TWINGATE_REFRESH_TOKEN=${refresh_token}"
 | 
				
			||||||
 | 
					  echo "TWINGATE_LABEL_HOSTNAME=$(hostname)"
 | 
				
			||||||
 | 
					  echo "TWINGATE_LABEL_DEPLOYED_BY=proxmox"
 | 
				
			||||||
 | 
					} > /etc/twingate/connector.conf
 | 
				
			||||||
 | 
					chmod 600 /etc/twingate/connector.conf
 | 
				
			||||||
 | 
					msg_ok "Configured Twingate-Connector"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Starting Service"
 | 
				
			||||||
 | 
					systemctl enable -q --now twingate-connector
 | 
				
			||||||
 | 
					msg_ok "Service started"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
@@ -13,12 +13,9 @@ setting_up_container
 | 
				
			|||||||
network_check
 | 
					network_check
 | 
				
			||||||
update_os
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Dependencies"
 | 
					 | 
				
			||||||
$STD apt-get install -y git
 | 
					 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
 | 
					NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
 | 
				
			||||||
PG_VERSION="16" setup_postgresql
 | 
					PG_VERSION="16" setup_postgresql
 | 
				
			||||||
 | 
					fetch_and_deploy_gh_release "umami" "umami-software/umami" "tarball"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setting up postgresql"
 | 
					msg_info "Setting up postgresql"
 | 
				
			||||||
DB_NAME=umamidb
 | 
					DB_NAME=umamidb
 | 
				
			||||||
@@ -39,17 +36,16 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'"
 | 
				
			|||||||
} >>~/umami.creds
 | 
					} >>~/umami.creds
 | 
				
			||||||
msg_ok "Set up postgresql"
 | 
					msg_ok "Set up postgresql"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Umami (Patience)"
 | 
					msg_info "Configuring Umami"
 | 
				
			||||||
git clone -q https://github.com/umami-software/umami.git /opt/umami
 | 
					 | 
				
			||||||
cd /opt/umami
 | 
					cd /opt/umami
 | 
				
			||||||
$STD yarn install
 | 
					$STD yarn install
 | 
				
			||||||
echo -e "DATABASE_URL=postgresql://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME" >>/opt/umami/.env
 | 
					echo -e "DATABASE_URL=postgresql://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME" >>/opt/umami/.env
 | 
				
			||||||
$STD yarn run build
 | 
					$STD yarn run build
 | 
				
			||||||
msg_ok "Installed Umami"
 | 
					msg_ok "Configured Umami"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Service"
 | 
					msg_info "Creating Service"
 | 
				
			||||||
cat <<EOF >/etc/systemd/system/umami.service
 | 
					cat <<EOF >/etc/systemd/system/umami.service
 | 
				
			||||||
echo "[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description=umami
 | 
					Description=umami
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,8 +22,6 @@ cd /opt/wallos
 | 
				
			|||||||
mv /opt/wallos/db/wallos.empty.db /opt/wallos/db/wallos.db
 | 
					mv /opt/wallos/db/wallos.empty.db /opt/wallos/db/wallos.db
 | 
				
			||||||
chown -R www-data:www-data /opt/wallos
 | 
					chown -R www-data:www-data /opt/wallos
 | 
				
			||||||
chmod -R 755 /opt/wallos
 | 
					chmod -R 755 /opt/wallos
 | 
				
			||||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
cat <<EOF >/etc/apache2/sites-available/wallos.conf
 | 
					cat <<EOF >/etc/apache2/sites-available/wallos.conf
 | 
				
			||||||
<VirtualHost *:80>
 | 
					<VirtualHost *:80>
 | 
				
			||||||
    ServerAdmin webmaster@localhost
 | 
					    ServerAdmin webmaster@localhost
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,8 +23,9 @@ RELEASE=$(curl -fsSL https://api.github.com/repos/matze/wastebin/releases/latest
 | 
				
			|||||||
curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst" -o "$temp_file"
 | 
					curl -fsSL "https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst" -o "$temp_file"
 | 
				
			||||||
tar -xf $temp_file
 | 
					tar -xf $temp_file
 | 
				
			||||||
mkdir -p /opt/wastebin
 | 
					mkdir -p /opt/wastebin
 | 
				
			||||||
mv wastebin /opt/wastebin/
 | 
					mv wastebin* /opt/wastebin/
 | 
				
			||||||
chmod +x /opt/wastebin/wastebin
 | 
					chmod +x /opt/wastebin/wastebin
 | 
				
			||||||
 | 
					chmod +x /opt/wastebin/wastebin-ctl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mkdir -p /opt/wastebin-data
 | 
					mkdir -p /opt/wastebin-data
 | 
				
			||||||
cat <<EOF >/opt/wastebin-data/.env
 | 
					cat <<EOF >/opt/wastebin-data/.env
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -82,6 +82,10 @@ Database:
 | 
				
			|||||||
        RootCert: ""
 | 
					        RootCert: ""
 | 
				
			||||||
        Cert: ""
 | 
					        Cert: ""
 | 
				
			||||||
        Key: ""
 | 
					        Key: ""
 | 
				
			||||||
 | 
					DefaultInstance:
 | 
				
			||||||
 | 
					  Features:
 | 
				
			||||||
 | 
					    LoginV2:
 | 
				
			||||||
 | 
					      Required: false
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
msg_ok "Installed Zitadel Enviroments"
 | 
					msg_ok "Installed Zitadel Enviroments"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -114,7 +118,7 @@ systemctl enable -q zitadel
 | 
				
			|||||||
msg_ok "Created Services"
 | 
					msg_ok "Created Services"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Zitadel initial setup"
 | 
					msg_info "Zitadel initial setup"
 | 
				
			||||||
zitadel start-from-init --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml &>/dev/null &
 | 
					$STD zitadel start-from-init --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml
 | 
				
			||||||
sleep 60
 | 
					sleep 60
 | 
				
			||||||
kill $(lsof -i | awk '/zitadel/ {print $2}' | head -n1)
 | 
					kill $(lsof -i | awk '/zitadel/ {print $2}' | head -n1)
 | 
				
			||||||
useradd zitadel
 | 
					useradd zitadel
 | 
				
			||||||
@@ -123,16 +127,16 @@ msg_ok "Zitadel initialized"
 | 
				
			|||||||
msg_info "Set ExternalDomain to current IP and restart Zitadel"
 | 
					msg_info "Set ExternalDomain to current IP and restart Zitadel"
 | 
				
			||||||
IP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
 | 
					IP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
 | 
				
			||||||
sed -i "0,/localhost/s/localhost/${IP}/" /opt/zitadel/config.yaml
 | 
					sed -i "0,/localhost/s/localhost/${IP}/" /opt/zitadel/config.yaml
 | 
				
			||||||
systemctl stop -q zitadel.service
 | 
					systemctl stop -q zitadel
 | 
				
			||||||
zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml &>/dev/null
 | 
					$STD zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml
 | 
				
			||||||
systemctl restart -q zitadel.service
 | 
					systemctl restart -q zitadel
 | 
				
			||||||
msg_ok "Zitadel restarted with ExternalDomain set to current IP"
 | 
					msg_ok "Zitadel restarted with ExternalDomain set to current IP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Create zitadel-rerun.sh"
 | 
					msg_info "Create zitadel-rerun.sh"
 | 
				
			||||||
cat <<EOF >~/zitadel-rerun.sh
 | 
					cat <<EOF >~/zitadel-rerun.sh
 | 
				
			||||||
systemctl stop zitadel.service
 | 
					systemctl stop zitadel
 | 
				
			||||||
timeout --kill-after=5s 15s zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml
 | 
					timeout --kill-after=5s 15s zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml
 | 
				
			||||||
systemctl restart zitadel.service
 | 
					systemctl restart zitadel
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
msg_ok "Bash script for rerunning Zitadel after changing Zitadel config.yaml"
 | 
					msg_ok "Bash script for rerunning Zitadel after changing Zitadel config.yaml"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,11 +61,11 @@ function exit_script() {
 | 
				
			|||||||
function check_storage_support() {
 | 
					function check_storage_support() {
 | 
				
			||||||
  local CONTENT="$1"
 | 
					  local CONTENT="$1"
 | 
				
			||||||
  local -a VALID_STORAGES=()
 | 
					  local -a VALID_STORAGES=()
 | 
				
			||||||
 | 
					 | 
				
			||||||
  while IFS= read -r line; do
 | 
					  while IFS= read -r line; do
 | 
				
			||||||
    local STORAGE=$(awk '{print $1}' <<<"$line")
 | 
					    local STORAGE_NAME
 | 
				
			||||||
    [[ "$STORAGE" == "storage" || -z "$STORAGE" ]] && continue
 | 
					    STORAGE_NAME=$(awk '{print $1}' <<<"$line")
 | 
				
			||||||
    VALID_STORAGES+=("$STORAGE")
 | 
					    [[ -z "$STORAGE_NAME" ]] && continue
 | 
				
			||||||
 | 
					    VALID_STORAGES+=("$STORAGE_NAME")
 | 
				
			||||||
  done < <(pvesm status -content "$CONTENT" 2>/dev/null | awk 'NR>1')
 | 
					  done < <(pvesm status -content "$CONTENT" 2>/dev/null | awk 'NR>1')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  [[ ${#VALID_STORAGES[@]} -gt 0 ]]
 | 
					  [[ ${#VALID_STORAGES[@]} -gt 0 ]]
 | 
				
			||||||
@@ -124,11 +124,12 @@ function select_storage() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  while read -r TAG TYPE _ TOTAL USED FREE _; do
 | 
					  while read -r TAG TYPE _ TOTAL USED FREE _; do
 | 
				
			||||||
    [[ -n "$TAG" && -n "$TYPE" ]] || continue
 | 
					    [[ -n "$TAG" && -n "$TYPE" ]] || continue
 | 
				
			||||||
    local DISPLAY="${TAG} (${TYPE})"
 | 
					    local STORAGE_NAME="$TAG"
 | 
				
			||||||
 | 
					    local DISPLAY="${STORAGE_NAME} (${TYPE})"
 | 
				
			||||||
    local USED_FMT=$(numfmt --to=iec --from-unit=K --format %.1f <<<"$USED")
 | 
					    local USED_FMT=$(numfmt --to=iec --from-unit=K --format %.1f <<<"$USED")
 | 
				
			||||||
    local FREE_FMT=$(numfmt --to=iec --from-unit=K --format %.1f <<<"$FREE")
 | 
					    local FREE_FMT=$(numfmt --to=iec --from-unit=K --format %.1f <<<"$FREE")
 | 
				
			||||||
    local INFO="Free: ${FREE_FMT}B  Used: ${USED_FMT}B"
 | 
					    local INFO="Free: ${FREE_FMT}B  Used: ${USED_FMT}B"
 | 
				
			||||||
    STORAGE_MAP["$DISPLAY"]="$TAG"
 | 
					    STORAGE_MAP["$DISPLAY"]="$STORAGE_NAME"
 | 
				
			||||||
    MENU+=("$DISPLAY" "$INFO" "OFF")
 | 
					    MENU+=("$DISPLAY" "$INFO" "OFF")
 | 
				
			||||||
    ((${#DISPLAY} > COL_WIDTH)) && COL_WIDTH=${#DISPLAY}
 | 
					    ((${#DISPLAY} > COL_WIDTH)) && COL_WIDTH=${#DISPLAY}
 | 
				
			||||||
  done < <(pvesm status -content "$CONTENT" | awk 'NR>1')
 | 
					  done < <(pvesm status -content "$CONTENT" | awk 'NR>1')
 | 
				
			||||||
@@ -199,21 +200,22 @@ if qm status "$CTID" &>/dev/null || pct status "$CTID" &>/dev/null; then
 | 
				
			|||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This checks for the presence of valid Container Storage and Template Storage locations
 | 
					# This checks for the presence of valid Container Storage and Template Storage locations
 | 
				
			||||||
msg_info "Validating Storage"
 | 
					msg_info "Validating storage"
 | 
				
			||||||
if ! check_storage_support "rootdir"; then
 | 
					if ! check_storage_support "rootdir"; then
 | 
				
			||||||
  msg_error "No valid storage found for 'rootdir' (Container)."
 | 
					  msg_error "No valid storage found for 'rootdir' [Container]"
 | 
				
			||||||
  exit 1
 | 
					  exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
if ! check_storage_support "vztmpl"; then
 | 
					if ! check_storage_support "vztmpl"; then
 | 
				
			||||||
  msg_error "No valid storage found for 'vztmpl' (Template)."
 | 
					  msg_error "No valid storage found for 'vztmpl' [Template]"
 | 
				
			||||||
  exit 1
 | 
					  exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
msg_ok "Valid Storage Found"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Checking template storage"
 | 
				
			||||||
while true; do
 | 
					while true; do
 | 
				
			||||||
  if select_storage template; then
 | 
					  if select_storage template; then
 | 
				
			||||||
    TEMPLATE_STORAGE="$STORAGE_RESULT"
 | 
					    TEMPLATE_STORAGE="$STORAGE_RESULT"
 | 
				
			||||||
    TEMPLATE_STORAGE_INFO="$STORAGE_INFO"
 | 
					    TEMPLATE_STORAGE_INFO="$STORAGE_INFO"
 | 
				
			||||||
 | 
					    msg_ok "Storage ${BL}$TEMPLATE_STORAGE${CL} ($TEMPLATE_STORAGE_INFO) [Template]"
 | 
				
			||||||
    break
 | 
					    break
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
@@ -222,10 +224,10 @@ while true; do
 | 
				
			|||||||
  if select_storage container; then
 | 
					  if select_storage container; then
 | 
				
			||||||
    CONTAINER_STORAGE="$STORAGE_RESULT"
 | 
					    CONTAINER_STORAGE="$STORAGE_RESULT"
 | 
				
			||||||
    CONTAINER_STORAGE_INFO="$STORAGE_INFO"
 | 
					    CONTAINER_STORAGE_INFO="$STORAGE_INFO"
 | 
				
			||||||
 | 
					    msg_ok "Storage ${BL}$CONTAINER_STORAGE${CL} ($CONTAINER_STORAGE_INFO) [Container]"
 | 
				
			||||||
    break
 | 
					    break
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
msg_ok "Validated Storage | Container: ${BL}$CONTAINER_STORAGE${CL} ($CONTAINER_STORAGE_INFO)"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Check free space on selected container storage
 | 
					# Check free space on selected container storage
 | 
				
			||||||
STORAGE_FREE=$(pvesm status | awk -v s="$CONTAINER_STORAGE" '$1 == s { print $6 }')
 | 
					STORAGE_FREE=$(pvesm status | awk -v s="$CONTAINER_STORAGE" '$1 == s { print $6 }')
 | 
				
			||||||
@@ -234,11 +236,12 @@ if [ "$STORAGE_FREE" -lt "$REQUIRED_KB" ]; then
 | 
				
			|||||||
  msg_error "Not enough space on '$CONTAINER_STORAGE'. Needed: ${PCT_DISK_SIZE:-8}G."
 | 
					  msg_error "Not enough space on '$CONTAINER_STORAGE'. Needed: ${PCT_DISK_SIZE:-8}G."
 | 
				
			||||||
  exit 214
 | 
					  exit 214
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Check Cluster Quorum if in Cluster
 | 
					# Check Cluster Quorum if in Cluster
 | 
				
			||||||
if [ -f /etc/pve/corosync.conf ]; then
 | 
					if [ -f /etc/pve/corosync.conf ]; then
 | 
				
			||||||
  msg_info "Checking Proxmox cluster quorum status"
 | 
					  msg_info "Checking cluster quorum"
 | 
				
			||||||
  if ! pvecm status | awk -F':' '/^Quorate/ { exit ($2 ~ /Yes/) ? 0 : 1 }'; then
 | 
					  if ! pvecm status | awk -F':' '/^Quorate/ { exit ($2 ~ /Yes/) ? 0 : 1 }'; then
 | 
				
			||||||
    printf "\e[?25h"
 | 
					
 | 
				
			||||||
    msg_error "Cluster is not quorate. Start all nodes or configure quorum device (QDevice)."
 | 
					    msg_error "Cluster is not quorate. Start all nodes or configure quorum device (QDevice)."
 | 
				
			||||||
    exit 210
 | 
					    exit 210
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
@@ -247,42 +250,56 @@ fi
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Update LXC template list
 | 
					# Update LXC template list
 | 
				
			||||||
TEMPLATE_SEARCH="${PCT_OSTYPE}-${PCT_OSVERSION:-}"
 | 
					TEMPLATE_SEARCH="${PCT_OSTYPE}-${PCT_OSVERSION:-}"
 | 
				
			||||||
 | 
					case "$PCT_OSTYPE" in
 | 
				
			||||||
 | 
					  debian|ubuntu)
 | 
				
			||||||
 | 
					    TEMPLATE_PATTERN="-standard_"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					  alpine|fedora|rocky|centos)
 | 
				
			||||||
 | 
					    TEMPLATE_PATTERN="-default_"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					  *)
 | 
				
			||||||
 | 
					    TEMPLATE_PATTERN=""
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Updating LXC Template List"
 | 
					# 1. Check local templates first
 | 
				
			||||||
if ! pveam update >/dev/null 2>&1; then
 | 
					msg_info "Searching for template '$TEMPLATE_SEARCH'"
 | 
				
			||||||
  TEMPLATE_FALLBACK=$(pveam list "$TEMPLATE_STORAGE" | awk "/$TEMPLATE_SEARCH/ {print \$2}" | sort -t - -k 2 -V | tail -n1)
 | 
					mapfile -t TEMPLATES < <(
 | 
				
			||||||
  if [[ -z "$TEMPLATE_FALLBACK" ]]; then
 | 
					  pveam list "$TEMPLATE_STORAGE" |
 | 
				
			||||||
    msg_error "Failed to update LXC template list and no local template matching '$TEMPLATE_SEARCH' found."
 | 
					    awk -v s="$TEMPLATE_SEARCH" -v p="$TEMPLATE_PATTERN" '$1 ~ s && $1 ~ p {print $1}' |
 | 
				
			||||||
    exit 201
 | 
					    sed 's/.*\///' | sort -t - -k 2 -V
 | 
				
			||||||
  fi
 | 
					)
 | 
				
			||||||
  msg_info "Skipping template update – using local fallback: $TEMPLATE_FALLBACK"
 | 
					
 | 
				
			||||||
 | 
					if [ ${#TEMPLATES[@]} -gt 0 ]; then
 | 
				
			||||||
 | 
					  TEMPLATE_SOURCE="local"
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
  msg_ok "LXC Template List Updated"
 | 
					  msg_info "No local template found, checking online repository"
 | 
				
			||||||
fi
 | 
					  pveam update >/dev/null 2>&1
 | 
				
			||||||
 | 
					  mapfile -t TEMPLATES < <(
 | 
				
			||||||
# Get LXC template string
 | 
					    pveam update >/dev/null 2>&1 &&
 | 
				
			||||||
TEMPLATE_SEARCH="${PCT_OSTYPE}-${PCT_OSVERSION:-}"
 | 
					      pveam available -section system |
 | 
				
			||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V)
 | 
					      sed -n "s/.*\($TEMPLATE_SEARCH.*$TEMPLATE_PATTERN.*\)/\1/p" |
 | 
				
			||||||
 | 
					      sort -t - -k 2 -V
 | 
				
			||||||
if [ ${#TEMPLATES[@]} -eq 0 ]; then
 | 
					  )
 | 
				
			||||||
  msg_error "No matching LXC template found for '${TEMPLATE_SEARCH}'. Make sure your host can reach the Proxmox template repository."
 | 
					  TEMPLATE_SOURCE="online"
 | 
				
			||||||
  exit 207
 | 
					 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEMPLATE="${TEMPLATES[-1]}"
 | 
					TEMPLATE="${TEMPLATES[-1]}"
 | 
				
			||||||
TEMPLATE_PATH="$(pvesm path $TEMPLATE_STORAGE:vztmpl/$TEMPLATE 2>/dev/null || echo "/var/lib/vz/template/cache/$TEMPLATE")"
 | 
					TEMPLATE_PATH="$(pvesm path $TEMPLATE_STORAGE:vztmpl/$TEMPLATE 2>/dev/null ||
 | 
				
			||||||
 | 
					  echo "/var/lib/vz/template/cache/$TEMPLATE")"
 | 
				
			||||||
 | 
					msg_ok "Template ${BL}$TEMPLATE${CL} [$TEMPLATE_SOURCE]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 4. Validate template (exists & not corrupted)
 | 
				
			||||||
TEMPLATE_VALID=1
 | 
					TEMPLATE_VALID=1
 | 
				
			||||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
 | 
					
 | 
				
			||||||
  TEMPLATE_VALID=0
 | 
					if [ ! -s "$TEMPLATE_PATH" ]; then
 | 
				
			||||||
elif [ ! -s "$TEMPLATE_PATH" ]; then
 | 
					 | 
				
			||||||
  TEMPLATE_VALID=0
 | 
					  TEMPLATE_VALID=0
 | 
				
			||||||
elif ! tar --use-compress-program=zstdcat -tf "$TEMPLATE_PATH" >/dev/null 2>&1; then
 | 
					elif ! tar --use-compress-program=zstdcat -tf "$TEMPLATE_PATH" >/dev/null 2>&1; then
 | 
				
			||||||
  TEMPLATE_VALID=0
 | 
					  TEMPLATE_VALID=0
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ "$TEMPLATE_VALID" -eq 0 ]; then
 | 
					if [ "$TEMPLATE_VALID" -eq 0 ]; then
 | 
				
			||||||
  msg_warn "Template $TEMPLATE not found or appears to be corrupted. Re-downloading."
 | 
					  msg_warn "Template $TEMPLATE is missing or corrupted. Re-downloading."
 | 
				
			||||||
  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
					  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
				
			||||||
  for attempt in {1..3}; do
 | 
					  for attempt in {1..3}; do
 | 
				
			||||||
    msg_info "Attempt $attempt: Downloading LXC template..."
 | 
					    msg_info "Attempt $attempt: Downloading LXC template..."
 | 
				
			||||||
@@ -298,8 +315,6 @@ if [ "$TEMPLATE_VALID" -eq 0 ]; then
 | 
				
			|||||||
  done
 | 
					  done
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_ok "LXC Template '$TEMPLATE' is ready to use."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Creating LXC Container"
 | 
					msg_info "Creating LXC Container"
 | 
				
			||||||
# Check and fix subuid/subgid
 | 
					# Check and fix subuid/subgid
 | 
				
			||||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid
 | 
					grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -894,7 +894,12 @@ function fetch_and_deploy_gh_release() {
 | 
				
			|||||||
    # If explicit filename pattern is provided (param $6), match that first
 | 
					    # If explicit filename pattern is provided (param $6), match that first
 | 
				
			||||||
    if [[ -n "$asset_pattern" ]]; then
 | 
					    if [[ -n "$asset_pattern" ]]; then
 | 
				
			||||||
      for u in $assets; do
 | 
					      for u in $assets; do
 | 
				
			||||||
        [[ "$u" =~ $asset_pattern || "$u" == *"$asset_pattern" ]] && url_match="$u" && break
 | 
					        case "${u##*/}" in
 | 
				
			||||||
 | 
					        $asset_pattern)
 | 
				
			||||||
 | 
					          url_match="$u"
 | 
				
			||||||
 | 
					          break
 | 
				
			||||||
 | 
					          ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
      done
 | 
					      done
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1256,8 +1261,20 @@ function setup_uv() {
 | 
				
			|||||||
  local UV_TAR
 | 
					  local UV_TAR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  case "$ARCH" in
 | 
					  case "$ARCH" in
 | 
				
			||||||
  x86_64) UV_TAR="uv-x86_64-unknown-linux-gnu.tar.gz" ;;
 | 
					  x86_64)
 | 
				
			||||||
  aarch64) UV_TAR="uv-aarch64-unknown-linux-gnu.tar.gz" ;;
 | 
					    if grep -qi "alpine" /etc/os-release; then
 | 
				
			||||||
 | 
					      UV_TAR="uv-x86_64-unknown-linux-musl.tar.gz"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      UV_TAR="uv-x86_64-unknown-linux-gnu.tar.gz"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					  aarch64)
 | 
				
			||||||
 | 
					    if grep -qi "alpine" /etc/os-release; then
 | 
				
			||||||
 | 
					      UV_TAR="uv-aarch64-unknown-linux-musl.tar.gz"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      UV_TAR="uv-aarch64-unknown-linux-gnu.tar.gz"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
  *)
 | 
					  *)
 | 
				
			||||||
    msg_error "Unsupported architecture: $ARCH"
 | 
					    msg_error "Unsupported architecture: $ARCH"
 | 
				
			||||||
    rm -rf "$TMP_DIR"
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
@@ -1395,7 +1412,9 @@ function setup_gs() {
 | 
				
			|||||||
    rm -rf "$TMP_DIR"
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  $STD apt-get install -y build-essential libpng-dev zlib1g-dev
 | 
					  $STD apt-get install -y build-essential libpng-dev zlib1g-dev
 | 
				
			||||||
  ./configure >/dev/null && make && sudo make install >/dev/null
 | 
					  $STD ./configure >/dev/null
 | 
				
			||||||
 | 
					  $STD make
 | 
				
			||||||
 | 
					  $STD sudo make install
 | 
				
			||||||
  local EXIT_CODE=$?
 | 
					  local EXIT_CODE=$?
 | 
				
			||||||
  hash -r
 | 
					  hash -r
 | 
				
			||||||
  if [[ ! -x "$(command -v gs)" ]]; then
 | 
					  if [[ ! -x "$(command -v gs)" ]]; then
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										248
									
								
								tools/addon/copyparty.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								tools/addon/copyparty.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,248 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: MickLesk
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/9001/copyparty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function header_info() {
 | 
				
			||||||
 | 
					  clear
 | 
				
			||||||
 | 
					  cat <<"EOF"
 | 
				
			||||||
 | 
					   ______                  ____             __
 | 
				
			||||||
 | 
					  / ____/___  ____  __  __/ __ \____ ______/ /___  __
 | 
				
			||||||
 | 
					 / /   / __ \/ __ \/ / / / /_/ / __ `/ ___/ __/ / / /
 | 
				
			||||||
 | 
					/ /___/ /_/ / /_/ / /_/ / ____/ /_/ / /  / /_/ /_/ /
 | 
				
			||||||
 | 
					\____/\____/ .___/\__, /_/    \__,_/_/   \__/\__, /
 | 
				
			||||||
 | 
					          /_/    /____/                     /____/
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					YW=$(echo "\033[33m")
 | 
				
			||||||
 | 
					GN=$(echo "\033[1;92m")
 | 
				
			||||||
 | 
					RD=$(echo "\033[01;31m")
 | 
				
			||||||
 | 
					BL=$(echo "\033[36m")
 | 
				
			||||||
 | 
					CL=$(echo "\033[m")
 | 
				
			||||||
 | 
					CM="${GN}✔️${CL}"
 | 
				
			||||||
 | 
					CROSS="${RD}✖️${CL}"
 | 
				
			||||||
 | 
					INFO="${BL}ℹ️${CL}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="CopyParty"
 | 
				
			||||||
 | 
					BIN_PATH="/usr/local/bin/copyparty-sfx.py"
 | 
				
			||||||
 | 
					CONF_PATH="/etc/copyparty.conf"
 | 
				
			||||||
 | 
					LOG_PATH="/var/log/copyparty"
 | 
				
			||||||
 | 
					DATA_PATH="/var/lib/copyparty"
 | 
				
			||||||
 | 
					SERVICE_PATH_DEB="/etc/systemd/system/copyparty.service"
 | 
				
			||||||
 | 
					SERVICE_PATH_ALP="/etc/init.d/copyparty"
 | 
				
			||||||
 | 
					SVC_USER="copyparty"
 | 
				
			||||||
 | 
					SVC_GROUP="copyparty"
 | 
				
			||||||
 | 
					SRC_URL="https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py"
 | 
				
			||||||
 | 
					DEFAULT_PORT=3923
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ -f "/etc/alpine-release" ]]; then
 | 
				
			||||||
 | 
					  OS="Alpine"
 | 
				
			||||||
 | 
					  PKG_MANAGER="apk add --no-cache"
 | 
				
			||||||
 | 
					  SERVICE_PATH="$SERVICE_PATH_ALP"
 | 
				
			||||||
 | 
					elif [[ -f "/etc/debian_version" ]]; then
 | 
				
			||||||
 | 
					  OS="Debian"
 | 
				
			||||||
 | 
					  PKG_MANAGER="apt-get install -y"
 | 
				
			||||||
 | 
					  SERVICE_PATH="$SERVICE_PATH_DEB"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					  echo -e "${CROSS} Unsupported OS detected. Exiting."
 | 
				
			||||||
 | 
					  exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function msg_info() { echo -e "${INFO} ${YW}$1...${CL}"; }
 | 
				
			||||||
 | 
					function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; }
 | 
				
			||||||
 | 
					function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function setup_user_and_dirs() {
 | 
				
			||||||
 | 
					  msg_info "Creating $SVC_USER user and directories"
 | 
				
			||||||
 | 
					  if ! id "$SVC_USER" &>/dev/null; then
 | 
				
			||||||
 | 
					    if [[ "$OS" == "Debian" ]]; then
 | 
				
			||||||
 | 
					      useradd -r -s /sbin/nologin -d "$DATA_PATH" "$SVC_USER"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      addgroup -S "$SVC_GROUP" 2>/dev/null || true
 | 
				
			||||||
 | 
					      adduser -S -D -H -G "$SVC_GROUP" -h "$DATA_PATH" -s /sbin/nologin "$SVC_USER" 2>/dev/null || true
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  mkdir -p "$DATA_PATH" "$LOG_PATH"
 | 
				
			||||||
 | 
					  chown -R "$SVC_USER:$SVC_GROUP" "$DATA_PATH" "$LOG_PATH"
 | 
				
			||||||
 | 
					  chmod 755 "$DATA_PATH" "$LOG_PATH"
 | 
				
			||||||
 | 
					  msg_ok "User/Group/Dirs ready"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function uninstall_copyparty() {
 | 
				
			||||||
 | 
					  msg_info "Uninstalling $APP"
 | 
				
			||||||
 | 
					  if [[ "$OS" == "Debian" ]]; then
 | 
				
			||||||
 | 
					    systemctl disable --now copyparty &>/dev/null
 | 
				
			||||||
 | 
					    rm -f "$SERVICE_PATH_DEB"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    rc-service copyparty stop &>/dev/null
 | 
				
			||||||
 | 
					    rc-update del copyparty &>/dev/null
 | 
				
			||||||
 | 
					    rm -f "$SERVICE_PATH_ALP"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  rm -f "$BIN_PATH" "$CONF_PATH"
 | 
				
			||||||
 | 
					  msg_ok "$APP has been uninstalled."
 | 
				
			||||||
 | 
					  exit 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_copyparty() {
 | 
				
			||||||
 | 
					  msg_info "Updating $APP"
 | 
				
			||||||
 | 
					  curl -fsSL "$SRC_URL" -o "$BIN_PATH"
 | 
				
			||||||
 | 
					  chmod +x "$BIN_PATH"
 | 
				
			||||||
 | 
					  msg_ok "Updated $APP"
 | 
				
			||||||
 | 
					  exit 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ -f "$BIN_PATH" ]]; then
 | 
				
			||||||
 | 
					  echo -e "${YW}⚠️ $APP is already installed.${CL}"
 | 
				
			||||||
 | 
					  echo -n "Uninstall $APP? (y/N): "
 | 
				
			||||||
 | 
					  read -r uninstall_prompt
 | 
				
			||||||
 | 
					  if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
				
			||||||
 | 
					    uninstall_copyparty
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  echo -n "Update $APP? (y/N): "
 | 
				
			||||||
 | 
					  read -r update_prompt
 | 
				
			||||||
 | 
					  if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
				
			||||||
 | 
					    update_copyparty
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    echo -e "${YW}⚠️ Update skipped. Exiting.${CL}"
 | 
				
			||||||
 | 
					    exit 0
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing dependencies"
 | 
				
			||||||
 | 
					if [[ "$OS" == "Debian" ]]; then
 | 
				
			||||||
 | 
					  $PKG_MANAGER python3 curl &>/dev/null
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					  $PKG_MANAGER python3 curl &>/dev/null
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					msg_ok "Dependencies installed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setup_user_and_dirs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Downloading $APP"
 | 
				
			||||||
 | 
					curl -fsSL "$SRC_URL" -o "$BIN_PATH"
 | 
				
			||||||
 | 
					chmod +x "$BIN_PATH"
 | 
				
			||||||
 | 
					chown "$SVC_USER:$SVC_GROUP" "$BIN_PATH"
 | 
				
			||||||
 | 
					msg_ok "Downloaded to $BIN_PATH"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo -n "Enter port for $APP (default: $DEFAULT_PORT): "
 | 
				
			||||||
 | 
					read -r PORT
 | 
				
			||||||
 | 
					PORT=${PORT:-$DEFAULT_PORT}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo -n "Set data directory (default: $DATA_PATH): "
 | 
				
			||||||
 | 
					read -r USER_DATA_PATH
 | 
				
			||||||
 | 
					USER_DATA_PATH=${USER_DATA_PATH:-$DATA_PATH}
 | 
				
			||||||
 | 
					mkdir -p "$USER_DATA_PATH"
 | 
				
			||||||
 | 
					chown "$SVC_USER:$SVC_GROUP" "$USER_DATA_PATH"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo -n "Enable authentication? (Y/n): "
 | 
				
			||||||
 | 
					read -r auth_enable
 | 
				
			||||||
 | 
					if [[ "${auth_enable,,}" =~ ^(n|no)$ ]]; then
 | 
				
			||||||
 | 
					  AUTH_LINE=""
 | 
				
			||||||
 | 
					  msg_ok "Configured without authentication"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					  echo -n "Set admin username [default: admin]: "
 | 
				
			||||||
 | 
					  read -r ADMIN_USER
 | 
				
			||||||
 | 
					  ADMIN_USER=${ADMIN_USER:-admin}
 | 
				
			||||||
 | 
					  echo -n "Set admin password [default: helper-scripts.com]: "
 | 
				
			||||||
 | 
					  read -rs ADMIN_PASS
 | 
				
			||||||
 | 
					  ADMIN_PASS=${ADMIN_PASS:-helper-scripts.com}
 | 
				
			||||||
 | 
					  echo
 | 
				
			||||||
 | 
					  AUTH_LINE="auth vhost=/:$ADMIN_USER:$ADMIN_PASS:admin,,"
 | 
				
			||||||
 | 
					  msg_ok "Configured with admin user: $ADMIN_USER"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Writing config to $CONF_PATH"
 | 
				
			||||||
 | 
					msg_info "Writing config to $CONF_PATH"
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  echo "[global]"
 | 
				
			||||||
 | 
					  echo "  p: $PORT"
 | 
				
			||||||
 | 
					  echo "  ansi"
 | 
				
			||||||
 | 
					  echo "  e2dsa"
 | 
				
			||||||
 | 
					  echo "  e2ts"
 | 
				
			||||||
 | 
					  echo "  theme: 2"
 | 
				
			||||||
 | 
					  echo "  grid"
 | 
				
			||||||
 | 
					  echo
 | 
				
			||||||
 | 
					  if [[ -n "$ADMIN_USER" && -n "$ADMIN_PASS" ]]; then
 | 
				
			||||||
 | 
					    echo "[accounts]"
 | 
				
			||||||
 | 
					    echo "  $ADMIN_USER: $ADMIN_PASS"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  echo "[/]"
 | 
				
			||||||
 | 
					  echo "  $USER_DATA_PATH"
 | 
				
			||||||
 | 
					  echo "  accs:"
 | 
				
			||||||
 | 
					  if [[ -n "$ADMIN_USER" ]]; then
 | 
				
			||||||
 | 
					    echo "    rw: *"
 | 
				
			||||||
 | 
					    echo "    rwmda: $ADMIN_USER"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    echo "    rw: *"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					} >"$CONF_PATH"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					chmod 640 "$CONF_PATH"
 | 
				
			||||||
 | 
					chown "$SVC_USER:$SVC_GROUP" "$CONF_PATH"
 | 
				
			||||||
 | 
					msg_ok "Config written"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Creating service"
 | 
				
			||||||
 | 
					if [[ "$OS" == "Debian" ]]; then
 | 
				
			||||||
 | 
					  cat <<EOF >"$SERVICE_PATH_DEB"
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=Copyparty file server
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					User=$SVC_USER
 | 
				
			||||||
 | 
					Group=$SVC_GROUP
 | 
				
			||||||
 | 
					WorkingDirectory=$DATA_PATH
 | 
				
			||||||
 | 
					ExecStart=/usr/bin/python3 /usr/local/bin/copyparty-sfx.py -c /etc/copyparty.conf
 | 
				
			||||||
 | 
					Restart=always
 | 
				
			||||||
 | 
					StandardOutput=append:/var/log/copyparty/copyparty.log
 | 
				
			||||||
 | 
					StandardError=append:/var/log/copyparty/copyparty.err
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  systemctl enable -q --now copyparty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					elif [[ "$OS" == "Alpine" ]]; then
 | 
				
			||||||
 | 
					  cat <<'EOF' >"$SERVICE_PATH_ALP"
 | 
				
			||||||
 | 
					#!/sbin/openrc-run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					name="copyparty"
 | 
				
			||||||
 | 
					description="Copyparty file server"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					command="$(command -v python3)"
 | 
				
			||||||
 | 
					command_args="/usr/local/bin/copyparty-sfx.py -c /etc/copyparty.conf"
 | 
				
			||||||
 | 
					command_background=true
 | 
				
			||||||
 | 
					directory="/var/lib/copyparty"
 | 
				
			||||||
 | 
					pidfile="/run/copyparty.pid"
 | 
				
			||||||
 | 
					output_log="/var/log/copyparty/copyparty.log"
 | 
				
			||||||
 | 
					error_log="/var/log/copyparty/copyparty.err"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depend() {
 | 
				
			||||||
 | 
					    need net
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  chmod +x "$SERVICE_PATH_ALP"
 | 
				
			||||||
 | 
					  rc-update add copyparty default >/dev/null 2>&1
 | 
				
			||||||
 | 
					  rc-service copyparty restart >/dev/null 2>&1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					msg_ok "Service created and started"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IFACE=$(ip -4 route | awk '/default/ {print $5; exit}')
 | 
				
			||||||
 | 
					IP=$(ip -4 addr show "$IFACE" | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
 | 
				
			||||||
 | 
					[[ -z "$IP" ]] && IP=$(hostname -I | awk '{print $1}')
 | 
				
			||||||
 | 
					[[ -z "$IP" ]] && IP="127.0.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo -e "${CM} ${GN}$APP is running at: ${BL}http://$IP:$PORT${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO} Storage directory: ${YW}$USER_DATA_PATH${CL}"
 | 
				
			||||||
 | 
					if [[ -n "$AUTH_LINE" ]]; then
 | 
				
			||||||
 | 
					  echo -e "${INFO} Login: ${GN}${ADMIN_USER}${CL} / ${GN}${ADMIN_PASS}${CL}"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
@@ -1,9 +1,8 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster) | MickLesk (CanbiZ)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
function header_info {
 | 
					function header_info {
 | 
				
			||||||
  clear
 | 
					  clear
 | 
				
			||||||
@@ -16,65 +15,55 @@ function header_info {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
IP=$(hostname -I | awk '{print $1}')
 | 
					
 | 
				
			||||||
YW=$(echo "\033[33m")
 | 
					 | 
				
			||||||
BL=$(echo "\033[36m")
 | 
					 | 
				
			||||||
RD=$(echo "\033[01;31m")
 | 
					 | 
				
			||||||
BGN=$(echo "\033[4;92m")
 | 
					 | 
				
			||||||
GN=$(echo "\033[1;92m")
 | 
					 | 
				
			||||||
DGN=$(echo "\033[32m")
 | 
					 | 
				
			||||||
CL=$(echo "\033[m")
 | 
					 | 
				
			||||||
BFR="\\r\\033[K"
 | 
					 | 
				
			||||||
HOLD=" "
 | 
					 | 
				
			||||||
CM="${GN}✓${CL}"
 | 
					 | 
				
			||||||
APP="Glances"
 | 
					APP="Glances"
 | 
				
			||||||
hostname="$(hostname)"
 | 
					YW=$(echo "\033[33m")
 | 
				
			||||||
silent() { "$@" >/dev/null 2>&1; }
 | 
					GN=$(echo "\033[1;92m")
 | 
				
			||||||
set -e
 | 
					RD=$(echo "\033[01;31m")
 | 
				
			||||||
spinner() {
 | 
					BL=$(echo "\033[36m")
 | 
				
			||||||
  local chars="/-\|"
 | 
					CL=$(echo "\033[m")
 | 
				
			||||||
  local spin_i=0
 | 
					CM="${GN}✔️${CL}"
 | 
				
			||||||
  printf "\e[?25l"
 | 
					CROSS="${RD}✖️${CL}"
 | 
				
			||||||
  while true; do
 | 
					INFO="${BL}ℹ️${CL}"
 | 
				
			||||||
    printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}"
 | 
					 | 
				
			||||||
    sleep 0.1
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info() {
 | 
					function msg_info() { echo -e "${INFO} ${YW}$1...${CL}"; }
 | 
				
			||||||
  local msg="$1"
 | 
					function msg_ok() { echo -e "${CM} ${GN}$1${CL}"; }
 | 
				
			||||||
  echo -ne " ${HOLD} ${YW}${msg}   "
 | 
					function msg_error() { echo -e "${CROSS} ${RD}$1${CL}"; }
 | 
				
			||||||
  spinner &
 | 
					 | 
				
			||||||
  SPINNER_PID=$!
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_ok() {
 | 
					get_local_ip() {
 | 
				
			||||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
 | 
					  if command -v hostname >/dev/null 2>&1 && hostname -I 2>/dev/null; then
 | 
				
			||||||
  printf "\e[?25h"
 | 
					    hostname -I | awk '{print $1}'
 | 
				
			||||||
  local msg="$1"
 | 
					  elif command -v ip >/dev/null 2>&1; then
 | 
				
			||||||
  echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
 | 
					    ip -4 addr show scope global | awk '/inet / {print $2}' | cut -d/ -f1 | head -n1
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install() {
 | 
					 | 
				
			||||||
  header_info
 | 
					 | 
				
			||||||
  while true; do
 | 
					 | 
				
			||||||
    read -p "This will Install ${APP} on $hostname. Proceed(y/n)?" yn
 | 
					 | 
				
			||||||
    case $yn in
 | 
					 | 
				
			||||||
    [Yy]*) break ;;
 | 
					 | 
				
			||||||
    [Nn]*) exit ;;
 | 
					 | 
				
			||||||
    *) echo "Please answer yes or no." ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
  done
 | 
					 | 
				
			||||||
  header_info
 | 
					 | 
				
			||||||
  read -r -p "Verbose mode? <y/N> " prompt
 | 
					 | 
				
			||||||
  if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
 | 
					 | 
				
			||||||
    STD=""
 | 
					 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    STD="silent"
 | 
					    echo "127.0.0.1"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  msg_info "Installing $APP"
 | 
					}
 | 
				
			||||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
					IP=$(get_local_ip)
 | 
				
			||||||
  $STD bash -c "$(curl -fsSL https://raw.githubusercontent.com/nicolargo/glancesautoinstall/master/install.sh)"
 | 
					
 | 
				
			||||||
 | 
					install_glances_debian() {
 | 
				
			||||||
 | 
					  msg_info "Installing dependencies"
 | 
				
			||||||
 | 
					  apt-get update >/dev/null 2>&1
 | 
				
			||||||
 | 
					  apt-get install -y gcc lm-sensors wireless-tools >/dev/null 2>&1
 | 
				
			||||||
 | 
					  msg_ok "Installed dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Setting up Python + uv"
 | 
				
			||||||
 | 
					  source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func)
 | 
				
			||||||
 | 
					  setup_uv PYTHON_VERSION="3.12"
 | 
				
			||||||
 | 
					  msg_ok "Setup Python + uv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Installing $APP (with web UI)"
 | 
				
			||||||
 | 
					  cd /opt
 | 
				
			||||||
 | 
					  mkdir -p glances
 | 
				
			||||||
 | 
					  cd glances
 | 
				
			||||||
 | 
					  uv venv
 | 
				
			||||||
 | 
					  source .venv/bin/activate >/dev/null 2>&1
 | 
				
			||||||
 | 
					  uv pip install --upgrade pip wheel setuptools >/dev/null 2>&1
 | 
				
			||||||
 | 
					  uv pip install "glances[web]" >/dev/null 2>&1
 | 
				
			||||||
 | 
					  deactivate
 | 
				
			||||||
 | 
					  msg_ok "Installed $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Creating systemd service"
 | 
				
			||||||
  cat <<EOF >/etc/systemd/system/glances.service
 | 
					  cat <<EOF >/etc/systemd/system/glances.service
 | 
				
			||||||
[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description=Glances - An eye on your system
 | 
					Description=Glances - An eye on your system
 | 
				
			||||||
@@ -82,44 +71,132 @@ After=network.target
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
Type=simple
 | 
					Type=simple
 | 
				
			||||||
ExecStart=/usr/local/bin/glances -w
 | 
					ExecStart=/opt/glances/.venv/bin/glances -w
 | 
				
			||||||
Restart=on-failure
 | 
					Restart=on-failure
 | 
				
			||||||
 | 
					WorkingDirectory=/opt/glances
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
  systemctl enable -q --now glances.service
 | 
					  systemctl enable -q --now glances
 | 
				
			||||||
  msg_ok "Installed $APP on $hostname"
 | 
					  msg_ok "Created systemd service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  echo -e "${APP} should be reachable by going to the following URL.
 | 
					  echo -e "\n$APP is now running at: http://$IP:61208\n"
 | 
				
			||||||
           ${BL}http://$IP:61208${CL} \n"
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
uninstall() {
 | 
					
 | 
				
			||||||
  header_info
 | 
					# update on Debian/Ubuntu
 | 
				
			||||||
 | 
					update_glances_debian() {
 | 
				
			||||||
 | 
					  if [[ ! -d /opt/glances/.venv ]]; then
 | 
				
			||||||
 | 
					    msg_error "$APP is not installed"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  msg_info "Updating $APP"
 | 
				
			||||||
 | 
					  cd /opt/glances
 | 
				
			||||||
 | 
					  source .venv/bin/activate
 | 
				
			||||||
 | 
					  uv pip install --upgrade "glances[web]" >/dev/null 2>&1
 | 
				
			||||||
 | 
					  deactivate
 | 
				
			||||||
 | 
					  systemctl restart glances
 | 
				
			||||||
 | 
					  msg_ok "Updated $APP"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# uninstall on Debian/Ubuntu
 | 
				
			||||||
 | 
					uninstall_glances_debian() {
 | 
				
			||||||
  msg_info "Uninstalling $APP"
 | 
					  msg_info "Uninstalling $APP"
 | 
				
			||||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
 | 
					  systemctl disable -q --now glances || true
 | 
				
			||||||
  systemctl disable -q --now glances
 | 
					  rm -f /etc/systemd/system/glances.service
 | 
				
			||||||
  bash -c "$(curl -fsSL https://raw.githubusercontent.com/nicolargo/glancesautoinstall/master/uninstall.sh)"
 | 
					  rm -rf /opt/glances
 | 
				
			||||||
  rm -rf /etc/systemd/system/glances.service
 | 
					  msg_ok "Removed $APP"
 | 
				
			||||||
  msg_ok "Uninstalled $APP"
 | 
					 | 
				
			||||||
  msg_ok "Completed Successfully!\n"
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# install on Alpine
 | 
				
			||||||
 | 
					install_glances_alpine() {
 | 
				
			||||||
 | 
					  msg_info "Installing dependencies"
 | 
				
			||||||
 | 
					  apk update >/dev/null 2>&1
 | 
				
			||||||
 | 
					  $STD apk add --no-cache \
 | 
				
			||||||
 | 
					    gcc musl-dev linux-headers python3-dev \
 | 
				
			||||||
 | 
					    python3 py3-pip py3-virtualenv lm-sensors wireless-tools >/dev/null 2>&1
 | 
				
			||||||
 | 
					  msg_ok "Installed dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Setting up Python + uv"
 | 
				
			||||||
 | 
					  source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/tools.func)
 | 
				
			||||||
 | 
					  setup_uv PYTHON_VERSION="3.12"
 | 
				
			||||||
 | 
					  msg_ok "Setup Python + uv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Installing $APP (with web UI)"
 | 
				
			||||||
 | 
					  cd /opt
 | 
				
			||||||
 | 
					  mkdir -p glances
 | 
				
			||||||
 | 
					  cd glances
 | 
				
			||||||
 | 
					  uv venv
 | 
				
			||||||
 | 
					  source .venv/bin/activate
 | 
				
			||||||
 | 
					  uv pip install --upgrade pip wheel setuptools >/dev/null 2>&1
 | 
				
			||||||
 | 
					  uv pip install "glances[web]" >/dev/null 2>&1
 | 
				
			||||||
 | 
					  deactivate
 | 
				
			||||||
 | 
					  msg_ok "Installed $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Creating OpenRC service"
 | 
				
			||||||
 | 
					  cat <<'EOF' >/etc/init.d/glances
 | 
				
			||||||
 | 
					#!/sbin/openrc-run
 | 
				
			||||||
 | 
					command="/opt/glances/.venv/bin/glances"
 | 
				
			||||||
 | 
					command_args="-w"
 | 
				
			||||||
 | 
					command_background="yes"
 | 
				
			||||||
 | 
					pidfile="/run/glances.pid"
 | 
				
			||||||
 | 
					name="glances"
 | 
				
			||||||
 | 
					description="Glances monitoring tool"
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					  chmod +x /etc/init.d/glances
 | 
				
			||||||
 | 
					  rc-update add glances default
 | 
				
			||||||
 | 
					  rc-service glances start
 | 
				
			||||||
 | 
					  msg_ok "Created OpenRC service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  echo -e "\n$APP is now running at: http://$IP:61208\n"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# update on Alpine
 | 
				
			||||||
 | 
					update_glances_alpine() {
 | 
				
			||||||
 | 
					  if [[ ! -d /opt/glances/.venv ]]; then
 | 
				
			||||||
 | 
					    msg_error "$APP is not installed"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  msg_info "Updating $APP"
 | 
				
			||||||
 | 
					  cd /opt/glances
 | 
				
			||||||
 | 
					  source .venv/bin/activate
 | 
				
			||||||
 | 
					  uv pip install --upgrade "glances[web]" >/dev/null 2>&1
 | 
				
			||||||
 | 
					  deactivate
 | 
				
			||||||
 | 
					  rc-service glances restart
 | 
				
			||||||
 | 
					  msg_ok "Updated $APP"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# uninstall on Alpine
 | 
				
			||||||
 | 
					uninstall_glances_alpine() {
 | 
				
			||||||
 | 
					  msg_info "Uninstalling $APP"
 | 
				
			||||||
 | 
					  rc-service glances stop || true
 | 
				
			||||||
 | 
					  rc-update del glances || true
 | 
				
			||||||
 | 
					  rm -f /etc/init.d/glances
 | 
				
			||||||
 | 
					  rm -rf /opt/glances
 | 
				
			||||||
 | 
					  msg_ok "Removed $APP"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# options menu
 | 
				
			||||||
OPTIONS=(Install "Install $APP"
 | 
					OPTIONS=(Install "Install $APP"
 | 
				
			||||||
 | 
					  Update "Update $APP"
 | 
				
			||||||
  Uninstall "Uninstall $APP")
 | 
					  Uninstall "Uninstall $APP")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$APP" --menu "Select an option:" 10 58 2 \
 | 
					CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$APP" --menu "Select an option:" 12 58 3 \
 | 
				
			||||||
  "${OPTIONS[@]}" 3>&1 1>&2 2>&3)
 | 
					  "${OPTIONS[@]}" 3>&1 1>&2 2>&3 || true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
case $CHOICE in
 | 
					# OS detection
 | 
				
			||||||
"Install")
 | 
					if grep -qi "alpine" /etc/os-release; then
 | 
				
			||||||
  install
 | 
					  case "$CHOICE" in
 | 
				
			||||||
  ;;
 | 
					  Install) install_glances_alpine ;;
 | 
				
			||||||
"Uninstall")
 | 
					  Update) update_glances_alpine ;;
 | 
				
			||||||
  uninstall
 | 
					  Uninstall) uninstall_glances_alpine ;;
 | 
				
			||||||
  ;;
 | 
					  *) exit 0 ;;
 | 
				
			||||||
*)
 | 
					  esac
 | 
				
			||||||
  echo "Exiting..."
 | 
					else
 | 
				
			||||||
  exit 0
 | 
					  case "$CHOICE" in
 | 
				
			||||||
  ;;
 | 
					  Install) install_glances_debian ;;
 | 
				
			||||||
esac
 | 
					  Update) update_glances_debian ;;
 | 
				
			||||||
 | 
					  Uninstall) uninstall_glances_debian ;;
 | 
				
			||||||
 | 
					  *) exit 0 ;;
 | 
				
			||||||
 | 
					  esac
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,30 +39,93 @@ function msg_ok() {
 | 
				
			|||||||
  echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
 | 
					  echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function msg_error() { echo -e "${RD}✗ $1${CL}"; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pve_check() {
 | 
				
			||||||
 | 
					  if ! command -v pveversion >/dev/null 2>&1; then
 | 
				
			||||||
 | 
					    msg_error "This script can only be run on a Proxmox VE host."
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local PVE_VER
 | 
				
			||||||
 | 
					  PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Proxmox VE 8.x: allow 8.0 – 8.9
 | 
				
			||||||
 | 
					  if [[ "$PVE_VER" =~ ^9\.([0-9]+)(\.[0-9]+)?$ ]]; then
 | 
				
			||||||
 | 
					    local MINOR="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					    if ((MINOR != 0)); then
 | 
				
			||||||
 | 
					      msg_error "Unsupported Proxmox VE version: $PVE_VER"
 | 
				
			||||||
 | 
					      msg_error "Supported versions: 8.0 – 8.9 or 9.0.x"
 | 
				
			||||||
 | 
					      exit 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Proxmox VE 9.x: allow only 9.0
 | 
				
			||||||
 | 
					  if [[ "$PVE_VER" =~ ^9\.([0-9]+)$ ]]; then
 | 
				
			||||||
 | 
					    local MINOR="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					    if ((MINOR != 0)); then
 | 
				
			||||||
 | 
					      msg_error "Unsupported Proxmox VE version: $PVE_VER"
 | 
				
			||||||
 | 
					      msg_error "Supported versions: 8.0 – 8.9 or 9.0"
 | 
				
			||||||
 | 
					      exit 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_error "Unsupported Proxmox VE version: $PVE_VER"
 | 
				
			||||||
 | 
					  msg_error "Supported versions: 8.0 – 8.9 or 9.0"
 | 
				
			||||||
 | 
					  exit 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					detect_codename() {
 | 
				
			||||||
 | 
					  source /etc/os-release
 | 
				
			||||||
 | 
					  if [[ "$ID" != "debian" ]]; then
 | 
				
			||||||
 | 
					    msg_error "Unsupported base OS: $ID (only Proxmox VE / Debian supported)."
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  CODENAME="${VERSION_CODENAME:-}"
 | 
				
			||||||
 | 
					  if [[ -z "$CODENAME" ]]; then
 | 
				
			||||||
 | 
					    msg_error "Could not detect Debian codename."
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  echo "$CODENAME"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get_latest_repo_pkg() {
 | 
				
			||||||
 | 
					  local REPO_URL=$1
 | 
				
			||||||
 | 
					  curl -fsSL "$REPO_URL" |
 | 
				
			||||||
 | 
					    grep -oP 'netdata-repo_[^"]+all\.deb' |
 | 
				
			||||||
 | 
					    sort -V |
 | 
				
			||||||
 | 
					    tail -n1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install() {
 | 
					install() {
 | 
				
			||||||
  header_info
 | 
					  header_info
 | 
				
			||||||
  while true; do
 | 
					  while true; do
 | 
				
			||||||
    read -p "Are you sure you want to install NetData on Proxmox VE host. Proceed(y/n)?" yn
 | 
					    read -p "Are you sure you want to install NetData on Proxmox VE host. Proceed(y/n)? " yn
 | 
				
			||||||
    case $yn in
 | 
					    case $yn in
 | 
				
			||||||
    [Yy]*) break ;;
 | 
					    [Yy]*) break ;;
 | 
				
			||||||
    [Nn]*) exit ;;
 | 
					    [Nn]*) exit ;;
 | 
				
			||||||
    *) echo "Please answer yes or no." ;;
 | 
					    *) echo "Please answer yes or no." ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
  done
 | 
					  done
 | 
				
			||||||
  header_info
 | 
					
 | 
				
			||||||
  read -r -p "Verbose mode? <y/N> " prompt
 | 
					  read -r -p "Verbose mode? <y/N> " prompt
 | 
				
			||||||
  if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
 | 
					  [[ ${prompt,,} =~ ^(y|yes)$ ]] && STD="" || STD="silent"
 | 
				
			||||||
    STD=""
 | 
					
 | 
				
			||||||
  else
 | 
					  CODENAME=$(detect_codename)
 | 
				
			||||||
    STD="silent"
 | 
					  REPO_URL="https://repo.netdata.cloud/repos/repoconfig/debian/${CODENAME}/"
 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  header_info
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  msg_info "Setting up repository"
 | 
					  msg_info "Setting up repository"
 | 
				
			||||||
  $STD apt-get install -y debian-keyring
 | 
					  $STD apt-get install -y debian-keyring
 | 
				
			||||||
  curl -fsSL "https://repo.netdata.cloud/repos/repoconfig/debian/bookworm/netdata-repo_5-1+debian12_all.deb" -o $(basename "https://repo.netdata.cloud/repos/repoconfig/debian/bookworm/netdata-repo_5-1+debian12_all.deb")
 | 
					  PKG=$(get_latest_repo_pkg "$REPO_URL")
 | 
				
			||||||
  $STD dpkg -i netdata-repo_5-1+debian12_all.deb
 | 
					  if [[ -z "$PKG" ]]; then
 | 
				
			||||||
  rm -rf netdata-repo_5-1+debian12_all.deb
 | 
					    msg_error "Could not find netdata-repo package for Debian $CODENAME"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  curl -fsSL "${REPO_URL}${PKG}" -o "$PKG"
 | 
				
			||||||
 | 
					  $STD dpkg -i "$PKG"
 | 
				
			||||||
 | 
					  rm -f "$PKG"
 | 
				
			||||||
  msg_ok "Set up repository"
 | 
					  msg_ok "Set up repository"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  msg_info "Installing Netdata"
 | 
					  msg_info "Installing Netdata"
 | 
				
			||||||
@@ -76,46 +139,32 @@ install() {
 | 
				
			|||||||
uninstall() {
 | 
					uninstall() {
 | 
				
			||||||
  header_info
 | 
					  header_info
 | 
				
			||||||
  read -r -p "Verbose mode? <y/N> " prompt
 | 
					  read -r -p "Verbose mode? <y/N> " prompt
 | 
				
			||||||
  if [[ ${prompt,,} =~ ^(y|yes)$ ]]; then
 | 
					  [[ ${prompt,,} =~ ^(y|yes)$ ]] && STD="" || STD="silent"
 | 
				
			||||||
    STD=""
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    STD="silent"
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  header_info
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  msg_info "Uninstalling Netdata"
 | 
					  msg_info "Uninstalling Netdata"
 | 
				
			||||||
  systemctl stop netdata
 | 
					  systemctl stop netdata || true
 | 
				
			||||||
  rm -rf /var/log/netdata /var/lib/netdata /var/cache/netdata /etc/netdata/go.d
 | 
					  rm -rf /var/log/netdata /var/lib/netdata /var/cache/netdata /etc/netdata/go.d
 | 
				
			||||||
  rm -rf /etc/apt/trusted.gpg.d/netdata-archive-keyring.gpg /etc/apt/sources.list.d/netdata.list
 | 
					  rm -rf /etc/apt/trusted.gpg.d/netdata-archive-keyring.gpg /etc/apt/sources.list.d/netdata.list
 | 
				
			||||||
  $STD apt-get remove --purge -y netdata netdata-repo
 | 
					  $STD apt-get remove --purge -y netdata netdata-repo
 | 
				
			||||||
  systemctl daemon-reload
 | 
					  systemctl daemon-reload
 | 
				
			||||||
  $STD apt autoremove -y
 | 
					  $STD apt autoremove -y
 | 
				
			||||||
  $STD userdel netdata
 | 
					  $STD userdel netdata || true
 | 
				
			||||||
  msg_ok "Uninstalled Netdata"
 | 
					  msg_ok "Uninstalled Netdata"
 | 
				
			||||||
  msg_ok "Completed Successfully!\n"
 | 
					  msg_ok "Completed Successfully!\n"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*"; then
 | 
					header_info
 | 
				
			||||||
  echo -e "This version of Proxmox Virtual Environment is not supported"
 | 
					pve_check
 | 
				
			||||||
  echo -e "Requires PVE Version 8.0 or higher"
 | 
					 | 
				
			||||||
  echo -e "Exiting..."
 | 
					 | 
				
			||||||
  sleep 2
 | 
					 | 
				
			||||||
  exit
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
OPTIONS=(Install "Install NetData on Proxmox VE"
 | 
					OPTIONS=(Install "Install NetData on Proxmox VE"
 | 
				
			||||||
  Uninstall "Uninstall NetData from Proxmox VE")
 | 
					  Uninstall "Uninstall NetData from Proxmox VE")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NetData" --menu "Select an option:" 10 58 2 \
 | 
					CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NetData" \
 | 
				
			||||||
  "${OPTIONS[@]}" 3>&1 1>&2 2>&3)
 | 
					  --menu "Select an option:" 10 58 2 "${OPTIONS[@]}" 3>&1 1>&2 2>&3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
case $CHOICE in
 | 
					case $CHOICE in
 | 
				
			||||||
"Install")
 | 
					"Install") install ;;
 | 
				
			||||||
  install
 | 
					"Uninstall") uninstall ;;
 | 
				
			||||||
  ;;
 | 
					 | 
				
			||||||
"Uninstall")
 | 
					 | 
				
			||||||
  uninstall
 | 
					 | 
				
			||||||
  ;;
 | 
					 | 
				
			||||||
*)
 | 
					*)
 | 
				
			||||||
  echo "Exiting..."
 | 
					  echo "Exiting..."
 | 
				
			||||||
  exit 0
 | 
					  exit 0
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								tools/headers/copyparty
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tools/headers/copyparty
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					   ______                  ____             __       
 | 
				
			||||||
 | 
					  / ____/___  ____  __  __/ __ \____ ______/ /___  __
 | 
				
			||||||
 | 
					 / /   / __ \/ __ \/ / / / /_/ / __ `/ ___/ __/ / / /
 | 
				
			||||||
 | 
					/ /___/ /_/ / /_/ / /_/ / ____/ /_/ / /  / /_/ /_/ / 
 | 
				
			||||||
 | 
					\____/\____/ .___/\__, /_/    \__,_/_/   \__/\__, /  
 | 
				
			||||||
 | 
					          /_/    /____/                     /____/   
 | 
				
			||||||
@@ -480,24 +480,24 @@ EOF
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # ---- PVETEST ----
 | 
					  # ---- PVETEST ----
 | 
				
			||||||
  if component_exists_in_sources "pvetest"; then
 | 
					  if component_exists_in_sources "pve-test"; then
 | 
				
			||||||
    msg_ok "'pvetest' repository already exists (skipped)"
 | 
					    msg_ok "'pve-test' repository already exists (skipped)"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVETEST" \
 | 
					    CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "PVETEST" \
 | 
				
			||||||
      --menu "The 'pvetest' repository can give advanced users access to new features and updates before they are officially released.\n\nAdd (Disabled) 'pvetest' repository (deb822)?" 14 58 2 \
 | 
					      --menu "The 'pve-test' repository can give advanced users access to new features and updates before they are officially released.\n\nAdd (Disabled) 'pvetest' repository (deb822)?" 14 58 2 \
 | 
				
			||||||
      "yes" " " \
 | 
					      "yes" " " \
 | 
				
			||||||
      "no" " " 3>&2 2>&1 1>&3)
 | 
					      "no" " " 3>&2 2>&1 1>&3)
 | 
				
			||||||
    case $CHOICE in
 | 
					    case $CHOICE in
 | 
				
			||||||
    yes)
 | 
					    yes)
 | 
				
			||||||
      msg_info "Adding 'pvetest' repository (deb822, disabled)"
 | 
					      msg_info "Adding 'pve-test' repository (deb822, disabled)"
 | 
				
			||||||
      cat >/etc/apt/sources.list.d/pvetest.sources <<EOF
 | 
					      cat >/etc/apt/sources.list.d/pve-test.sources <<EOF
 | 
				
			||||||
# Types: deb
 | 
					# Types: deb
 | 
				
			||||||
# URIs: http://download.proxmox.com/debian/pve
 | 
					# URIs: http://download.proxmox.com/debian/pve
 | 
				
			||||||
# Suites: trixie
 | 
					# Suites: trixie
 | 
				
			||||||
# Components: pvetest
 | 
					# Components: pve-test
 | 
				
			||||||
# Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
 | 
					# Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
      msg_ok "Added 'pvetest' repository"
 | 
					      msg_ok "Added 'pve-test' repository"
 | 
				
			||||||
      ;;
 | 
					      ;;
 | 
				
			||||||
    no) msg_error "Selected no to Adding 'pvetest' repository" ;;
 | 
					    no) msg_error "Selected no to Adding 'pvetest' repository" ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										577
									
								
								vm/debian-13-vm.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										577
									
								
								vm/debian-13-vm.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,577 @@
 | 
				
			|||||||
 | 
					#!/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"
 | 
				
			||||||
 | 
					    ____       __    _                ________
 | 
				
			||||||
 | 
					   / __ \___  / /_  (_)___ _____     <  /__  /
 | 
				
			||||||
 | 
					  / / / / _ \/ __ \/ / __ `/ __ \    / / /_ <
 | 
				
			||||||
 | 
					 / /_/ /  __/ /_/ / / /_/ / / / /   / /___/ /
 | 
				
			||||||
 | 
					/_____/\___/_.___/_/\__,_/_/ /_/   /_//____/
 | 
				
			||||||
 | 
					                                              (Trixie)
 | 
				
			||||||
 | 
					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="debian13vm"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="13"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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}"
 | 
				
			||||||
 | 
					CLOUD="${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"
 | 
				
			||||||
 | 
					  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
				
			||||||
 | 
					  post_update_to_api "failed" "${command}"
 | 
				
			||||||
 | 
					  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
 | 
				
			||||||
 | 
					  post_update_to_api "done" "none"
 | 
				
			||||||
 | 
					  rm -rf $TEMP_DIR
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEMP_DIR=$(mktemp -d)
 | 
				
			||||||
 | 
					pushd $TEMP_DIR >/dev/null
 | 
				
			||||||
 | 
					if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Debian 13 VM" --yesno "This will create a New Debian 13 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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 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: allow 8.0–8.9
 | 
				
			||||||
 | 
					  if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then
 | 
				
			||||||
 | 
					    local MINOR="${BASH_REMATCH[1]}"
 | 
				
			||||||
 | 
					    if ((MINOR < 0 || MINOR > 9)); then
 | 
				
			||||||
 | 
					      msg_error "This version of Proxmox VE is not supported."
 | 
				
			||||||
 | 
					      msg_error "Supported: Proxmox VE version 8.0 – 8.9"
 | 
				
			||||||
 | 
					      exit 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Check for Proxmox VE 9.x: allow ONLY 9.0
 | 
				
			||||||
 | 
					  if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then
 | 
				
			||||||
 | 
					    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."
 | 
				
			||||||
 | 
					  msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0"
 | 
				
			||||||
 | 
					  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="debian"
 | 
				
			||||||
 | 
					  CPU_TYPE=""
 | 
				
			||||||
 | 
					  CORE_COUNT="2"
 | 
				
			||||||
 | 
					  RAM_SIZE="2048"
 | 
				
			||||||
 | 
					  BRG="vmbr0"
 | 
				
			||||||
 | 
					  MAC="$GEN_MAC"
 | 
				
			||||||
 | 
					  VLAN=""
 | 
				
			||||||
 | 
					  MTU=""
 | 
				
			||||||
 | 
					  START_VM="yes"
 | 
				
			||||||
 | 
					  CLOUD_INIT="no"
 | 
				
			||||||
 | 
					  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 "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}no${CL}"
 | 
				
			||||||
 | 
					  echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
 | 
				
			||||||
 | 
					  echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 13 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 debian --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
 | 
					    if [ -z $VM_NAME ]; then
 | 
				
			||||||
 | 
					      HN="debian"
 | 
				
			||||||
 | 
					      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 "CLOUD-INIT" --yesno "Configure the VM with Cloud-init?" --defaultno 10 58); then
 | 
				
			||||||
 | 
					    echo -e "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}yes${CL}"
 | 
				
			||||||
 | 
					    CLOUD_INIT="yes"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    echo -e "${CLOUD}${BOLD}${DGN}Configure Cloud-init: ${BGN}no${CL}"
 | 
				
			||||||
 | 
					    CLOUD_INIT="no"
 | 
				
			||||||
 | 
					  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 Debian 13 VM?" --no-button Do-Over 10 58); then
 | 
				
			||||||
 | 
					    echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 13 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 Debian 13 Qcow2 Disk Image"
 | 
				
			||||||
 | 
					if [ "$CLOUD_INIT" == "yes" ]; then
 | 
				
			||||||
 | 
					  URL=https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					  URL=https://cloud.debian.org/images/cloud/trixie/latest/debian-13-nocloud-amd64.qcow2
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					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)
 | 
				
			||||||
 | 
					  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 Debian 13 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
 | 
				
			||||||
 | 
					if [ "$CLOUD_INIT" == "yes" ]; then
 | 
				
			||||||
 | 
					  qm set $VMID \
 | 
				
			||||||
 | 
					    -efidisk0 ${DISK0_REF}${FORMAT} \
 | 
				
			||||||
 | 
					    -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \
 | 
				
			||||||
 | 
					    -scsi1 ${STORAGE}:cloudinit \
 | 
				
			||||||
 | 
					    -boot order=scsi0 \
 | 
				
			||||||
 | 
					    -serial0 socket >/dev/null
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					  qm set $VMID \
 | 
				
			||||||
 | 
					    -efidisk0 ${DISK0_REF}${FORMAT} \
 | 
				
			||||||
 | 
					    -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \
 | 
				
			||||||
 | 
					    -boot order=scsi0 \
 | 
				
			||||||
 | 
					    -serial0 socket >/dev/null
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					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;'>Debian 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 Debian 13 VM ${CL}${BL}(${HN})"
 | 
				
			||||||
 | 
					if [ "$START_VM" == "yes" ]; then
 | 
				
			||||||
 | 
					  msg_info "Starting Debian 13 VM"
 | 
				
			||||||
 | 
					  qm start $VMID
 | 
				
			||||||
 | 
					  msg_ok "Started Debian 13 VM"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo "More Info at https://github.com/community-scripts/ProxmoxVE/discussions/836"
 | 
				
			||||||
		Reference in New Issue
	
	Block a user