mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 02:12:49 +00:00 
			
		
		
		
	Compare commits
	
		
			200 Commits
		
	
	
		
			2025-02-26
			...
			2025-03-11
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f6a6ca5e26 | ||
| 
						 | 
					7f796478f3 | ||
| 
						 | 
					d72d742fbb | ||
| 
						 | 
					d5f5f1e5de | ||
| 
						 | 
					31d80c3461 | ||
| 
						 | 
					68936f0edd | ||
| 
						 | 
					5ce76f0a3a | ||
| 
						 | 
					48c20bbd6d | ||
| 
						 | 
					05266b2849 | ||
| 
						 | 
					293a220719 | ||
| 
						 | 
					a0f7643838 | ||
| 
						 | 
					96c943a7de | ||
| 
						 | 
					57350a8324 | ||
| 
						 | 
					9953d8d662 | ||
| 
						 | 
					35efc4ed8a | ||
| 
						 | 
					de001f5022 | ||
| 
						 | 
					c737473f8b | ||
| 
						 | 
					a9db3283dd | ||
| 
						 | 
					77fbf68a43 | ||
| 
						 | 
					04a473b4a8 | ||
| 
						 | 
					49d7d4a106 | ||
| 
						 | 
					4b638e93be | ||
| 
						 | 
					e508fb101f | ||
| 
						 | 
					2c73cd7cf7 | ||
| 
						 | 
					da94a2c6bc | ||
| 
						 | 
					1de7e428cd | ||
| 
						 | 
					60994b6851 | ||
| 
						 | 
					30e14a157f | ||
| 
						 | 
					ff30e03e88 | ||
| 
						 | 
					88c952c1b4 | ||
| 
						 | 
					8441e65000 | ||
| 
						 | 
					d4ac4809c0 | ||
| 
						 | 
					824e091a67 | ||
| 
						 | 
					cc0ce1a756 | ||
| 
						 | 
					e5b39e6671 | ||
| 
						 | 
					6ad1ea004f | ||
| 
						 | 
					a640814ae0 | ||
| 
						 | 
					89962b01fa | ||
| 
						 | 
					b0a06bdc5f | ||
| 
						 | 
					54fc60b60e | ||
| 
						 | 
					830634517b | ||
| 
						 | 
					f99fd28fe6 | ||
| 
						 | 
					70f96e3bfd | ||
| 
						 | 
					a56bbba2bd | ||
| 
						 | 
					9f0945394f | ||
| 
						 | 
					c9dec5e3cd | ||
| 
						 | 
					6e8dd730ad | ||
| 
						 | 
					0fdab8c0b4 | ||
| 
						 | 
					24af87ae08 | ||
| 
						 | 
					175150d928 | ||
| 
						 | 
					50963e0fa1 | ||
| 
						 | 
					e0f65118a4 | ||
| 
						 | 
					c48111496c | ||
| 
						 | 
					2630c46c24 | ||
| 
						 | 
					4a41b24386 | ||
| 
						 | 
					f3d59531c1 | ||
| 
						 | 
					4a67ba0a88 | ||
| 
						 | 
					d19d535873 | ||
| 
						 | 
					2fd035582a | ||
| 
						 | 
					c057e14daf | ||
| 
						 | 
					06771873f3 | ||
| 
						 | 
					ee008c7db4 | ||
| 
						 | 
					b4874d9705 | ||
| 
						 | 
					06fc4209a7 | ||
| 
						 | 
					9d46a6d133 | ||
| 
						 | 
					bbbbd3cb5f | ||
| 
						 | 
					5db4a93697 | ||
| 
						 | 
					dc7529dc8e | ||
| 
						 | 
					301ea36264 | ||
| 
						 | 
					fc26badfdb | ||
| 
						 | 
					0ded79b785 | ||
| 
						 | 
					83a79dcb6d | ||
| 
						 | 
					c98e92b034 | ||
| 
						 | 
					c8dd6b1af1 | ||
| 
						 | 
					7ee0c9cc78 | ||
| 
						 | 
					648e452f8b | ||
| 
						 | 
					8e3177135f | ||
| 
						 | 
					7352cbc220 | ||
| 
						 | 
					3dd87d8989 | ||
| 
						 | 
					4a3192b704 | ||
| 
						 | 
					7cbb8947ff | ||
| 
						 | 
					482ad0444c | ||
| 
						 | 
					a3da545905 | ||
| 
						 | 
					043baf299a | ||
| 
						 | 
					cf2f7a9af5 | ||
| 
						 | 
					204219a477 | ||
| 
						 | 
					f7101c6aec | ||
| 
						 | 
					d8f104e765 | ||
| 
						 | 
					52e8568bdb | ||
| 
						 | 
					ab94ff3cdc | ||
| 
						 | 
					4bee83a981 | ||
| 
						 | 
					4359f23e63 | ||
| 
						 | 
					b7968becc3 | ||
| 
						 | 
					cc9075a14b | ||
| 
						 | 
					bc06ad4226 | ||
| 
						 | 
					183c829917 | ||
| 
						 | 
					266eee3029 | ||
| 
						 | 
					80631f5152 | ||
| 
						 | 
					3b965e7431 | ||
| 
						 | 
					a6c99568aa | ||
| 
						 | 
					c5639ca45b | ||
| 
						 | 
					46605615c0 | ||
| 
						 | 
					1950fba34b | ||
| 
						 | 
					02e694afc5 | ||
| 
						 | 
					18534b73be | ||
| 
						 | 
					430e2c27f2 | ||
| 
						 | 
					e623eb4197 | ||
| 
						 | 
					5f805ba414 | ||
| 
						 | 
					ba00f1d302 | ||
| 
						 | 
					367dc0d78f | ||
| 
						 | 
					48a824de07 | ||
| 
						 | 
					6c5200d0a1 | ||
| 
						 | 
					712ff6f5cc | ||
| 
						 | 
					f80bc3c09a | ||
| 
						 | 
					7c5efad1ca | ||
| 
						 | 
					d0edd224ca | ||
| 
						 | 
					6c5ef63375 | ||
| 
						 | 
					402420e159 | ||
| 
						 | 
					af302d62f3 | ||
| 
						 | 
					bedb908682 | ||
| 
						 | 
					9bf30de4cb | ||
| 
						 | 
					9302e2e27d | ||
| 
						 | 
					6ab8815b3b | ||
| 
						 | 
					4baae014ab | ||
| 
						 | 
					d000c35ff5 | ||
| 
						 | 
					9570c9199a | ||
| 
						 | 
					705ad208d7 | ||
| 
						 | 
					6e3367c4e7 | ||
| 
						 | 
					71d8da316a | ||
| 
						 | 
					ba990514c4 | ||
| 
						 | 
					0ae7f3b445 | ||
| 
						 | 
					307b49fee6 | ||
| 
						 | 
					6a940716f0 | ||
| 
						 | 
					53b30e5f15 | ||
| 
						 | 
					134741f681 | ||
| 
						 | 
					9ef77cfd3f | ||
| 
						 | 
					01e8f413ea | ||
| 
						 | 
					6aa2057202 | ||
| 
						 | 
					4583158cf5 | ||
| 
						 | 
					48b14f7347 | ||
| 
						 | 
					623e1896aa | ||
| 
						 | 
					e29652c8dd | ||
| 
						 | 
					6d0fe3e2ee | ||
| 
						 | 
					f25f13e789 | ||
| 
						 | 
					4101618556 | ||
| 
						 | 
					5f30084c6f | ||
| 
						 | 
					4c266aeb42 | ||
| 
						 | 
					00794c41e6 | ||
| 
						 | 
					f1cdfecaaf | ||
| 
						 | 
					c738615bf2 | ||
| 
						 | 
					8af885a0f3 | ||
| 
						 | 
					62cdb5c0c2 | ||
| 
						 | 
					843c4f8c1e | ||
| 
						 | 
					d82c9a24a7 | ||
| 
						 | 
					b24860c97b | ||
| 
						 | 
					e8e298581c | ||
| 
						 | 
					05769fdff1 | ||
| 
						 | 
					5c5c628954 | ||
| 
						 | 
					10f4172349 | ||
| 
						 | 
					d781c75dfe | ||
| 
						 | 
					0c0d1de317 | ||
| 
						 | 
					ab370762a4 | ||
| 
						 | 
					51bb4566e7 | ||
| 
						 | 
					0e00057477 | ||
| 
						 | 
					ccd70a835f | ||
| 
						 | 
					5bfde87159 | ||
| 
						 | 
					949dcd0b23 | ||
| 
						 | 
					4cad868175 | ||
| 
						 | 
					35f74cb3b6 | ||
| 
						 | 
					51a3361686 | ||
| 
						 | 
					0ac0cc263e | ||
| 
						 | 
					c730b5c009 | ||
| 
						 | 
					8c1cc56321 | ||
| 
						 | 
					c01abd559b | ||
| 
						 | 
					a5039cff58 | ||
| 
						 | 
					3bf4155fec | ||
| 
						 | 
					fb515bc057 | ||
| 
						 | 
					bd0c906c44 | ||
| 
						 | 
					0871b9c84c | ||
| 
						 | 
					0d4b4a1837 | ||
| 
						 | 
					474954afb6 | ||
| 
						 | 
					5041708810 | ||
| 
						 | 
					c630378701 | ||
| 
						 | 
					be5e6cc870 | ||
| 
						 | 
					87afc99489 | ||
| 
						 | 
					ff49b8fea8 | ||
| 
						 | 
					bb0bc65e27 | ||
| 
						 | 
					6a60704d8e | ||
| 
						 | 
					cd40beb1eb | ||
| 
						 | 
					e1df6b0a6f | ||
| 
						 | 
					b582b9f04d | ||
| 
						 | 
					407801d9ff | ||
| 
						 | 
					6bcbc0ae91 | ||
| 
						 | 
					62bd7d5eef | ||
| 
						 | 
					663962e873 | ||
| 
						 | 
					3e7458dfaa | ||
| 
						 | 
					db5cc430c7 | ||
| 
						 | 
					5b91a776f1 | ||
| 
						 | 
					0aa13fbea7 | ||
| 
						 | 
					2d20686131 | 
							
								
								
									
										29
									
								
								.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							@@ -40,7 +40,7 @@ Before contributing, please ensure that you have the following setup:
 | 
				
			|||||||
   - [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)
 | 
					   - [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Important Notes
 | 
					### Important Notes
 | 
				
			||||||
- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh) as templates when creating new scripts.
 | 
					- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh) as templates when creating new scripts. Final version of the script (the one you will push for review), must have all comments removed, except the ones in the file header.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -66,6 +66,12 @@ Start with the [template script](https://github.com/community-scripts/ProxmoxVE/
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 🤝 Contribution Process
 | 
					## 🤝 Contribution Process
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All PR's related to new scripts should be made against our Dev repository first, where we can test the scripts before they are pushed and merged in the official repository.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Our Dev repo is `http://www.github.com/community-scripts/ProxmoxVED`**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You will need to adjust paths mentioned further down this document to match the repo you're pushing the scripts to.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 1. Fork the repository
 | 
					### 1. Fork the repository
 | 
				
			||||||
Fork to your GitHub account
 | 
					Fork to your GitHub account
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -80,7 +86,24 @@ git switch -c your-feature-branch
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 4. Change paths in build.func install.func and AppName.sh
 | 
					### 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/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`.
 | 
					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]`\
 | 
				
			||||||
 | 
					 in following files:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`misc/build.func`\
 | 
				
			||||||
 | 
					`misc/install.func`\
 | 
				
			||||||
 | 
					`ct/AppName.sh`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example: `https://raw.githubusercontent.com/tremor021/PromoxVE/refs/heads/testbranch`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Also you need to change:\
 | 
				
			||||||
 | 
					`https://github.com/community-scripts/ProxmoxVE/raw/main`\
 | 
				
			||||||
 | 
					to\
 | 
				
			||||||
 | 
					`https://github.com/[USER]/[REPOSITORY]/raw/[BRANCH]`\
 | 
				
			||||||
 | 
					in `misc/install.func` in order for `update` shell command to work.\
 | 
				
			||||||
 | 
					These changes are only while writing and testing your scripts. Before opening a Pull Request, you should change all above mentioned paths in `misc/build.func`, `misc/install.func` and `ct/AppName.sh` to point to the original paths.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 4. Commit changes (without build.func and install.func!)
 | 
					### 4. Commit changes (without build.func and install.func!)
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
@@ -93,7 +116,7 @@ git push origin your-feature-branch
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 6. Create a Pull Request
 | 
					### 6. Create a Pull Request
 | 
				
			||||||
Open a Pull Request from your feature branch to the main repository branch. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request.
 | 
					Open a Pull Request from your feature branch to the main branch on the Dev repository. You must only include your **$AppName.sh**, **$AppName-install.sh** and **$AppName.json** files in the pull request.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md
									
									
									
									
										vendored
									
									
								
							@@ -75,6 +75,7 @@ Example:
 | 
				
			|||||||
>
 | 
					>
 | 
				
			||||||
> - Add your username and source URL
 | 
					> - Add your username and source URL
 | 
				
			||||||
> - For existing scripts, add "| Co-Author [YourUserName]" after the current author
 | 
					> - For existing scripts, add "| Co-Author [YourUserName]" after the current author
 | 
				
			||||||
 | 
					> - Source is a URL of github repo containting source files of the application you're installing (not URL of your homepage or a blog)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -95,7 +96,7 @@ Example:
 | 
				
			|||||||
>| Variable | Description | Notes |
 | 
					>| Variable | Description | Notes |
 | 
				
			||||||
>|----------|-------------|-------|
 | 
					>|----------|-------------|-------|
 | 
				
			||||||
>| `APP` | Application name | Must match ct\AppName.sh |
 | 
					>| `APP` | Application name | Must match ct\AppName.sh |
 | 
				
			||||||
>| `var_tags` | Proxmox display tags without Spaces, only ; | Limit the number |  
 | 
					>| `var_tags` | Proxmox display tags without Spaces, only ; | Limit the number to 2 |  
 | 
				
			||||||
>| `var_cpu` | CPU cores | Number of cores |
 | 
					>| `var_cpu` | CPU cores | Number of cores |
 | 
				
			||||||
>| `var_ram` | RAM | In MB |
 | 
					>| `var_ram` | RAM | In MB |
 | 
				
			||||||
>| `var_disk` | Disk capacity | In GB |
 | 
					>| `var_disk` | Disk capacity | In GB |
 | 
				
			||||||
@@ -247,7 +248,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no automatic update function for ${APP}."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,6 +67,7 @@ Example:
 | 
				
			|||||||
>
 | 
					>
 | 
				
			||||||
> - Add your username
 | 
					> - Add your username
 | 
				
			||||||
> - When updating/reworking scripts, add "| Co-Author [YourUserName]"
 | 
					> - When updating/reworking scripts, add "| Co-Author [YourUserName]"
 | 
				
			||||||
 | 
					> - Source is a URL of github repo containting source files of the application you're installing (not URL of your homepage or a blog)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 1.3 **Variables and function import**
 | 
					### 1.3 **Variables and function import**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -177,6 +178,7 @@ echo "${RELEASE}" >"/opt/AppName_version.txt"
 | 
				
			|||||||
- Use standard functions like `msg_info`, `msg_ok` or `msg_error` to print status messages.
 | 
					- Use standard functions like `msg_info`, `msg_ok` or `msg_error` to print status messages.
 | 
				
			||||||
- Each `msg_info` must be followed with a `msg_ok` before any other output is made.
 | 
					- Each `msg_info` must be followed with a `msg_ok` before any other output is made.
 | 
				
			||||||
- Display meaningful progress messages at key stages.
 | 
					- Display meaningful progress messages at key stages.
 | 
				
			||||||
 | 
					- Taking user input with `read -p` must be outside of `msg_info`...`msg_ok` code block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Example:
 | 
					Example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -184,6 +186,8 @@ Example:
 | 
				
			|||||||
msg_info "Installing Dependencies"
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
$STD apt-get install -y ...
 | 
					$STD apt-get install -y ...
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					read -p "Do you wish to enable HTTPS mode? (y/N): " httpschoice
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 6.2 **Verbosity**
 | 
					### 6.2 **Verbosity**
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										68
									
								
								.github/runner/docker/gh-runner-self.dockerfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								.github/runner/docker/gh-runner-self.dockerfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					FROM mcr.microsoft.com/dotnet/runtime-deps:8.0-jammy as build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ARG TARGETOS
 | 
				
			||||||
 | 
					ARG TARGETARCH
 | 
				
			||||||
 | 
					ARG DOCKER_VERSION=27.5.1
 | 
				
			||||||
 | 
					ARG BUILDX_VERSION=0.20.1
 | 
				
			||||||
 | 
					ARG RUNNER_ARCH="x64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN apt update -y && apt install sudo curl unzip -y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WORKDIR /actions-runner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN RUNNER_VERSION=$(curl -s https://api.github.com/repos/actions/runner/releases/latest | grep "tag_name" | head -n 1 | awk '{print substr($2, 3, length($2)-4)}') \
 | 
				
			||||||
 | 
					    && curl -f -L -o runner.tar.gz https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-${RUNNER_ARCH}-${RUNNER_VERSION}.tar.gz \
 | 
				
			||||||
 | 
					    && tar xzf ./runner.tar.gz \
 | 
				
			||||||
 | 
					    && rm runner.tar.gz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN RUNNER_CONTAINER_HOOKS_VERSION=$(curl -s https://api.github.com/repos/actions/runner-container-hooks/releases/latest | grep "tag_name" | head -n 1 | awk '{print substr($2, 3, length($2)-4)}') \
 | 
				
			||||||
 | 
					    && curl -f -L -o runner-container-hooks.zip https://github.com/actions/runner-container-hooks/releases/download/v${RUNNER_CONTAINER_HOOKS_VERSION}/actions-runner-hooks-k8s-${RUNNER_CONTAINER_HOOKS_VERSION}.zip \
 | 
				
			||||||
 | 
					    && unzip ./runner-container-hooks.zip -d ./k8s \
 | 
				
			||||||
 | 
					    && rm runner-container-hooks.zip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN export RUNNER_ARCH=${TARGETARCH} \
 | 
				
			||||||
 | 
					    && if [ "$RUNNER_ARCH" = "amd64" ]; then export DOCKER_ARCH=x86_64 ; fi \
 | 
				
			||||||
 | 
					    && if [ "$RUNNER_ARCH" = "arm64" ]; then export DOCKER_ARCH=aarch64 ; fi \
 | 
				
			||||||
 | 
					    && curl -fLo docker.tgz https://download.docker.com/${TARGETOS}/static/stable/${DOCKER_ARCH}/docker-${DOCKER_VERSION}.tgz \
 | 
				
			||||||
 | 
					    && tar zxvf docker.tgz \
 | 
				
			||||||
 | 
					    && rm -rf docker.tgz \
 | 
				
			||||||
 | 
					    && mkdir -p /usr/local/lib/docker/cli-plugins \
 | 
				
			||||||
 | 
					    && curl -fLo /usr/local/lib/docker/cli-plugins/docker-buildx \
 | 
				
			||||||
 | 
					        "https://github.com/docker/buildx/releases/download/v${BUILDX_VERSION}/buildx-v${BUILDX_VERSION}.linux-${TARGETARCH}" \
 | 
				
			||||||
 | 
					    && chmod +x /usr/local/lib/docker/cli-plugins/docker-buildx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FROM mcr.microsoft.com/dotnet/runtime-deps:8.0-jammy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ENV DEBIAN_FRONTEND=noninteractive
 | 
				
			||||||
 | 
					ENV RUNNER_MANUALLY_TRAP_SIG=1
 | 
				
			||||||
 | 
					ENV ACTIONS_RUNNER_PRINT_LOG_TO_STDOUT=1
 | 
				
			||||||
 | 
					ENV ImageOS=ubuntu22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN apt update -y \
 | 
				
			||||||
 | 
					    && apt install -y --no-install-recommends sudo lsb-release gpg-agent software-properties-common curl jq unzip \
 | 
				
			||||||
 | 
					    && rm -rf /var/lib/apt/lists/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN add-apt-repository ppa:git-core/ppa \
 | 
				
			||||||
 | 
					    && apt update -y \
 | 
				
			||||||
 | 
					    && apt install -y git \
 | 
				
			||||||
 | 
					    && rm -rf /var/lib/apt/lists/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RUN adduser --disabled-password --gecos "" --uid 1001 runner \
 | 
				
			||||||
 | 
					    && groupadd docker --gid 123 \
 | 
				
			||||||
 | 
					    && usermod -aG sudo runner \
 | 
				
			||||||
 | 
					    && usermod -aG docker runner \
 | 
				
			||||||
 | 
					    && echo "%sudo   ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers \
 | 
				
			||||||
 | 
					    && echo "Defaults env_keep += \"DEBIAN_FRONTEND\"" >> /etc/sudoers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Install own dependencies in final image
 | 
				
			||||||
 | 
					RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
 | 
				
			||||||
 | 
					    && apt-get install -y nodejs \
 | 
				
			||||||
 | 
					    && apt-get install -y gh jq git
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WORKDIR /home/runner
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					COPY --chown=runner:docker --from=build /actions-runner .
 | 
				
			||||||
 | 
					COPY --from=build /usr/local/lib/docker/cli-plugins/docker-buildx /usr/local/lib/docker/cli-plugins/docker-buildx
 | 
				
			||||||
 | 
					RUN install -o root -g root -m 755 docker/* /usr/bin/ && rm -rf docker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					USER runner
 | 
				
			||||||
@@ -10,7 +10,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  update-app-files:
 | 
					  update-app-files:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      contents: write
 | 
					      contents: write
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								.github/workflows/autolabeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								.github/workflows/autolabeler.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,7 +7,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  autolabeler:
 | 
					  autolabeler:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      pull-requests: write
 | 
					      pull-requests: write
 | 
				
			||||||
    env:
 | 
					    env:
 | 
				
			||||||
@@ -16,9 +16,9 @@ jobs:
 | 
				
			|||||||
      - name: Checkout repository
 | 
					      - name: Checkout repository
 | 
				
			||||||
        uses: actions/checkout@v4
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Install minimatch
 | 
					      - name: Install dependencies
 | 
				
			||||||
        run: npm install minimatch
 | 
					        run: npm install minimatch
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
      - name: Label PR based on file changes and PR template
 | 
					      - name: Label PR based on file changes and PR template
 | 
				
			||||||
        uses: actions/github-script@v7
 | 
					        uses: actions/github-script@v7
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
@@ -61,21 +61,26 @@ jobs:
 | 
				
			|||||||
                labelsToAdd.add(label);
 | 
					                labelsToAdd.add(label);
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            const templateLabelMappings = {
 | 
					            //if two labels or more are added, return
 | 
				
			||||||
              "🐞 **Bug fix**": "bugfix",
 | 
					              if (labelsToAdd.size < 2) {
 | 
				
			||||||
              "✨ **New feature**": "feature",
 | 
					                const templateLabelMappings = {
 | 
				
			||||||
              "💥 **Breaking change**": "breaking change",
 | 
					                "🐞 **Bug fix**": "bugfix",
 | 
				
			||||||
            };
 | 
					                "✨ **New feature**": "feature",
 | 
				
			||||||
            
 | 
					                "💥 **Breaking change**": "breaking change",
 | 
				
			||||||
            for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
 | 
					              };
 | 
				
			||||||
              const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
 | 
					
 | 
				
			||||||
              const regex = new RegExp(`- \\[(x|X)\\]\\s*.*${escapedCheckbox}`, "i");
 | 
					              for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
 | 
				
			||||||
              const match = prBody.match(regex);              
 | 
					                const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
 | 
				
			||||||
              if (match) {
 | 
					                const regex = new RegExp(`- \\[(x|X)\\]\\s*.*${escapedCheckbox}`, "i");
 | 
				
			||||||
                console.log(`Match: ${match}`);
 | 
					                const match = prBody.match(regex);              
 | 
				
			||||||
                labelsToAdd.add(label);
 | 
					                if (match) {
 | 
				
			||||||
 | 
					                  console.log(`Match: ${match}`);
 | 
				
			||||||
 | 
					                  labelsToAdd.add(label);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
              }
 | 
					              }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            console.log(`Labels to add: ${Array.from(labelsToAdd).join(", ")}`);
 | 
					            console.log(`Labels to add: ${Array.from(labelsToAdd).join(", ")}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,7 +7,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  update-changelog-pull-request:
 | 
					  update-changelog-pull-request:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    env:
 | 
					    env:
 | 
				
			||||||
      CONFIG_PATH: .github/changelog-pr-config.json
 | 
					      CONFIG_PATH: .github/changelog-pr-config.json
 | 
				
			||||||
      BRANCH_NAME: github-action-update-changelog
 | 
					      BRANCH_NAME: github-action-update-changelog
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										122
									
								
								.github/workflows/close-discussion.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								.github/workflows/close-discussion.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,122 @@
 | 
				
			|||||||
 | 
					name: Close Discussion on PR Merge
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    types: [closed]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  close-discussion:
 | 
				
			||||||
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout Repository
 | 
				
			||||||
 | 
					        uses: actions/checkout@v4  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Set Up Node.js
 | 
				
			||||||
 | 
					        uses: actions/setup-node@v4
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          node-version: "20"
 | 
				
			||||||
 | 
					      - name: Install Dependencies
 | 
				
			||||||
 | 
					        run: npm install zx @octokit/graphql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Close Discussion
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					          PR_BODY: ${{ github.event.pull_request.body }}
 | 
				
			||||||
 | 
					          PR_NUMBER: ${{ github.event.pull_request.number }}
 | 
				
			||||||
 | 
					          REPO_OWNER: ${{ github.repository_owner }}
 | 
				
			||||||
 | 
					          REPO_NAME: ${{ github.event.repository.name }}
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          npx zx << 'EOF'
 | 
				
			||||||
 | 
					          import { graphql } from "@octokit/graphql";
 | 
				
			||||||
 | 
					          (async function() {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					              const token = process.env.GITHUB_TOKEN;
 | 
				
			||||||
 | 
					              const prBody = process.env.PR_BODY;
 | 
				
			||||||
 | 
					              const prNumber = process.env.PR_NUMBER;
 | 
				
			||||||
 | 
					              const owner = process.env.REPO_OWNER;
 | 
				
			||||||
 | 
					              const repo = process.env.REPO_NAME;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if (!token || !prBody || !prNumber || !owner || !repo) {
 | 
				
			||||||
 | 
					                console.log("Missing required environment variables.");
 | 
				
			||||||
 | 
					                process.exit(1);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              const match = prBody.match(/#(\d+)/);
 | 
				
			||||||
 | 
					              if (!match) {
 | 
				
			||||||
 | 
					                console.log("No discussion ID found in PR body.");
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              const discussionNumber = match[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              console.log(`Extracted Discussion Number: ${discussionNumber}`);
 | 
				
			||||||
 | 
					              console.log(`PR Number: ${prNumber}`);
 | 
				
			||||||
 | 
					              console.log(`Repository: ${owner}/${repo}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              const graphqlWithAuth = graphql.defaults({
 | 
				
			||||||
 | 
					                headers: { authorization: `Bearer ${token}` },
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              const discussionQuery = `
 | 
				
			||||||
 | 
					                query($owner: String!, $repo: String!, $number: Int!) {
 | 
				
			||||||
 | 
					                  repository(owner: $owner, name: $repo) {
 | 
				
			||||||
 | 
					                    discussion(number: $number) {
 | 
				
			||||||
 | 
					                      id
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					              `;
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					              const discussionResponse = await graphqlWithAuth(discussionQuery, {
 | 
				
			||||||
 | 
					                  owner,
 | 
				
			||||||
 | 
					                  repo,
 | 
				
			||||||
 | 
					                  number: parseInt(discussionNumber, 10),
 | 
				
			||||||
 | 
					              });              
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					              const discussionQLId = discussionResponse.repository.discussion.id;
 | 
				
			||||||
 | 
					              if (!discussionQLId) {
 | 
				
			||||||
 | 
					                console.log("Failed to fetch discussion GraphQL ID.");
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              console.log(`GraphQL Discussion ID: ${discussionQLId}`);
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					              const commentMutation = `
 | 
				
			||||||
 | 
					                mutation($discussionId: ID!, $body: String!) {
 | 
				
			||||||
 | 
					                  addDiscussionComment(input: { discussionId: $discussionId, body: $body }) {
 | 
				
			||||||
 | 
					                    comment { id body }
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					              `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              const commentResponse = await graphqlWithAuth(commentMutation, {
 | 
				
			||||||
 | 
					                discussionId: discussionQLId,
 | 
				
			||||||
 | 
					                body: `Merged with PR #${prNumber}`,
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              const commentId = commentResponse.addDiscussionComment.comment.id;
 | 
				
			||||||
 | 
					              if (!commentId) {
 | 
				
			||||||
 | 
					                console.log("Failed to post the comment.");
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              console.log(`Comment Posted Successfully! Comment ID: ${commentId}`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              const markAnswerMutation = `
 | 
				
			||||||
 | 
					                mutation($id: ID!) {
 | 
				
			||||||
 | 
					                  markDiscussionCommentAsAnswer(input: { id: $id }) {
 | 
				
			||||||
 | 
					                    discussion { id title }
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					              `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              await graphqlWithAuth(markAnswerMutation, { id: commentId });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              console.log("Comment marked as answer successfully!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } catch (error) {
 | 
				
			||||||
 | 
					              console.error("Error:", error);
 | 
				
			||||||
 | 
					              return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          })();
 | 
				
			||||||
 | 
					          EOF
 | 
				
			||||||
							
								
								
									
										37
									
								
								.github/workflows/create-docker-for-runner.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								.github/workflows/create-docker-for-runner.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					name: Build and Publish Docker Image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  push:
 | 
				
			||||||
 | 
					    branches:
 | 
				
			||||||
 | 
					      - main 
 | 
				
			||||||
 | 
					    paths:
 | 
				
			||||||
 | 
					      - '.github/runner/docker/**' 
 | 
				
			||||||
 | 
					  schedule:
 | 
				
			||||||
 | 
					    - cron: '0 0 * * *'  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest #To ensure it always builds we use the github runner with all the right tooling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout code
 | 
				
			||||||
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Log in to GHCR
 | 
				
			||||||
 | 
					        uses: docker/login-action@v2
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          registry: ghcr.io
 | 
				
			||||||
 | 
					          username: ${{ github.actor }}
 | 
				
			||||||
 | 
					          password: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Build Docker image
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          repo_name=${{ github.repository }}  # Get repository name
 | 
				
			||||||
 | 
					          repo_name_lower=$(echo $repo_name | tr '[:upper:]' '[:lower:]')  # Convert to lowercase
 | 
				
			||||||
 | 
					          docker build -t ghcr.io/$repo_name_lower/gh-runner-self:latest -f .github/runner/docker/gh-runner-self.dockerfile .
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					      - name: Push Docker image to GHCR
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          repo_name=${{ github.repository }}  # Get repository name
 | 
				
			||||||
 | 
					          repo_name_lower=$(echo $repo_name | tr '[:upper:]' '[:lower:]')  # Convert to lowercase
 | 
				
			||||||
 | 
					          docker push ghcr.io/$repo_name_lower/gh-runner-self:latest
 | 
				
			||||||
							
								
								
									
										2
									
								
								.github/workflows/delete-json-branch.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/delete-json-branch.yml
									
									
									
									
										vendored
									
									
								
							@@ -9,7 +9,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  delete_branch:
 | 
					  delete_branch:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout the code
 | 
					      - name: Checkout the code
 | 
				
			||||||
        uses: actions/checkout@v3
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/frontend-cicd.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/frontend-cicd.yml
									
									
									
									
										vendored
									
									
								
							@@ -27,7 +27,7 @@ concurrency:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    defaults:
 | 
					    defaults:
 | 
				
			||||||
      run:
 | 
					      run:
 | 
				
			||||||
        working-directory: frontend  # Set default working directory for all run steps
 | 
					        working-directory: frontend  # Set default working directory for all run steps
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								.github/workflows/github-release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								.github/workflows/github-release.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,25 +1,46 @@
 | 
				
			|||||||
name: Create new release
 | 
					name: Create Daily Release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  schedule:
 | 
					  schedule:
 | 
				
			||||||
    # Runs "At 00:01 every night" (UTC)
 | 
					    - cron: '1 0 * * *'  # Runs daily at 00:01 UTC
 | 
				
			||||||
    - cron: '1 0 * * *'
 | 
					  workflow_dispatch:
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  create-new-release:
 | 
					  create-daily-release:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      contents: write
 | 
					      contents: write
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout code
 | 
					      - name: Checkout repository
 | 
				
			||||||
        uses: actions/checkout@v4
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
      - name: Parse CHANGELOG.md for yesterday's entries and create a new release
 | 
					
 | 
				
			||||||
 | 
					      - name: Clean CHANGELOG (remove HTML header)
 | 
				
			||||||
 | 
					        run: sed -n '/^## /,$p' CHANGELOG.md > changelog_cleaned.md
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Extract relevant changelog section
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          YESTERDAY=$(date -u --date="yesterday" +%Y-%m-%d)
 | 
				
			||||||
 | 
					          echo "Checking for changes on: $YESTERDAY"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          # Extract the section from "## $YESTERDAY" until the next "## YYYY-MM-DD"
 | 
				
			||||||
 | 
					          sed -n "/^## $YESTERDAY/,/^## [0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/p" changelog_cleaned.md | head -n -1 > changelog_tmp_full.md
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          # Truncate the extracted section to 5000 characters
 | 
				
			||||||
 | 
					          head -c 5000 changelog_tmp_full.md > changelog_tmp.md
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          echo "=== Extracted Changelog ==="
 | 
				
			||||||
 | 
					          cat changelog_tmp.md
 | 
				
			||||||
 | 
					          echo "==========================="
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          # Abort if no content was found
 | 
				
			||||||
 | 
					          if [ ! -s changelog_tmp.md ]; then
 | 
				
			||||||
 | 
					            echo "No changes found for $YESTERDAY, skipping release."
 | 
				
			||||||
 | 
					            exit 0
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Create GitHub release
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
					          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          YESTERDAY=$(date -u --date="yesterday" +%Y-%m-%d)
 | 
					          YESTERDAY=$(date -u --date="yesterday" +%Y-%m-%d)
 | 
				
			||||||
          YESTERDAY_CHANGELOG_NOTES=$(awk '/^## '"$YESTERDAY"'/ {f=1; next} f && /^## [0-9]{4}-[0-9]{2}-[0-9]{2}/ {f=0} f && !/^## / {print}' CHANGELOG.md)
 | 
					          gh release create "$YESTERDAY" -t "$YESTERDAY" -F changelog_tmp.md
 | 
				
			||||||
          
 | 
					 | 
				
			||||||
          if [ -n "$YESTERDAY_CHANGELOG_NOTES" ]; then
 | 
					 | 
				
			||||||
            gh release create "$YESTERDAY" -t "$YESTERDAY" -n "$YESTERDAY_CHANGELOG_NOTES" --latest
 | 
					 | 
				
			||||||
          fi
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										129
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										129
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
								
							@@ -62,46 +62,71 @@ jobs:
 | 
				
			|||||||
        id: run-install
 | 
					        id: run-install
 | 
				
			||||||
        continue-on-error: true
 | 
					        continue-on-error: true
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          set +e  
 | 
					            set +e  
 | 
				
			||||||
          #run for each files in /ct
 | 
					            #run for each files in /ct
 | 
				
			||||||
          for FILE in ${{ env.ALL_FILES }}; do            
 | 
					            for FILE in ${{ env.ALL_FILES }}; do            
 | 
				
			||||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
					              STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
				
			||||||
            echo "Running Test for: $STRIPPED_NAME"
 | 
					              echo "Running Test for: $STRIPPED_NAME"
 | 
				
			||||||
            if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
 | 
					              if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "$FILE"; then
 | 
				
			||||||
              CT_SCRIPT="ct/$STRIPPED_NAME.sh"
 | 
					                echo "The script contains an interactive prompt. Skipping execution."
 | 
				
			||||||
              echo $CT_SCRIPT
 | 
					                continue
 | 
				
			||||||
              if [[ ! -f $CT_SCRIPT ]]; then
 | 
					 | 
				
			||||||
                echo "No CT script found for $STRIPPED_NAME"
 | 
					 | 
				
			||||||
                ERROR_MSG="No CT script found for $FILE"
 | 
					 | 
				
			||||||
                RUN=false
 | 
					 | 
				
			||||||
              fi
 | 
					              fi
 | 
				
			||||||
                echo "Found CT script for $STRIPPED_NAME"
 | 
					              if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
 | 
				
			||||||
                chmod +x "$CT_SCRIPT"
 | 
					                CT_SCRIPT="ct/$STRIPPED_NAME.sh"
 | 
				
			||||||
                RUNNING_FILE=$CT_SCRIPT
 | 
					                if [[ ! -f $CT_SCRIPT ]]; then
 | 
				
			||||||
            elif [[ $FILE =~ ^ct/.*\.sh$ ]]; then
 | 
					                  echo "No CT script found for $STRIPPED_NAME"
 | 
				
			||||||
              INSTALL_SCRIPT="install/$STRIPPED_NAME-install.sh"
 | 
					                  ERROR_MSG="No CT script found for $FILE"
 | 
				
			||||||
              if [[ ! -f $INSTALL_SCRIPT ]]; then
 | 
					                  echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
				
			||||||
                echo "No install script found for $STRIPPED_NAME"
 | 
					                  continue
 | 
				
			||||||
                ERROR_MSG="No install script found for $FILE"
 | 
					                fi
 | 
				
			||||||
                RUN=false
 | 
					                  if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "install/$STRIPPED_NAME-install.sh"; then
 | 
				
			||||||
              fi                
 | 
					                    echo "The script contains an interactive prompt. Skipping execution."
 | 
				
			||||||
                echo "Found install script for $STRIPPED_NAME"
 | 
					                    continue
 | 
				
			||||||
                chmod +x "$INSTALL_SCRIPT"
 | 
					                  fi
 | 
				
			||||||
                RUNNING_FILE=$FILE
 | 
					                  echo "Found CT script for $STRIPPED_NAME"
 | 
				
			||||||
            fi
 | 
					                  chmod +x "$CT_SCRIPT"
 | 
				
			||||||
            if [[ $RUN != "false" ]]; then
 | 
					                  RUNNING_FILE=$CT_SCRIPT
 | 
				
			||||||
 | 
					              elif [[ $FILE =~ ^ct/.*\.sh$ ]]; then
 | 
				
			||||||
 | 
					                INSTALL_SCRIPT="install/$STRIPPED_NAME-install.sh"
 | 
				
			||||||
 | 
					                if [[ ! -f $INSTALL_SCRIPT ]]; then
 | 
				
			||||||
 | 
					                  echo "No install script found for $STRIPPED_NAME"
 | 
				
			||||||
 | 
					                  ERROR_MSG="No install script found for $FILE"
 | 
				
			||||||
 | 
					                  echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
				
			||||||
 | 
					                  continue
 | 
				
			||||||
 | 
					                fi                
 | 
				
			||||||
 | 
					                  echo "Found install script for $STRIPPED_NAME"
 | 
				
			||||||
 | 
					                  chmod +x "$INSTALL_SCRIPT"
 | 
				
			||||||
 | 
					                  RUNNING_FILE=$FILE
 | 
				
			||||||
 | 
					                  if grep -E -q 'read\s+-r\s+-p\s+".*"\s+\w+' "ct/$STRIPPED_NAME.sh"; then
 | 
				
			||||||
 | 
					                    echo "The script contains an interactive prompt. Skipping execution."
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					                  fi
 | 
				
			||||||
 | 
					              fi
 | 
				
			||||||
 | 
					              git remote add community-scripts https://github.com/community-scripts/ProxmoxVE.git
 | 
				
			||||||
 | 
					              git fetch community-scripts
 | 
				
			||||||
 | 
					              rm -f .github/workflows/scripts/app-test/pr-build.func || true
 | 
				
			||||||
 | 
					              rm -f .github/workflows/scripts/app-test/pr-install.func || true
 | 
				
			||||||
 | 
					              rm -f .github/workflows/scripts/app-test/pr-alpine-install.func || true
 | 
				
			||||||
 | 
					              rm -f .github/workflows/scripts/app-test/pr-create-lxc.sh || true
 | 
				
			||||||
 | 
					              git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-build.func
 | 
				
			||||||
 | 
					              git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-install.func
 | 
				
			||||||
 | 
					              git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
				
			||||||
 | 
					              git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
				
			||||||
              chmod +x $RUNNING_FILE         
 | 
					              chmod +x $RUNNING_FILE         
 | 
				
			||||||
              sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/.github/workflows/scripts/app-test/pr-build.func)|g' "$RUNNING_FILE"
 | 
					              chmod +x .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
				
			||||||
 | 
					              chmod +x .github/workflows/scripts/app-test/pr-install.func
 | 
				
			||||||
 | 
					              chmod +x .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
				
			||||||
 | 
					              chmod +x .github/workflows/scripts/app-test/pr-build.func
 | 
				
			||||||
 | 
					              sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source .github/workflows/scripts/app-test/pr-build.func|g' "$RUNNING_FILE"
 | 
				
			||||||
              echo "Executing $RUNNING_FILE"
 | 
					              echo "Executing $RUNNING_FILE"
 | 
				
			||||||
              ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
 | 
					              ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
 | 
				
			||||||
              echo "Finished running $FILE"
 | 
					              echo "Finished running $FILE"
 | 
				
			||||||
            fi  
 | 
					              if [ -n "$ERROR_MSG" ]; then
 | 
				
			||||||
            if [ -n "$ERROR_MSG" ]; then
 | 
					                echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
 | 
				
			||||||
              echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
 | 
					                echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
				
			||||||
              echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
					              fi
 | 
				
			||||||
            fi
 | 
					            done
 | 
				
			||||||
          done
 | 
					            set -e  # Restore exit-on-error
 | 
				
			||||||
          set -e  # Restore exit-on-error
 | 
					 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
      - name: Cleanup PVE Node
 | 
					      - name: Cleanup PVE Node
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
@@ -115,34 +140,38 @@ jobs:
 | 
				
			|||||||
            fi            
 | 
					            fi            
 | 
				
			||||||
          done
 | 
					          done
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Post error comments
 | 
					      - name: Post error comments
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          ERROR="false"
 | 
					          ERROR="false"
 | 
				
			||||||
          SEARCH_LINE=".github/workflows/scripts/app-test/pr-build.func: line 255"
 | 
					          SEARCH_LINE=".github/workflows/scripts/app-test/pr-build.func: line 255:"
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					          # Get all existing comments on the PR
 | 
				
			||||||
 | 
					          EXISTING_COMMENTS=$(gh pr view ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --json comments --jq '.comments[].body')
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
          for FILE in ${{ env.ALL_FILES }}; do
 | 
					          for FILE in ${{ env.ALL_FILES }}; do
 | 
				
			||||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
					            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
				
			||||||
            if [[ ! -f result_$STRIPPED_NAME.log ]]; then
 | 
					            if [[ ! -f result_$STRIPPED_NAME.log ]]; then
 | 
				
			||||||
              continue
 | 
					              continue
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
            ERROR_MSG=$(cat result_$STRIPPED_NAME.log)
 | 
					            ERROR_MSG=$(cat result_$STRIPPED_NAME.log)
 | 
				
			||||||
      
 | 
					          
 | 
				
			||||||
            if [ -n "$ERROR_MSG" ]; then
 | 
					            if [ -n "$ERROR_MSG" ]; then
 | 
				
			||||||
              CLEANED_ERROR_MSG=$(echo "$ERROR_MSG" | sed "s|$SEARCH_LINE.*||")
 | 
					              CLEANED_ERROR_MSG=$(echo "$ERROR_MSG" | sed "s|$SEARCH_LINE.*||")
 | 
				
			||||||
              echo "Posting error message for $FILE"
 | 
					              COMMENT_BODY=":warning: The script _**$FILE**_ failed with the following message: <br> <div><strong>${CLEANED_ERROR_MSG}</strong></div>"
 | 
				
			||||||
              echo ${CLEANED_ERROR_MSG}
 | 
					          
 | 
				
			||||||
              gh pr comment ${{ github.event.pull_request.number }} \
 | 
					              # Check if the comment already exists
 | 
				
			||||||
                --repo ${{ github.repository }} \
 | 
					              if echo "$EXISTING_COMMENTS" | grep -qF "$COMMENT_BODY"; then
 | 
				
			||||||
                --body ":warning: The script _**$FILE**_ failed with the following message: <br> <div><strong>${CLEANED_ERROR_MSG}</strong></div>"
 | 
					                echo "Skipping duplicate comment for $FILE"
 | 
				
			||||||
              ERROR="true"
 | 
					              else
 | 
				
			||||||
 | 
					                echo "Posting error message for $FILE"
 | 
				
			||||||
 | 
					                gh pr comment ${{ github.event.pull_request.number }} \
 | 
				
			||||||
 | 
					                  --repo ${{ github.repository }} \
 | 
				
			||||||
 | 
					                  --body "$COMMENT_BODY"
 | 
				
			||||||
 | 
					                ERROR="true"
 | 
				
			||||||
 | 
					              fi
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
          done
 | 
					          done
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
          echo "ERROR=$ERROR" >> $GITHUB_ENV
 | 
					          echo "ERROR=$ERROR" >> $GITHUB_ENV
 | 
				
			||||||
        env:
 | 
					 | 
				
			||||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      - name: Fail if error
 | 
					 | 
				
			||||||
        if: ${{ env.ERROR == 'true' }}
 | 
					 | 
				
			||||||
        run: exit 1 
 | 
					 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										243
									
								
								.github/workflows/script_format.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								.github/workflows/script_format.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,243 @@
 | 
				
			|||||||
 | 
					name: Script Format Check
 | 
				
			||||||
 | 
					permissions:
 | 
				
			||||||
 | 
					    pull-requests: write
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  pull_request_target:
 | 
				
			||||||
 | 
					    branches:
 | 
				
			||||||
 | 
					      - main
 | 
				
			||||||
 | 
					    paths:
 | 
				
			||||||
 | 
					      - 'install/*.sh'
 | 
				
			||||||
 | 
					      - 'ct/*.sh'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  run-install-script:
 | 
				
			||||||
 | 
					    runs-on: pvenode
 | 
				
			||||||
 | 
					    steps:          
 | 
				
			||||||
 | 
					      - name: Checkout PR branch (supports forks)
 | 
				
			||||||
 | 
					        uses: actions/checkout@v4
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          ref: ${{ github.event.pull_request.head.ref }}
 | 
				
			||||||
 | 
					          repository: ${{ github.event.pull_request.head.repo.full_name }} 
 | 
				
			||||||
 | 
					          fetch-depth: 0          
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					      - name: Add Git safe directory
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          git config --global --add safe.directory /__w/ProxmoxVE/ProxmoxVE
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      - name: Set up GH_TOKEN
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          echo "GH_TOKEN=${GH_TOKEN}" >> $GITHUB_ENV
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Get Changed Files
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          CHANGED_FILES=$(gh pr diff ${{ github.event.pull_request.number }} --repo ${{ github.repository }} --name-only)
 | 
				
			||||||
 | 
					          CHANGED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')
 | 
				
			||||||
 | 
					          echo "Changed files: $CHANGED_FILES"
 | 
				
			||||||
 | 
					          echo "SCRIPT=$CHANGED_FILES" >> $GITHUB_ENV
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					      - name: Check scripts
 | 
				
			||||||
 | 
					        id: run-install
 | 
				
			||||||
 | 
					        continue-on-error: true
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          for FILE in ${{ env.SCRIPT }}; do
 | 
				
			||||||
 | 
					              STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
				
			||||||
 | 
					              echo "Running Test for: $STRIPPED_NAME"
 | 
				
			||||||
 | 
					              FILE_STRIPPED="${FILE##*/}"
 | 
				
			||||||
 | 
					              LOG_FILE="result_$FILE_STRIPPED.log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              if [[ $FILE =~ ^ct/.*\.sh$ ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                FIRST_LINE=$(sed -n '1p' "$FILE")
 | 
				
			||||||
 | 
					                [[ "$FIRST_LINE" != "#!/usr/bin/env bash" ]] && echo "Line 1 was $FIRST_LINE | Should be: #!/usr/bin/env bash" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					                SECOND_LINE=$(sed -n '2p' "$FILE")
 | 
				
			||||||
 | 
					                [[ "$SECOND_LINE" != "source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)" ]] && 
 | 
				
			||||||
 | 
					                echo "Line 2 was $SECOND_LINE | Should be: source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					                THIRD_LINE=$(sed -n '3p' "$FILE")
 | 
				
			||||||
 | 
					                 if ! [[ "$THIRD_LINE" =~ ^#\ Copyright\ \(c\)\ [0-9]{4}-[0-9]{4}\ community-scripts\ ORG$ || "$THIRD_LINE" =~ ^Copyright\ \(c\)\ [0-9]{4}-[0-9]{4}\ tteck$ ]]; then
 | 
				
			||||||
 | 
					                     echo "Line 3 was $THIRD_LINE | Should be: # Copyright (c) 2021-2025 community-scripts ORG" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					                 fi
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					              EXPECTED_AUTHOR="# Author:"
 | 
				
			||||||
 | 
					              EXPECTED_LICENSE="# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE"
 | 
				
			||||||
 | 
					              EXPECTED_SOURCE="# Source:"
 | 
				
			||||||
 | 
					              EXPECTED_EMPTY=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              for i in {4..7}; do
 | 
				
			||||||
 | 
					                  LINE=$(sed -n "${i}p" "$FILE")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  case $i in
 | 
				
			||||||
 | 
					                      4) 
 | 
				
			||||||
 | 
					                          [[ $LINE == $EXPECTED_AUTHOR* ]] || printf "Line %d was: '%s' | Should start with: '%s'\n" "$i" "$LINE" "$EXPECTED_AUTHOR" >> $LOG_FILE
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      5) 
 | 
				
			||||||
 | 
					                          [[ "$LINE" == "$EXPECTED_LICENSE" ]] || printf "Line %d was: '%s' | Should be: '%s'\n" "$i" "$LINE" "$EXPECTED_LICENSE" >> $LOG_FILE
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      6) 
 | 
				
			||||||
 | 
					                          [[ $LINE == $EXPECTED_SOURCE* ]] || printf "Line %d was: '%s' | Should start with: '%s'\n" "$i" "$LINE" "$EXPECTED_SOURCE" >> $LOG_FILE
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      7) 
 | 
				
			||||||
 | 
					                          [[ -z $LINE ]] || printf "Line %d was: '%s' | Should be empty\n" "$i" "$LINE" >> $LOG_FILE
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                  esac
 | 
				
			||||||
 | 
					              done
 | 
				
			||||||
 | 
					                  
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					              EXPECTED_PREFIXES=(
 | 
				
			||||||
 | 
					                  "APP="
 | 
				
			||||||
 | 
					                  "var_tags="
 | 
				
			||||||
 | 
					                  "var_cpu="   # Must be a number
 | 
				
			||||||
 | 
					                  "var_ram="   # Must be a number
 | 
				
			||||||
 | 
					                  "var_disk="  # Must be a number
 | 
				
			||||||
 | 
					                  "var_os="    # Must be debian, alpine, or ubuntu
 | 
				
			||||||
 | 
					                  "var_version="
 | 
				
			||||||
 | 
					                  "var_unprivileged="  # Must be 0 or 1
 | 
				
			||||||
 | 
					              )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              for i in {8..15}; do
 | 
				
			||||||
 | 
					                  LINE=$(sed -n "${i}p" "$FILE")
 | 
				
			||||||
 | 
					                  INDEX=$((i - 8))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  case $INDEX in
 | 
				
			||||||
 | 
					                      2|3|4)  # var_cpu, var_ram, var_disk (must be numbers)
 | 
				
			||||||
 | 
					                          if [[ "$LINE" =~ ^${EXPECTED_PREFIXES[$INDEX]}([0-9]+)$ ]]; then
 | 
				
			||||||
 | 
					                              continue  # Valid
 | 
				
			||||||
 | 
					                          else
 | 
				
			||||||
 | 
					                              echo "Line $i was '$LINE' | Should be: '${EXPECTED_PREFIXES[$INDEX]}<NUMBER>'" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					                          fi
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      5)  # var_os (must be debian, alpine, or ubuntu)
 | 
				
			||||||
 | 
					                          if [[ "$LINE" =~ ^var_os=(debian|alpine|ubuntu)$ ]]; then
 | 
				
			||||||
 | 
					                              continue  # Valid
 | 
				
			||||||
 | 
					                          else
 | 
				
			||||||
 | 
					                              echo "Line $i was '$LINE' | Should be: 'var_os=[debian|alpine|ubuntu]'" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					                          fi
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      7)  # var_unprivileged (must be 0 or 1)
 | 
				
			||||||
 | 
					                          if [[ "$LINE" =~ ^var_unprivileged=[01]$ ]]; then
 | 
				
			||||||
 | 
					                              continue  # Valid
 | 
				
			||||||
 | 
					                          else
 | 
				
			||||||
 | 
					                              echo "Line $i was '$LINE' | Should be: 'var_unprivileged=[0|1]'" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					                          fi
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      *)  # Other lines (must start with expected prefix)
 | 
				
			||||||
 | 
					                          if [[ "$LINE" == ${EXPECTED_PREFIXES[$INDEX]}* ]]; then
 | 
				
			||||||
 | 
					                              continue  # Valid
 | 
				
			||||||
 | 
					                          else
 | 
				
			||||||
 | 
					                              echo "Line $i was '$LINE' | Should start with '${EXPECTED_PREFIXES[$INDEX]}'" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					                          fi
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                  esac
 | 
				
			||||||
 | 
					              done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              for i in {16..20}; do
 | 
				
			||||||
 | 
					                  LINE=$(sed -n "${i}p" "$FILE")
 | 
				
			||||||
 | 
					                  EXPECTED=(
 | 
				
			||||||
 | 
					                      "header_info \"$APP\""
 | 
				
			||||||
 | 
					                      "variables"
 | 
				
			||||||
 | 
					                      "color"
 | 
				
			||||||
 | 
					                      "catch_errors"
 | 
				
			||||||
 | 
					                      "function update_script() {"
 | 
				
			||||||
 | 
					                  )
 | 
				
			||||||
 | 
					                  [[ "$LINE" != "${EXPECTED[$((i-16))]}" ]] && echo "Line $i was $LINE | Should be: ${EXPECTED[$((i-16))]}" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					              done
 | 
				
			||||||
 | 
					            cat "$LOG_FILE"
 | 
				
			||||||
 | 
					          elif [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              FIRST_LINE=$(sed -n '1p' "$FILE")
 | 
				
			||||||
 | 
					              [[ "$FIRST_LINE" != "#!/usr/bin/env bash" ]] && echo "Line 1 was $FIRST_LINE | Should be: #!/usr/bin/env bash" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              SECOND_LINE=$(sed -n '2p' "$FILE")
 | 
				
			||||||
 | 
					              [[ -n "$SECOND_LINE" ]] && echo "Line 2 should be empty" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              THIRD_LINE=$(sed -n '3p' "$FILE")
 | 
				
			||||||
 | 
					              if ! [[ "$THIRD_LINE" =~ ^#\ Copyright\ \(c\)\ [0-9]{4}-[0-9]{4}\ community-scripts\ ORG$ || "$THIRD_LINE" =~ ^Copyright\ \(c\)\ [0-9]{4}-[0-9]{4}\ tteck$ ]]; then
 | 
				
			||||||
 | 
					                  echo "Line 3 was $THIRD_LINE | Should be: # Copyright (c) 2021-2025 community-scripts ORG" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					              fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              EXPECTED_AUTHOR="# Author:"
 | 
				
			||||||
 | 
					              EXPECTED_LICENSE="# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE"
 | 
				
			||||||
 | 
					              EXPECTED_SOURCE="# Source:"
 | 
				
			||||||
 | 
					              EXPECTED_EMPTY=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              for i in {4..7}; do
 | 
				
			||||||
 | 
					                  LINE=$(sed -n "${i}p" "$FILE")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                  case $i in
 | 
				
			||||||
 | 
					                      4) 
 | 
				
			||||||
 | 
					                          [[ $LINE == $EXPECTED_AUTHOR* ]] || printf "Line %d was: '%s' | Should start with: '%s'\n" "$i" "$LINE" "$EXPECTED_AUTHOR" >> $LOG_FILE
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      5) 
 | 
				
			||||||
 | 
					                          [[ "$LINE" == "$EXPECTED_LICENSE" ]] || printf "Line %d was: '%s' | Should be: '%s'\n" "$i" "$LINE" "$EXPECTED_LICENSE" >> $LOG_FILE
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      6) 
 | 
				
			||||||
 | 
					                          [[ $LINE == $EXPECTED_SOURCE* ]] || printf "Line %d was: '%s' | Should start with: '%s'\n" "$i" "$LINE" "$EXPECTED_SOURCE" >> $LOG_FILE
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                      7) 
 | 
				
			||||||
 | 
					                          [[ -z $LINE ]] || printf "Line %d was: '%s' | Should be empty\n" "$i" "$LINE" >> $LOG_FILE
 | 
				
			||||||
 | 
					                          ;;
 | 
				
			||||||
 | 
					                  esac
 | 
				
			||||||
 | 
					              done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [[ "$(sed -n '8p' "$FILE")" != 'source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"' ]] && echo 'Line 8 should be: source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"' >> "$LOG_FILE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for i in {9..14}; do
 | 
				
			||||||
 | 
					                LINE=$(sed -n "${i}p" "$FILE")
 | 
				
			||||||
 | 
					                EXPECTED=(
 | 
				
			||||||
 | 
					                    "color"
 | 
				
			||||||
 | 
					                    "verb_ip6"
 | 
				
			||||||
 | 
					                    "catch_errors"
 | 
				
			||||||
 | 
					                    "setting_up_container"
 | 
				
			||||||
 | 
					                    "network_check"
 | 
				
			||||||
 | 
					                    "update_os"
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					                [[ "$LINE" != "${EXPECTED[$((i-9))]}" ]] && echo "Line $i was $LINE | Should be: ${EXPECTED[$((i-9))]}" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					            done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            [[ -n "$(sed -n '15p' "$FILE")" ]] && echo "Line 15 should be empty" >> "$LOG_FILE"
 | 
				
			||||||
 | 
					            [[ "$(sed -n '16p' "$FILE")" != 'msg_info "Installing Dependencies"' ]] && echo 'Line 16 should be: msg_info "Installing Dependencies"' >> "$LOG_FILE"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LAST_3_LINES=$(tail -n 3 "$FILE")
 | 
				
			||||||
 | 
					            [[ "$LAST_3_LINES" != *"$STD apt-get -y autoremove"* ]] && echo 'Third to last line should be: $STD apt-get -y autoremove' >> "$LOG_FILE"
 | 
				
			||||||
 | 
					            [[ "$LAST_3_LINES" != *"$STD apt-get -y autoclean"* ]] && echo 'Second to last line should be: $STD apt-get -y clean' >> "$LOG_FILE"
 | 
				
			||||||
 | 
					            [[ "$LAST_3_LINES" != *'msg_ok "Cleaned"'* ]] && echo 'Last line should be: msg_ok "Cleaned"' >> "$LOG_FILE"
 | 
				
			||||||
 | 
					          cat "$LOG_FILE"
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					          done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Post error comments
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          ERROR="false"
 | 
				
			||||||
 | 
					          for FILE in ${{ env.SCRIPT }}; do
 | 
				
			||||||
 | 
					            FILE_STRIPPED="${FILE##*/}"
 | 
				
			||||||
 | 
					            LOG_FILE="result_$FILE_STRIPPED.log"
 | 
				
			||||||
 | 
					            echo $LOG_FILE
 | 
				
			||||||
 | 
					            if [[ ! -f $LOG_FILE ]]; then
 | 
				
			||||||
 | 
					              continue
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ERROR_MSG=$(cat $LOG_FILE)
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					            if [ -n "$ERROR_MSG" ]; then
 | 
				
			||||||
 | 
					              echo "Posting error message for $FILE"
 | 
				
			||||||
 | 
					              echo ${ERROR_MSG}
 | 
				
			||||||
 | 
					              gh pr comment ${{ github.event.pull_request.number }} \
 | 
				
			||||||
 | 
					                --repo ${{ github.repository }} \
 | 
				
			||||||
 | 
					                --body ":warning: The script _**$FILE**_ has the following formatting errors: <br> <div><strong>${ERROR_MSG}</strong></div>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					              ERROR="true"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					          done
 | 
				
			||||||
 | 
					          echo "ERROR=$ERROR" >> $GITHUB_ENV
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Fail if error
 | 
				
			||||||
 | 
					        if: ${{ env.ERROR == 'true' }}
 | 
				
			||||||
 | 
					        run: exit 1 
 | 
				
			||||||
							
								
								
									
										2
									
								
								.github/workflows/update-json-date.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/update-json-date.yml
									
									
									
									
										vendored
									
									
								
							@@ -10,7 +10,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  update-app-files:
 | 
					  update-app-files:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      contents: write
 | 
					      contents: write
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/validate-filenames.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/validate-filenames.yml
									
									
									
									
										vendored
									
									
								
							@@ -10,7 +10,7 @@ on:
 | 
				
			|||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  check-files:
 | 
					  check-files:
 | 
				
			||||||
    name: Check changed files
 | 
					    name: Check changed files
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      pull-requests: write
 | 
					      pull-requests: write
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										294
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										294
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -13,9 +13,299 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
 | 
				
			|||||||
> [!NOTE]
 | 
					> [!NOTE]
 | 
				
			||||||
All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
 | 
					All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> [!IMPORTANT]
 | 
					 | 
				
			||||||
Do not break established syntax in this file, as it is automatically updated by a Github Workflow
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Plant-it [@MickLesk](https://github.com/MickLesk) ([#3000](https://github.com/community-scripts/ProxmoxVE/pull/3000))
 | 
				
			||||||
 | 
					- Seafile [@dave-yap](https://github.com/dave-yap) ([#2987](https://github.com/community-scripts/ProxmoxVE/pull/2987))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Headscale: Re-enable Service after Update [@Cerothen](https://github.com/Cerothen) ([#3012](https://github.com/community-scripts/ProxmoxVE/pull/3012))
 | 
				
			||||||
 | 
					    - SnipeIT: Harmonize composer install to Project-Dockerfile [@MickLesk](https://github.com/MickLesk) ([#3009](https://github.com/community-scripts/ProxmoxVE/pull/3009))
 | 
				
			||||||
 | 
					    - Teddycloud: fix update function [@tremor021](https://github.com/tremor021) ([#2996](https://github.com/community-scripts/ProxmoxVE/pull/2996))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📂 Github
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Cleanup Old Project Files (figlet, app-header, images) [@MickLesk](https://github.com/MickLesk) ([#3004](https://github.com/community-scripts/ProxmoxVE/pull/3004))
 | 
				
			||||||
 | 
					    - Additions and amends to the CONTIRBUTOR docs [@tremor021](https://github.com/tremor021) ([#2983](https://github.com/community-scripts/ProxmoxVE/pull/2983))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Jellyseer not labeled as updateable even though update function exists [@tremor021](https://github.com/tremor021) ([#2991](https://github.com/community-scripts/ProxmoxVE/pull/2991))
 | 
				
			||||||
 | 
					    - Fix Website - Show correct wget path for alpine [@MickLesk](https://github.com/MickLesk) ([#2998](https://github.com/community-scripts/ProxmoxVE/pull/2998))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Paperless-GPT [@MickLesk](https://github.com/MickLesk) ([#2965](https://github.com/community-scripts/ProxmoxVE/pull/2965))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Rework SnipeIT: Tarball & Tempfile [@MickLesk](https://github.com/MickLesk) ([#2963](https://github.com/community-scripts/ProxmoxVE/pull/2963))
 | 
				
			||||||
 | 
					    - pihole: fix path when accessing pihole using `pct enter` [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2964](https://github.com/community-scripts/ProxmoxVE/pull/2964))
 | 
				
			||||||
 | 
					    - Hoarder: v0.23.0 dependency update [@vhsdream](https://github.com/vhsdream) ([#2958](https://github.com/community-scripts/ProxmoxVE/pull/2958))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📂 Github
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Update autolabeler.yml: Set Labels correctly [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2968](https://github.com/community-scripts/ProxmoxVE/pull/2968))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Add warnings about externaly sourced scripts [@tremor021](https://github.com/tremor021) ([#2975](https://github.com/community-scripts/ProxmoxVE/pull/2975))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-09
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Fix wikijs update issue while backing up data [@AdelRefaat](https://github.com/AdelRefaat) ([#2950](https://github.com/community-scripts/ProxmoxVE/pull/2950))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Improve Release-Action (awk function) [@MickLesk](https://github.com/MickLesk) ([#2934](https://github.com/community-scripts/ProxmoxVE/pull/2934))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Pi-hole interface port in documentation [@la7eralus](https://github.com/la7eralus) ([#2953](https://github.com/community-scripts/ProxmoxVE/pull/2953))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-08
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Update slug to lowercase in pf2etools.json  [@PhoenixEmik](https://github.com/PhoenixEmik) ([#2942](https://github.com/community-scripts/ProxmoxVE/pull/2942))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-07
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - JupyterNotebook: Fix APP Variable [@MickLesk](https://github.com/MickLesk) ([#2924](https://github.com/community-scripts/ProxmoxVE/pull/2924))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Beszel: restarting service after update [@C0pywriting](https://github.com/C0pywriting) ([#2915](https://github.com/community-scripts/ProxmoxVE/pull/2915))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 💥 Breaking Changes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - ActualBudget: Update Script with new Repo [@MickLesk](https://github.com/MickLesk) ([#2907](https://github.com/community-scripts/ProxmoxVE/pull/2907))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Improve Nextcloud(pi) docu and Name to NextcloudPi [@MickLesk](https://github.com/MickLesk) ([#2930](https://github.com/community-scripts/ProxmoxVE/pull/2930))
 | 
				
			||||||
 | 
					    - fix jupyternotebook slug [@MickLesk](https://github.com/MickLesk) ([#2922](https://github.com/community-scripts/ProxmoxVE/pull/2922))
 | 
				
			||||||
 | 
					    - Improve Trilium Description and Name to TriliumNext [@MickLesk](https://github.com/MickLesk) ([#2929](https://github.com/community-scripts/ProxmoxVE/pull/2929))
 | 
				
			||||||
 | 
					    - Prowlarr icon [@bannert1337](https://github.com/bannert1337) ([#2906](https://github.com/community-scripts/ProxmoxVE/pull/2906))
 | 
				
			||||||
 | 
					    - Update Apache Tika icon to SVG [@bannert1337](https://github.com/bannert1337) ([#2904](https://github.com/community-scripts/ProxmoxVE/pull/2904))
 | 
				
			||||||
 | 
					    - Update Prometheus Alertmanager Icon [@bannert1337](https://github.com/bannert1337) ([#2905](https://github.com/community-scripts/ProxmoxVE/pull/2905))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-06
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - InvenTree [@tremor021](https://github.com/tremor021) ([#2890](https://github.com/community-scripts/ProxmoxVE/pull/2890))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Homarr: Optional Reboot after update [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2876](https://github.com/community-scripts/ProxmoxVE/pull/2876))
 | 
				
			||||||
 | 
					    - Fix Tag "community-scripts" for ArchLinux / OPNSense [@MickLesk](https://github.com/MickLesk) ([#2875](https://github.com/community-scripts/ProxmoxVE/pull/2875))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Wastebin: Update Script for Version 3.0.0 [@MickLesk](https://github.com/MickLesk) ([#2885](https://github.com/community-scripts/ProxmoxVE/pull/2885))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-05
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Kimai: Better Handling of Updates (backup var / env / yaml) [@MickLesk](https://github.com/MickLesk) ([#2862](https://github.com/community-scripts/ProxmoxVE/pull/2862))
 | 
				
			||||||
 | 
					    - Fix NextcloudPi-Installation [@MickLesk](https://github.com/MickLesk) ([#2853](https://github.com/community-scripts/ProxmoxVE/pull/2853))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-04
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Reveal.js [@tremor021](https://github.com/tremor021) ([#2806](https://github.com/community-scripts/ProxmoxVE/pull/2806))
 | 
				
			||||||
 | 
					- Apache Tomcat [@MickLesk](https://github.com/MickLesk) ([#2797](https://github.com/community-scripts/ProxmoxVE/pull/2797))
 | 
				
			||||||
 | 
					- Pterodactyl Wings [@bvdberg01](https://github.com/bvdberg01) ([#2800](https://github.com/community-scripts/ProxmoxVE/pull/2800))
 | 
				
			||||||
 | 
					- Pterodactyl Panel [@bvdberg01](https://github.com/bvdberg01) ([#2801](https://github.com/community-scripts/ProxmoxVE/pull/2801))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - reveal.js: Update function now backs up index and config [@tremor021](https://github.com/tremor021) ([#2845](https://github.com/community-scripts/ProxmoxVE/pull/2845))
 | 
				
			||||||
 | 
					    - Changedetection: Increase RAM & Disk-Space [@MickLesk](https://github.com/MickLesk) ([#2838](https://github.com/community-scripts/ProxmoxVE/pull/2838))
 | 
				
			||||||
 | 
					    - Linkwarden: Optimze RUST Installation [@MickLesk](https://github.com/MickLesk) ([#2817](https://github.com/community-scripts/ProxmoxVE/pull/2817))
 | 
				
			||||||
 | 
					    - Nginx: Fix $STD for tar [@MickLesk](https://github.com/MickLesk) ([#2813](https://github.com/community-scripts/ProxmoxVE/pull/2813))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Add source to install scripts and make license one line [@bvdberg01](https://github.com/bvdberg01) ([#2842](https://github.com/community-scripts/ProxmoxVE/pull/2842))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Better handling of create release [@MickLesk](https://github.com/MickLesk) ([#2818](https://github.com/community-scripts/ProxmoxVE/pull/2818))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Json file update [@bvdberg01](https://github.com/bvdberg01) ([#2824](https://github.com/community-scripts/ProxmoxVE/pull/2824))
 | 
				
			||||||
 | 
					    - Prometheus-paperless-ngx-exporter: Fix wrong Interface Port [@schneider-de-com](https://github.com/schneider-de-com) ([#2812](https://github.com/community-scripts/ProxmoxVE/pull/2812))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Feature: Update Icons (selfhst repo) [@bannert1337](https://github.com/bannert1337) ([#2834](https://github.com/community-scripts/ProxmoxVE/pull/2834))
 | 
				
			||||||
 | 
					    - Website: Add Mikrotik to Network too, OPNSense & OpenWRT to OS [@MickLesk](https://github.com/MickLesk) ([#2823](https://github.com/community-scripts/ProxmoxVE/pull/2823))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-03
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Habitica [@tremor021](https://github.com/tremor021) ([#2779](https://github.com/community-scripts/ProxmoxVE/pull/2779))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Zigbee2Mqtt Use fixed pnpm Version 10.4.1 [@MickLesk](https://github.com/MickLesk) ([#2805](https://github.com/community-scripts/ProxmoxVE/pull/2805))
 | 
				
			||||||
 | 
					    - Linkwarden: Fix & Update Monolith-Installation [@MickLesk](https://github.com/MickLesk) ([#2787](https://github.com/community-scripts/ProxmoxVE/pull/2787))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Feature: MinIO use now static port 9001 [@MickLesk](https://github.com/MickLesk) ([#2786](https://github.com/community-scripts/ProxmoxVE/pull/2786))
 | 
				
			||||||
 | 
					    - Feature Template Path for Mountings [@MickLesk](https://github.com/MickLesk) ([#2785](https://github.com/community-scripts/ProxmoxVE/pull/2785))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Feature: Website - show default OS [@MickLesk](https://github.com/MickLesk) ([#2790](https://github.com/community-scripts/ProxmoxVE/pull/2790))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Update zigbee2mqtt.json - make sure link is clickable [@gurtjun](https://github.com/gurtjun) ([#2802](https://github.com/community-scripts/ProxmoxVE/pull/2802))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-02
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Fix gpg Repo for nzbget [@flatlinebb](https://github.com/flatlinebb) ([#2774](https://github.com/community-scripts/ProxmoxVE/pull/2774))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-03-01
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Firefly III: FIx Ownership for OAuth Key [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2759](https://github.com/community-scripts/ProxmoxVE/pull/2759))
 | 
				
			||||||
 | 
					    - homarr: double restart to fix homarr migration [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2757](https://github.com/community-scripts/ProxmoxVE/pull/2757))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - ActualBudget: New Installation Script with new Repo [@MickLesk](https://github.com/MickLesk) ([#2770](https://github.com/community-scripts/ProxmoxVE/pull/2770))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 💥 Breaking Changes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Breaking: Remove Update Function for Actual Budget until it fixed [@MickLesk](https://github.com/MickLesk) ([#2768](https://github.com/community-scripts/ProxmoxVE/pull/2768))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Remove Note on Changelog [@MickLesk](https://github.com/MickLesk) ([#2758](https://github.com/community-scripts/ProxmoxVE/pull/2758))
 | 
				
			||||||
 | 
					    - Fix Release Creation if Changelog.md to long [@MickLesk](https://github.com/MickLesk) ([#2752](https://github.com/community-scripts/ProxmoxVE/pull/2752))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-02-28
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Shell Format Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2400](https://github.com/community-scripts/ProxmoxVE/pull/2400))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📂 Github
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Update all Action to new selfhosted Runner Cluster [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2739](https://github.com/community-scripts/ProxmoxVE/pull/2739))
 | 
				
			||||||
 | 
					    - Update Script Test Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2741](https://github.com/community-scripts/ProxmoxVE/pull/2741))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-02-27
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - web-check [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2662](https://github.com/community-scripts/ProxmoxVE/pull/2662))
 | 
				
			||||||
 | 
					- Pelican Panel [@bvdberg01](https://github.com/bvdberg01) ([#2678](https://github.com/community-scripts/ProxmoxVE/pull/2678))
 | 
				
			||||||
 | 
					- Pelican Wings [@bvdberg01](https://github.com/bvdberg01) ([#2677](https://github.com/community-scripts/ProxmoxVE/pull/2677))
 | 
				
			||||||
 | 
					- ByteStash [@tremor021](https://github.com/tremor021) ([#2680](https://github.com/community-scripts/ProxmoxVE/pull/2680))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - ByteStash: Removed sed, app supports Node v22 now [@tremor021](https://github.com/tremor021) ([#2728](https://github.com/community-scripts/ProxmoxVE/pull/2728))
 | 
				
			||||||
 | 
					- Keycloak: Update installation script [@tremor021](https://github.com/tremor021) ([#2714](https://github.com/community-scripts/ProxmoxVE/pull/2714))
 | 
				
			||||||
 | 
					- ByteStash: Fix Node 22 compatibility (thanks t2lc) [@tremor021](https://github.com/tremor021) ([#2705](https://github.com/community-scripts/ProxmoxVE/pull/2705))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - EOF not detected [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2726](https://github.com/community-scripts/ProxmoxVE/pull/2726))
 | 
				
			||||||
 | 
					    - Zitadel-install.sh: Remove one version file and update to our standard [@bvdberg01](https://github.com/bvdberg01) ([#2710](https://github.com/community-scripts/ProxmoxVE/pull/2710))
 | 
				
			||||||
 | 
					    - Outline: Change key to hex32 [@tremor021](https://github.com/tremor021) ([#2709](https://github.com/community-scripts/ProxmoxVE/pull/2709))
 | 
				
			||||||
 | 
					    - Typo in update scripts [@bvdberg01](https://github.com/bvdberg01) ([#2707](https://github.com/community-scripts/ProxmoxVE/pull/2707))
 | 
				
			||||||
 | 
					    - SFTPGo Remove unneeded RELEASE variable [@MickLesk](https://github.com/MickLesk) ([#2683](https://github.com/community-scripts/ProxmoxVE/pull/2683))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Update install.func: Change Line Number for Error message. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2690](https://github.com/community-scripts/ProxmoxVE/pull/2690))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📂 Github
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - New Workflow to close Script Request Discussions on PR merge [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2688](https://github.com/community-scripts/ProxmoxVE/pull/2688))
 | 
				
			||||||
 | 
					    - Improve Script-Test Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2712](https://github.com/community-scripts/ProxmoxVE/pull/2712))
 | 
				
			||||||
 | 
					    - Switch all actions to self-hosted Runners [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2711](https://github.com/community-scripts/ProxmoxVE/pull/2711))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Use HTML button element for copying to clipboard [@scallaway](https://github.com/scallaway) ([#2720](https://github.com/community-scripts/ProxmoxVE/pull/2720))
 | 
				
			||||||
 | 
					    - Add basic pagination to Data Viewer [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2715](https://github.com/community-scripts/ProxmoxVE/pull/2715))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - wger - Add HTTPS instructions to the website [@tremor021](https://github.com/tremor021) ([#2695](https://github.com/community-scripts/ProxmoxVE/pull/2695))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 2025-02-26
 | 
					## 2025-02-26
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,12 +26,10 @@ function update_script() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if [[ ! -d /opt/actualbudget ]]; then
 | 
					    if [[ ! -d /opt/actualbudget ]]; then
 | 
				
			||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit 1
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual/releases/latest | \
 | 
					    RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
              grep "tag_name" | awk -F '"' '{print substr($4, 2)}')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then
 | 
					    if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then
 | 
				
			||||||
        msg_info "Stopping ${APP}"
 | 
					        msg_info "Stopping ${APP}"
 | 
				
			||||||
        systemctl stop actualbudget
 | 
					        systemctl stop actualbudget
 | 
				
			||||||
@@ -39,11 +37,11 @@ function update_script() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        msg_info "Updating ${APP} to ${RELEASE}"
 | 
					        msg_info "Updating ${APP} to ${RELEASE}"
 | 
				
			||||||
        cd /tmp
 | 
					        cd /tmp
 | 
				
			||||||
        wget -q "https://github.com/actualbudget/actual-server/archive/refs/tags/v${RELEASE}.tar.gz"
 | 
					        wget -q https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mv /opt/actualbudget /opt/actualbudget_bak
 | 
					        mv /opt/actualbudget /opt/actualbudget_bak
 | 
				
			||||||
        $STD tar -xzf "v${RELEASE}.tar.gz"
 | 
					        tar -xzf "v${RELEASE}.tar.gz"
 | 
				
			||||||
        mv *ctual-server-* /opt/actualbudget
 | 
					        mv actual-${RELEASE} /opt/actualbudget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
 | 
					        mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
 | 
				
			||||||
        for dir in server-files .migrate user-files migrations; do
 | 
					        for dir in server-files .migrate user-files migrations; do
 | 
				
			||||||
@@ -59,10 +57,15 @@ function update_script() {
 | 
				
			|||||||
            mv /opt/actualbudget/server-files/account.sqlite /opt/actualbudget-data/server-files/account.sqlite
 | 
					            mv /opt/actualbudget/server-files/account.sqlite /opt/actualbudget-data/server-files/account.sqlite
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [[ -f /opt/actualbudget_bak/selfhost.key ]]; then
 | 
				
			||||||
 | 
					            mv /opt/actualbudget_bak/selfhost.key /opt/actualbudget/selfhost.key
 | 
				
			||||||
 | 
					            mv /opt/actualbudget_bak/selfhost.crt /opt/actualbudget/selfhost.crt
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if [[ -f /opt/actualbudget_bak/.env ]]; then
 | 
					        if [[ -f /opt/actualbudget_bak/.env ]]; then
 | 
				
			||||||
            mv /opt/actualbudget_bak/.env /opt/actualbudget-data/.env
 | 
					            mv /opt/actualbudget_bak/.env /opt/actualbudget-data/.env
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            cat <<EOF > /opt/actualbudget-data/.env
 | 
					            cat <<EOF >/opt/actualbudget-data/.env
 | 
				
			||||||
ACTUAL_UPLOAD_DIR=/opt/actualbudget-data/upload
 | 
					ACTUAL_UPLOAD_DIR=/opt/actualbudget-data/upload
 | 
				
			||||||
ACTUAL_DATA_DIR=/opt/actualbudget-data
 | 
					ACTUAL_DATA_DIR=/opt/actualbudget-data
 | 
				
			||||||
ACTUAL_SERVER_FILES_DIR=/opt/actualbudget-data/server-files
 | 
					ACTUAL_SERVER_FILES_DIR=/opt/actualbudget-data/server-files
 | 
				
			||||||
@@ -74,12 +77,12 @@ ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt
 | 
				
			|||||||
EOF
 | 
					EOF
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        cd /opt/actualbudget
 | 
					        cd /opt/actualbudget
 | 
				
			||||||
        $STD yarn install
 | 
					        $STD yarn workspaces focus @actual-app/sync-server --production
 | 
				
			||||||
        echo "${RELEASE}" > /opt/actualbudget_version.txt
 | 
					        echo "${RELEASE}" >/opt/actualbudget_version.txt
 | 
				
			||||||
        msg_ok "Updated ${APP}"
 | 
					        msg_ok "Updated ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        msg_info "Starting ${APP}"
 | 
					        msg_info "Starting ${APP}"
 | 
				
			||||||
        cat <<EOF > /etc/systemd/system/actualbudget.service
 | 
					        cat <<EOF >/etc/systemd/system/actualbudget.service
 | 
				
			||||||
[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description=Actual Budget Service
 | 
					Description=Actual Budget Service
 | 
				
			||||||
After=network.target
 | 
					After=network.target
 | 
				
			||||||
@@ -90,7 +93,7 @@ User=root
 | 
				
			|||||||
Group=root
 | 
					Group=root
 | 
				
			||||||
WorkingDirectory=/opt/actualbudget
 | 
					WorkingDirectory=/opt/actualbudget
 | 
				
			||||||
EnvironmentFile=/opt/actualbudget-data/.env
 | 
					EnvironmentFile=/opt/actualbudget-data/.env
 | 
				
			||||||
ExecStart=/usr/bin/yarn start
 | 
					ExecStart=/usr/bin/yarn start:server
 | 
				
			||||||
Restart=always
 | 
					Restart=always
 | 
				
			||||||
RestartSec=10
 | 
					RestartSec=10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -110,7 +113,7 @@ EOF
 | 
				
			|||||||
    else
 | 
					    else
 | 
				
			||||||
        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
					        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    exit 0
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start
 | 
					start
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "Ther is currently no automatic update function for ${APP}."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								ct/apache-tomcat.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								ct/apache-tomcat.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					#!/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: MickLesk (Canbiz)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://tomcat.apache.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Apache-Tomcat"
 | 
				
			||||||
 | 
					var_tags="webserver"
 | 
				
			||||||
 | 
					var_disk="5"
 | 
				
			||||||
 | 
					var_cpu="1"
 | 
				
			||||||
 | 
					var_ram="1024"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					    if ! ls -d /opt/tomcat-* >/dev/null 2>&1; then
 | 
				
			||||||
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
 | 
					    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}:8080${CL}"
 | 
				
			||||||
							
								
								
									
										14
									
								
								ct/beszel.sh
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								ct/beszel.sh
									
									
									
									
									
								
							@@ -27,8 +27,18 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    /opt/beszel/beszel update
 | 
					    msg_info "Stopping $APP"
 | 
				
			||||||
    msg_error "Ther is currently no automatic update function for ${APP}."
 | 
					    systemctl stop beszel-hub
 | 
				
			||||||
 | 
					    msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    msg_info "Updating $APP"
 | 
				
			||||||
 | 
					    $STD /opt/beszel/beszel update
 | 
				
			||||||
 | 
					    msg_ok "Updated $APP"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    msg_info "Starting $APP"
 | 
				
			||||||
 | 
					    systemctl start beszel-hub
 | 
				
			||||||
 | 
					    msg_ok "Successfully started $APP"
 | 
				
			||||||
 | 
					    msg_ok "Update Successful"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										73
									
								
								ct/bytestash.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								ct/bytestash.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
				
			|||||||
 | 
					#!/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: Slaviša Arežina (tremor021)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/jordan-dalby/ByteStash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="ByteStash"
 | 
				
			||||||
 | 
					var_tags="code"
 | 
				
			||||||
 | 
					var_disk="4"
 | 
				
			||||||
 | 
					var_cpu="1"
 | 
				
			||||||
 | 
					var_ram="1024"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					    if [[ ! -d /opt/bytestash ]]; then
 | 
				
			||||||
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    RELEASE=$(curl -s https://api.github.com/repos/jordan-dalby/ByteStash/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					    if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					        msg_info "Stopping Services"
 | 
				
			||||||
 | 
					        systemctl stop bytestash-backend
 | 
				
			||||||
 | 
					        systemctl stop bytestash-frontend
 | 
				
			||||||
 | 
					        msg_ok "Services Stopped"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Updating ${APP} to ${RELEASE}"
 | 
				
			||||||
 | 
					        temp_file=$(mktemp)
 | 
				
			||||||
 | 
					        wget -q "https://github.com/jordan-dalby/ByteStash/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
 | 
				
			||||||
 | 
					        tar zxf $temp_file
 | 
				
			||||||
 | 
					        rm -rf /opt/bytestash/server/node_modules
 | 
				
			||||||
 | 
					        rm -rf /opt/bytestash/client/node_modules
 | 
				
			||||||
 | 
					        cp -rf ByteStash-${RELEASE}/* /opt/bytestash
 | 
				
			||||||
 | 
					        cd /opt/bytestash/server
 | 
				
			||||||
 | 
					        $STD npm install
 | 
				
			||||||
 | 
					        cd /opt/bytestash/client
 | 
				
			||||||
 | 
					        $STD npm install
 | 
				
			||||||
 | 
					        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					        msg_ok "Updated ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Starting Services"
 | 
				
			||||||
 | 
					        systemctl start bytestash-backend
 | 
				
			||||||
 | 
					        systemctl start bytestash-frontend
 | 
				
			||||||
 | 
					        msg_ok "Started Services"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Cleaning Up"
 | 
				
			||||||
 | 
					        rm -f $temp_file
 | 
				
			||||||
 | 
					        msg_ok "Cleaned"
 | 
				
			||||||
 | 
					        msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
				
			||||||
@@ -8,8 +8,8 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
				
			|||||||
APP="Change Detection"
 | 
					APP="Change Detection"
 | 
				
			||||||
var_tags="monitoring;crawler"
 | 
					var_tags="monitoring;crawler"
 | 
				
			||||||
var_cpu="2"
 | 
					var_cpu="2"
 | 
				
			||||||
var_ram="1024"
 | 
					var_ram="2048"
 | 
				
			||||||
var_disk="8"
 | 
					var_disk="10"
 | 
				
			||||||
var_os="debian"
 | 
					var_os="debian"
 | 
				
			||||||
var_version="12"
 | 
					var_version="12"
 | 
				
			||||||
var_unprivileged="1"
 | 
					var_unprivileged="1"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  msg_error "There is currently no update path available."
 | 
					  msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -221,7 +221,8 @@ mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLA
 | 
				
			|||||||
  exit 207
 | 
					  exit 207
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
TEMPLATE="${TEMPLATES[-1]}"
 | 
					TEMPLATE="${TEMPLATES[-1]}"
 | 
				
			||||||
TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
					TEMPLATE_PATH="$(pvesm path $TEMPLATE_STORAGE:vztmpl/$TEMPLATE)"
 | 
				
			||||||
 | 
					# Without NAS/Mount: TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
				
			||||||
# Check if template exists, if corrupt remove and redownload
 | 
					# Check if template exists, if corrupt remove and redownload
 | 
				
			||||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE" || ! zstdcat "$TEMPLATE_PATH" | tar -tf - >/dev/null 2>&1; then
 | 
					if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE" || ! zstdcat "$TEMPLATE_PATH" | tar -tf - >/dev/null 2>&1; then
 | 
				
			||||||
  msg_warn "Template $TEMPLATE not found in storage or seems to be corrupted. Redownloading."
 | 
					  msg_warn "Template $TEMPLATE not found in storage or seems to be corrupted. Redownloading."
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  msg_error "There is currently no update path available."
 | 
					  msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
  msg_info "Updating ${APP}"
 | 
					  msg_info "Updating ${APP}"
 | 
				
			||||||
  systemctl stop ${APP}
 | 
					  systemctl stop ${APP}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,7 +30,7 @@ function update_script() {
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
  RELEASE=$(curl -s https://api.github.com/repos/glpi-project/glpi/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
 | 
					  RELEASE=$(curl -s https://api.github.com/repos/glpi-project/glpi/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "([^"]+)".*/\1/')
 | 
				
			||||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
					  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
    msg_error "Ther is currently no automatic update function for ${APP}."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}."
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}."
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
      msg_error "No ${APP} Installation Found!"
 | 
					      msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
      exit
 | 
					      exit
 | 
				
			||||||
   fi
 | 
					   fi
 | 
				
			||||||
   msg_error "There is currently no update path available."
 | 
					   msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
   exit
 | 
					   exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										74
									
								
								ct/habitica.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								ct/habitica.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					#!/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: Slaviša Arežina (tremor021)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/HabitRPG/habitica
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Habitica"
 | 
				
			||||||
 | 
					var_tags="gaming"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="4096"
 | 
				
			||||||
 | 
					var_disk="8"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ ! -d "/opt/habitica" ]]; then
 | 
				
			||||||
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    RELEASE=$(curl -s https://api.github.com/repos/HabitRPG/habitica/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
				
			||||||
 | 
					        msg_info "Stopping $APP"
 | 
				
			||||||
 | 
					        systemctl stop habitica-mongodb
 | 
				
			||||||
 | 
					        systemctl stop habitica
 | 
				
			||||||
 | 
					        systemctl stop habitica-client
 | 
				
			||||||
 | 
					        msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Updating $APP to ${RELEASE}"
 | 
				
			||||||
 | 
					        temp_file=$(mktemp)
 | 
				
			||||||
 | 
					        wget -q "https://github.com/HabitRPG/habitica/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
 | 
				
			||||||
 | 
					        tar zxf $temp_file
 | 
				
			||||||
 | 
					        cp -rf habitica-${RELEASE}/* /opt/habitica
 | 
				
			||||||
 | 
					        cd /opt/habitica
 | 
				
			||||||
 | 
					        $STD npm i
 | 
				
			||||||
 | 
					        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					        msg_ok "Updated $APP to ${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Starting $APP"
 | 
				
			||||||
 | 
					        systemctl start habitica-mongodb
 | 
				
			||||||
 | 
					        systemctl start habitica
 | 
				
			||||||
 | 
					        systemctl start habitica-client
 | 
				
			||||||
 | 
					        msg_ok "Started $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Cleaning Up"
 | 
				
			||||||
 | 
					        rm -f $temp_file
 | 
				
			||||||
 | 
					        rm -rf ~/habitica-${RELEASE}
 | 
				
			||||||
 | 
					        msg_ok "Cleanup Completed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_ok "Update Successful"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/apache-tomcat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/apache-tomcat
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ___                     __             ______                           __ 
 | 
				
			||||||
 | 
					   /   |  ____  ____ ______/ /_  ___      /_  __/___  ____ ___  _________ _/ /_
 | 
				
			||||||
 | 
					  / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ / / __ \/ __ `__ \/ ___/ __ `/ __/
 | 
				
			||||||
 | 
					 / ___ |/ /_/ / /_/ / /__/ / / /  __/_____/ / / /_/ / / / / / / /__/ /_/ / /_  
 | 
				
			||||||
 | 
					/_/  |_/ .___/\__,_/\___/_/ /_/\___/     /_/  \____/_/ /_/ /_/\___/\__,_/\__/  
 | 
				
			||||||
 | 
					      /_/                                                                      
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/bytestash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/bytestash
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____        __      _____ __             __  
 | 
				
			||||||
 | 
					   / __ )__  __/ /____ / ___// /_____ ______/ /_ 
 | 
				
			||||||
 | 
					  / __  / / / / __/ _ \\__ \/ __/ __ `/ ___/ __ \
 | 
				
			||||||
 | 
					 / /_/ / /_/ / /_/  __/__/ / /_/ /_/ (__  ) / / /
 | 
				
			||||||
 | 
					/_____/\__, /\__/\___/____/\__/\__,_/____/_/ /_/ 
 | 
				
			||||||
 | 
					      /____/                                     
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/habitica
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/habitica
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    __  __      __    _ __  _           
 | 
				
			||||||
 | 
					   / / / /___ _/ /_  (_) /_(_)________ _
 | 
				
			||||||
 | 
					  / /_/ / __ `/ __ \/ / __/ / ___/ __ `/
 | 
				
			||||||
 | 
					 / __  / /_/ / /_/ / / /_/ / /__/ /_/ / 
 | 
				
			||||||
 | 
					/_/ /_/\__,_/_.___/_/\__/_/\___/\__,_/  
 | 
				
			||||||
 | 
					                                        
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/inventree
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/inventree
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____                    ______             
 | 
				
			||||||
 | 
					   /  _/___ _   _____  ____/_  __/_______  ___ 
 | 
				
			||||||
 | 
					   / // __ \ | / / _ \/ __ \/ / / ___/ _ \/ _ \
 | 
				
			||||||
 | 
					 _/ // / / / |/ /  __/ / / / / / /  /  __/  __/
 | 
				
			||||||
 | 
					/___/_/ /_/|___/\___/_/ /_/_/ /_/   \___/\___/ 
 | 
				
			||||||
 | 
					                                               
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
       __                  __               _   __      __       __                __  
 | 
					       __                  __            _   __      __       __                __  
 | 
				
			||||||
      / /_  ______  __  __/ /____  _____   / | / /___  / /____  / /_  ____  ____  / /__
 | 
					      / /_  ______  __  __/ /____  _____/ | / /___  / /____  / /_  ____  ____  / /__
 | 
				
			||||||
 __  / / / / / __ \/ / / / __/ _ \/ ___/  /  |/ / __ \/ __/ _ \/ __ \/ __ \/ __ \/ //_/
 | 
					 __  / / / / / __ \/ / / / __/ _ \/ ___/  |/ / __ \/ __/ _ \/ __ \/ __ \/ __ \/ //_/
 | 
				
			||||||
/ /_/ / /_/ / /_/ / /_/ / /_/  __/ /     / /|  / /_/ / /_/  __/ /_/ / /_/ / /_/ / ,<   
 | 
					/ /_/ / /_/ / /_/ / /_/ / /_/  __/ /  / /|  / /_/ / /_/  __/ /_/ / /_/ / /_/ / ,<   
 | 
				
			||||||
\____/\__,_/ .___/\__, /\__/\___/_/     /_/ |_/\____/\__/\___/_.___/\____/\____/_/|_|  
 | 
					\____/\__,_/ .___/\__, /\__/\___/_/  /_/ |_/\____/\__/\___/_.___/\____/\____/_/|_|  
 | 
				
			||||||
          /_/    /____/                                                                
 | 
					          /_/    /____/                                                             
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								ct/headers/paperless-gpt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/paperless-gpt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____                        __                     __________  ______
 | 
				
			||||||
 | 
					   / __ \____ _____  ___  _____/ /__  __________      / ____/ __ \/_  __/
 | 
				
			||||||
 | 
					  / /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/ / __/ /_/ / / /   
 | 
				
			||||||
 | 
					 / ____/ /_/ / /_/ /  __/ /  / /  __(__  |__  )_____/ /_/ / ____/ / /    
 | 
				
			||||||
 | 
					/_/    \__,_/ .___/\___/_/  /_/\___/____/____/      \____/_/     /_/     
 | 
				
			||||||
 | 
					           /_/                                                           
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/pelican-panel
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/pelican-panel
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____       ___                        ____                   __
 | 
				
			||||||
 | 
					   / __ \___  / (_)________ _____        / __ \____ _____  ___  / /
 | 
				
			||||||
 | 
					  / /_/ / _ \/ / / ___/ __ `/ __ \______/ /_/ / __ `/ __ \/ _ \/ / 
 | 
				
			||||||
 | 
					 / ____/  __/ / / /__/ /_/ / / / /_____/ ____/ /_/ / / / /  __/ /  
 | 
				
			||||||
 | 
					/_/    \___/_/_/\___/\__,_/_/ /_/     /_/    \__,_/_/ /_/\___/_/   
 | 
				
			||||||
 | 
					                                                                   
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/pelican-wings
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/pelican-wings
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____       ___                      _       ___                 
 | 
				
			||||||
 | 
					   / __ \___  / (_)________ _____      | |     / (_)___  ____ ______
 | 
				
			||||||
 | 
					  / /_/ / _ \/ / / ___/ __ `/ __ \_____| | /| / / / __ \/ __ `/ ___/
 | 
				
			||||||
 | 
					 / ____/  __/ / / /__/ /_/ / / / /_____/ |/ |/ / / / / / /_/ (__  ) 
 | 
				
			||||||
 | 
					/_/    \___/_/_/\___/\__,_/_/ /_/      |__/|__/_/_/ /_/\__, /____/  
 | 
				
			||||||
 | 
					                                                      /____/        
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/plant-it
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/plant-it
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____  __            __        _ __ 
 | 
				
			||||||
 | 
					   / __ \/ /___ _____  / /_      (_) /_
 | 
				
			||||||
 | 
					  / /_/ / / __ `/ __ \/ __/_____/ / __/
 | 
				
			||||||
 | 
					 / ____/ / /_/ / / / / /_/_____/ / /_  
 | 
				
			||||||
 | 
					/_/   /_/\__,_/_/ /_/\__/     /_/\__/  
 | 
				
			||||||
 | 
					                                       
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/pterodactyl-panel
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/pterodactyl-panel
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____  __                      __           __        __      ____                   __
 | 
				
			||||||
 | 
					   / __ \/ /____  _________  ____/ /___ ______/ /___  __/ /     / __ \____ _____  ___  / /
 | 
				
			||||||
 | 
					  / /_/ / __/ _ \/ ___/ __ \/ __  / __ `/ ___/ __/ / / / /_____/ /_/ / __ `/ __ \/ _ \/ / 
 | 
				
			||||||
 | 
					 / ____/ /_/  __/ /  / /_/ / /_/ / /_/ / /__/ /_/ /_/ / /_____/ ____/ /_/ / / / /  __/ /  
 | 
				
			||||||
 | 
					/_/    \__/\___/_/   \____/\__,_/\__,_/\___/\__/\__, /_/     /_/    \__,_/_/ /_/\___/_/   
 | 
				
			||||||
 | 
					                                               /____/                                     
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/pterodactyl-wings
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/pterodactyl-wings
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____  __                      __           __        __    _       ___                 
 | 
				
			||||||
 | 
					   / __ \/ /____  _________  ____/ /___ ______/ /___  __/ /   | |     / (_)___  ____ ______
 | 
				
			||||||
 | 
					  / /_/ / __/ _ \/ ___/ __ \/ __  / __ `/ ___/ __/ / / / /____| | /| / / / __ \/ __ `/ ___/
 | 
				
			||||||
 | 
					 / ____/ /_/  __/ /  / /_/ / /_/ / /_/ / /__/ /_/ /_/ / /_____/ |/ |/ / / / / / /_/ (__  ) 
 | 
				
			||||||
 | 
					/_/    \__/\___/_/   \____/\__,_/\__,_/\___/\__/\__, /_/      |__/|__/_/_/ /_/\__, /____/  
 | 
				
			||||||
 | 
					                                               /____/                        /____/        
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/revealjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/revealjs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ____                       __    _______
 | 
				
			||||||
 | 
					   / __ \___ _   _____  ____ _/ /   / / ___/
 | 
				
			||||||
 | 
					  / /_/ / _ \ | / / _ \/ __ `/ /_  / /\__ \ 
 | 
				
			||||||
 | 
					 / _, _/  __/ |/ /  __/ /_/ / / /_/ /___/ / 
 | 
				
			||||||
 | 
					/_/ |_|\___/|___/\___/\__,_/_/\____//____/  
 | 
				
			||||||
 | 
					                                            
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/seafile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/seafile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					   _____            _____ __   
 | 
				
			||||||
 | 
					  / ___/___  ____ _/ __(_) /__ 
 | 
				
			||||||
 | 
					  \__ \/ _ \/ __ `/ /_/ / / _ \
 | 
				
			||||||
 | 
					 ___/ /  __/ /_/ / __/ / /  __/
 | 
				
			||||||
 | 
					/____/\___/\__,_/_/ /_/_/\___/ 
 | 
				
			||||||
 | 
					                               
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/web-check
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/web-check
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					                __               __              __  
 | 
				
			||||||
 | 
					 _      _____  / /_        _____/ /_  ___  _____/ /__
 | 
				
			||||||
 | 
					| | /| / / _ \/ __ \______/ ___/ __ \/ _ \/ ___/ //_/
 | 
				
			||||||
 | 
					| |/ |/ /  __/ /_/ /_____/ /__/ / / /  __/ /__/ ,<   
 | 
				
			||||||
 | 
					|__/|__/\___/_.___/      \___/_/ /_/\___/\___/_/|_|  
 | 
				
			||||||
 | 
					                                                     
 | 
				
			||||||
@@ -41,7 +41,8 @@ function update_script() {
 | 
				
			|||||||
    msg_ok "Updated $APP to ${RELEASE}"
 | 
					    msg_ok "Updated $APP to ${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting ${APP}"
 | 
					    msg_info "Starting ${APP}"
 | 
				
			||||||
    systemctl start headscale
 | 
					    # Temporary fix until headscale project resolves service getting disabled on updates.
 | 
				
			||||||
 | 
					    systemctl enable -q --now headscale
 | 
				
			||||||
    msg_ok "Started ${APP}"
 | 
					    msg_ok "Started ${APP}"
 | 
				
			||||||
    msg_ok "Updated Successfully"
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
@@ -55,4 +56,4 @@ build_container
 | 
				
			|||||||
description
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_ok "Completed Successfully!\n"
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,7 +45,8 @@ function update_script() {
 | 
				
			|||||||
    cp -R Heimdall-${VER}/* /opt/Heimdall
 | 
					    cp -R Heimdall-${VER}/* /opt/Heimdall
 | 
				
			||||||
    cd /opt/Heimdall
 | 
					    cd /opt/Heimdall
 | 
				
			||||||
    $STD apt-get install -y composer
 | 
					    $STD apt-get install -y composer
 | 
				
			||||||
    $STD COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload
 | 
					    export COMPOSER_ALLOW_SUPERUSER=1
 | 
				
			||||||
 | 
					    $STD composer dump-autoload
 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
    msg_ok "Updated Heimdall Dashboard to ${RELEASE}"
 | 
					    msg_ok "Updated Heimdall Dashboard to ${RELEASE}"
 | 
				
			||||||
    msg_info "Restoring Data"
 | 
					    msg_info "Restoring Data"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,6 +37,9 @@ function update_script() {
 | 
				
			|||||||
    if [[ $(corepack -v) < "0.31.0" ]]; then
 | 
					    if [[ $(corepack -v) < "0.31.0" ]]; then
 | 
				
			||||||
      $STD npm install -g corepack@0.31.0
 | 
					      $STD npm install -g corepack@0.31.0
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					    if [[ "${PREV_RELEASE}" < 0.23.0 ]]; then
 | 
				
			||||||
 | 
					        $STD apt-get install -y graphicsmagick ghostscript
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    cd /opt
 | 
					    cd /opt
 | 
				
			||||||
    if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then
 | 
					    if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then
 | 
				
			||||||
      mkdir -p /etc/hoarder
 | 
					      mkdir -p /etc/hoarder
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -150,6 +150,10 @@ EOF
 | 
				
			|||||||
    systemctl start homarr
 | 
					    systemctl start homarr
 | 
				
			||||||
    msg_ok "Started Services"
 | 
					    msg_ok "Started Services"
 | 
				
			||||||
    msg_ok "Updated Successfully"
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					    read -p "It's recommended to reboot the LXC after an update, would you like to reboot the LXC now ? (y/n): " choice
 | 
				
			||||||
 | 
					    if [[ "$choice" =~ ^[Yy]$ ]]; then
 | 
				
			||||||
 | 
					      reboot
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,8 +45,8 @@ function update_script() {
 | 
				
			|||||||
    cp -r homepage-${RELEASE}/* /opt/homepage/
 | 
					    cp -r homepage-${RELEASE}/* /opt/homepage/
 | 
				
			||||||
    rm -rf homepage-${RELEASE}
 | 
					    rm -rf homepage-${RELEASE}
 | 
				
			||||||
    cd /opt/homepage
 | 
					    cd /opt/homepage
 | 
				
			||||||
    $STD npx --yes update-browserslist-db@latest
 | 
					 | 
				
			||||||
    $STD pnpm install
 | 
					    $STD pnpm install
 | 
				
			||||||
 | 
					    $STD npx --yes update-browserslist-db@latest
 | 
				
			||||||
    export NEXT_PUBLIC_VERSION="v$RELEASE"
 | 
					    export NEXT_PUBLIC_VERSION="v$RELEASE"
 | 
				
			||||||
    export NEXT_PUBLIC_REVISION="source"
 | 
					    export NEXT_PUBLIC_REVISION="source"
 | 
				
			||||||
    $STD pnpm build
 | 
					    $STD pnpm build
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										45
									
								
								ct/inventree.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								ct/inventree.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					#!/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: Slaviša Arežina (tremor021)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/inventree/InvenTree
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="InvenTree"
 | 
				
			||||||
 | 
					var_tags="inventory"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="2048"
 | 
				
			||||||
 | 
					var_disk="6"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ ! -d "/opt/inventree" ]]; then
 | 
				
			||||||
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    msg_info "Updating $APP"
 | 
				
			||||||
 | 
					    $STD apt-get update
 | 
				
			||||||
 | 
					    $STD apt-get install --only-upgrade inventree -y
 | 
				
			||||||
 | 
					    msg_ok "Updated $APP"
 | 
				
			||||||
 | 
					    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}${CL}"
 | 
				
			||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  msg_error "There is currently no update path available."
 | 
					  msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
				
			|||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# Source: https://jupyter.org/
 | 
					# Source: https://jupyter.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
APP="Jupyter Notebook"
 | 
					APP="JupyterNotebook"
 | 
				
			||||||
var_tags="ai;dev-tools"
 | 
					var_tags="ai;dev-tools"
 | 
				
			||||||
var_cpu="2"
 | 
					var_cpu="2"
 | 
				
			||||||
var_ram="2048"
 | 
					var_ram="2048"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										100
									
								
								ct/kimai.sh
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								ct/kimai.sh
									
									
									
									
									
								
							@@ -20,52 +20,62 @@ color
 | 
				
			|||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function update_script() {
 | 
					function update_script() {
 | 
				
			||||||
  header_info
 | 
					    header_info
 | 
				
			||||||
  check_container_storage
 | 
					    check_container_storage
 | 
				
			||||||
  check_container_resources
 | 
					    check_container_resources
 | 
				
			||||||
  if [[ ! -d /opt/kimai ]]; then
 | 
					    if [[ ! -d /opt/kimai ]]; then
 | 
				
			||||||
    msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    RELEASE=$(curl -s https://api.github.com/repos/kimai/kimai/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
 | 
					    BACKUP_DIR="/opt/kimai_backup"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					        msg_info "Stopping Apache2"
 | 
				
			||||||
 | 
					        systemctl stop apache2
 | 
				
			||||||
 | 
					        msg_ok "Stopped Apache2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Backing up Kimai configuration and var directory"
 | 
				
			||||||
 | 
					        mkdir -p "$BACKUP_DIR"
 | 
				
			||||||
 | 
					        [ -d /opt/kimai/var ] && cp -r /opt/kimai/var "$BACKUP_DIR/"
 | 
				
			||||||
 | 
					        [ -f /opt/kimai/.env ] && cp /opt/kimai/.env "$BACKUP_DIR/"
 | 
				
			||||||
 | 
					        [ -f /opt/kimai/config/packages/local.yaml ] && cp /opt/kimai/config/packages/local.yaml "$BACKUP_DIR/"
 | 
				
			||||||
 | 
					        msg_ok "Backup completed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Updating ${APP} to ${RELEASE}"
 | 
				
			||||||
 | 
					        rm -rf /opt/kimai
 | 
				
			||||||
 | 
					        wget -q "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip"
 | 
				
			||||||
 | 
					        unzip -q ${RELEASE}.zip
 | 
				
			||||||
 | 
					        mv kimai-${RELEASE} /opt/kimai
 | 
				
			||||||
 | 
					        [ -d "$BACKUP_DIR/var" ] && cp -r "$BACKUP_DIR/var" /opt/kimai/
 | 
				
			||||||
 | 
					        [ -f "$BACKUP_DIR/.env" ] && cp "$BACKUP_DIR/.env" /opt/kimai/
 | 
				
			||||||
 | 
					        [ -f "$BACKUP_DIR/local.yaml" ] && cp "$BACKUP_DIR/local.yaml" /opt/kimai/config/packages/
 | 
				
			||||||
 | 
					        rm -rf "$BACKUP_DIR"
 | 
				
			||||||
 | 
					        cd /opt/kimai
 | 
				
			||||||
 | 
					        $STD composer install --no-dev --optimize-autoloader
 | 
				
			||||||
 | 
					        $STD bin/console kimai:update
 | 
				
			||||||
 | 
					        chown -R :www-data .
 | 
				
			||||||
 | 
					        chmod -R g+r .
 | 
				
			||||||
 | 
					        chmod -R g+rw var/
 | 
				
			||||||
 | 
					        chmod -R 777 /opt/kimai/var/
 | 
				
			||||||
 | 
					        chown -R www-data:www-data /opt/kimai
 | 
				
			||||||
 | 
					        chmod -R 755 /opt/kimai
 | 
				
			||||||
 | 
					        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					        msg_ok "Updated ${APP} to ${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Starting Apache2"
 | 
				
			||||||
 | 
					        systemctl start apache2
 | 
				
			||||||
 | 
					        msg_ok "Started Apache2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Cleaning Up"
 | 
				
			||||||
 | 
					        rm -rf ${RELEASE}.zip
 | 
				
			||||||
 | 
					        rm -rf "$BACKUP_DIR"
 | 
				
			||||||
 | 
					        msg_ok "Cleaned"
 | 
				
			||||||
 | 
					        msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  RELEASE=$(curl -s https://api.github.com/repos/kimai/kimai/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					 | 
				
			||||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
					 | 
				
			||||||
    msg_info "Stopping Apache2"
 | 
					 | 
				
			||||||
    systemctl stop apache2
 | 
					 | 
				
			||||||
    msg_ok "Stopped Apache2"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Updating ${APP} to ${RELEASE}"
 | 
					 | 
				
			||||||
    cp /opt/kimai/.env /opt/.env
 | 
					 | 
				
			||||||
    [ -f /opt/kimai/config/packages/local.yaml ] && cp /opt/kimai/config/packages/local.yaml /opt/local.yaml
 | 
					 | 
				
			||||||
    rm -rf /opt/kimai
 | 
					 | 
				
			||||||
    wget -q "https://github.com/kimai/kimai/archive/refs/tags/${RELEASE}.zip"
 | 
					 | 
				
			||||||
    unzip -q ${RELEASE}.zip
 | 
					 | 
				
			||||||
    mv kimai-${RELEASE} /opt/kimai
 | 
					 | 
				
			||||||
    mv /opt/.env /opt/kimai/.env
 | 
					 | 
				
			||||||
    [ -f /opt/local.yaml ] && mv /opt/local.yaml /opt/kimai/config/packages/local.yaml
 | 
					 | 
				
			||||||
    cd /opt/kimai
 | 
					 | 
				
			||||||
    $STD composer install --no-dev --optimize-autoloader
 | 
					 | 
				
			||||||
    $STD bin/console kimai:update
 | 
					 | 
				
			||||||
    chown -R :www-data .
 | 
					 | 
				
			||||||
    chmod -R g+r .
 | 
					 | 
				
			||||||
    chmod -R g+rw var/
 | 
					 | 
				
			||||||
    chmod -R 777 /opt/kimai/var/ 
 | 
					 | 
				
			||||||
    chown -R www-data:www-data /opt/kimai
 | 
					 | 
				
			||||||
    chmod -R 755 /opt/kimai
 | 
					 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					 | 
				
			||||||
    msg_ok "Updated ${APP} to ${RELEASE}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Starting Apache2"
 | 
					 | 
				
			||||||
    systemctl start apache2
 | 
					 | 
				
			||||||
    msg_ok "Started Apache2"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Cleaning Up"
 | 
					 | 
				
			||||||
    rm -rf ${RELEASE}.zip
 | 
					 | 
				
			||||||
    msg_ok "Cleaned"
 | 
					 | 
				
			||||||
    msg_ok "Updated Successfully"
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  exit
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start
 | 
					start
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,15 @@ function update_script() {
 | 
				
			|||||||
    systemctl stop linkwarden
 | 
					    systemctl stop linkwarden
 | 
				
			||||||
    msg_ok "Stopped ${APP}"
 | 
					    msg_ok "Stopped ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Updating Rust"
 | 
				
			||||||
 | 
					    $STD apt-get install -y build-essential
 | 
				
			||||||
 | 
					    $STD curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
 | 
				
			||||||
 | 
					    source $HOME/.cargo/env
 | 
				
			||||||
 | 
					    echo 'export PATH=/usr/local/cargo/bin:$PATH' >> /etc/profile
 | 
				
			||||||
 | 
					    source /etc/profile
 | 
				
			||||||
 | 
					    $STD cargo install monolith
 | 
				
			||||||
 | 
					    msg_ok "Updated Rust"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating ${APP} to ${RELEASE}"
 | 
					    msg_info "Updating ${APP} to ${RELEASE}"
 | 
				
			||||||
    cd /opt
 | 
					    cd /opt
 | 
				
			||||||
    mv /opt/linkwarden/.env /opt/.env
 | 
					    mv /opt/linkwarden/.env /opt/.env
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,7 @@ function update_script() {
 | 
				
			|||||||
  msg_ok "Cleaned Old Files"
 | 
					  msg_ok "Cleaned Old Files"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  msg_info "Downloading NPM v${RELEASE}"
 | 
					  msg_info "Downloading NPM v${RELEASE}"
 | 
				
			||||||
  $STD wget -q https://codeload.github.com/NginxProxyManager/nginx-proxy-manager/tar.gz/v${RELEASE} -O - | tar -xz
 | 
					  wget -q https://codeload.github.com/NginxProxyManager/nginx-proxy-manager/tar.gz/v${RELEASE} -O - | tar -xz
 | 
				
			||||||
  cd nginx-proxy-manager-${RELEASE}
 | 
					  cd nginx-proxy-manager-${RELEASE}
 | 
				
			||||||
  msg_ok "Downloaded NPM v${RELEASE}"
 | 
					  msg_ok "Downloaded NPM v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -157,4 +157,4 @@ description
 | 
				
			|||||||
msg_ok "Completed Successfully!\n"
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:81${CL}"
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:81${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,11 @@ function update_script() {
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
  msg_info "Updating ${APP} (Patience)"
 | 
					  msg_info "Updating ${APP} (Patience)"
 | 
				
			||||||
  cd /opt/open-webui
 | 
					  cd /opt/open-webui
 | 
				
			||||||
 | 
					  mkdir /opt/open-webui-backup
 | 
				
			||||||
 | 
					  cp -rf /opt/open-webui/backend/data /opt/open-webui-backup
 | 
				
			||||||
 | 
					  git add -A
 | 
				
			||||||
 | 
					  $STD git stash
 | 
				
			||||||
 | 
					  $STD git reset --hard
 | 
				
			||||||
  output=$(git pull --no-rebase)
 | 
					  output=$(git pull --no-rebase)
 | 
				
			||||||
  if echo "$output" | grep -q "Already up to date."; then
 | 
					  if echo "$output" | grep -q "Already up to date."; then
 | 
				
			||||||
    msg_ok "$APP is already up to date."
 | 
					    msg_ok "$APP is already up to date."
 | 
				
			||||||
@@ -40,6 +45,8 @@ function update_script() {
 | 
				
			|||||||
  $STD npm run build
 | 
					  $STD npm run build
 | 
				
			||||||
  cd ./backend
 | 
					  cd ./backend
 | 
				
			||||||
  $STD pip install -r requirements.txt -U
 | 
					  $STD pip install -r requirements.txt -U
 | 
				
			||||||
 | 
					  cp -rf /opt/open-webui-backup/* /opt/open-webui/backend
 | 
				
			||||||
 | 
					  $STD git stash pop
 | 
				
			||||||
  systemctl start open-webui.service
 | 
					  systemctl start open-webui.service
 | 
				
			||||||
  msg_ok "Updated Successfully"
 | 
					  msg_ok "Updated Successfully"
 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										74
									
								
								ct/paperless-gpt.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								ct/paperless-gpt.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					#!/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: MickLesk (CanbiZ)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/icereed/paperless-gpt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Paperless-GPT"
 | 
				
			||||||
 | 
					var_tags="os"
 | 
				
			||||||
 | 
					var_cpu="3"
 | 
				
			||||||
 | 
					var_ram="2048"
 | 
				
			||||||
 | 
					var_disk="7"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					    if [[ ! -d /opt/paperless-gpt ]]; then
 | 
				
			||||||
 | 
					        msg_error "No Paperless-GPT installation found!"
 | 
				
			||||||
 | 
					        exit 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    RELEASE=$(curl -s https://api.github.com/repos/icereed/paperless-gpt/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					    if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					        msg_info "Stopping Service"
 | 
				
			||||||
 | 
					        systemctl stop paperless-gpt
 | 
				
			||||||
 | 
					        msg_ok "Service Stopped"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Updating Paperless-GPT to ${RELEASE}"
 | 
				
			||||||
 | 
					        temp_file=$(mktemp)
 | 
				
			||||||
 | 
					        wget -q "https://github.com/icereed/paperless-gpt/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
 | 
				
			||||||
 | 
					        tar zxf $temp_file
 | 
				
			||||||
 | 
					        rm -rf /opt/paperless-gpt
 | 
				
			||||||
 | 
					        mv paperless-gpt-${RELEASE} /opt/paperless-gpt
 | 
				
			||||||
 | 
					        cd /opt/paperless-gpt/web-app
 | 
				
			||||||
 | 
					        $STD npm install
 | 
				
			||||||
 | 
					        $STD npm run build
 | 
				
			||||||
 | 
					        cd /opt/paperless-gpt
 | 
				
			||||||
 | 
					        go mod download
 | 
				
			||||||
 | 
					        export CC=musl-gcc
 | 
				
			||||||
 | 
					        CGO_ENABLED=1 go build -tags musl -o /dev/null github.com/mattn/go-sqlite3
 | 
				
			||||||
 | 
					        CGO_ENABLED=1 go build -tags musl -o paperless-gpt .
 | 
				
			||||||
 | 
					        echo "${RELEASE}" >"/opt/paperless-gpt_version.txt"
 | 
				
			||||||
 | 
					        msg_ok "Updated Paperless-GPT to ${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Starting Service"
 | 
				
			||||||
 | 
					        systemctl start paperless-gpt
 | 
				
			||||||
 | 
					        msg_ok "Started Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Cleaning Up"
 | 
				
			||||||
 | 
					        rm -f $temp_file
 | 
				
			||||||
 | 
					        msg_ok "Cleanup Completed"
 | 
				
			||||||
 | 
					        msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
 | 
				
			||||||
							
								
								
									
										76
									
								
								ct/pelican-panel.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								ct/pelican-panel.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					#!/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: bvdberg01
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/pelican-dev/panel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Pelican-Panel"
 | 
				
			||||||
 | 
					var_tags="Gaming"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="1024"
 | 
				
			||||||
 | 
					var_disk="4"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					  if [[ ! -d /opt/pelican-panel ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  RELEASE=$(curl -s https://api.github.com/repos/pelican-dev/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					    msg_info "Stopping Service"
 | 
				
			||||||
 | 
					    cd /opt/pelican-panel
 | 
				
			||||||
 | 
					    $STD php artisan down
 | 
				
			||||||
 | 
					    msg_ok "Stopped Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Updating ${APP} to v${RELEASE}"
 | 
				
			||||||
 | 
					    cp -r /opt/pelican-panel/.env /opt/
 | 
				
			||||||
 | 
					    rm -rf * .*
 | 
				
			||||||
 | 
					    wget -q "https://github.com/pelican-dev/panel/releases/download/v${RELEASE}/panel.tar.gz"
 | 
				
			||||||
 | 
					    tar -xzf "panel.tar.gz"
 | 
				
			||||||
 | 
					    mv /opt/.env /opt/pelican-panel/
 | 
				
			||||||
 | 
					    $STD composer install --no-dev --optimize-autoloader --no-interaction
 | 
				
			||||||
 | 
					    $STD php artisan p:environment:setup
 | 
				
			||||||
 | 
					    $STD php artisan view:clear
 | 
				
			||||||
 | 
					    $STD php artisan config:clear
 | 
				
			||||||
 | 
					    $STD php artisan filament:optimize
 | 
				
			||||||
 | 
					    $STD php artisan migrate --seed --force
 | 
				
			||||||
 | 
					    chown -R www-data:www-data /opt/pelican-panel
 | 
				
			||||||
 | 
					    chmod -R 755 /opt/pelican-panel/storage /opt/pelican-panel/bootstrap/cache/
 | 
				
			||||||
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					    msg_ok "Updated $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Starting Service"
 | 
				
			||||||
 | 
					    $STD php artisan queue:restart
 | 
				
			||||||
 | 
					    $STD php artisan up
 | 
				
			||||||
 | 
					    msg_ok "Started Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Cleaning up"
 | 
				
			||||||
 | 
					    rm -rf "/opt/pelican-panel/panel.tar.gz"
 | 
				
			||||||
 | 
					    msg_ok "Cleaned"
 | 
				
			||||||
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/installer${CL}"
 | 
				
			||||||
							
								
								
									
										58
									
								
								ct/pelican-wings.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ct/pelican-wings.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					#!/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: bvdberg01
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/pelican-dev/wings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Pelican-Wings"
 | 
				
			||||||
 | 
					var_tags="Gaming"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="4096"
 | 
				
			||||||
 | 
					var_disk="8"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					  if [[ ! -f /usr/local/bin/wings ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  RELEASE=$(curl -s https://api.github.com/repos/pelican-dev/wings/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					    msg_info "Stopping Service"
 | 
				
			||||||
 | 
					    systemctl stop wings
 | 
				
			||||||
 | 
					    msg_ok "Stopped Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Updating ${APP} to v${RELEASE}"
 | 
				
			||||||
 | 
					    rm /usr/local/bin/wings
 | 
				
			||||||
 | 
					    wget -q -O /usr/local/bin/wings "https://github.com/pelican-dev/wings/releases/download/v${RELEASE}/wings_linux_amd64"
 | 
				
			||||||
 | 
					    chmod u+x /usr/local/bin/wings
 | 
				
			||||||
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					    msg_ok "Updated $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Starting Service"
 | 
				
			||||||
 | 
					    systemctl start wings
 | 
				
			||||||
 | 
					    msg_ok "Started Service"
 | 
				
			||||||
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					  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}"
 | 
				
			||||||
@@ -29,7 +29,7 @@ function update_script() {
 | 
				
			|||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_info "Updating ${APP}"
 | 
					    msg_info "Updating ${APP}"
 | 
				
			||||||
    set +e
 | 
					    set +e
 | 
				
			||||||
    pihole -up
 | 
					    /usr/local/bin/pihole -up
 | 
				
			||||||
    msg_ok "Updated ${APP}"
 | 
					    msg_ok "Updated ${APP}"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -41,4 +41,4 @@ description
 | 
				
			|||||||
msg_ok "Completed Successfully!\n"
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/admin${CL}"
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/admin${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										64
									
								
								ct/plant-it.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								ct/plant-it.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: MickLesk (CanbiZ)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://plant-it.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Plant-it"
 | 
				
			||||||
 | 
					var_tags="plants;garden"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="2048"
 | 
				
			||||||
 | 
					var_disk="5"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ ! -d /opt/plant-it ]]; then
 | 
				
			||||||
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    RELEASE=$(curl -s https://api.github.com/repos/MDeLuise/plant-it/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
 | 
					    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
				
			||||||
 | 
					        msg_info "Stopping $APP"
 | 
				
			||||||
 | 
					        systemctl stop plant-it
 | 
				
			||||||
 | 
					        msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Updating $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					        wget -q -O /opt/plant-it/server.jar "https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/server.jar"
 | 
				
			||||||
 | 
					        cd /opt/plant-it/frontend
 | 
				
			||||||
 | 
					        wget -q https://github.com/MDeLuise/plant-it/releases/download/${RELEASE}/client.tar.gz
 | 
				
			||||||
 | 
					        tar -xzf client.tar.gz
 | 
				
			||||||
 | 
					        rm -f client.tar.gz
 | 
				
			||||||
 | 
					        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					        msg_ok "Updated $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Starting $APP"
 | 
				
			||||||
 | 
					        systemctl start plant-it
 | 
				
			||||||
 | 
					        msg_ok "Started $APP"
 | 
				
			||||||
 | 
					        msg_ok "Update Successful"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
				
			||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										74
									
								
								ct/pterodactyl-panel.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								ct/pterodactyl-panel.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					#!/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: bvdberg01
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/pterodactyl/panel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Pterodactyl-Panel"
 | 
				
			||||||
 | 
					var_tags="gaming"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="1024"
 | 
				
			||||||
 | 
					var_disk="4"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					  if [[ ! -d /opt/pterodactyl-panel ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  RELEASE=$(curl -s https://api.github.com/repos/pterodactyl/panel/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					    msg_info "Stopping Service"
 | 
				
			||||||
 | 
					    cd /opt/pterodactyl-panel
 | 
				
			||||||
 | 
					    $STD php artisan down
 | 
				
			||||||
 | 
					    msg_ok "Stopped Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Updating ${APP} to v${RELEASE}"
 | 
				
			||||||
 | 
					    cp -r /opt/pterodactyl-panel/.env /opt/
 | 
				
			||||||
 | 
					    rm -rf * .*
 | 
				
			||||||
 | 
					    wget -q "https://github.com/pterodactyl/panel/releases/download/v${RELEASE}/panel.tar.gz"
 | 
				
			||||||
 | 
					    tar -xzf "panel.tar.gz"
 | 
				
			||||||
 | 
					    mv /opt/.env /opt/pterodactyl-panel/
 | 
				
			||||||
 | 
					    $STD composer install --no-dev --optimize-autoloader --no-interaction
 | 
				
			||||||
 | 
					    $STD php artisan view:clear
 | 
				
			||||||
 | 
					    $STD php artisan config:clear
 | 
				
			||||||
 | 
					    $STD php artisan migrate --seed --force --no-interaction
 | 
				
			||||||
 | 
					    chown -R www-data:www-data /opt/pterodactyl-panel/*
 | 
				
			||||||
 | 
					    chmod -R 755 /opt/pterodactyl-panel/storage /opt/pterodactyl-panel/bootstrap/cache/
 | 
				
			||||||
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					    msg_ok "Updated $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Starting Service"
 | 
				
			||||||
 | 
					    $STD php artisan queue:restart
 | 
				
			||||||
 | 
					    $STD php artisan up
 | 
				
			||||||
 | 
					    msg_ok "Started Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Cleaning up"
 | 
				
			||||||
 | 
					    rm -rf "/opt/pterodactyl-panel/panel.tar.gz"
 | 
				
			||||||
 | 
					    msg_ok "Cleaned"
 | 
				
			||||||
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
				
			||||||
							
								
								
									
										58
									
								
								ct/pterodactyl-wings.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ct/pterodactyl-wings.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					#!/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: bvdberg01
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/pterodactyl/wings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Pterodactyl-Wings"
 | 
				
			||||||
 | 
					var_tags="gaming"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="4096"
 | 
				
			||||||
 | 
					var_disk="8"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					  if [[ ! -f /usr/local/bin/wings ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  RELEASE=$(curl -s https://api.github.com/repos/pterodactyl/wings/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					    msg_info "Stopping Service"
 | 
				
			||||||
 | 
					    systemctl stop wings
 | 
				
			||||||
 | 
					    msg_ok "Stopped Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Updating ${APP} to v${RELEASE}"
 | 
				
			||||||
 | 
					    rm /usr/local/bin/wings
 | 
				
			||||||
 | 
					    wget -q -O /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/download/v${RELEASE}/wings_linux_amd64"
 | 
				
			||||||
 | 
					    chmod u+x /usr/local/bin/wings
 | 
				
			||||||
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					    msg_ok "Updated $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Starting Service"
 | 
				
			||||||
 | 
					    systemctl start wings
 | 
				
			||||||
 | 
					    msg_ok "Started Service"
 | 
				
			||||||
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					  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}"
 | 
				
			||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										75
									
								
								ct/revealjs.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								ct/revealjs.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					#!/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: Slaviša Arežina (tremor021)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/hakimel/reveal.js
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="RevealJS"
 | 
				
			||||||
 | 
					var_tags="presentation"
 | 
				
			||||||
 | 
					var_cpu="1"
 | 
				
			||||||
 | 
					var_ram="1024"
 | 
				
			||||||
 | 
					var_disk="4"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ ! -d "/opt/revealjs" ]]; then
 | 
				
			||||||
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    RELEASE=$(curl -s https://api.github.com/repos/hakimel/reveal.js/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
 | 
					    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
				
			||||||
 | 
					        msg_info "Stopping $APP"
 | 
				
			||||||
 | 
					        systemctl stop revealjs
 | 
				
			||||||
 | 
					        msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Updating $APP to ${RELEASE}"
 | 
				
			||||||
 | 
					        temp_file=$(mktemp)
 | 
				
			||||||
 | 
					        wget -q "https://github.com/hakimel/reveal.js/archive/refs/tags/${RELEASE}.tar.gz" -O $temp_file
 | 
				
			||||||
 | 
					        tar zxf $temp_file
 | 
				
			||||||
 | 
					        rm -rf /opt/revealjs/node_modules/*
 | 
				
			||||||
 | 
					        cp /opt/revealjs/index.html  /opt
 | 
				
			||||||
 | 
					        cp /opt/revealjs/gulpfile.js /opt
 | 
				
			||||||
 | 
					        cp -rf reveal.js-${RELEASE}/* /opt/revealjs
 | 
				
			||||||
 | 
					        cd /opt/revealjs
 | 
				
			||||||
 | 
					        $STD npm install
 | 
				
			||||||
 | 
					        cp -f /opt/index.html /opt/revealjs
 | 
				
			||||||
 | 
					        cp -f /opt/gulpfile.js /opt/revealjs
 | 
				
			||||||
 | 
					        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					        msg_ok "Updated $APP to ${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Starting $APP"
 | 
				
			||||||
 | 
					        systemctl start revealjs
 | 
				
			||||||
 | 
					        msg_ok "Started $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Cleaning Up"
 | 
				
			||||||
 | 
					        rm -f $temp_file
 | 
				
			||||||
 | 
					        rm -rf ~/reveal.js-${RELEASE}
 | 
				
			||||||
 | 
					        msg_ok "Cleanup Completed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_ok "Update Successful"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
 | 
				
			||||||
							
								
								
									
										43
									
								
								ct/seafile.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								ct/seafile.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
 | 
					# Author: dave-yap (dave-yap)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://seafile.com/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Seafile"
 | 
				
			||||||
 | 
					var_tags="documents"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="2048"
 | 
				
			||||||
 | 
					var_disk="20"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					base_settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					    if [[ ! -f /etc/systemd/system/seafile.service ]]; then
 | 
				
			||||||
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    msg_ok "No upgrade path available now."
 | 
				
			||||||
 | 
					    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}:8000${CL}"
 | 
				
			||||||
@@ -6,7 +6,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
				
			|||||||
# Source: https://snipeitapp.com/
 | 
					# Source: https://snipeitapp.com/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
APP="SnipeIT"
 | 
					APP="SnipeIT"
 | 
				
			||||||
var_tags="assat-management;foss"
 | 
					var_tags="asset-management;foss"
 | 
				
			||||||
var_cpu="2"
 | 
					var_cpu="2"
 | 
				
			||||||
var_ram="2048"
 | 
					var_ram="2048"
 | 
				
			||||||
var_disk="4"
 | 
					var_disk="4"
 | 
				
			||||||
@@ -27,13 +27,20 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  RELEASE=$(curl -s https://api.github.com/repos/snipe/snipe-it/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					  RELEASE=$(curl -s https://api.github.com/repos/snipe/snipe-it/releases/latest | grep '"tag_name"' | sed -E 's/.*"tag_name": "v([^"]+).*/\1/')
 | 
				
			||||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
					  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					    msg_info "Stopping Services"
 | 
				
			||||||
 | 
					    systemctl stop nginx
 | 
				
			||||||
 | 
					    msg_ok "Services Stopped"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
					    msg_info "Updating ${APP} to v${RELEASE}"
 | 
				
			||||||
    $STD apt-get update
 | 
					    $STD apt-get update
 | 
				
			||||||
    $STD apt-get -y upgrade
 | 
					    $STD apt-get -y upgrade
 | 
				
			||||||
    mv /opt/snipe-it /opt/snipe-it-backup
 | 
					    mv /opt/snipe-it /opt/snipe-it-backup
 | 
				
			||||||
    cd /opt
 | 
					    temp_file=$(mktemp)
 | 
				
			||||||
 | 
					    wget -q "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
 | 
				
			||||||
 | 
					    tar zxf $temp_file
 | 
				
			||||||
 | 
					    mv snipe-it-${RELEASE} /opt/snipe-it
 | 
				
			||||||
    $STD wget -q "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip"
 | 
					    $STD wget -q "https://github.com/snipe/snipe-it/archive/refs/tags/v${RELEASE}.zip"
 | 
				
			||||||
    unzip -q v${RELEASE}.zip
 | 
					    unzip -q v${RELEASE}.zip
 | 
				
			||||||
    mv snipe-it-${RELEASE} /opt/snipe-it
 | 
					    mv snipe-it-${RELEASE} /opt/snipe-it
 | 
				
			||||||
@@ -53,9 +60,13 @@ function update_script() {
 | 
				
			|||||||
    chmod -R 755 /opt/snipe-it
 | 
					    chmod -R 755 /opt/snipe-it
 | 
				
			||||||
    rm -rf /opt/v${RELEASE}.zip
 | 
					    rm -rf /opt/v${RELEASE}.zip
 | 
				
			||||||
    rm -rf /opt/snipe-it-backup
 | 
					    rm -rf /opt/snipe-it-backup
 | 
				
			||||||
    msg_ok "Updated ${APP} LXC"
 | 
					    msg_ok "Updated ${APP}"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    msg_info "Starting Service"
 | 
				
			||||||
 | 
					    systemctl start nginx
 | 
				
			||||||
 | 
					    msg_ok "Started Service"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}."
 | 
					    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -67,4 +78,4 @@ description
 | 
				
			|||||||
msg_ok "Completed Successfully!\n"
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,10 +32,10 @@ function update_script() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating ${APP} to v${VERSION}"
 | 
					    msg_info "Updating ${APP} to v${VERSION}"
 | 
				
			||||||
    cd /opt
 | 
					    cd /opt
 | 
				
			||||||
    mv /opt/teddycloud /opt_teddycloud_bak
 | 
					    mv /opt/teddycloud /opt/teddycloud_bak
 | 
				
			||||||
    wget -q "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip"
 | 
					    wget -q "https://github.com/toniebox-reverse-engineering/teddycloud/releases/download/${RELEASE}/teddycloud.amd64.release_v${VERSION}.zip"
 | 
				
			||||||
    unzip -q -d /opt/teddycloud teddycloud.amd64.release_v${VERSION}.zip
 | 
					    unzip -q -d /opt/teddycloud teddycloud.amd64.release_v${VERSION}.zip
 | 
				
			||||||
    cp -R /opt_teddycloud_bak/certs /opt_teddycloud_bak/config /opt_teddycloud_bak/data /opt/teddycloud
 | 
					    cp -R /opt/teddycloud_bak/certs /opt/teddycloud_bak/config /opt/teddycloud_bak/data /opt/teddycloud
 | 
				
			||||||
    echo "${VERSION}" >"/opt/${APP}_version.txt"
 | 
					    echo "${VERSION}" >"/opt/${APP}_version.txt"
 | 
				
			||||||
    msg_ok "Updated ${APP} to v${VERSION}"
 | 
					    msg_ok "Updated ${APP} to v${VERSION}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,8 +27,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    msg_error "There is currently no update path available."
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
    exit
 | 
					 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,8 @@ function update_script() {
 | 
				
			|||||||
    cd /opt
 | 
					    cd /opt
 | 
				
			||||||
    rm -rf /opt/vikunja/vikunja
 | 
					    rm -rf /opt/vikunja/vikunja
 | 
				
			||||||
    wget -q "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb"
 | 
					    wget -q "https://dl.vikunja.io/vikunja/$RELEASE/vikunja-$RELEASE-amd64.deb"
 | 
				
			||||||
    $STD DEBIAN_FRONTEND=noninteractive dpkg -i vikunja-$RELEASE-amd64.deb
 | 
					    export DEBIAN_FRONTEND=noninteractive
 | 
				
			||||||
 | 
					    $STD dpkg -i vikunja-$RELEASE-amd64.deb
 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
    msg_ok "Updated ${APP}"
 | 
					    msg_ok "Updated ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,39 +20,69 @@ color
 | 
				
			|||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function update_script() {
 | 
					function update_script() {
 | 
				
			||||||
  header_info
 | 
					    header_info
 | 
				
			||||||
  check_container_storage
 | 
					    check_container_storage
 | 
				
			||||||
  check_container_resources
 | 
					    check_container_resources
 | 
				
			||||||
  if [[ ! -d /opt/wastebin ]]; then
 | 
					    if [[ ! -d /opt/wastebin ]]; then
 | 
				
			||||||
    msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    RELEASE=$(curl -s https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
 | 
					    # Dirty-Fix 03/2025 for missing APP_version.txt on old installations, set to pre-latest release
 | 
				
			||||||
 | 
					    msg_info "Running Migration"
 | 
				
			||||||
 | 
					    if [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
				
			||||||
 | 
					        echo "2.7.1" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					        mkdir -p /opt/wastebin-data
 | 
				
			||||||
 | 
					        cat <<EOF >/opt/wastebin-data/.env
 | 
				
			||||||
 | 
					WASTEBIN_DATABASE_PATH=/opt/wastebin-data/wastebin.db
 | 
				
			||||||
 | 
					WASTEBIN_CACHE_SIZE=1024
 | 
				
			||||||
 | 
					WASTEBIN_HTTP_TIMEOUT=30
 | 
				
			||||||
 | 
					WASTEBIN_SIGNING_KEY=$(openssl rand -hex 32)
 | 
				
			||||||
 | 
					WASTEBIN_PASTE_EXPIRATIONS=0,600,3600=d,86400,604800,2419200,29030400
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					        systemctl stop wastebin
 | 
				
			||||||
 | 
					        cat <<EOF >/etc/systemd/system/wastebin.service
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=Wastebin Service
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					WorkingDirectory=/opt/wastebin
 | 
				
			||||||
 | 
					ExecStart=/opt/wastebin/wastebin
 | 
				
			||||||
 | 
					EnvironmentFile=/opt/wastebin-data/.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					        systemctl daemon-reload
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    msg_ok "Migration Done"
 | 
				
			||||||
 | 
					    if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
 | 
					        msg_info "Stopping Wastebin"
 | 
				
			||||||
 | 
					        systemctl stop wastebin
 | 
				
			||||||
 | 
					        msg_ok "Wastebin Stopped"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Updating Wastebin"
 | 
				
			||||||
 | 
					        temp_file=$(mktemp)
 | 
				
			||||||
 | 
					        wget -q https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.zip -O $temp_file
 | 
				
			||||||
 | 
					        unzip -o -q $temp_file
 | 
				
			||||||
 | 
					        cp -f wastebin /opt/wastebin/
 | 
				
			||||||
 | 
					        chmod +x /opt/wastebin/wastebin
 | 
				
			||||||
 | 
					        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
 | 
					        msg_ok "Updated Wastebin"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Starting Wastebin"
 | 
				
			||||||
 | 
					        systemctl start wastebin
 | 
				
			||||||
 | 
					        msg_ok "Started Wastebin"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        msg_info "Cleaning Up"
 | 
				
			||||||
 | 
					        rm -f $temp_file
 | 
				
			||||||
 | 
					        msg_ok "Cleanup Completed"
 | 
				
			||||||
 | 
					        msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  RELEASE=$(curl -s https://api.github.com/repos/matze/wastebin/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					 | 
				
			||||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
					 | 
				
			||||||
    msg_info "Stopping Wastebin"
 | 
					 | 
				
			||||||
    systemctl stop wastebin
 | 
					 | 
				
			||||||
    msg_ok "Wastebin Stopped"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Updating Wastebin"
 | 
					 | 
				
			||||||
    wget -q https://github.com/matze/wastebin/releases/download/${RELEASE}/wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
 | 
					 | 
				
			||||||
    tar -xf wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
 | 
					 | 
				
			||||||
    cp -f wastebin /opt/wastebin/
 | 
					 | 
				
			||||||
    chmod +x /opt/wastebin/wastebin
 | 
					 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					 | 
				
			||||||
    msg_ok "Updated Wastebin"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Starting Wastebin"
 | 
					 | 
				
			||||||
    systemctl start wastebin
 | 
					 | 
				
			||||||
    msg_ok "Started Wastebin"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    msg_info "Cleaning Up"
 | 
					 | 
				
			||||||
    rm -rf wastebin_${RELEASE}_x86_64-unknown-linux-musl.tar.zst
 | 
					 | 
				
			||||||
    msg_ok "Cleaned"
 | 
					 | 
				
			||||||
    msg_ok "Updated Successfully"
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
  exit
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start
 | 
					start
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								ct/web-check.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								ct/web-check.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					#!/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: CrazyWolf13
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/Lissy93/web-check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="web-check"
 | 
				
			||||||
 | 
					TAGS="network;analysis"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="2048"
 | 
				
			||||||
 | 
					var_disk="12"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					    header_info
 | 
				
			||||||
 | 
					    check_container_storage
 | 
				
			||||||
 | 
					    check_container_resources
 | 
				
			||||||
 | 
					    if [[ ! -d /opt/web-check ]]; then
 | 
				
			||||||
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    msg_error "Currently we don't provide an update function for this ${APP}."
 | 
				
			||||||
 | 
					    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}:3000${CL}"
 | 
				
			||||||
@@ -32,8 +32,11 @@ function update_script() {
 | 
				
			|||||||
    msg_ok "Stopped ${APP}"
 | 
					    msg_ok "Stopped ${APP}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Backing up Data"
 | 
					    msg_info "Backing up Data"
 | 
				
			||||||
 | 
					    rm -rf ~/data-backup
 | 
				
			||||||
    mkdir -p ~/data-backup
 | 
					    mkdir -p ~/data-backup
 | 
				
			||||||
    cp -R /opt/wikijs/{db.sqlite,config.yml,/data} ~/data-backup
 | 
					    [ -f /opt/wikijs/db.sqlite ] && cp /opt/wikijs/db.sqlite ~/data-backup
 | 
				
			||||||
 | 
					    [ -f /opt/wikijs/config.yml ] && cp /opt/wikijs/config.yml ~/data-backup
 | 
				
			||||||
 | 
					    [ -d /opt/wikijs/data ] && cp -R /opt/wikijs/data ~/data-backup
 | 
				
			||||||
    msg_ok "Backed up Data"
 | 
					    msg_ok "Backed up Data"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating ${APP}"
 | 
					    msg_info "Updating ${APP}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,10 @@ function update_script() {
 | 
				
			|||||||
    systemctl stop zigbee2mqtt
 | 
					    systemctl stop zigbee2mqtt
 | 
				
			||||||
    msg_ok "Stopped Service"
 | 
					    msg_ok "Stopped Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Updating pnpm"
 | 
				
			||||||
 | 
					    $STD npm install -g pnpm@10.4.1
 | 
				
			||||||
 | 
					    msg_ok "Updated pnpm"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Creating Backup"
 | 
					    msg_info "Creating Backup"
 | 
				
			||||||
      rm -rf /opt/${APP}_backup*.tar.gz
 | 
					      rm -rf /opt/${APP}_backup*.tar.gz
 | 
				
			||||||
      mkdir -p /opt/z2m_backup
 | 
					      mkdir -p /opt/z2m_backup
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
"use client";
 | 
					"use client";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import React, { useEffect, useState } from "react";
 | 
					import React, { JSX, useEffect, useState } from "react";
 | 
				
			||||||
import DatePicker from 'react-datepicker';
 | 
					import DatePicker from 'react-datepicker';
 | 
				
			||||||
import 'react-datepicker/dist/react-datepicker.css';
 | 
					import 'react-datepicker/dist/react-datepicker.css';
 | 
				
			||||||
import ApplicationChart from "../../components/ApplicationChart";
 | 
					import ApplicationChart from "../../components/ApplicationChart";
 | 
				
			||||||
@@ -21,28 +21,45 @@ interface DataModel {
 | 
				
			|||||||
  status: string;
 | 
					  status: string;
 | 
				
			||||||
  error: string;
 | 
					  error: string;
 | 
				
			||||||
  type: string;
 | 
					  type: string;
 | 
				
			||||||
 | 
					  [key: string]: any;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface SummaryData {
 | 
				
			||||||
 | 
					  total_entries: number;
 | 
				
			||||||
 | 
					  status_count: Record<string, number>;
 | 
				
			||||||
 | 
					  nsapp_count: Record<string, number>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const DataFetcher: React.FC = () => {
 | 
					const DataFetcher: React.FC = () => {
 | 
				
			||||||
  const [data, setData] = useState<DataModel[]>([]);
 | 
					  const [data, setData] = useState<DataModel[]>([]);
 | 
				
			||||||
 | 
					  const [summary, setSummary] = useState<SummaryData | null>(null);
 | 
				
			||||||
  const [loading, setLoading] = useState<boolean>(true);
 | 
					  const [loading, setLoading] = useState<boolean>(true);
 | 
				
			||||||
  const [error, setError] = useState<string | null>(null);
 | 
					  const [error, setError] = useState<string | null>(null);
 | 
				
			||||||
  const [searchQuery, setSearchQuery] = useState('');
 | 
					 | 
				
			||||||
  const [startDate, setStartDate] = useState<Date | null>(null);
 | 
					 | 
				
			||||||
  const [endDate, setEndDate] = useState<Date | null>(null);
 | 
					 | 
				
			||||||
  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 [currentPage, setCurrentPage] = useState(1);
 | 
				
			||||||
 | 
					  const [itemsPerPage, setItemsPerPage] = useState(25);
 | 
				
			||||||
  const [showErrorRow, setShowErrorRow] = useState<number | null>(null);
 | 
					  const [sortConfig, setSortConfig] = useState<{ key: string; direction: 'ascending' | 'descending' } | null>(null);
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    const fetchData = async () => {
 | 
					    const fetchSummary = async () => {
 | 
				
			||||||
      try {
 | 
					      try {
 | 
				
			||||||
        const response = await fetch("https://api.htl-braunau.at/data/json");
 | 
					        const response = await fetch("https://api.htl-braunau.at/data/summary");
 | 
				
			||||||
        if (!response.ok) throw new Error("Failed to fetch data: ${response.statusText}");
 | 
					        if (!response.ok) throw new Error(`Failed to fetch summary: ${response.statusText}`);
 | 
				
			||||||
 | 
					        const result: SummaryData = await response.json();
 | 
				
			||||||
 | 
					        setSummary(result);
 | 
				
			||||||
 | 
					      } catch (err) {
 | 
				
			||||||
 | 
					        setError((err as Error).message);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fetchSummary();
 | 
				
			||||||
 | 
					  }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    const fetchPaginatedData = async () => {
 | 
				
			||||||
 | 
					      setLoading(true);
 | 
				
			||||||
 | 
					      try {
 | 
				
			||||||
 | 
					        const response = await fetch(`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${itemsPerPage === 0 ? '' : itemsPerPage}`);
 | 
				
			||||||
 | 
					        if (!response.ok) throw new Error(`Failed to fetch data: ${response.statusText}`);
 | 
				
			||||||
        const result: DataModel[] = await response.json();
 | 
					        const result: DataModel[] = await response.json();
 | 
				
			||||||
        setData(result);
 | 
					        setData(result);
 | 
				
			||||||
      } catch (err) {
 | 
					      } catch (err) {
 | 
				
			||||||
@@ -52,52 +69,34 @@ const DataFetcher: React.FC = () => {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fetchData();
 | 
					    fetchPaginatedData();
 | 
				
			||||||
  }, []);
 | 
					  }, [currentPage, itemsPerPage]);
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const filteredData = data.filter(item => {
 | 
					 | 
				
			||||||
    const matchesSearchQuery = Object.values(item).some(value =>
 | 
					 | 
				
			||||||
      value.toString().toLowerCase().includes(searchQuery.toLowerCase())
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    const itemDate = new Date(item.created_at);
 | 
					 | 
				
			||||||
    const matchesDateRange = (!startDate || itemDate >= startDate) && (!endDate || itemDate <= endDate);
 | 
					 | 
				
			||||||
    return matchesSearchQuery && matchesDateRange;
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const sortedData = React.useMemo(() => {
 | 
					  const sortedData = React.useMemo(() => {
 | 
				
			||||||
    let sortableData = [...filteredData];
 | 
					    if (!sortConfig) return data;
 | 
				
			||||||
    if (sortConfig.key !== null) {
 | 
					    const sorted = [...data].sort((a, b) => {
 | 
				
			||||||
      sortableData.sort((a, b) => {
 | 
					      if (a[sortConfig.key] < b[sortConfig.key]) {
 | 
				
			||||||
        if (sortConfig.key !== null && a[sortConfig.key] < b[sortConfig.key]) {
 | 
					        return sortConfig.direction === 'ascending' ? -1 : 1;
 | 
				
			||||||
          return sortConfig.direction === 'ascending' ? -1 : 1;
 | 
					      }
 | 
				
			||||||
        }
 | 
					      if (a[sortConfig.key] > b[sortConfig.key]) {
 | 
				
			||||||
        if (sortConfig.key !== null && a[sortConfig.key] > b[sortConfig.key]) {
 | 
					        return sortConfig.direction === 'ascending' ? 1 : -1;
 | 
				
			||||||
          return sortConfig.direction === 'ascending' ? 1 : -1;
 | 
					      }
 | 
				
			||||||
        }
 | 
					      return 0;
 | 
				
			||||||
        return 0;
 | 
					    });
 | 
				
			||||||
      });
 | 
					    return sorted;
 | 
				
			||||||
    }
 | 
					  }, [data, sortConfig]);
 | 
				
			||||||
    return sortableData;
 | 
					 | 
				
			||||||
  }, [filteredData, sortConfig]);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const requestSort = (key: keyof DataModel | null) => {
 | 
					  if (loading) return <p>Loading...</p>;
 | 
				
			||||||
 | 
					  if (error) return <p>Error: {error}</p>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const requestSort = (key: string) => {
 | 
				
			||||||
    let direction: 'ascending' | 'descending' = 'ascending';
 | 
					    let direction: 'ascending' | 'descending' = 'ascending';
 | 
				
			||||||
    if (sortConfig.key === key && sortConfig.direction === 'ascending') {
 | 
					    if (sortConfig && sortConfig.key === key && sortConfig.direction === 'ascending') {
 | 
				
			||||||
      direction = 'descending';
 | 
					 | 
				
			||||||
    } else if (sortConfig.key === key && sortConfig.direction === 'descending') {
 | 
					 | 
				
			||||||
      direction = 'ascending';
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      direction = 'descending';
 | 
					      direction = 'descending';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    setSortConfig({ key, direction });
 | 
					    setSortConfig({ key, direction });
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  interface SortConfig {
 | 
					 | 
				
			||||||
    key: keyof DataModel | null;
 | 
					 | 
				
			||||||
    direction: 'ascending' | 'descending';
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const formatDate = (dateString: string): string => {
 | 
					  const formatDate = (dateString: string): string => {
 | 
				
			||||||
    const date = new Date(dateString);
 | 
					    const date = new Date(dateString);
 | 
				
			||||||
    const year = date.getFullYear();
 | 
					    const year = date.getFullYear();
 | 
				
			||||||
@@ -109,86 +108,15 @@ const DataFetcher: React.FC = () => {
 | 
				
			|||||||
    return `${day}.${month}.${year} ${hours}:${minutes} ${timezoneOffset} GMT`;
 | 
					    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);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  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 (
 | 
					  return (
 | 
				
			||||||
    <div className="p-6 mt-20">
 | 
					    <div className="p-6 mt-20">
 | 
				
			||||||
      <h1 className="text-2xl font-bold mb-4 text-center">Created LXCs</h1>
 | 
					      <h1 className="text-2xl font-bold mb-4 text-center">Created LXCs</h1>
 | 
				
			||||||
      <div className="mb-4 flex space-x-4">
 | 
					      <ApplicationChart data={summary} />
 | 
				
			||||||
        <div>
 | 
					      <p className="text-lg font-bold mt-4"> </p>
 | 
				
			||||||
          <input
 | 
					 | 
				
			||||||
            type="text"
 | 
					 | 
				
			||||||
            placeholder="Search..."
 | 
					 | 
				
			||||||
            value={searchQuery}
 | 
					 | 
				
			||||||
            onChange={e => setSearchQuery(e.target.value)}
 | 
					 | 
				
			||||||
            className="p-2 border"
 | 
					 | 
				
			||||||
          />
 | 
					 | 
				
			||||||
          <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"
 | 
					 | 
				
			||||||
          />
 | 
					 | 
				
			||||||
          <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="mb-4 flex justify-between items-center">
 | 
					      <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-bold">{summary?.total_entries} results found</p>
 | 
				
			||||||
        <p className="text-lg font">Status Legend: 🔄 installing {installingCounts} | ✔️ completetd {doneCounts} | ❌ failed {failedCounts} | ❓ unknown {unknownCounts}</p>
 | 
					        <p className="text-lg font">Status Legend: 🔄 installing {summary?.status_count["installing"] ?? 0} | ✔️ completed {summary?.status_count["done"] ?? 0} | ❌ failed {summary?.status_count["failed"] ?? 0} | ❓ unknown</p>
 | 
				
			||||||
        <select value={itemsPerPage} onChange={handleItemsPerPageChange} className="p-2 border">
 | 
					      </div>      
 | 
				
			||||||
          <option value={25}>25</option>
 | 
					 | 
				
			||||||
          <option value={50}>50</option>
 | 
					 | 
				
			||||||
          <option value={100}>100</option>
 | 
					 | 
				
			||||||
          <option value={200}>200</option>
 | 
					 | 
				
			||||||
        </select>
 | 
					 | 
				
			||||||
      </div>
 | 
					 | 
				
			||||||
      <div className="overflow-x-auto">
 | 
					      <div className="overflow-x-auto">
 | 
				
			||||||
        <div className="overflow-y-auto lg:overflow-y-visible">
 | 
					        <div className="overflow-y-auto lg:overflow-y-visible">
 | 
				
			||||||
          <table className="min-w-full table-auto border-collapse">
 | 
					          <table className="min-w-full table-auto border-collapse">
 | 
				
			||||||
@@ -209,7 +137,7 @@ const DataFetcher: React.FC = () => {
 | 
				
			|||||||
              </tr>
 | 
					              </tr>
 | 
				
			||||||
            </thead>
 | 
					            </thead>
 | 
				
			||||||
            <tbody>
 | 
					            <tbody>
 | 
				
			||||||
              {paginatedData.map((item, index) => (
 | 
					              {sortedData.map((item, index) => (
 | 
				
			||||||
                <tr key={index}>
 | 
					                <tr key={index}>
 | 
				
			||||||
                  <td className="px-4 py-2 border-b">
 | 
					                  <td className="px-4 py-2 border-b">
 | 
				
			||||||
                    {item.status === "done" ? (
 | 
					                    {item.status === "done" ? (
 | 
				
			||||||
@@ -237,20 +165,7 @@ const DataFetcher: React.FC = () => {
 | 
				
			|||||||
                  <td className="px-4 py-2 border-b">{item.ram_size}</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.method}</td>
 | 
				
			||||||
                  <td className="px-4 py-2 border-b">{item.pve_version}</td>
 | 
					                  <td className="px-4 py-2 border-b">{item.pve_version}</td>
 | 
				
			||||||
                  <td className="px-4 py-2 border-b">
 | 
					                  <td className="px-4 py-2 border-b">{item.error}</td>
 | 
				
			||||||
                    {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>
 | 
					                  <td className="px-4 py-2 border-b">{formatDate(item.created_at)}</td>
 | 
				
			||||||
                </tr>
 | 
					                </tr>
 | 
				
			||||||
              ))}
 | 
					              ))}
 | 
				
			||||||
@@ -259,26 +174,25 @@ const DataFetcher: React.FC = () => {
 | 
				
			|||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div className="mt-4 flex justify-between items-center">
 | 
					      <div className="mt-4 flex justify-between items-center">
 | 
				
			||||||
        <button
 | 
					        <button onClick={() => setCurrentPage(prev => Math.max(prev - 1, 1))} disabled={currentPage === 1} className="p-2 border">Previous</button>
 | 
				
			||||||
          onClick={() => setCurrentPage(prev => Math.max(prev - 1, 1))}
 | 
					 | 
				
			||||||
          disabled={currentPage === 1}
 | 
					 | 
				
			||||||
          className="p-2 border"
 | 
					 | 
				
			||||||
        >
 | 
					 | 
				
			||||||
          Previous
 | 
					 | 
				
			||||||
        </button>
 | 
					 | 
				
			||||||
        <span>Page {currentPage}</span>
 | 
					        <span>Page {currentPage}</span>
 | 
				
			||||||
        <button
 | 
					        <button onClick={() => setCurrentPage(prev => prev + 1)} className="p-2 border">Next</button>
 | 
				
			||||||
          onClick={() => setCurrentPage(prev => (prev * itemsPerPage < sortedData.length ? prev + 1 : prev))}
 | 
					        <select
 | 
				
			||||||
          disabled={currentPage * itemsPerPage >= sortedData.length}
 | 
					          value={itemsPerPage}
 | 
				
			||||||
 | 
					          onChange={(e) => setItemsPerPage(Number(e.target.value))}
 | 
				
			||||||
          className="p-2 border"
 | 
					          className="p-2 border"
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          Next
 | 
					          <option value={10}>10</option>
 | 
				
			||||||
        </button>
 | 
					          <option value={20}>20</option>
 | 
				
			||||||
 | 
					          <option value={50}>50</option>
 | 
				
			||||||
 | 
					          <option value={100}>100</option>
 | 
				
			||||||
 | 
					          <option value={250}>250</option>
 | 
				
			||||||
 | 
					          <option value={500}>500</option>
 | 
				
			||||||
 | 
					          <option value={5000}>5000</option>
 | 
				
			||||||
 | 
					        </select>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default DataFetcher;
 | 
					export default DataFetcher;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,7 +111,7 @@ export default function Page() {
 | 
				
			|||||||
									of Proxmox Virtual Environment (VE).
 | 
														of Proxmox Virtual Environment (VE).
 | 
				
			||||||
								</p>
 | 
													</p>
 | 
				
			||||||
								<p>
 | 
													<p>
 | 
				
			||||||
									With 200+ scripts to help you manage your{" "}
 | 
														With 300+ scripts to help you manage your{" "}
 | 
				
			||||||
									<b>Proxmox VE environment</b>. Whether you're a seasoned
 | 
														<b>Proxmox VE environment</b>. Whether you're a seasoned
 | 
				
			||||||
									user or a newcomer, we've got you covered.
 | 
														user or a newcomer, we've got you covered.
 | 
				
			||||||
								</p>
 | 
													</p>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,10 @@ function ScriptItem({
 | 
				
			|||||||
    setSelectedScript(null);
 | 
					    setSelectedScript(null);
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const defaultInstallMethod = item.install_methods?.[0];
 | 
				
			||||||
 | 
					  const os = defaultInstallMethod?.resources?.os || "Proxmox Node";
 | 
				
			||||||
 | 
					  const version = defaultInstallMethod?.resources?.version || "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className="mr-7 mt-0 flex w-full min-w-fit">
 | 
					    <div className="mr-7 mt-0 flex w-full min-w-fit">
 | 
				
			||||||
      <div className="flex w-full min-w-fit">
 | 
					      <div className="flex w-full min-w-fit">
 | 
				
			||||||
@@ -60,6 +64,9 @@ function ScriptItem({
 | 
				
			|||||||
                      <p className="w-full text-sm text-muted-foreground">
 | 
					                      <p className="w-full text-sm text-muted-foreground">
 | 
				
			||||||
                        Date added: {extractDate(item.date_created)}
 | 
					                        Date added: {extractDate(item.date_created)}
 | 
				
			||||||
                      </p>
 | 
					                      </p>
 | 
				
			||||||
 | 
					                      <p className="text-sm text-muted-foreground">
 | 
				
			||||||
 | 
					                        Default OS: {os} {version}
 | 
				
			||||||
 | 
					                      </p>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                    <div className="flex gap-5">
 | 
					                    <div className="flex gap-5">
 | 
				
			||||||
                      <DefaultSettings item={item} />
 | 
					                      <DefaultSettings item={item} />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,23 @@
 | 
				
			|||||||
import { Button } from "@/components/ui/button";
 | 
					import { Button } from "@/components/ui/button";
 | 
				
			||||||
import { basePath } from "@/config/siteConfig";
 | 
					import { basePath } from "@/config/siteConfig";
 | 
				
			||||||
import { Script } from "@/lib/types";
 | 
					import { Script } from "@/lib/types";
 | 
				
			||||||
import { BookOpenText, Code, Globe } from "lucide-react";
 | 
					import { BookOpenText, Code, Globe, RefreshCcw } from "lucide-react";
 | 
				
			||||||
import Link from "next/link";
 | 
					import Link from "next/link";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const generateInstallSourceUrl = (slug: string) => {
 | 
				
			||||||
 | 
					  const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`;
 | 
				
			||||||
 | 
					  return `${baseUrl}/install/${slug}-install.sh`;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const generateSourceUrl = (slug: string, type: string) => {
 | 
					const generateSourceUrl = (slug: string, type: string) => {
 | 
				
			||||||
  const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`;
 | 
					  const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`;
 | 
				
			||||||
  return type === "ct"
 | 
					  return type === "vm" ? `${baseUrl}/vm/${slug}.sh` : `${baseUrl}/misc/${slug}.sh`;
 | 
				
			||||||
    ? `${baseUrl}/install/${slug}-install.sh`
 | 
					  return `${baseUrl}/misc/${slug}.sh`;
 | 
				
			||||||
    : `${baseUrl}/${type}/${slug}.sh`;
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const generateUpdateUrl = (slug: string) => {
 | 
				
			||||||
 | 
					  const baseUrl = `https://raw.githubusercontent.com/community-scripts/${basePath}/main`;
 | 
				
			||||||
 | 
					  return `${baseUrl}/ct/${slug}.sh`;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface ButtonLinkProps {
 | 
					interface ButtonLinkProps {
 | 
				
			||||||
@@ -29,20 +38,35 @@ const ButtonLink = ({ href, icon, text }: ButtonLinkProps) => (
 | 
				
			|||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function Buttons({ item }: { item: Script }) {
 | 
					export default function Buttons({ item }: { item: Script }) {
 | 
				
			||||||
 | 
					  const isCtOrDefault = ["ct"].includes(item.type);
 | 
				
			||||||
 | 
					  const installSourceUrl = isCtOrDefault ? generateInstallSourceUrl(item.slug) : null;
 | 
				
			||||||
 | 
					  const updateSourceUrl = isCtOrDefault ? generateUpdateUrl(item.slug) : null;
 | 
				
			||||||
 | 
					  const sourceUrl = !isCtOrDefault ? generateSourceUrl(item.slug, item.type) : null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const buttons = [
 | 
					  const buttons = [
 | 
				
			||||||
    item.website && {
 | 
					    item.website && {
 | 
				
			||||||
      href: item.website,
 | 
					      href: item.website,
 | 
				
			||||||
      icon: <Globe className="h-4 w-4" />,
 | 
					      icon: <Globe className="h-4 w-4" />, 
 | 
				
			||||||
      text: "Website",
 | 
					      text: "Website",
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    item.documentation && {
 | 
					    item.documentation && {
 | 
				
			||||||
      href: item.documentation,
 | 
					      href: item.documentation,
 | 
				
			||||||
      icon: <BookOpenText className="h-4 w-4" />,
 | 
					      icon: <BookOpenText className="h-4 w-4" />, 
 | 
				
			||||||
      text: "Documentation",
 | 
					      text: "Documentation",
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    installSourceUrl && {
 | 
				
			||||||
      href: generateSourceUrl(item.slug, item.type),
 | 
					      href: installSourceUrl,
 | 
				
			||||||
      icon: <Code className="h-4 w-4" />,
 | 
					      icon: <Code className="h-4 w-4" />, 
 | 
				
			||||||
 | 
					      text: "Install-Source",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    updateSourceUrl && {
 | 
				
			||||||
 | 
					      href: updateSourceUrl,
 | 
				
			||||||
 | 
					      icon: <RefreshCcw className="h-4 w-4" />, 
 | 
				
			||||||
 | 
					      text: "Update-Source",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    sourceUrl && {
 | 
				
			||||||
 | 
					      href: sourceUrl,
 | 
				
			||||||
 | 
					      icon: <Code className="h-4 w-4" />, 
 | 
				
			||||||
      text: "Source Code",
 | 
					      text: "Source Code",
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  ].filter(Boolean) as ButtonLinkProps[];
 | 
					  ].filter(Boolean) as ButtonLinkProps[];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,12 +25,16 @@ import { Chart as ChartJS, ArcElement, Tooltip as ChartTooltip, Legend } from "c
 | 
				
			|||||||
import ChartDataLabels from "chartjs-plugin-datalabels";
 | 
					import ChartDataLabels from "chartjs-plugin-datalabels";
 | 
				
			||||||
import { BarChart3, PieChart } from "lucide-react";
 | 
					import { BarChart3, PieChart } from "lucide-react";
 | 
				
			||||||
import React, { useState } from "react";
 | 
					import React, { useState } from "react";
 | 
				
			||||||
import { Pie } from "react-chartjs-2";
 | 
					import { Pie, Bar } from "react-chartjs-2";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ChartJS.register(ArcElement, ChartTooltip, Legend, ChartDataLabels);
 | 
					ChartJS.register(ArcElement, ChartTooltip, Legend, ChartDataLabels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface SummaryData {
 | 
				
			||||||
 | 
					  nsapp_count: Record<string, number>;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface ApplicationChartProps {
 | 
					interface ApplicationChartProps {
 | 
				
			||||||
  data: { nsapp: string }[];
 | 
					  data: SummaryData | null;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ITEMS_PER_PAGE = 20;
 | 
					const ITEMS_PER_PAGE = 20;
 | 
				
			||||||
@@ -57,13 +61,9 @@ export default function ApplicationChart({ data }: ApplicationChartProps) {
 | 
				
			|||||||
  const [chartStartIndex, setChartStartIndex] = useState(0);
 | 
					  const [chartStartIndex, setChartStartIndex] = useState(0);
 | 
				
			||||||
  const [tableLimit, setTableLimit] = useState(ITEMS_PER_PAGE);
 | 
					  const [tableLimit, setTableLimit] = useState(ITEMS_PER_PAGE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Calculate application counts
 | 
					  if (!data) return null;
 | 
				
			||||||
  const appCounts = data.reduce((acc, item) => {
 | 
					 | 
				
			||||||
    acc[item.nsapp] = (acc[item.nsapp] || 0) + 1;
 | 
					 | 
				
			||||||
    return acc;
 | 
					 | 
				
			||||||
  }, {} as Record<string, number>);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const sortedApps = Object.entries(appCounts)
 | 
					  const sortedApps = Object.entries(data.nsapp_count)
 | 
				
			||||||
    .sort(([, a], [, b]) => b - a);
 | 
					    .sort(([, a], [, b]) => b - a);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const chartApps = sortedApps.slice(
 | 
					  const chartApps = sortedApps.slice(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,10 +37,6 @@ export default function CodeCopyButton({
 | 
				
			|||||||
        );
 | 
					        );
 | 
				
			||||||
      }, 500);
 | 
					      }, 500);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    // toast.success(`copied ${type} to clipboard`, {
 | 
					 | 
				
			||||||
    //   icon: <ClipboardCheck className="h-4 w-4" />,
 | 
					 | 
				
			||||||
    // });
 | 
					 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
@@ -49,17 +45,17 @@ export default function CodeCopyButton({
 | 
				
			|||||||
        <div className="overflow-x-auto whitespace-pre-wrap text-nowrap break-all pr-4 text-sm">
 | 
					        <div className="overflow-x-auto whitespace-pre-wrap text-nowrap break-all pr-4 text-sm">
 | 
				
			||||||
          {!isMobile && children ? children : "Copy install command"}
 | 
					          {!isMobile && children ? children : "Copy install command"}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div
 | 
					        <button
 | 
				
			||||||
          className={cn(" right-0 cursor-pointer bg-muted px-3 py-4")}
 | 
					 | 
				
			||||||
          onClick={() => handleCopy("install command", children)}
 | 
					          onClick={() => handleCopy("install command", children)}
 | 
				
			||||||
 | 
					          className={cn("bg-muted px-3 py-4")}
 | 
				
			||||||
 | 
					          title="Copy"
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          {hasCopied ? (
 | 
					          {hasCopied ? (
 | 
				
			||||||
            <CheckIcon className="h-4 w-4" />
 | 
					            <CheckIcon className="h-4 w-4" />
 | 
				
			||||||
          ) : (
 | 
					          ) : (
 | 
				
			||||||
            <ClipboardIcon className="h-4 w-4" />
 | 
					            <ClipboardIcon className="h-4 w-4" />
 | 
				
			||||||
          )}
 | 
					          )}
 | 
				
			||||||
          <span className="sr-only">Copy</span>
 | 
					        </button>
 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
      </Card>
 | 
					      </Card>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
# Author: jkrgr0
 | 
					# Author: jkrgr0
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# Source: https://docs.2fauth.app/
 | 
					# Source: https://docs.2fauth.app/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Import Functions und Setup
 | 
					 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
verb_ip6
 | 
					verb_ip6
 | 
				
			||||||
@@ -14,7 +13,6 @@ setting_up_container
 | 
				
			|||||||
network_check
 | 
					network_check
 | 
				
			||||||
update_os
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Installing Dependencies with the 3 core dependencies (curl;sudo;mc)
 | 
					 | 
				
			||||||
msg_info "Installing Dependencies"
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
$STD apt-get install -y \
 | 
					$STD apt-get install -y \
 | 
				
			||||||
  curl \
 | 
					  curl \
 | 
				
			||||||
@@ -26,7 +24,6 @@ $STD apt-get install -y \
 | 
				
			|||||||
  mariadb-server
 | 
					  mariadb-server
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Template: MySQL Database
 | 
					 | 
				
			||||||
msg_info "Setting up Database"
 | 
					msg_info "Setting up Database"
 | 
				
			||||||
DB_NAME=2fauth_db
 | 
					DB_NAME=2fauth_db
 | 
				
			||||||
DB_USER=2fauth
 | 
					DB_USER=2fauth
 | 
				
			||||||
@@ -42,7 +39,6 @@ $STD mysql -u root -e "GRANT ALL ON $DB_NAME.* TO '$DB_USER'@'localhost'; FLUSH
 | 
				
			|||||||
} >> ~/2FAuth.creds
 | 
					} >> ~/2FAuth.creds
 | 
				
			||||||
msg_ok "Set up Database"
 | 
					msg_ok "Set up Database"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Setup App
 | 
					 | 
				
			||||||
msg_info "Setup 2FAuth"
 | 
					msg_info "Setup 2FAuth"
 | 
				
			||||||
RELEASE=$(curl -s https://api.github.com/repos/Bubka/2FAuth/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					RELEASE=$(curl -s https://api.github.com/repos/Bubka/2FAuth/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
wget -q "https://github.com/Bubka/2FAuth/archive/refs/tags/${RELEASE}.zip"
 | 
					wget -q "https://github.com/Bubka/2FAuth/archive/refs/tags/${RELEASE}.zip"
 | 
				
			||||||
@@ -78,7 +74,6 @@ chmod -R 755 /opt/2fauth
 | 
				
			|||||||
echo "${RELEASE}" >"/opt/2fauth_version.txt"
 | 
					echo "${RELEASE}" >"/opt/2fauth_version.txt"
 | 
				
			||||||
msg_ok "Setup 2fauth"
 | 
					msg_ok "Setup 2fauth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Configure Service (NGINX)
 | 
					 | 
				
			||||||
msg_info "Configure Service"
 | 
					msg_info "Configure Service"
 | 
				
			||||||
cat <<EOF >/etc/nginx/conf.d/2fauth.conf
 | 
					cat <<EOF >/etc/nginx/conf.d/2fauth.conf
 | 
				
			||||||
server {
 | 
					server {
 | 
				
			||||||
@@ -115,7 +110,6 @@ msg_ok "Configured Service"
 | 
				
			|||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Cleanup
 | 
					 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
rm -f "/opt/v${RELEASE}.zip"
 | 
					rm -f "/opt/v${RELEASE}.zip"
 | 
				
			||||||
$STD apt-get -y autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,9 +38,9 @@ msg_ok "Installed Node.js"
 | 
				
			|||||||
msg_info "Installing Actual Budget"
 | 
					msg_info "Installing Actual Budget"
 | 
				
			||||||
cd /opt
 | 
					cd /opt
 | 
				
			||||||
RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
wget -q https://github.com/actualbudget/actual-server/archive/refs/tags/v${RELEASE}.tar.gz
 | 
					wget -q https://github.com/actualbudget/actual/archive/refs/tags/v${RELEASE}.tar.gz
 | 
				
			||||||
tar -xzf v${RELEASE}.tar.gz
 | 
					tar -xzf v${RELEASE}.tar.gz
 | 
				
			||||||
mv *ctual-server-* /opt/actualbudget
 | 
					mv actual-${RELEASE} /opt/actualbudget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
 | 
					mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
 | 
				
			||||||
chown -R root:root /opt/actualbudget-data
 | 
					chown -R root:root /opt/actualbudget-data
 | 
				
			||||||
@@ -57,7 +57,7 @@ ACTUAL_HTTPS_KEY=/opt/actualbudget/selfhost.key
 | 
				
			|||||||
ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt
 | 
					ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
cd /opt/actualbudget
 | 
					cd /opt/actualbudget
 | 
				
			||||||
$STD yarn install
 | 
					$STD yarn workspaces focus @actual-app/sync-server --production
 | 
				
			||||||
$STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF
 | 
					$STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF
 | 
				
			||||||
US
 | 
					US
 | 
				
			||||||
California
 | 
					California
 | 
				
			||||||
@@ -82,14 +82,14 @@ User=root
 | 
				
			|||||||
Group=root
 | 
					Group=root
 | 
				
			||||||
WorkingDirectory=/opt/actualbudget
 | 
					WorkingDirectory=/opt/actualbudget
 | 
				
			||||||
EnvironmentFile=/opt/actualbudget-data/.env
 | 
					EnvironmentFile=/opt/actualbudget-data/.env
 | 
				
			||||||
ExecStart=/usr/bin/yarn start
 | 
					ExecStart=/usr/bin/yarn start:server
 | 
				
			||||||
Restart=always
 | 
					Restart=always
 | 
				
			||||||
RestartSec=10
 | 
					RestartSec=10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
systemctl enable -q --now actualbudget.service
 | 
					systemctl enable -q --now actualbudget
 | 
				
			||||||
msg_ok "Created Service"
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://adguard.com/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,7 @@
 | 
				
			|||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck
 | 
					# Author: tteck
 | 
				
			||||||
# Co-Author: MickLesk (Canbiz)
 | 
					# Co-Author: MickLesk (Canbiz)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					 | 
				
			||||||
# Source: https://github.com/seanmorley15/AdventureLog
 | 
					# Source: https://github.com/seanmorley15/AdventureLog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://www.ispyconnect.com/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://www.docker.com/
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
verb_ip6
 | 
					verb_ip6
 | 
				
			||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://grafana.com/
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
verb_ip6
 | 
					verb_ip6
 | 
				
			||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://alpinelinux.org/
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
verb_ip6
 | 
					verb_ip6
 | 
				
			||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@
 | 
				
			|||||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
# Author: nicedevil007 (NiceDevil)
 | 
					# Author: nicedevil007 (NiceDevil)
 | 
				
			||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://it-tools.tech/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://nextcloud.com/
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
verb_ip6
 | 
					verb_ip6
 | 
				
			||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://github.com/dani-garcia/vaultwarden
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
verb_ip6
 | 
					verb_ip6
 | 
				
			||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,10 +2,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://www.zigbee2mqtt.io/
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
verb_ip6
 | 
					verb_ip6
 | 
				
			||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://cassandra.apache.org/_/index.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster)
 | 
				
			||||||
# License: MIT
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# Source: https://couchdb.apache.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
					source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
color
 | 
					color
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user