mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 02:12:49 +00:00 
			
		
		
		
	Compare commits
	
		
			96 Commits
		
	
	
		
			2025-08-14
			...
			2025-08-19
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					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 | ||
| 
						 | 
					a72885b4c1 | ||
| 
						 | 
					58fe2df6b4 | ||
| 
						 | 
					5c8bd4b124 | ||
| 
						 | 
					b6d7ad7c38 | ||
| 
						 | 
					dd4d518052 | ||
| 
						 | 
					a99650f969 | ||
| 
						 | 
					842d73de82 | ||
| 
						 | 
					65f731d88b | ||
| 
						 | 
					363685d3d3 | ||
| 
						 | 
					ff77960aa6 | ||
| 
						 | 
					8d4a81d28e | ||
| 
						 | 
					faf10a9d5b | ||
| 
						 | 
					1b931becaa | ||
| 
						 | 
					905198116d | ||
| 
						 | 
					8d65b4624f | ||
| 
						 | 
					4e17190721 | ||
| 
						 | 
					9337e2de3c | ||
| 
						 | 
					c7a7ea763b | ||
| 
						 | 
					ce71992dd6 | ||
| 
						 | 
					f68b80fe4a | ||
| 
						 | 
					79adb4ef9b | ||
| 
						 | 
					8dda5ac31f | ||
| 
						 | 
					7d901bc594 | ||
| 
						 | 
					b6dce8cff1 | ||
| 
						 | 
					1b43202a79 | ||
| 
						 | 
					66687c0d21 | ||
| 
						 | 
					39b9cfcffc | ||
| 
						 | 
					24f4d2f488 | ||
| 
						 | 
					ee74400626 | ||
| 
						 | 
					032709e107 | ||
| 
						 | 
					65d60fbf1e | ||
| 
						 | 
					c7b80448dc | 
							
								
								
									
										103
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -10,8 +10,111 @@
 | 
			
		||||
> [!CAUTION]
 | 
			
		||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
 | 
			
		||||
 | 
			
		||||
## 2025-08-20
 | 
			
		||||
 | 
			
		||||
## 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
 | 
			
		||||
 | 
			
		||||
### 🆕 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-16
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Wireguard: Fix WGDashboard not updating [@tremor021](https://github.com/tremor021) ([#6898](https://github.com/community-scripts/ProxmoxVE/pull/6898))
 | 
			
		||||
    - Tandoor Images Fix [@WarLord185](https://github.com/WarLord185) ([#6892](https://github.com/community-scripts/ProxmoxVE/pull/6892))
 | 
			
		||||
 | 
			
		||||
  - #### 🔧 Refactor
 | 
			
		||||
 | 
			
		||||
    - Refactor: Uptime Kuma [@tremor021](https://github.com/tremor021) ([#6902](https://github.com/community-scripts/ProxmoxVE/pull/6902))
 | 
			
		||||
    - Refactor: Wallos [@tremor021](https://github.com/tremor021) ([#6900](https://github.com/community-scripts/ProxmoxVE/pull/6900))
 | 
			
		||||
 | 
			
		||||
## 2025-08-15
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Immich: pin Vectorchord release; adjust extension update commands [@vhsdream](https://github.com/vhsdream) ([#6878](https://github.com/community-scripts/ProxmoxVE/pull/6878))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - Bump Immich to v1.138.0 [@vhsdream](https://github.com/vhsdream) ([#6813](https://github.com/community-scripts/ProxmoxVE/pull/6813))
 | 
			
		||||
 | 
			
		||||
  - #### 🔧 Refactor
 | 
			
		||||
 | 
			
		||||
    - Refactor: Wavelog [@tremor021](https://github.com/tremor021) ([#6869](https://github.com/community-scripts/ProxmoxVE/pull/6869))
 | 
			
		||||
    - Refactor: WatchYourLAN [@tremor021](https://github.com/tremor021) ([#6871](https://github.com/community-scripts/ProxmoxVE/pull/6871))
 | 
			
		||||
    - Refactor: Watcharr [@tremor021](https://github.com/tremor021) ([#6872](https://github.com/community-scripts/ProxmoxVE/pull/6872))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
  - #### 📝 Script Information
 | 
			
		||||
 | 
			
		||||
    - Add missing default user & pass for RabbitMQ [@hbenyoussef](https://github.com/hbenyoussef) ([#6883](https://github.com/community-scripts/ProxmoxVE/pull/6883))
 | 
			
		||||
 | 
			
		||||
## 2025-08-14
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										75
									
								
								ct/gomft.sh
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								ct/gomft.sh
									
									
									
									
									
								
							@@ -28,83 +28,14 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  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) }')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat ~/.gomft)" ]] || [[ ! -f ~/.gomft ]]; then
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop gomft
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP to ${RELEASE}"
 | 
			
		||||
    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"
 | 
			
		||||
    fetch_and_deploy_gh_release "gomft" "StarFleetCPTN/GoMFT" "singlefile" "latest" "/opt/gomft" "gomft*linux-amd64"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start gomft
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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 @@
 | 
			
		||||
  ______         _                   __             ______                            __            
 | 
			
		||||
 /_  __/      __(_)___  ____ _____ _/ /____        / ____/___  ____  ____  ___  _____/ /_____  _____
 | 
			
		||||
  / / | | /| / / / __ \/ __ `/ __ `/ __/ _ \______/ /   / __ \/ __ \/ __ \/ _ \/ ___/ __/ __ \/ ___/
 | 
			
		||||
 / /  | |/ |/ / / / / / /_/ / /_/ / /_/  __/_____/ /___/ /_/ / / / / / / /  __/ /__/ /_/ /_/ / /    
 | 
			
		||||
/_/   |__/|__/_/_/ /_/\__, /\__,_/\__/\___/      \____/\____/_/ /_/_/ /_/\___/\___/\__/\____/_/     
 | 
			
		||||
                     /____/                                                                         
 | 
			
		||||
							
								
								
									
										11
									
								
								ct/immich.sh
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								ct/immich.sh
									
									
									
									
									
								
							@@ -52,13 +52,14 @@ function update_script() {
 | 
			
		||||
  if [[ -f ~/.immich_library_revisions ]]; then
 | 
			
		||||
    libraries=("libjxl" "libheif" "libraw" "imagemagick" "libvips")
 | 
			
		||||
    cd "$BASE_DIR"
 | 
			
		||||
    msg_info "Checking for updates to custom image-processing libraries"
 | 
			
		||||
    $STD git pull
 | 
			
		||||
    for library in "${libraries[@]}"; do
 | 
			
		||||
      compile_"$library"
 | 
			
		||||
    done
 | 
			
		||||
    msg_ok "Image-processing libraries updated"
 | 
			
		||||
    msg_ok "Image-processing libraries up to date"
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE="1.137.3"
 | 
			
		||||
  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) }')
 | 
			
		||||
  if [[ -f ~/.immich && "$RELEASE" == "$(cat ~/.immich)" ]]; then
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
@@ -74,7 +75,8 @@ function update_script() {
 | 
			
		||||
  APP_DIR="${INSTALL_DIR}/app"
 | 
			
		||||
  ML_DIR="${APP_DIR}/machine-learning"
 | 
			
		||||
  GEO_DIR="${INSTALL_DIR}/geodata"
 | 
			
		||||
  VCHORD_RELEASE="$(curl -fsSL https://api.github.com/repos/tensorchord/vectorchord/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')"
 | 
			
		||||
  VCHORD_RELEASE="0.4.3"
 | 
			
		||||
  # VCHORD_RELEASE="$(curl -fsSL https://api.github.com/repos/tensorchord/vectorchord/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')"
 | 
			
		||||
 | 
			
		||||
  if [[ ! -f ~/.vchord_version ]] || [[ "$VCHORD_RELEASE" != "$(cat ~/.vchord_version)" ]]; then
 | 
			
		||||
    msg_info "Updating VectorChord"
 | 
			
		||||
@@ -91,7 +93,8 @@ function update_script() {
 | 
			
		||||
    $STD sudo -u postgres psql -d immich -c "ALTER EXTENSION vchord UPDATE;"
 | 
			
		||||
    systemctl restart postgresql
 | 
			
		||||
    if [[ ! -f ~/.vchord_version ]] || [[ ! "$(cat ~/.vchord_version)" > "0.3.0" ]]; then
 | 
			
		||||
      $STD sudo -u postgres psql -d immich -c "REINDEX DATABASE;"
 | 
			
		||||
      $STD sudo -u postgres psql -d immich -c "REINDEX INDEX face_index;"
 | 
			
		||||
      $STD sudo -u postgres psql -d immich -c "REINDEX INDEX clip_index;"
 | 
			
		||||
    fi
 | 
			
		||||
    echo "$VCHORD_RELEASE" >~/.vchord_version
 | 
			
		||||
    rm ./vchord.deb
 | 
			
		||||
 
 | 
			
		||||
@@ -27,38 +27,50 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_info "Stopping Keycloak"
 | 
			
		||||
  systemctl stop keycloak
 | 
			
		||||
  msg_ok "Stopped Keycloak"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating packages"
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated packages"
 | 
			
		||||
 | 
			
		||||
  msg_info "Backup old Keycloak"
 | 
			
		||||
  cd /opt
 | 
			
		||||
  mv keycloak keycloak.old
 | 
			
		||||
  tar -czf keycloak_conf_backup.tar.gz keycloak.old/conf
 | 
			
		||||
  msg_ok "Backup done"
 | 
			
		||||
 | 
			
		||||
  fetch_and_deploy_gh_release "keycloak" "keycloak/keycloak" "prebuild" "latest" "/opt/keycloak" "keycloak-*.tar.gz"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
  cd /opt
 | 
			
		||||
  mv keycloak_conf_backup.tar.gz keycloak/conf
 | 
			
		||||
  cp -r keycloak.old/providers keycloak
 | 
			
		||||
  cp -r keycloak.old/themes keycloak
 | 
			
		||||
  rm -rf keycloak.old
 | 
			
		||||
  msg_ok "Updated ${APP} LXC"
 | 
			
		||||
 | 
			
		||||
  msg_info "Restarting Keycloak"
 | 
			
		||||
  systemctl restart keycloak
 | 
			
		||||
  msg_ok "Restarted Keycloak"
 | 
			
		||||
  if ! command -v jq &>/dev/null; then
 | 
			
		||||
    $STD apt-get install -y jq
 | 
			
		||||
  fi
 | 
			
		||||
  
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/keycloak/keycloak/releases/latest | jq -r '.tag_name' | sed 's/^v//')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat ~/.keycloak_app 2>/dev/null)" ]] || [[ ! -f ~/.keycloak_app ]]; then
 | 
			
		||||
    msg_info "Stopping Keycloak"
 | 
			
		||||
    systemctl stop keycloak
 | 
			
		||||
    msg_ok "Stopped Keycloak"
 | 
			
		||||
  
 | 
			
		||||
    msg_info "Updating packages"
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated packages"
 | 
			
		||||
  
 | 
			
		||||
    msg_info "Backup old Keycloak"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    mv keycloak keycloak.old
 | 
			
		||||
    msg_ok "Backup done"
 | 
			
		||||
  
 | 
			
		||||
    fetch_and_deploy_gh_release "keycloak_app" "keycloak/keycloak" "prebuild" "latest" "/opt/keycloak" "keycloak-*.tar.gz"
 | 
			
		||||
  
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    cp -a keycloak.old/conf/. keycloak/conf/
 | 
			
		||||
    cp -a keycloak.old/providers/. keycloak/providers/ 2>/dev/null || true
 | 
			
		||||
    cp -a keycloak.old/themes/. keycloak/themes/ 2>/dev/null || true
 | 
			
		||||
    msg_ok "Updated ${APP} LXC"
 | 
			
		||||
  
 | 
			
		||||
    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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Updating $APP"
 | 
			
		||||
    systemctl stop openobserve
 | 
			
		||||
    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
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
    exit
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/tdarr ]]; then
 | 
			
		||||
        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"
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/tdarr ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    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
 | 
			
		||||
@@ -41,4 +53,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8265${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8265${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,17 +27,20 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
 | 
			
		||||
  if ! dpkg -s aspnetcore-runtime-8.0 >/dev/null 2>&1; then
 | 
			
		||||
    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")
 | 
			
		||||
    $STD dpkg -i packages-microsoft-prod.deb
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get install -y aspnetcore-runtime-8.0
 | 
			
		||||
    rm packages-microsoft-prod.deb
 | 
			
		||||
  RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+')
 | 
			
		||||
  if [[ ! -f ~/.technitium || "${VERSION}" != "$(cat ~/.technitium)" ]]; then
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    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/
 | 
			
		||||
    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
 | 
			
		||||
  $STD bash <(curl -fsSL https://download.technitium.com/dns/install.sh)
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,32 +26,34 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  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) }')"
 | 
			
		||||
  VERSION="${RELEASE#tc_v}"
 | 
			
		||||
  if [[ ! -f "/opt/${APP}_version.txt" || "${VERSION}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
  if [[ ! -f ~/.teddycloud || "${RELEASE}" != "$(cat ~/.teddycloud)" ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop teddycloud
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${VERSION}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    msg_info "Creating backup"
 | 
			
		||||
    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")
 | 
			
		||||
    $STD unzip -d /opt/teddycloud teddycloud.amd64.release_v${VERSION}.zip
 | 
			
		||||
    msg_ok "Backup created"
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
    echo "${VERSION}" >"/opt/${APP}_version.txt"
 | 
			
		||||
    msg_ok "Updated ${APP} to v${VERSION}"
 | 
			
		||||
    msg_ok "Data restored"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start teddycloud
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning up"
 | 
			
		||||
    rm -rf /opt/teddycloud.amd64.release_v${VERSION}.zip
 | 
			
		||||
    rm -rf /opt/teddycloud_bak
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${VERSION}"
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,33 +27,15 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  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) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
  if [[ ! -f ~/.thelounge ]] || [[ "${RELEASE}" != "$(cat ~/.thelounge)" ]]; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    systemctl stop thelounge
 | 
			
		||||
    msg_ok "Stopped Service"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    $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}"
 | 
			
		||||
    fetch_and_deploy_gh_release "thelounge" "thelounge/thelounge-deb" "binary"
 | 
			
		||||
 | 
			
		||||
    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"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required.  ${APP} is already at v${RELEASE}."
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,42 @@ function update_script() {
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -38,4 +73,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8082${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8082${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,16 +27,20 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  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"
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; 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")
 | 
			
		||||
    tar -C /tmp -xzf traefik*.tar.gz
 | 
			
		||||
    mv /tmp/traefik /usr/bin/
 | 
			
		||||
    rm -rf traefik*.tar.gz
 | 
			
		||||
    systemctl restart traefik.service
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated $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 ~/.traefik)" ]] || [[ ! -f ~/.traefik ]]; then
 | 
			
		||||
    msg_info "Stopping service"
 | 
			
		||||
    systemctl stop traefik
 | 
			
		||||
    msg_ok "Service stopped"
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_amd64.tar.gz"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start traefik
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Successfully updated ${APP}"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  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
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "umami" "umami-software/umami" "tarball"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    cd /opt/umami
 | 
			
		||||
    git pull
 | 
			
		||||
    yarn install
 | 
			
		||||
    yarn build
 | 
			
		||||
    $STD yarn install
 | 
			
		||||
    $STD yarn run build
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
@@ -54,4 +55,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -34,27 +34,29 @@ function update_script() {
 | 
			
		||||
      echo "Installed NPM..."
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  LATEST=$(curl -fsSL https://api.github.com/repos/louislam/uptime-kuma/releases/latest | grep '"tag_name":' | cut -d'"' -f4)
 | 
			
		||||
  msg_info "Stopping ${APP}"
 | 
			
		||||
  $STD sudo systemctl stop uptime-kuma
 | 
			
		||||
  msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
  cd /opt/uptime-kuma
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/louislam/uptime-kuma/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
 | 
			
		||||
  if [[ ! -f ~/.uptime-kuma ]] || [[ "${RELEASE}" != "$(cat ~/.uptime-kuma)" ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    $STD systemctl stop uptime-kuma
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
  msg_info "Pulling ${APP} ${LATEST}"
 | 
			
		||||
  $STD git fetch --all
 | 
			
		||||
  $STD git checkout $LATEST --force
 | 
			
		||||
  msg_ok "Pulled ${APP} ${LATEST}"
 | 
			
		||||
    fetch_and_deploy_gh_release "uptime-kuma" "louislam/uptime-kuma" "tarball"
 | 
			
		||||
    cd /opt/uptime-kuma
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating ${APP} to ${LATEST}"
 | 
			
		||||
  $STD npm install --production
 | 
			
		||||
  $STD npm run download-dist
 | 
			
		||||
  msg_ok "Updated ${APP}"
 | 
			
		||||
    msg_info "Updating ${APP} to ${RELEASE}"
 | 
			
		||||
    $STD npm install --omit dev
 | 
			
		||||
    $STD npm run download-dist
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
  msg_info "Starting ${APP}"
 | 
			
		||||
  $STD sudo systemctl start uptime-kuma
 | 
			
		||||
  msg_ok "Started ${APP}"
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    $STD sudo systemctl start uptime-kuma
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								ct/wallos.sh
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								ct/wallos.sh
									
									
									
									
									
								
							@@ -27,17 +27,19 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/ellite/Wallos/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
 | 
			
		||||
    msg_info "Updating ${APP} to ${RELEASE}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    curl -fsSL "https://github.com/ellite/Wallos/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/ellite/Wallos/archive/refs/tags/v${RELEASE}.zip")
 | 
			
		||||
  if [[ ! -f ~/.wallos ]] || [[ "${RELEASE}" != "$(cat ~/.wallos)" ]]; then
 | 
			
		||||
    msg_info "Creating backup"
 | 
			
		||||
    mkdir -p /opt/logos
 | 
			
		||||
    mv /opt/wallos/db/wallos.db /opt/wallos.db
 | 
			
		||||
    mv /opt/wallos/images/uploads/logos /opt/logos/
 | 
			
		||||
    $STD unzip v${RELEASE}.zip
 | 
			
		||||
    msg_ok "Backup created"
 | 
			
		||||
 | 
			
		||||
    rm -rf /opt/wallos
 | 
			
		||||
    mv Wallos-${RELEASE} /opt/wallos
 | 
			
		||||
    fetch_and_deploy_gh_release "wallos" "ellite/Wallos" "tarball"
 | 
			
		||||
 | 
			
		||||
    msg_info "Configuring ${APP}"
 | 
			
		||||
    rm -rf /opt/wallos/db/wallos.empty.db
 | 
			
		||||
    mv /opt/wallos.db /opt/wallos/db/wallos.db
 | 
			
		||||
    mv /opt/logos/* /opt/wallos/images/uploads/logos
 | 
			
		||||
@@ -48,16 +50,12 @@ function update_script() {
 | 
			
		||||
    chmod -R 755 /opt/wallos
 | 
			
		||||
    mkdir -p /var/log/cron
 | 
			
		||||
    $STD curl http://localhost/endpoints/db/migrate.php
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
    msg_ok "Configured ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Reload Apache2"
 | 
			
		||||
    systemctl reload apache2
 | 
			
		||||
    msg_ok "Apache2 Reloaded"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -R /opt/v${RELEASE}.zip
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,22 +27,20 @@ function update_script() {
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/sbondCo/Watcharr/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 ~/.watcharr)" ]] || [[ ! -f ~/.watcharr ]]; then
 | 
			
		||||
        msg_info "Updating $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop watcharr
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        temp_file=$(mktemp)
 | 
			
		||||
        temp_folder=$(mktemp -d)
 | 
			
		||||
        curl -fsSL "https://github.com/sbondCo/Watcharr/archive/refs/tags/v${RELEASE}.tar.gz" -o ""$temp_file""
 | 
			
		||||
        tar -xzf "$temp_file" -C "$temp_folder"
 | 
			
		||||
        rm -f /opt/watcharr/server/watcharr
 | 
			
		||||
        rm -rf /opt/watcharr/server/ui
 | 
			
		||||
        cp -rf ${temp_folder}/Watcharr-${RELEASE}/* /opt/watcharr
 | 
			
		||||
        fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        cd /opt/watcharr
 | 
			
		||||
        export GOOS=linux
 | 
			
		||||
        $STD npm i
 | 
			
		||||
@@ -57,12 +55,6 @@ function update_script() {
 | 
			
		||||
        systemctl start watcharr
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -f ${temp_file}
 | 
			
		||||
        rm -rf ${temp_folder}
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,17 +27,28 @@ function update_script() {
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP"
 | 
			
		||||
    systemctl stop watchyourlan.service
 | 
			
		||||
    cp -R /data/config.yaml config.yaml
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/aceberg/WatchYourLAN/releases/latest | grep -o '"tag_name": *"[^"]*"' | cut -d '"' -f 4)
 | 
			
		||||
    curl -fsSL "https://github.com/aceberg/WatchYourLAN/releases/download/$RELEASE/watchyourlan_${RELEASE}_linux_amd64.deb" -o $(basename "https://github.com/aceberg/WatchYourLAN/releases/download/$RELEASE/watchyourlan_${RELEASE}_linux_amd64.deb")
 | 
			
		||||
    dpkg -i watchyourlan_${RELEASE}_linux_amd64.deb
 | 
			
		||||
    cp -R config.yaml /data/config.yaml
 | 
			
		||||
    sed -i 's|/etc/watchyourlan/config.yaml|/data/config.yaml|' /lib/systemd/system/watchyourlan.service
 | 
			
		||||
    rm watchyourlan_${RELEASE}_linux_amd64.deb config.yaml
 | 
			
		||||
    systemctl enable -q --now watchyourlan
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/aceberg/WatchYourLAN/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
    if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
      msg_info "Stopping service"
 | 
			
		||||
      systemctl stop watchyourlan.service
 | 
			
		||||
      msg_ok "Service stopped"
 | 
			
		||||
 | 
			
		||||
      cp -R /data/config.yaml ~/config.yaml
 | 
			
		||||
      fetch_and_deploy_gh_release "watchyourlan" "aceberg/WatchYourLAN" "binary"
 | 
			
		||||
      cp -R config.yaml /data/config.yaml
 | 
			
		||||
      sed -i 's|/etc/watchyourlan/config.yaml|/data/config.yaml|' /lib/systemd/system/watchyourlan.service
 | 
			
		||||
      
 | 
			
		||||
      msg_info "Cleaning up"
 | 
			
		||||
      rm ~/config.yaml
 | 
			
		||||
      msg_ok "Cleaned up"
 | 
			
		||||
 | 
			
		||||
      msg_info "Starting service"
 | 
			
		||||
      systemctl enable -q --now watchyourlan
 | 
			
		||||
      msg_ok "Service started"
 | 
			
		||||
    else
 | 
			
		||||
      msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,23 +27,26 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/wavelog/wavelog/releases/latest | grep "tag_name" | cut -d '"' -f 4)
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/wavelog/wavelog/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
 | 
			
		||||
  if [[ ! -f ~/.wavelog ]] || [[ "${RELEASE}" != "$(cat ~/.wavelog)" ]]; then
 | 
			
		||||
    msg_info "Stopping Services"
 | 
			
		||||
    systemctl stop apache2
 | 
			
		||||
    msg_ok "Services Stopped"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to ${RELEASE}"
 | 
			
		||||
    msg_info "Creating backup"
 | 
			
		||||
    cp /opt/wavelog/application/config/config.php /opt/config.php
 | 
			
		||||
    cp /opt/wavelog/application/config/database.php /opt/database.php
 | 
			
		||||
    cp -r /opt/wavelog/userdata /opt/userdata
 | 
			
		||||
    if [[ -f /opt/wavelog/assets/js/sections/custom.js ]]; then
 | 
			
		||||
      cp /opt/wavelog/assets/js/sections/custom.js /opt/custom.js
 | 
			
		||||
    fi
 | 
			
		||||
    curl -fsSL "https://github.com/wavelog/wavelog/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/wavelog/wavelog/archive/refs/tags/${RELEASE}.zip")
 | 
			
		||||
    $STD unzip ${RELEASE}.zip
 | 
			
		||||
    msg_ok "Backup created"
 | 
			
		||||
 | 
			
		||||
    rm -rf /opt/wavelog
 | 
			
		||||
    mv wavelog-${RELEASE}/ /opt/wavelog
 | 
			
		||||
    fetch_and_deploy_gh_release "wavelog" "wavelog/wavelog" "tarball"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to ${RELEASE}"
 | 
			
		||||
    rm -rf /opt/wavelog/install
 | 
			
		||||
    mv /opt/config.php /opt/wavelog/application/config/config.php
 | 
			
		||||
    mv /opt/database.php /opt/wavelog/application/config/database.php
 | 
			
		||||
@@ -55,16 +58,12 @@ function update_script() {
 | 
			
		||||
    chown -R www-data:www-data /opt/wavelog/
 | 
			
		||||
    find /opt/wavelog/ -type d -exec chmod 755 {} \;
 | 
			
		||||
    find /opt/wavelog/ -type f -exec chmod 664 {} \;
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Services"
 | 
			
		||||
    systemctl start apache2
 | 
			
		||||
    msg_ok "Started Services"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf ${RELEASE}.zip
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ function update_script() {
 | 
			
		||||
  fi
 | 
			
		||||
  apt-get update
 | 
			
		||||
  apt-get -y upgrade
 | 
			
		||||
  if [[ ! -d /etc/wgdashboard ]]; then
 | 
			
		||||
  if [[ -d /etc/wgdashboard ]]; then
 | 
			
		||||
    sleep 2
 | 
			
		||||
    cd /etc/wgdashboard/src
 | 
			
		||||
    ./wgd.sh update
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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",
 | 
			
		||||
  "type": "addon",
 | 
			
		||||
  "updateable": false,
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 61208,
 | 
			
		||||
  "documentation": "https://glances.readthedocs.io/en/latest/",
 | 
			
		||||
@@ -33,12 +33,8 @@
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "Execute within an existing LXC Console",
 | 
			
		||||
      "type": "warning"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
 | 
			
		||||
      "type": "warning"
 | 
			
		||||
      "text": "Execute within an existing LXC Console (Debian / Ubuntu / Alpine supported)",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 5080,
 | 
			
		||||
  "documentation": null,
 | 
			
		||||
  "documentation": "https://openobserve.ai/docs/",
 | 
			
		||||
  "website": "https://openobserve.ai/",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/openobserve.webp",
 | 
			
		||||
  "config_path": "/opt/openobserve/data/.env",
 | 
			
		||||
 
 | 
			
		||||
@@ -32,5 +32,10 @@
 | 
			
		||||
    "username": 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"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
    "username": "proxmox",
 | 
			
		||||
    "password": "proxmox"
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,8 @@
 | 
			
		||||
  "interface_port": 3000,
 | 
			
		||||
  "documentation": "https://docs.rxresume.org/",
 | 
			
		||||
  "website": "https://rxresume.org",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/reactive-resume-light.png",
 | 
			
		||||
    "config_path": "/opt/reactive-resume/.env",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/reactive-resume.webp",
 | 
			
		||||
  "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.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
@@ -33,4 +33,3 @@
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,8 @@
 | 
			
		||||
  "interface_port": 5030,
 | 
			
		||||
  "documentation": "https://github.com/slskd/slskd/tree/master/docs",
 | 
			
		||||
  "website": "https://github.com/slskd/slskd",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/png/slskd.png",
 | 
			
		||||
    "config_path": "/opt/slskd/config/slskd.yml",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/slskd.webp",
 | 
			
		||||
  "config_path": "/opt/slskd/config/slskd.yml",
 | 
			
		||||
  "description": "A modern client-server application for the Soulseek file sharing network. ",
 | 
			
		||||
  "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",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": false,
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 8265,
 | 
			
		||||
  "documentation": null,
 | 
			
		||||
 
 | 
			
		||||
@@ -31,10 +31,5 @@
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "WARNING: Installation sources scripts outside of Community Scripts repo. Please check the source before installing.",
 | 
			
		||||
      "type": "warning"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
  "notes": []
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,10 +6,10 @@
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2024-05-02",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": false,
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 8082,
 | 
			
		||||
  "documentation": null,
 | 
			
		||||
  "documentation": "https://www.traccar.org/documentation/",
 | 
			
		||||
  "website": "https://www.traccar.org/",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/traccar.webp",
 | 
			
		||||
  "config_path": "/opt/traccar/conf/traccar.xml",
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 8080,
 | 
			
		||||
  "documentation": null,
 | 
			
		||||
  "documentation": "https://doc.traefik.io/",
 | 
			
		||||
  "website": "https://traefik.io/",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/traefik.webp",
 | 
			
		||||
  "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",
 | 
			
		||||
    "slug": "umami",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        9
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2024-05-09",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": false,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 3000,
 | 
			
		||||
    "documentation": null,
 | 
			
		||||
    "website": "https://umami.is/",
 | 
			
		||||
    "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/umami.webp",
 | 
			
		||||
    "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.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/umami.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 2,
 | 
			
		||||
                "ram": 2048,
 | 
			
		||||
                "hdd": 12,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": "admin",
 | 
			
		||||
        "password": "umami"
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
            "text": "To view the database credentials : `cat umami.creds`",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
  "name": "Umami",
 | 
			
		||||
  "slug": "umami",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    9
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2024-05-09",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 3000,
 | 
			
		||||
  "documentation": "https://umami.is/docs",
 | 
			
		||||
  "website": "https://umami.is/",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/umami.webp",
 | 
			
		||||
  "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.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/umami.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 12,
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": "admin",
 | 
			
		||||
    "password": "umami"
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "To view the database credentials : `cat umami.creds`",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,35 +1,35 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Uptime Kuma",
 | 
			
		||||
    "slug": "uptimekuma",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        9
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2024-05-02",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 3001,
 | 
			
		||||
    "documentation": null,
 | 
			
		||||
    "website": "https://github.com/louislam/uptime-kuma#uptime-kuma",
 | 
			
		||||
    "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/uptime-kuma.webp",
 | 
			
		||||
    "config_path": "",
 | 
			
		||||
    "description": "Uptime Kuma is a monitoring and alerting system that tracks the availability and performance of servers, websites, and other internet-connected devices. It can be self-hosted and is open-source, offering a visually appealing interface for monitoring and receiving notifications about downtime events.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/uptimekuma.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 1024,
 | 
			
		||||
                "hdd": 4,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
  "name": "Uptime Kuma",
 | 
			
		||||
  "slug": "uptimekuma",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    9
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2024-05-02",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 3001,
 | 
			
		||||
  "documentation": "https://github.com/louislam/uptime-kuma/wiki",
 | 
			
		||||
  "website": "https://github.com/louislam/uptime-kuma#uptime-kuma",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/uptime-kuma.webp",
 | 
			
		||||
  "config_path": "",
 | 
			
		||||
  "description": "Uptime Kuma is a monitoring and alerting system that tracks the availability and performance of servers, websites, and other internet-connected devices. It can be self-hosted and is open-source, offering a visually appealing interface for monitoring and receiving notifications about downtime events.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/uptimekuma.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 1024,
 | 
			
		||||
        "hdd": 4,
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -12,7 +12,7 @@
 | 
			
		||||
  "documentation": "https://github.com/wavelog/wavelog/wiki",
 | 
			
		||||
  "website": "https://www.wavelog.org/",
 | 
			
		||||
  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/wavelog.webp",
 | 
			
		||||
  "config_path": "",
 | 
			
		||||
  "config_path": "/opt/wavelog/application/config/config.php",
 | 
			
		||||
  "description": "Wavelog is a self-hosted PHP application that allows you to log your amateur radio contacts anywhere. All you need is a web browser and active internet connection.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,64 +18,13 @@ $STD apt-get install -y \
 | 
			
		||||
  sqlite3 \
 | 
			
		||||
  rclone \
 | 
			
		||||
  tzdata \
 | 
			
		||||
  ca-certificates \
 | 
			
		||||
  build-essential \
 | 
			
		||||
  git
 | 
			
		||||
  ca-certificates
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
setup_go
 | 
			
		||||
NODE_VERSION="22" setup_nodejs
 | 
			
		||||
fetch_and_deploy_gh_release "gomft" "StarFleetCPTN/GoMFT" "singlefile" "latest" "/opt/gomft" "gomft*linux-amd64"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup ${APPLICATION} (Patience)"
 | 
			
		||||
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
 | 
			
		||||
msg_info "Configuring ${APPLICATION}"
 | 
			
		||||
JWT_SECRET_KEY=$(openssl rand -base64 24 | tr -d '/+=')
 | 
			
		||||
 | 
			
		||||
cat <<EOF >/opt/gomft/.env
 | 
			
		||||
SERVER_ADDRESS=:8080
 | 
			
		||||
DATA_DIR=/opt/gomft/data/gomft
 | 
			
		||||
@@ -95,9 +44,7 @@ EMAIL_REQUIRE_AUTH=true
 | 
			
		||||
EMAIL_USERNAME=smtp_username
 | 
			
		||||
EMAIL_PASSWORD=smtp_password
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
 | 
			
		||||
msg_ok "Setup ${APPLICATION}"
 | 
			
		||||
msg_ok "Configured ${APPLICATION}"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/gomft.service
 | 
			
		||||
@@ -108,8 +55,9 @@ After=network.target
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=root
 | 
			
		||||
EnvironmentFile=/opt/gomft/.env
 | 
			
		||||
WorkingDirectory=/opt/gomft
 | 
			
		||||
ExecStart=/opt/gomft/./gomft
 | 
			
		||||
ExecStart=/opt/gomft/gomft
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
@@ -122,7 +70,6 @@ motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ curl -L -o "${APPLICATION}" "https://github.com/heiher/${APPLICATION}/releases/d
 | 
			
		||||
mv ${APPLICATION} /opt/${APPLICATION}
 | 
			
		||||
chmod +x /opt/${APPLICATION}
 | 
			
		||||
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
 | 
			
		||||
mkdir -p /etc/${APPLICATION}
 | 
			
		||||
USERNAME="admin"
 | 
			
		||||
 
 | 
			
		||||
@@ -115,7 +115,8 @@ NODE_VERSION="22" setup_nodejs
 | 
			
		||||
PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Postgresql Database"
 | 
			
		||||
VCHORD_RELEASE="$(curl -fsSL https://api.github.com/repos/tensorchord/vectorchord/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')"
 | 
			
		||||
VCHORD_RELEASE="0.4.3"
 | 
			
		||||
# VCHORD_RELEASE="$(curl -fsSL https://api.github.com/repos/tensorchord/vectorchord/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')"
 | 
			
		||||
curl -fsSL "https://github.com/tensorchord/VectorChord/releases/download/${VCHORD_RELEASE}/postgresql-16-vchord_${VCHORD_RELEASE}-1_amd64.deb" -o vchord.deb
 | 
			
		||||
$STD apt install -y ./vchord.deb
 | 
			
		||||
rm vchord.deb
 | 
			
		||||
@@ -282,7 +283,7 @@ GEO_DIR="${INSTALL_DIR}/geodata"
 | 
			
		||||
mkdir -p "$INSTALL_DIR"
 | 
			
		||||
mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${ML_DIR}","${INSTALL_DIR}"/cache}
 | 
			
		||||
 | 
			
		||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.137.3" "$SRC_DIR"
 | 
			
		||||
fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v1.138.1" "$SRC_DIR"
 | 
			
		||||
 | 
			
		||||
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;"
 | 
			
		||||
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"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/keycloak.service
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
@@ -73,7 +73,7 @@ POSTGRES_USER=$DB_USER
 | 
			
		||||
POSTGRES_PASSWORD=$DB_PASS
 | 
			
		||||
 | 
			
		||||
STATIC_URL=/staticfiles/
 | 
			
		||||
MEDIA_URL=/mediafiles/
 | 
			
		||||
MEDIA_URL=/media/
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
TANDOOR_VERSION="$(curl -s https://api.github.com/repos/TandoorRecipes/recipes/releases/latest | jq -r .tag_name)"
 | 
			
		||||
@@ -125,7 +125,7 @@ server {
 | 
			
		||||
        proxy_set_header Host $http_host;
 | 
			
		||||
        proxy_set_header X-Real-IP $remote_addr;
 | 
			
		||||
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
			
		||||
        proxy_set_header X-Forwarded-Proto $scheme;
 | 
			
		||||
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
 | 
			
		||||
        proxy_pass http://unix:/opt/tandoor/tandoor.sock;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,16 @@ msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y handbrake-cli
 | 
			
		||||
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"
 | 
			
		||||
$STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
 | 
			
		||||
if [[ "$CTTYPE" == "0" ]]; then
 | 
			
		||||
@@ -25,29 +35,14 @@ if [[ "$CTTYPE" == "0" ]]; then
 | 
			
		||||
  chmod 660 /dev/dri/*
 | 
			
		||||
  $STD adduser $(id -u -n) video
 | 
			
		||||
  $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
 | 
			
		||||
else
 | 
			
		||||
  sed -i -e 's/^sgx:x:104:$/render:x:104:/' -e 's/^render:x:106:$/sgx:x:106:/' /etc/group
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "Set Up Hardware Acceleration"
 | 
			
		||||
 | 
			
		||||
msg_ok "Installed Tdarr"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
service_path="/etc/systemd/system/tdarr-server.service"
 | 
			
		||||
echo "[Unit]
 | 
			
		||||
cat <<EOF >/etc/systemd/system/tdarr-server.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Tdarr Server Daemon
 | 
			
		||||
After=network.target
 | 
			
		||||
# Enable if using ZFS, edit and enable if other FS mounting is required to access directory
 | 
			
		||||
@@ -56,20 +51,20 @@ After=network.target
 | 
			
		||||
[Service]
 | 
			
		||||
User=root
 | 
			
		||||
Group=root
 | 
			
		||||
 | 
			
		||||
Type=simple
 | 
			
		||||
WorkingDirectory=/opt/tdarr/Tdarr_Server
 | 
			
		||||
ExecStartPre=/opt/tdarr/Tdarr_Updater                  
 | 
			
		||||
ExecStartPre=/opt/tdarr/Tdarr_Updater
 | 
			
		||||
ExecStart=/opt/tdarr/Tdarr_Server/Tdarr_Server
 | 
			
		||||
TimeoutStopSec=20
 | 
			
		||||
KillMode=process
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target" >$service_path
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
service_path="/etc/systemd/system/tdarr-node.service"
 | 
			
		||||
echo "[Unit]
 | 
			
		||||
cat <<EOF >/etc/systemd/system/tdarr-node.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Tdarr Node Daemon
 | 
			
		||||
After=network.target
 | 
			
		||||
Requires=tdarr-server.service
 | 
			
		||||
@@ -77,7 +72,6 @@ Requires=tdarr-server.service
 | 
			
		||||
[Service]
 | 
			
		||||
User=root
 | 
			
		||||
Group=root
 | 
			
		||||
 | 
			
		||||
Type=simple
 | 
			
		||||
WorkingDirectory=/opt/tdarr/Tdarr_Node
 | 
			
		||||
ExecStart=/opt/tdarr/Tdarr_Node/Tdarr_Node
 | 
			
		||||
@@ -86,16 +80,16 @@ KillMode=process
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target" >$service_path
 | 
			
		||||
systemctl enable --now -q tdarr-server.service
 | 
			
		||||
systemctl enable --now -q tdarr-node.service
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable --now -q tdarr-server tdarr-node
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
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 autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -21,14 +21,24 @@ $STD apt-get update
 | 
			
		||||
$STD apt-get install -y aspnetcore-runtime-8.0
 | 
			
		||||
msg_ok "Installed ASP.NET Core Runtime"
 | 
			
		||||
 | 
			
		||||
RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+')
 | 
			
		||||
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_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
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f /opt/DnsServerPortable.tar.gz
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,15 +20,7 @@ $STD apt-get install -y \
 | 
			
		||||
  ca-certificates
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing TeddyCloud"
 | 
			
		||||
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"
 | 
			
		||||
fetch_and_deploy_gh_release "teddycloud" "toniebox-reverse-engineering/teddycloud" "prebuild" "latest" "/opt/teddycloud" "teddycloud.amd64.release*.zip"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/teddycloud.service
 | 
			
		||||
@@ -53,7 +45,6 @@ motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get --yes autoremove
 | 
			
		||||
$STD apt-get --yes autoclean
 | 
			
		||||
rm -rf "teddycloud.amd64.release_v${VERSION}.zip"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -13,26 +13,12 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$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"
 | 
			
		||||
fetch_and_deploy_gh_release "thelounge" "thelounge/thelounge-deb" "binary"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf /opt/thelounge_${RELEASE}_all.deb
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -13,19 +13,22 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
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) }')
 | 
			
		||||
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"
 | 
			
		||||
$STD unzip traccar-linux-64-${RELEASE}.zip
 | 
			
		||||
fetch_and_deploy_gh_release "traccar" "traccar/traccar" "prebuild" "latest" "/opt/traccar" "traccar-linux-64*.zip"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Traccar"
 | 
			
		||||
cd /opt/traccar
 | 
			
		||||
$STD ./traccar.run
 | 
			
		||||
msg_ok "Configured Traccar"
 | 
			
		||||
 | 
			
		||||
msg_info "Starting service"
 | 
			
		||||
systemctl enable -q --now traccar
 | 
			
		||||
rm -rf README.txt traccar-linux-64-${RELEASE}.zip traccar.run
 | 
			
		||||
msg_ok "Installed Traccar v${RELEASE}"
 | 
			
		||||
msg_ok "Service started"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
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 autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -17,15 +17,8 @@ msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y apt-transport-https
 | 
			
		||||
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)
 | 
			
		||||
msg_info "Installing Traefik v${RELEASE}"
 | 
			
		||||
fetch_and_deploy_gh_release "traefik" "traefik/traefik" "prebuild" "latest" "/usr/bin" "traefik_v*_linux_amd64.tar.gz"
 | 
			
		||||
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"
 | 
			
		||||
cat <<EOF >/etc/traefik/traefik.yaml
 | 
			
		||||
@@ -84,7 +77,7 @@ EOF
 | 
			
		||||
msg_ok "Created Traefik configuration"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/traefik.service
 | 
			
		||||
cat <<'EOF' >/etc/systemd/system/traefik.service
 | 
			
		||||
[Unit]
 | 
			
		||||
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]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
systemctl enable -q --now traefik
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
PG_VERSION="16" setup_postgresql
 | 
			
		||||
fetch_and_deploy_gh_release "umami" "umami-software/umami" "tarball"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up postgresql"
 | 
			
		||||
DB_NAME=umamidb
 | 
			
		||||
@@ -39,17 +36,16 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'"
 | 
			
		||||
} >>~/umami.creds
 | 
			
		||||
msg_ok "Set up postgresql"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Umami (Patience)"
 | 
			
		||||
git clone -q https://github.com/umami-software/umami.git /opt/umami
 | 
			
		||||
msg_info "Configuring Umami"
 | 
			
		||||
cd /opt/umami
 | 
			
		||||
$STD yarn install
 | 
			
		||||
echo -e "DATABASE_URL=postgresql://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME" >>/opt/umami/.env
 | 
			
		||||
$STD yarn run build
 | 
			
		||||
msg_ok "Installed Umami"
 | 
			
		||||
msg_ok "Configured Umami"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/umami.service
 | 
			
		||||
echo "[Unit]
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=umami
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
 
 | 
			
		||||
@@ -13,22 +13,18 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y git
 | 
			
		||||
$STD apt-get install -y ca-certificates
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
NODE_VERSION="22" setup_nodejs
 | 
			
		||||
fetch_and_deploy_gh_release "uptime-kuma" "louislam/uptime-kuma" "tarball"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Uptime Kuma"
 | 
			
		||||
$STD git clone https://github.com/louislam/uptime-kuma.git
 | 
			
		||||
cd /opt/uptime-kuma
 | 
			
		||||
$STD npm run setup
 | 
			
		||||
$STD npm ci --omit dev
 | 
			
		||||
$STD npm run download-dist
 | 
			
		||||
msg_ok "Installed Uptime Kuma"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
service_path="/etc/systemd/system/uptime-kuma.service"
 | 
			
		||||
echo "[Unit]
 | 
			
		||||
cat <<EOF >/etc/systemd/system/uptime-kuma.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=uptime-kuma
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
@@ -39,8 +35,9 @@ WorkingDirectory=/opt/uptime-kuma
 | 
			
		||||
ExecStart=/usr/bin/npm start
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target" >$service_path
 | 
			
		||||
$STD systemctl enable --now uptime-kuma
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now uptime-kuma
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
 
 | 
			
		||||
@@ -14,25 +14,14 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  apache2 \
 | 
			
		||||
  libapache2-mod-php \
 | 
			
		||||
  php8.2-{mbstring,gd,curl,intl,imagick,bz2,sqlite3,zip,xml}
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
PHP_VERSION="8.4" PHP_APACHE="YES" PHP_MODULE="imagick,bz2,sqlite3" setup_php
 | 
			
		||||
fetch_and_deploy_gh_release "wallos" "ellite/Wallos" "tarball"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Wallos (Patience)"
 | 
			
		||||
cd /opt
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/ellite/Wallos/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
curl -fsSL "https://github.com/ellite/Wallos/archive/refs/tags/v${RELEASE}.zip" -o "v${RELEASE}.zip"
 | 
			
		||||
$STD unzip v${RELEASE}.zip
 | 
			
		||||
mv Wallos-${RELEASE} /opt/wallos
 | 
			
		||||
cd /opt/wallos
 | 
			
		||||
mv /opt/wallos/db/wallos.empty.db /opt/wallos/db/wallos.db
 | 
			
		||||
chown -R www-data:www-data /opt/wallos
 | 
			
		||||
chmod -R 755 /opt/wallos
 | 
			
		||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
 | 
			
		||||
 | 
			
		||||
cat <<EOF >/etc/apache2/sites-available/wallos.conf
 | 
			
		||||
<VirtualHost *:80>
 | 
			
		||||
    ServerAdmin webmaster@localhost
 | 
			
		||||
@@ -73,7 +62,6 @@ motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf /opt/v${RELEASE}.zip
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -14,19 +14,14 @@ network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  gcc
 | 
			
		||||
$STD apt-get install -y gcc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
setup_go
 | 
			
		||||
NODE_VERSION="22" setup_nodejs
 | 
			
		||||
fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Watcharr"
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/sbondCo/Watcharr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
curl -fsSL "https://github.com/sbondCo/Watcharr/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
			
		||||
tar -xzf "$temp_file"
 | 
			
		||||
mv Watcharr-${RELEASE}/ /opt/watcharr
 | 
			
		||||
cd /opt/watcharr
 | 
			
		||||
$STD npm i
 | 
			
		||||
$STD npm run build
 | 
			
		||||
@@ -35,14 +30,6 @@ cd server
 | 
			
		||||
export CGO_ENABLED=1 GOOS=linux
 | 
			
		||||
go mod download
 | 
			
		||||
go build -o ./watcharr
 | 
			
		||||
cat <<EOF >/opt/start.sh
 | 
			
		||||
#! /bin/bash
 | 
			
		||||
source ~/.bashrc
 | 
			
		||||
cd /opt/watcharr/server
 | 
			
		||||
./watcharr
 | 
			
		||||
EOF
 | 
			
		||||
chmod +x /opt/start.sh
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Setup Watcharr"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
@@ -53,7 +40,7 @@ After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
WorkingDirectory=/opt/watcharr/server
 | 
			
		||||
ExecStart=/opt/start.sh
 | 
			
		||||
ExecStart=/opt/watcharr/server/watcharr
 | 
			
		||||
Restart=always
 | 
			
		||||
User=root
 | 
			
		||||
 | 
			
		||||
@@ -67,7 +54,6 @@ motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -14,14 +14,15 @@ network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y {arp-scan,ieee-data,libwww-perl}
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  arp-scan \
 | 
			
		||||
  ieee-data \
 | 
			
		||||
  libwww-perl
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing WatchYourLAN"
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/aceberg/WatchYourLAN/releases/latest | grep -o '"tag_name": *"[^"]*"' | cut -d '"' -f 4)
 | 
			
		||||
curl -fsSL "https://github.com/aceberg/WatchYourLAN/releases/download/$RELEASE/watchyourlan_${RELEASE}_linux_amd64.deb" -o "watchyourlan_${RELEASE}_linux_amd64.deb"
 | 
			
		||||
$STD dpkg -i watchyourlan_${RELEASE}_linux_amd64.deb
 | 
			
		||||
rm watchyourlan_${RELEASE}_linux_amd64.deb
 | 
			
		||||
fetch_and_deploy_gh_release "watchyourlan" "aceberg/WatchYourLAN" "binary"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring WatchYourLAN"
 | 
			
		||||
mkdir /data
 | 
			
		||||
cat <<EOF >/data/config.yaml
 | 
			
		||||
arp_timeout: "500"
 | 
			
		||||
@@ -41,7 +42,7 @@ shoutrrr_url: ""
 | 
			
		||||
theme: solar
 | 
			
		||||
timeout: 60
 | 
			
		||||
EOF
 | 
			
		||||
msg_ok "Installed WatchYourLAN"
 | 
			
		||||
msg_ok "Configured WatchYourLAN"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
sed -i 's|/etc/watchyourlan/config.yaml|/data/config.yaml|' /lib/systemd/system/watchyourlan.service
 | 
			
		||||
 
 | 
			
		||||
@@ -13,13 +13,9 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  libapache2-mod-php \
 | 
			
		||||
  php8.2-{curl,mbstring,mysql,xml,zip,gd}
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
PHP_VERSION="8.3" PHP_MODULE="mysql" PHP_APACHE="YES" PHP_MAX_EXECUTION_TIME="600" setup_php
 | 
			
		||||
setup_mariadb
 | 
			
		||||
fetch_and_deploy_gh_release "wavelog" "wavelog/wavelog" "tarball"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Database"
 | 
			
		||||
DB_NAME=wavelog
 | 
			
		||||
@@ -36,22 +32,11 @@ $STD mariadb -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUS
 | 
			
		||||
} >>~/wavelog.creds
 | 
			
		||||
msg_ok "Set up database"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PHP"
 | 
			
		||||
sed -i '/max_execution_time/s/= .*/= 600/' /etc/php/8.2/apache2/php.ini
 | 
			
		||||
sed -i '/memory_limit/s/= .*/= 256M/' /etc/php/8.2/apache2/php.ini
 | 
			
		||||
sed -i '/upload_max_filesize/s/= .*/= 8M/' /etc/php/8.2/apache2/php.ini
 | 
			
		||||
msg_ok "Set up PHP"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Wavelog"
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/wavelog/wavelog/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
curl -fsSL "https://github.com/wavelog/wavelog/archive/refs/tags/${RELEASE}.zip" -o "${RELEASE}.zip"
 | 
			
		||||
$STD unzip ${RELEASE}.zip
 | 
			
		||||
mv wavelog-${RELEASE}/ /opt/wavelog
 | 
			
		||||
msg_info "Configuring Wavelog"
 | 
			
		||||
chown -R www-data:www-data /opt/wavelog/
 | 
			
		||||
find /opt/wavelog/ -type d -exec chmod 755 {} \;
 | 
			
		||||
find /opt/wavelog/ -type f -exec chmod 664 {} \;
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Installed Wavelog"
 | 
			
		||||
msg_ok "Configured Wavelog"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/apache2/sites-available/wavelog.conf
 | 
			
		||||
@@ -78,7 +63,6 @@ motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f ${RELEASE}.zip
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -110,7 +110,7 @@ NoNewPrivileges=true
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now zitadel
 | 
			
		||||
systemctl enable -q zitadel
 | 
			
		||||
msg_ok "Created Services"
 | 
			
		||||
 | 
			
		||||
msg_info "Zitadel initial setup"
 | 
			
		||||
 
 | 
			
		||||
@@ -61,11 +61,11 @@ function exit_script() {
 | 
			
		||||
function check_storage_support() {
 | 
			
		||||
  local CONTENT="$1"
 | 
			
		||||
  local -a VALID_STORAGES=()
 | 
			
		||||
 | 
			
		||||
  while IFS= read -r line; do
 | 
			
		||||
    local STORAGE=$(awk '{print $1}' <<<"$line")
 | 
			
		||||
    [[ "$STORAGE" == "storage" || -z "$STORAGE" ]] && continue
 | 
			
		||||
    VALID_STORAGES+=("$STORAGE")
 | 
			
		||||
    local STORAGE_NAME
 | 
			
		||||
    STORAGE_NAME=$(awk '{print $1}' <<<"$line")
 | 
			
		||||
    [[ -z "$STORAGE_NAME" ]] && continue
 | 
			
		||||
    VALID_STORAGES+=("$STORAGE_NAME")
 | 
			
		||||
  done < <(pvesm status -content "$CONTENT" 2>/dev/null | awk 'NR>1')
 | 
			
		||||
 | 
			
		||||
  [[ ${#VALID_STORAGES[@]} -gt 0 ]]
 | 
			
		||||
@@ -124,11 +124,12 @@ function select_storage() {
 | 
			
		||||
 | 
			
		||||
  while read -r TAG TYPE _ TOTAL USED FREE _; do
 | 
			
		||||
    [[ -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 FREE_FMT=$(numfmt --to=iec --from-unit=K --format %.1f <<<"$FREE")
 | 
			
		||||
    local INFO="Free: ${FREE_FMT}B  Used: ${USED_FMT}B"
 | 
			
		||||
    STORAGE_MAP["$DISPLAY"]="$TAG"
 | 
			
		||||
    STORAGE_MAP["$DISPLAY"]="$STORAGE_NAME"
 | 
			
		||||
    MENU+=("$DISPLAY" "$INFO" "OFF")
 | 
			
		||||
    ((${#DISPLAY} > COL_WIDTH)) && COL_WIDTH=${#DISPLAY}
 | 
			
		||||
  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
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
  msg_error "No valid storage found for 'rootdir' (Container)."
 | 
			
		||||
  msg_error "No valid storage found for 'rootdir' [Container]"
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
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
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "Valid Storage Found"
 | 
			
		||||
 | 
			
		||||
msg_info "Checking template storage"
 | 
			
		||||
while true; do
 | 
			
		||||
  if select_storage template; then
 | 
			
		||||
    TEMPLATE_STORAGE="$STORAGE_RESULT"
 | 
			
		||||
    TEMPLATE_STORAGE_INFO="$STORAGE_INFO"
 | 
			
		||||
    msg_ok "Storage ${BL}$TEMPLATE_STORAGE${CL} ($TEMPLATE_STORAGE_INFO) [Template]"
 | 
			
		||||
    break
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
@@ -222,10 +224,10 @@ while true; do
 | 
			
		||||
  if select_storage container; then
 | 
			
		||||
    CONTAINER_STORAGE="$STORAGE_RESULT"
 | 
			
		||||
    CONTAINER_STORAGE_INFO="$STORAGE_INFO"
 | 
			
		||||
    msg_ok "Storage ${BL}$CONTAINER_STORAGE${CL} ($CONTAINER_STORAGE_INFO) [Container]"
 | 
			
		||||
    break
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
msg_ok "Validated Storage | Container: ${BL}$CONTAINER_STORAGE${CL} ($CONTAINER_STORAGE_INFO)"
 | 
			
		||||
 | 
			
		||||
# Check free space on selected container storage
 | 
			
		||||
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."
 | 
			
		||||
  exit 214
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Check Cluster Quorum if in Cluster
 | 
			
		||||
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
 | 
			
		||||
    printf "\e[?25h"
 | 
			
		||||
 | 
			
		||||
    msg_error "Cluster is not quorate. Start all nodes or configure quorum device (QDevice)."
 | 
			
		||||
    exit 210
 | 
			
		||||
  fi
 | 
			
		||||
@@ -247,42 +250,56 @@ fi
 | 
			
		||||
 | 
			
		||||
# Update LXC template list
 | 
			
		||||
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"
 | 
			
		||||
if ! pveam update >/dev/null 2>&1; then
 | 
			
		||||
  TEMPLATE_FALLBACK=$(pveam list "$TEMPLATE_STORAGE" | awk "/$TEMPLATE_SEARCH/ {print \$2}" | sort -t - -k 2 -V | tail -n1)
 | 
			
		||||
  if [[ -z "$TEMPLATE_FALLBACK" ]]; then
 | 
			
		||||
    msg_error "Failed to update LXC template list and no local template matching '$TEMPLATE_SEARCH' found."
 | 
			
		||||
    exit 201
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Skipping template update – using local fallback: $TEMPLATE_FALLBACK"
 | 
			
		||||
# 1. Check local templates first
 | 
			
		||||
msg_info "Searching for template '$TEMPLATE_SEARCH'"
 | 
			
		||||
mapfile -t TEMPLATES < <(
 | 
			
		||||
  pveam list "$TEMPLATE_STORAGE" |
 | 
			
		||||
    awk -v s="$TEMPLATE_SEARCH" -v p="$TEMPLATE_PATTERN" '$1 ~ s && $1 ~ p {print $1}' |
 | 
			
		||||
    sed 's/.*\///' | sort -t - -k 2 -V
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if [ ${#TEMPLATES[@]} -gt 0 ]; then
 | 
			
		||||
  TEMPLATE_SOURCE="local"
 | 
			
		||||
else
 | 
			
		||||
  msg_ok "LXC Template List Updated"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Get LXC template string
 | 
			
		||||
TEMPLATE_SEARCH="${PCT_OSTYPE}-${PCT_OSVERSION:-}"
 | 
			
		||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\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."
 | 
			
		||||
  exit 207
 | 
			
		||||
  msg_info "No local template found, checking online repository"
 | 
			
		||||
  pveam update >/dev/null 2>&1
 | 
			
		||||
  mapfile -t TEMPLATES < <(
 | 
			
		||||
    pveam update >/dev/null 2>&1 &&
 | 
			
		||||
      pveam available -section system |
 | 
			
		||||
      sed -n "s/.*\($TEMPLATE_SEARCH.*$TEMPLATE_PATTERN.*\)/\1/p" |
 | 
			
		||||
      sort -t - -k 2 -V
 | 
			
		||||
  )
 | 
			
		||||
  TEMPLATE_SOURCE="online"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
 | 
			
		||||
  TEMPLATE_VALID=0
 | 
			
		||||
elif [ ! -s "$TEMPLATE_PATH" ]; then
 | 
			
		||||
 | 
			
		||||
if [ ! -s "$TEMPLATE_PATH" ]; then
 | 
			
		||||
  TEMPLATE_VALID=0
 | 
			
		||||
elif ! tar --use-compress-program=zstdcat -tf "$TEMPLATE_PATH" >/dev/null 2>&1; then
 | 
			
		||||
  TEMPLATE_VALID=0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
  for attempt in {1..3}; do
 | 
			
		||||
    msg_info "Attempt $attempt: Downloading LXC template..."
 | 
			
		||||
@@ -298,8 +315,6 @@ if [ "$TEMPLATE_VALID" -eq 0 ]; then
 | 
			
		||||
  done
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
msg_ok "LXC Template '$TEMPLATE' is ready to use."
 | 
			
		||||
 | 
			
		||||
msg_info "Creating LXC Container"
 | 
			
		||||
# Check and fix subuid/subgid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid
 | 
			
		||||
 
 | 
			
		||||
@@ -1256,8 +1256,20 @@ function setup_uv() {
 | 
			
		||||
  local UV_TAR
 | 
			
		||||
 | 
			
		||||
  case "$ARCH" in
 | 
			
		||||
  x86_64) UV_TAR="uv-x86_64-unknown-linux-gnu.tar.gz" ;;
 | 
			
		||||
  aarch64) UV_TAR="uv-aarch64-unknown-linux-gnu.tar.gz" ;;
 | 
			
		||||
  x86_64)
 | 
			
		||||
    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"
 | 
			
		||||
    rm -rf "$TMP_DIR"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 tteck
 | 
			
		||||
# Author: tteck (tteckster)
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Author: tteck (tteckster) | MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
@@ -16,65 +15,55 @@ function header_info {
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
IP=$(hostname -I | awk '{print $1}')
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
RD=$(echo "\033[01;31m")
 | 
			
		||||
BGN=$(echo "\033[4;92m")
 | 
			
		||||
GN=$(echo "\033[1;92m")
 | 
			
		||||
DGN=$(echo "\033[32m")
 | 
			
		||||
CL=$(echo "\033[m")
 | 
			
		||||
BFR="\\r\\033[K"
 | 
			
		||||
HOLD=" "
 | 
			
		||||
CM="${GN}✓${CL}"
 | 
			
		||||
 | 
			
		||||
APP="Glances"
 | 
			
		||||
hostname="$(hostname)"
 | 
			
		||||
silent() { "$@" >/dev/null 2>&1; }
 | 
			
		||||
set -e
 | 
			
		||||
spinner() {
 | 
			
		||||
  local chars="/-\|"
 | 
			
		||||
  local spin_i=0
 | 
			
		||||
  printf "\e[?25l"
 | 
			
		||||
  while true; do
 | 
			
		||||
    printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}"
 | 
			
		||||
    sleep 0.1
 | 
			
		||||
  done
 | 
			
		||||
}
 | 
			
		||||
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}"
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne " ${HOLD} ${YW}${msg}   "
 | 
			
		||||
  spinner &
 | 
			
		||||
  SPINNER_PID=$!
 | 
			
		||||
}
 | 
			
		||||
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}"; }
 | 
			
		||||
 | 
			
		||||
msg_ok() {
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
 | 
			
		||||
  printf "\e[?25h"
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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=""
 | 
			
		||||
get_local_ip() {
 | 
			
		||||
  if command -v hostname >/dev/null 2>&1 && hostname -I 2>/dev/null; then
 | 
			
		||||
    hostname -I | awk '{print $1}'
 | 
			
		||||
  elif command -v ip >/dev/null 2>&1; then
 | 
			
		||||
    ip -4 addr show scope global | awk '/inet / {print $2}' | cut -d/ -f1 | head -n1
 | 
			
		||||
  else
 | 
			
		||||
    STD="silent"
 | 
			
		||||
    echo "127.0.0.1"
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Installing $APP"
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  $STD bash -c "$(curl -fsSL https://raw.githubusercontent.com/nicolargo/glancesautoinstall/master/install.sh)"
 | 
			
		||||
}
 | 
			
		||||
IP=$(get_local_ip)
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Glances - An eye on your system
 | 
			
		||||
@@ -82,44 +71,132 @@ After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=/usr/local/bin/glances -w
 | 
			
		||||
ExecStart=/opt/glances/.venv/bin/glances -w
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
WorkingDirectory=/opt/glances
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
  systemctl enable -q --now glances.service
 | 
			
		||||
  msg_ok "Installed $APP on $hostname"
 | 
			
		||||
  systemctl enable -q --now glances
 | 
			
		||||
  msg_ok "Created systemd service"
 | 
			
		||||
 | 
			
		||||
  echo -e "${APP} should be reachable by going to the following URL.
 | 
			
		||||
           ${BL}http://$IP:61208${CL} \n"
 | 
			
		||||
  echo -e "\n$APP is now running at: http://$IP:61208\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"
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
 | 
			
		||||
  systemctl disable -q --now glances
 | 
			
		||||
  bash -c "$(curl -fsSL https://raw.githubusercontent.com/nicolargo/glancesautoinstall/master/uninstall.sh)"
 | 
			
		||||
  rm -rf /etc/systemd/system/glances.service
 | 
			
		||||
  msg_ok "Uninstalled $APP"
 | 
			
		||||
  msg_ok "Completed Successfully!\n"
 | 
			
		||||
  systemctl disable -q --now glances || true
 | 
			
		||||
  rm -f /etc/systemd/system/glances.service
 | 
			
		||||
  rm -rf /opt/glances
 | 
			
		||||
  msg_ok "Removed $APP"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 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"
 | 
			
		||||
  Update "Update $APP"
 | 
			
		||||
  Uninstall "Uninstall $APP")
 | 
			
		||||
 | 
			
		||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$APP" --menu "Select an option:" 10 58 2 \
 | 
			
		||||
  "${OPTIONS[@]}" 3>&1 1>&2 2>&3)
 | 
			
		||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "$APP" --menu "Select an option:" 12 58 3 \
 | 
			
		||||
  "${OPTIONS[@]}" 3>&1 1>&2 2>&3 || true)
 | 
			
		||||
 | 
			
		||||
case $CHOICE in
 | 
			
		||||
"Install")
 | 
			
		||||
  install
 | 
			
		||||
  ;;
 | 
			
		||||
"Uninstall")
 | 
			
		||||
  uninstall
 | 
			
		||||
  ;;
 | 
			
		||||
*)
 | 
			
		||||
  echo "Exiting..."
 | 
			
		||||
  exit 0
 | 
			
		||||
  ;;
 | 
			
		||||
esac
 | 
			
		||||
# OS detection
 | 
			
		||||
if grep -qi "alpine" /etc/os-release; then
 | 
			
		||||
  case "$CHOICE" in
 | 
			
		||||
  Install) install_glances_alpine ;;
 | 
			
		||||
  Update) update_glances_alpine ;;
 | 
			
		||||
  Uninstall) uninstall_glances_alpine ;;
 | 
			
		||||
  *) exit 0 ;;
 | 
			
		||||
  esac
 | 
			
		||||
else
 | 
			
		||||
  case "$CHOICE" in
 | 
			
		||||
  Install) install_glances_debian ;;
 | 
			
		||||
  Update) update_glances_debian ;;
 | 
			
		||||
  Uninstall) uninstall_glances_debian ;;
 | 
			
		||||
  *) exit 0 ;;
 | 
			
		||||
  esac
 | 
			
		||||
fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								tools/headers/copyparty
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tools/headers/copyparty
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
   ______                  ____             __       
 | 
			
		||||
  / ____/___  ____  __  __/ __ \____ ______/ /___  __
 | 
			
		||||
 / /   / __ \/ __ \/ / / / /_/ / __ `/ ___/ __/ / / /
 | 
			
		||||
/ /___/ /_/ / /_/ / /_/ / ____/ /_/ / /  / /_/ /_/ / 
 | 
			
		||||
\____/\____/ .___/\__, /_/    \__,_/_/   \__/\__, /  
 | 
			
		||||
          /_/    /____/                     /____/   
 | 
			
		||||
							
								
								
									
										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