mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	Compare commits
	
		
			53 Commits
		
	
	
		
			2025-02-02
			...
			2025-02-04
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					62dac32400 | ||
| 
						 | 
					401a9e1a45 | ||
| 
						 | 
					569d0ac374 | ||
| 
						 | 
					e75312007d | ||
| 
						 | 
					103a5371e6 | ||
| 
						 | 
					abfe17ce74 | ||
| 
						 | 
					86295fcf67 | ||
| 
						 | 
					c9012c54df | ||
| 
						 | 
					fd051552f3 | ||
| 
						 | 
					169076e68e | ||
| 
						 | 
					971aa5ba16 | ||
| 
						 | 
					6be54478f4 | ||
| 
						 | 
					6b225058de | ||
| 
						 | 
					78d96fdaa2 | ||
| 
						 | 
					8129e3cf39 | ||
| 
						 | 
					0e5f663df5 | ||
| 
						 | 
					de45527d45 | ||
| 
						 | 
					d7b3f33030 | ||
| 
						 | 
					88daaed113 | ||
| 
						 | 
					41744c0ab6 | ||
| 
						 | 
					c3cd5314fe | ||
| 
						 | 
					6f29ab8942 | ||
| 
						 | 
					bd5db081c1 | ||
| 
						 | 
					c5a69d6e8b | ||
| 
						 | 
					a75c0e1562 | ||
| 
						 | 
					a97d76f428 | ||
| 
						 | 
					0e0539af3f | ||
| 
						 | 
					8d46f7266e | ||
| 
						 | 
					7f5ee39b25 | ||
| 
						 | 
					85333212b0 | ||
| 
						 | 
					577a415f10 | ||
| 
						 | 
					db24bf4d02 | ||
| 
						 | 
					21e0e0df98 | ||
| 
						 | 
					83015c8cff | ||
| 
						 | 
					7ca1ed019c | ||
| 
						 | 
					fb8f911c49 | ||
| 
						 | 
					b4a0b74bfd | ||
| 
						 | 
					99556bdbd2 | ||
| 
						 | 
					ec3b70e8fd | ||
| 
						 | 
					50ffcd4734 | ||
| 
						 | 
					55c1f2f3dc | ||
| 
						 | 
					99e04e1ded | ||
| 
						 | 
					884428e113 | ||
| 
						 | 
					00f58d71d6 | ||
| 
						 | 
					fa4ab5c8a3 | ||
| 
						 | 
					1528c46f0b | ||
| 
						 | 
					c5b9e4db64 | ||
| 
						 | 
					36f2fb3e52 | ||
| 
						 | 
					e379db8baf | ||
| 
						 | 
					91ba5cd412 | ||
| 
						 | 
					745d1f9444 | ||
| 
						 | 
					76f12fc596 | ||
| 
						 | 
					995906f299 | 
							
								
								
									
										2
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							@@ -80,7 +80,7 @@ git switch -c your-feature-branch
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 4. Change paths in build.func install.func and AppName.sh
 | 
			
		||||
To be able to develop from your own branch you need to change `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main` to `https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/head/[BRANCH]`. You need to make this change atleast in misc/build.func misc/install.func and in your ct/AppName.sh. This change is only for testing. Before opening a Pull Request you should change this line change all this back to point to `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`.
 | 
			
		||||
To be able to develop from your own branch you need to change `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main` to `https://raw.githubusercontent.com/[USER]/[REPOSITORY]/refs/heads/[BRANCH]`. You need to make this change atleast in misc/build.func misc/install.func and in your ct/AppName.sh. This change is only for testing. Before opening a Pull Request you should change this line change all this back to point to `https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main`.
 | 
			
		||||
 | 
			
		||||
### 4. Commit changes (without build.func and install.func!)
 | 
			
		||||
```bash
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/CONTRIBUTOR_GUIDE/ct/AppName.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/CONTRIBUTOR_GUIDE/ct/AppName.sh
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2024 community-scripts ORG
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: [YourUserName]
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: [SOURCE_URL]
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2024 community-scripts ORG
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: [YourUserName]
 | 
			
		||||
# License: MIT
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: [SOURCE_URL]
 | 
			
		||||
 | 
			
		||||
# Import Functions und Setup
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ find ./ct -type f -name "*.sh" | sort | while read -r script; do
 | 
			
		||||
    output_file="${headers_dir}/$(basename "${script%.*}")"
 | 
			
		||||
 | 
			
		||||
    # Generate figlet output
 | 
			
		||||
    figlet_output=$(figlet -f slant "$app_name")
 | 
			
		||||
    figlet_output=$(figlet -w 500 -f slant "$app_name")
 | 
			
		||||
 | 
			
		||||
    # Check if figlet output is not empty
 | 
			
		||||
    if [[ -n "$figlet_output" ]]; then
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -17,6 +17,67 @@ All LXC instances created using this repository come pre-installed with Midnight
 | 
			
		||||
Do not break established syntax in this file, as it is automatically updated by a Github Workflow
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 2025-02-04
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 | 
			
		||||
### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
- Rename & Optimize: Proxmox Backup Server (Renaming & Update fix) [@thost96](https://github.com/thost96) ([#2012](https://github.com/community-scripts/ProxmoxVE/pull/2012))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: Authentik - Remove deprecated GO-Remove in Footer [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2020](https://github.com/community-scripts/ProxmoxVE/pull/2020))
 | 
			
		||||
- Fix: Authentik Fix wrong HDD Size [@thost96](https://github.com/thost96) ([#2001](https://github.com/community-scripts/ProxmoxVE/pull/2001))
 | 
			
		||||
- Fix: Tandoor - node Version [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2010](https://github.com/community-scripts/ProxmoxVE/pull/2010))
 | 
			
		||||
- Fix actual update - missing hidden files, downloaded release cleanup [@maciejmatczak](https://github.com/maciejmatczak) ([#2027](https://github.com/community-scripts/ProxmoxVE/pull/2027))
 | 
			
		||||
- Fix Script: post-pmg-install.sh [@thost96](https://github.com/thost96) ([#2022](https://github.com/community-scripts/ProxmoxVE/pull/2022))
 | 
			
		||||
- Fix Tianji: Add heap-space value for nodejs [@MickLesk](https://github.com/MickLesk) ([#2011](https://github.com/community-scripts/ProxmoxVE/pull/2011))
 | 
			
		||||
- Fix: Ghost LXC - Use Node20 [@MickLesk](https://github.com/MickLesk) ([#2006](https://github.com/community-scripts/ProxmoxVE/pull/2006))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- [API] Massive update to api (remove many, optimize website for users) [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1990](https://github.com/community-scripts/ProxmoxVE/pull/1990))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- Fix header comments on contributor templates [@tremor021](https://github.com/tremor021) ([#2029](https://github.com/community-scripts/ProxmoxVE/pull/2029))
 | 
			
		||||
- [Fix]: Headername of Proxmox-Datacenter-Manager not in CamelCase [@MickLesk](https://github.com/MickLesk) ([#2017](https://github.com/community-scripts/ProxmoxVE/pull/2017))
 | 
			
		||||
- [Fix] Header breaks at long title - add width for figlet github action [@MickLesk](https://github.com/MickLesk) ([#2015](https://github.com/community-scripts/ProxmoxVE/pull/2015))
 | 
			
		||||
 | 
			
		||||
## 2025-02-03
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Element Synapse [@tremor021](https://github.com/tremor021) ([#1955](https://github.com/community-scripts/ProxmoxVE/pull/1955))
 | 
			
		||||
- New Script: Privatebin [@opastorello](https://github.com/opastorello) ([#1925](https://github.com/community-scripts/ProxmoxVE/pull/1925))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: Monica Install with nodejs [@MickLesk](https://github.com/MickLesk) ([#1996](https://github.com/community-scripts/ProxmoxVE/pull/1996))
 | 
			
		||||
- Element Synapse sed fix [@tremor021](https://github.com/tremor021) ([#1994](https://github.com/community-scripts/ProxmoxVE/pull/1994))
 | 
			
		||||
- Fix Hoarder corepack install/update error [@vhsdream](https://github.com/vhsdream) ([#1957](https://github.com/community-scripts/ProxmoxVE/pull/1957))
 | 
			
		||||
- [Security & Maintenance] Update NodeJS Repo to 22 for new Installs [@MickLesk](https://github.com/MickLesk) ([#1984](https://github.com/community-scripts/ProxmoxVE/pull/1984))
 | 
			
		||||
- [Standardization]: Same Setup for GoLang on all LXC's & Clear Tarball [@MickLesk](https://github.com/MickLesk) ([#1977](https://github.com/community-scripts/ProxmoxVE/pull/1977))
 | 
			
		||||
- Feature: urbackupserver Include fuse&nesting features during install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1968](https://github.com/community-scripts/ProxmoxVE/pull/1968))
 | 
			
		||||
- Fix: MSSQL-Server: Better gpg handling [@MickLesk](https://github.com/MickLesk) ([#1962](https://github.com/community-scripts/ProxmoxVE/pull/1962))
 | 
			
		||||
- Fix: Grist ran into a heap space during the update [@MickLesk](https://github.com/MickLesk) ([#1964](https://github.com/community-scripts/ProxmoxVE/pull/1964))
 | 
			
		||||
- Fix: FS-Trim Cancel / Error-Button [@MickLesk](https://github.com/MickLesk) ([#1965](https://github.com/community-scripts/ProxmoxVE/pull/1965))
 | 
			
		||||
- Fix: Increase HDD Space for Hoarder [@MickLesk](https://github.com/MickLesk) ([#1970](https://github.com/community-scripts/ProxmoxVE/pull/1970))
 | 
			
		||||
- Feature: Clean Orphan LVM without CEPH [@MickLesk](https://github.com/MickLesk) ([#1974](https://github.com/community-scripts/ProxmoxVE/pull/1974))
 | 
			
		||||
- [Standardization] Fix Spelling for "Setup Python3"  [@MickLesk](https://github.com/MickLesk) ([#1975](https://github.com/community-scripts/ProxmoxVE/pull/1975))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- [Website] update data/page.tsx [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1969](https://github.com/community-scripts/ProxmoxVE/pull/1969))
 | 
			
		||||
- Prometheus Proxmox VE Exporter: Set correct website slug [@andygrunwald](https://github.com/andygrunwald) ([#1961](https://github.com/community-scripts/ProxmoxVE/pull/1961))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- [API] Remove Hostname, Verbose, SSH and TAGS [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#1967](https://github.com/community-scripts/ProxmoxVE/pull/1967))
 | 
			
		||||
 | 
			
		||||
## 2025-02-02
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 
 | 
			
		||||
@@ -44,9 +44,8 @@ function update_script() {
 | 
			
		||||
        cd /tmp
 | 
			
		||||
        wget -q https://github.com/actualbudget/actual-server/archive/refs/tags/v${RELEASE}.tar.gz
 | 
			
		||||
        mv /opt/actualbudget /opt/actualbudget_bak
 | 
			
		||||
        mkdir -p /opt/actualbudget/
 | 
			
		||||
        tar -xzf v${RELEASE}.tar.gz >/dev/null 2>&1
 | 
			
		||||
        mv *ctual-server-*/* /opt/actualbudget
 | 
			
		||||
        mv *ctual-server-* /opt/actualbudget
 | 
			
		||||
        rm -rf /opt/actualbudget/.env
 | 
			
		||||
        mv /opt/actualbudget_bak/.env /opt/actualbudget
 | 
			
		||||
        mv /opt/actualbudget_bak/server-files /opt/actualbudget/server-files
 | 
			
		||||
@@ -61,7 +60,7 @@ function update_script() {
 | 
			
		||||
        
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf /opt/actualbudget_bak
 | 
			
		||||
        rm -rf /tmp/actual-server.tar.gz
 | 
			
		||||
        rm -rf /tmp/v${RELEASE}.tar.gz
 | 
			
		||||
        msg_ok "Cleaned"
 | 
			
		||||
        msg_ok "Updated Successfully"
 | 
			
		||||
    else
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Authentik"
 | 
			
		||||
var_tags="identity-provider"
 | 
			
		||||
var_disk="15"
 | 
			
		||||
var_disk="12"
 | 
			
		||||
var_cpu="6"
 | 
			
		||||
var_ram="8192"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
 
 | 
			
		||||
@@ -73,7 +73,7 @@ function update_script() {
 | 
			
		||||
    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"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										49
									
								
								ct/elementsynapse.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								ct/elementsynapse.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
#!/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: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/element-hq/synapse
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Element Synapse"
 | 
			
		||||
var_tags="server"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core 
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /etc/matrix-synapse ]]; then 
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    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}:8008${CL}"
 | 
			
		||||
@@ -5,9 +5,9 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Grist"
 | 
			
		||||
var_tags="database;spreadsheet"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="3072"
 | 
			
		||||
var_disk="6"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ___    __      _                  _   __          __       __           
 | 
			
		||||
   /   |  / /___  (_)___  ___        / | / /__  _  __/ /______/ /___  __  __
 | 
			
		||||
  / /| | / / __ \/ / __ \/ _ \______/  |/ / _ \| |/_/ __/ ___/ / __ \/ / / /
 | 
			
		||||
 / ___ |/ / /_/ / / / / /  __/_____/ /|  /  __/>  </ /_/ /__/ / /_/ / /_/ / 
 | 
			
		||||
/_/  |_/_/ .___/_/_/ /_/\___/     /_/ |_/\___/_/|_|\__/\___/_/\____/\__,_/  
 | 
			
		||||
    ___    __      _                  _   __          __       __                __
 | 
			
		||||
   /   |  / /___  (_)___  ___        / | / /__  _  __/ /______/ /___  __  ______/ /
 | 
			
		||||
  / /| | / / __ \/ / __ \/ _ \______/  |/ / _ \| |/_/ __/ ___/ / __ \/ / / / __  / 
 | 
			
		||||
 / ___ |/ / /_/ / / / / /  __/_____/ /|  /  __/>  </ /_/ /__/ / /_/ / /_/ / /_/ /  
 | 
			
		||||
/_/  |_/_/ .___/_/_/ /_/\___/     /_/ |_/\___/_/|_|\__/\___/_/\____/\__,_/\__,_/   
 | 
			
		||||
        /_/                                                                        
 | 
			
		||||
       __
 | 
			
		||||
  ____/ /
 | 
			
		||||
 / __  / 
 | 
			
		||||
/ /_/ /  
 | 
			
		||||
\__,_/   
 | 
			
		||||
         
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ___    __      _                _    __            ____                
 | 
			
		||||
   /   |  / /___  (_)___  ___      | |  / /___ ___  __/ / /__      ______ _
 | 
			
		||||
  / /| | / / __ \/ / __ \/ _ \_____| | / / __ `/ / / / / __/ | /| / / __ `/
 | 
			
		||||
 / ___ |/ / /_/ / / / / /  __/_____/ |/ / /_/ / /_/ / / /_ | |/ |/ / /_/ / 
 | 
			
		||||
/_/  |_/_/ .___/_/_/ /_/\___/      |___/\__,_/\__,_/_/\__/ |__/|__/\__,_/  
 | 
			
		||||
    ___    __      _                _    __            ____                          __         
 | 
			
		||||
   /   |  / /___  (_)___  ___      | |  / /___ ___  __/ / /__      ______ __________/ /__  ____ 
 | 
			
		||||
  / /| | / / __ \/ / __ \/ _ \_____| | / / __ `/ / / / / __/ | /| / / __ `/ ___/ __  / _ \/ __ \
 | 
			
		||||
 / ___ |/ / /_/ / / / / /  __/_____/ |/ / /_/ / /_/ / / /_ | |/ |/ / /_/ / /  / /_/ /  __/ / / /
 | 
			
		||||
/_/  |_/_/ .___/_/_/ /_/\___/      |___/\__,_/\__,_/_/\__/ |__/|__/\__,_/_/   \__,_/\___/_/ /_/ 
 | 
			
		||||
        /_/                                                                                     
 | 
			
		||||
             __         
 | 
			
		||||
   _________/ /__  ____ 
 | 
			
		||||
  / ___/ __  / _ \/ __ \
 | 
			
		||||
 / /  / /_/ /  __/ / / /
 | 
			
		||||
/_/   \__,_/\___/_/ /_/ 
 | 
			
		||||
                        
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ___    __      _               _____   _       __             ___   __  ___
 | 
			
		||||
   /   |  / /___  (_)___  ___     /__  /  (_)___ _/ /_  ___  ___ |__ \ /  |/  /
 | 
			
		||||
  / /| | / / __ \/ / __ \/ _ \______/ /  / / __ `/ __ \/ _ \/ _ \__/ // /|_/ / 
 | 
			
		||||
 / ___ |/ / /_/ / / / / /  __/_____/ /__/ / /_/ / /_/ /  __/  __/ __// /  / /  
 | 
			
		||||
/_/  |_/_/ .___/_/_/ /_/\___/     /____/_/\__, /_.___/\___/\___/____/_/  /_/   
 | 
			
		||||
    ___    __      _               _____   _       __             ___   __  _______  ____________
 | 
			
		||||
   /   |  / /___  (_)___  ___     /__  /  (_)___ _/ /_  ___  ___ |__ \ /  |/  / __ \/_  __/_  __/
 | 
			
		||||
  / /| | / / __ \/ / __ \/ _ \______/ /  / / __ `/ __ \/ _ \/ _ \__/ // /|_/ / / / / / /   / /   
 | 
			
		||||
 / ___ |/ / /_/ / / / / /  __/_____/ /__/ / /_/ / /_/ /  __/  __/ __// /  / / /_/ / / /   / /    
 | 
			
		||||
/_/  |_/_/ .___/_/_/ /_/\___/     /____/_/\__, /_.___/\___/\___/____/_/  /_/\___\_\/_/   /_/     
 | 
			
		||||
        /_/                              /____/                                                  
 | 
			
		||||
   ____  ____________
 | 
			
		||||
  / __ \/_  __/_  __/
 | 
			
		||||
 / / / / / /   / /   
 | 
			
		||||
/ /_/ / / /   / /    
 | 
			
		||||
\___\_\/_/   /_/     
 | 
			
		||||
                     
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ___                     __               ______                          
 | 
			
		||||
   /   |  ____  ____ ______/ /_  ___        / ____/___ _______________ _____ 
 | 
			
		||||
  / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ /   / __ `/ ___/ ___/ __ `/ __ \
 | 
			
		||||
 / ___ |/ /_/ / /_/ / /__/ / / /  __/_____/ /___/ /_/ (__  |__  ) /_/ / / / /
 | 
			
		||||
/_/  |_/ .___/\__,_/\___/_/ /_/\___/      \____/\__,_/____/____/\__,_/_/ /_/ 
 | 
			
		||||
    ___                     __               ______                                __          
 | 
			
		||||
   /   |  ____  ____ ______/ /_  ___        / ____/___ _______________ _____  ____/ /________ _
 | 
			
		||||
  / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ /   / __ `/ ___/ ___/ __ `/ __ \/ __  / ___/ __ `/
 | 
			
		||||
 / ___ |/ /_/ / /_/ / /__/ / / /  __/_____/ /___/ /_/ (__  |__  ) /_/ / / / / /_/ / /  / /_/ / 
 | 
			
		||||
/_/  |_/ .___/\__,_/\___/_/ /_/\___/      \____/\__,_/____/____/\__,_/_/ /_/\__,_/_/   \__,_/  
 | 
			
		||||
      /_/                                                                                      
 | 
			
		||||
       __          
 | 
			
		||||
  ____/ /________ _
 | 
			
		||||
 / __  / ___/ __ `/
 | 
			
		||||
/ /_/ / /  / /_/ / 
 | 
			
		||||
\__,_/_/   \__,_/  
 | 
			
		||||
                   
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ___                     __               ______                 __    ____ 
 | 
			
		||||
   /   |  ____  ____ ______/ /_  ___        / ____/___  __  _______/ /_  / __ \
 | 
			
		||||
  / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ /   / __ \/ / / / ___/ __ \/ / / /
 | 
			
		||||
 / ___ |/ /_/ / /_/ / /__/ / / /  __/_____/ /___/ /_/ / /_/ / /__/ / / / /_/ / 
 | 
			
		||||
/_/  |_/ .___/\__,_/\___/_/ /_/\___/      \____/\____/\__,_/\___/_/ /_/_____/  
 | 
			
		||||
    ___                     __               ______                 __    ____  ____ 
 | 
			
		||||
   /   |  ____  ____ ______/ /_  ___        / ____/___  __  _______/ /_  / __ \/ __ )
 | 
			
		||||
  / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ /   / __ \/ / / / ___/ __ \/ / / / __  |
 | 
			
		||||
 / ___ |/ /_/ / /_/ / /__/ / / /  __/_____/ /___/ /_/ / /_/ / /__/ / / / /_/ / /_/ / 
 | 
			
		||||
/_/  |_/ .___/\__,_/\___/_/ /_/\___/      \____/\____/\__,_/\___/_/ /_/_____/_____/  
 | 
			
		||||
      /_/                                                                            
 | 
			
		||||
    ____ 
 | 
			
		||||
   / __ )
 | 
			
		||||
  / __  |
 | 
			
		||||
 / /_/ / 
 | 
			
		||||
/_____/  
 | 
			
		||||
         
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ___                     __               ______                      
 | 
			
		||||
   /   |  ____  ____ ______/ /_  ___        / ____/_  ______ __________ _
 | 
			
		||||
  / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ / __/ / / / __ `/ ___/ __ `/
 | 
			
		||||
 / ___ |/ /_/ / /_/ / /__/ / / /  __/_____/ /_/ / /_/ / /_/ / /__/ /_/ / 
 | 
			
		||||
/_/  |_/ .___/\__,_/\___/_/ /_/\___/      \____/\__,_/\__,_/\___/\__,_/  
 | 
			
		||||
    ___                     __               ______                                       __   
 | 
			
		||||
   /   |  ____  ____ ______/ /_  ___        / ____/_  ______ __________ _____ ___  ____  / /__ 
 | 
			
		||||
  / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ / __/ / / / __ `/ ___/ __ `/ __ `__ \/ __ \/ / _ \
 | 
			
		||||
 / ___ |/ /_/ / /_/ / /__/ / / /  __/_____/ /_/ / /_/ / /_/ / /__/ /_/ / / / / / / /_/ / /  __/
 | 
			
		||||
/_/  |_/ .___/\__,_/\___/_/ /_/\___/      \____/\__,_/\__,_/\___/\__,_/_/ /_/ /_/\____/_/\___/ 
 | 
			
		||||
      /_/                                                                                      
 | 
			
		||||
                    __   
 | 
			
		||||
   ____ ___  ____  / /__ 
 | 
			
		||||
  / __ `__ \/ __ \/ / _ \
 | 
			
		||||
 / / / / / / /_/ / /  __/
 | 
			
		||||
/_/ /_/ /_/\____/_/\___/ 
 | 
			
		||||
                         
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
   ________                         
 | 
			
		||||
  / ____/ /_  ____ _____  ____ ____ 
 | 
			
		||||
 / /   / __ \/ __ `/ __ \/ __ `/ _ \
 | 
			
		||||
/ /___/ / / / /_/ / / / / /_/ /  __/
 | 
			
		||||
\____/_/ /_/\__,_/_/ /_/\__, /\___/ 
 | 
			
		||||
   ________                              ____       __            __  _           
 | 
			
		||||
  / ____/ /_  ____ _____  ____ ____     / __ \___  / /____  _____/ /_(_)___  ____ 
 | 
			
		||||
 / /   / __ \/ __ `/ __ \/ __ `/ _ \   / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \
 | 
			
		||||
/ /___/ / / / /_/ / / / / /_/ /  __/  / /_/ /  __/ /_/  __/ /__/ /_/ / /_/ / / / /
 | 
			
		||||
\____/_/ /_/\__,_/_/ /_/\__, /\___/  /_____/\___/\__/\___/\___/\__/_/\____/_/ /_/ 
 | 
			
		||||
                       /____/                                                     
 | 
			
		||||
    ____       __            __  _           
 | 
			
		||||
   / __ \___  / /____  _____/ /_(_)___  ____ 
 | 
			
		||||
  / / / / _ \/ __/ _ \/ ___/ __/ / __ \/ __ \
 | 
			
		||||
 / /_/ /  __/ /_/  __/ /__/ /_/ / /_/ / / / /
 | 
			
		||||
/_____/\___/\__/\___/\___/\__/_/\____/_/ /_/ 
 | 
			
		||||
                                             
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ____        __             __     ___   _____ ____     _       __     __  
 | 
			
		||||
   / __ \____  / /_____  ___  / /_   /   | / ___// __ \   | |     / /__  / /_ 
 | 
			
		||||
  / / / / __ \/ __/ __ \/ _ \/ __/  / /| | \__ \/ /_/ /   | | /| / / _ \/ __ \
 | 
			
		||||
 / /_/ / /_/ / /_/ / / /  __/ /_   / ___ |___/ / ____/    | |/ |/ /  __/ /_/ /
 | 
			
		||||
/_____/\____/\__/_/ /_/\___/\__/  /_/  |_/____/_/         |__/|__/\___/_.___/ 
 | 
			
		||||
                                                                              
 | 
			
		||||
    ___    ____  ____
 | 
			
		||||
   /   |  / __ \/  _/
 | 
			
		||||
  / /| | / /_/ // /  
 | 
			
		||||
 / ___ |/ ____// /   
 | 
			
		||||
/_/  |_/_/   /___/   
 | 
			
		||||
    ____        __             __     ___   _____ ____     _       __     __       ___    ____  ____
 | 
			
		||||
   / __ \____  / /_____  ___  / /_   /   | / ___// __ \   | |     / /__  / /_     /   |  / __ \/  _/
 | 
			
		||||
  / / / / __ \/ __/ __ \/ _ \/ __/  / /| | \__ \/ /_/ /   | | /| / / _ \/ __ \   / /| | / /_/ // /  
 | 
			
		||||
 / /_/ / /_/ / /_/ / / /  __/ /_   / ___ |___/ / ____/    | |/ |/ /  __/ /_/ /  / ___ |/ ____// /   
 | 
			
		||||
/_____/\____/\__/_/ /_/\___/\__/  /_/  |_/____/_/         |__/|__/\___/_.___/  /_/  |_/_/   /___/   
 | 
			
		||||
                                                                                                    
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/elementsynapse
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/elementsynapse
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ________                          __     _____                                 
 | 
			
		||||
   / ____/ /__  ____ ___  ___  ____  / /_   / ___/__  ______  ____ _____  ________ 
 | 
			
		||||
  / __/ / / _ \/ __ `__ \/ _ \/ __ \/ __/   \__ \/ / / / __ \/ __ `/ __ \/ ___/ _ \
 | 
			
		||||
 / /___/ /  __/ / / / / /  __/ / / / /_    ___/ / /_/ / / / / /_/ / /_/ (__  )  __/
 | 
			
		||||
/_____/_/\___/_/ /_/ /_/\___/_/ /_/\__/   /____/\__, /_/ /_/\__,_/ .___/____/\___/ 
 | 
			
		||||
                                               /____/           /_/                
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    __  __     _               __      ____      ____             __    __  
 | 
			
		||||
   / / / /__  (_)___ ___  ____/ /___ _/ / /     / __ \____ ______/ /_  / /_ 
 | 
			
		||||
  / /_/ / _ \/ / __ `__ \/ __  / __ `/ / /_____/ / / / __ `/ ___/ __ \/ __ \
 | 
			
		||||
 / __  /  __/ / / / / / / /_/ / /_/ / / /_____/ /_/ / /_/ (__  ) / / / /_/ /
 | 
			
		||||
/_/ /_/\___/_/_/ /_/ /_/\__,_/\__,_/_/_/     /_____/\__,_/____/_/ /_/_.___/ 
 | 
			
		||||
                                                                            
 | 
			
		||||
                        __
 | 
			
		||||
  ____  ____ __________/ /
 | 
			
		||||
 / __ \/ __ `/ ___/ __  / 
 | 
			
		||||
/ /_/ / /_/ / /  / /_/ /  
 | 
			
		||||
\____/\__,_/_/   \__,_/   
 | 
			
		||||
    __  __     _               __      ____      ____             __    __                         __
 | 
			
		||||
   / / / /__  (_)___ ___  ____/ /___ _/ / /     / __ \____ ______/ /_  / /_  ____  ____ __________/ /
 | 
			
		||||
  / /_/ / _ \/ / __ `__ \/ __  / __ `/ / /_____/ / / / __ `/ ___/ __ \/ __ \/ __ \/ __ `/ ___/ __  / 
 | 
			
		||||
 / __  /  __/ / / / / / / /_/ / /_/ / / /_____/ /_/ / /_/ (__  ) / / / /_/ / /_/ / /_/ / /  / /_/ /  
 | 
			
		||||
/_/ /_/\___/_/_/ /_/ /_/\__,_/\__,_/_/_/     /_____/\__,_/____/_/ /_/_.___/\____/\__,_/_/   \__,_/   
 | 
			
		||||
                                                                                                     
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    __  __                   
 | 
			
		||||
   / / / /___  ____ ___  ___ 
 | 
			
		||||
  / /_/ / __ \/ __ `__ \/ _ \
 | 
			
		||||
 / __  / /_/ / / / / / /  __/
 | 
			
		||||
/_/ /_/\____/_/ /_/ /_/\___/ 
 | 
			
		||||
                             
 | 
			
		||||
    ___              _      __              __        ______              
 | 
			
		||||
   /   |  __________(_)____/ /_____ _____  / /_      / ____/___  ________ 
 | 
			
		||||
  / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/_____/ /   / __ \/ ___/ _ \
 | 
			
		||||
 / ___ |(__  |__  ) (__  ) /_/ /_/ / / / / /_/_____/ /___/ /_/ / /  /  __/
 | 
			
		||||
/_/  |_/____/____/_/____/\__/\__,_/_/ /_/\__/      \____/\____/_/   \___/ 
 | 
			
		||||
    __  __                        ___              _      __              __        ______              
 | 
			
		||||
   / / / /___  ____ ___  ___     /   |  __________(_)____/ /_____ _____  / /_      / ____/___  ________ 
 | 
			
		||||
  / /_/ / __ \/ __ `__ \/ _ \   / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/_____/ /   / __ \/ ___/ _ \
 | 
			
		||||
 / __  / /_/ / / / / / /  __/  / ___ |(__  |__  ) (__  ) /_/ /_/ / / / / /_/_____/ /___/ /_/ / /  /  __/
 | 
			
		||||
/_/ /_/\____/_/ /_/ /_/\___/  /_/  |_/____/____/_/____/\__/\__,_/_/ /_/\__/      \____/\____/_/   \___/ 
 | 
			
		||||
                                                                                                        
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    _   __      _               ____                       
 | 
			
		||||
   / | / /___ _(_)___  _  __   / __ \_________  _  ____  __
 | 
			
		||||
  /  |/ / __ `/ / __ \| |/_/  / /_/ / ___/ __ \| |/_/ / / /
 | 
			
		||||
 / /|  / /_/ / / / / />  <   / ____/ /  / /_/ />  </ /_/ / 
 | 
			
		||||
/_/ |_/\__, /_/_/ /_/_/|_|  /_/   /_/   \____/_/|_|\__, /  
 | 
			
		||||
      /____/                                      /____/   
 | 
			
		||||
    __  ___                                 
 | 
			
		||||
   /  |/  /___ _____  ____ _____ ____  _____
 | 
			
		||||
  / /|_/ / __ `/ __ \/ __ `/ __ `/ _ \/ ___/
 | 
			
		||||
 / /  / / /_/ / / / / /_/ / /_/ /  __/ /    
 | 
			
		||||
/_/  /_/\__,_/_/ /_/\__,_/\__, /\___/_/     
 | 
			
		||||
                         /____/             
 | 
			
		||||
    _   __      _               ____                           __  ___                                 
 | 
			
		||||
   / | / /___ _(_)___  _  __   / __ \_________  _  ____  __   /  |/  /___ _____  ____ _____ ____  _____
 | 
			
		||||
  /  |/ / __ `/ / __ \| |/_/  / /_/ / ___/ __ \| |/_/ / / /  / /|_/ / __ `/ __ \/ __ `/ __ `/ _ \/ ___/
 | 
			
		||||
 / /|  / /_/ / / / / />  <   / ____/ /  / /_/ />  </ /_/ /  / /  / / /_/ / / / / /_/ / /_/ /  __/ /    
 | 
			
		||||
/_/ |_/\__, /_/_/ /_/_/|_|  /_/   /_/   \____/_/|_|\__, /  /_/  /_/\__,_/_/ /_/\__,_/\__, /\___/_/     
 | 
			
		||||
      /____/                                      /____/                            /____/             
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
    ____  ____ _____
 | 
			
		||||
   / __ \/ __ ) ___/
 | 
			
		||||
  / /_/ / __  \__ \ 
 | 
			
		||||
 / ____/ /_/ /__/ / 
 | 
			
		||||
/_/   /_____/____/  
 | 
			
		||||
                    
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ____            __                            __  __                   
 | 
			
		||||
   / __ \____  ____/ /___ ___  ____ _____        / / / /___  ____ ___  ___ 
 | 
			
		||||
  / /_/ / __ \/ __  / __ `__ \/ __ `/ __ \______/ /_/ / __ \/ __ `__ \/ _ \
 | 
			
		||||
 / ____/ /_/ / /_/ / / / / / / /_/ / / / /_____/ __  / /_/ / / / / / /  __/
 | 
			
		||||
/_/    \____/\__,_/_/ /_/ /_/\__,_/_/ /_/     /_/ /_/\____/_/ /_/ /_/\___/ 
 | 
			
		||||
                                                                           
 | 
			
		||||
    ___              _      __              __ 
 | 
			
		||||
   /   |  __________(_)____/ /_____ _____  / /_
 | 
			
		||||
  / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/
 | 
			
		||||
 / ___ |(__  |__  ) (__  ) /_/ /_/ / / / / /_  
 | 
			
		||||
/_/  |_/____/____/_/____/\__/\__,_/_/ /_/\__/  
 | 
			
		||||
    ____            __                            __  __                        ___              _      __              __ 
 | 
			
		||||
   / __ \____  ____/ /___ ___  ____ _____        / / / /___  ____ ___  ___     /   |  __________(_)____/ /_____ _____  / /_
 | 
			
		||||
  / /_/ / __ \/ __  / __ `__ \/ __ `/ __ \______/ /_/ / __ \/ __ `__ \/ _ \   / /| | / ___/ ___/ / ___/ __/ __ `/ __ \/ __/
 | 
			
		||||
 / ____/ /_/ / /_/ / / / / / / /_/ / / / /_____/ __  / /_/ / / / / / /  __/  / ___ |(__  |__  ) (__  ) /_/ /_/ / / / / /_  
 | 
			
		||||
/_/    \____/\__,_/_/ /_/ /_/\__,_/_/ /_/     /_/ /_/\____/_/ /_/ /_/\___/  /_/  |_/____/____/_/____/\__/\__,_/_/ /_/\__/  
 | 
			
		||||
                                                                                                                           
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/privatebin
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/privatebin
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____       _             __       ____  _     
 | 
			
		||||
   / __ \_____(_)   ______ _/ /____  / __ )(_)___ 
 | 
			
		||||
  / /_/ / ___/ / | / / __ `/ __/ _ \/ __  / / __ \
 | 
			
		||||
 / ____/ /  / /| |/ / /_/ / /_/  __/ /_/ / / / / /
 | 
			
		||||
/_/   /_/  /_/ |___/\__,_/\__/\___/_____/_/_/ /_/ 
 | 
			
		||||
                                                  
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ____                            __  __                          ___    __
 | 
			
		||||
   / __ \_________  ____ ___  ___  / /_/ /_  ___  __  _______      /   |  / /
 | 
			
		||||
  / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /| | / / 
 | 
			
		||||
 / ____/ /  / /_/ / / / / / /  __/ /_/ / / /  __/ /_/ (__  )_____/ ___ |/ /  
 | 
			
		||||
/_/   /_/   \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/     /_/  |_/_/   
 | 
			
		||||
                                                                             
 | 
			
		||||
             __                                             
 | 
			
		||||
  ___  _____/ /_____ ___  ____ _____  ____ _____ ____  _____
 | 
			
		||||
 / _ \/ ___/ __/ __ `__ \/ __ `/ __ \/ __ `/ __ `/ _ \/ ___/
 | 
			
		||||
/  __/ /  / /_/ / / / / / /_/ / / / / /_/ / /_/ /  __/ /    
 | 
			
		||||
\___/_/   \__/_/ /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/     
 | 
			
		||||
    ____                            __  __                          ___    __          __                                             
 | 
			
		||||
   / __ \_________  ____ ___  ___  / /_/ /_  ___  __  _______      /   |  / /__  _____/ /_____ ___  ____ _____  ____ _____ ____  _____
 | 
			
		||||
  / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /| | / / _ \/ ___/ __/ __ `__ \/ __ `/ __ \/ __ `/ __ `/ _ \/ ___/
 | 
			
		||||
 / ____/ /  / /_/ / / / / / /  __/ /_/ / / /  __/ /_/ (__  )_____/ ___ |/ /  __/ /  / /_/ / / / / / /_/ / / / / /_/ / /_/ /  __/ /    
 | 
			
		||||
/_/   /_/   \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/     /_/  |_/_/\___/_/   \__/_/ /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/_/     
 | 
			
		||||
                                                                                                                   /____/             
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
    ____                            __  __                          ____ 
 | 
			
		||||
   / __ \_________  ____ ___  ___  / /_/ /_  ___  __  _______      / __ \
 | 
			
		||||
  / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /_/ /
 | 
			
		||||
 / ____/ /  / /_/ / / / / / /  __/ /_/ / / /  __/ /_/ (__  )_____/ ____/ 
 | 
			
		||||
/_/   /_/   \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/     /_/      
 | 
			
		||||
                                                                         
 | 
			
		||||
 _    ________     ______                      __           
 | 
			
		||||
| |  / / ____/    / ____/  ______  ____  _____/ /____  _____
 | 
			
		||||
| | / / __/______/ __/ | |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
 | 
			
		||||
| |/ / /__/_____/ /____>  </ /_/ / /_/ / /  / /_/  __/ /    
 | 
			
		||||
|___/_____/    /_____/_/|_/ .___/\____/_/   \__/\___/_/     
 | 
			
		||||
    ____                            __  __                          ____ _    ________     ______                      __           
 | 
			
		||||
   / __ \_________  ____ ___  ___  / /_/ /_  ___  __  _______      / __ \ |  / / ____/    / ____/  ______  ____  _____/ /____  _____
 | 
			
		||||
  / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /_/ / | / / __/______/ __/ | |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
 | 
			
		||||
 / ____/ /  / /_/ / / / / / /  __/ /_/ / / /  __/ /_/ (__  )_____/ ____/| |/ / /__/_____/ /____>  </ /_/ / /_/ / /  / /_/  __/ /    
 | 
			
		||||
/_/   /_/   \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/     /_/     |___/_____/    /_____/_/|_/ .___/\____/_/   \__/\___/_/     
 | 
			
		||||
                                                                                                 /_/                                
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/proxmox-backup-server
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/proxmox-backup-server
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____                                             ____             __                    _____                          
 | 
			
		||||
   / __ \_________  _  ______ ___  ____  _  __      / __ )____ ______/ /____  ______       / ___/___  ______   _____  _____
 | 
			
		||||
  / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/_____/ __  / __ `/ ___/ //_/ / / / __ \______\__ \/ _ \/ ___/ | / / _ \/ ___/
 | 
			
		||||
 / ____/ /  / /_/ />  </ / / / / / /_/ />  </_____/ /_/ / /_/ / /__/ ,< / /_/ / /_/ /_____/__/ /  __/ /   | |/ /  __/ /    
 | 
			
		||||
/_/   /_/   \____/_/|_/_/ /_/ /_/\____/_/|_|     /_____/\__,_/\___/_/|_|\__,_/ .___/     /____/\___/_/    |___/\___/_/     
 | 
			
		||||
                                                                            /_/                                            
 | 
			
		||||
@@ -1,18 +1,6 @@
 | 
			
		||||
                                                          __      __       
 | 
			
		||||
    ____  _________  _  ______ ___  ____  _  __      ____/ /___ _/ /_____ _
 | 
			
		||||
   / __ \/ ___/ __ \| |/_/ __ `__ \/ __ \| |/_/_____/ __  / __ `/ __/ __ `/
 | 
			
		||||
  / /_/ / /  / /_/ />  </ / / / / / /_/ />  </_____/ /_/ / /_/ / /_/ /_/ / 
 | 
			
		||||
 / .___/_/   \____/_/|_/_/ /_/ /_/\____/_/|_|      \__,_/\__,_/\__/\__,_/  
 | 
			
		||||
/_/                                                                        
 | 
			
		||||
                   __                                                       
 | 
			
		||||
  ________  ____  / /____  _____      ____ ___  ____ _____  ____ _____ ____ 
 | 
			
		||||
 / ___/ _ \/ __ \/ __/ _ \/ ___/_____/ __ `__ \/ __ `/ __ \/ __ `/ __ `/ _ \
 | 
			
		||||
/ /__/  __/ / / / /_/  __/ /  /_____/ / / / / / /_/ / / / / /_/ / /_/ /  __/
 | 
			
		||||
\___/\___/_/ /_/\__/\___/_/        /_/ /_/ /_/\__,_/_/ /_/\__,_/\__, /\___/ 
 | 
			
		||||
    ____                                             ____        __                        __                  __  ___                                 
 | 
			
		||||
   / __ \_________  _  ______ ___  ____  _  __      / __ \____ _/ /_____ _________  ____  / /____  _____      /  |/  /___ _____  ____ _____ ____  _____
 | 
			
		||||
  / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/_____/ / / / __ `/ __/ __ `/ ___/ _ \/ __ \/ __/ _ \/ ___/_____/ /|_/ / __ `/ __ \/ __ `/ __ `/ _ \/ ___/
 | 
			
		||||
 / ____/ /  / /_/ />  </ / / / / / /_/ />  </_____/ /_/ / /_/ / /_/ /_/ / /__/  __/ / / / /_/  __/ /  /_____/ /  / / /_/ / / / / /_/ / /_/ /  __/ /    
 | 
			
		||||
/_/   /_/   \____/_/|_/_/ /_/ /_/\____/_/|_|     /_____/\__,_/\__/\__,_/\___/\___/_/ /_/\__/\___/_/        /_/  /_/\__,_/_/ /_/\__,_/\__, /\___/_/     
 | 
			
		||||
                                                                                                                                    /____/             
 | 
			
		||||
        
 | 
			
		||||
   _____
 | 
			
		||||
  / ___/
 | 
			
		||||
 / /    
 | 
			
		||||
/_/     
 | 
			
		||||
        
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
   _____ ____    __       _____                          
 | 
			
		||||
  / ___// __ \  / /      / ___/___  ______   _____  _____
 | 
			
		||||
  \__ \/ / / / / /       \__ \/ _ \/ ___/ | / / _ \/ ___/
 | 
			
		||||
 ___/ / /_/ / / /___    ___/ /  __/ /   | |/ /  __/ /    
 | 
			
		||||
/____/\___\_\/_____/   /____/\___/_/    |___/\___/_/     
 | 
			
		||||
                                                         
 | 
			
		||||
   ___   ____ ___  ___ 
 | 
			
		||||
  |__ \ / __ \__ \|__ \
 | 
			
		||||
  __/ // / / /_/ /__/ /
 | 
			
		||||
 / __// /_/ / __// __/ 
 | 
			
		||||
/____/\____/____/____/ 
 | 
			
		||||
   _____ ____    __       _____                              ___   ____ ___  ___ 
 | 
			
		||||
  / ___// __ \  / /      / ___/___  ______   _____  _____   |__ \ / __ \__ \|__ \
 | 
			
		||||
  \__ \/ / / / / /       \__ \/ _ \/ ___/ | / / _ \/ ___/   __/ // / / /_/ /__/ /
 | 
			
		||||
 ___/ / /_/ / / /___    ___/ /  __/ /   | |/ /  __/ /      / __// /_/ / __// __/ 
 | 
			
		||||
/____/\___\_\/_____/   /____/\___/_/    |___/\___/_/      /____/\____/____/____/ 
 | 
			
		||||
                                                                                 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
   __  __     ____             __             
 | 
			
		||||
  / / / /____/ __ )____ ______/ /____  ______ 
 | 
			
		||||
 / / / / ___/ __  / __ `/ ___/ //_/ / / / __ \
 | 
			
		||||
/ /_/ / /  / /_/ / /_/ / /__/ ,< / /_/ / /_/ /
 | 
			
		||||
\____/_/  /_____/\__,_/\___/_/|_|\__,_/ .___/ 
 | 
			
		||||
   __  __     ____             __                  _____                          
 | 
			
		||||
  / / / /____/ __ )____ ______/ /____  ______     / ___/___  ______   _____  _____
 | 
			
		||||
 / / / / ___/ __  / __ `/ ___/ //_/ / / / __ \    \__ \/ _ \/ ___/ | / / _ \/ ___/
 | 
			
		||||
/ /_/ / /  / /_/ / /_/ / /__/ ,< / /_/ / /_/ /   ___/ /  __/ /   | |/ /  __/ /    
 | 
			
		||||
\____/_/  /_____/\__,_/\___/_/|_|\__,_/ .___/   /____/\___/_/    |___/\___/_/     
 | 
			
		||||
                                     /_/                                          
 | 
			
		||||
   _____                          
 | 
			
		||||
  / ___/___  ______   _____  _____
 | 
			
		||||
  \__ \/ _ \/ ___/ | / / _ \/ ___/
 | 
			
		||||
 ___/ /  __/ /   | |/ /  __/ /    
 | 
			
		||||
/____/\___/_/    |___/\___/_/     
 | 
			
		||||
                                  
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ APP="Hoarder"
 | 
			
		||||
var_tags="bookmark"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="4096"
 | 
			
		||||
var_disk="8"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
@@ -39,6 +39,9 @@ function update_script() {
 | 
			
		||||
    systemctl stop hoarder-web hoarder-workers hoarder-browser
 | 
			
		||||
    msg_ok "Stopped Services"
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    if [[ $(corepack -v) < "0.31.0" ]]; then
 | 
			
		||||
      npm install -g corepack@0.31.0 &>/dev/null
 | 
			
		||||
    fi
 | 
			
		||||
    cd /opt
 | 
			
		||||
    if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then
 | 
			
		||||
      mkdir -p /etc/hoarder
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								ct/privatebin.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								ct/privatebin.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
#!/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: Nícolas Pastorello (opastorello)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="PrivateBin"
 | 
			
		||||
var_tags="paste;secure"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/privatebin ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/PrivateBin/PrivateBin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    cp -f /opt/privatebin/cfg/conf.php /tmp/privatebin_conf.bak
 | 
			
		||||
    wget -q "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${RELEASE}.zip"
 | 
			
		||||
    unzip -q ${RELEASE}.zip
 | 
			
		||||
    rm -rf /opt/privatebin/*
 | 
			
		||||
    mv PrivateBin-${RELEASE}/* /opt/privatebin/
 | 
			
		||||
    mv /tmp/privatebin_conf.bak /opt/privatebin/cfg/conf.php
 | 
			
		||||
    chown -R www-data:www-data /opt/privatebin
 | 
			
		||||
    chmod -R 0755 /opt/privatebin/data
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    rm -rf ${RELEASE}.zip PrivateBin-${RELEASE}
 | 
			
		||||
    systemctl reload nginx php8.2-fpm
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
  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}https://${IP}${CL}"
 | 
			
		||||
@@ -16,7 +16,7 @@ cat <<"EOF"
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
header_info
 | 
			
		||||
APP="PBS"
 | 
			
		||||
APP="Proxmox-Backup-Server"
 | 
			
		||||
var_tags="backup"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
@@ -37,7 +37,7 @@ function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
 | 
			
		||||
    if [[ ! -e /usr/sbin/proxmox-backup-manager ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
 | 
			
		||||
        msg_info "Updating $APP LXC"
 | 
			
		||||
        apt-get update &>/dev/null
 | 
			
		||||
        apt-get -y upgrade &>/dev/null
 | 
			
		||||
@@ -6,7 +6,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
# Source: Proxmox Server Solution GmbH
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="proxmox-datacenter-manager"
 | 
			
		||||
APP="Proxmox-Datacenter-Manager"
 | 
			
		||||
var_tags="datacenter"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,7 @@ function update_script() {
 | 
			
		||||
    unzip -q v${RELEASE}.zip
 | 
			
		||||
    mv tianji-${RELEASE} /opt/tianji
 | 
			
		||||
    cd tianji
 | 
			
		||||
    export NODE_OPTIONS="--max_old_space_size=4096"
 | 
			
		||||
    pnpm install --filter @tianji/client... --config.dedupe-peer-dependents=false --frozen-lockfile >/dev/null 2>&1
 | 
			
		||||
    pnpm build:static >/dev/null 2>&1
 | 
			
		||||
    pnpm install --filter @tianji/server... --config.dedupe-peer-dependents=false >/dev/null 2>&1
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,9 @@ start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
pct set $CTID -features fuse=1,nesting=1
 | 
			
		||||
pct reboot $CTID
 | 
			
		||||
 | 
			
		||||
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 IP:${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +1,9 @@
 | 
			
		||||
"use client";
 | 
			
		||||
 | 
			
		||||
import ApplicationChart from "@/components/ApplicationChart";
 | 
			
		||||
import { Button } from "@/components/ui/button";
 | 
			
		||||
import { Calendar } from "@/components/ui/calendar";
 | 
			
		||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
 | 
			
		||||
import { Input } from "@/components/ui/input";
 | 
			
		||||
import {
 | 
			
		||||
  Popover,
 | 
			
		||||
  PopoverContent,
 | 
			
		||||
  PopoverTrigger,
 | 
			
		||||
} from "@/components/ui/popover";
 | 
			
		||||
import {
 | 
			
		||||
  Select,
 | 
			
		||||
  SelectContent,
 | 
			
		||||
  SelectItem,
 | 
			
		||||
  SelectTrigger,
 | 
			
		||||
  SelectValue,
 | 
			
		||||
} from "@/components/ui/select";
 | 
			
		||||
import {
 | 
			
		||||
  Table,
 | 
			
		||||
  TableBody,
 | 
			
		||||
  TableCell,
 | 
			
		||||
  TableHead,
 | 
			
		||||
  TableHeader,
 | 
			
		||||
  TableRow,
 | 
			
		||||
} from "@/components/ui/table";
 | 
			
		||||
import { format } from "date-fns";
 | 
			
		||||
import { Calendar as CalendarIcon } from "lucide-react";
 | 
			
		||||
import React, { useCallback, useEffect, useState } from "react";
 | 
			
		||||
import React, { useEffect, useState } from "react";
 | 
			
		||||
import DatePicker from 'react-datepicker';
 | 
			
		||||
import 'react-datepicker/dist/react-datepicker.css';
 | 
			
		||||
import ApplicationChart from "../../components/ApplicationChart";
 | 
			
		||||
 | 
			
		||||
interface DataModel {
 | 
			
		||||
  id: number;
 | 
			
		||||
@@ -35,18 +11,16 @@ interface DataModel {
 | 
			
		||||
  disk_size: number;
 | 
			
		||||
  core_count: number;
 | 
			
		||||
  ram_size: number;
 | 
			
		||||
  verbose: string;
 | 
			
		||||
  os_type: string;
 | 
			
		||||
  os_version: string;
 | 
			
		||||
  hn: string;
 | 
			
		||||
  disableip6: string;
 | 
			
		||||
  ssh: string;
 | 
			
		||||
  tags: string;
 | 
			
		||||
  nsapp: string;
 | 
			
		||||
  created_at: string;
 | 
			
		||||
  method: string;
 | 
			
		||||
  pve_version: string;
 | 
			
		||||
  status: string;
 | 
			
		||||
  error: string;
 | 
			
		||||
  type: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -60,45 +34,27 @@ const DataFetcher: React.FC = () => {
 | 
			
		||||
  const [sortConfig, setSortConfig] = useState<{ key: keyof DataModel | null, direction: 'ascending' | 'descending' }>({ key: 'id', direction: 'descending' });
 | 
			
		||||
  const [itemsPerPage, setItemsPerPage] = useState(25);
 | 
			
		||||
  const [currentPage, setCurrentPage] = useState(1);
 | 
			
		||||
  const [interval, setIntervalTime] = useState<number>(10); // Default interval 10 seconds
 | 
			
		||||
  const [reloadInterval, setReloadInterval] = useState<NodeJS.Timeout | null>(null);
 | 
			
		||||
 | 
			
		||||
  const [showErrorRow, setShowErrorRow] = useState<number | null>(null);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  const fetchData = useCallback(async () => {
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    const fetchData = async () => {
 | 
			
		||||
      try {
 | 
			
		||||
        const response = await fetch("https://api.htl-braunau.at/data/json");
 | 
			
		||||
      if (!response.ok) throw new Error(`Failed to fetch data: ${response.statusText}`);
 | 
			
		||||
        if (!response.ok) throw new Error("Failed to fetch data: ${response.statusText}");
 | 
			
		||||
        const result: DataModel[] = await response.json();
 | 
			
		||||
        setData(result);
 | 
			
		||||
      setLoading(false);
 | 
			
		||||
      } catch (err) {
 | 
			
		||||
        setError((err as Error).message);
 | 
			
		||||
      } finally {
 | 
			
		||||
        setLoading(false);
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    fetchData();
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    fetchData();
 | 
			
		||||
    const storedInterval = localStorage.getItem('reloadInterval');
 | 
			
		||||
    if (storedInterval) {
 | 
			
		||||
      setIntervalTime(Number(storedInterval));
 | 
			
		||||
    }
 | 
			
		||||
  }, [fetchData]);
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    let intervalId: NodeJS.Timeout | null = null;
 | 
			
		||||
    
 | 
			
		||||
    if (interval > 0) {
 | 
			
		||||
      intervalId = setInterval(fetchData, Math.max(interval, 10) * 1000);
 | 
			
		||||
      localStorage.setItem('reloadInterval', interval.toString());
 | 
			
		||||
    } else {
 | 
			
		||||
      localStorage.removeItem('reloadInterval');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return () => {
 | 
			
		||||
      if (intervalId) clearInterval(intervalId);
 | 
			
		||||
    };
 | 
			
		||||
  }, [interval, fetchData]);
 | 
			
		||||
 | 
			
		||||
  const filteredData = data.filter(item => {
 | 
			
		||||
    const matchesSearchQuery = Object.values(item).some(value =>
 | 
			
		||||
@@ -153,146 +109,110 @@ const DataFetcher: React.FC = () => {
 | 
			
		||||
    return `${day}.${month}.${year} ${hours}:${minutes} ${timezoneOffset} GMT`;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const handleItemsPerPageChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
 | 
			
		||||
    setItemsPerPage(Number(event.target.value));
 | 
			
		||||
    setCurrentPage(1);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const paginatedData = sortedData.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage);
 | 
			
		||||
 | 
			
		||||
  const statusCounts = data.reduce((acc, item) => {
 | 
			
		||||
    const status = item.status;
 | 
			
		||||
    acc[status] = (acc[status] || 0) + 1;
 | 
			
		||||
    return acc;
 | 
			
		||||
  }, {} as Record<string, number>);
 | 
			
		||||
 | 
			
		||||
  if (loading) return <div className="flex justify-center items-center h-screen">Loading...</div>;
 | 
			
		||||
  if (error) return <div className="flex justify-center items-center h-screen text-red-500">Error: {error}</div>;
 | 
			
		||||
  if (loading) return <p>Loading...</p>;
 | 
			
		||||
  if (error) return <p>Error: {error}</p>;
 | 
			
		||||
 | 
			
		||||
  var installingCounts: number = 0;
 | 
			
		||||
  var failedCounts: number = 0;
 | 
			
		||||
  var doneCounts: number = 0
 | 
			
		||||
  var unknownCounts: number = 0;
 | 
			
		||||
  data.forEach((item) => {
 | 
			
		||||
    if (item.status === "installing") {
 | 
			
		||||
      installingCounts += 1;
 | 
			
		||||
    } else if (item.status === "failed") {
 | 
			
		||||
      failedCounts += 1;
 | 
			
		||||
    }
 | 
			
		||||
    else if (item.status === "done") {
 | 
			
		||||
      doneCounts += 1;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      unknownCounts += 1;
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="container mx-auto p-6 pt-20 space-y-6">
 | 
			
		||||
      <h1 className="text-3xl font-bold text-center">Created LXCs</h1>
 | 
			
		||||
      
 | 
			
		||||
      <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
 | 
			
		||||
        <Card>
 | 
			
		||||
          <CardHeader className="pb-2">
 | 
			
		||||
            <CardTitle className="text-sm font-medium">Search</CardTitle>
 | 
			
		||||
          </CardHeader>
 | 
			
		||||
          <CardContent>
 | 
			
		||||
            <Input
 | 
			
		||||
    <div className="p-6 mt-20">
 | 
			
		||||
      <h1 className="text-2xl font-bold mb-4 text-center">Created LXCs</h1>
 | 
			
		||||
      <div className="mb-4 flex space-x-4">
 | 
			
		||||
        <div>
 | 
			
		||||
          <input
 | 
			
		||||
            type="text"
 | 
			
		||||
            placeholder="Search..."
 | 
			
		||||
            value={searchQuery}
 | 
			
		||||
            onChange={e => setSearchQuery(e.target.value)}
 | 
			
		||||
            className="p-2 border"
 | 
			
		||||
          />
 | 
			
		||||
          </CardContent>
 | 
			
		||||
        </Card>
 | 
			
		||||
 | 
			
		||||
        <Card>
 | 
			
		||||
          <CardHeader className="pb-2">
 | 
			
		||||
            <CardTitle className="text-sm font-medium">Start Date</CardTitle>
 | 
			
		||||
          </CardHeader>
 | 
			
		||||
          <CardContent>
 | 
			
		||||
            <Popover>
 | 
			
		||||
              <PopoverTrigger asChild>
 | 
			
		||||
                <Button variant="outline" className="w-full justify-start text-left font-normal">
 | 
			
		||||
                  <CalendarIcon className="mr-2 h-4 w-4" />
 | 
			
		||||
                  {startDate ? format(startDate, "PPP") : "Pick a date"}
 | 
			
		||||
                </Button>
 | 
			
		||||
              </PopoverTrigger>
 | 
			
		||||
              <PopoverContent className="w-auto p-0">
 | 
			
		||||
                <Calendar
 | 
			
		||||
                  mode="single"
 | 
			
		||||
                  selected={startDate || undefined}
 | 
			
		||||
                  onSelect={(date: Date | undefined) => setStartDate(date || null)}
 | 
			
		||||
                  initialFocus
 | 
			
		||||
          <label className="text-sm text-gray-600 mt-1 block">Search by keyword</label>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div>
 | 
			
		||||
          <DatePicker
 | 
			
		||||
            selected={startDate}
 | 
			
		||||
            onChange={date => setStartDate(date)}
 | 
			
		||||
            selectsStart
 | 
			
		||||
            startDate={startDate}
 | 
			
		||||
            endDate={endDate}
 | 
			
		||||
            placeholderText="Start date"
 | 
			
		||||
            className="p-2 border"
 | 
			
		||||
          />
 | 
			
		||||
              </PopoverContent>
 | 
			
		||||
            </Popover>
 | 
			
		||||
          </CardContent>
 | 
			
		||||
        </Card>
 | 
			
		||||
 | 
			
		||||
        <Card>
 | 
			
		||||
          <CardHeader className="pb-2">
 | 
			
		||||
            <CardTitle className="text-sm font-medium">End Date</CardTitle>
 | 
			
		||||
          </CardHeader>
 | 
			
		||||
          <CardContent>
 | 
			
		||||
            <Popover>
 | 
			
		||||
              <PopoverTrigger asChild>
 | 
			
		||||
                <Button variant="outline" className="w-full justify-start text-left font-normal">
 | 
			
		||||
                  <CalendarIcon className="mr-2 h-4 w-4" />
 | 
			
		||||
                  {endDate ? format(endDate, "PPP") : "Pick a date"}
 | 
			
		||||
                </Button>
 | 
			
		||||
              </PopoverTrigger>
 | 
			
		||||
              <PopoverContent className="w-auto p-0">
 | 
			
		||||
                <Calendar
 | 
			
		||||
                  mode="single"
 | 
			
		||||
                  selected={endDate || undefined}
 | 
			
		||||
                  onSelect={(date: Date | undefined) => setEndDate(date || null)}
 | 
			
		||||
                  initialFocus
 | 
			
		||||
                />
 | 
			
		||||
              </PopoverContent>
 | 
			
		||||
            </Popover>
 | 
			
		||||
          </CardContent>
 | 
			
		||||
        </Card>
 | 
			
		||||
        
 | 
			
		||||
        <Card>
 | 
			
		||||
          <CardHeader className="pb-2">
 | 
			
		||||
            <CardTitle className="text-sm font-medium">Reload Interval</CardTitle>
 | 
			
		||||
          </CardHeader>
 | 
			
		||||
          <CardContent>
 | 
			
		||||
            <Input
 | 
			
		||||
              type="number"
 | 
			
		||||
              value={interval}
 | 
			
		||||
              onChange={e => setIntervalTime(Number(e.target.value))}
 | 
			
		||||
              placeholder="Interval (seconds)"
 | 
			
		||||
            />
 | 
			
		||||
          </CardContent>
 | 
			
		||||
        </Card>
 | 
			
		||||
          <label className="text-sm text-gray-600 mt-1 block">Set a start date</label>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
          <DatePicker
 | 
			
		||||
            selected={endDate}
 | 
			
		||||
            onChange={date => setEndDate(date)}
 | 
			
		||||
            selectsEnd
 | 
			
		||||
            startDate={startDate}
 | 
			
		||||
            endDate={endDate}
 | 
			
		||||
            placeholderText="End date"
 | 
			
		||||
            className="p-2 border"
 | 
			
		||||
          />
 | 
			
		||||
          <label className="text-sm text-gray-600 mt-1 block">Set a end date</label>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <ApplicationChart data={filteredData} />
 | 
			
		||||
 | 
			
		||||
      <div className="flex justify-between items-center">
 | 
			
		||||
        <p className="text-lg font-medium">{filteredData.length} results found</p>
 | 
			
		||||
        <div className="flex gap-2 items-center">
 | 
			
		||||
          <span>🔄 Installing: {statusCounts.installing || 0}</span>
 | 
			
		||||
          <span>✔️ Completed: {statusCounts.done || 0}</span>
 | 
			
		||||
          <span>❌ Failed: {statusCounts.failed || 0}</span>
 | 
			
		||||
          <span>❓ Unknown: {statusCounts.unknown || 0}</span>
 | 
			
		||||
      <div className="mb-4 flex justify-between items-center">
 | 
			
		||||
        <p className="text-lg font-bold">{filteredData.length} results found</p>
 | 
			
		||||
        <p className="text-lg font">Status Legend: 🔄 installing {installingCounts} | ✔️ completetd {doneCounts} | ❌ failed {failedCounts} | ❓ unknown {unknownCounts}</p>
 | 
			
		||||
        <select value={itemsPerPage} onChange={handleItemsPerPageChange} className="p-2 border">
 | 
			
		||||
          <option value={25}>25</option>
 | 
			
		||||
          <option value={50}>50</option>
 | 
			
		||||
          <option value={100}>100</option>
 | 
			
		||||
          <option value={200}>200</option>
 | 
			
		||||
        </select>
 | 
			
		||||
      </div>
 | 
			
		||||
        <Select value={itemsPerPage.toString()} onValueChange={(value) => setItemsPerPage(Number(value))}>
 | 
			
		||||
          <SelectTrigger className="w-[180px]">
 | 
			
		||||
            <SelectValue placeholder="Items per page" />
 | 
			
		||||
          </SelectTrigger>
 | 
			
		||||
          <SelectContent>
 | 
			
		||||
            {[25, 50, 100, 200].map(value => (
 | 
			
		||||
              <SelectItem key={value} value={value.toString()}>
 | 
			
		||||
                {value} items
 | 
			
		||||
              </SelectItem>
 | 
			
		||||
            ))}
 | 
			
		||||
          </SelectContent>
 | 
			
		||||
        </Select>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div className="rounded-md border">
 | 
			
		||||
        <Table>
 | 
			
		||||
          <TableHeader>
 | 
			
		||||
            <TableRow>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('status')}>Status</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('nsapp')}>Application</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('os_type')}>OS</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('os_version')}>OS Version</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('disk_size')}>Disk Size</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('core_count')}>Core Count</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('ram_size')}>RAM Size</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('hn')}>Hostname</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('ssh')}>SSH</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('verbose')}>Verb</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('tags')}>Tags</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('method')}>Method</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('pve_version')}>PVE Version</TableHead>
 | 
			
		||||
              <TableHead className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('created_at')}>Created At</TableHead>
 | 
			
		||||
            </TableRow>
 | 
			
		||||
          </TableHeader>
 | 
			
		||||
          <TableBody>
 | 
			
		||||
      <div className="overflow-x-auto">
 | 
			
		||||
        <div className="overflow-y-auto lg:overflow-y-visible">
 | 
			
		||||
          <table className="min-w-full table-auto border-collapse">
 | 
			
		||||
            <thead>
 | 
			
		||||
              <tr>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('status')}>Status</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('type')}>Type</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('nsapp')}>Application</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('os_type')}>OS</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('os_version')}>OS Version</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('disk_size')}>Disk Size</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('core_count')}>Core Count</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('ram_size')}>RAM Size</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('method')}>Method</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('pve_version')}>PVE Version</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('error')}>Error Message</th>
 | 
			
		||||
                <th className="px-4 py-2 border-b cursor-pointer" onClick={() => requestSort('created_at')}>Created At</th>
 | 
			
		||||
              </tr>
 | 
			
		||||
            </thead>
 | 
			
		||||
            <tbody>
 | 
			
		||||
              {paginatedData.map((item, index) => (
 | 
			
		||||
              <TableRow key={index}>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.status === "done" ? (
 | 
			
		||||
                <tr key={index}>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">
 | 
			
		||||
                    {item.status === "done" ? (
 | 
			
		||||
                      "✔️"
 | 
			
		||||
                    ) : item.status === "failed" ? (
 | 
			
		||||
                      "❌"
 | 
			
		||||
@@ -300,47 +220,65 @@ const DataFetcher: React.FC = () => {
 | 
			
		||||
                      "🔄"
 | 
			
		||||
                    ) : (
 | 
			
		||||
                      item.status
 | 
			
		||||
                )}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.nsapp}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.os_type}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.os_version}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.disk_size}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.core_count}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.ram_size}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.hn}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.ssh}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.verbose}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.tags.replace(/;/g, ' ')}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.method}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{item.pve_version}</TableCell>
 | 
			
		||||
                <TableCell className="px-4 py-2 border-b">{formatDate(item.created_at)}</TableCell>
 | 
			
		||||
              </TableRow>
 | 
			
		||||
                    )}
 | 
			
		||||
                  </td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.type === "lxc" ? (
 | 
			
		||||
                    "📦"
 | 
			
		||||
                  ) : item.type === "vm" ? (
 | 
			
		||||
                    "🖥️"
 | 
			
		||||
                  ) : (
 | 
			
		||||
                    item.type
 | 
			
		||||
                  )}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.nsapp}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.os_type}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.os_version}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.disk_size}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.core_count}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.ram_size}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.method}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{item.pve_version}</td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">
 | 
			
		||||
                    {item.error && item.error !== "none" ? (
 | 
			
		||||
                      showErrorRow === index ? (
 | 
			
		||||
                        <>
 | 
			
		||||
                          {item.error}
 | 
			
		||||
                          <button onClick={() => setShowErrorRow(null)}>{item.error}</button>
 | 
			
		||||
                        </>
 | 
			
		||||
                      ) : (
 | 
			
		||||
                        <button onClick={() => setShowErrorRow(index)}>Click to show error</button>
 | 
			
		||||
                      )
 | 
			
		||||
                    ) : (
 | 
			
		||||
                      "none"
 | 
			
		||||
                    )}
 | 
			
		||||
                  </td>
 | 
			
		||||
                  <td className="px-4 py-2 border-b">{formatDate(item.created_at)}</td>
 | 
			
		||||
                </tr>
 | 
			
		||||
              ))}
 | 
			
		||||
          </TableBody>
 | 
			
		||||
        </Table>
 | 
			
		||||
            </tbody>
 | 
			
		||||
          </table>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
      <div className="flex items-center justify-center space-x-2">
 | 
			
		||||
        <Button
 | 
			
		||||
          variant="outline"
 | 
			
		||||
      </div>
 | 
			
		||||
      <div className="mt-4 flex justify-between items-center">
 | 
			
		||||
        <button
 | 
			
		||||
          onClick={() => setCurrentPage(prev => Math.max(prev - 1, 1))}
 | 
			
		||||
          disabled={currentPage === 1}
 | 
			
		||||
          className="p-2 border"
 | 
			
		||||
        >
 | 
			
		||||
          Previous
 | 
			
		||||
        </Button>
 | 
			
		||||
        <span className="text-sm">
 | 
			
		||||
          Page {currentPage} of {Math.ceil(sortedData.length / itemsPerPage)}
 | 
			
		||||
        </span>
 | 
			
		||||
        <Button
 | 
			
		||||
          variant="outline"
 | 
			
		||||
        </button>
 | 
			
		||||
        <span>Page {currentPage}</span>
 | 
			
		||||
        <button
 | 
			
		||||
          onClick={() => setCurrentPage(prev => (prev * itemsPerPage < sortedData.length ? prev + 1 : prev))}
 | 
			
		||||
          disabled={currentPage * itemsPerPage >= sortedData.length}
 | 
			
		||||
          className="p-2 border"
 | 
			
		||||
        >
 | 
			
		||||
          Next
 | 
			
		||||
        </Button>
 | 
			
		||||
        </button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default DataFetcher;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PostgreSQL Repository"
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ msg_ok "Installed Python 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"
 | 
			
		||||
 
 | 
			
		||||
@@ -81,12 +81,13 @@ $STD apt-get install -y nodejs
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Golang"
 | 
			
		||||
cd /tmp
 | 
			
		||||
set +o pipefail
 | 
			
		||||
GO_RELEASE=$(curl -s https://go.dev/dl/ | grep -o -m 1 "go.*\linux-amd64.tar.gz")
 | 
			
		||||
wget -q https://golang.org/dl/${GO_RELEASE}
 | 
			
		||||
tar -xzf ${GO_RELEASE} -C /usr/local
 | 
			
		||||
ln -s /usr/local/go/bin/go /usr/bin/go
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Installed Golang"
 | 
			
		||||
 | 
			
		||||
@@ -186,7 +187,6 @@ msg_info "Cleaning up"
 | 
			
		||||
rm -rf /tmp/Python-3.12.1
 | 
			
		||||
rm -rf /tmp/Python.tgz
 | 
			
		||||
rm -rf go/
 | 
			
		||||
rm -rf /tmp/${GO_RELEASE}
 | 
			
		||||
rm -rf /tmp/geoipupdate.deb
 | 
			
		||||
rm -rf authentik.tar.gz
 | 
			
		||||
$STD apt-get -y remove yq
 | 
			
		||||
 
 | 
			
		||||
@@ -33,14 +33,14 @@ msg_ok "Installed Caddy"
 | 
			
		||||
read -r -p "Would you like to install xCaddy Addon? <y/N> " prompt
 | 
			
		||||
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
			
		||||
  msg_info "Installing Golang"
 | 
			
		||||
  cd /opt
 | 
			
		||||
  set +o pipefail
 | 
			
		||||
  GOLANG=$(curl -s https://go.dev/dl/ | grep -o "go.*\linux-amd64.tar.gz" | head -n 1)
 | 
			
		||||
  wget -q https://golang.org/dl/$GOLANG
 | 
			
		||||
  tar -xzf $GOLANG -C /usr/local
 | 
			
		||||
  ln -s /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
  temp_file=$(mktemp)
 | 
			
		||||
  golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
  wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
  tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
  ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
  rm -f "$temp_file"
 | 
			
		||||
  set -o pipefail
 | 
			
		||||
  rm -rf /opt/go*
 | 
			
		||||
  msg_ok "Installed Golang"
 | 
			
		||||
 | 
			
		||||
  msg_info "Setup xCaddy"
 | 
			
		||||
 
 | 
			
		||||
@@ -58,7 +58,7 @@ msg_ok "Setup Python3"
 | 
			
		||||
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"
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								install/elementsynapse-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								install/elementsynapse-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  sudo \
 | 
			
		||||
  curl \
 | 
			
		||||
  mc \
 | 
			
		||||
  lsb-release \
 | 
			
		||||
  wget \
 | 
			
		||||
  apt-transport-https \
 | 
			
		||||
  debconf-utils
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Element Synapse"
 | 
			
		||||
wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
 | 
			
		||||
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/matrix-org.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
echo "matrix-synapse-py3 matrix-synapse/server-name string matrix" | debconf-set-selections
 | 
			
		||||
echo "matrix-synapse-py3 matrix-synapse/report-stats boolean false" | debconf-set-selections
 | 
			
		||||
$STD apt-get install matrix-synapse-py3 -y
 | 
			
		||||
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/matrix-synapse/homeserver.yaml
 | 
			
		||||
sed -i 's/'\''::1'\'', //g' /etc/matrix-synapse/homeserver.yaml
 | 
			
		||||
systemctl enable -q --now matrix-synapse
 | 
			
		||||
msg_ok "Installed Element Synapse"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -23,7 +23,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
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ msg_ok "Setup Python3"
 | 
			
		||||
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
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,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 yarn
 | 
			
		||||
 
 | 
			
		||||
@@ -56,6 +56,7 @@ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dea
 | 
			
		||||
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 corepack@0.31.0
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Hoarder"
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ $STD apt-get install -y \
 | 
			
		||||
    imagemagick
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Python3 Dependencies"
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
    pip \
 | 
			
		||||
    python3-irc
 | 
			
		||||
@@ -34,7 +34,7 @@ $STD pip install jaraco.stream
 | 
			
		||||
$STD pip install python-Levenshtein
 | 
			
		||||
$STD pip install soupsieve
 | 
			
		||||
$STD pip install pypdf
 | 
			
		||||
msg_ok "Installed Python3 Dependencies"
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing LazyLibrarian"
 | 
			
		||||
$STD git clone https://gitlab.com/LazyLibrarian/LazyLibrarian /opt/LazyLibrarian
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js/Yarn"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
@@ -42,10 +42,12 @@ msg_ok "Installed pnpm"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Golang"
 | 
			
		||||
set +o pipefail
 | 
			
		||||
GOLANG=$(curl -s https://go.dev/dl/ | grep -o "go.*\linux-amd64.tar.gz" | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/$GOLANG
 | 
			
		||||
tar -xzf $GOLANG -C /usr/local
 | 
			
		||||
ln -s /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Installed Golang"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -33,18 +33,18 @@ $STD apt-get install -y --no-install-recommends \
 | 
			
		||||
  mc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Python3"
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  python3 \
 | 
			
		||||
  python3-dev \
 | 
			
		||||
  python3-pip \
 | 
			
		||||
  python3-venv
 | 
			
		||||
msg_ok "Installed Python3"
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,10 +26,14 @@ $STD apt-get install -y cmake
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Golang"
 | 
			
		||||
$STD wget https://golang.org/dl/go1.23.2.linux-amd64.tar.gz
 | 
			
		||||
$STD tar -xzf go1.23.2.linux-amd64.tar.gz -C /usr/local
 | 
			
		||||
$STD ln -s /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -rf go1.23.2.linux-amd64.tar.gz
 | 
			
		||||
set +o pipefail
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Installed Golang"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Intel® Repositories"
 | 
			
		||||
 
 | 
			
		||||
@@ -24,16 +24,16 @@ $STD apt-get install -y \
 | 
			
		||||
  ffmpeg
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Python3 Dependencies"
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y --no-install-recommends \
 | 
			
		||||
  python3 \
 | 
			
		||||
  python3-pip
 | 
			
		||||
msg_ok "Installed Python3 Dependencies"
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -40,14 +40,14 @@ $STD apt-get install -y \
 | 
			
		||||
  mc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Python3 Dependencies (Patience)"
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  python3 \
 | 
			
		||||
  python3-pip \
 | 
			
		||||
  python3-dev \
 | 
			
		||||
  python3-setuptools \
 | 
			
		||||
  python3-wheel
 | 
			
		||||
msg_ok "Installed Python3 Dependencies"
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing OCR Dependencies (Patience)"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ msg_ok "Set up PostgreSQL"
 | 
			
		||||
msg_info "Setting up Node.js/Yarn"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
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 npm@latest
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,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
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -35,12 +35,13 @@ $STD apt-get install -y nodejs
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Golang"
 | 
			
		||||
cd /tmp
 | 
			
		||||
set +o pipefail
 | 
			
		||||
GO_RELEASE=$(curl -s https://go.dev/dl/ | grep -o -m 1 "go.*\linux-amd64.tar.gz")
 | 
			
		||||
wget -q https://golang.org/dl/${GO_RELEASE}
 | 
			
		||||
tar -xzf ${GO_RELEASE} -C /usr/local
 | 
			
		||||
ln -s /usr/local/go/bin/go /usr/bin/go
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Installed Golang"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										110
									
								
								install/privatebin-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								install/privatebin-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,110 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Nícolas Pastorello (opastorello)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
    curl \
 | 
			
		||||
    sudo \
 | 
			
		||||
    mc \
 | 
			
		||||
    nginx \
 | 
			
		||||
    php8.2-fpm \
 | 
			
		||||
    php8.2-{common,cli,gd,mbstring,xml,fpm,curl,zip} \
 | 
			
		||||
    unzip \
 | 
			
		||||
    openssl
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing PrivateBin"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/PrivateBin/PrivateBin/releases/latest | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
mkdir -p /opt/privatebin
 | 
			
		||||
cd /opt/privatebin
 | 
			
		||||
wget -q "https://github.com/PrivateBin/PrivateBin/archive/refs/tags/${RELEASE}.zip"
 | 
			
		||||
$STD unzip -q ${RELEASE}.zip
 | 
			
		||||
mv PrivateBin-${RELEASE}/* .
 | 
			
		||||
msg_ok "Installed PrivateBin"
 | 
			
		||||
 | 
			
		||||
msg_info "Generating Universal SSL Certificate"
 | 
			
		||||
mkdir -p /etc/ssl/privatebin
 | 
			
		||||
$STD openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
 | 
			
		||||
    -keyout /etc/ssl/privatebin/key.pem \
 | 
			
		||||
    -out /etc/ssl/privatebin/cert.pem \
 | 
			
		||||
    -subj "/CN=PrivateBin"
 | 
			
		||||
msg_ok "Certificate Generated"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Environment"
 | 
			
		||||
mkdir -p /opt/privatebin/data
 | 
			
		||||
cp cfg/conf.sample.php /opt/privatebin/cfg/conf.php
 | 
			
		||||
sed -i "s|// 'traffic'|'traffic'|g" /opt/privatebin/cfg/conf.php
 | 
			
		||||
chown -R www-data:www-data /opt/privatebin
 | 
			
		||||
chmod -R 0755 /opt/privatebin/data
 | 
			
		||||
msg_ok "Configured Environment"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring PHP"
 | 
			
		||||
sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php/8.2/fpm/php.ini
 | 
			
		||||
systemctl restart php8.2-fpm
 | 
			
		||||
msg_ok "Configured PHP"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Universal Nginx"
 | 
			
		||||
cat <<EOF >/etc/nginx/sites-available/privatebin.conf
 | 
			
		||||
server {
 | 
			
		||||
    listen 80 default_server;
 | 
			
		||||
    listen [::]:80 default_server;
 | 
			
		||||
    return 301 https://\$host\$request_uri;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
server {
 | 
			
		||||
    listen 443 ssl default_server;
 | 
			
		||||
    listen [::]:443 ssl default_server;
 | 
			
		||||
    
 | 
			
		||||
    ssl_certificate /etc/ssl/privatebin/cert.pem;
 | 
			
		||||
    ssl_certificate_key /etc/ssl/privatebin/key.pem;
 | 
			
		||||
    
 | 
			
		||||
    root /opt/privatebin;
 | 
			
		||||
    index index.php;
 | 
			
		||||
 | 
			
		||||
    location / {
 | 
			
		||||
        try_files \$uri \$uri/ /index.php\$is_args\$args;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    location ~ \.php\$ {
 | 
			
		||||
        include snippets/fastcgi-php.conf;
 | 
			
		||||
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
 | 
			
		||||
        fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
 | 
			
		||||
        include fastcgi_params;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    location ~ /\.ht {
 | 
			
		||||
        deny all;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
 | 
			
		||||
    add_header X-Content-Type-Options nosniff;
 | 
			
		||||
    add_header X-Frame-Options "SAMEORIGIN";
 | 
			
		||||
    add_header X-XSS-Protection "1; mode=block";
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
ln -s /etc/nginx/sites-available/privatebin.conf /etc/nginx/sites-enabled/
 | 
			
		||||
rm -f /etc/nginx/sites-enabled/default
 | 
			
		||||
systemctl reload nginx
 | 
			
		||||
msg_ok "Nginx Configured"
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf /opt/privatebin/${RELEASE}.zip 
 | 
			
		||||
rm -rf /opt/privatebin/PrivateBin-${RELEASE}
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
@@ -14,9 +14,11 @@ network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y curl
 | 
			
		||||
$STD apt-get install -y sudo
 | 
			
		||||
$STD apt-get install -y mc
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
    curl \
 | 
			
		||||
    sudo \
 | 
			
		||||
    gpg \
 | 
			
		||||
    mc 
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Proxmox Backup Server"
 | 
			
		||||
@@ -21,10 +21,14 @@ $STD apt-get install -y mc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Golang"
 | 
			
		||||
$STD wget https://golang.org/dl/go1.20.1.linux-amd64.tar.gz
 | 
			
		||||
$STD tar -xzf go1.20.1.linux-amd64.tar.gz -C /usr/local
 | 
			
		||||
$STD ln -s /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -rf go1.20.1.linux-amd64.tar.gz
 | 
			
		||||
set +o pipefail
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Installed Golang"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing RTSPtoWeb"
 | 
			
		||||
 
 | 
			
		||||
@@ -23,10 +23,12 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Golang"
 | 
			
		||||
set +o pipefail
 | 
			
		||||
RELEASE=$(curl -s https://go.dev/dl/ | grep -o "go.*\linux-amd64.tar.gz" | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/$RELEASE
 | 
			
		||||
tar -xzf $RELEASE -C /usr/local
 | 
			
		||||
$STD ln -s /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Installed Golang"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,13 +27,13 @@ $STD apt-get install -y \
 | 
			
		||||
  mc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Python3"
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  python3-dev \
 | 
			
		||||
  python3-setuptools \
 | 
			
		||||
  python3-wheel \
 | 
			
		||||
  python3-pip
 | 
			
		||||
msg_ok "Installed Python3"
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Spoolman"
 | 
			
		||||
RELEASE=$(wget -q https://github.com/Donkie/Spoolman/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
 | 
			
		||||
 
 | 
			
		||||
@@ -23,8 +23,7 @@ $STD apt install -y \
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup SQL Server 2022"
 | 
			
		||||
$STD curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
 | 
			
		||||
$STD curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc
 | 
			
		||||
$STD curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
 | 
			
		||||
$STD curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | tee /etc/apt/sources.list.d/mssql-server-2022.list
 | 
			
		||||
$STD apt-get clean *
 | 
			
		||||
$STD apt-get update -y
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,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
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ msg_ok "Installed Dependencies"
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								json/elementsynapse.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								json/elementsynapse.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Element Synapse",
 | 
			
		||||
    "slug": "elementsynapse",
 | 
			
		||||
    "categories": [
 | 
			
		||||
      4
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-02",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 8008,
 | 
			
		||||
    "documentation": "https://element-hq.github.io/synapse/latest/welcome_and_overview.html",
 | 
			
		||||
    "website": "https://element.io/",
 | 
			
		||||
    "logo": "https://element.io/images/logo-mark-primary.svg",
 | 
			
		||||
    "description": "Synapse is an open source Matrix homeserver implementation, written and maintained by Element. Matrix is the open standard for secure and interoperable real time communications. You can directly run and manage the source code in this repository, available under an AGPL license. There is no support provided from Element unless you have a subscription.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
      {
 | 
			
		||||
        "type": "default",
 | 
			
		||||
        "script": "ct/elementsynapse.sh",
 | 
			
		||||
        "resources": {
 | 
			
		||||
          "cpu": 1,
 | 
			
		||||
          "ram": 1024,
 | 
			
		||||
          "hdd": 4,
 | 
			
		||||
          "os": "Debian",
 | 
			
		||||
          "version": "12"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
      "username": null,
 | 
			
		||||
      "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
  }
 | 
			
		||||
@@ -18,9 +18,9 @@
 | 
			
		||||
          "type": "default",
 | 
			
		||||
          "script": "ct/grist.sh",
 | 
			
		||||
          "resources": {
 | 
			
		||||
              "cpu": 1,
 | 
			
		||||
              "ram": 1024,
 | 
			
		||||
              "hdd": 4,
 | 
			
		||||
              "cpu": 2,
 | 
			
		||||
              "ram": 3072,
 | 
			
		||||
              "hdd": 6,
 | 
			
		||||
              "os": "debian",
 | 
			
		||||
              "version": "12"
 | 
			
		||||
          }
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 4096,
 | 
			
		||||
        "hdd": 8,
 | 
			
		||||
        "hdd": 10,
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								json/privatebin.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								json/privatebin.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "PrivateBin",
 | 
			
		||||
    "slug": "privatebin",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        12
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-01-29",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 80,
 | 
			
		||||
    "documentation": "https://github.com/PrivateBin/PrivateBin/wiki",
 | 
			
		||||
    "website": "https://github.com/PrivateBin/PrivateBin",
 | 
			
		||||
    "logo": "https://raw.githubusercontent.com/PrivateBin/PrivateBin/refs/heads/master/img/icon.svg",
 | 
			
		||||
    "description": "PrivateBin is a minimalist, open-source pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256-bit AES.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/privatebin.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 1024,
 | 
			
		||||
                "hdd": 4,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Prometheus Proxmox VE Exporter",
 | 
			
		||||
    "slug": "prometheus-proxmox-ve-exporter",
 | 
			
		||||
    "slug": "prometheus-pve-exporter",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        1,
 | 
			
		||||
        9
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Proxmox Backup Server",
 | 
			
		||||
    "slug": "pbs",
 | 
			
		||||
    "slug": "proxmox-backup-server",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        1
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2024-05-02",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": false,
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 8007,
 | 
			
		||||
    "documentation": "https://pbs.proxmox.com/docs/",
 | 
			
		||||
@@ -16,7 +16,7 @@
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/pbs.sh",
 | 
			
		||||
            "script": "ct/proxmox-backup-server.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 2,
 | 
			
		||||
                "ram": 2048,
 | 
			
		||||
@@ -27,12 +27,12 @@
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "username": "root",
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
            "text": "Set a root password if using autologin. This will be the PBS password. `sudo passwd root`",
 | 
			
		||||
            "text": "Set a root password if using autologin. This will be the PBS password. `passwd root`",
 | 
			
		||||
            "type": "warning"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
							
								
								
									
										125
									
								
								misc/api.func
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								misc/api.func
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,125 @@
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/LICENSE
 | 
			
		||||
 | 
			
		||||
post_to_api() {
 | 
			
		||||
 | 
			
		||||
  if ! command -v curl &> /dev/null; then
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$DIAGNOSTICS" = "no" ]; then
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ -z "$RANDOM_UUID" ]; then
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  local API_URL="http://api.community-scripts.org/upload"
 | 
			
		||||
  local pve_version="not found"
 | 
			
		||||
  pve_version=$(pveversion | awk -F'[/ ]' '{print $2}')
 | 
			
		||||
 | 
			
		||||
  JSON_PAYLOAD=$(cat <<EOF
 | 
			
		||||
{
 | 
			
		||||
    "ct_type": $CT_TYPE,
 | 
			
		||||
    "type":"lxc",
 | 
			
		||||
    "disk_size": $DISK_SIZE,
 | 
			
		||||
    "core_count": $CORE_COUNT,
 | 
			
		||||
    "ram_size": $RAM_SIZE,
 | 
			
		||||
    "os_type": "$var_os",
 | 
			
		||||
    "os_version": "$var_version",
 | 
			
		||||
    "disableip6": "$DISABLEIP6",
 | 
			
		||||
    "nsapp": "$NSAPP",
 | 
			
		||||
    "method": "$METHOD",
 | 
			
		||||
    "pve_version": "$pve_version",
 | 
			
		||||
    "status": "installing",
 | 
			
		||||
    "random_id": "$RANDOM_UUID"
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
  RESPONSE=$(curl -s -o response.txt -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
 | 
			
		||||
    -H "Content-Type: application/json" \
 | 
			
		||||
    -d "$JSON_PAYLOAD") || true
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
post_to_api_vm() {
 | 
			
		||||
 | 
			
		||||
  DIAGNOSTICS=$(grep -i "^DIAGNOSTICS=" /usr/local/community-scripts/diagnostics | awk -F'=' '{print $2}')
 | 
			
		||||
 | 
			
		||||
  if ! command -v curl &> /dev/null; then
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$DIAGNOSTICS" = "no" ]; then
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if [ -z "$RANDOM_UUID" ]; then
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  local API_URL="http://api.community-scripts.org/upload"
 | 
			
		||||
  local pve_version="not found"
 | 
			
		||||
  pve_version=$(pveversion | awk -F'[/ ]' '{print $2}')
 | 
			
		||||
 | 
			
		||||
  DISK_SIZE_API=${DISK_SIZE%G}
 | 
			
		||||
 | 
			
		||||
  JSON_PAYLOAD=$(cat <<EOF
 | 
			
		||||
{
 | 
			
		||||
    "ct_type": 2,
 | 
			
		||||
    "type":"vm",
 | 
			
		||||
    "disk_size": $DISK_SIZE_API,
 | 
			
		||||
    "core_count": $CORE_COUNT,
 | 
			
		||||
    "ram_size": $RAM_SIZE,
 | 
			
		||||
    "os_type": "$var_os",
 | 
			
		||||
    "os_version": "$var_version",
 | 
			
		||||
    "disableip6": "",
 | 
			
		||||
    "nsapp": "$NSAPP",
 | 
			
		||||
    "method": "$METHOD",
 | 
			
		||||
    "pve_version": "$pve_version",
 | 
			
		||||
    "status": "installing",
 | 
			
		||||
    "random_id": "$RANDOM_UUID"
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
  RESPONSE=$(curl -s -o response.txt -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
 | 
			
		||||
    -H "Content-Type: application/json" \
 | 
			
		||||
    -d "$JSON_PAYLOAD") || true
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
POST_UPDATE_DONE=false
 | 
			
		||||
post_update_to_api() {
 | 
			
		||||
 | 
			
		||||
    if ! command -v curl &> /dev/null; then
 | 
			
		||||
      return
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [ "$POST_UPDATE_DONE" = true ]; then
 | 
			
		||||
        return 0
 | 
			
		||||
    fi
 | 
			
		||||
    local API_URL="http://api.community-scripts.org/upload/updatestatus"    
 | 
			
		||||
    local status="${1:-failed}"
 | 
			
		||||
    local error="${2:-unknown}"
 | 
			
		||||
 | 
			
		||||
    JSON_PAYLOAD=$(cat <<EOF
 | 
			
		||||
{
 | 
			
		||||
    "status": "$status",
 | 
			
		||||
    "error": "$error",
 | 
			
		||||
    "random_id": "$RANDOM_UUID"
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
   
 | 
			
		||||
  RESPONSE=$(curl -s -o response.txt -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
 | 
			
		||||
      -H "Content-Type: application/json" \
 | 
			
		||||
      -d "$JSON_PAYLOAD") || true
 | 
			
		||||
 | 
			
		||||
  POST_UPDATE_DONE=true
 | 
			
		||||
}
 | 
			
		||||
@@ -11,8 +11,9 @@ variables() {
 | 
			
		||||
  PVEHOST_NAME=$(hostname)           # gets the Proxmox Hostname and sets it to Uppercase
 | 
			
		||||
  DIAGNOSTICS="yes"                  # sets the DIAGNOSTICS variable to "yes", used for the API call.
 | 
			
		||||
  METHOD="default"                   # sets the METHOD variable to "default", used for the API call.
 | 
			
		||||
  RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUDI variable.
 | 
			
		||||
  RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
 | 
			
		||||
}
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
# This function sets various color variables using ANSI escape codes for formatting text in the terminal.
 | 
			
		||||
color() {
 | 
			
		||||
@@ -791,78 +792,6 @@ advanced_settings() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
post_to_api() {
 | 
			
		||||
  if [ "$DIAGNOSTICS" = "no" ]; then
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
  local API_URL="http://api.community-scripts.org/upload"
 | 
			
		||||
  local pve_version="not found"
 | 
			
		||||
  pve_version=$(pveversion | awk -F'[/ ]' '{print $2}')
 | 
			
		||||
 | 
			
		||||
  JSON_PAYLOAD=$(cat <<EOF
 | 
			
		||||
{
 | 
			
		||||
    "ct_type": $CT_TYPE,
 | 
			
		||||
    "disk_size": $DISK_SIZE,
 | 
			
		||||
    "core_count": $CORE_COUNT,
 | 
			
		||||
    "ram_size": $RAM_SIZE,
 | 
			
		||||
    "verbose": "$VERBOSE",
 | 
			
		||||
    "os_type": "$var_os",
 | 
			
		||||
    "os_version": "$var_version",
 | 
			
		||||
    "hn": "$HN",
 | 
			
		||||
    "disableip6": "$DISABLEIP6",
 | 
			
		||||
    "ssh": "$SSH",
 | 
			
		||||
    "tags": "$TAGS",
 | 
			
		||||
    "nsapp": "$NSAPP",
 | 
			
		||||
    "method": "$METHOD",
 | 
			
		||||
    "pve_version": "$pve_version",
 | 
			
		||||
    "status": "installing",
 | 
			
		||||
    "random_id": "$RANDOM_UUID"
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
  RESPONSE=$(curl -s -o response.txt -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
 | 
			
		||||
    -H "Content-Type: application/json" \
 | 
			
		||||
    -d "$JSON_PAYLOAD")
 | 
			
		||||
 | 
			
		||||
  if [ "$RESPONSE" -ne 201 ] && [ "$RESPONSE" -ne 302 ]; then
 | 
			
		||||
    msg_error "API request failed with HTTP code $RESPONSE"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
POST_UPDATE_DONE=false
 | 
			
		||||
post_update_to_api() {
 | 
			
		||||
    if [ "$DIAGNOSTICS" = "no" ]; then
 | 
			
		||||
        return 0
 | 
			
		||||
    fi
 | 
			
		||||
    if [ "$POST_UPDATE_DONE" = true ]; then
 | 
			
		||||
        return 0
 | 
			
		||||
    fi
 | 
			
		||||
	
 | 
			
		||||
    local API_URL="http://api.community-scripts.org/upload/updatestatus"    
 | 
			
		||||
    local status="${1:-failed}"
 | 
			
		||||
    
 | 
			
		||||
    JSON_PAYLOAD=$(cat <<EOF
 | 
			
		||||
{
 | 
			
		||||
    "status": "$status",
 | 
			
		||||
    "random_id": "$RANDOM_UUID"
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
   
 | 
			
		||||
  RESPONSE=$(curl -s -o response.txt -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
 | 
			
		||||
      -H "Content-Type: application/json" \
 | 
			
		||||
      -d "$JSON_PAYLOAD")
 | 
			
		||||
 | 
			
		||||
  if [ "$RESPONSE" -ne 201 ] && [ "$RESPONSE" -ne 302 ]; then
 | 
			
		||||
    msg_error "API UPDATE request failed with HTTP code $RESPONSE"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  POST_UPDATE_DONE=true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
diagnostics_check(){
 | 
			
		||||
  if ! [ -d "/usr/local/community-scripts" ]; then
 | 
			
		||||
      mkdir -p /usr/local/community-scripts
 | 
			
		||||
@@ -886,16 +815,13 @@ DIAGNOSTICS=yes
 | 
			
		||||
#"disk_size"
 | 
			
		||||
#"core_count"
 | 
			
		||||
#"ram_size"
 | 
			
		||||
#"verbose"
 | 
			
		||||
#"os_type"
 | 
			
		||||
#"os_version"
 | 
			
		||||
#"hn"
 | 
			
		||||
#"disableip6"
 | 
			
		||||
#"ssh"
 | 
			
		||||
#"tags"
 | 
			
		||||
#"nsapp"
 | 
			
		||||
#"method"
 | 
			
		||||
#"pve_version"
 | 
			
		||||
#"status"
 | 
			
		||||
#If you have any concerns, please review the source code at /misc/build.func
 | 
			
		||||
EOF
 | 
			
		||||
      DIAGNOSTICS="yes"
 | 
			
		||||
@@ -916,16 +842,13 @@ DIAGNOSTICS=no
 | 
			
		||||
#"disk_size"
 | 
			
		||||
#"core_count"
 | 
			
		||||
#"ram_size"
 | 
			
		||||
#"verbose"
 | 
			
		||||
#"os_type"
 | 
			
		||||
#"os_version"
 | 
			
		||||
#"hn"
 | 
			
		||||
#"disableip6"
 | 
			
		||||
#"ssh"
 | 
			
		||||
#"tags"
 | 
			
		||||
#"nsapp"
 | 
			
		||||
#"method"
 | 
			
		||||
#"pve_version"
 | 
			
		||||
#"status"
 | 
			
		||||
#If you have any concerns, please review the source code at /misc/build.func
 | 
			
		||||
EOF
 | 
			
		||||
      DIAGNOSTICS="no"
 | 
			
		||||
@@ -1101,6 +1024,7 @@ build_container() {
 | 
			
		||||
  else
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func)"
 | 
			
		||||
  fi
 | 
			
		||||
  export RANDOM_UUID="$RANDOM_UUID"
 | 
			
		||||
  export CACHER="$APT_CACHER"
 | 
			
		||||
  export CACHER_IP="$APT_CACHER_IP"
 | 
			
		||||
  export tz="$timezone"
 | 
			
		||||
@@ -1239,10 +1163,10 @@ EOF
 | 
			
		||||
    systemctl start ping-instances.service
 | 
			
		||||
  fi
 | 
			
		||||
  
 | 
			
		||||
  post_update_to_api "done"
 | 
			
		||||
  post_update_to_api "done" "none"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
trap 'post_update_to_api "failed"' EXIT
 | 
			
		||||
trap 'post_update_to_api "failed"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed"' SIGTERM
 | 
			
		||||
trap 'post_update_to_api "failed" "unknown error"' EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "SIG INTERUPT"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "SIG TERM"' SIGTERM
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,26 +22,18 @@ function find_orphaned_lvm {
 | 
			
		||||
 | 
			
		||||
    orphaned_volumes=()
 | 
			
		||||
    while read -r lv vg size; do
 | 
			
		||||
        container_id=$(echo "$lv" | grep -oE "[0-9]+" | head -1)
 | 
			
		||||
 | 
			
		||||
        # Exclude system-critical LVs
 | 
			
		||||
        if [[ "$lv" == "data" || "$lv" == "root" || "$lv" == "swap" ]]; then
 | 
			
		||||
        # Exclude system-critical LVs and Ceph OSDs
 | 
			
		||||
        if [[ "$lv" == "data" || "$lv" == "root" || "$lv" == "swap" || "$lv" =~ ^osd-block- ]]; then
 | 
			
		||||
            continue
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        container_id=$(echo "$lv" | grep -oE "[0-9]+" | head -1)
 | 
			
		||||
        # Check if the ID exists as a VM or LXC container
 | 
			
		||||
        if [ -f "/etc/pve/lxc/${container_id}.conf" ] || [ -f "/etc/pve/qemu-server/${container_id}.conf" ]; then
 | 
			
		||||
            continue
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        orphaned_volumes+=("$lv" "$vg" "$size")
 | 
			
		||||
    done < <(lvs --noheadings -o lv_name,vg_name,lv_size --separator ' ' | awk '{print $1, $2, $3}')
 | 
			
		||||
 | 
			
		||||
    if [ ${#orphaned_volumes[@]} -eq 0 ]; then
 | 
			
		||||
        echo -e "✅ No orphaned LVM volumes found.\n"
 | 
			
		||||
        exit 0
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Display orphaned volumes
 | 
			
		||||
    echo -e "❗ The following orphaned LVM volumes were found:\n"
 | 
			
		||||
    printf "%-25s %-10s %-10s\n" "LV Name" "VG" "Size"
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,9 @@
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 tteck
 | 
			
		||||
# Author: tteck (tteckster)
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
set -o pipefail
 | 
			
		||||
 | 
			
		||||
function header_info() {
 | 
			
		||||
  clear
 | 
			
		||||
@@ -16,11 +17,13 @@ function header_info() {
 | 
			
		||||
                    /____/
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
RD=$(echo "\033[01;31m")
 | 
			
		||||
CM='\xE2\x9C\x94\033'
 | 
			
		||||
GN=$(echo "\033[1;92m")
 | 
			
		||||
CL=$(echo "\033[m")
 | 
			
		||||
 | 
			
		||||
header_info
 | 
			
		||||
echo "Loading..."
 | 
			
		||||
 | 
			
		||||
@@ -29,47 +32,63 @@ if [ "$ROOT_FS" != "ext4" ]; then
 | 
			
		||||
    echo "Root filesystem is not ext4. Exiting script."
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
whiptail --backtitle "Proxmox VE Helper Scripts" \
 | 
			
		||||
         --title "Proxmox VE LXC Filesystem Trim" \
 | 
			
		||||
         --yesno "The LXC containers will undergo the fstrim command. Proceed?" 10 58 || exit
 | 
			
		||||
 | 
			
		||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Filesystem Trim" --yesno "The LXC containers will undergo the fstrim command. Proceed?" 10 58 || exit
 | 
			
		||||
NODE=$(hostname)
 | 
			
		||||
EXCLUDE_MENU=()
 | 
			
		||||
MSG_MAX_LENGTH=0
 | 
			
		||||
 | 
			
		||||
while read -r TAG ITEM; do
 | 
			
		||||
  OFFSET=2
 | 
			
		||||
  ((${#ITEM} + OFFSET > MSG_MAX_LENGTH)) && MSG_MAX_LENGTH=${#ITEM}+OFFSET
 | 
			
		||||
  EXCLUDE_MENU+=("$TAG" "$ITEM " "OFF")
 | 
			
		||||
done < <(pct list | awk 'NR>1')
 | 
			
		||||
excluded_containers=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Containers on $NODE" --checklist "\nSelect containers to skip from trimming:\n" \
 | 
			
		||||
  16 $((MSG_MAX_LENGTH + 23)) 6 "${EXCLUDE_MENU[@]}" 3>&1 1>&2 2>&3 | tr -d '"') || exit  
 | 
			
		||||
 | 
			
		||||
excluded_containers_raw=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
 | 
			
		||||
    --title "Containers on $NODE" \
 | 
			
		||||
    --checklist "\nSelect containers to skip from trimming:\n" \
 | 
			
		||||
    16 $((MSG_MAX_LENGTH + 23)) 6 "${EXCLUDE_MENU[@]}" 3>&1 1>&2 2>&3)
 | 
			
		||||
 | 
			
		||||
if [ $? -ne 0 ]; then
 | 
			
		||||
    exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
excluded_containers=$(echo "$excluded_containers_raw" | tr -d '"')
 | 
			
		||||
 | 
			
		||||
function trim_container() {
 | 
			
		||||
  local container=$1
 | 
			
		||||
  header_info
 | 
			
		||||
  echo -e "${BL}[Info]${GN} Trimming ${BL}$container${CL} \n"
 | 
			
		||||
  local before_trim=$(lvs | awk -F '[[:space:]]+' 'NR>1 && (/Data%|'"vm-$container"'/) {gsub(/%/, "", $7); print $7}')
 | 
			
		||||
  
 | 
			
		||||
  local before_trim
 | 
			
		||||
  before_trim=$(lvs | awk -F '[[:space:]]+' 'NR>1 && (/Data%|'"vm-$container"'/) {gsub(/%/, "", $7); print $7}')
 | 
			
		||||
  echo -e "${RD}Data before trim $before_trim%${CL}"
 | 
			
		||||
  pct fstrim $container
 | 
			
		||||
  local after_trim=$(lvs | awk -F '[[:space:]]+' 'NR>1 && (/Data%|'"vm-$container"'/) {gsub(/%/, "", $7); print $7}')
 | 
			
		||||
  
 | 
			
		||||
  pct fstrim "$container"
 | 
			
		||||
  
 | 
			
		||||
  local after_trim
 | 
			
		||||
  after_trim=$(lvs | awk -F '[[:space:]]+' 'NR>1 && (/Data%|'"vm-$container"'/) {gsub(/%/, "", $7); print $7}')
 | 
			
		||||
  echo -e "${GN}Data after trim $after_trim%${CL}"
 | 
			
		||||
  
 | 
			
		||||
  sleep 1.5
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
for container in $(pct list | awk '{if(NR>1) print $1}'); do
 | 
			
		||||
  if [[ " ${excluded_containers[@]} " =~ " $container " ]]; then
 | 
			
		||||
  if [[ " ${excluded_containers} " =~ " $container " ]]; then
 | 
			
		||||
    header_info
 | 
			
		||||
    echo -e "${BL}[Info]${GN} Skipping ${BL}$container${CL}"
 | 
			
		||||
    sleep 1
 | 
			
		||||
  else
 | 
			
		||||
    template=$(pct config $container | grep -q "template:" && echo "true" || echo "false")
 | 
			
		||||
    template=$(pct config "$container" | grep -q "template:" && echo "true" || echo "false")
 | 
			
		||||
    if [ "$template" == "true" ]; then
 | 
			
		||||
      header_info
 | 
			
		||||
      echo -e "${BL}[Info]${GN} Skipping ${container} ${RD}$container is a template ${CL} \n"
 | 
			
		||||
      sleep 1
 | 
			
		||||
      continue
 | 
			
		||||
    fi
 | 
			
		||||
      trim_container $container
 | 
			
		||||
    trim_container "$container"
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -56,6 +56,7 @@ catch_errors() {
 | 
			
		||||
 | 
			
		||||
# This function handles errors
 | 
			
		||||
error_handler() {
 | 
			
		||||
  source <(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
 | 
			
		||||
  printf "\e[?25h"
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
@@ -63,8 +64,11 @@ error_handler() {
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  if [[ "$line_number" -eq 23 ]]; then
 | 
			
		||||
  if [[ "$line_number" -eq 44 ]]; then
 | 
			
		||||
    echo -e "The silent function has suppressed the error, run the script with verbose mode enabled, which will provide more detailed output.\n"
 | 
			
		||||
    post_update_to_api "failed" "No error message, script ran in silent mode"
 | 
			
		||||
  else
 | 
			
		||||
    post_update_to_api "failed" "${command}"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -121,9 +121,9 @@ EOF
 | 
			
		||||
      whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Support Subscriptions" "Supporting the software's development team is essential. Check their official website's Support Subscriptions for pricing. Without their dedicated work, we wouldn't have this exceptional software." 10 58
 | 
			
		||||
      msg_info "Disabling subscription nag"
 | 
			
		||||
      # Normal GUI:
 | 
			
		||||
      echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script
 | 
			
		||||
      echo "DPkg::Post-Invoke { \"dpkg -V proxmox-widget-toolkit | grep -q '/proxmoxlib\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from UI...'; sed -i '/.*data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script
 | 
			
		||||
      # JS-Library used when accessing via mobile device browser
 | 
			
		||||
      echo "DPkg::Post-Invoke { \"dpkg -V pmg-gui | grep -q '/pmgmanagerlib-mobile\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from Mobile UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; }; fi\"; };" >/etc/apt/apt.conf.d/no-nag-script
 | 
			
		||||
      echo "DPkg::Post-Invoke { \"dpkg -V pmg-gui | grep -q '/pmgmanagerlib-mobile\.js$'; if [ \$? -eq 1 ]; then { echo 'Removing subscription nag from Mobile UI...'; sed -i '/data\.status.*{/{s/\!//;s/active/NoMoreNagging/}' /usr/share/javascript/pmg-gui/js/pmgmanagerlib-mobile.js; }; fi\"; };" >>/etc/apt/apt.conf.d/no-nag-script
 | 
			
		||||
      apt --reinstall install proxmox-widget-toolkit pmg-gui &>/dev/null
 | 
			
		||||
      msg_ok "Disabled subscription nag (Delete browser cache)"
 | 
			
		||||
      ;;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user