mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	Compare commits
	
		
			28 Commits
		
	
	
		
			2025-03-29
			...
			2025-03-31
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					79c53f72c5 | ||
| 
						 | 
					7c83fcecab | ||
| 
						 | 
					d266e6a99c | ||
| 
						 | 
					213107e1a1 | ||
| 
						 | 
					dff0c3b713 | ||
| 
						 | 
					59ebbd37fa | ||
| 
						 | 
					e6208a4ac6 | ||
| 
						 | 
					6adb811adf | ||
| 
						 | 
					b8c5691803 | ||
| 
						 | 
					0f5c9dfe42 | ||
| 
						 | 
					65adb8e445 | ||
| 
						 | 
					1df0496083 | ||
| 
						 | 
					781a383a9b | ||
| 
						 | 
					27ece60f74 | ||
| 
						 | 
					ca5de7a6ff | ||
| 
						 | 
					04f781c512 | ||
| 
						 | 
					a95403ece7 | ||
| 
						 | 
					e7529a9c25 | ||
| 
						 | 
					3abb4b0060 | ||
| 
						 | 
					e35416eb7f | ||
| 
						 | 
					47aa3c3cf2 | ||
| 
						 | 
					8a07f18678 | ||
| 
						 | 
					67395df39e | ||
| 
						 | 
					8605995aff | ||
| 
						 | 
					6fd77dcd9f | ||
| 
						 | 
					92c6662abf | ||
| 
						 | 
					453210900d | ||
| 
						 | 
					df41b8e707 | 
							
								
								
									
										54
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -14,6 +14,60 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
 | 
			
		||||
All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 2025-03-31
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
  - slskd [@vhsdream](https://github.com/vhsdream) ([#3516](https://github.com/community-scripts/ProxmoxVE/pull/3516))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - The Lounge: Fix sqlite3 failing to build [@tremor021](https://github.com/tremor021) ([#3542](https://github.com/community-scripts/ProxmoxVE/pull/3542))
 | 
			
		||||
    - 2FAuth: Update PHP to 8.3 [@BrockHumblet](https://github.com/BrockHumblet) ([#3510](https://github.com/community-scripts/ProxmoxVE/pull/3510))
 | 
			
		||||
    - GoMFT: Update Curl Path [@MickLesk](https://github.com/MickLesk) ([#3537](https://github.com/community-scripts/ProxmoxVE/pull/3537))
 | 
			
		||||
    - slskd: fix broken curl for soularr [@MickLesk](https://github.com/MickLesk) ([#3533](https://github.com/community-scripts/ProxmoxVE/pull/3533))
 | 
			
		||||
    - Docmost: Bump NodeJS to 22 & fixed pnpm [@MickLesk](https://github.com/MickLesk) ([#3521](https://github.com/community-scripts/ProxmoxVE/pull/3521))
 | 
			
		||||
    - Tianji: Bump NodeJS to V22 [@MickLesk](https://github.com/MickLesk) ([#3519](https://github.com/community-scripts/ProxmoxVE/pull/3519))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - NPMPlus: update function & better create handling (user/password) [@MickLesk](https://github.com/MickLesk) ([#3520](https://github.com/community-scripts/ProxmoxVE/pull/3520))
 | 
			
		||||
 | 
			
		||||
  - #### 🔧 Refactor
 | 
			
		||||
 | 
			
		||||
    - Remove old `.jar` versions of Stirling-PDF [@JcMinarro](https://github.com/JcMinarro) ([#3512](https://github.com/community-scripts/ProxmoxVE/pull/3512))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
  - #### 💾 Core
 | 
			
		||||
 | 
			
		||||
    - core: fix empty header if header in repo exist [@MickLesk](https://github.com/MickLesk) ([#3536](https://github.com/community-scripts/ProxmoxVE/pull/3536))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - Change Frontend Version Info [@MickLesk](https://github.com/MickLesk) ([#3527](https://github.com/community-scripts/ProxmoxVE/pull/3527))
 | 
			
		||||
 | 
			
		||||
  - #### 📝 Script Information
 | 
			
		||||
 | 
			
		||||
    - HomeAssistant (Container): Better Portainer explanation [@MickLesk](https://github.com/MickLesk) ([#3518](https://github.com/community-scripts/ProxmoxVE/pull/3518))
 | 
			
		||||
 | 
			
		||||
## 2025-03-30
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Open WebUI: Fix Ollama update logic [@tremor021](https://github.com/tremor021) ([#3506](https://github.com/community-scripts/ProxmoxVE/pull/3506))
 | 
			
		||||
    - GoMFT: Add frontend build procedure [@tremor021](https://github.com/tremor021) ([#3499](https://github.com/community-scripts/ProxmoxVE/pull/3499))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - Open WebUI: Add Ollama update check [@tremor021](https://github.com/tremor021) ([#3478](https://github.com/community-scripts/ProxmoxVE/pull/3478))
 | 
			
		||||
 | 
			
		||||
## 2025-03-29
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								ct/2fauth.sh
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								ct/2fauth.sh
									
									
									
									
									
								
							@@ -41,8 +41,23 @@ function update_script() {
 | 
			
		||||
        # Creating Backup
 | 
			
		||||
        msg_info "Creating Backup"
 | 
			
		||||
        mv "/opt/2fauth" "/opt/2fauth-backup"
 | 
			
		||||
        if ! dpkg -l | grep -q 'php8.3'; then
 | 
			
		||||
            cp /etc/nginx/conf.d/2fauth.conf /etc/nginx/conf.d/2fauth.conf.bak
 | 
			
		||||
        fi
 | 
			
		||||
        msg_ok "Backup Created"
 | 
			
		||||
 | 
			
		||||
        # Upgrade PHP
 | 
			
		||||
        if ! dpkg -l | grep -q 'php8.3'; then
 | 
			
		||||
            $STD apt-get install -y \
 | 
			
		||||
                lsb-release \
 | 
			
		||||
                gpg
 | 
			
		||||
            curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/deb.sury.org-php.gpg
 | 
			
		||||
            echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
 | 
			
		||||
            $STD apt-get update
 | 
			
		||||
            $STD apt-get install -y php8.3-{bcmath,common,ctype,curl,fileinfo,fpm,gd,mbstring,mysql,xml,cli,intl}
 | 
			
		||||
            sed -i 's/php8.2/php8.3/g' /etc/nginx/conf.d/2fauth.conf
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        # Execute Update
 | 
			
		||||
        wget -q "https://github.com/Bubka/2FAuth/archive/refs/tags/${RELEASE}.zip"
 | 
			
		||||
        unzip -q "${RELEASE}.zip"
 | 
			
		||||
@@ -59,9 +74,14 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
        php artisan 2fauth:install
 | 
			
		||||
 | 
			
		||||
        $STD systemctl restart nginx
 | 
			
		||||
 | 
			
		||||
        # Cleaning up
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf "v${RELEASE}.zip"
 | 
			
		||||
        if dpkg -l | grep -q 'php8.2'; then
 | 
			
		||||
            $STD apt-get remove --purge -y php8.2*
 | 
			
		||||
        fi
 | 
			
		||||
        $STD apt-get -y autoremove
 | 
			
		||||
        $STD apt-get -y autoclean
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,23 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if command -v node >/dev/null; then
 | 
			
		||||
    NODE_MAJOR=$(/usr/bin/env node -v | grep -oP '^v\K[0-9]+')
 | 
			
		||||
    if [[ "$NODE_MAJOR" != "22" ]]; then
 | 
			
		||||
      $STD apt-get purge -y nodejs
 | 
			
		||||
      rm -f /etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
      rm -f /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
    else
 | 
			
		||||
      return
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  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
 | 
			
		||||
  $STD npm install -g pnpm@10.4.0
 | 
			
		||||
  export NODE_OPTIONS="--max_old_space_size=4096"
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/docmost/docmost/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 "Stopping ${APP}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								ct/gomft.sh
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								ct/gomft.sh
									
									
									
									
									
								
							@@ -32,7 +32,13 @@ function update_script() {
 | 
			
		||||
  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
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop gomft
 | 
			
		||||
@@ -41,12 +47,15 @@ function update_script() {
 | 
			
		||||
    msg_info "Updating $APP to ${RELEASE}"
 | 
			
		||||
    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
 | 
			
		||||
    curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o $temp_file
 | 
			
		||||
    tar -xzf $temp_file
 | 
			
		||||
    cp -rf GoMFT-v.${RELEASE}/* /opt/gomft
 | 
			
		||||
    cp -rf GoMFT-${RELEASE}/* /opt/gomft
 | 
			
		||||
    cd /opt/gomft
 | 
			
		||||
    rm -f /opt/gomft/node_modules
 | 
			
		||||
    $STD npm ci
 | 
			
		||||
    $STD node build.js
 | 
			
		||||
    $STD go mod download
 | 
			
		||||
    $STD go install github.com/a-h/templ/cmd/templ@latest
 | 
			
		||||
    $STD go get -u github.com/a-h/templ
 | 
			
		||||
    $STD $HOME/go/bin/templ generate
 | 
			
		||||
    export CGO_ENABLED=1
 | 
			
		||||
    export GOOS=linux
 | 
			
		||||
@@ -57,7 +66,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -f $temp_file
 | 
			
		||||
    rm -rf GoMFT-${RELEASE}
 | 
			
		||||
    rm -rf $HOME/GoMFT-v.${RELEASE}
 | 
			
		||||
    msg_ok "Cleanup Complete"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/slskd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/slskd
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
         __     __       __
 | 
			
		||||
   _____/ /____/ /______/ /
 | 
			
		||||
  / ___/ / ___/ //_/ __  / 
 | 
			
		||||
 (__  ) (__  ) ,< / /_/ /  
 | 
			
		||||
/____/_/____/_/|_|\__,_/   
 | 
			
		||||
                           
 | 
			
		||||
@@ -20,17 +20,35 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
 | 
			
		||||
        "1" "Check for Alpine Updates" ON \
 | 
			
		||||
    UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE MODE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 14 60 2 \
 | 
			
		||||
        "1" "Check for Alpine Updates" OFF \
 | 
			
		||||
        "2" "Update NPMplus Docker Container" ON \
 | 
			
		||||
        3>&1 1>&2 2>&3)
 | 
			
		||||
 | 
			
		||||
    header_info
 | 
			
		||||
    if [ "$UPD" == "1" ]; then
 | 
			
		||||
        apk update && apk upgrade
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    header_info "$APP"
 | 
			
		||||
 | 
			
		||||
    case "$UPD" in
 | 
			
		||||
        "1")
 | 
			
		||||
            msg_info "Updating Alpine OS"
 | 
			
		||||
            apk update && apk upgrade
 | 
			
		||||
            msg_ok "System updated"
 | 
			
		||||
            exit
 | 
			
		||||
            ;;
 | 
			
		||||
        "2")
 | 
			
		||||
            msg_info "Updating NPMplus Container"
 | 
			
		||||
            cd /opt || exit 1
 | 
			
		||||
            msg_info "Pulling latest container image"
 | 
			
		||||
            $STD docker compose pull
 | 
			
		||||
            msg_info "Recreating container"
 | 
			
		||||
            $STD docker compose up -d
 | 
			
		||||
            msg_ok "NPMplus container updated"
 | 
			
		||||
            exit
 | 
			
		||||
            ;;
 | 
			
		||||
    esac
 | 
			
		||||
    exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,21 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ -x "/usr/bin/ollama" ]; then
 | 
			
		||||
    msg_info "Updating Ollama"
 | 
			
		||||
    OLLAMA_VERSION=$(ollama -v | awk '{print $NF}')
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/ollama/ollama/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
 | 
			
		||||
    if [ "$OLLAMA_VERSION" != "$RELEASE" ]; then
 | 
			
		||||
      curl -fsSLO https://ollama.com/download/ollama-linux-amd64.tgz
 | 
			
		||||
      tar -C /usr -xzf ollama-linux-amd64.tgz
 | 
			
		||||
      rm -rf ollama-linux-amd64.tgz
 | 
			
		||||
      msg_ok "Ollama updated to version $RELEASE"
 | 
			
		||||
    else
 | 
			
		||||
      msg_ok "Ollama is already up to date."
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating ${APP} (Patience)"
 | 
			
		||||
  cd /opt/open-webui
 | 
			
		||||
  mkdir -p /opt/open-webui-backup
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										80
									
								
								ct/slskd.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								ct/slskd.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: vhsdream
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/slskd/slskd, https://soularr.net
 | 
			
		||||
 | 
			
		||||
APP="slskd"
 | 
			
		||||
var_tags="${var_tags:-arr;p2p}"
 | 
			
		||||
var_cpu="${var_cpu:-1}"
 | 
			
		||||
var_ram="${var_ram:-512}"
 | 
			
		||||
var_disk="${var_disk:-4}"
 | 
			
		||||
var_os="${var_os:-debian}"
 | 
			
		||||
var_version="${var_version:-12}"
 | 
			
		||||
var_unprivileged="${var_unprivileged:-1}"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
 | 
			
		||||
  if [[ ! -d /opt/slskd ]] || [[ ! -d /opt/soularr ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/slskd/slskd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
    msg_info "Stopping $APP and Soularr"
 | 
			
		||||
    systemctl stop slskd soularr.timer soularr.service
 | 
			
		||||
    msg_ok "Stopped $APP and Soularr"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
    tmp_file=$(mktemp)
 | 
			
		||||
    curl -fsSL "https://github.com/slskd/slskd/releases/download/${RELEASE}/slskd-${RELEASE}-linux-x64.zip" -o $tmp_file
 | 
			
		||||
    unzip -q -oj $tmp_file slskd -d /opt/${APP}
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating Soularr"
 | 
			
		||||
    cp /opt/soularr/config.ini /opt/config.ini.bak
 | 
			
		||||
    cp /opt/soularr/run.sh /opt/run.sh.bak
 | 
			
		||||
    cd /tmp
 | 
			
		||||
    rm -rf /opt/soularr
 | 
			
		||||
    curl -fsSL https://github.com/mrusse/soularr/archive/refs/heads/main.zip
 | 
			
		||||
    unzip -q main.zip
 | 
			
		||||
    mv soularr-main /opt/soularr
 | 
			
		||||
    cd /opt/soularr
 | 
			
		||||
    $STD pip install -r requirements.txt
 | 
			
		||||
    mv /opt/config.ini.bak /opt/soularr/config.ini
 | 
			
		||||
    mv /opt/run.sh.bak /opt/soularr/run.sh
 | 
			
		||||
    msg_ok "Soularr updated"
 | 
			
		||||
    msg_info "Starting $APP and Soularr"
 | 
			
		||||
    systemctl start slskd soularr.timer
 | 
			
		||||
    msg_ok "Started $APP and Soularr"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf $tmp_file
 | 
			
		||||
    rm -rf /tmp/main.zip
 | 
			
		||||
    msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5030${CL}"
 | 
			
		||||
@@ -39,6 +39,7 @@ function update_script() {
 | 
			
		||||
  cd Stirling-PDF-$RELEASE
 | 
			
		||||
  chmod +x ./gradlew
 | 
			
		||||
  $STD ./gradlew build
 | 
			
		||||
  rm -rf /opt/Stirling-PDF/Stirling-PDF-*.jar
 | 
			
		||||
  cp -r ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/
 | 
			
		||||
  cp -r scripts /opt/Stirling-PDF/
 | 
			
		||||
  cd ~
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,13 @@ 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 -s 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
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
@@ -61,4 +68,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}:9000${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9000${CL}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								ct/tianji.sh
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								ct/tianji.sh
									
									
									
									
									
								
							@@ -26,6 +26,22 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
    if command -v node >/dev/null; then
 | 
			
		||||
    NODE_MAJOR=$(/usr/bin/env node -v | grep -oP '^v\K[0-9]+')
 | 
			
		||||
    if [[ "$NODE_MAJOR" != "22" ]]; then
 | 
			
		||||
      $STD apt-get purge -y nodejs
 | 
			
		||||
      rm -f /etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
      rm -f /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
    else
 | 
			
		||||
      return
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  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
 | 
			
		||||
  $STD npm install -g pnpm@9.7.1
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/msgbyte/tianji/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 "Stopping ${APP} Service"
 | 
			
		||||
 
 | 
			
		||||
@@ -37,10 +37,10 @@
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "text": "config path: `/var/lib/docker/volumes/hass_config/_data`",
 | 
			
		||||
            "type": "warning"
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "text": "Portainer Interface: LXC-IP: 9443",
 | 
			
		||||
            "text": "Portainer interface: $IP: 9443 - User & password must be set manually within 5 minutes, otherwise a restart of Portainer is required!",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
@@ -48,4 +48,4 @@
 | 
			
		||||
            "type": "warning"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								frontend/public/json/slskd.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								frontend/public/json/slskd.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "slskd",
 | 
			
		||||
  "slug": "slskd",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    11
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-03-31",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "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",
 | 
			
		||||
  "description": "A modern client-server application for the Soulseek file sharing network. ",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/slskd.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 512,
 | 
			
		||||
        "hdd": 4,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": "slskd",
 | 
			
		||||
    "password": "slskd"
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "See /opt/slskd/config/sksld.yml to add your Soulseek credentials",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "text": "This LXC includes Soularr; it needs to be configured (/opt/soularr/config.ini) before it will work",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,29 +1,159 @@
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "name": "fhem/fhem-mirror",
 | 
			
		||||
    "version": "6.2",
 | 
			
		||||
    "date": "2025-03-31T10:34:25Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Checkmk/checkmk",
 | 
			
		||||
    "version": "v2.3.0p30-rc1",
 | 
			
		||||
    "date": "2025-03-31T09:39:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "semaphoreui/semaphore",
 | 
			
		||||
    "version": "v2.13.5",
 | 
			
		||||
    "date": "2025-03-31T09:36:04Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "documenso/documenso",
 | 
			
		||||
    "version": "v1.10.0-rc.4",
 | 
			
		||||
    "date": "2025-03-31T09:02:22Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "traefik/traefik",
 | 
			
		||||
    "version": "v3.3.5",
 | 
			
		||||
    "date": "2025-03-31T08:55:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "fallenbagel/jellyseerr",
 | 
			
		||||
    "version": "preview-fix-remove-button",
 | 
			
		||||
    "date": "2025-03-31T08:41:27Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "home-assistant/core",
 | 
			
		||||
    "version": "2025.3.4",
 | 
			
		||||
    "date": "2025-03-21T20:22:46Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "firefly-iii/firefly-iii",
 | 
			
		||||
    "version": "v6.2.10",
 | 
			
		||||
    "date": "2025-03-22T13:02:26Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Jackett/Jackett",
 | 
			
		||||
    "version": "v0.22.1712",
 | 
			
		||||
    "date": "2025-03-31T05:57:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "TriliumNext/Notes",
 | 
			
		||||
    "version": "v0.92.5",
 | 
			
		||||
    "date": "2025-03-30T12:32:43Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "icereed/paperless-gpt",
 | 
			
		||||
    "version": "v0.14.2",
 | 
			
		||||
    "date": "2025-03-30T19:50:38Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "StarFleetCPTN/GoMFT",
 | 
			
		||||
    "version": "v0.2.4",
 | 
			
		||||
    "date": "2025-03-30T19:46:08Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "louislam/dockge",
 | 
			
		||||
    "version": "1.5.0",
 | 
			
		||||
    "date": "2025-03-30T17:42:59Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pi-hole/pi-hole",
 | 
			
		||||
    "version": "v6.0.6",
 | 
			
		||||
    "date": "2025-03-30T16:59:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "sabnzbd/sabnzbd",
 | 
			
		||||
    "version": "4.5.0",
 | 
			
		||||
    "date": "2025-03-30T16:17:11Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Part-DB/Part-DB-server",
 | 
			
		||||
    "version": "v1.17.0",
 | 
			
		||||
    "date": "2025-03-30T14:21:53Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "openhab/openhab-core",
 | 
			
		||||
    "version": "4.3.4",
 | 
			
		||||
    "date": "2025-03-30T13:32:38Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pocketbase/pocketbase",
 | 
			
		||||
    "version": "v0.26.6",
 | 
			
		||||
    "date": "2025-03-30T08:02:19Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Prowlarr/Prowlarr",
 | 
			
		||||
    "version": "v1.32.2.4987",
 | 
			
		||||
    "date": "2025-03-16T09:41:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Readarr/Readarr",
 | 
			
		||||
    "version": "v2.0.0.4645",
 | 
			
		||||
    "date": "2017-03-07T18:56:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Lidarr/Lidarr",
 | 
			
		||||
    "version": "v2.10.3.4602",
 | 
			
		||||
    "date": "2025-03-23T11:00:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Radarr/Radarr",
 | 
			
		||||
    "version": "v5.21.1.9799",
 | 
			
		||||
    "date": "2025-03-24T15:52:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "aceberg/WatchYourLAN",
 | 
			
		||||
    "version": "2.1.2-alpine",
 | 
			
		||||
    "date": "2025-03-30T06:25:22Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pocket-id/pocket-id",
 | 
			
		||||
    "version": "v0.45.0",
 | 
			
		||||
    "date": "2025-03-29T23:12:22Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "keycloak/keycloak",
 | 
			
		||||
    "version": "26.1.4",
 | 
			
		||||
    "date": "2025-03-13T15:41:42Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "glanceapp/glance",
 | 
			
		||||
    "version": "v0.7.9",
 | 
			
		||||
    "date": "2025-03-29T18:08:11Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "theonedev/onedev",
 | 
			
		||||
    "version": "v11.8.4",
 | 
			
		||||
    "date": "2025-03-29T08:28:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "runtipi/runtipi",
 | 
			
		||||
    "version": "v3.10.0",
 | 
			
		||||
    "date": "2025-03-15T14:38:16Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "syncthing/syncthing",
 | 
			
		||||
    "version": "v2.0.0-beta.1",
 | 
			
		||||
    "date": "2025-03-29T12:53:28Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "tobychui/zoraxy",
 | 
			
		||||
    "version": "v3.1.9",
 | 
			
		||||
    "date": "2025-03-01T02:24:33Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Jackett/Jackett",
 | 
			
		||||
    "version": "v0.22.1705",
 | 
			
		||||
    "date": "2025-03-29T05:54:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "inspircd/inspircd",
 | 
			
		||||
    "version": "v4.7.0",
 | 
			
		||||
    "date": "2025-03-29T03:50:50Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "fhem/fhem-mirror",
 | 
			
		||||
    "version": "6.2",
 | 
			
		||||
    "date": "2025-03-29T01:59:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "bunkerity/bunkerweb",
 | 
			
		||||
    "version": "v1.6.1",
 | 
			
		||||
@@ -49,11 +179,6 @@
 | 
			
		||||
    "version": "v4.2.3",
 | 
			
		||||
    "date": "2025-02-09T23:07:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "home-assistant/core",
 | 
			
		||||
    "version": "2025.3.4",
 | 
			
		||||
    "date": "2025-03-21T20:22:46Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "gristlabs/grist-core",
 | 
			
		||||
    "version": "v1.5.0",
 | 
			
		||||
@@ -69,16 +194,6 @@
 | 
			
		||||
    "version": "v5.6.1",
 | 
			
		||||
    "date": "2025-03-28T18:40:22Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "keycloak/keycloak",
 | 
			
		||||
    "version": "26.1.4",
 | 
			
		||||
    "date": "2025-03-13T15:41:42Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pocketbase/pocketbase",
 | 
			
		||||
    "version": "v0.26.5",
 | 
			
		||||
    "date": "2025-03-28T17:41:23Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "NodeBB/NodeBB",
 | 
			
		||||
    "version": "v4.2.0",
 | 
			
		||||
@@ -104,6 +219,11 @@
 | 
			
		||||
    "version": "version/2025.2.3",
 | 
			
		||||
    "date": "2025-03-28T14:28:34Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "mattermost/mattermost",
 | 
			
		||||
    "version": "server/public/v0.1.11",
 | 
			
		||||
    "date": "2025-03-28T14:04:31Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "hakimel/reveal.js",
 | 
			
		||||
    "version": "5.2.1",
 | 
			
		||||
@@ -124,16 +244,6 @@
 | 
			
		||||
    "version": "v1.1.1",
 | 
			
		||||
    "date": "2025-03-28T04:12:31Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "documenso/documenso",
 | 
			
		||||
    "version": "v1.10.0-rc.3",
 | 
			
		||||
    "date": "2025-03-28T03:45:54Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "StarFleetCPTN/GoMFT",
 | 
			
		||||
    "version": "v.0.2.3",
 | 
			
		||||
    "date": "2025-03-27T23:54:49Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Bubka/2FAuth",
 | 
			
		||||
    "version": "v5.5.0",
 | 
			
		||||
@@ -149,21 +259,16 @@
 | 
			
		||||
    "version": "2025.2",
 | 
			
		||||
    "date": "2025-03-27T19:21:13Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "TriliumNext/Notes",
 | 
			
		||||
    "version": "v0.92.4",
 | 
			
		||||
    "date": "2025-03-17T16:00:19Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "fallenbagel/jellyseerr",
 | 
			
		||||
    "version": "preview-music-support",
 | 
			
		||||
    "date": "2025-03-27T16:54:41Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "immich-app/immich",
 | 
			
		||||
    "version": "v1.130.3",
 | 
			
		||||
    "date": "2025-03-27T16:38:04Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "TandoorRecipes/recipes",
 | 
			
		||||
    "version": "1.5.34",
 | 
			
		||||
    "date": "2025-03-27T16:17:38Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zwave-js/zwave-js-ui",
 | 
			
		||||
    "version": "v10.1.3",
 | 
			
		||||
@@ -189,11 +294,6 @@
 | 
			
		||||
    "version": "7.2.5",
 | 
			
		||||
    "date": "2025-03-27T11:06:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "syncthing/syncthing",
 | 
			
		||||
    "version": "v1.29.3",
 | 
			
		||||
    "date": "2025-03-12T11:56:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "evcc-io/evcc",
 | 
			
		||||
    "version": "0.202.1",
 | 
			
		||||
@@ -229,21 +329,6 @@
 | 
			
		||||
    "version": "v0.6.3-rc1",
 | 
			
		||||
    "date": "2025-03-26T20:39:01Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "runtipi/runtipi",
 | 
			
		||||
    "version": "v3.10.0",
 | 
			
		||||
    "date": "2025-03-15T14:38:16Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "glanceapp/glance",
 | 
			
		||||
    "version": "v0.7.8",
 | 
			
		||||
    "date": "2025-03-26T19:59:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "semaphoreui/semaphore",
 | 
			
		||||
    "version": "v2.13.2",
 | 
			
		||||
    "date": "2025-03-26T19:13:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "dgtlmoon/changedetection.io",
 | 
			
		||||
    "version": "0.49.9",
 | 
			
		||||
@@ -264,11 +349,6 @@
 | 
			
		||||
    "version": "v12.0.0-dev",
 | 
			
		||||
    "date": "2025-03-26T09:58:55Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Checkmk/checkmk",
 | 
			
		||||
    "version": "v2.2.0p41",
 | 
			
		||||
    "date": "2025-03-26T09:55:26Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "sct/overseerr",
 | 
			
		||||
    "version": "v1.34.0",
 | 
			
		||||
@@ -294,16 +374,6 @@
 | 
			
		||||
    "version": "v0.34.1",
 | 
			
		||||
    "date": "2025-03-25T18:11:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "aceberg/WatchYourLAN",
 | 
			
		||||
    "version": "2.1.1",
 | 
			
		||||
    "date": "2025-03-25T17:21:41Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pocket-id/pocket-id",
 | 
			
		||||
    "version": "v0.44.0",
 | 
			
		||||
    "date": "2025-03-25T16:09:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "dotnetfactory/fluid-calendar",
 | 
			
		||||
    "version": "v1.3.0",
 | 
			
		||||
@@ -324,11 +394,6 @@
 | 
			
		||||
    "version": "v1.6.8",
 | 
			
		||||
    "date": "2025-03-25T13:33:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "icereed/paperless-gpt",
 | 
			
		||||
    "version": "v0.14.1",
 | 
			
		||||
    "date": "2025-03-25T10:09:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "VictoriaMetrics/VictoriaMetrics",
 | 
			
		||||
    "version": "pmm-6401-v1.114.0",
 | 
			
		||||
@@ -364,11 +429,6 @@
 | 
			
		||||
    "version": "v0.9.0",
 | 
			
		||||
    "date": "2025-03-24T18:25:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Radarr/Radarr",
 | 
			
		||||
    "version": "v5.21.1.9799",
 | 
			
		||||
    "date": "2025-03-24T15:52:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Graylog2/graylog2-server",
 | 
			
		||||
    "version": "6.2.0-beta.2",
 | 
			
		||||
@@ -384,11 +444,6 @@
 | 
			
		||||
    "version": "v24.8",
 | 
			
		||||
    "date": "2025-03-18T07:33:51Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "firefly-iii/firefly-iii",
 | 
			
		||||
    "version": "v6.2.10",
 | 
			
		||||
    "date": "2025-03-22T13:02:26Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "requarks/wiki",
 | 
			
		||||
    "version": "v2.5.307",
 | 
			
		||||
@@ -399,21 +454,11 @@
 | 
			
		||||
    "version": "v1.17.0",
 | 
			
		||||
    "date": "2025-03-24T00:46:32Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Lidarr/Lidarr",
 | 
			
		||||
    "version": "v2.10.3.4602",
 | 
			
		||||
    "date": "2025-03-23T11:00:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "nicolargo/glances",
 | 
			
		||||
    "version": "v4.3.1",
 | 
			
		||||
    "date": "2025-03-23T09:02:54Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Prowlarr/Prowlarr",
 | 
			
		||||
    "version": "v1.32.2.4987",
 | 
			
		||||
    "date": "2025-03-16T09:41:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "usememos/memos",
 | 
			
		||||
    "version": "v0.24.2",
 | 
			
		||||
@@ -429,11 +474,6 @@
 | 
			
		||||
    "version": "v4.2.6",
 | 
			
		||||
    "date": "2025-03-21T21:20:29Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "sabnzbd/sabnzbd",
 | 
			
		||||
    "version": "4.4.1",
 | 
			
		||||
    "date": "2024-12-20T13:21:31Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "leiweibau/Pi.Alert",
 | 
			
		||||
    "version": "v2025-03-21",
 | 
			
		||||
@@ -529,6 +569,11 @@
 | 
			
		||||
    "version": "v4.0.14.2939",
 | 
			
		||||
    "date": "2025-03-17T19:12:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "inventree/InvenTree",
 | 
			
		||||
    "version": "0.17.9",
 | 
			
		||||
    "date": "2025-03-17T12:13:23Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "webmin/webmin",
 | 
			
		||||
    "version": "2.303",
 | 
			
		||||
@@ -659,11 +704,6 @@
 | 
			
		||||
    "version": "v21.0.0.0",
 | 
			
		||||
    "date": "2025-03-09T12:25:44Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Readarr/Readarr",
 | 
			
		||||
    "version": "v2.0.0.4645",
 | 
			
		||||
    "date": "2017-03-07T18:56:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "YuukanOO/seelf",
 | 
			
		||||
    "version": "v2.4.2",
 | 
			
		||||
@@ -724,11 +764,6 @@
 | 
			
		||||
    "version": "10.1.39",
 | 
			
		||||
    "date": "2025-03-04T19:05:18Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pi-hole/pi-hole",
 | 
			
		||||
    "version": "v6.0.5",
 | 
			
		||||
    "date": "2025-03-04T17:28:41Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "sysadminsmedia/homebox",
 | 
			
		||||
    "version": "v0.18.0",
 | 
			
		||||
@@ -764,11 +799,6 @@
 | 
			
		||||
    "version": "v6.11.2",
 | 
			
		||||
    "date": "2025-02-26T14:54:49Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Part-DB/Part-DB-server",
 | 
			
		||||
    "version": "v1.16.1",
 | 
			
		||||
    "date": "2025-02-26T11:29:15Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "silverbulletmd/silverbullet",
 | 
			
		||||
    "version": "0.10.4",
 | 
			
		||||
@@ -784,11 +814,6 @@
 | 
			
		||||
    "version": "v12.5.0",
 | 
			
		||||
    "date": "2025-02-25T14:55:50Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "traefik/traefik",
 | 
			
		||||
    "version": "v3.3.4",
 | 
			
		||||
    "date": "2025-02-25T10:18:58Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "schlagmichdoch/PairDrop",
 | 
			
		||||
    "version": "v1.11.2",
 | 
			
		||||
@@ -814,11 +839,6 @@
 | 
			
		||||
    "version": "5.6.1",
 | 
			
		||||
    "date": "2025-02-23T20:39:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "openhab/openhab-core",
 | 
			
		||||
    "version": "5.0.0.M1",
 | 
			
		||||
    "date": "2025-02-23T14:55:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "outline/outline",
 | 
			
		||||
    "version": "v0.82.1-15",
 | 
			
		||||
@@ -879,6 +899,11 @@
 | 
			
		||||
    "version": "1.3.10",
 | 
			
		||||
    "date": "2025-02-14T16:23:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "TryGhost/Ghost-CLI",
 | 
			
		||||
    "version": "v1.27.0",
 | 
			
		||||
    "date": "2025-02-13T15:55:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "MariaDB/server",
 | 
			
		||||
    "version": "mariadb-11.7.2",
 | 
			
		||||
@@ -904,6 +929,11 @@
 | 
			
		||||
    "version": "1.33.2",
 | 
			
		||||
    "date": "2025-02-09T17:54:59Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "slskd/slskd",
 | 
			
		||||
    "version": "0.22.2",
 | 
			
		||||
    "date": "2025-02-09T00:00:04Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "blakeblackshear/frigate",
 | 
			
		||||
    "version": "v0.15.0",
 | 
			
		||||
@@ -1064,6 +1094,11 @@
 | 
			
		||||
    "version": "0.6.24",
 | 
			
		||||
    "date": "2024-11-16T06:47:56Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pterodactyl/panel",
 | 
			
		||||
    "version": "v1.11.10",
 | 
			
		||||
    "date": "2024-11-15T02:29:18Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "sabre-io/Baikal",
 | 
			
		||||
    "version": "0.10.1",
 | 
			
		||||
@@ -1169,6 +1204,11 @@
 | 
			
		||||
    "version": "v2.11.0",
 | 
			
		||||
    "date": "2024-05-13T20:19:54Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pterodactyl/wings",
 | 
			
		||||
    "version": "v1.11.13",
 | 
			
		||||
    "date": "2024-05-08T04:20:34Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "CrazyWolf13/web-check",
 | 
			
		||||
    "version": "1.0.0",
 | 
			
		||||
@@ -1184,11 +1224,6 @@
 | 
			
		||||
    "version": "v4.4.3",
 | 
			
		||||
    "date": "2024-04-06T12:24:35Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "louislam/dockge",
 | 
			
		||||
    "version": "1.4.2",
 | 
			
		||||
    "date": "2024-01-21T17:02:52Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "hyperion-project/hyperion.ng",
 | 
			
		||||
    "version": "2.0.16",
 | 
			
		||||
@@ -1198,5 +1233,20 @@
 | 
			
		||||
    "name": "wger-project/wger",
 | 
			
		||||
    "version": "2.2",
 | 
			
		||||
    "date": "2023-12-06T12:08:09Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "deepch/RTSPtoWeb",
 | 
			
		||||
    "version": "v2.4.3",
 | 
			
		||||
    "date": "2023-03-29T12:05:02Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Shinobi-Systems/Shinobi",
 | 
			
		||||
    "version": "furrykitten-3",
 | 
			
		||||
    "date": "2022-07-15T05:20:17Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "deluge-torrent/deluge",
 | 
			
		||||
    "version": "deluge-2.1.2.dev0",
 | 
			
		||||
    "date": "2022-07-10T13:05:21Z"
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
  "name": "yt-dlp-webui",
 | 
			
		||||
  "slug": "yt-dlp-webui",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    14
 | 
			
		||||
    11
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-03-24",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,39 +1,29 @@
 | 
			
		||||
 | 
			
		||||
import { Separator } from "@/components/ui/separator";
 | 
			
		||||
import { extractDate } from "@/lib/time";
 | 
			
		||||
import { Script, AppVersion } from "@/lib/types";
 | 
			
		||||
import { fetchVersions } from "@/lib/data";
 | 
			
		||||
import { extractDate } from "@/lib/time";
 | 
			
		||||
import { AppVersion, Script } from "@/lib/types";
 | 
			
		||||
 | 
			
		||||
import { X } from "lucide-react";
 | 
			
		||||
import Image from "next/image";
 | 
			
		||||
 | 
			
		||||
import { basePath } from "@/config/siteConfig";
 | 
			
		||||
import { useEffect, useState } from "react";
 | 
			
		||||
import { getDisplayValueFromType } from "./ScriptInfoBlocks";
 | 
			
		||||
import Alerts from "./ScriptItems/Alerts";
 | 
			
		||||
import Buttons from "./ScriptItems/Buttons";
 | 
			
		||||
import DefaultPassword from "./ScriptItems/DefaultPassword";
 | 
			
		||||
import DefaultSettings from "./ScriptItems/DefaultSettings";
 | 
			
		||||
import Description from "./ScriptItems/Description";
 | 
			
		||||
import InstallCommand from "./ScriptItems/InstallCommand";
 | 
			
		||||
import InterFaces from "./ScriptItems/InterFaces";
 | 
			
		||||
import Tooltips from "./ScriptItems/Tooltips";
 | 
			
		||||
import { basePath } from "@/config/siteConfig";
 | 
			
		||||
import { useEffect, useState } from "react";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function ScriptItem({
 | 
			
		||||
  item,
 | 
			
		||||
  setSelectedScript,
 | 
			
		||||
}: {
 | 
			
		||||
  item: Script;
 | 
			
		||||
  setSelectedScript: (script: string | null) => void;
 | 
			
		||||
}) {
 | 
			
		||||
function ScriptItem({ item, setSelectedScript }: { item: Script; setSelectedScript: (script: string | null) => void }) {
 | 
			
		||||
  const closeScript = () => {
 | 
			
		||||
    window.history.pushState({}, document.title, window.location.pathname);
 | 
			
		||||
    setSelectedScript(null);
 | 
			
		||||
  };
 | 
			
		||||
  const [versions, setVersions] = useState<AppVersion[]>([]);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    fetchVersions()
 | 
			
		||||
      .then((fetchedVersions) => {
 | 
			
		||||
@@ -68,10 +58,7 @@ function ScriptItem({
 | 
			
		||||
                  className="h-32 w-32 rounded-lg bg-accent/60 object-contain p-3 shadow-md"
 | 
			
		||||
                  src={item.logo || `/${basePath}/logo.png`}
 | 
			
		||||
                  width={400}
 | 
			
		||||
                  onError={(e) =>
 | 
			
		||||
                  ((e.currentTarget as HTMLImageElement).src =
 | 
			
		||||
                    `/${basePath}/logo.png`)
 | 
			
		||||
                  }
 | 
			
		||||
                  onError={(e) => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
 | 
			
		||||
                  height={400}
 | 
			
		||||
                  alt={item.name}
 | 
			
		||||
                  unoptimized
 | 
			
		||||
@@ -89,35 +76,165 @@ function ScriptItem({
 | 
			
		||||
                        Default OS: {os} {version}
 | 
			
		||||
                      </p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="flex gap-5">
 | 
			
		||||
                      <DefaultSettings item={item} />
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div>{versions.length === 0 ? (<p>Loading versions...</p>) :
 | 
			
		||||
                      (<>
 | 
			
		||||
                        <p className="text-l text-foreground">Version:</p>
 | 
			
		||||
                        <p className="text-l text-muted-foreground">{versions.find((v) =>
 | 
			
		||||
                          v.name === item.slug.replace(/[^a-z0-9]/g, '') ||
 | 
			
		||||
                          v.name.includes(item.slug.replace(/[^a-z0-9]/g, '')) ||
 | 
			
		||||
                          v.name.replace(/[^a-z0-9]/g, '') === item.slug.replace(/[^a-z0-9]/g, '')
 | 
			
		||||
                    <div className="flex min-w-[600px] flex-wrap gap-6 text-sm text-muted-foreground">
 | 
			
		||||
                      {(() => {
 | 
			
		||||
                        const getDisplayValueFromRAM = (ram: number) =>
 | 
			
		||||
                          ram >= 1024 ? `${Math.floor(ram / 1024)}GB` : `${ram}MB`;
 | 
			
		||||
 | 
			
		||||
                        )?.version || "No Version information found"
 | 
			
		||||
                        }</p>
 | 
			
		||||
                        <p className="text-l text-foreground">Latest Version changes(Pulled from newreleases.io):</p>
 | 
			
		||||
                        <p className="text-l text-muted-foreground">
 | 
			
		||||
                          {(() => {
 | 
			
		||||
                            const matchedVersion = versions.find((v) =>
 | 
			
		||||
                              v.name === item.slug.replace(/[^a-z0-9]/g, '') ||
 | 
			
		||||
                              v.name.includes(item.slug.replace(/[^a-z0-9]/g, '')) ||
 | 
			
		||||
                              v.name.replace(/[^a-z0-9]/g, '') === item.slug.replace(/[^a-z0-9]/g, '')
 | 
			
		||||
                            );
 | 
			
		||||
                            return matchedVersion?.date ?
 | 
			
		||||
                              extractDate(matchedVersion.date as unknown as string) :
 | 
			
		||||
                              "No date information found"
 | 
			
		||||
                          })()}
 | 
			
		||||
                        </p>
 | 
			
		||||
                      </>)
 | 
			
		||||
                    }
 | 
			
		||||
                        const IconText = ({ icon, label }: { icon: React.ReactNode; label: string }) => (
 | 
			
		||||
                          <span className="flex items-center gap-1">
 | 
			
		||||
                            {icon}
 | 
			
		||||
                            {label}
 | 
			
		||||
                          </span>
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                        const CPUIcon = (
 | 
			
		||||
                          <svg
 | 
			
		||||
                            xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
                            className="w-4 h-4"
 | 
			
		||||
                            fill="none"
 | 
			
		||||
                            viewBox="0 0 24 24"
 | 
			
		||||
                            stroke="currentColor"
 | 
			
		||||
                            strokeWidth={2}
 | 
			
		||||
                          >
 | 
			
		||||
                            <rect x="9" y="9" width="6" height="6" />
 | 
			
		||||
                            <path d="M3 9h2m14 0h2M3 15h2m14 0h2M9 3v2m6-2v2M9 19v2m6-2v2" />
 | 
			
		||||
                          </svg>
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                        const RAMIcon = (
 | 
			
		||||
                          <svg
 | 
			
		||||
                            xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
                            className="w-4 h-4"
 | 
			
		||||
                            fill="none"
 | 
			
		||||
                            viewBox="0 0 24 24"
 | 
			
		||||
                            stroke="currentColor"
 | 
			
		||||
                            strokeWidth={2}
 | 
			
		||||
                          >
 | 
			
		||||
                            <rect x="4" y="6" width="16" height="12" rx="2" ry="2" />
 | 
			
		||||
                            <path d="M8 6v12M16 6v12" />
 | 
			
		||||
                          </svg>
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                        const HDDIcon = (
 | 
			
		||||
                          <svg
 | 
			
		||||
                            xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
                            className="w-4 h-4"
 | 
			
		||||
                            fill="none"
 | 
			
		||||
                            viewBox="0 0 24 24"
 | 
			
		||||
                            stroke="currentColor"
 | 
			
		||||
                            strokeWidth={2}
 | 
			
		||||
                          >
 | 
			
		||||
                            <path d="M4 4h16v16H4z" />
 | 
			
		||||
                            <circle cx="8" cy="16" r="1" />
 | 
			
		||||
                            <circle cx="16" cy="16" r="1" />
 | 
			
		||||
                          </svg>
 | 
			
		||||
                        );
 | 
			
		||||
 | 
			
		||||
                        const ResourceDisplay = ({
 | 
			
		||||
                          title,
 | 
			
		||||
                          cpu,
 | 
			
		||||
                          ram,
 | 
			
		||||
                          hdd,
 | 
			
		||||
                        }: {
 | 
			
		||||
                          title: string;
 | 
			
		||||
                          cpu: number | null;
 | 
			
		||||
                          ram: number | null;
 | 
			
		||||
                          hdd: number | null;
 | 
			
		||||
                        }) => {
 | 
			
		||||
                          const getDisplayValueFromRAM = (ram: number) =>
 | 
			
		||||
                            ram >= 1024 ? `${Math.floor(ram / 1024)}GB` : `${ram}MB`;
 | 
			
		||||
 | 
			
		||||
                          const IconText = ({ icon, label }: { icon: React.ReactNode; label: string }) => (
 | 
			
		||||
                            <span className="flex items-center gap-1 whitespace-nowrap">
 | 
			
		||||
                              {icon}
 | 
			
		||||
                              {label}
 | 
			
		||||
                            </span>
 | 
			
		||||
                          );
 | 
			
		||||
 | 
			
		||||
                          const hasCPU = typeof cpu === "number" && cpu > 0;
 | 
			
		||||
                          const hasRAM = typeof ram === "number" && ram > 0;
 | 
			
		||||
                          const hasHDD = typeof hdd === "number" && hdd > 0;
 | 
			
		||||
 | 
			
		||||
                          if (!hasCPU && !hasRAM && !hasHDD) return null;
 | 
			
		||||
 | 
			
		||||
                          return (
 | 
			
		||||
                            <div className="flex flex-wrap items-center gap-1">
 | 
			
		||||
                              <span className="font-semibold text-foreground">{title}:</span>
 | 
			
		||||
                              {hasCPU && (
 | 
			
		||||
                                <>
 | 
			
		||||
                                  <IconText icon={CPUIcon} label={`CPU: ${cpu} vCPU`} />
 | 
			
		||||
                                  <span>|</span>
 | 
			
		||||
                                </>
 | 
			
		||||
                              )}
 | 
			
		||||
                              {hasRAM && (
 | 
			
		||||
                                <>
 | 
			
		||||
                                  <IconText icon={RAMIcon} label={`RAM: ${getDisplayValueFromRAM(ram!)}`} />
 | 
			
		||||
                                  <span>|</span>
 | 
			
		||||
                                </>
 | 
			
		||||
                              )}
 | 
			
		||||
                              {hasHDD && <IconText icon={HDDIcon} label={`HDD: ${hdd} GB`} />}
 | 
			
		||||
                            </div>
 | 
			
		||||
                          );
 | 
			
		||||
                        };
 | 
			
		||||
 | 
			
		||||
                        const defaultSettings = item.install_methods.find((method) => method.type === "default");
 | 
			
		||||
                        const alpineSettings = item.install_methods.find((method) => method.type === "alpine");
 | 
			
		||||
                        return (
 | 
			
		||||
                          <>
 | 
			
		||||
                            {defaultSettings?.resources && (
 | 
			
		||||
                              <ResourceDisplay
 | 
			
		||||
                                title="Default"
 | 
			
		||||
                                cpu={defaultSettings.resources.cpu}
 | 
			
		||||
                                ram={defaultSettings.resources.ram}
 | 
			
		||||
                                hdd={defaultSettings.resources.hdd}
 | 
			
		||||
                              />
 | 
			
		||||
                            )}
 | 
			
		||||
 | 
			
		||||
                            {alpineSettings?.resources && (
 | 
			
		||||
                              <ResourceDisplay
 | 
			
		||||
                                title="Alpine"
 | 
			
		||||
                                cpu={alpineSettings.resources.cpu}
 | 
			
		||||
                                ram={alpineSettings.resources.ram}
 | 
			
		||||
                                hdd={alpineSettings.resources.hdd}
 | 
			
		||||
                              />
 | 
			
		||||
                            )}
 | 
			
		||||
                          </>
 | 
			
		||||
                        );
 | 
			
		||||
                      })()}
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    {(() => {
 | 
			
		||||
                      if (versions.length === 0) {
 | 
			
		||||
                        return <p>Loading versions...</p>;
 | 
			
		||||
                      }
 | 
			
		||||
 | 
			
		||||
                      const cleanSlug = item.slug.replace(/[^a-z0-9]/gi, "").toLowerCase();
 | 
			
		||||
 | 
			
		||||
                      const matched = versions.find((v) => {
 | 
			
		||||
                        const cleanName = v.name.replace(/[^a-z0-9]/gi, "").toLowerCase();
 | 
			
		||||
                        return cleanName === cleanSlug || cleanName.includes(cleanSlug);
 | 
			
		||||
                      });
 | 
			
		||||
 | 
			
		||||
                      if (!matched) return null;
 | 
			
		||||
 | 
			
		||||
                      return (
 | 
			
		||||
                        <div className="flex items-center gap-2 text-sm text-muted-foreground mt-2">
 | 
			
		||||
                          <span className="text-foreground">
 | 
			
		||||
                            Version: {matched.version} (
 | 
			
		||||
                            {extractDate(
 | 
			
		||||
                              matched.date instanceof Date ? matched.date.toISOString() : matched.date || "",
 | 
			
		||||
                            )}
 | 
			
		||||
                          </span>
 | 
			
		||||
                          <span
 | 
			
		||||
                            title="Crawled version from newreleases.io"
 | 
			
		||||
                            className="cursor-help rounded-full border border-green-500 px-2 py-0.5 text-xs font-semibold text-green-500"
 | 
			
		||||
                          >
 | 
			
		||||
                            Info
 | 
			
		||||
                          </span>
 | 
			
		||||
                        </div>
 | 
			
		||||
                      );
 | 
			
		||||
                    })()}
 | 
			
		||||
                  </div>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
@@ -134,9 +251,7 @@ function ScriptItem({
 | 
			
		||||
              </div>
 | 
			
		||||
              <div className="mt-4 rounded-lg border bg-accent/50">
 | 
			
		||||
                <div className="flex gap-3 px-4 py-2">
 | 
			
		||||
                  <h2 className="text-lg font-semibold">
 | 
			
		||||
                    How to {item.type == "misc" ? "use" : "install"}
 | 
			
		||||
                  </h2>
 | 
			
		||||
                  <h2 className="text-lg font-semibold">How to {item.type == "misc" ? "use" : "install"}</h2>
 | 
			
		||||
                  <Tooltips item={item} />
 | 
			
		||||
                </div>
 | 
			
		||||
                <Separator className="w-full"></Separator>
 | 
			
		||||
 
 | 
			
		||||
@@ -14,10 +14,19 @@ network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
        lsb-release \
 | 
			
		||||
        gpg
 | 
			
		||||
 | 
			
		||||
curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/deb.sury.org-php.gpg
 | 
			
		||||
echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
        nginx \
 | 
			
		||||
        composer \
 | 
			
		||||
        php8.2-{bcmath,common,ctype,curl,fileinfo,fpm,gd,mbstring,mysql,xml,cli} \
 | 
			
		||||
        php8.3-{bcmath,common,ctype,curl,fileinfo,fpm,gd,mbstring,mysql,xml,cli} \
 | 
			
		||||
        mariadb-server
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
@@ -90,7 +99,7 @@ server {
 | 
			
		||||
        error_page 404 /index.php;
 | 
			
		||||
 | 
			
		||||
        location ~ \.php\$ {
 | 
			
		||||
                fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
 | 
			
		||||
                fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
 | 
			
		||||
                fastcgi_param SCRIPT_FILENAME \$realpath_root\$fastcgi_script_name;
 | 
			
		||||
                include fastcgi_params;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -24,13 +24,13 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
$STD npm install -g pnpm
 | 
			
		||||
$STD npm install -g pnpm@10.4.0
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PostgreSQL"
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,8 @@ $STD apt-get install -y \
 | 
			
		||||
  rclone \
 | 
			
		||||
  tzdata \
 | 
			
		||||
  ca-certificates \
 | 
			
		||||
  build-essential
 | 
			
		||||
  build-essential \
 | 
			
		||||
  gnupg
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Golang"
 | 
			
		||||
@@ -32,15 +33,29 @@ ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Setup Golang"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "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
 | 
			
		||||
curl -fsSL "https://github.com/StarFleetCPTN/GoMFT/archive/refs/tags/v${RELEASE}.tar.gz" -o $temp_file
 | 
			
		||||
tar -xzf $temp_file
 | 
			
		||||
mv GoMFT-v.${RELEASE}/ /opt/gomft
 | 
			
		||||
mv GoMFT-${RELEASE}/ /opt/gomft
 | 
			
		||||
cd /opt/gomft
 | 
			
		||||
$STD npm ci
 | 
			
		||||
$STD node build.js
 | 
			
		||||
$STD go mod download
 | 
			
		||||
$STD go install github.com/a-h/templ/cmd/templ@latest
 | 
			
		||||
$STD go get -u github.com/a-h/templ
 | 
			
		||||
$STD $HOME/go/bin/templ generate
 | 
			
		||||
export CGO_ENABLED=1
 | 
			
		||||
export GOOS=linux
 | 
			
		||||
 
 | 
			
		||||
@@ -15,14 +15,9 @@ update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apk add \
 | 
			
		||||
    newt \
 | 
			
		||||
    curl \
 | 
			
		||||
    openssh \
 | 
			
		||||
    tzdata \
 | 
			
		||||
    nano \
 | 
			
		||||
    gawk \
 | 
			
		||||
    yq \
 | 
			
		||||
    mc
 | 
			
		||||
    yq
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Docker & Compose"
 | 
			
		||||
@@ -95,7 +90,7 @@ customize
 | 
			
		||||
msg_info "Retrieving Default Login (Patience)"
 | 
			
		||||
PASSWORD_FOUND=0
 | 
			
		||||
for i in {1..60}; do
 | 
			
		||||
    PASSWORD_LINE=$(docker logs "$CONTAINER_ID" 2>&1 | grep -m1 "Creating a new user:")
 | 
			
		||||
    PASSWORD_LINE=$(docker logs "$CONTAINER_ID" 2>&1 | awk '/Creating a new user:/ { print; exit }')
 | 
			
		||||
    if [[ -n "$PASSWORD_LINE" ]]; then
 | 
			
		||||
        PASSWORD=$(echo "$PASSWORD_LINE" | awk -F 'password: ' '{print $2}')
 | 
			
		||||
        echo -e "username: admin@example.org\npassword: $PASSWORD" >/opt/.npm_pwd
 | 
			
		||||
@@ -107,5 +102,6 @@ for i in {1..60}; do
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
if [[ $PASSWORD_FOUND -eq 0 ]]; then
 | 
			
		||||
    msg_ok "No default login found, use docker ps & docker logs for container password."
 | 
			
		||||
    msg_error "Could not retrieve default login after 60 seconds."
 | 
			
		||||
    echo -e "\nYou can manually check the container logs with:\n  docker logs $CONTAINER_ID | grep 'Creating a new user:'\n"
 | 
			
		||||
fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										120
									
								
								install/slskd-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								install/slskd-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: vhsdream
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/slskd/slskd/, https://soularr.net
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  python3-pip
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup ${APPLICATION}"
 | 
			
		||||
tmp_file=$(mktemp)
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/slskd/slskd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
curl -fsSL "https://github.com/slskd/slskd/releases/download/${RELEASE}/slskd-${RELEASE}-linux-x64.zip" -o $tmp_file
 | 
			
		||||
unzip -q $tmp_file -d /opt/${APPLICATION}
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
JWT_KEY=$(openssl rand -base64 44)
 | 
			
		||||
SLSKD_API_KEY=$(openssl rand -base64 44)
 | 
			
		||||
cp /opt/${APPLICATION}/config/slskd.example.yml /opt/${APPLICATION}/config/slskd.yml
 | 
			
		||||
sed -i \
 | 
			
		||||
    -e "\|web:|,\|cidr|s|^#||" \
 | 
			
		||||
    -e "\|https:|,\|5031|s|false|true|" \
 | 
			
		||||
    -e "\|api_keys|,\|cidr|s|<some.*$|$SLSKD_API_KEY|; \
 | 
			
		||||
    s|role: readonly|role: readwrite|; \
 | 
			
		||||
    s|0.0.0.0/0,::/0|& # Replace this with your subnet|" \
 | 
			
		||||
    -e "\|soulseek|,\|write_queue|s|^#||" \
 | 
			
		||||
    -e "\|jwt:|,\|ttl|s|key: ~|key: $JWT_KEY|" \
 | 
			
		||||
    /opt/${APPLICATION}/config/slskd.yml
 | 
			
		||||
msg_ok "Setup ${APPLICATION}"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Soularr"
 | 
			
		||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
cd /tmp
 | 
			
		||||
curl -fsSL -o main.zip https://github.com/mrusse/soularr/archive/refs/heads/main.zip
 | 
			
		||||
unzip -q main.zip
 | 
			
		||||
mv soularr-main /opt/soularr
 | 
			
		||||
cd /opt/soularr
 | 
			
		||||
$STD pip install -r requirements.txt
 | 
			
		||||
sed -i \
 | 
			
		||||
    -e "\|[Slskd]|,\|host_url|s|yourslskdapikeygoeshere|$SLSKD_API_KEY|" \
 | 
			
		||||
    -e "/host_url/s/slskd/localhost/" \
 | 
			
		||||
    /opt/soularr/config.ini
 | 
			
		||||
sed -i \
 | 
			
		||||
    -e "/#This\|#Default\|INTERVAL/{N;d;}" \
 | 
			
		||||
    -e "/while\|#Pass/d" \
 | 
			
		||||
    -e "\|python|s|app|opt/soularr|; s|python|python3|" \
 | 
			
		||||
    -e "/dt/,+2d" \
 | 
			
		||||
    /opt/soularr/run.sh
 | 
			
		||||
sed -i -E "/(soularr.py)/s/.{5}$//; /if/,/fi/s/.{4}//" /opt/soularr/run.sh
 | 
			
		||||
chmod +x /opt/soularr/run.sh
 | 
			
		||||
msg_ok "Installed Soularr"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Services"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/${APPLICATION}.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=${APPLICATION} Service
 | 
			
		||||
After=network.target
 | 
			
		||||
Wants=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
WorkingDirectory=/opt/${APPLICATION}
 | 
			
		||||
ExecStart=/opt/${APPLICATION}/slskd --config /opt/${APPLICATION}/config/slskd.yml
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
cat <<EOF >/etc/systemd/system/soularr.timer
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Soularr service timer
 | 
			
		||||
RefuseManualStart=no
 | 
			
		||||
RefuseManualStop=no
 | 
			
		||||
 | 
			
		||||
[Timer]
 | 
			
		||||
Persistent=true
 | 
			
		||||
# run every 5 minutes
 | 
			
		||||
OnCalendar=*-*-* *:0/5:00
 | 
			
		||||
Unit=soularr.service
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=timers.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
cat <<EOF >/etc/systemd/system/soularr.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Soularr service
 | 
			
		||||
After=network.target slskd.service
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
WorkingDirectory=/opt/soularr
 | 
			
		||||
ExecStart=/bin/bash -c /opt/soularr/run.sh
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now ${APPLICATION}.service
 | 
			
		||||
systemctl enable -q soularr.timer
 | 
			
		||||
msg_ok "Created Services"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf $tmp_file
 | 
			
		||||
rm -rf /tmp/main.zip
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -14,7 +14,9 @@ network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y gpg
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  gpg \
 | 
			
		||||
  build-essential
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
@@ -27,6 +29,7 @@ msg_info "Installing Node.js"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
$STD npm install --global yarn
 | 
			
		||||
$STD npm install --global node-gyp
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing The Lounge"
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
$STD npm install -g pnpm@9.7.1
 | 
			
		||||
 
 | 
			
		||||
@@ -295,7 +295,7 @@ get_header() {
 | 
			
		||||
  mkdir -p "/usr/local/community-scripts/headers"
 | 
			
		||||
 | 
			
		||||
  # Check if local file already present
 | 
			
		||||
  if [ ! -f "$local_header_path" ]; then
 | 
			
		||||
  if [ ! -s "$local_header_path" ]; then
 | 
			
		||||
    wget -qO "$local_header_path" "$header_url"
 | 
			
		||||
    if [ $? -ne 0 ]; then
 | 
			
		||||
      echo -e "${WARN}${BOLD}${YLW}Failed to download header for ${app_name}. No header will be displayed.${CL}"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user