mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	Compare commits
	
		
			182 Commits
		
	
	
		
			2025-02-04
			...
			2025-02-11
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					ecc294953b | ||
| 
						 | 
					e9d8b30de0 | ||
| 
						 | 
					4a42012906 | ||
| 
						 | 
					37016259e1 | ||
| 
						 | 
					bf5fc97e1a | ||
| 
						 | 
					1c89ef3f12 | ||
| 
						 | 
					b2d022edff | ||
| 
						 | 
					a5a143111c | ||
| 
						 | 
					9338fdeebf | ||
| 
						 | 
					6a486d4d73 | ||
| 
						 | 
					e55db3cb75 | ||
| 
						 | 
					b39078af7e | ||
| 
						 | 
					8e8e631d22 | ||
| 
						 | 
					a34da2459d | ||
| 
						 | 
					81a64c2cff | ||
| 
						 | 
					414a6617f8 | ||
| 
						 | 
					4af819f449 | ||
| 
						 | 
					229016ca10 | ||
| 
						 | 
					51f3f97967 | ||
| 
						 | 
					c548c3bd88 | ||
| 
						 | 
					0877e6a2f2 | ||
| 
						 | 
					133aa1a1f2 | ||
| 
						 | 
					c32e71cae3 | ||
| 
						 | 
					a71bdb6f06 | ||
| 
						 | 
					f6bc82e77a | ||
| 
						 | 
					5736b6aa5c | ||
| 
						 | 
					c30b080e44 | ||
| 
						 | 
					61567a66b0 | ||
| 
						 | 
					e23137eb63 | ||
| 
						 | 
					8acf81b937 | ||
| 
						 | 
					f1683ad39f | ||
| 
						 | 
					33ee969d91 | ||
| 
						 | 
					f03471133e | ||
| 
						 | 
					cdbabcac89 | ||
| 
						 | 
					0122e70b1d | ||
| 
						 | 
					a4037c151e | ||
| 
						 | 
					5d58d6d14f | ||
| 
						 | 
					8a1446ac4e | ||
| 
						 | 
					1ce3929d66 | ||
| 
						 | 
					dd62089b61 | ||
| 
						 | 
					8cda7e4dd8 | ||
| 
						 | 
					bc3abdfe91 | ||
| 
						 | 
					e793dfff3a | ||
| 
						 | 
					12ec0b46bc | ||
| 
						 | 
					55fa65e168 | ||
| 
						 | 
					6de6216bc6 | ||
| 
						 | 
					1bca424acf | ||
| 
						 | 
					a51e688388 | ||
| 
						 | 
					c40fc2b159 | ||
| 
						 | 
					d859646dac | ||
| 
						 | 
					a0e0f28c66 | ||
| 
						 | 
					8595675531 | ||
| 
						 | 
					70435b9e5a | ||
| 
						 | 
					1731f5274b | ||
| 
						 | 
					6a775f6026 | ||
| 
						 | 
					0b3e63bd3f | ||
| 
						 | 
					514ff1fbe7 | ||
| 
						 | 
					85bf9f319b | ||
| 
						 | 
					dff4e735f0 | ||
| 
						 | 
					b81b9c574b | ||
| 
						 | 
					f82eb87476 | ||
| 
						 | 
					d47bd677da | ||
| 
						 | 
					2c32b7fa94 | ||
| 
						 | 
					4d996c95e0 | ||
| 
						 | 
					90473b7b10 | ||
| 
						 | 
					e4f756ce73 | ||
| 
						 | 
					10159e934f | ||
| 
						 | 
					865e6fd3d7 | ||
| 
						 | 
					a1dd57ded6 | ||
| 
						 | 
					1c808b95a8 | ||
| 
						 | 
					0c024515f1 | ||
| 
						 | 
					4c7d82f4eb | ||
| 
						 | 
					e4ee00b403 | ||
| 
						 | 
					d380fdd0ea | ||
| 
						 | 
					9756ac639b | ||
| 
						 | 
					7105f67145 | ||
| 
						 | 
					35547c4316 | ||
| 
						 | 
					ccc71a7225 | ||
| 
						 | 
					c5101d3358 | ||
| 
						 | 
					5bbf197a8d | ||
| 
						 | 
					70b5c62c9f | ||
| 
						 | 
					33ef8aadbe | ||
| 
						 | 
					e989bbba29 | ||
| 
						 | 
					3f35900914 | ||
| 
						 | 
					e5f738b567 | ||
| 
						 | 
					6fc357ecd0 | ||
| 
						 | 
					758659a91e | ||
| 
						 | 
					b05858c6e9 | ||
| 
						 | 
					a481e89cad | ||
| 
						 | 
					b9094e306e | ||
| 
						 | 
					31c8617258 | ||
| 
						 | 
					f94d727af7 | ||
| 
						 | 
					054829c4d5 | ||
| 
						 | 
					d20c92bd4f | ||
| 
						 | 
					64b9fa090a | ||
| 
						 | 
					5abc84b776 | ||
| 
						 | 
					2b0666bcf8 | ||
| 
						 | 
					2ef6ac2fe4 | ||
| 
						 | 
					4bb887a390 | ||
| 
						 | 
					8fd8ca2c50 | ||
| 
						 | 
					f69d5b5831 | ||
| 
						 | 
					fead4b76f8 | ||
| 
						 | 
					800c1065b9 | ||
| 
						 | 
					782e0a8535 | ||
| 
						 | 
					5863d81571 | ||
| 
						 | 
					c15e34143f | ||
| 
						 | 
					57c3a42a6e | ||
| 
						 | 
					7c13a7bce0 | ||
| 
						 | 
					9c23b55bc0 | ||
| 
						 | 
					5c0811c5ba | ||
| 
						 | 
					6bc92a0feb | ||
| 
						 | 
					9f5f5f54a0 | ||
| 
						 | 
					047ef8e669 | ||
| 
						 | 
					be572755a9 | ||
| 
						 | 
					393e1c6481 | ||
| 
						 | 
					539696e84a | ||
| 
						 | 
					6ecfc10b8c | ||
| 
						 | 
					1c7bab33e6 | ||
| 
						 | 
					b0cdb308bd | ||
| 
						 | 
					9d61a37945 | ||
| 
						 | 
					c4bd38cb9e | ||
| 
						 | 
					2f37355d77 | ||
| 
						 | 
					59a132fd6b | ||
| 
						 | 
					9c3bd7dc20 | ||
| 
						 | 
					d73d312882 | ||
| 
						 | 
					3361fabfc4 | ||
| 
						 | 
					030682c754 | ||
| 
						 | 
					3029e69767 | ||
| 
						 | 
					7dcc717017 | ||
| 
						 | 
					9825506ab7 | ||
| 
						 | 
					f1eca8a4bf | ||
| 
						 | 
					199d304841 | ||
| 
						 | 
					4163526379 | ||
| 
						 | 
					9272a1181c | ||
| 
						 | 
					2e51c289ca | ||
| 
						 | 
					03828943b0 | ||
| 
						 | 
					d71ef779ec | ||
| 
						 | 
					9736d5c785 | ||
| 
						 | 
					ef33864adf | ||
| 
						 | 
					d7b6a97415 | ||
| 
						 | 
					5b4c417729 | ||
| 
						 | 
					9c4e9ed4be | ||
| 
						 | 
					5a25348e04 | ||
| 
						 | 
					f5a73a5449 | ||
| 
						 | 
					82fecd7bbd | ||
| 
						 | 
					9badef6f03 | ||
| 
						 | 
					0e2f711cac | ||
| 
						 | 
					fbec881f70 | ||
| 
						 | 
					a3f1ff30e0 | ||
| 
						 | 
					4eb93ea49b | ||
| 
						 | 
					7d8ecead7d | ||
| 
						 | 
					5cf1f880c6 | ||
| 
						 | 
					873ae3e8af | ||
| 
						 | 
					4a273c7134 | ||
| 
						 | 
					439a7ed9e8 | ||
| 
						 | 
					d941af4cf2 | ||
| 
						 | 
					cb79d7baab | ||
| 
						 | 
					fbe2fb10af | ||
| 
						 | 
					1a00ba109b | ||
| 
						 | 
					88ee57cf15 | ||
| 
						 | 
					857964653c | ||
| 
						 | 
					682674727c | ||
| 
						 | 
					5451e61484 | ||
| 
						 | 
					778b6be4e0 | ||
| 
						 | 
					c52c6ec3a3 | ||
| 
						 | 
					34837c7777 | ||
| 
						 | 
					f98124a57f | ||
| 
						 | 
					7838dd6277 | ||
| 
						 | 
					a6f656eacf | ||
| 
						 | 
					43646a8e19 | ||
| 
						 | 
					8b52639d23 | ||
| 
						 | 
					8afb439ed7 | ||
| 
						 | 
					42b175144a | ||
| 
						 | 
					cb6e2c4455 | ||
| 
						 | 
					8662be2e4e | ||
| 
						 | 
					f66f43d91a | ||
| 
						 | 
					c112edd8ac | ||
| 
						 | 
					398bae1f64 | ||
| 
						 | 
					7c2a6822b5 | ||
| 
						 | 
					3a33e006d4 | ||
| 
						 | 
					3aedafbfc6 | ||
| 
						 | 
					4587352377 | 
							
								
								
									
										10
									
								
								.github/CONTRIBUTOR_GUIDE/ct/AppName.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/CONTRIBUTOR_GUIDE/ct/AppName.md
									
									
									
									
										vendored
									
									
								
							@@ -171,7 +171,7 @@ if [[ ! -d /opt/snipe-it ]]; then
 | 
			
		||||
 | 
			
		||||
### 3.3 **Check version**
 | 
			
		||||
 | 
			
		||||
- Befoer updating, check if a new version exists.
 | 
			
		||||
- Before updating, check if a new version exists.
 | 
			
		||||
  - We use the `${APPLICATION}_version.txt` file created in `/opt` during the install to compare new versions against the currently installed version.
 | 
			
		||||
 | 
			
		||||
Example with a Github Release:
 | 
			
		||||
@@ -241,7 +241,7 @@ Example:
 | 
			
		||||
 | 
			
		||||
### 3.7 **No update function**
 | 
			
		||||
 | 
			
		||||
- In case you can not provide a update function use the following code to provide user feedback.
 | 
			
		||||
- In case you can not provide an update function use the following code to provide user feedback.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
function update_script() {
 | 
			
		||||
@@ -252,7 +252,7 @@ function update_script() {
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_error "Ther is currently no automatic update function for ${APP}."
 | 
			
		||||
    msg_error "There is currently no automatic update function for ${APP}."
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
@@ -286,6 +286,6 @@ echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
			
		||||
- [ ] Metadata (author, license) is included at the top.
 | 
			
		||||
- [ ] Variables follow naming conventions.
 | 
			
		||||
- [ ] Update function exists.
 | 
			
		||||
- [ ] Update functions checks if app is installed an for new version.
 | 
			
		||||
- [ ] Update function up temporary files.
 | 
			
		||||
- [ ] Update functions checks if app is installed and for new version.
 | 
			
		||||
- [ ] Update function cleans up temporary files.
 | 
			
		||||
- [ ] Script ends with a helpful message for the user to reach the application.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								.github/CONTRIBUTOR_GUIDE/ct/AppName.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/CONTRIBUTOR_GUIDE/ct/AppName.sh
									
									
									
									
										vendored
									
									
								
							@@ -66,7 +66,6 @@ function update_script() {
 | 
			
		||||
        # Starting Services
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start [SERVICE_NAME]
 | 
			
		||||
        sleep 2
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        # Cleaning up
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,4 @@ msg_info "Cleaning up"
 | 
			
		||||
rm -f ${RELEASE}.zip
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/CONTRIBUTOR_GUIDE/json/AppName.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/CONTRIBUTOR_GUIDE/json/AppName.json
									
									
									
									
										vendored
									
									
								
							@@ -12,7 +12,7 @@
 | 
			
		||||
    "documentation": null,
 | 
			
		||||
    "website": "LINK TO WEBSITE",
 | 
			
		||||
    "logo": "LINK TO LOGO",
 | 
			
		||||
    "description": "Deescription of the app",
 | 
			
		||||
    "description": "Description of the app",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,6 @@ body:
 | 
			
		||||
        required: true
 | 
			
		||||
      - label: "I have searched existing [discussions](https://github.com/community-scripts/ProxmoxVE/discussions?discussions_q=) and found no duplicate requests."
 | 
			
		||||
        required: true
 | 
			
		||||
      - label: "This is not a game-related request."
 | 
			
		||||
        required: true
 | 
			
		||||
- type: markdown
 | 
			
		||||
  attributes:
 | 
			
		||||
    value: "Thanks for submitting your request! The team will review it and reach out if we need more information."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								.github/autolabeler-config.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/autolabeler-config.json
									
									
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": "modified",
 | 
			
		||||
      "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"],
 | 
			
		||||
      "excludeGlobs": ["misc/build.func", "misc/install.func"]
 | 
			
		||||
      "excludeGlobs": ["misc/build.func", "misc/install.func", "misc/api.func"]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "delete script": [
 | 
			
		||||
@@ -51,13 +51,20 @@
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["*.md", ".github/**", "misc/*.func", "ct/create_lxc.sh"],
 | 
			
		||||
      "excludeGlobs": ["misc/api.func"]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
   "api": [
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["api/**", "misc/api.func"],
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "high risk": [
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["misc/build.func", "misc/install.func"],
 | 
			
		||||
      "includeGlobs": ["misc/build.func", "misc/install.func", "ct/create_lxc.sh"],
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								.github/changelog-pr-config.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								.github/changelog-pr-config.json
									
									
									
									
										vendored
									
									
								
							@@ -1,30 +1,34 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "title": "💥 Breaking Changes",
 | 
			
		||||
        "labels": ["breaking change"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "✨ New Scripts",
 | 
			
		||||
        "labels": ["new script"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🚀 Updated Scripts",
 | 
			
		||||
        "labels": ["update script"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🌐 Website",
 | 
			
		||||
        "labels": ["website"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🐞 Bug Fixes",
 | 
			
		||||
        "labels": ["bug fix"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🧰 Maintenance",
 | 
			
		||||
        "labels": ["maintenance"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "❔ Unlabelled",
 | 
			
		||||
        "labels": []
 | 
			
		||||
    }
 | 
			
		||||
  {
 | 
			
		||||
      "title": "💥 Breaking Changes",
 | 
			
		||||
      "labels": ["breaking change"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "✨ New Scripts",
 | 
			
		||||
      "labels": ["new script"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🚀 Updated Scripts",
 | 
			
		||||
      "labels": ["update script"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🌐 Website",
 | 
			
		||||
      "labels": ["website"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🐞 Bug Fixes",
 | 
			
		||||
      "labels": ["bug fix"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🧰 Maintenance",
 | 
			
		||||
      "labels": ["maintenance"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "📡 API",
 | 
			
		||||
      "labels": ["api"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "❔ Unlabelled",
 | 
			
		||||
      "labels": []
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							@@ -1,28 +1,25 @@
 | 
			
		||||
## ✍️ Description
 | 
			
		||||
## ✍️ Description  
 | 
			
		||||
<!-- Provide a clear and concise description of your changes. -->  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
- - -
 | 
			
		||||
- Related Issue: #
 | 
			
		||||
- Related PR: #
 | 
			
		||||
- Related Discussion: #
 | 
			
		||||
- - - 
 | 
			
		||||
## 🔗 Related PR / Discussion / Issue  
 | 
			
		||||
Link: #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## ✅ Prerequisites
 | 
			
		||||
The following steps must be completed for the pull request to be considered:  
 | 
			
		||||
- [] Self-review performed (I have reviewed my code to ensure it follows established patterns and conventions.)  
 | 
			
		||||
- [] Testing performed (I have thoroughly tested my changes and verified expected functionality.)
 | 
			
		||||
 | 
			
		||||
## 🛠️ Type of Change
 | 
			
		||||
Please check the relevant options:  
 | 
			
		||||
- [] Bug fix (non-breaking change that resolves an issue)  
 | 
			
		||||
- [] New feature (non-breaking change that adds functionality)  
 | 
			
		||||
- [] Breaking change (fix or feature that would cause existing functionality to change unexpectedly)  
 | 
			
		||||
- [] New script (a fully functional and thoroughly tested script or set of scripts)  
 | 
			
		||||
## ✅ Prerequisites  
 | 
			
		||||
Before this PR can be reviewed, the following must be completed:  
 | 
			
		||||
- [] **Self-review performed** – Code follows established patterns and conventions.  
 | 
			
		||||
- [] **Testing performed** – Changes have been thoroughly tested and verified.  
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
## 📋 Additional Information (optional)
 | 
			
		||||
Provide any extra context or screenshots about the feature or fix here.  
 | 
			
		||||
 | 
			
		||||
## 🛠️ Type of Change  
 | 
			
		||||
Select all that apply:  
 | 
			
		||||
- [] 🐞 **Bug fix** – Resolves an issue without breaking functionality.  
 | 
			
		||||
- [] ✨ **New feature** – Adds new, non-breaking functionality.  
 | 
			
		||||
- [] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.  
 | 
			
		||||
- [] 🆕 **New script** – A fully functional and tested script or script set.  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 📋 Additional Information (optional)  
 | 
			
		||||
<!-- Provide extra context, screenshots, or references if needed. -->  
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								.github/workflows/auto-update-app-headers.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								.github/workflows/auto-update-app-headers.yml
									
									
									
									
										vendored
									
									
								
							@@ -17,6 +17,13 @@ jobs:
 | 
			
		||||
      pull-requests: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Generate a token
 | 
			
		||||
        id: generate-token
 | 
			
		||||
        uses: actions/create-github-app-token@v1
 | 
			
		||||
        with:
 | 
			
		||||
          app-id: ${{ vars.APP_ID }}
 | 
			
		||||
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
      # Step 1: Checkout repository
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v2
 | 
			
		||||
@@ -70,8 +77,28 @@ jobs:
 | 
			
		||||
                       --head pr-update-app-files \
 | 
			
		||||
                       --base main \
 | 
			
		||||
                       --label "automated pr"
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
      
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number')
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
          
 | 
			
		||||
      - name: Re-approve pull request after update
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number')
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      # Step 8: Output success message when no changes
 | 
			
		||||
      - name: No changes detected
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							@@ -30,15 +30,15 @@ jobs:
 | 
			
		||||
 | 
			
		||||
      - name: Get latest dates in changelog
 | 
			
		||||
        run: |
 | 
			
		||||
          # Extract the latest and second latest dates from changelog
 | 
			
		||||
          DATES=$(grep '^## [0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}' CHANGELOG.md | head -n 2 | awk '{print $2}')
 | 
			
		||||
          # Extrahiere die neuesten zwei Daten aus dem Changelog
 | 
			
		||||
          DATES=$(grep -E '^## [0-9]{4}-[0-9]{2}-[0-9]{2}' CHANGELOG.md | head -n 2 | awk '{print $2}')
 | 
			
		||||
 | 
			
		||||
          LATEST_DATE=$(echo "$DATES" | sed -n '1p')
 | 
			
		||||
          SECOND_LATEST_DATE=$(echo "$DATES" | sed -n '2p')
 | 
			
		||||
          TODAY=$(date -u +%Y-%m-%d)
 | 
			
		||||
 | 
			
		||||
          echo "TODAY=$TODAY" >> $GITHUB_ENV
 | 
			
		||||
          if [ "$LATEST_DATE" == "$TODAY" ]; then
 | 
			
		||||
          if [[ "$LATEST_DATE" == "$TODAY" ]]; then
 | 
			
		||||
            echo "LATEST_DATE=$SECOND_LATEST_DATE" >> $GITHUB_ENV
 | 
			
		||||
          else
 | 
			
		||||
            echo "LATEST_DATE=$LATEST_DATE" >> $GITHUB_ENV
 | 
			
		||||
@@ -55,10 +55,10 @@ jobs:
 | 
			
		||||
            const configPath = path.resolve(process.env.CONFIG_PATH);
 | 
			
		||||
            const fileContent = await fs.readFile(configPath, 'utf-8');
 | 
			
		||||
            const changelogConfig = JSON.parse(fileContent);
 | 
			
		||||
            const categorizedPRs = changelogConfig.map((obj) => ({ ...obj, notes: [] }));
 | 
			
		||||
            const categorizedPRs = changelogConfig.map(obj => ({ ...obj, notes: [] }));
 | 
			
		||||
 | 
			
		||||
            const latestDateInChangelog = new Date(process.env.LATEST_DATE);
 | 
			
		||||
            latestDateInChangelog.setUTCHours(23,59,59,999);
 | 
			
		||||
            latestDateInChangelog.setUTCHours(23, 59, 59, 999);
 | 
			
		||||
 | 
			
		||||
            const { data: pulls } = await github.rest.pulls.list({
 | 
			
		||||
              owner: context.repo.owner,
 | 
			
		||||
@@ -70,18 +70,16 @@ jobs:
 | 
			
		||||
              per_page: 100,
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            pulls.filter((pr) => 
 | 
			
		||||
            pulls.filter(pr => 
 | 
			
		||||
              pr.merged_at && 
 | 
			
		||||
              new Date(pr.merged_at) > latestDateInChangelog && 
 | 
			
		||||
              !pr.labels.some((label) => ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()))
 | 
			
		||||
            ).forEach((pr) => {
 | 
			
		||||
              const prLabels = pr.labels.map((label) => label.name.toLowerCase());
 | 
			
		||||
              !pr.labels.some(label => ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()))
 | 
			
		||||
            ).forEach(pr => {
 | 
			
		||||
              const prLabels = pr.labels.map(label => label.name.toLowerCase());
 | 
			
		||||
              const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
 | 
			
		||||
              for (const { labels, notes } of categorizedPRs) {
 | 
			
		||||
                const prHasCategoryLabel = labels.some((label) => prLabels.includes(label));
 | 
			
		||||
                const isUnlabelledCategory = labels.length === 0;
 | 
			
		||||
                if (prHasCategoryLabel || isUnlabelledCategory) {
 | 
			
		||||
                if (labels.length === 0 || labels.some(label => prLabels.includes(label))) {
 | 
			
		||||
                  notes.push(prNote);
 | 
			
		||||
                  break;
 | 
			
		||||
                }
 | 
			
		||||
@@ -102,7 +100,7 @@ jobs:
 | 
			
		||||
            const changelogPath = path.resolve('CHANGELOG.md');
 | 
			
		||||
            const categorizedPRs = ${{ steps.get-categorized-prs.outputs.result }};
 | 
			
		||||
 | 
			
		||||
            let newReleaseNotes = `## ${today}\n\n### Changed\n\n`;
 | 
			
		||||
            let newReleaseNotes = `## ${today}\n\n### Changes\n\n`;
 | 
			
		||||
            for (const { title, notes } of categorizedPRs) {
 | 
			
		||||
              if (notes.length > 0) {
 | 
			
		||||
                newReleaseNotes += `### ${title}\n\n${notes.join("\n")}\n\n`;
 | 
			
		||||
@@ -112,21 +110,21 @@ jobs:
 | 
			
		||||
            const changelogContent = await fs.readFile(changelogPath, 'utf-8');
 | 
			
		||||
            const changelogIncludesTodaysReleaseNotes = changelogContent.includes(`\n## ${today}`);
 | 
			
		||||
 | 
			
		||||
            // Replace todays release notes or insert release notes above previous release notes
 | 
			
		||||
            const regex = changelogIncludesTodaysReleaseNotes ? 
 | 
			
		||||
              new RegExp(`## ${today}.*(?=## ${latestDateInChangelog})`, "gs") :
 | 
			
		||||
              new RegExp(`(?=## ${latestDateInChangelog})`, "gs");
 | 
			
		||||
            // Ersetze oder füge Release Notes ein
 | 
			
		||||
            const regex = changelogIncludesTodaysReleaseNotes 
 | 
			
		||||
              ? new RegExp(`## ${today}.*(?=## ${latestDateInChangelog})`, "gs") 
 | 
			
		||||
              : new RegExp(`(?=## ${latestDateInChangelog})`, "gs");
 | 
			
		||||
 | 
			
		||||
            const newChangelogContent = changelogContent.replace(regex, newReleaseNotes)
 | 
			
		||||
            const newChangelogContent = changelogContent.replace(regex, newReleaseNotes);
 | 
			
		||||
            await fs.writeFile(changelogPath, newChangelogContent);
 | 
			
		||||
 | 
			
		||||
      - name: Check if there are any changes
 | 
			
		||||
      - name: Check for changes
 | 
			
		||||
        id: verify-diff
 | 
			
		||||
        run: |
 | 
			
		||||
          git diff --quiet . || echo "changed=true" >> $GITHUB_OUTPUT
 | 
			
		||||
          git diff --quiet . || echo "changed=true" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
      - name: Commit and push changes to separate branch
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
      - name: Commit and push changes
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global user.name "github-actions[bot]"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
@@ -136,7 +134,7 @@ jobs:
 | 
			
		||||
          git push origin $BRANCH_NAME --force
 | 
			
		||||
 | 
			
		||||
      - name: Create pull request if not exists
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -150,7 +148,7 @@ jobs:
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -158,9 +156,9 @@ jobs:
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
      - name: Re-approve pull request after update
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										139
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
			
		||||
name: Run Scripts on PVE Node
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    branches:
 | 
			
		||||
      - main
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'install/*.sh'
 | 
			
		||||
      - 'ct/*.sh'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  run-install-script:
 | 
			
		||||
    runs-on: pvenode
 | 
			
		||||
    steps:          
 | 
			
		||||
      - name: Checkout PR branch
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          ref: ${{ github.event.pull_request.head.ref }}
 | 
			
		||||
          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 in PR
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        run: | 
 | 
			
		||||
          CHANGED_FILES=$(gh pr diff --name-only ${{ github.event.pull_request.number }})  
 | 
			
		||||
          CHANGED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')  
 | 
			
		||||
          echo "Changed files: $CHANGED_FILES"  
 | 
			
		||||
          echo "SCRIPT=$CHANGED_FILES" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
      - name: Get scripts
 | 
			
		||||
        id: check-install-script
 | 
			
		||||
        run: |
 | 
			
		||||
          ALL_FILES=()
 | 
			
		||||
          ADDED_FILES=()  
 | 
			
		||||
          for FILE in ${{ env.SCRIPT }}; do           
 | 
			
		||||
            if [[ $FILE =~ ^install/.*-install\.sh$ ]] || [[ $FILE =~ ^ct/.*\.sh$ ]]; then             
 | 
			
		||||
              STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
              if [[ ! " ${ADDED_FILES[@]} " =~ " $STRIPPED_NAME " ]]; then
 | 
			
		||||
                ALL_FILES+=("$FILE")
 | 
			
		||||
                ADDED_FILES+=("$STRIPPED_NAME")  # Mark this base file as added (without the path)
 | 
			
		||||
              fi
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          ALL_FILES=$(echo "${ALL_FILES[@]}" | xargs)
 | 
			
		||||
          echo "$ALL_FILES"
 | 
			
		||||
          echo "ALL_FILES=$ALL_FILES" >> $GITHUB_ENV
 | 
			
		||||
        
 | 
			
		||||
      - name: Run scripts
 | 
			
		||||
        id: run-install
 | 
			
		||||
        continue-on-error: true
 | 
			
		||||
        run: |
 | 
			
		||||
          set +e  
 | 
			
		||||
          #run for each files in /ct
 | 
			
		||||
          for FILE in ${{ env.ALL_FILES }}; do            
 | 
			
		||||
            echo "Running: $FILE"
 | 
			
		||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
            if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
 | 
			
		||||
              CT_SCRIPT="ct/$STRIPPED_NAME.sh"
 | 
			
		||||
              if [[ ! -f $CT_SCRIPT ]]; then
 | 
			
		||||
                echo "No CT script found for $STRIPPED_NAME"
 | 
			
		||||
                exit 1
 | 
			
		||||
              fi
 | 
			
		||||
                echo "Found CT script for $STRIPPED_NAME"
 | 
			
		||||
                chmod +x "$CT_SCRIPT"
 | 
			
		||||
                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"
 | 
			
		||||
                exit 1
 | 
			
		||||
              fi
 | 
			
		||||
                echo "Found install script for $STRIPPED_NAME"
 | 
			
		||||
                chmod +x "$INSTALL_SCRIPT"
 | 
			
		||||
                RUNNING_FILE=$FILE
 | 
			
		||||
            fi
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-build.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-install.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
            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"
 | 
			
		||||
            chmod +x $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
 | 
			
		||||
 | 
			
		||||
            ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
 | 
			
		||||
            echo "Finished running $FILE"
 | 
			
		||||
            if [ -n "$ERROR_MSG" ]; then
 | 
			
		||||
              echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
 | 
			
		||||
              echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          set -e  # Restore exit-on-error
 | 
			
		||||
      
 | 
			
		||||
      - name: Cleanup PVE Node
 | 
			
		||||
        run: |
 | 
			
		||||
          containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}' | awk '{print $1}')
 | 
			
		||||
        
 | 
			
		||||
          for container_id in $containers; do
 | 
			
		||||
            status=$(pct status $container_id | awk '{print $2}')
 | 
			
		||||
            if [[ $status == "running" ]]; then
 | 
			
		||||
                pct stop $container_id
 | 
			
		||||
                pct destroy $container_id
 | 
			
		||||
            fi            
 | 
			
		||||
          done
 | 
			
		||||
      
 | 
			
		||||
      - name: Post error comments
 | 
			
		||||
        run: |
 | 
			
		||||
          ERROR="false"
 | 
			
		||||
          SEARCH_LINE=".github/workflows/scripts/app-test/pr-build.func: line"
 | 
			
		||||
          for FILE in ${{ env.ALL_FILES }}; do
 | 
			
		||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
            if [[ ! -f result_$STRIPPED_NAME.log ]]; then
 | 
			
		||||
              continue
 | 
			
		||||
            fi
 | 
			
		||||
            ERROR_MSG=$(cat result_$STRIPPED_NAME.log)
 | 
			
		||||
      
 | 
			
		||||
            if [ -n "$ERROR_MSG" ]; then
 | 
			
		||||
              CLEANED_ERROR_MSG=$(echo "$ERROR_MSG" | sed "s|$SEARCH_LINE.*||")
 | 
			
		||||
              echo "Posting error message for $FILE"
 | 
			
		||||
              echo ${CLEANED_ERROR_MSG}
 | 
			
		||||
              gh pr comment ${{ github.event.pull_request.number }} \
 | 
			
		||||
                --body ":warning: The script _**$FILE**_ failed with the following message: <br> <div><strong>${CLEANED_ERROR_MSG}</strong></div>"
 | 
			
		||||
 | 
			
		||||
              ERROR="true"
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          echo "ERROR=$ERROR" >> $GITHUB_ENV
 | 
			
		||||
      - name: Fail if error
 | 
			
		||||
        if: ${{ env.ERROR }} == 'true'
 | 
			
		||||
        run: exit 1 
 | 
			
		||||
							
								
								
									
										88
									
								
								.github/workflows/scripts/app-test/pr-alpine-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								.github/workflows/scripts/app-test/pr-alpine-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    STD=""
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RETRY_NUM=10
 | 
			
		||||
RETRY_EVERY=3
 | 
			
		||||
i=$RETRY_NUM
 | 
			
		||||
 | 
			
		||||
setting_up_container() {
 | 
			
		||||
  while [ $i -gt 0 ]; do
 | 
			
		||||
    if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" != "" ]; then
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
    echo 1>&2 -en "No Network! "
 | 
			
		||||
    sleep $RETRY_EVERY
 | 
			
		||||
    i=$((i - 1))
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" = "" ]; then
 | 
			
		||||
    echo 1>&2 -e "\n No Network After $RETRY_NUM Tries"
 | 
			
		||||
    echo -e "Check Network Settings"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  msg_ok "Set up Container OS"
 | 
			
		||||
  msg_ok "Network Connected: $(hostname -i)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
network_check() {
 | 
			
		||||
  RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
 | 
			
		||||
  if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to $RESOLVEDIP"; fi
 | 
			
		||||
  set -e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
 msg_info "Updating Container OS"
 | 
			
		||||
  apk update
 | 
			
		||||
  apk upgrade
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
motd_ssh() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
   return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										259
									
								
								.github/workflows/scripts/app-test/pr-build.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								.github/workflows/scripts/app-test/pr-build.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,259 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
variables() {
 | 
			
		||||
  NSAPP=$(echo ${APP,,} | tr -d ' ') 
 | 
			
		||||
  var_install="${NSAPP}-install"     
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
timezone=$(cat /etc/timezone)
 | 
			
		||||
header_info(){ 
 | 
			
		||||
  return  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
base_settings() {
 | 
			
		||||
  
 | 
			
		||||
  CT_TYPE="1"
 | 
			
		||||
  DISK_SIZE="4"
 | 
			
		||||
  CORE_COUNT="1"
 | 
			
		||||
  RAM_SIZE="1024"
 | 
			
		||||
  VERBOSE="${1:-no}"
 | 
			
		||||
  PW=""
 | 
			
		||||
  CT_ID=$NEXTID
 | 
			
		||||
  HN="Testing"
 | 
			
		||||
  BRG="vmbr0"
 | 
			
		||||
  NET="dhcp"
 | 
			
		||||
  GATE=""
 | 
			
		||||
  APT_CACHER=""
 | 
			
		||||
  APT_CACHER_IP=""
 | 
			
		||||
  DISABLEIP6="no"
 | 
			
		||||
  MTU=""
 | 
			
		||||
  SD=""
 | 
			
		||||
  NS=""
 | 
			
		||||
  MAC=""
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  SSH="no"
 | 
			
		||||
  SSH_AUTHORIZED_KEY=""
 | 
			
		||||
  TAGS="community-script;"
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  CT_TYPE=${var_unprivileged:-$CT_TYPE}
 | 
			
		||||
  DISK_SIZE=${var_disk:-$DISK_SIZE}
 | 
			
		||||
  CORE_COUNT=${var_cpu:-$CORE_COUNT}
 | 
			
		||||
  RAM_SIZE=${var_ram:-$RAM_SIZE}
 | 
			
		||||
  VERB=${var_verbose:-$VERBOSE}
 | 
			
		||||
  TAGS="${TAGS}${var_tags:-}"
 | 
			
		||||
 | 
			
		||||
  if [ -z "$var_os" ]; then
 | 
			
		||||
    var_os="debian"
 | 
			
		||||
  fi
 | 
			
		||||
  if [ -z "$var_version" ]; then
 | 
			
		||||
    var_version="12"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  # Colors
 | 
			
		||||
  YW=$(echo "\033[33m")
 | 
			
		||||
  YWB=$(echo "\033[93m")
 | 
			
		||||
  BL=$(echo "\033[36m")
 | 
			
		||||
  RD=$(echo "\033[01;31m")
 | 
			
		||||
  BGN=$(echo "\033[4;92m")
 | 
			
		||||
  GN=$(echo "\033[1;92m")
 | 
			
		||||
  DGN=$(echo "\033[32m")
 | 
			
		||||
 | 
			
		||||
  # Formatting
 | 
			
		||||
  CL=$(echo "\033[m")
 | 
			
		||||
  UL=$(echo "\033[4m")
 | 
			
		||||
  BOLD=$(echo "\033[1m")
 | 
			
		||||
  BFR="\\r\\033[K"
 | 
			
		||||
  HOLD=" "
 | 
			
		||||
  TAB="  "
 | 
			
		||||
 | 
			
		||||
  # Icons
 | 
			
		||||
  CM="${TAB}✔️${TAB}${CL}"
 | 
			
		||||
  CROSS="${TAB}✖️${TAB}${CL}"
 | 
			
		||||
  INFO="${TAB}💡${TAB}${CL}"
 | 
			
		||||
  OS="${TAB}🖥️${TAB}${CL}"
 | 
			
		||||
  OSVERSION="${TAB}🌟${TAB}${CL}"
 | 
			
		||||
  CONTAINERTYPE="${TAB}📦${TAB}${CL}"
 | 
			
		||||
  DISKSIZE="${TAB}💾${TAB}${CL}"
 | 
			
		||||
  CPUCORE="${TAB}🧠${TAB}${CL}"
 | 
			
		||||
  RAMSIZE="${TAB}🛠️${TAB}${CL}"
 | 
			
		||||
  SEARCH="${TAB}🔍${TAB}${CL}"
 | 
			
		||||
  VERIFYPW="${TAB}🔐${TAB}${CL}"
 | 
			
		||||
  CONTAINERID="${TAB}🆔${TAB}${CL}"
 | 
			
		||||
  HOSTNAME="${TAB}🏠${TAB}${CL}"
 | 
			
		||||
  BRIDGE="${TAB}🌉${TAB}${CL}"
 | 
			
		||||
  NETWORK="${TAB}📡${TAB}${CL}"
 | 
			
		||||
  GATEWAY="${TAB}🌐${TAB}${CL}"
 | 
			
		||||
  DISABLEIPV6="${TAB}🚫${TAB}${CL}"
 | 
			
		||||
  DEFAULT="${TAB}⚙️${TAB}${CL}"
 | 
			
		||||
  MACADDRESS="${TAB}🔗${TAB}${CL}"
 | 
			
		||||
  VLANTAG="${TAB}🏷️${TAB}${CL}"
 | 
			
		||||
  ROOTSSH="${TAB}🔑${TAB}${CL}"
 | 
			
		||||
  CREATING="${TAB}🚀${TAB}${CL}"
 | 
			
		||||
  ADVANCED="${TAB}🧩${TAB}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function handles errors
 | 
			
		||||
error_handler() {  
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit "$error_message"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
start(){
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
build_container() {
 | 
			
		||||
 
 | 
			
		||||
  if [ "$CT_TYPE" == "1" ]; then
 | 
			
		||||
    FEATURES="keyctl=1,nesting=1"
 | 
			
		||||
  else
 | 
			
		||||
    FEATURES="nesting=1"
 | 
			
		||||
  fi
 | 
			
		||||
  TEMP_DIR=$(mktemp -d)
 | 
			
		||||
  pushd $TEMP_DIR >/dev/null
 | 
			
		||||
  if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-alpine-install.func)"
 | 
			
		||||
  else
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-install.func)"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  export CACHER="$APT_CACHER"
 | 
			
		||||
  export CACHER_IP="$APT_CACHER_IP"
 | 
			
		||||
  export tz=""
 | 
			
		||||
  export DISABLEIPV6="$DISABLEIP6"
 | 
			
		||||
  export APPLICATION="$APP"
 | 
			
		||||
  export app="$NSAPP"
 | 
			
		||||
  export PASSWORD="$PW"
 | 
			
		||||
  export VERBOSE="$VERB"
 | 
			
		||||
  export SSH_ROOT="${SSH}"
 | 
			
		||||
  export SSH_AUTHORIZED_KEY
 | 
			
		||||
  export CTID="$CT_ID"
 | 
			
		||||
  export CTTYPE="$CT_TYPE"
 | 
			
		||||
  export PCT_OSTYPE="$var_os"
 | 
			
		||||
  export PCT_OSVERSION="$var_version"
 | 
			
		||||
  export PCT_DISK_SIZE="$DISK_SIZE"
 | 
			
		||||
  export tz="$timezone"
 | 
			
		||||
  export PCT_OPTIONS="
 | 
			
		||||
    -features $FEATURES
 | 
			
		||||
    -hostname $HN
 | 
			
		||||
    -tags $TAGS
 | 
			
		||||
    $SD
 | 
			
		||||
    $NS
 | 
			
		||||
    -net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
 | 
			
		||||
    -onboot 1
 | 
			
		||||
    -cores $CORE_COUNT
 | 
			
		||||
    -memory $RAM_SIZE
 | 
			
		||||
    -unprivileged $CT_TYPE
 | 
			
		||||
    $PW
 | 
			
		||||
  "
 | 
			
		||||
  echo "Container ID: $CTID"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # This executes create_lxc.sh and creates the container and .conf file
 | 
			
		||||
  bash /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
 | 
			
		||||
  LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
 | 
			
		||||
  if [ "$CT_TYPE" == "0" ]; then
 | 
			
		||||
    cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# USB passthrough
 | 
			
		||||
lxc.cgroup2.devices.allow: a
 | 
			
		||||
lxc.cap.drop:
 | 
			
		||||
lxc.cgroup2.devices.allow: c 188:* rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 189:* rwm
 | 
			
		||||
lxc.mount.entry: /dev/serial/by-id  dev/serial/by-id  none bind,optional,create=dir
 | 
			
		||||
lxc.mount.entry: /dev/ttyUSB0       dev/ttyUSB0       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyUSB1       dev/ttyUSB1       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyACM0       dev/ttyACM0       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyACM1       dev/ttyACM1       none bind,optional,create=file
 | 
			
		||||
EOF
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$CT_TYPE" == "0" ]; then
 | 
			
		||||
    if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" ]]; then
 | 
			
		||||
      cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
lxc.cgroup2.devices.allow: c 226:0 rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 226:128 rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 29:0 rwm
 | 
			
		||||
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
 | 
			
		||||
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
 | 
			
		||||
EOF
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" ]]; then
 | 
			
		||||
      if [[ -e "/dev/dri/renderD128" ]]; then
 | 
			
		||||
        if [[ -e "/dev/dri/card0" ]]; then
 | 
			
		||||
          cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
dev0: /dev/dri/card0,gid=44
 | 
			
		||||
dev1: /dev/dri/renderD128,gid=104
 | 
			
		||||
EOF
 | 
			
		||||
        else
 | 
			
		||||
          cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
dev0: /dev/dri/card1,gid=44
 | 
			
		||||
dev1: /dev/dri/renderD128,gid=104
 | 
			
		||||
EOF
 | 
			
		||||
        fi
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # This starts the container and executes <app>-install.sh
 | 
			
		||||
  msg_info "Starting LXC Container"
 | 
			
		||||
  pct start "$CTID"
 | 
			
		||||
  msg_ok "Started LXC Container"
 | 
			
		||||
 | 
			
		||||
  if [[ ! -f "/root/actions-runner/_work/ProxmoxVE/ProxmoxVE/install/$var_install.sh" ]]; then
 | 
			
		||||
    msg_error "No install script found for $APP"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
    if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
    sleep 3
 | 
			
		||||
    pct exec "$CTID" -- /bin/sh -c 'cat <<EOF >/etc/apk/repositories
 | 
			
		||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
 | 
			
		||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
 | 
			
		||||
EOF'
 | 
			
		||||
    pct exec "$CTID" -- ash -c "apk add bash >/dev/null"
 | 
			
		||||
  fi
 | 
			
		||||
  lxc-attach -n "$CTID" -- bash -c "$(< /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/install/$var_install.sh)"
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
description(){
 | 
			
		||||
 return
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										158
									
								
								.github/workflows/scripts/app-test/pr-create-lxc.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								.github/workflows/scripts/app-test/pr-create-lxc.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
    local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  local error_message="Failure in line $line_number: exit code $exit_code: while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit 100
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
VALIDCT=$(pvesm status -content rootdir | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALIDCT" ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid Container Storage location."
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
VALIDTMP=$(pvesm status -content vztmpl | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALIDTMP" ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid Template Storage location."
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function select_storage() {
 | 
			
		||||
  local CLASS=$1
 | 
			
		||||
  local CONTENT
 | 
			
		||||
  local CONTENT_LABEL
 | 
			
		||||
  case $CLASS in
 | 
			
		||||
  container)
 | 
			
		||||
    CONTENT='rootdir'
 | 
			
		||||
    CONTENT_LABEL='Container'
 | 
			
		||||
    ;;
 | 
			
		||||
  template)
 | 
			
		||||
    CONTENT='vztmpl'
 | 
			
		||||
    CONTENT_LABEL='Container template'
 | 
			
		||||
    ;;
 | 
			
		||||
  *) false || { msg_error "Invalid storage class."; exit 201; };;
 | 
			
		||||
  esac
 | 
			
		||||
  
 | 
			
		||||
  local -a MENU
 | 
			
		||||
  while read -r line; do
 | 
			
		||||
    local TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
    local TYPE=$(echo $line | awk '{printf "%-10s", $2}')
 | 
			
		||||
    local FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}')
 | 
			
		||||
    local ITEM="Type: $TYPE Free: $FREE "
 | 
			
		||||
    local OFFSET=2
 | 
			
		||||
    if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
 | 
			
		||||
      local MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
 | 
			
		||||
    fi
 | 
			
		||||
    MENU+=("$TAG" "$ITEM" "OFF")
 | 
			
		||||
  done < <(pvesm status -content $CONTENT | awk 'NR>1')
 | 
			
		||||
  
 | 
			
		||||
  if [ $((${#MENU[@]}/3)) -eq 1 ]; then
 | 
			
		||||
    printf ${MENU[0]}
 | 
			
		||||
  else
 | 
			
		||||
   msg_error "STORAGE ISSUES!"
 | 
			
		||||
    exit 202  
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[[ "${CTID:-}" ]] || { msg_error "You need to set 'CTID' variable."; exit 203; }
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || { msg_error "You need to set 'PCT_OSTYPE' variable."; exit 204; }
 | 
			
		||||
 | 
			
		||||
[ "$CTID" -ge "100" ] || { msg_error "ID cannot be less than 100."; exit 205; }
 | 
			
		||||
 | 
			
		||||
if pct status $CTID &>/dev/null; then
 | 
			
		||||
  echo -e "ID '$CTID' is already in use."
 | 
			
		||||
  unset CTID
 | 
			
		||||
  msg_error "Cannot use ID that is already in use."
 | 
			
		||||
  exit 206
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEMPLATE_STORAGE=$(select_storage template) || exit
 | 
			
		||||
msg_ok "Using  $TEMPLATE_STORAGE   for Template Storage."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CONTAINER_STORAGE=$(select_storage container) || exit
 | 
			
		||||
msg_ok "Using  $CONTAINER_STORAGE   for Container Storage."
 | 
			
		||||
 | 
			
		||||
msg_info "Updating LXC Template List"
 | 
			
		||||
pveam update >/dev/null
 | 
			
		||||
msg_ok "Updated LXC Template List"
 | 
			
		||||
 | 
			
		||||
TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-}
 | 
			
		||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V)
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || { msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'."; exit 207; }
 | 
			
		||||
TEMPLATE="${TEMPLATES[-1]}"
 | 
			
		||||
 | 
			
		||||
TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
			
		||||
 | 
			
		||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
 | 
			
		||||
  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
  msg_info "Downloading LXC Template"
 | 
			
		||||
  pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
 | 
			
		||||
    { msg_error "A problem occurred while downloading the LXC template."; exit 208; }
 | 
			
		||||
  msg_ok "Downloaded LXC Template"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >> /etc/subuid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >> /etc/subgid
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
 | 
			
		||||
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}")
 | 
			
		||||
 | 
			
		||||
echo "${PCT_OPTIONS[@]}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info "Creating LXC Container"
 | 
			
		||||
  if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
      [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
      
 | 
			
		||||
    msg_ok "Template integrity check completed"
 | 
			
		||||
    pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||    
 | 
			
		||||
      { msg_error "A problem occurred while re-downloading the LXC template."; exit 208; }
 | 
			
		||||
    
 | 
			
		||||
    msg_ok "Re-downloaded LXC Template"
 | 
			
		||||
    if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
        msg_error "A problem occurred while trying to create container after re-downloading template."
 | 
			
		||||
      exit 200
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
msg_ok "LXC Container  $CTID   was successfully created."
 | 
			
		||||
							
								
								
									
										93
									
								
								.github/workflows/scripts/app-test/pr-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								.github/workflows/scripts/app-test/pr-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit "$error_message"
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    STD=""
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
  RETRY_NUM=10
 | 
			
		||||
  RETRY_EVERY=3
 | 
			
		||||
setting_up_container() {
 | 
			
		||||
  sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
 | 
			
		||||
  locale_line=$(grep -v '^#' /etc/locale.gen | grep -E '^[a-zA-Z]' | awk '{print $1}' | head -n 1)
 | 
			
		||||
  echo "LANG=${locale_line}" >/etc/default/locale
 | 
			
		||||
  locale-gen >/dev/null
 | 
			
		||||
  export LANG=${locale_line}
 | 
			
		||||
  echo $tz >/etc/timezone
 | 
			
		||||
  ln -sf /usr/share/zoneinfo/$tz /etc/localtime
 | 
			
		||||
  
 | 
			
		||||
  for ((i = RETRY_NUM; i > 0; i--)); do
 | 
			
		||||
    if [ "$(hostname -I)" != "" ]; then
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
    echo 1>&2 -en "No Network! "
 | 
			
		||||
    sleep $RETRY_EVERY
 | 
			
		||||
  done
 | 
			
		||||
  if [ "$(hostname -I)" = "" ]; then
 | 
			
		||||
    echo 1>&2 -e "\nNo Network After $RETRY_NUM Tries"
 | 
			
		||||
    echo -e "Check Network Settings"
 | 
			
		||||
    exit 101
 | 
			
		||||
  fi
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  systemctl disable -q --now systemd-networkd-wait-online.service
 | 
			
		||||
  msg_ok "Set up Container OS"
 | 
			
		||||
  msg_ok "Network Connected: $(hostname -I)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
network_check() {
 | 
			
		||||
  RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
 | 
			
		||||
  if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to $RESOLVEDIP"; fi
 | 
			
		||||
  set -e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
  msg_info "Updating Container OS"
 | 
			
		||||
  apt-get update
 | 
			
		||||
  apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
motd_ssh() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
   return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								.github/workflows/scripts/update-json.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/scripts/update-json.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
FILE=$1
 | 
			
		||||
TODAY=$(date -u +"%Y-%m-%d")
 | 
			
		||||
 | 
			
		||||
if [[ -z "$FILE" ]]; then
 | 
			
		||||
    echo "No file specified. Exiting."
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ! -f "$FILE" ]]; then
 | 
			
		||||
    echo "File $FILE not found. Exiting."
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
DATE_IN_JSON=$(jq -r '.date_created' "$FILE" 2>/dev/null || echo "")
 | 
			
		||||
 | 
			
		||||
if [[ "$DATE_IN_JSON" != "$TODAY" ]]; then
 | 
			
		||||
    jq --arg date "$TODAY" '.date_created = $date' "$FILE" > tmp.json && mv tmp.json "$FILE"
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										118
									
								
								.github/workflows/update_json_date.yml.bak
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										118
									
								
								.github/workflows/update_json_date.yml.bak
									
									
									
									
										vendored
									
									
								
							@@ -1,48 +1,88 @@
 | 
			
		||||
name: Update JSON Date
 | 
			
		||||
name: Auto Update JSON-Date
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    types: [opened, synchronize, reopened]
 | 
			
		||||
        
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      - main
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  list-files:
 | 
			
		||||
  update-json-dates:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
      pull-requests: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout PR Branch
 | 
			
		||||
      uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        ref: ${{ github.event.pull_request.head.ref }}
 | 
			
		||||
      - name: Generate a token
 | 
			
		||||
        id: generate-token
 | 
			
		||||
        uses: actions/create-github-app-token@v1
 | 
			
		||||
        with:
 | 
			
		||||
          app-id: ${{ vars.APP_ID }}
 | 
			
		||||
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
    - name: Fetch PR changes
 | 
			
		||||
      run: |
 | 
			
		||||
          git remote add fork https://github.com/${{ github.event.pull_request.head.repo.full_name }}.git
 | 
			
		||||
          git fetch fork ${{ github.event.pull_request.head.ref }}:pullreq
 | 
			
		||||
          git checkout pullreq
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0  # Full history for proper detection
 | 
			
		||||
 | 
			
		||||
    - name: Update JSON
 | 
			
		||||
      id: changed-files
 | 
			
		||||
      run: |
 | 
			
		||||
          FILES=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --jq '.[].filename' | tr '\n' ' ')
 | 
			
		||||
          echo "changed_files=${FILES}"
 | 
			
		||||
          for FILE in $FILES; do
 | 
			
		||||
            if [[ "$FILE" =~ /(.*)\.json ]]; then
 | 
			
		||||
              NAME="${BASH_REMATCH[1]}"
 | 
			
		||||
            else
 | 
			
		||||
              echo "no new JSON in ${FILES}"
 | 
			
		||||
              continue
 | 
			
		||||
            fi
 | 
			
		||||
          
 | 
			
		||||
            JSON_FILE="json/${NAME}.json"
 | 
			
		||||
            if [[ -f "$JSON_FILE" ]]; then
 | 
			
		||||
              echo "Updating date_created in $JSON_FILE"
 | 
			
		||||
              jq --arg date "$(date +%Y-%m-%d)" '.date_created = $date' "$JSON_FILE" > tmp.json && mv tmp.json "$JSON_FILE"
 | 
			
		||||
            else
 | 
			
		||||
              echo "JSON file $FILES not found"
 | 
			
		||||
      - name: Set up Git
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global user.name "GitHub Actions"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
 | 
			
		||||
      - name: Find JSON files with incorrect date_created
 | 
			
		||||
        id: find_wrong_json
 | 
			
		||||
        run: |
 | 
			
		||||
          TODAY=$(date -u +"%Y-%m-%d")
 | 
			
		||||
          > incorrect_json_files.txt
 | 
			
		||||
 | 
			
		||||
          for FILE in json/*.json; do
 | 
			
		||||
            if [[ -f "$FILE" ]]; then
 | 
			
		||||
              DATE_IN_JSON=$(jq -r '.date_created' "$FILE" 2>/dev/null || echo "")
 | 
			
		||||
 | 
			
		||||
              if [[ "$DATE_IN_JSON" != "$TODAY" ]]; then
 | 
			
		||||
                echo "$FILE" >> incorrect_json_files.txt
 | 
			
		||||
              fi
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
             
 | 
			
		||||
          git config --global user.name "github-actions[bot]"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
          git diff --exit-code || git commit -am "Updating Dates in affected JSON files."
 | 
			
		||||
          git push 
 | 
			
		||||
      env:
 | 
			
		||||
 | 
			
		||||
          if [[ -s incorrect_json_files.txt ]]; then
 | 
			
		||||
            echo "CHANGED=true" >> $GITHUB_ENV
 | 
			
		||||
          else
 | 
			
		||||
            echo "CHANGED=false" >> $GITHUB_ENV
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Run update script
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          chmod +x .github/workflows/scripts/update-json.sh
 | 
			
		||||
          while read -r FILE; do
 | 
			
		||||
            .github/workflows/scripts/update-json.sh "$FILE"
 | 
			
		||||
          done < incorrect_json_files.txt
 | 
			
		||||
 | 
			
		||||
      - name: Commit and create PR if changes exist
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          git add json/*.json
 | 
			
		||||
          git commit -m "Auto-update date_created in incorrect JSON files"
 | 
			
		||||
          git checkout -b pr-fix-json-dates
 | 
			
		||||
          git push origin pr-fix-json-dates --force
 | 
			
		||||
          gh pr create --title "[core] Fix incorrect JSON date_created fields" \
 | 
			
		||||
                       --body "This PR is auto-generated to fix incorrect `date_created` fields in JSON files." \
 | 
			
		||||
                       --head pr-fix-json-dates \
 | 
			
		||||
                       --base main \
 | 
			
		||||
                       --label "automated pr"
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          PR_NUMBER=$(gh pr list --head "pr-fix-json-dates" --json number --jq '.[].number')
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								.github/workflows/validate-filenames.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/validate-filenames.yml
									
									
									
									
										vendored
									
									
								
							@@ -50,9 +50,13 @@ jobs:
 | 
			
		||||
 | 
			
		||||
          NON_COMPLIANT_FILES=""
 | 
			
		||||
          for FILE in $CHANGED_FILES; do
 | 
			
		||||
            # Datei "ct/create_lxc.sh" explizit überspringen
 | 
			
		||||
            if [[ "$FILE" == "ct/create_lxc.sh" ]]; then
 | 
			
		||||
              continue
 | 
			
		||||
            fi
 | 
			
		||||
            BASENAME=$(echo "$(basename "${FILE%.*}")")
 | 
			
		||||
            if [[ ! "$BASENAME" =~ ^[a-z0-9-]+$ ]]; then
 | 
			
		||||
                    NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE"
 | 
			
		||||
              NON_COMPLIANT_FILES="$NON_COMPLIANT_FILES $FILE"
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										180
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										180
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -17,6 +17,186 @@ All LXC instances created using this repository come pre-installed with Midnight
 | 
			
		||||
Do not break established syntax in this file, as it is automatically updated by a Github Workflow
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 2025-02-11
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Opnsense VM [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2097](https://github.com/community-scripts/ProxmoxVE/pull/2097))
 | 
			
		||||
- New Script: Watcharr [@tremor021](https://github.com/tremor021) ([#2243](https://github.com/community-scripts/ProxmoxVE/pull/2243))
 | 
			
		||||
- New Script: Suwayomi-Server [@tremor021](https://github.com/tremor021) ([#2139](https://github.com/community-scripts/ProxmoxVE/pull/2139))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix Photoprism: Add defaults.yml for CLI Tool [@MickLesk](https://github.com/MickLesk) ([#2261](https://github.com/community-scripts/ProxmoxVE/pull/2261))
 | 
			
		||||
- Update Checkmk: include Patch versions in Release grepping [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2264](https://github.com/community-scripts/ProxmoxVE/pull/2264))
 | 
			
		||||
- Fix: Apache Guacamole Version Crawling - only latest Version [@MickLesk](https://github.com/MickLesk) ([#2258](https://github.com/community-scripts/ProxmoxVE/pull/2258))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Update Komodo icon [@bannert1337](https://github.com/bannert1337) ([#2263](https://github.com/community-scripts/ProxmoxVE/pull/2263))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- Add Workflow to test Scripts [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2269](https://github.com/community-scripts/ProxmoxVE/pull/2269))
 | 
			
		||||
 | 
			
		||||
## 2025-02-10
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
- [Fix] Filebrowser - Add Static Path for DB [@MickLesk](https://github.com/MickLesk) ([#2207](https://github.com/community-scripts/ProxmoxVE/pull/2207))
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Prometheus Paperless-NGX Exporter [@andygrunwald](https://github.com/andygrunwald) ([#2153](https://github.com/community-scripts/ProxmoxVE/pull/2153))
 | 
			
		||||
- New Script: Proxmox Mail Gateway [@thost96](https://github.com/thost96) ([#1906](https://github.com/community-scripts/ProxmoxVE/pull/1906))
 | 
			
		||||
- New Script: FreshRSS [@bvdberg01](https://github.com/bvdberg01) ([#2226](https://github.com/community-scripts/ProxmoxVE/pull/2226))
 | 
			
		||||
- New Script: Zitadel [@dave-yap](https://github.com/dave-yap) ([#2141](https://github.com/community-scripts/ProxmoxVE/pull/2141))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Feature: Automatic Deletion of choosen LXC's (lxc-delete.sh) [@MickLesk](https://github.com/MickLesk) ([#2228](https://github.com/community-scripts/ProxmoxVE/pull/2228))
 | 
			
		||||
- Quickfix: Crafty-Controller remove unnecessary \ [@MickLesk](https://github.com/MickLesk) ([#2233](https://github.com/community-scripts/ProxmoxVE/pull/2233))
 | 
			
		||||
- Fix: Crafty-Controller java versions and set default [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2199](https://github.com/community-scripts/ProxmoxVE/pull/2199))
 | 
			
		||||
- Feature: Add optional Port for Filebrowser [@MickLesk](https://github.com/MickLesk) ([#2224](https://github.com/community-scripts/ProxmoxVE/pull/2224))
 | 
			
		||||
- [core] Prevent double spinner [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2203](https://github.com/community-scripts/ProxmoxVE/pull/2203))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Website: Fix Zitadel Logo & Created-Date [@MickLesk](https://github.com/MickLesk) ([#2217](https://github.com/community-scripts/ProxmoxVE/pull/2217))
 | 
			
		||||
- Fixed URL typo zerotier-one.json [@Divaksh](https://github.com/Divaksh) ([#2206](https://github.com/community-scripts/ProxmoxVE/pull/2206))
 | 
			
		||||
- evcc.json Clarify the config file location [@mvdw](https://github.com/mvdw) ([#2193](https://github.com/community-scripts/ProxmoxVE/pull/2193))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- [gh]: Improve Workflows, Templates, Handling [@MickLesk](https://github.com/MickLesk) ([#2214](https://github.com/community-scripts/ProxmoxVE/pull/2214))
 | 
			
		||||
- [core] Fix app-header workflow and add API [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2204](https://github.com/community-scripts/ProxmoxVE/pull/2204))
 | 
			
		||||
- Fix: "read -p" does not support color formatting [@PhoenixEmik](https://github.com/PhoenixEmik) ([#2191](https://github.com/community-scripts/ProxmoxVE/pull/2191))
 | 
			
		||||
- [API] Add API to vms [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2021](https://github.com/community-scripts/ProxmoxVE/pull/2021))
 | 
			
		||||
 | 
			
		||||
## 2025-02-09
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: pbs_microcode.sh [@DonPablo1010](https://github.com/DonPablo1010) ([#2166](https://github.com/community-scripts/ProxmoxVE/pull/2166))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Keep the same hass_config volume for Home Assistant [@genehand](https://github.com/genehand) ([#2160](https://github.com/community-scripts/ProxmoxVE/pull/2160))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Website: Set new Logo for Paperless-AI [@MickLesk](https://github.com/MickLesk) ([#2194](https://github.com/community-scripts/ProxmoxVE/pull/2194))
 | 
			
		||||
- Fix: Barcode Buddy Logo & Title [@MickLesk](https://github.com/MickLesk) ([#2183](https://github.com/community-scripts/ProxmoxVE/pull/2183))
 | 
			
		||||
 | 
			
		||||
## 2025-02-08
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New script: Barcode Buddy [@bvdberg01](https://github.com/bvdberg01) ([#2167](https://github.com/community-scripts/ProxmoxVE/pull/2167))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: Actualbudget - salvage the `.migrate` file when upgrading [@bourquep](https://github.com/bourquep) ([#2173](https://github.com/community-scripts/ProxmoxVE/pull/2173))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Update cosmos.json description [@BramSuurdje](https://github.com/BramSuurdje) ([#2162](https://github.com/community-scripts/ProxmoxVE/pull/2162))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- fix typos in CONTRIBUTOR_GUIDE [@thomashondema](https://github.com/thomashondema) ([#2174](https://github.com/community-scripts/ProxmoxVE/pull/2174))
 | 
			
		||||
 | 
			
		||||
## 2025-02-07 - 10.000 ⭐
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 | 
			
		||||
### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
- [core]: Enhance LXC template handling and improve error recovery [@MickLesk](https://github.com/MickLesk) ([#2128](https://github.com/community-scripts/ProxmoxVE/pull/2128))
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Cosmos [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2120](https://github.com/community-scripts/ProxmoxVE/pull/2120))
 | 
			
		||||
- New Script: SearXNG [@MickLesk](https://github.com/MickLesk) ([#2123](https://github.com/community-scripts/ProxmoxVE/pull/2123))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: Trillium Update Function & Harmonize Installation [@MickLesk](https://github.com/MickLesk) ([#2148](https://github.com/community-scripts/ProxmoxVE/pull/2148))
 | 
			
		||||
- Fix: Zerotier-One fixed missing dependency [@tremor021](https://github.com/tremor021) ([#2147](https://github.com/community-scripts/ProxmoxVE/pull/2147))
 | 
			
		||||
- Fix: Openwrt Version checking [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2137](https://github.com/community-scripts/ProxmoxVE/pull/2137))
 | 
			
		||||
- Fix: PeaNUT Increase HDD & RAM Size [@MickLesk](https://github.com/MickLesk) ([#2127](https://github.com/community-scripts/ProxmoxVE/pull/2127))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Fix: Zerotier json had a bad script path [@tremor021](https://github.com/tremor021) ([#2144](https://github.com/community-scripts/ProxmoxVE/pull/2144))
 | 
			
		||||
- Fix: Cosmos logo doesnt display on website [@MickLesk](https://github.com/MickLesk) ([#2132](https://github.com/community-scripts/ProxmoxVE/pull/2132))
 | 
			
		||||
- Fix JSON-Editor [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2121](https://github.com/community-scripts/ProxmoxVE/pull/2121))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- [gh]: Following the trend - add star-history in readme [@MickLesk](https://github.com/MickLesk) ([#2135](https://github.com/community-scripts/ProxmoxVE/pull/2135))
 | 
			
		||||
 | 
			
		||||
## 2025-02-06
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Duplicati [@tremor021](https://github.com/tremor021) ([#2052](https://github.com/community-scripts/ProxmoxVE/pull/2052))
 | 
			
		||||
- New Script: Paperless-AI [@MickLesk](https://github.com/MickLesk) ([#2093](https://github.com/community-scripts/ProxmoxVE/pull/2093))
 | 
			
		||||
- New Script: Apache Tika [@andygrunwald](https://github.com/andygrunwald) ([#2079](https://github.com/community-scripts/ProxmoxVE/pull/2079))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: Alpine IT-Tools Update [@MickLesk](https://github.com/MickLesk) ([#2067](https://github.com/community-scripts/ProxmoxVE/pull/2067))
 | 
			
		||||
- Fix: Pocket-ID Change link to GH Repo [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2082](https://github.com/community-scripts/ProxmoxVE/pull/2082))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Refactor JSON generator buttons layout for better alignment and consistency [@BramSuurdje](https://github.com/BramSuurdje) ([#2106](https://github.com/community-scripts/ProxmoxVE/pull/2106))
 | 
			
		||||
- Website: Refactor Footer for improved layout and styling consistency [@BramSuurdje](https://github.com/BramSuurdje) ([#2107](https://github.com/community-scripts/ProxmoxVE/pull/2107))
 | 
			
		||||
- Website: Update Footer for Json-Editor & Api [@MickLesk](https://github.com/MickLesk) ([#2100](https://github.com/community-scripts/ProxmoxVE/pull/2100))
 | 
			
		||||
- Website: Add Download for json-editor [@MickLesk](https://github.com/MickLesk) ([#2099](https://github.com/community-scripts/ProxmoxVE/pull/2099))
 | 
			
		||||
- Radicale: Provide additional information about configuration [@tremor021](https://github.com/tremor021) ([#2072](https://github.com/community-scripts/ProxmoxVE/pull/2072))
 | 
			
		||||
 | 
			
		||||
## 2025-02-05
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Zerotier Controller [@tremor021](https://github.com/tremor021) ([#1928](https://github.com/community-scripts/ProxmoxVE/pull/1928))
 | 
			
		||||
- New Script: Radicale [@tremor021](https://github.com/tremor021) ([#1941](https://github.com/community-scripts/ProxmoxVE/pull/1941))
 | 
			
		||||
- New Script: seelf [@tremor021](https://github.com/tremor021) ([#2023](https://github.com/community-scripts/ProxmoxVE/pull/2023))
 | 
			
		||||
- New Script: Crafty-Controller [@CrazyWolf13](https://github.com/CrazyWolf13) ([#1926](https://github.com/community-scripts/ProxmoxVE/pull/1926))
 | 
			
		||||
- New script: Koillection [@bvdberg01](https://github.com/bvdberg01) ([#2031](https://github.com/community-scripts/ProxmoxVE/pull/2031))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Bugfix: Jellyseerr pnpm Version [@vidonnus](https://github.com/vidonnus) ([#2033](https://github.com/community-scripts/ProxmoxVE/pull/2033))
 | 
			
		||||
- Radicale: Fixed missing htpasswd flag [@tremor021](https://github.com/tremor021) ([#2065](https://github.com/community-scripts/ProxmoxVE/pull/2065))
 | 
			
		||||
- [API] Update build.func / Improve error messages #2 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2050](https://github.com/community-scripts/ProxmoxVE/pull/2050))
 | 
			
		||||
- [API] Update create-lxc.sh / Improve error messages #1 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2049](https://github.com/community-scripts/ProxmoxVE/pull/2049))
 | 
			
		||||
- Feature: Element Synapse: add option to enter server name during LXC installation [@tremor021](https://github.com/tremor021) ([#2038](https://github.com/community-scripts/ProxmoxVE/pull/2038))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Paperless NGX: Mark it as updateable [@andygrunwald](https://github.com/andygrunwald) ([#2070](https://github.com/community-scripts/ProxmoxVE/pull/2070))
 | 
			
		||||
- Bump vitest from 2.1.6 to 2.1.9 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#2042](https://github.com/community-scripts/ProxmoxVE/pull/2042))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- [API] Add API backend code [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2040](https://github.com/community-scripts/ProxmoxVE/pull/2040))
 | 
			
		||||
- Update auto-update-app-headers.yml: Enable auto approval [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2057](https://github.com/community-scripts/ProxmoxVE/pull/2057))
 | 
			
		||||
 | 
			
		||||
## 2025-02-04
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								README.md
									
									
									
									
									
								
							@@ -91,6 +91,16 @@ If you encounter any issues or have suggestions for improvement, file a new issu
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## ⭐ Star History
 | 
			
		||||
 | 
			
		||||
<a href="https://star-history.com/#community-scripts/ProxmoxVE&Date">
 | 
			
		||||
 <picture>
 | 
			
		||||
   <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date&theme=dark" />
 | 
			
		||||
   <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date" />
 | 
			
		||||
   <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=community-scripts/ProxmoxVE&type=Date" />
 | 
			
		||||
 </picture>
 | 
			
		||||
</a>
 | 
			
		||||
 | 
			
		||||
## 📜 License
 | 
			
		||||
 | 
			
		||||
This project is licensed under the [MIT License](LICENSE).
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								api/.env.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								api/.env.example
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
MONGO_USER=
 | 
			
		||||
MONGO_PASSWORD=
 | 
			
		||||
MONGO_IP=
 | 
			
		||||
MONGO_PORT=
 | 
			
		||||
MONGO_DATABASE=
 | 
			
		||||
							
								
								
									
										32
									
								
								api/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								api/go.mod
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
module proxmox-api
 | 
			
		||||
 | 
			
		||||
go 1.23.2
 | 
			
		||||
 | 
			
		||||
require go.mongodb.org/mongo-driver v1.17.2
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	filippo.io/edwards25519 v1.1.0 // indirect
 | 
			
		||||
	github.com/go-sql-driver/mysql v1.8.1 // indirect
 | 
			
		||||
	github.com/golang/snappy v0.0.4 // indirect
 | 
			
		||||
	github.com/gorilla/mux v1.8.1 // indirect
 | 
			
		||||
	github.com/jackc/pgpassfile v1.0.0 // indirect
 | 
			
		||||
	github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
 | 
			
		||||
	github.com/jackc/pgx/v5 v5.7.2 // indirect
 | 
			
		||||
	github.com/jackc/puddle/v2 v2.2.2 // indirect
 | 
			
		||||
	github.com/jinzhu/inflection v1.0.0 // indirect
 | 
			
		||||
	github.com/jinzhu/now v1.1.5 // indirect
 | 
			
		||||
	github.com/joho/godotenv v1.5.1 // indirect
 | 
			
		||||
	github.com/klauspost/compress v1.16.7 // indirect
 | 
			
		||||
	github.com/montanaflynn/stats v0.7.1 // indirect
 | 
			
		||||
	github.com/rs/cors v1.11.1 // indirect
 | 
			
		||||
	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 | 
			
		||||
	github.com/xdg-go/scram v1.1.2 // indirect
 | 
			
		||||
	github.com/xdg-go/stringprep v1.0.4 // indirect
 | 
			
		||||
	github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
 | 
			
		||||
	golang.org/x/crypto v0.32.0 // indirect
 | 
			
		||||
	golang.org/x/sync v0.10.0 // indirect
 | 
			
		||||
	golang.org/x/text v0.21.0 // indirect
 | 
			
		||||
	gorm.io/driver/mysql v1.5.7 // indirect
 | 
			
		||||
	gorm.io/driver/postgres v1.5.11 // indirect
 | 
			
		||||
	gorm.io/gorm v1.25.12 // indirect
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										83
									
								
								api/go.sum
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								api/go.sum
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
 | 
			
		||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
 | 
			
		||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 | 
			
		||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
			
		||||
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
 | 
			
		||||
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
 | 
			
		||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
 | 
			
		||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
 | 
			
		||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
 | 
			
		||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
 | 
			
		||||
github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI=
 | 
			
		||||
github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ=
 | 
			
		||||
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
 | 
			
		||||
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
 | 
			
		||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 | 
			
		||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 | 
			
		||||
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
 | 
			
		||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 | 
			
		||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
 | 
			
		||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
 | 
			
		||||
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
 | 
			
		||||
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
 | 
			
		||||
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
 | 
			
		||||
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
 | 
			
		||||
github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
			
		||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 | 
			
		||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 | 
			
		||||
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
 | 
			
		||||
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
 | 
			
		||||
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
 | 
			
		||||
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
 | 
			
		||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
 | 
			
		||||
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
 | 
			
		||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 | 
			
		||||
go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM=
 | 
			
		||||
go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
 | 
			
		||||
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
 | 
			
		||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 | 
			
		||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
 | 
			
		||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 | 
			
		||||
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 | 
			
		||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
 | 
			
		||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
 | 
			
		||||
gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
 | 
			
		||||
gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314=
 | 
			
		||||
gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
 | 
			
		||||
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
 | 
			
		||||
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
 | 
			
		||||
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
 | 
			
		||||
							
								
								
									
										167
									
								
								api/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								api/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,167 @@
 | 
			
		||||
// Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
// Author: Michel Roegl-Brunner (michelroegl-brunner)
 | 
			
		||||
// License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"os"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
	"github.com/joho/godotenv"
 | 
			
		||||
	"github.com/rs/cors"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/bson"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/bson/primitive"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/mongo"
 | 
			
		||||
	"go.mongodb.org/mongo-driver/mongo/options"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var client *mongo.Client
 | 
			
		||||
var collection *mongo.Collection
 | 
			
		||||
 | 
			
		||||
func loadEnv() {
 | 
			
		||||
	if err := godotenv.Load(); err != nil {
 | 
			
		||||
		log.Fatal("Error loading .env file")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DataModel struct {
 | 
			
		||||
	ID         primitive.ObjectID `json:"id" bson:"_id,omitempty"`
 | 
			
		||||
	CT_TYPE    uint               `json:"ct_type" bson:"ct_type"`
 | 
			
		||||
	DISK_SIZE  float32            `json:"disk_size" bson:"disk_size"`
 | 
			
		||||
	CORE_COUNT uint               `json:"core_count" bson:"core_count"`
 | 
			
		||||
	RAM_SIZE   uint               `json:"ram_size" bson:"ram_size"`
 | 
			
		||||
	OS_TYPE    string             `json:"os_type" bson:"os_type"`
 | 
			
		||||
	OS_VERSION string             `json:"os_version" bson:"os_version"`
 | 
			
		||||
	DISABLEIP6 string             `json:"disableip6" bson:"disableip6"`
 | 
			
		||||
	NSAPP      string             `json:"nsapp" bson:"nsapp"`
 | 
			
		||||
	METHOD     string             `json:"method" bson:"method"`
 | 
			
		||||
	CreatedAt  time.Time          `json:"created_at" bson:"created_at"`
 | 
			
		||||
	PVEVERSION string             `json:"pve_version" bson:"pve_version"`
 | 
			
		||||
	STATUS     string             `json:"status" bson:"status"`
 | 
			
		||||
	RANDOM_ID  string             `json:"random_id" bson:"random_id"`
 | 
			
		||||
	TYPE       string             `json:"type" bson:"type"`
 | 
			
		||||
	ERROR      string             `json:"error" bson:"error"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type StatusModel struct {
 | 
			
		||||
	RANDOM_ID string `json:"random_id" bson:"random_id"`
 | 
			
		||||
	ERROR     string `json:"error" bson:"error"`
 | 
			
		||||
	STATUS    string `json:"status" bson:"status"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ConnectDatabase() {
 | 
			
		||||
	loadEnv()
 | 
			
		||||
 | 
			
		||||
	mongoURI := fmt.Sprintf("mongodb://%s:%s@%s:%s",
 | 
			
		||||
		os.Getenv("MONGO_USER"),
 | 
			
		||||
		os.Getenv("MONGO_PASSWORD"),
 | 
			
		||||
		os.Getenv("MONGO_IP"),
 | 
			
		||||
		os.Getenv("MONGO_PORT"))
 | 
			
		||||
 | 
			
		||||
	database := os.Getenv("MONGO_DATABASE")
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	var err error
 | 
			
		||||
	client, err = mongo.Connect(ctx, options.Client().ApplyURI(mongoURI))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Fatal("Failed to connect to MongoDB!", err)
 | 
			
		||||
	}
 | 
			
		||||
	collection = client.Database(database).Collection("data_models")
 | 
			
		||||
	fmt.Println("Connected to MongoDB on 10.10.10.18")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UploadJSON(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	var input DataModel
 | 
			
		||||
 | 
			
		||||
	if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	input.CreatedAt = time.Now()
 | 
			
		||||
 | 
			
		||||
	_, err := collection.InsertOne(context.Background(), input)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Println("Received data:", input)
 | 
			
		||||
	w.WriteHeader(http.StatusCreated)
 | 
			
		||||
	json.NewEncoder(w).Encode(map[string]string{"message": "Data saved successfully"})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func UpdateStatus(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	var input StatusModel
 | 
			
		||||
 | 
			
		||||
	if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusBadRequest)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	filter := bson.M{"random_id": input.RANDOM_ID}
 | 
			
		||||
	update := bson.M{"$set": bson.M{"status": input.STATUS, "error": input.ERROR}}
 | 
			
		||||
 | 
			
		||||
	_, err := collection.UpdateOne(context.Background(), filter, update)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Println("Updated data:", input)
 | 
			
		||||
	w.WriteHeader(http.StatusOK)
 | 
			
		||||
	json.NewEncoder(w).Encode(map[string]string{"message": "Record updated successfully"})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetDataJSON(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	var records []DataModel
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	cursor, err := collection.Find(ctx, bson.M{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer cursor.Close(ctx)
 | 
			
		||||
 | 
			
		||||
	for cursor.Next(ctx) {
 | 
			
		||||
		var record DataModel
 | 
			
		||||
		if err := cursor.Decode(&record); err != nil {
 | 
			
		||||
			http.Error(w, err.Error(), http.StatusInternalServerError)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		records = append(records, record)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json")
 | 
			
		||||
	json.NewEncoder(w).Encode(records)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	ConnectDatabase()
 | 
			
		||||
 | 
			
		||||
	router := mux.NewRouter()
 | 
			
		||||
	router.HandleFunc("/upload", UploadJSON).Methods("POST")
 | 
			
		||||
	router.HandleFunc("/upload/updatestatus", UpdateStatus).Methods("POST")
 | 
			
		||||
	router.HandleFunc("/data/json", GetDataJSON).Methods("GET")
 | 
			
		||||
 | 
			
		||||
	c := cors.New(cors.Options{
 | 
			
		||||
		AllowedOrigins:   []string{"*"},
 | 
			
		||||
		AllowedMethods:   []string{"GET", "POST"},
 | 
			
		||||
		AllowedHeaders:   []string{"Content-Type", "Authorization"},
 | 
			
		||||
		AllowCredentials: true,
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	handler := c.Handler(router)
 | 
			
		||||
 | 
			
		||||
	fmt.Println("Server running on port 8080")
 | 
			
		||||
	log.Fatal(http.ListenAndServe(":8080", handler))
 | 
			
		||||
}
 | 
			
		||||
@@ -48,6 +48,7 @@ function update_script() {
 | 
			
		||||
        mv *ctual-server-* /opt/actualbudget
 | 
			
		||||
        rm -rf /opt/actualbudget/.env
 | 
			
		||||
        mv /opt/actualbudget_bak/.env /opt/actualbudget
 | 
			
		||||
        mv /opt/actualbudget_bak/.migrate /opt/actualbudget
 | 
			
		||||
        mv /opt/actualbudget_bak/server-files /opt/actualbudget/server-files
 | 
			
		||||
        cd /opt/actualbudget
 | 
			
		||||
        yarn install &>/dev/null
 | 
			
		||||
 
 | 
			
		||||
@@ -29,27 +29,28 @@ function update_script() {
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
 | 
			
		||||
    if [[ ! -d /usr/share/nginx/html ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
if [ ! -d /usr/share/nginx/html ]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/CorentinTh/it-tools/releases/latest | grep '"tag_name":' | cut -d '"' -f4)
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
        DOWNLOAD_URL="https://github.com/CorentinTh/it-tools/releases/download/${RELEASE}/it-tools-${RELEASE#v}.zip"
 | 
			
		||||
        msg_info "Updating ${APP} LXC"
 | 
			
		||||
        curl -fsSL -o it-tools.zip "$DOWNLOAD_URL"
 | 
			
		||||
        mkdir -p /usr/share/nginx/html
 | 
			
		||||
        rm -rf /usr/share/nginx/html/*
 | 
			
		||||
        unzip -q it-tools.zip -d /tmp/it-tools
 | 
			
		||||
        cp -r /tmp/it-tools/dist/* /usr/share/nginx/html
 | 
			
		||||
        rm -rf /tmp/it-tools
 | 
			
		||||
        rm -f it-tools.zip
 | 
			
		||||
        msg_ok "Updated Successfully"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/CorentinTh/it-tools/releases/latest | grep '"tag_name":' | cut -d '"' -f4)
 | 
			
		||||
if [ "${RELEASE}" != "$(cat /opt/${APP}_version.txt 2>/dev/null)" ] || [ ! -f /opt/${APP}_version.txt ]; then
 | 
			
		||||
    DOWNLOAD_URL="https://github.com/CorentinTh/it-tools/releases/download/${RELEASE}/it-tools-${RELEASE#v}.zip"
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    curl -fsSL -o it-tools.zip "$DOWNLOAD_URL"
 | 
			
		||||
    mkdir -p /usr/share/nginx/html
 | 
			
		||||
    rm -rf /usr/share/nginx/html/*
 | 
			
		||||
    unzip -q it-tools.zip -d /tmp/it-tools
 | 
			
		||||
    cp -r /tmp/it-tools/dist/* /usr/share/nginx/html
 | 
			
		||||
    rm -rf /tmp/it-tools
 | 
			
		||||
    rm -f it-tools.zip
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										69
									
								
								ct/apache-tika.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										69
									
								
								ct/apache-tika.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
#!/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: Andy Grunwald (andygrunwald)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/apache/tika/
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Apache-Tika"
 | 
			
		||||
var_tags="document"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -f /etc/systemd/system/apache-tika.service ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE="$(wget -qO- https://dlcdn.apache.org/tika/ | grep -oP '(?<=href=")[0-9]+\.[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1)"
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop apache-tika
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cd /opt/apache-tika
 | 
			
		||||
    wget -q "https://dlcdn.apache.org/tika/${RELEASE}/tika-server-standard-${RELEASE}.jar"
 | 
			
		||||
    mv --force tika-server-standard.jar tika-server-standard-prev-version.jar
 | 
			
		||||
    mv tika-server-standard-${RELEASE}.jar tika-server-standard.jar
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start apache-tika
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf /opt/apache-tika/tika-server-standard-prev-version.jar
 | 
			
		||||
    msg_ok "Cleanup Completed"
 | 
			
		||||
    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}:9998${CL}"
 | 
			
		||||
							
								
								
									
										76
									
								
								ct/barcode-buddy.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								ct/barcode-buddy.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/Forceu/barcodebuddy
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Barcode-Buddy"
 | 
			
		||||
var_tags="grocery;household"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="512"
 | 
			
		||||
var_disk="3"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/barcodebuddy ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/Forceu/barcodebuddy/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 apache2
 | 
			
		||||
    systemctl stop barcodebuddy
 | 
			
		||||
    msg_ok "Stopped Service"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    mv /opt/barcodebuddy/ /opt/barcodebuddy-backup
 | 
			
		||||
    wget -q "https://github.com/Forceu/barcodebuddy/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
    unzip -q "v${RELEASE}.zip"
 | 
			
		||||
    mv "/opt/barcodebuddy-${RELEASE}" /opt/barcodebuddy
 | 
			
		||||
    cp -r /opt/barcodebuddy-backup/data/. /opt/barcodebuddy/data
 | 
			
		||||
    chown -R www-data:www-data /opt/barcodebuddy/data
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start apache2
 | 
			
		||||
    systemctl start barcodebuddy
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning up"
 | 
			
		||||
    rm -r "/opt/v${RELEASE}.zip"
 | 
			
		||||
    rm -r /opt/barcodebuddy-backup
 | 
			
		||||
    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}"
 | 
			
		||||
@@ -29,7 +29,7 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }') 
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | tr ' ' '\n' | grep -v '\-rc' | sort -V | tail -n 1) 
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    omd stop monitoring &>/dev/null
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								ct/cosmos.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								ct/cosmos.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: Michel Roegl-Brunner (michelroegl-brunner)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://https://cosmos-cloud.io/
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="cosmos"
 | 
			
		||||
var_tags="os,docker"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="8"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/cosmos ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_ok "${APP} updates itself automatically!"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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}"
 | 
			
		||||
							
								
								
									
										90
									
								
								ct/crafty-controller.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								ct/crafty-controller.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts
 | 
			
		||||
# Author: CrazyWolf13
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Crafty-Controller"
 | 
			
		||||
var_tags="gaming"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="4096"
 | 
			
		||||
var_disk="16"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/crafty-controller ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
   
 | 
			
		||||
    RELEASE=$(curl -s "https://gitlab.com/api/v4/projects/20430749/releases" | grep -o '"tag_name":"v[^"]*"' | head -n 1 | sed 's/"tag_name":"v//;s/"//')
 | 
			
		||||
    if [[ ! -f /opt/crafty-controller_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/crafty-controller_version.txt)" ]]; then
 | 
			
		||||
      
 | 
			
		||||
      msg_info "Stopping Crafty-Controller"
 | 
			
		||||
      systemctl stop crafty-controller
 | 
			
		||||
      msg_ok "Stopped Crafty-Controller"
 | 
			
		||||
 | 
			
		||||
      msg_info "Creating Backup of config"
 | 
			
		||||
      cp -a /opt/crafty-controller/crafty/crafty-4/app/config/. /opt/crafty-controller/backup
 | 
			
		||||
      rm /opt/crafty-controller/backup/version.json
 | 
			
		||||
      rm /opt/crafty-controller/backup/credits.json
 | 
			
		||||
      rm /opt/crafty-controller/backup/logging.json
 | 
			
		||||
      rm /opt/crafty-controller/backup/default.json.example
 | 
			
		||||
      rm /opt/crafty-controller/backup/motd_format.json
 | 
			
		||||
      msg_ok "Backup Created"
 | 
			
		||||
      
 | 
			
		||||
      msg_info "Updating Crafty-Controller to v${RELEASE}"
 | 
			
		||||
      wget -q "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip"
 | 
			
		||||
      unzip -q crafty-4-v${RELEASE}.zip
 | 
			
		||||
      cp -a crafty-4-v${RELEASE}/. /opt/crafty-controller/crafty/crafty-4/
 | 
			
		||||
      rm -rf crafty-4-v${RELEASE}
 | 
			
		||||
      cd /opt/crafty-controller/crafty/crafty-4
 | 
			
		||||
      sudo -u crafty bash -c '
 | 
			
		||||
        source /opt/crafty-controller/crafty/.venv/bin/activate
 | 
			
		||||
        pip3 install --no-cache-dir -r requirements.txt
 | 
			
		||||
      ' &>/dev/null
 | 
			
		||||
      echo "${RELEASE}" >"/opt/crafty-controller_version.txt"
 | 
			
		||||
      msg_ok "Updated Crafty-Controller to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
      msg_info "Restoring Backup of config"
 | 
			
		||||
      cp -a /opt/crafty-controller/backup/. /opt/crafty-controller/crafty/crafty-4/app/config
 | 
			
		||||
      rm -rf /opt/crafty-controller/backup
 | 
			
		||||
      chown -R crafty:crafty /opt/crafty-controller/
 | 
			
		||||
      msg_ok "Backup Restored"
 | 
			
		||||
 | 
			
		||||
      msg_info "Starting Crafty-Controller"
 | 
			
		||||
      systemctl start crafty-controller
 | 
			
		||||
      msg_ok "Started Crafty-Controller"
 | 
			
		||||
 | 
			
		||||
      msg_ok "Updated Successfully"
 | 
			
		||||
      exit
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. Crafty-Controller is already at v${RELEASE}."
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8443${CL}"
 | 
			
		||||
@@ -43,6 +43,7 @@ function error_handler() {
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  exit 200
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function displays a spinner.
 | 
			
		||||
@@ -112,7 +113,7 @@ function select_storage() {
 | 
			
		||||
    CONTENT='vztmpl'
 | 
			
		||||
    CONTENT_LABEL='Container template'
 | 
			
		||||
    ;;
 | 
			
		||||
  *) false || exit "Invalid storage class." ;;
 | 
			
		||||
  *) false || { msg_error "Invalid storage class."; exit 201; };
 | 
			
		||||
  esac
 | 
			
		||||
  
 | 
			
		||||
  # This Queries all storage locations
 | 
			
		||||
@@ -138,7 +139,7 @@ function select_storage() {
 | 
			
		||||
      STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \
 | 
			
		||||
      "Which storage pool you would like to use for the ${CONTENT_LABEL,,}?\nTo make a selection, use the Spacebar.\n" \
 | 
			
		||||
      16 $(($MSG_MAX_LENGTH + 23)) 6 \
 | 
			
		||||
      "${MENU[@]}" 3>&1 1>&2 2>&3) || exit "Menu aborted."
 | 
			
		||||
      "${MENU[@]}" 3>&1 1>&2 2>&3) || { msg_error "Menu aborted."; exit 202; }
 | 
			
		||||
      if [ $? -ne 0 ]; then
 | 
			
		||||
        echo -e "${CROSS}${RD} Menu aborted by user.${CL}"
 | 
			
		||||
        exit 0 
 | 
			
		||||
@@ -148,17 +149,18 @@ function select_storage() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
# Test if required variables are set
 | 
			
		||||
[[ "${CTID:-}" ]] || exit "You need to set 'CTID' variable."
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || exit "You need to set 'PCT_OSTYPE' variable."
 | 
			
		||||
[[ "${CTID:-}" ]] || { msg_error "You need to set 'CTID' variable."; exit 203; }
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || { msg_error "You need to set 'PCT_OSTYPE' variable."; exit 204; }
 | 
			
		||||
 | 
			
		||||
# Test if ID is valid
 | 
			
		||||
[ "$CTID" -ge "100" ] || exit "ID cannot be less than 100."
 | 
			
		||||
[ "$CTID" -ge "100" ] || { msg_error "ID cannot be less than 100."; exit 205; }
 | 
			
		||||
 | 
			
		||||
# Test if ID is in use
 | 
			
		||||
if pct status $CTID &>/dev/null; then
 | 
			
		||||
  echo -e "ID '$CTID' is already in use."
 | 
			
		||||
  unset CTID
 | 
			
		||||
  exit "Cannot use ID that is already in use."
 | 
			
		||||
  msg_error "Cannot use ID that is already in use."
 | 
			
		||||
  exit 206
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Get template storage
 | 
			
		||||
@@ -177,26 +179,40 @@ msg_ok "Updated LXC Template List"
 | 
			
		||||
# Get LXC template string
 | 
			
		||||
TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-}
 | 
			
		||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V)
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || exit "Unable to find a template when searching for '$TEMPLATE_SEARCH'."
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || { msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'."; exit 207; }
 | 
			
		||||
TEMPLATE="${TEMPLATES[-1]}"
 | 
			
		||||
 | 
			
		||||
# Download LXC template if needed
 | 
			
		||||
if ! pveam list $TEMPLATE_STORAGE | grep -q $TEMPLATE; then
 | 
			
		||||
TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
			
		||||
# Check if template exists, if corrupt remove and redownload
 | 
			
		||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
 | 
			
		||||
  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
  msg_info "Downloading LXC Template"
 | 
			
		||||
  pveam download $TEMPLATE_STORAGE $TEMPLATE >/dev/null ||
 | 
			
		||||
    exit "A problem occured while downloading the LXC template."
 | 
			
		||||
  pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
 | 
			
		||||
    { msg_error "A problem occurred while downloading the LXC template."; exit 208; }
 | 
			
		||||
  msg_ok "Downloaded LXC Template"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Check and fix subuid/subgid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >> /etc/subuid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >> /etc/subgid
 | 
			
		||||
 | 
			
		||||
# Combine all options
 | 
			
		||||
DEFAULT_PCT_OPTIONS=(
 | 
			
		||||
  -arch $(dpkg --print-architecture))
 | 
			
		||||
 | 
			
		||||
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
 | 
			
		||||
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs $CONTAINER_STORAGE:${PCT_DISK_SIZE:-8})
 | 
			
		||||
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}")
 | 
			
		||||
 | 
			
		||||
# Create container
 | 
			
		||||
# Create container with template integrity check
 | 
			
		||||
msg_info "Creating LXC Container"
 | 
			
		||||
pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} ${PCT_OPTIONS[@]} >/dev/null ||
 | 
			
		||||
  exit "A problem occured while trying to create container."
 | 
			
		||||
  if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
      [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
      
 | 
			
		||||
    msg_ok "Template integrity check completed"
 | 
			
		||||
    pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||    
 | 
			
		||||
      { msg_error "A problem occurred while re-downloading the LXC template."; exit 208; }
 | 
			
		||||
    
 | 
			
		||||
    msg_ok "Re-downloaded LXC Template"
 | 
			
		||||
    if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
        msg_error "A problem occurred while trying to create container after re-downloading template."
 | 
			
		||||
      exit 200
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
msg_ok "LXC Container ${BL}$CTID${CL} ${GN}was successfully created."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										65
									
								
								ct/duplicati.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								ct/duplicati.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/duplicati/duplicati/
 | 
			
		||||
 | 
			
		||||
APP="Duplicati"
 | 
			
		||||
TAGS="backup"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
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 /usr/bin/duplicati-server ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/duplicati/duplicati/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 duplicati
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        wget -q "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb"
 | 
			
		||||
        $STD dpkg -i duplicati-${RELEASE}-linux-x64-gui.deb
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start duplicati
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf ~/duplicati-${RELEASE}-linux-x64-gui.deb
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
        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}:8200${CL}"
 | 
			
		||||
							
								
								
									
										46
									
								
								ct/freshrss.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								ct/freshrss.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#!/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/FreshRSS/FreshRSS
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="FreshRSS"
 | 
			
		||||
var_tags="RSS"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/freshrss ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_error "FreshRSS should be updated via the user interface."
 | 
			
		||||
    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}"
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/apache-tika
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/apache-tika
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ___                     __             _______ __        
 | 
			
		||||
   /   |  ____  ____ ______/ /_  ___      /_  __(_) /______ _
 | 
			
		||||
  / /| | / __ \/ __ `/ ___/ __ \/ _ \______/ / / / //_/ __ `/
 | 
			
		||||
 / ___ |/ /_/ / /_/ / /__/ / / /  __/_____/ / / / ,< / /_/ / 
 | 
			
		||||
/_/  |_/ .___/\__,_/\___/_/ /_/\___/     /_/ /_/_/|_|\__,_/  
 | 
			
		||||
      /_/                                                    
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/barcode-buddy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/barcode-buddy
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____                            __           ____            __    __     
 | 
			
		||||
   / __ )____ _______________  ____/ /__        / __ )__  ______/ /___/ /_  __
 | 
			
		||||
  / __  / __ `/ ___/ ___/ __ \/ __  / _ \______/ __  / / / / __  / __  / / / /
 | 
			
		||||
 / /_/ / /_/ / /  / /__/ /_/ / /_/ /  __/_____/ /_/ / /_/ / /_/ / /_/ / /_/ / 
 | 
			
		||||
/_____/\__,_/_/   \___/\____/\__,_/\___/     /_____/\__,_/\__,_/\__,_/\__, /  
 | 
			
		||||
                                                                     /____/   
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/cosmos
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/cosmos
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
                                       
 | 
			
		||||
  _________  _________ ___  ____  _____
 | 
			
		||||
 / ___/ __ \/ ___/ __ `__ \/ __ \/ ___/
 | 
			
		||||
/ /__/ /_/ (__  ) / / / / / /_/ (__  ) 
 | 
			
		||||
\___/\____/____/_/ /_/ /_/\____/____/  
 | 
			
		||||
                                       
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/crafty-controller
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/crafty-controller
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
   ______           ______              ______            __             ____         
 | 
			
		||||
  / ____/________ _/ __/ /___  __      / ____/___  ____  / /__________  / / /__  _____
 | 
			
		||||
 / /   / ___/ __ `/ /_/ __/ / / /_____/ /   / __ \/ __ \/ __/ ___/ __ \/ / / _ \/ ___/
 | 
			
		||||
/ /___/ /  / /_/ / __/ /_/ /_/ /_____/ /___/ /_/ / / / / /_/ /  / /_/ / / /  __/ /    
 | 
			
		||||
\____/_/   \__,_/_/  \__/\__, /      \____/\____/_/ /_/\__/_/   \____/_/_/\___/_/     
 | 
			
		||||
                        /____/                                                        
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/duplicati
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/duplicati
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____              ___            __  _ 
 | 
			
		||||
   / __ \__  ______  / (_)________ _/ /_(_)
 | 
			
		||||
  / / / / / / / __ \/ / / ___/ __ `/ __/ / 
 | 
			
		||||
 / /_/ / /_/ / /_/ / / / /__/ /_/ / /_/ /  
 | 
			
		||||
/_____/\__,_/ .___/_/_/\___/\__,_/\__/_/   
 | 
			
		||||
           /_/                             
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/freshrss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/freshrss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ______               __    ____  __________
 | 
			
		||||
   / ____/_______  _____/ /_  / __ \/ ___/ ___/
 | 
			
		||||
  / /_  / ___/ _ \/ ___/ __ \/ /_/ /\__ \\__ \ 
 | 
			
		||||
 / __/ / /  /  __(__  ) / / / _, _/___/ /__/ / 
 | 
			
		||||
/_/   /_/   \___/____/_/ /_/_/ |_|/____/____/  
 | 
			
		||||
                                               
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/koillection
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/koillection
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    __ __      _ ____          __  _           
 | 
			
		||||
   / //_/___  (_) / /__  _____/ /_(_)___  ____ 
 | 
			
		||||
  / ,< / __ \/ / / / _ \/ ___/ __/ / __ \/ __ \
 | 
			
		||||
 / /| / /_/ / / / /  __/ /__/ /_/ / /_/ / / / /
 | 
			
		||||
/_/ |_\____/_/_/_/\___/\___/\__/_/\____/_/ /_/ 
 | 
			
		||||
                                               
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/paperless-ai
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/paperless-ai
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____                        __                     ___    ____
 | 
			
		||||
   / __ \____ _____  ___  _____/ /__  __________      /   |  /  _/
 | 
			
		||||
  / /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/ /| |  / /  
 | 
			
		||||
 / ____/ /_/ / /_/ /  __/ /  / /  __(__  |__  )_____/ ___ |_/ /   
 | 
			
		||||
/_/    \__,_/ .___/\___/_/  /_/\___/____/____/     /_/  |_/___/   
 | 
			
		||||
           /_/                                                    
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/prometheus-paperless-ngx-exporter
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/prometheus-paperless-ngx-exporter
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____                            __  __                          ____                        __                     _   _________  __      ______                      __           
 | 
			
		||||
   / __ \_________  ____ ___  ___  / /_/ /_  ___  __  _______      / __ \____ _____  ___  _____/ /__  __________      / | / / ____/ |/ /     / ____/  ______  ____  _____/ /____  _____
 | 
			
		||||
  / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/  |/ / / __ |   /_____/ __/ | |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
 | 
			
		||||
 / ____/ /  / /_/ / / / / / /  __/ /_/ / / /  __/ /_/ (__  )_____/ ____/ /_/ / /_/ /  __/ /  / /  __(__  |__  )_____/ /|  / /_/ //   /_____/ /____>  </ /_/ / /_/ / /  / /_/  __/ /    
 | 
			
		||||
/_/   /_/   \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/     /_/    \__,_/ .___/\___/_/  /_/\___/____/____/     /_/ |_/\____//_/|_|    /_____/_/|_/ .___/\____/_/   \__/\___/_/     
 | 
			
		||||
                                                                           /_/                                                                      /_/                                
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/proxmox-mail-gateway
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/proxmox-mail-gateway
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____                                             __  ___      _ __      ______      __                          
 | 
			
		||||
   / __ \_________  _  ______ ___  ____  _  __      /  |/  /___ _(_) /     / ____/___ _/ /____ _      ______ ___  __
 | 
			
		||||
  / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/_____/ /|_/ / __ `/ / /_____/ / __/ __ `/ __/ _ \ | /| / / __ `/ / / /
 | 
			
		||||
 / ____/ /  / /_/ />  </ / / / / / /_/ />  </_____/ /  / / /_/ / / /_____/ /_/ / /_/ / /_/  __/ |/ |/ / /_/ / /_/ / 
 | 
			
		||||
/_/   /_/   \____/_/|_/_/ /_/ /_/\____/_/|_|     /_/  /_/\__,_/_/_/      \____/\__,_/\__/\___/|__/|__/\__,_/\__, /  
 | 
			
		||||
                                                                                                           /____/   
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/radicale
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/radicale
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____            ___            __   
 | 
			
		||||
   / __ \____ _____/ (_)________ _/ /__ 
 | 
			
		||||
  / /_/ / __ `/ __  / / ___/ __ `/ / _ \
 | 
			
		||||
 / _, _/ /_/ / /_/ / / /__/ /_/ / /  __/
 | 
			
		||||
/_/ |_|\__,_/\__,_/_/\___/\__,_/_/\___/ 
 | 
			
		||||
                                        
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/searxng
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/searxng
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
   _____                _  __ _   ________
 | 
			
		||||
  / ___/___  ____ _____| |/ // | / / ____/
 | 
			
		||||
  \__ \/ _ \/ __ `/ ___/   //  |/ / / __  
 | 
			
		||||
 ___/ /  __/ /_/ / /  /   |/ /|  / /_/ /  
 | 
			
		||||
/____/\___/\__,_/_/  /_/|_/_/ |_/\____/   
 | 
			
		||||
                                          
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/seelf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/seelf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
                   ______
 | 
			
		||||
   ________  ___  / / __/
 | 
			
		||||
  / ___/ _ \/ _ \/ / /_  
 | 
			
		||||
 (__  )  __/  __/ / __/  
 | 
			
		||||
/____/\___/\___/_/_/     
 | 
			
		||||
                         
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/suwayomiserver
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/suwayomiserver
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
   _____                                            _      _____                          
 | 
			
		||||
  / ___/__  ___      ______ ___  ______  ____ ___  (_)    / ___/___  ______   _____  _____
 | 
			
		||||
  \__ \/ / / / | /| / / __ `/ / / / __ \/ __ `__ \/ /_____\__ \/ _ \/ ___/ | / / _ \/ ___/
 | 
			
		||||
 ___/ / /_/ /| |/ |/ / /_/ / /_/ / /_/ / / / / / / /_____/__/ /  __/ /   | |/ /  __/ /    
 | 
			
		||||
/____/\__,_/ |__/|__/\__,_/\__, /\____/_/ /_/ /_/_/     /____/\___/_/    |___/\___/_/     
 | 
			
		||||
                          /____/                                                          
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/watcharr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/watcharr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
 _       __      __       __                   
 | 
			
		||||
| |     / /___ _/ /______/ /_  ____ ___________
 | 
			
		||||
| | /| / / __ `/ __/ ___/ __ \/ __ `/ ___/ ___/
 | 
			
		||||
| |/ |/ / /_/ / /_/ /__/ / / / /_/ / /  / /    
 | 
			
		||||
|__/|__/\__,_/\__/\___/_/ /_/\__,_/_/  /_/     
 | 
			
		||||
                                               
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/zerotier-one
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/zerotier-one
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
 _____                   __  _                 ____           
 | 
			
		||||
/__  /  ___  _________  / /_(_)__  _____      / __ \____  ___ 
 | 
			
		||||
  / /  / _ \/ ___/ __ \/ __/ / _ \/ ___/_____/ / / / __ \/ _ \
 | 
			
		||||
 / /__/  __/ /  / /_/ / /_/ /  __/ /  /_____/ /_/ / / / /  __/
 | 
			
		||||
/____/\___/_/   \____/\__/_/\___/_/         \____/_/ /_/\___/ 
 | 
			
		||||
                                                              
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/zitadel
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/zitadel
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
 _____   _ __            __     __
 | 
			
		||||
/__  /  (_) /_____ _____/ /__  / /
 | 
			
		||||
  / /  / / __/ __ `/ __  / _ \/ / 
 | 
			
		||||
 / /__/ / /_/ /_/ / /_/ /  __/ /  
 | 
			
		||||
/____/_/\__/\__,_/\__,_/\___/_/   
 | 
			
		||||
                                  
 | 
			
		||||
@@ -49,7 +49,7 @@ function update_script() {
 | 
			
		||||
      LATEST_IMAGE="$(docker inspect --format "{{.Id}}" --type image "${CONTAINER_IMAGE}")"
 | 
			
		||||
      if [[ "${RUNNING_IMAGE}" != "${LATEST_IMAGE}" ]]; then
 | 
			
		||||
        echo "Updating ${container} image ${CONTAINER_IMAGE}"
 | 
			
		||||
        DOCKER_COMMAND="$(runlike "${container}")"
 | 
			
		||||
        DOCKER_COMMAND="$(runlike --use-volume-id "${container}")"
 | 
			
		||||
        docker rm --force "${container}"
 | 
			
		||||
        eval ${DOCKER_COMMAND}
 | 
			
		||||
      fi
 | 
			
		||||
@@ -113,4 +113,4 @@ 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}HA: http://${IP}:8123${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}Portainer: http://${IP}:9443${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}Portainer: http://${IP}:9443${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -50,17 +50,23 @@ function update_script() {
 | 
			
		||||
        msg_ok "Cleaning up"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if ! command -v pnpm &> /dev/null; then
 | 
			
		||||
        msg_error "pnpm not found. Installing..."
 | 
			
		||||
        npm install -g pnpm &>/dev/null
 | 
			
		||||
    cd /opt/jellyseerr
 | 
			
		||||
    output=$(git pull --no-rebase)
 | 
			
		||||
 | 
			
		||||
    pnpm_current=$(pnpm --version 2>/dev/null)
 | 
			
		||||
    pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json)
 | 
			
		||||
    
 | 
			
		||||
    if [ -z "$pnpm_current" ]; then
 | 
			
		||||
        msg_error "pnpm not found. Installing version $pnpm_desired..."
 | 
			
		||||
        npm install -g pnpm@"$pnpm_desired" &>/dev/null
 | 
			
		||||
    elif ! node -e "const semver = require('semver'); process.exit(semver.satisfies('$pnpm_current', '$pnpm_desired') ? 0 : 1)" ; then
 | 
			
		||||
        msg_error "Updating pnpm from version $pnpm_current to $pnpm_desired..."
 | 
			
		||||
        npm install -g pnpm@"$pnpm_desired" &>/dev/null
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "pnpm is already installed."
 | 
			
		||||
        msg_ok "pnpm is already installed and satisfies version $pnpm_desired."
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP"
 | 
			
		||||
    cd /opt/jellyseerr
 | 
			
		||||
    output=$(git pull --no-rebase)
 | 
			
		||||
    
 | 
			
		||||
    if echo "$output" | grep -q "Already up to date."; then
 | 
			
		||||
        msg_ok "$APP is already up to date."
 | 
			
		||||
        exit
 | 
			
		||||
@@ -102,4 +108,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										83
									
								
								ct/koillection.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								ct/koillection.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
#!/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://koillection.github.io/
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Koillection"
 | 
			
		||||
var_tags="network"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="8"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/koillection ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/benjaminjonard/koillection/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    systemctl stop apache2
 | 
			
		||||
    msg_ok "Stopped Service"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    mv /opt/koillection/ /opt/koillection-backup
 | 
			
		||||
    wget -q "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip"
 | 
			
		||||
    unzip -q "${RELEASE}.zip"
 | 
			
		||||
    mv "/opt/koillection-${RELEASE}" /opt/koillection
 | 
			
		||||
    cd /opt/koillection
 | 
			
		||||
    cp -r /opt/koillection-backup/.env.local /opt/koillection
 | 
			
		||||
    cp -r /opt/koillection-backup/public/uploads/. /opt/koillection/public/uploads/
 | 
			
		||||
    export COMPOSER_ALLOW_SUPERUSER=1
 | 
			
		||||
    composer install --no-dev -o --no-interaction --classmap-authoritative &>/dev/null
 | 
			
		||||
    php bin/console doctrine:migrations:migrate --no-interaction &>/dev/null
 | 
			
		||||
    php bin/console app:translations:dump &>/dev/null
 | 
			
		||||
    cd assets/
 | 
			
		||||
    yarn install &>/dev/null
 | 
			
		||||
    yarn build &>/dev/null
 | 
			
		||||
    chown -R www-data:www-data /opt/koillection/public/uploads
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start apache2
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning up"
 | 
			
		||||
    rm -r "/opt/${RELEASE}.zip"
 | 
			
		||||
    rm -r /opt/koillection-backup
 | 
			
		||||
    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}"
 | 
			
		||||
							
								
								
									
										75
									
								
								ct/paperless-ai.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								ct/paperless-ai.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: MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/clusterzx/paperless-ai
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Paperless-AI"
 | 
			
		||||
var_tags="ai;document"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="5"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/paperless-ai ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/clusterzx/paperless-ai/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 paperless-ai
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    mv /opt/paperless-ai /opt/paperless-ai_bak
 | 
			
		||||
    wget -q "https://github.com/clusterzx/paperless-ai/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
    unzip -q v${RELEASE}.zip
 | 
			
		||||
    mv paperless-ai-${RELEASE} /opt/paperless-ai
 | 
			
		||||
    mkdir -p /opt/paperless-ai/data
 | 
			
		||||
    cp -a /opt/paperless-ai_bak/data/. /opt/paperless-ai/data/
 | 
			
		||||
    cd /opt/paperless-ai
 | 
			
		||||
    npm install &>/dev/null
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start paperless-ai
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf /opt/v${RELEASE}.zip
 | 
			
		||||
    rm -rf /opt/paperless-ai_bak
 | 
			
		||||
    msg_ok "Cleanup Completed"
 | 
			
		||||
    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}"
 | 
			
		||||
@@ -9,8 +9,8 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
APP="PeaNUT"
 | 
			
		||||
var_tags="network;ups;"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_ram="3072"
 | 
			
		||||
var_disk="7"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Snarkenfaugister
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/stonith404/pocket-id
 | 
			
		||||
# Source: https://github.com/pocket-id/pocket-id
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="PocketID"
 | 
			
		||||
@@ -34,7 +34,7 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/stonith404/pocket-id/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/pocket-id/pocket-id/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 "Updating $APP"
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +50,7 @@ function update_script() {
 | 
			
		||||
        cp /opt/pocket-id/backend/.env /opt/backend.env
 | 
			
		||||
        cp /opt/pocket-id/frontend/.env /opt/frontend.env
 | 
			
		||||
        rm -r /opt/pocket-id
 | 
			
		||||
        wget -q "https://github.com/stonith404/pocket-id/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
        wget -q "https://github.com/pocket-id/pocket-id/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
        unzip -q v${RELEASE}.zip
 | 
			
		||||
        mv pocket-id-${RELEASE} /opt/pocket-id
 | 
			
		||||
        mv /opt/data /opt/pocket-id/backend/data
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										67
									
								
								ct/prometheus-paperless-ngx-exporter.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										67
									
								
								ct/prometheus-paperless-ngx-exporter.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
#!/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: Andy Grunwald (andygrunwald)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/hansmi/prometheus-paperless-exporter
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Prometheus-Paperless-NGX-Exporter"
 | 
			
		||||
var_tags="monitoring;alerting"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="256"
 | 
			
		||||
var_disk="2"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -f /etc/systemd/system/prometheus-paperless-ngx-exporter.service ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/hansmi/prometheus-paperless-exporter/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop prometheus-paperless-ngx-exporter
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    wget -q https://github.com/hansmi/prometheus-paperless-exporter/releases/download/v${RELEASE}/prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
    tar -xf prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
    cp -rf prometheus-paperless-exporter_${RELEASE}_linux_amd64/prometheus-paperless-exporter /usr/local/bin/
 | 
			
		||||
    rm -rf prometheus-paperless-exporter_${RELEASE}_linux_amd64/ prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start prometheus-paperless-ngx-exporter
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
    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}:8081/metrics${CL}"
 | 
			
		||||
							
								
								
									
										43
									
								
								ct/proxmox-mail-gateway.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								ct/proxmox-mail-gateway.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 community-scripts ORG
 | 
			
		||||
# Author: thost96 (thost96)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://www.proxmox.com/en/products/proxmox-mail-gateway
 | 
			
		||||
 | 
			
		||||
APP="Proxmox-Mail-Gateway"
 | 
			
		||||
var_tags="mail"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="4096"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
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 [[ ! -e /usr/bin/pmgproxy ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
  apt-get update &>/dev/null
 | 
			
		||||
  apt-get -y upgrade &>/dev/null
 | 
			
		||||
  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}https://${IP}:8006/${CL}"
 | 
			
		||||
							
								
								
									
										56
									
								
								ct/radicale.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								ct/radicale.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://radicale.org/
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Radicale"
 | 
			
		||||
var_tags="calendar"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="512"
 | 
			
		||||
var_disk="2"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/radicale ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    python3 -m venv /opt/radicale
 | 
			
		||||
    source /opt/radicale/bin/activate
 | 
			
		||||
    python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl enable -q --now radicale
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
 | 
			
		||||
    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}:5232${CL}"
 | 
			
		||||
							
								
								
									
										47
									
								
								ct/searxng.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								ct/searxng.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
#!/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://github.com/searxng/searxng
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="SearXNG"
 | 
			
		||||
var_tags="search"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="7"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /usr/local/searxng/searxng-src ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
    if cd /usr/local/searxng/searxng-src && git pull | grep -q 'Already up to date'; then
 | 
			
		||||
    msg_ok "There is currently no update available."
 | 
			
		||||
  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}:8888${CL}"
 | 
			
		||||
							
								
								
									
										77
									
								
								ct/seelf.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								ct/seelf.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/YuukanOO/seelf
 | 
			
		||||
 | 
			
		||||
APP="seelf"
 | 
			
		||||
TAGS="server;docker"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="4096"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
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 [[ ! -d /opt/seelf ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/YuukanOO/seelf/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 "Updating $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop seelf
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}. Patience"
 | 
			
		||||
        export PATH=$PATH:/usr/local/go/bin
 | 
			
		||||
        source ~/.bashrc
 | 
			
		||||
        wget -q "https://github.com/YuukanOO/seelf/archive/refs/tags/v${RELEASE}.tar.gz"
 | 
			
		||||
        tar -xzf v${RELEASE}.tar.gz
 | 
			
		||||
        cp -r seelf-${RELEASE}/ /opt/seelf
 | 
			
		||||
        cd /opt/seelf
 | 
			
		||||
        make build &> /dev/null
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start seelf
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        # Cleaning up
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -f ~/*.tar.gz
 | 
			
		||||
        rm -rf ~/seelf-${RELEASE}
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    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}" 
 | 
			
		||||
							
								
								
									
										66
									
								
								ct/suwayomiserver.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								ct/suwayomiserver.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/Suwayomi/Suwayomi-Server
 | 
			
		||||
 | 
			
		||||
APP="Suwayomi-Server"
 | 
			
		||||
TAGS="media;manga"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
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 /usr/bin/suwayomi-server ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/suwayomi-server_version.txt)" ]] || [[ ! -f /opt/suwayomi-server_version.txt ]]; then
 | 
			
		||||
        msg_info "Updating $APP"
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop suwayomi-server
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        cd /tmp
 | 
			
		||||
        URL=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' |  tail -n+2 | head -n 1)
 | 
			
		||||
        wget -q $URL
 | 
			
		||||
        $STD dpkg -i /tmp/*.deb
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start suwayomi-server
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -f *.deb
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
        echo "${RELEASE}" >/opt/suwayomi-server_version.txt.txt
 | 
			
		||||
        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}:4567${CL}"
 | 
			
		||||
@@ -32,21 +32,30 @@ function update_script() {
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ ! -f /opt/${APP}_version.txt ]]; then touch /opt/${APP}_version.txt
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop trilium
 | 
			
		||||
    sleep 1
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating to ${RELEASE}"
 | 
			
		||||
    mkdir -p /opt/trilium_backup
 | 
			
		||||
    mv /opt/trilium/{db,dump-db} /opt/trilium_backup/
 | 
			
		||||
    rm -rf /opt/trilium
 | 
			
		||||
    cd /tmp
 | 
			
		||||
    wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-linux-x64-${RELEASE}.tar.xz
 | 
			
		||||
    tar -xf TriliumNextNotes-linux-x64-${RELEASE}.tar.xz
 | 
			
		||||
    cp -r trilium-linux-x64-server/* /opt/trilium/
 | 
			
		||||
    mv trilium-linux-x64-server /opt/trilium
 | 
			
		||||
    cp -r /opt/trilium_backup/{db,dump-db} /opt/trilium/
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated to ${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning up"
 | 
			
		||||
    rm -rf TriliumNextNotes-linux-x64-${RELEASE}.tar.xz trilium-linux-x64-server
 | 
			
		||||
    rm -rf /tmp/TriliumNextNotes-linux-x64-${RELEASE}.tar.xz 
 | 
			
		||||
    rm -rf /opt/trilium_backup
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
@@ -54,7 +63,10 @@ function update_script() {
 | 
			
		||||
    sleep 1
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
    exit
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										80
									
								
								ct/watcharr.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								ct/watcharr.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Slaviša Arežina (tremor021)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/sbondCo/Watcharr
 | 
			
		||||
 | 
			
		||||
APP="Watcharr"
 | 
			
		||||
TAGS="media"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
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 [[ ! -d /opt/watcharr ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/sbondCo/Watcharr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
        msg_info "Updating $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop watcharr
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        temp_file=$(mktemp)
 | 
			
		||||
        wget -q "https://github.com/sbondCo/Watcharr/archive/refs/tags/v${RELEASE}.tar.gz" -O "$temp_file"
 | 
			
		||||
        tar -xzf "$temp_file"
 | 
			
		||||
        rm -f /opt/watcharr/server/watcharr
 | 
			
		||||
        rm -rf /opt/watcharr/server/ui
 | 
			
		||||
        mv Watcharr-${RELEASE}/ /opt/watcharr
 | 
			
		||||
        cd /opt/watcharr
 | 
			
		||||
        export GOOS=linux
 | 
			
		||||
        npm i &> /dev/null
 | 
			
		||||
        npm run build &> /dev/null
 | 
			
		||||
        mv ./build ./server/ui
 | 
			
		||||
        cd server
 | 
			
		||||
        go mod download
 | 
			
		||||
        go build -o ./watcharr
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start watcharr
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -f ${temp_file}
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    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}:3080${CL}"
 | 
			
		||||
							
								
								
									
										57
									
								
								ct/zerotier-one.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								ct/zerotier-one.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Zerotier-One"
 | 
			
		||||
var_tags="networking"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="512"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
 | 
			
		||||
    if [[ ! -f /usr/sbin/zerotier-one ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    systemctl stop zerotier-one
 | 
			
		||||
    msg_ok "Stopping Service"
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start zerotier-one
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    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 IP:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:3443${CL}"
 | 
			
		||||
							
								
								
									
										70
									
								
								ct/zitadel.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								ct/zitadel.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
#!/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: dave-yap (dave-yap)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://zitadel.com/
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Zitadel"
 | 
			
		||||
var_tags="identity-provider"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="8"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -f /etc/systemd/system/zitadel.service ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -si https://github.com/zitadel/zitadel/releases/latest | grep location: | cut -d '/' -f 8 | tr -d '\r')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt | grep -oP '\d+\.\d+\.\d+')" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop zitadel
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
        
 | 
			
		||||
        msg_info "Updating $APP to ${RELEASE}"
 | 
			
		||||
        cd /tmp
 | 
			
		||||
        wget -qc https://github.com/zitadel/zitadel/releases/download/$RELEASE/zitadel-linux-amd64.tar.gz -O - | tar -xz
 | 
			
		||||
        mv zitadel-linux-amd64/zitadel /usr/local/bin
 | 
			
		||||
        zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml --init-projections=true &>/dev/null
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Updated $APP to ${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start zitadel
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf /tmp/zitadel-linux-amd64
 | 
			
		||||
        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/ui/console${CL}"
 | 
			
		||||
							
								
								
									
										428
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										428
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -72,7 +72,7 @@
 | 
			
		||||
        "tailwindcss-animated": "^1.1.2",
 | 
			
		||||
        "typescript": "^5",
 | 
			
		||||
        "vite-tsconfig-paths": "^5.1.3",
 | 
			
		||||
        "vitest": "^2.1.6"
 | 
			
		||||
        "vitest": "^2.1.9"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@alloc/quick-lru": {
 | 
			
		||||
@@ -471,9 +471,9 @@
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/aix-ppc64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "ppc64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -484,13 +484,13 @@
 | 
			
		||||
        "aix"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/android-arm": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -501,13 +501,13 @@
 | 
			
		||||
        "android"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/android-arm64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -518,13 +518,13 @@
 | 
			
		||||
        "android"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/android-x64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -535,13 +535,13 @@
 | 
			
		||||
        "android"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/darwin-arm64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -552,13 +552,13 @@
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/darwin-x64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -569,13 +569,13 @@
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/freebsd-arm64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -586,13 +586,13 @@
 | 
			
		||||
        "freebsd"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/freebsd-x64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -603,13 +603,13 @@
 | 
			
		||||
        "freebsd"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-arm": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -620,13 +620,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-arm64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -637,13 +637,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-ia32": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "ia32"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -654,13 +654,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-loong64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "loong64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -671,13 +671,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-mips64el": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "mips64el"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -688,13 +688,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-ppc64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "ppc64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -705,13 +705,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-riscv64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "riscv64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -722,13 +722,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-s390x": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "s390x"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -739,13 +739,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/linux-x64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -756,30 +756,13 @@
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/netbsd-arm64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "netbsd"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/netbsd-x64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -790,30 +773,13 @@
 | 
			
		||||
        "netbsd"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/openbsd-arm64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "openbsd"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/openbsd-x64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -824,13 +790,13 @@
 | 
			
		||||
        "openbsd"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/sunos-x64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -841,13 +807,13 @@
 | 
			
		||||
        "sunos"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/win32-arm64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -858,13 +824,13 @@
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/win32-ia32": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "ia32"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -875,13 +841,13 @@
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@esbuild/win32-x64": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -892,7 +858,7 @@
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@eslint-community/eslint-utils": {
 | 
			
		||||
@@ -3204,7 +3170,7 @@
 | 
			
		||||
      "version": "19.0.0-rc.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/types-react/-/types-react-19.0.0-rc.1.tgz",
 | 
			
		||||
      "integrity": "sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "devOptional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "csstype": "^3.0.2"
 | 
			
		||||
      }
 | 
			
		||||
@@ -3214,7 +3180,7 @@
 | 
			
		||||
      "version": "19.0.0-rc.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/types-react-dom/-/types-react-dom-19.0.0-rc.1.tgz",
 | 
			
		||||
      "integrity": "sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "devOptional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@types/react": "*"
 | 
			
		||||
      }
 | 
			
		||||
@@ -3463,14 +3429,14 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@vitest/expect": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@vitest/spy": "2.1.6",
 | 
			
		||||
        "@vitest/utils": "2.1.6",
 | 
			
		||||
        "@vitest/spy": "2.1.9",
 | 
			
		||||
        "@vitest/utils": "2.1.9",
 | 
			
		||||
        "chai": "^5.1.2",
 | 
			
		||||
        "tinyrainbow": "^1.2.0"
 | 
			
		||||
      },
 | 
			
		||||
@@ -3479,13 +3445,13 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@vitest/mocker": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@vitest/spy": "2.1.6",
 | 
			
		||||
        "@vitest/spy": "2.1.9",
 | 
			
		||||
        "estree-walker": "^3.0.3",
 | 
			
		||||
        "magic-string": "^0.30.12"
 | 
			
		||||
      },
 | 
			
		||||
@@ -3494,7 +3460,7 @@
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "msw": "^2.4.9",
 | 
			
		||||
        "vite": "^5.0.0 || ^6.0.0"
 | 
			
		||||
        "vite": "^5.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "msw": {
 | 
			
		||||
@@ -3506,9 +3472,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@vitest/pretty-format": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
@@ -3519,13 +3485,13 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@vitest/runner": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@vitest/utils": "2.1.6",
 | 
			
		||||
        "@vitest/utils": "2.1.9",
 | 
			
		||||
        "pathe": "^1.1.2"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
@@ -3533,13 +3499,13 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@vitest/snapshot": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@vitest/pretty-format": "2.1.6",
 | 
			
		||||
        "@vitest/pretty-format": "2.1.9",
 | 
			
		||||
        "magic-string": "^0.30.12",
 | 
			
		||||
        "pathe": "^1.1.2"
 | 
			
		||||
      },
 | 
			
		||||
@@ -3548,9 +3514,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@vitest/spy": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
@@ -3561,13 +3527,13 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@vitest/utils": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@vitest/pretty-format": "2.1.6",
 | 
			
		||||
        "@vitest/pretty-format": "2.1.9",
 | 
			
		||||
        "loupe": "^3.1.2",
 | 
			
		||||
        "tinyrainbow": "^1.2.0"
 | 
			
		||||
      },
 | 
			
		||||
@@ -4829,9 +4795,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/es-module-lexer": {
 | 
			
		||||
      "version": "1.5.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
 | 
			
		||||
      "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
 | 
			
		||||
      "version": "1.6.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
@@ -4892,9 +4858,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/esbuild": {
 | 
			
		||||
      "version": "0.24.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
 | 
			
		||||
      "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
 | 
			
		||||
      "version": "0.21.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
 | 
			
		||||
      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "hasInstallScript": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
@@ -4902,34 +4868,32 @@
 | 
			
		||||
        "esbuild": "bin/esbuild"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18"
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@esbuild/aix-ppc64": "0.24.2",
 | 
			
		||||
        "@esbuild/android-arm": "0.24.2",
 | 
			
		||||
        "@esbuild/android-arm64": "0.24.2",
 | 
			
		||||
        "@esbuild/android-x64": "0.24.2",
 | 
			
		||||
        "@esbuild/darwin-arm64": "0.24.2",
 | 
			
		||||
        "@esbuild/darwin-x64": "0.24.2",
 | 
			
		||||
        "@esbuild/freebsd-arm64": "0.24.2",
 | 
			
		||||
        "@esbuild/freebsd-x64": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-arm": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-arm64": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-ia32": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-loong64": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-mips64el": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-ppc64": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-riscv64": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-s390x": "0.24.2",
 | 
			
		||||
        "@esbuild/linux-x64": "0.24.2",
 | 
			
		||||
        "@esbuild/netbsd-arm64": "0.24.2",
 | 
			
		||||
        "@esbuild/netbsd-x64": "0.24.2",
 | 
			
		||||
        "@esbuild/openbsd-arm64": "0.24.2",
 | 
			
		||||
        "@esbuild/openbsd-x64": "0.24.2",
 | 
			
		||||
        "@esbuild/sunos-x64": "0.24.2",
 | 
			
		||||
        "@esbuild/win32-arm64": "0.24.2",
 | 
			
		||||
        "@esbuild/win32-ia32": "0.24.2",
 | 
			
		||||
        "@esbuild/win32-x64": "0.24.2"
 | 
			
		||||
        "@esbuild/aix-ppc64": "0.21.5",
 | 
			
		||||
        "@esbuild/android-arm": "0.21.5",
 | 
			
		||||
        "@esbuild/android-arm64": "0.21.5",
 | 
			
		||||
        "@esbuild/android-x64": "0.21.5",
 | 
			
		||||
        "@esbuild/darwin-arm64": "0.21.5",
 | 
			
		||||
        "@esbuild/darwin-x64": "0.21.5",
 | 
			
		||||
        "@esbuild/freebsd-arm64": "0.21.5",
 | 
			
		||||
        "@esbuild/freebsd-x64": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-arm": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-arm64": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-ia32": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-loong64": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-mips64el": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-ppc64": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-riscv64": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-s390x": "0.21.5",
 | 
			
		||||
        "@esbuild/linux-x64": "0.21.5",
 | 
			
		||||
        "@esbuild/netbsd-x64": "0.21.5",
 | 
			
		||||
        "@esbuild/openbsd-x64": "0.21.5",
 | 
			
		||||
        "@esbuild/sunos-x64": "0.21.5",
 | 
			
		||||
        "@esbuild/win32-arm64": "0.21.5",
 | 
			
		||||
        "@esbuild/win32-ia32": "0.21.5",
 | 
			
		||||
        "@esbuild/win32-x64": "0.21.5"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/escalade": {
 | 
			
		||||
@@ -6945,9 +6909,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/loupe": {
 | 
			
		||||
      "version": "3.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
 | 
			
		||||
      "version": "3.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
@@ -6992,9 +6956,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/magic-string": {
 | 
			
		||||
      "version": "0.30.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz",
 | 
			
		||||
      "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==",
 | 
			
		||||
      "version": "0.30.17",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
 | 
			
		||||
      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
@@ -7805,7 +7769,6 @@
 | 
			
		||||
      "version": "3.3.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
 | 
			
		||||
      "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "prettier": "bin/prettier.cjs"
 | 
			
		||||
@@ -9508,7 +9471,6 @@
 | 
			
		||||
      "version": "5.6.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
 | 
			
		||||
      "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "tsc": "bin/tsc",
 | 
			
		||||
@@ -9642,21 +9604,21 @@
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/vite": {
 | 
			
		||||
      "version": "6.0.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz",
 | 
			
		||||
      "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==",
 | 
			
		||||
      "version": "5.4.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz",
 | 
			
		||||
      "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "esbuild": "^0.24.2",
 | 
			
		||||
        "postcss": "^8.4.49",
 | 
			
		||||
        "rollup": "^4.23.0"
 | 
			
		||||
        "esbuild": "^0.21.3",
 | 
			
		||||
        "postcss": "^8.4.43",
 | 
			
		||||
        "rollup": "^4.20.0"
 | 
			
		||||
      },
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "vite": "bin/vite.js"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
 | 
			
		||||
        "node": "^18.0.0 || >=20.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/vitejs/vite?sponsor=1"
 | 
			
		||||
@@ -9665,25 +9627,19 @@
 | 
			
		||||
        "fsevents": "~2.3.3"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
 | 
			
		||||
        "jiti": ">=1.21.0",
 | 
			
		||||
        "@types/node": "^18.0.0 || >=20.0.0",
 | 
			
		||||
        "less": "*",
 | 
			
		||||
        "lightningcss": "^1.21.0",
 | 
			
		||||
        "sass": "*",
 | 
			
		||||
        "sass-embedded": "*",
 | 
			
		||||
        "stylus": "*",
 | 
			
		||||
        "sugarss": "*",
 | 
			
		||||
        "terser": "^5.16.0",
 | 
			
		||||
        "tsx": "^4.8.1",
 | 
			
		||||
        "yaml": "^2.4.2"
 | 
			
		||||
        "terser": "^5.4.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@types/node": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "jiti": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "less": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
@@ -9704,19 +9660,13 @@
 | 
			
		||||
        },
 | 
			
		||||
        "terser": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "tsx": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "yaml": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/vite-node": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
@@ -9724,13 +9674,13 @@
 | 
			
		||||
        "debug": "^4.3.7",
 | 
			
		||||
        "es-module-lexer": "^1.5.4",
 | 
			
		||||
        "pathe": "^1.1.2",
 | 
			
		||||
        "vite": "^5.0.0 || ^6.0.0"
 | 
			
		||||
        "vite": "^5.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "vite-node": "vite-node.mjs"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
 | 
			
		||||
        "node": "^18.0.0 || >=20.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/vitest"
 | 
			
		||||
@@ -9757,19 +9707,19 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/vitest": {
 | 
			
		||||
      "version": "2.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ==",
 | 
			
		||||
      "version": "2.1.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz",
 | 
			
		||||
      "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@vitest/expect": "2.1.6",
 | 
			
		||||
        "@vitest/mocker": "2.1.6",
 | 
			
		||||
        "@vitest/pretty-format": "^2.1.6",
 | 
			
		||||
        "@vitest/runner": "2.1.6",
 | 
			
		||||
        "@vitest/snapshot": "2.1.6",
 | 
			
		||||
        "@vitest/spy": "2.1.6",
 | 
			
		||||
        "@vitest/utils": "2.1.6",
 | 
			
		||||
        "@vitest/expect": "2.1.9",
 | 
			
		||||
        "@vitest/mocker": "2.1.9",
 | 
			
		||||
        "@vitest/pretty-format": "^2.1.9",
 | 
			
		||||
        "@vitest/runner": "2.1.9",
 | 
			
		||||
        "@vitest/snapshot": "2.1.9",
 | 
			
		||||
        "@vitest/spy": "2.1.9",
 | 
			
		||||
        "@vitest/utils": "2.1.9",
 | 
			
		||||
        "chai": "^5.1.2",
 | 
			
		||||
        "debug": "^4.3.7",
 | 
			
		||||
        "expect-type": "^1.1.0",
 | 
			
		||||
@@ -9780,24 +9730,24 @@
 | 
			
		||||
        "tinyexec": "^0.3.1",
 | 
			
		||||
        "tinypool": "^1.0.1",
 | 
			
		||||
        "tinyrainbow": "^1.2.0",
 | 
			
		||||
        "vite": "^5.0.0 || ^6.0.0",
 | 
			
		||||
        "vite-node": "2.1.6",
 | 
			
		||||
        "vite": "^5.0.0",
 | 
			
		||||
        "vite-node": "2.1.9",
 | 
			
		||||
        "why-is-node-running": "^2.3.0"
 | 
			
		||||
      },
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "vitest": "vitest.mjs"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
 | 
			
		||||
        "node": "^18.0.0 || >=20.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/vitest"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@edge-runtime/vm": "*",
 | 
			
		||||
        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
 | 
			
		||||
        "@vitest/browser": "2.1.6",
 | 
			
		||||
        "@vitest/ui": "2.1.6",
 | 
			
		||||
        "@types/node": "^18.0.0 || >=20.0.0",
 | 
			
		||||
        "@vitest/browser": "2.1.9",
 | 
			
		||||
        "@vitest/ui": "2.1.9",
 | 
			
		||||
        "happy-dom": "*",
 | 
			
		||||
        "jsdom": "*"
 | 
			
		||||
      },
 | 
			
		||||
 
 | 
			
		||||
@@ -83,7 +83,7 @@
 | 
			
		||||
    "tailwindcss-animated": "^1.1.2",
 | 
			
		||||
    "typescript": "^5",
 | 
			
		||||
    "vite-tsconfig-paths": "^5.1.3",
 | 
			
		||||
    "vitest": "^2.1.6"
 | 
			
		||||
    "vitest": "^2.1.9"
 | 
			
		||||
  },
 | 
			
		||||
  "overrides": {
 | 
			
		||||
    "@types/react": "npm:types-react@19.0.0-rc.1",
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,8 @@ function InstallMethod({
 | 
			
		||||
            if (key === "type") {
 | 
			
		||||
              updatedMethod.script =
 | 
			
		||||
                value === "alpine"
 | 
			
		||||
                  ? `/${prev.type}/alpine-${prev.slug}.sh`
 | 
			
		||||
                  : `/${prev.type}/${prev.slug}.sh`;
 | 
			
		||||
                  ? `${prev.type}/alpine-${prev.slug}.sh`
 | 
			
		||||
                  : `${prev.type}/${prev.slug}.sh`;
 | 
			
		||||
 | 
			
		||||
              // Set OS to Alpine and reset version if type is alpine
 | 
			
		||||
              if (value === "alpine") {
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ import { fetchCategories } from "@/lib/data";
 | 
			
		||||
import { Category } from "@/lib/types";
 | 
			
		||||
import { cn } from "@/lib/utils";
 | 
			
		||||
import { format } from "date-fns";
 | 
			
		||||
import { CalendarIcon, Check, Clipboard } from "lucide-react";
 | 
			
		||||
import { CalendarIcon, Check, Clipboard, Download } from "lucide-react";
 | 
			
		||||
import { useCallback, useEffect, useMemo, useState } from "react";
 | 
			
		||||
import { toast } from "sonner";
 | 
			
		||||
import { z } from "zod";
 | 
			
		||||
@@ -76,8 +76,8 @@ export default function JSONGenerator() {
 | 
			
		||||
            ...method,
 | 
			
		||||
            script:
 | 
			
		||||
              method.type === "alpine"
 | 
			
		||||
                ? `/${updated.type}/alpine-${updated.slug}.sh`
 | 
			
		||||
                : `/${updated.type}/${updated.slug}.sh`,
 | 
			
		||||
                ? `${updated.type}/alpine-${updated.slug}.sh`
 | 
			
		||||
                : `${updated.type}/${updated.slug}.sh`,
 | 
			
		||||
          }));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -97,6 +97,21 @@ export default function JSONGenerator() {
 | 
			
		||||
    toast.success("Copied metadata to clipboard");
 | 
			
		||||
  }, [script]);
 | 
			
		||||
 | 
			
		||||
  const handleDownload = useCallback(() => {
 | 
			
		||||
    const jsonString = JSON.stringify(script, null, 2);
 | 
			
		||||
    const blob = new Blob([jsonString], { type: "application/json" });
 | 
			
		||||
    const url = URL.createObjectURL(blob);
 | 
			
		||||
  
 | 
			
		||||
    const a = document.createElement("a");
 | 
			
		||||
    a.href = url;
 | 
			
		||||
    a.download = `${script.slug || "script"}.json`;
 | 
			
		||||
    document.body.appendChild(a);
 | 
			
		||||
    a.click();
 | 
			
		||||
  
 | 
			
		||||
    URL.revokeObjectURL(url);
 | 
			
		||||
    document.body.removeChild(a);
 | 
			
		||||
  }, [script]);
 | 
			
		||||
 | 
			
		||||
  const handleDateSelect = useCallback(
 | 
			
		||||
    (date: Date | undefined) => {
 | 
			
		||||
      updateScript("date_created", format(date || new Date(), "yyyy-MM-dd"));
 | 
			
		||||
@@ -313,18 +328,23 @@ export default function JSONGenerator() {
 | 
			
		||||
      <div className="w-1/2 p-4 bg-background overflow-y-auto">
 | 
			
		||||
        {validationAlert}
 | 
			
		||||
        <div className="relative">
 | 
			
		||||
          <Button
 | 
			
		||||
            className="absolute right-2 top-2"
 | 
			
		||||
            size="icon"
 | 
			
		||||
            variant="outline"
 | 
			
		||||
            onClick={handleCopy}
 | 
			
		||||
          >
 | 
			
		||||
            {isCopied ? (
 | 
			
		||||
              <Check className="h-4 w-4" />
 | 
			
		||||
            ) : (
 | 
			
		||||
              <Clipboard className="h-4 w-4" />
 | 
			
		||||
            )}
 | 
			
		||||
          </Button>
 | 
			
		||||
          <div className="absolute right-2 top-2 flex gap-1">
 | 
			
		||||
            <Button
 | 
			
		||||
              size="icon"
 | 
			
		||||
              variant="outline"
 | 
			
		||||
              onClick={handleCopy}
 | 
			
		||||
            >
 | 
			
		||||
              {isCopied ? <Check className="h-4 w-4" /> : <Clipboard className="h-4 w-4" />}
 | 
			
		||||
            </Button>
 | 
			
		||||
            <Button
 | 
			
		||||
              size="icon"
 | 
			
		||||
              variant="outline"
 | 
			
		||||
              onClick={handleDownload}
 | 
			
		||||
            >
 | 
			
		||||
              <Download className="h-4 w-4" />
 | 
			
		||||
            </Button>
 | 
			
		||||
          </div>
 | 
			
		||||
        
 | 
			
		||||
          <pre className="mt-4 p-4 bg-secondary rounded shadow overflow-x-scroll">
 | 
			
		||||
            {JSON.stringify(script, null, 2)}
 | 
			
		||||
          </pre>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,41 @@
 | 
			
		||||
import { basePath } from "@/config/siteConfig";
 | 
			
		||||
import Link from "next/link";
 | 
			
		||||
import { FileJson, Server, ExternalLink } from "lucide-react";
 | 
			
		||||
import { buttonVariants } from "./ui/button";
 | 
			
		||||
import { cn } from "@/lib/utils";
 | 
			
		||||
 | 
			
		||||
export default function Footer() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="supports-backdrop-blur:bg-background/90 mt-auto flex border-t border-border bg-background/40 py-6 backdrop-blur-lg">
 | 
			
		||||
      <div className="flex w-full justify-between">
 | 
			
		||||
        <div className="mx-6 w-full max-w-7xl text-xs sm:text-sm text-muted-foreground">
 | 
			
		||||
          Website built by the community. The source code is avaliable on{" "}
 | 
			
		||||
    <div className="supports-backdrop-blur:bg-background/90 mt-auto border-t w-full flex justify-between border-border bg-background/40 py-6 backdrop-blur-lg">
 | 
			
		||||
      <div className="mx-6 w-full flex justify-between text-xs sm:text-sm text-muted-foreground">
 | 
			
		||||
        <div className="flex items-center">
 | 
			
		||||
          <p>
 | 
			
		||||
            Website built by the community. The source code is available on{" "}
 | 
			
		||||
            <Link
 | 
			
		||||
              href={`https://github.com/community-scripts/${basePath}`}
 | 
			
		||||
              target="_blank"
 | 
			
		||||
              rel="noreferrer"
 | 
			
		||||
              className="font-semibold underline-offset-2 duration-300 hover:underline"
 | 
			
		||||
              data-umami-event="View Website Source Code on Github"
 | 
			
		||||
            >
 | 
			
		||||
              GitHub
 | 
			
		||||
            </Link>
 | 
			
		||||
            .
 | 
			
		||||
          </p>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div className="sm:flex hidden">
 | 
			
		||||
          <Link
 | 
			
		||||
            href={`https://github.com/community-scripts/${basePath}`}
 | 
			
		||||
            target="_blank"
 | 
			
		||||
            rel="noreferrer"
 | 
			
		||||
            className="font-semibold underline-offset-2 duration-300 hover:underline"
 | 
			
		||||
            data-umami-event="View Website Source Code on Github"
 | 
			
		||||
            href="/json-editor"
 | 
			
		||||
            className={cn(buttonVariants({ variant: "link" }), "text-muted-foreground flex items-center gap-2")}
 | 
			
		||||
          >
 | 
			
		||||
            GitHub
 | 
			
		||||
            <FileJson className="h-4 w-4" /> JSON Editor
 | 
			
		||||
          </Link>
 | 
			
		||||
          <Link
 | 
			
		||||
            href="/data"
 | 
			
		||||
            className={cn(buttonVariants({ variant: "link" }), "text-muted-foreground flex items-center gap-2")}
 | 
			
		||||
          >
 | 
			
		||||
            <Server className="h-4 w-4" /> API Data
 | 
			
		||||
          </Link>
 | 
			
		||||
          .
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ $STD apt-get install -y \
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Apache Tomcat"
 | 
			
		||||
RELEASE=$(wget -qO- https://dlcdn.apache.org/tomcat/tomcat-9/ | grep -oP '(?<=href=")v[^"/]+(?=/")' | sed 's/^v//')
 | 
			
		||||
RELEASE=$(wget -qO- https://dlcdn.apache.org/tomcat/tomcat-9/ | grep -oP '(?<=href=")v[^"/]+(?=/")' | sed 's/^v//' | sort -V | tail -n1)
 | 
			
		||||
mkdir -p /opt/apache-guacamole/tomcat9
 | 
			
		||||
mkdir -p /opt/apache-guacamole/server
 | 
			
		||||
wget -qO- "https://dlcdn.apache.org/tomcat/tomcat-9/v${RELEASE}/bin/apache-tomcat-${RELEASE}.tar.gz" | tar -xz -C /opt/apache-guacamole/tomcat9 --strip-components=1
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										78
									
								
								install/apache-tika-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								install/apache-tika-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,78 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Andy Grunwald (andygrunwald)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/apache/tika/
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  software-properties-common \
 | 
			
		||||
  gdal-bin \
 | 
			
		||||
  tesseract-ocr \
 | 
			
		||||
  tesseract-ocr-eng \
 | 
			
		||||
  tesseract-ocr-ita \
 | 
			
		||||
  tesseract-ocr-fra \
 | 
			
		||||
  tesseract-ocr-spa \
 | 
			
		||||
  tesseract-ocr-deu
 | 
			
		||||
$STD echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  xfonts-utils \
 | 
			
		||||
  fonts-freefont-ttf \
 | 
			
		||||
  fonts-liberation \
 | 
			
		||||
  ttf-mscorefonts-installer \
 | 
			
		||||
  cabextract
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup OpenJDK"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  openjdk-17-jre-headless
 | 
			
		||||
msg_ok "Setup OpenJDK"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Apache Tika"
 | 
			
		||||
mkdir -p /opt/apache-tika
 | 
			
		||||
cd /opt/apache-tika
 | 
			
		||||
RELEASE="$(wget -qO- https://dlcdn.apache.org/tika/ | grep -oP '(?<=href=")[0-9]+\.[0-9]+\.[0-9]+(?=/")' | sort -V | tail -n1)"
 | 
			
		||||
wget -q "https://dlcdn.apache.org/tika/${RELEASE}/tika-server-standard-${RELEASE}.jar"
 | 
			
		||||
mv tika-server-standard-${RELEASE}.jar tika-server-standard.jar
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Installed Apache Tika"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/apache-tika.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Apache Tika
 | 
			
		||||
Documentation=https://tika.apache.org/
 | 
			
		||||
After=syslog.target network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
User=root
 | 
			
		||||
Restart=always
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=java -jar /opt/apache-tika/tika-server-standard.jar --host 0.0.0.0 --port 9998
 | 
			
		||||
ExecReload=/bin/kill -HUP \$MAINPID
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now apache-tika
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										81
									
								
								install/barcode-buddy-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								install/barcode-buddy-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: bvdberg01
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  apache2 \
 | 
			
		||||
  redis \
 | 
			
		||||
  php-{curl,date,json,mbstring,redis,sqlite3,sockets} \
 | 
			
		||||
  libapache2-mod-php
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing barcodebuddy"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/Forceu/barcodebuddy/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
cd /opt
 | 
			
		||||
wget -q "https://github.com/Forceu/barcodebuddy/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
unzip -q "v${RELEASE}.zip"
 | 
			
		||||
mv "/opt/barcodebuddy-${RELEASE}" /opt/barcodebuddy
 | 
			
		||||
chown -R www-data:www-data /opt/barcodebuddy/data
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Installed barcodebuddy"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Services"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/barcodebuddy.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Run websocket server for barcodebuddy screen feature
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=/usr/bin/php /opt/barcodebuddy/wsserver.php
 | 
			
		||||
StandardOutput=null
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
User=www-data
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
cat <<EOF >/etc/apache2/sites-available/barcodebuddy.conf
 | 
			
		||||
<VirtualHost *:80>
 | 
			
		||||
    ServerName barcodebuddy
 | 
			
		||||
    DocumentRoot /opt/barcodebuddy
 | 
			
		||||
    
 | 
			
		||||
    <Directory /opt/barcodebuddy>
 | 
			
		||||
        Options FollowSymLinks
 | 
			
		||||
        AllowOverride All
 | 
			
		||||
        Require all granted
 | 
			
		||||
    </Directory>
 | 
			
		||||
 | 
			
		||||
    ErrorLog /var/log/apache2/barcodebuddy_error.log
 | 
			
		||||
    CustomLog /var/log/apache2/barcodebuddy_access.log combined
 | 
			
		||||
</VirtualHost>
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now barcodebuddy
 | 
			
		||||
$STD a2ensite barcodebuddy
 | 
			
		||||
$STD a2enmod rewrite
 | 
			
		||||
$STD a2dissite 000-default.conf
 | 
			
		||||
$STD systemctl reload apache2
 | 
			
		||||
msg_ok "Created Services"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf "/opt/v${RELEASE}.zip"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -22,7 +22,7 @@ $STD apt-get install -y \
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Install Checkmk"
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | head -n 1)
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | tr ' ' '\n' | grep -v '\-rc' | sort -V | tail -n 1)
 | 
			
		||||
wget -q https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb -O /opt/checkmk.deb
 | 
			
		||||
$STD apt-get install -y /opt/checkmk.deb
 | 
			
		||||
echo "${RELEASE}" >"/opt/checkmk_version.txt"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										86
									
								
								install/cosmos-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								install/cosmos-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Michel Roegl-Brunner (michelroegl-brunner)
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
 curl \
 | 
			
		||||
 mc \
 | 
			
		||||
 sudo \
 | 
			
		||||
 snapraid \
 | 
			
		||||
 avahi-daemon \
 | 
			
		||||
 fdisk
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Install mergerfs"
 | 
			
		||||
MERGERFS_VERSION="2.40.2"
 | 
			
		||||
wget -q "https://github.com/trapexit/mergerfs/releases/download/${MERGERFS_VERSION}/mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb"
 | 
			
		||||
$STD dpkg -i "mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb" || $STD apt-get install -f -y
 | 
			
		||||
rm "mergerfs_${MERGERFS_VERSION}.debian-bullseye_amd64.deb"
 | 
			
		||||
msg_ok "Installed mergerfs"
 | 
			
		||||
 | 
			
		||||
msg_info "Install Docker"
 | 
			
		||||
curl -fsSL https://get.docker.com -o get-docker.sh
 | 
			
		||||
$STD sh get-docker.sh
 | 
			
		||||
rm get-docker.sh
 | 
			
		||||
msg_ok "Installed Docker"
 | 
			
		||||
 | 
			
		||||
msg_info "Install Cosmos" 
 | 
			
		||||
mkdir -p /opt/cosmos
 | 
			
		||||
LATEST_RELEASE=$(curl -s https://api.github.com/repos/azukaar/Cosmos-Server/releases/latest | grep "tag_name" | cut -d '"' -f 4)
 | 
			
		||||
ZIP_FILE="cosmos-cloud-${LATEST_RELEASE#v}-amd64.zip"
 | 
			
		||||
curl -sL "https://github.com/azukaar/Cosmos-Server/releases/download/${LATEST_RELEASE}/${ZIP_FILE}" -o "/opt/cosmos/${ZIP_FILE}"
 | 
			
		||||
cd /opt/cosmos
 | 
			
		||||
unzip -o -q "${ZIP_FILE}"
 | 
			
		||||
LATEST_RELEASE_NO_V=${LATEST_RELEASE#v}
 | 
			
		||||
mv /opt/cosmos/cosmos-cloud-${LATEST_RELEASE_NO_V}/* /opt/cosmos/
 | 
			
		||||
rmdir /opt/cosmos/cosmos-cloud-${LATEST_RELEASE_NO_V}
 | 
			
		||||
chmod +x /opt/cosmos/cosmos
 | 
			
		||||
msg_ok "Installed Cosmos"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF > /etc/systemd/system/cosmos.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Cosmos Cloud service
 | 
			
		||||
ConditionFileIsExecutable=/opt/cosmos/start.sh
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
StartLimitInterval=10
 | 
			
		||||
StartLimitBurst=5
 | 
			
		||||
ExecStart=/opt/cosmos/start.sh
 | 
			
		||||
 | 
			
		||||
WorkingDirectory=/opt/cosmos
 | 
			
		||||
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
RestartSec=2
 | 
			
		||||
EnvironmentFile=-/etc/sysconfig/CosmosCloud
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
systemctl enable -q --now cosmos.service
 | 
			
		||||
msg_info "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "/opt/cosmos/cosmos-cloud-${LATEST_RELEASE#v}-amd64.zip"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										107
									
								
								install/crafty-controller-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								install/crafty-controller-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts
 | 
			
		||||
# Author: CrazyWolf13
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://docs.craftycontrol.com/pages/getting-started/installation/linux/
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies (a lot of patience)"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  git \
 | 
			
		||||
  sed \
 | 
			
		||||
  lsb-release \
 | 
			
		||||
  apt-transport-https \
 | 
			
		||||
  coreutils \
 | 
			
		||||
  software-properties-common
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up TermurinJDK"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  temurin-8-jre \
 | 
			
		||||
  temurin-11-jre \
 | 
			
		||||
  temurin-17-jre \
 | 
			
		||||
  temurin-21-jre \
 | 
			
		||||
  temurin-23-jre
 | 
			
		||||
sudo update-alternatives --set java /usr/lib/jvm/temurin-21-jre-amd64/bin/java
 | 
			
		||||
msg_ok "Installed TermurinJDK"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  python3 \
 | 
			
		||||
  python3-dev \
 | 
			
		||||
  python3-pip \
 | 
			
		||||
  python3-venv
 | 
			
		||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Craty-Controller (Patience)"
 | 
			
		||||
useradd crafty -m -s /bin/bash
 | 
			
		||||
cd /opt
 | 
			
		||||
mkdir -p /opt/crafty-controller/crafty /opt/crafty-controller/server
 | 
			
		||||
RELEASE=$(curl -s "https://gitlab.com/api/v4/projects/20430749/releases" | grep -o '"tag_name":"v[^"]*"' | head -n 1 | sed 's/"tag_name":"v//;s/"//')
 | 
			
		||||
echo "${RELEASE}" >"/opt/crafty-controller_version.txt"
 | 
			
		||||
wget -q "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip"
 | 
			
		||||
unzip -q crafty-4-v${RELEASE}.zip
 | 
			
		||||
cp -a crafty-4-v${RELEASE}/. /opt/crafty-controller/crafty/crafty-4/
 | 
			
		||||
rm -rf crafty-4-v${RELEASE}
 | 
			
		||||
 | 
			
		||||
cd /opt/crafty-controller/crafty
 | 
			
		||||
python3 -m venv .venv
 | 
			
		||||
chown -R crafty:crafty /opt/crafty-controller/
 | 
			
		||||
$STD sudo -u crafty bash -c '
 | 
			
		||||
    source /opt/crafty-controller/crafty/.venv/bin/activate
 | 
			
		||||
    cd /opt/crafty-controller/crafty/crafty-4
 | 
			
		||||
    pip3 install --no-cache-dir -r requirements.txt
 | 
			
		||||
'
 | 
			
		||||
msg_ok "Installed Craft-Controller and dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Crafty-Controller service"
 | 
			
		||||
cat > /etc/systemd/system/crafty-controller.service << 'EOF'
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Crafty 4
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=crafty
 | 
			
		||||
WorkingDirectory=/opt/crafty-controller/crafty/crafty-4
 | 
			
		||||
Environment=PATH=/opt/crafty-controller/crafty/.venv/bin:$PATH
 | 
			
		||||
ExecStart=/opt/crafty-controller/crafty/.venv/bin/python3 main.py -d
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
$STD systemctl enable -q --now crafty-controller
 | 
			
		||||
sleep 10
 | 
			
		||||
{
 | 
			
		||||
    echo "Crafty-Controller-Credentials"
 | 
			
		||||
    echo "Username: $(grep -oP '(?<="username": ")[^"]*' /opt/crafty-controller/crafty/crafty-4/app/config/default-creds.txt)"
 | 
			
		||||
    echo "Password: $(grep -oP '(?<="password": ")[^"]*' /opt/crafty-controller/crafty/crafty-4/app/config/default-creds.txt)"
 | 
			
		||||
} >> ~/crafty-controller.creds
 | 
			
		||||
msg_ok "Crafty-Controller service started"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf /opt/crafty-4-v${RELEASE}.zip
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										66
									
								
								install/duplicati-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								install/duplicati-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/duplicati/duplicati
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  libice6 \
 | 
			
		||||
  libsm6 \
 | 
			
		||||
  libfontconfig1
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Duplicati"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/duplicati/duplicati/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}')
 | 
			
		||||
wget -q "https://github.com/duplicati/duplicati/releases/download/v${RELEASE}/duplicati-${RELEASE}-linux-x64-gui.deb"
 | 
			
		||||
$STD dpkg -i duplicati-${RELEASE}-linux-x64-gui.deb
 | 
			
		||||
echo "${RELEASE}" >/opt/Duplicati_version.txt
 | 
			
		||||
msg_ok "Finished setting up Duplicati"
 | 
			
		||||
 | 
			
		||||
DECRYPTKEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
 | 
			
		||||
ADMINPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
 | 
			
		||||
{
 | 
			
		||||
    echo "Admin password = ${ADMINPASS}"
 | 
			
		||||
    echo "Database encryption key = ${DECRYPTKEY}"
 | 
			
		||||
} >> ~/duplicati.creds
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/duplicati.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Duplicati Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
ExecStart=/usr/bin/duplicati-server --webservice-interface=any --webservice-password=$ADMINPASS --settings-encryption-key=$DECRYPTKEY
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now duplicati
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f duplicati-${RELEASE}-linux-x64-gui.deb
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
@@ -23,11 +23,13 @@ $STD apt-get install -y \
 | 
			
		||||
  debconf-utils
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
read -p "Please enter the name for your server: " servername
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Element Synapse"
 | 
			
		||||
wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
 | 
			
		||||
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/matrix-org.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
echo "matrix-synapse-py3 matrix-synapse/server-name string matrix" | debconf-set-selections
 | 
			
		||||
echo "matrix-synapse-py3 matrix-synapse/server-name string $servername" | debconf-set-selections
 | 
			
		||||
echo "matrix-synapse-py3 matrix-synapse/report-stats boolean false" | debconf-set-selections
 | 
			
		||||
$STD apt-get install matrix-synapse-py3 -y
 | 
			
		||||
sed -i 's/127.0.0.1/0.0.0.0/g' /etc/matrix-synapse/homeserver.yaml
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										84
									
								
								install/freshrss-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								install/freshrss-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: bvdberg01
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  postgresql \
 | 
			
		||||
  apache2 \
 | 
			
		||||
  php-{curl,dom,json,ctype,pgsql,gmp,mbstring,iconv,zip} \
 | 
			
		||||
  libapache2-mod-php
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PostgreSQL"
 | 
			
		||||
DB_NAME=freshrss
 | 
			
		||||
DB_USER=freshrss
 | 
			
		||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;"
 | 
			
		||||
{
 | 
			
		||||
echo "FreshRSS Credentials"
 | 
			
		||||
echo "FreshRSS Database User: $DB_USER"
 | 
			
		||||
echo "FreshRSS Database Password: $DB_PASS"
 | 
			
		||||
echo "FreshRSS Database Name: $DB_NAME"
 | 
			
		||||
} >> ~/freshrss.creds
 | 
			
		||||
msg_ok "Set up PostgreSQL"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing FreshRSS"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/FreshRSS/FreshRSS/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
cd /opt
 | 
			
		||||
wget -q "https://github.com/FreshRSS/FreshRSS/archive/refs/tags/${RELEASE}.zip"
 | 
			
		||||
unzip -q "${RELEASE}.zip"
 | 
			
		||||
mv "/opt/FreshRSS-${RELEASE}" /opt/freshrss
 | 
			
		||||
cd /opt/freshrss
 | 
			
		||||
chown -R www-data:www-data /opt/freshrss
 | 
			
		||||
chmod -R g+rX /opt/freshrss
 | 
			
		||||
chmod -R g+w /opt/freshrss/data/
 | 
			
		||||
msg_ok "Installed FreshRSS"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/apache2/sites-available/freshrss.conf
 | 
			
		||||
<VirtualHost *:80>
 | 
			
		||||
    ServerName freshrss
 | 
			
		||||
    DocumentRoot /opt/freshrss/p
 | 
			
		||||
 | 
			
		||||
    <Directory /opt/freshrss/p>
 | 
			
		||||
        Options FollowSymLinks
 | 
			
		||||
        AllowOverride All
 | 
			
		||||
        Require all granted
 | 
			
		||||
    </Directory>
 | 
			
		||||
 | 
			
		||||
    ErrorLog /var/log/apache2/freshrss_error.log
 | 
			
		||||
    CustomLog /var/log/apache2/freshrss_access.log combined
 | 
			
		||||
 | 
			
		||||
    AllowEncodedSlashes On
 | 
			
		||||
</VirtualHost>
 | 
			
		||||
EOF
 | 
			
		||||
$STD a2ensite freshrss
 | 
			
		||||
$STD a2enmod rewrite
 | 
			
		||||
$STD a2dissite 000-default.conf
 | 
			
		||||
$STD systemctl reload apache2
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf "/opt/${RELEASE}.zip"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -32,14 +32,16 @@ $STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing pnpm"
 | 
			
		||||
$STD npm install -g pnpm
 | 
			
		||||
msg_ok "Installed pnpm"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Jellyseerr (Patience)"
 | 
			
		||||
git clone -q https://github.com/Fallenbagel/jellyseerr.git /opt/jellyseerr
 | 
			
		||||
cd /opt/jellyseerr
 | 
			
		||||
$STD git checkout main
 | 
			
		||||
 | 
			
		||||
pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json)
 | 
			
		||||
msg_info "Installing pnpm version $pnpm_desired..."
 | 
			
		||||
$STD npm install -g pnpm@$pnpm_desired
 | 
			
		||||
msg_ok "Installed pnpm"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Jellyseerr (Patience)"
 | 
			
		||||
export CYPRESS_INSTALL_BINARY=0
 | 
			
		||||
$STD pnpm install --frozen-lockfile
 | 
			
		||||
export NODE_OPTIONS="--max-old-space-size=3072"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										124
									
								
								install/koillection-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								install/koillection-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,124 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: bvdberg01
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  gnupg2\
 | 
			
		||||
  postgresql \
 | 
			
		||||
  apache2 \
 | 
			
		||||
  lsb-release
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup PHP8.4 Repository"
 | 
			
		||||
$STD curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
 | 
			
		||||
$STD dpkg -i /tmp/debsuryorg-archive-keyring.deb
 | 
			
		||||
$STD sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
msg_ok "Setup PHP8.4 Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup PHP"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  php8.4 \
 | 
			
		||||
  php8.4-{apcu,ctype,curl,dom,fileinfo,gd,iconv,intl,mbstring,pgsql} \
 | 
			
		||||
  libapache2-mod-php8.4 \
 | 
			
		||||
  composer
 | 
			
		||||
msg_info "Setup PHP"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PostgreSQL"
 | 
			
		||||
DB_NAME=koillection
 | 
			
		||||
DB_USER=koillection
 | 
			
		||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;"
 | 
			
		||||
{
 | 
			
		||||
echo "Koillection Credentials"
 | 
			
		||||
echo "Koillection Database User: $DB_USER"
 | 
			
		||||
echo "Koillection Database Password: $DB_PASS"
 | 
			
		||||
echo "Koillection Database Name: $DB_NAME"
 | 
			
		||||
} >> ~/koillection.creds
 | 
			
		||||
msg_ok "Set up PostgreSQL"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js/Yarn"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
$STD npm install -g npm@latest
 | 
			
		||||
$STD npm install -g yarn
 | 
			
		||||
msg_ok "Installed Node.js/Yarn"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Koillection"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/benjaminjonard/koillection/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
cd /opt
 | 
			
		||||
wget -q "https://github.com/benjaminjonard/koillection/archive/refs/tags/${RELEASE}.zip"
 | 
			
		||||
unzip -q "${RELEASE}.zip"
 | 
			
		||||
mv "/opt/koillection-${RELEASE}" /opt/koillection
 | 
			
		||||
cd /opt/koillection
 | 
			
		||||
cp /opt/koillection/.env /opt/koillection/.env.local
 | 
			
		||||
APP_SECRET=$(openssl rand -base64 32)
 | 
			
		||||
sed -i -e "s|^APP_ENV=.*|APP_ENV=prod|" \
 | 
			
		||||
       -e "s|^APP_DEBUG=.*|APP_DEBUG=0|" \
 | 
			
		||||
       -e "s|^APP_SECRET=.*|APP_SECRET=${APP_SECRET}|" \
 | 
			
		||||
       -e "s|^DB_NAME=.*|DB_NAME=${DB_NAME}|" \
 | 
			
		||||
       -e "s|^DB_USER=.*|DB_USER=${DB_USER}|" \
 | 
			
		||||
       -e "s|^DB_PASSWORD=.*|DB_PASSWORD=${DB_PASS}|" \
 | 
			
		||||
       /opt/koillection/.env.local
 | 
			
		||||
export COMPOSER_ALLOW_SUPERUSER=1
 | 
			
		||||
$STD composer install --no-dev -o --no-interaction --classmap-authoritative
 | 
			
		||||
$STD php bin/console doctrine:migrations:migrate --no-interaction
 | 
			
		||||
$STD php bin/console app:translations:dump
 | 
			
		||||
cd assets/
 | 
			
		||||
$STD yarn install
 | 
			
		||||
$STD yarn build 
 | 
			
		||||
chown -R www-data:www-data /opt/koillection/public/uploads
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Installed Koillection"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/apache2/sites-available/koillection.conf
 | 
			
		||||
<VirtualHost *:80>
 | 
			
		||||
    ServerName koillection
 | 
			
		||||
    DocumentRoot /opt/koillection/public
 | 
			
		||||
    <Directory /opt/koillection/public>
 | 
			
		||||
        Options Indexes FollowSymLinks
 | 
			
		||||
        AllowOverride All
 | 
			
		||||
        Require all granted
 | 
			
		||||
        RewriteEngine On
 | 
			
		||||
        RewriteCond %{REQUEST_FILENAME} !-f
 | 
			
		||||
        RewriteCond %{REQUEST_FILENAME} !-d
 | 
			
		||||
        RewriteRule ^(.*)$ index.php/\$1 [L]
 | 
			
		||||
    </Directory>
 | 
			
		||||
 | 
			
		||||
    ErrorLog /var/log/apache2/koillection_error.log
 | 
			
		||||
    CustomLog /var/log/apache2/koillection_access.log combined
 | 
			
		||||
</VirtualHost>
 | 
			
		||||
EOF
 | 
			
		||||
$STD a2ensite koillection
 | 
			
		||||
$STD a2enmod rewrite
 | 
			
		||||
$STD a2dissite 000-default.conf
 | 
			
		||||
$STD systemctl reload apache2
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf "/opt/${RELEASE}.zip"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										93
									
								
								install/paperless-ai-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								install/paperless-ai-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
	curl \
 | 
			
		||||
	sudo \
 | 
			
		||||
	mc \
 | 
			
		||||
	gpg
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Paperless-AI"
 | 
			
		||||
cd /opt
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/clusterzx/paperless-ai/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q "https://github.com/clusterzx/paperless-ai/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
unzip -q v${RELEASE}.zip
 | 
			
		||||
mv paperless-ai-${RELEASE} /opt/paperless-ai
 | 
			
		||||
cd /opt/paperless-ai
 | 
			
		||||
$STD npm install
 | 
			
		||||
mkdir -p /opt/paperless-ai/data
 | 
			
		||||
cat <<EOF >/opt/paperless-ai/data/.env
 | 
			
		||||
PAPERLESS_API_URL=
 | 
			
		||||
PAPERLESS_API_TOKEN=
 | 
			
		||||
PAPERLESS_USERNAME=
 | 
			
		||||
AI_PROVIDER=openai
 | 
			
		||||
OPENAI_API_KEY=
 | 
			
		||||
OPENAI_MODEL=gpt-4o-mini
 | 
			
		||||
OLLAMA_API_URL=
 | 
			
		||||
OLLAMA_MODEL=
 | 
			
		||||
SCAN_INTERVAL=*/10 * * * *
 | 
			
		||||
SYSTEM_PROMPT=""
 | 
			
		||||
PROCESS_PREDEFINED_DOCUMENTS=no
 | 
			
		||||
TAGS=
 | 
			
		||||
ADD_AI_PROCESSED_TAG=no
 | 
			
		||||
AI_PROCESSED_TAG_NAME=ki-gen
 | 
			
		||||
USE_PROMPT_TAGS=no
 | 
			
		||||
PROMPT_TAGS=
 | 
			
		||||
USE_EXISTING_DATA=no
 | 
			
		||||
API_KEY=
 | 
			
		||||
CUSTOM_API_KEY=
 | 
			
		||||
CUSTOM_BASE_URL=
 | 
			
		||||
CUSTOM_MODEL=
 | 
			
		||||
EOF
 | 
			
		||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
 | 
			
		||||
msg_ok "Setup Paperless-AI"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/paperless-ai.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=PaperlessAI Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
WorkingDirectory=/opt/paperless-ai
 | 
			
		||||
ExecStart=/usr/bin/npm start
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now paperless-ai.service
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf /opt/v${RELEASE}.zip
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -62,6 +62,35 @@ PHOTOPRISM_PUBLIC='false'
 | 
			
		||||
PHOTOPRISM_DEBUG='false'
 | 
			
		||||
EOF
 | 
			
		||||
ln -sf /opt/photoprism/bin/photoprism /usr/local/bin/photoprism
 | 
			
		||||
 | 
			
		||||
mkdir -p /etc/photoprism/
 | 
			
		||||
cat <<EOF >/etc/photoprism/defaults.yml
 | 
			
		||||
ConfigPath: "~/.config/photoprism"
 | 
			
		||||
StoragePath: "/opt/photoprism/storage"
 | 
			
		||||
OriginalsPath: "/opt/photoprism/photos/originals"
 | 
			
		||||
ImportPath: "/media"
 | 
			
		||||
AdminUser: "admin"
 | 
			
		||||
AdminPassword: "changeme"
 | 
			
		||||
AuthMode: "password"
 | 
			
		||||
DatabaseDriver: "sqlite"
 | 
			
		||||
HttpHost: "0.0.0.0"
 | 
			
		||||
HttpPort: 2342
 | 
			
		||||
HttpCompression: "gzip"
 | 
			
		||||
DisableTLS: false
 | 
			
		||||
DefaultTLS: true
 | 
			
		||||
Experimental: false
 | 
			
		||||
DisableWebDAV: false
 | 
			
		||||
DisableSettings: false
 | 
			
		||||
DisableTensorFlow: false
 | 
			
		||||
DisableFaces: false
 | 
			
		||||
DisableClassification: false
 | 
			
		||||
DisableVectors: false
 | 
			
		||||
DisableRaw: false
 | 
			
		||||
RawPresets: false
 | 
			
		||||
JpegQuality: 85
 | 
			
		||||
DetectNSFW: false
 | 
			
		||||
UploadNSFW: true
 | 
			
		||||
EOF
 | 
			
		||||
msg_ok "Installed PhotoPrism"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Snarkenfaugister
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/stonith404/pocket-id
 | 
			
		||||
# Source: https://github.com/pocket-id/pocket-id
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
@@ -48,8 +48,8 @@ msg_ok "Installed Golang"
 | 
			
		||||
read -r -p "What public URL do you want to use (e.g. pocketid.mydomain.com)? " public_url
 | 
			
		||||
msg_info "Setup Pocket ID"
 | 
			
		||||
cd /opt
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/stonith404/pocket-id/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q "https://github.com/stonith404/pocket-id/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/pocket-id/pocket-id/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q "https://github.com/pocket-id/pocket-id/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
unzip -q v${RELEASE}.zip
 | 
			
		||||
mv pocket-id-${RELEASE}/ /opt/pocket-id
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								install/prometheus-paperless-ngx-exporter-install.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										64
									
								
								install/prometheus-paperless-ngx-exporter-install.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Andy Grunwald (andygrunwald)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/hansmi/prometheus-paperless-exporter
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Prometheus Paperless NGX Exporter"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/hansmi/prometheus-paperless-exporter/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q https://github.com/hansmi/prometheus-paperless-exporter/releases/download/v${RELEASE}/prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
tar -xf prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
mv prometheus-paperless-exporter_${RELEASE}_linux_amd64/prometheus-paperless-exporter /usr/local/bin/
 | 
			
		||||
mkdir -p /etc/prometheus-paperless-ngx-exporter
 | 
			
		||||
cat <<EOF > /etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file
 | 
			
		||||
SECRET_AUTH_TOKEN
 | 
			
		||||
EOF
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Installed Prometheus Paperless NGX Exporter"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/prometheus-paperless-ngx-exporter.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Prometheus Paperless NGX Exporter
 | 
			
		||||
Wants=network-online.target
 | 
			
		||||
After=network-online.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
User=root
 | 
			
		||||
Restart=always
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=/usr/local/bin/prometheus-paperless-exporter \
 | 
			
		||||
    --paperless_url=http://paperless.example.org \
 | 
			
		||||
    --paperless_auth_token_file=/etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file
 | 
			
		||||
ExecReload=/bin/kill -HUP \$MAINPID
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now prometheus-paperless-ngx-exporter
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
rm -rf prometheus-paperless-exporter_${RELEASE}_linux_amd64/ prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										36
									
								
								install/proxmox-mail-gateway-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								install/proxmox-mail-gateway-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: thost96 (thost96)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get -y install \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  wget
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Proxmox Mail Gateway"
 | 
			
		||||
wget -q https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
 | 
			
		||||
echo "deb http://download.proxmox.com/debian/pmg bookworm pmg-no-subscription" > /etc/apt/sources.list.d/pmg.list
 | 
			
		||||
$STD apt-get update 
 | 
			
		||||
$STD apt-get -y install proxmox-mailgateway-container
 | 
			
		||||
msg_ok "Installed Proxmox Mail Gateway"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										72
									
								
								install/radicale-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								install/radicale-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# 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 /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  apache2-utils \
 | 
			
		||||
  python3-pip \
 | 
			
		||||
  python3.11-venv
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Radicale"
 | 
			
		||||
python3 -m venv /opt/radicale
 | 
			
		||||
source /opt/radicale/bin/activate
 | 
			
		||||
$STD python3 -m pip install --upgrade https://github.com/Kozea/Radicale/archive/master.tar.gz
 | 
			
		||||
RNDPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
 | 
			
		||||
$STD htpasswd -c -b -5 /opt/radicale/users admin $RNDPASS
 | 
			
		||||
{
 | 
			
		||||
echo "Radicale Credentials"
 | 
			
		||||
echo "Admin User: admin"
 | 
			
		||||
echo "Admin Password: $RNDPASS"
 | 
			
		||||
} >> ~/radicale.creds
 | 
			
		||||
msg_ok "Done setting up Radicale"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Service"
 | 
			
		||||
 | 
			
		||||
cat <<EOF >/opt/radicale/start.sh
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source /opt/radicale/bin/activate
 | 
			
		||||
python3 -m radicale --storage-filesystem-folder=/var/lib/radicale/collections --hosts 0.0.0.0:5232 --auth-type htpasswd --auth-htpasswd-filename /opt/radicale/users --auth-htpasswd-encryption sha512
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
chmod +x /opt/radicale/start.sh
 | 
			
		||||
 | 
			
		||||
cat <<EOF >/etc/systemd/system/radicale.service
 | 
			
		||||
Description=A simple CalDAV (calendar) and CardDAV (contact) server
 | 
			
		||||
After=network.target
 | 
			
		||||
Requires=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
ExecStart=/opt/radicale/start.sh
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
# User=radicale
 | 
			
		||||
# Deny other users access to the calendar data
 | 
			
		||||
# UMask=0027
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now radicale
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										116
									
								
								install/searxng-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								install/searxng-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: MickLesk (Canbiz)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/searxng/searxng
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies (Patience)"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  redis-server \
 | 
			
		||||
  build-essential \
 | 
			
		||||
  libffi-dev \
 | 
			
		||||
  libssl-dev \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  git \
 | 
			
		||||
  mc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Python3" 
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  python3 \
 | 
			
		||||
  python3-{pip,venv,yaml,dev} 
 | 
			
		||||
$STD pip install --upgrade pip setuptools wheel 
 | 
			
		||||
$STD pip install pyyaml
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup SearXNG"
 | 
			
		||||
mkdir -p /usr/local/searxng /etc/searxng
 | 
			
		||||
useradd -d /etc/searxng searxng
 | 
			
		||||
chown searxng:searxng /usr/local/searxng /etc/searxng
 | 
			
		||||
$STD git clone https://github.com/searxng/searxng.git /usr/local/searxng/searxng-src
 | 
			
		||||
cd /usr/local/searxng/
 | 
			
		||||
sudo -u searxng python3 -m venv /usr/local/searxng/searx-pyenv
 | 
			
		||||
source /usr/local/searxng/searx-pyenv/bin/activate
 | 
			
		||||
$STD pip install --upgrade pip setuptools wheel 
 | 
			
		||||
$STD pip install pyyaml
 | 
			
		||||
$STD pip install -e /usr/local/searxng/searxng-src
 | 
			
		||||
SECRET_KEY=$(openssl rand -hex 32)
 | 
			
		||||
cat <<EOF >/etc/searxng/settings.yml
 | 
			
		||||
# SearXNG settings
 | 
			
		||||
use_default_settings: true
 | 
			
		||||
general:
 | 
			
		||||
  debug: false
 | 
			
		||||
  instance_name: "SearXNG"
 | 
			
		||||
  privacypolicy_url: false
 | 
			
		||||
  contact_url: false
 | 
			
		||||
server:
 | 
			
		||||
  bind_address: "0.0.0.0"
 | 
			
		||||
  port: 8888
 | 
			
		||||
  secret_key: "${SECRET_KEY}"
 | 
			
		||||
  limiter: true
 | 
			
		||||
  image_proxy: true
 | 
			
		||||
redis:
 | 
			
		||||
  url: "redis://127.0.0.1:6379/0"
 | 
			
		||||
ui:
 | 
			
		||||
  static_use_hash: true
 | 
			
		||||
enabled_plugins:
 | 
			
		||||
  - 'Hash plugin'
 | 
			
		||||
  - 'Self Information'
 | 
			
		||||
  - 'Tracker URL remover'
 | 
			
		||||
  - 'Ahmia blacklist'
 | 
			
		||||
search:
 | 
			
		||||
  safe_search: 2
 | 
			
		||||
  autocomplete: 'google'
 | 
			
		||||
engines:
 | 
			
		||||
  - name: google
 | 
			
		||||
    engine: google
 | 
			
		||||
    shortcut: gg
 | 
			
		||||
    use_mobile_ui: false
 | 
			
		||||
  - name: duckduckgo
 | 
			
		||||
    engine: duckduckgo
 | 
			
		||||
    shortcut: ddg
 | 
			
		||||
    display_error_messages: true
 | 
			
		||||
EOF
 | 
			
		||||
chown searxng:searxng /etc/searxng/settings.yml
 | 
			
		||||
chmod 640 /etc/searxng/settings.yml
 | 
			
		||||
msg_ok "Setup SearXNG"
 | 
			
		||||
 | 
			
		||||
msg_info "Set up web services"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/searxng.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=SearXNG service
 | 
			
		||||
After=network.target redis-server.service
 | 
			
		||||
Wants=redis-server.service
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=searxng
 | 
			
		||||
Group=searxng
 | 
			
		||||
Environment="SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml"
 | 
			
		||||
ExecStart=/usr/local/searxng/searx-pyenv/bin/python -m searx.webapp
 | 
			
		||||
WorkingDirectory=/usr/local/searxng/searxng-src
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now searxng
 | 
			
		||||
msg_ok "Created Services"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get autoremove
 | 
			
		||||
$STD apt-get autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										80
									
								
								install/seelf-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								install/seelf-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/YuukanOO/seelf
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  make \
 | 
			
		||||
  gcc
 | 
			
		||||
wget -q https://go.dev/dl/go1.23.5.linux-amd64.tar.gz
 | 
			
		||||
curl -s -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash &> /dev/null
 | 
			
		||||
tar -C /usr/local -xzf go1.23.5.linux-amd64.tar.gz
 | 
			
		||||
export PATH=$PATH:/usr/local/go/bin
 | 
			
		||||
source ~/.bashrc
 | 
			
		||||
$STD nvm install node
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up seelf. Patience"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/YuukanOO/seelf/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q "https://github.com/YuukanOO/seelf/archive/refs/tags/v${RELEASE}.tar.gz"
 | 
			
		||||
tar -xzf v${RELEASE}.tar.gz
 | 
			
		||||
mv seelf-${RELEASE}/ /opt/seelf
 | 
			
		||||
cd /opt/seelf
 | 
			
		||||
$STD make build 
 | 
			
		||||
PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
 | 
			
		||||
{
 | 
			
		||||
    echo "ADMIN_EMAIL=admin@example.com"
 | 
			
		||||
    echo "ADMIN_PASSWORD=$PASS"
 | 
			
		||||
} | tee .env ~/seelf.creds > /dev/null
 | 
			
		||||
 | 
			
		||||
echo "${RELEASE}" >/opt/seelf_version.txt
 | 
			
		||||
SEELF_ADMIN_EMAIL=admin@example.com SEELF_ADMIN_PASSWORD=$PASS ./seelf serve &> /dev/null & sleep 5 ; kill $!
 | 
			
		||||
msg_ok "Done setting up seelf"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/seelf.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=seelf Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=root
 | 
			
		||||
Group=root
 | 
			
		||||
WorkingDirectory=/opt/seelf
 | 
			
		||||
ExecStart=/opt/seelf/./seelf serve
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now seelf
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
# Cleanup
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f ~/v${RELEASE}.tar.gz
 | 
			
		||||
rm -f ~/go1.23.5.linux-amd64.tar.gz
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize 
 | 
			
		||||
							
								
								
									
										53
									
								
								install/suwayomiserver-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								install/suwayomiserver-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/Suwayomi/Suwayomi-Server
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  openjdk-17-jre \
 | 
			
		||||
  libc++-dev
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Settting up Suwayomi-Server"
 | 
			
		||||
URL=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' |  tail -n+2 | head -n 1)
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
wget -q $URL
 | 
			
		||||
$STD dpkg -i *.deb
 | 
			
		||||
echo ${RELEASE} >/opt/suwayomi-server_version.txt
 | 
			
		||||
msg_ok "Done setting up Suwayomi-Server"
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/suwayomi-server.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Suwayomi-Server Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
ExecStart=/usr/bin/suwayomi-server
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now suwayomi-server
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f *.deb
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -2,8 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 tteck
 | 
			
		||||
# Author: tteck (tteckster)
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
@@ -14,23 +13,24 @@ network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y curl
 | 
			
		||||
$STD apt-get install -y sudo
 | 
			
		||||
$STD apt-get install -y mc
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup TriliumNext"
 | 
			
		||||
cd /opt
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/TriliumNext/Notes/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
 | 
			
		||||
msg_info "Installing TriliumNext"
 | 
			
		||||
wget -q https://github.com/TriliumNext/Notes/releases/download/${RELEASE}/TriliumNextNotes-linux-x64-${RELEASE}.tar.xz
 | 
			
		||||
tar -xf TriliumNextNotes-linux-x64-${RELEASE}.tar.xz
 | 
			
		||||
mv trilium-linux-x64-server /opt/trilium
 | 
			
		||||
msg_ok "Installed TriliumNext"
 | 
			
		||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
 | 
			
		||||
msg_ok "Setup TriliumNext"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
service_path="/etc/systemd/system/trilium.service"
 | 
			
		||||
 | 
			
		||||
echo "[Unit]
 | 
			
		||||
cat <<EOF >/etc/systemd/system/trilium.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Trilium Daemon
 | 
			
		||||
After=syslog.target network.target
 | 
			
		||||
 | 
			
		||||
@@ -43,7 +43,8 @@ TimeoutStopSec=20
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target" >$service_path
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable --now -q trilium
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
@@ -51,7 +52,7 @@ motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf /opt/TriliumNextNotes-linux-x64-${RELEASE}.tar.xz
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
rm -rf TriliumNextNotes-linux-x64-${RELEASE}.tar.xz
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										93
									
								
								install/watcharr-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								install/watcharr-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# 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/sbondCo/Watcharr
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  gcc \
 | 
			
		||||
  gnupg
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Golang"
 | 
			
		||||
set +o pipefail
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Setup Golang"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Node.js"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
msg_ok "Setup Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Watcharr"
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/sbondCo/Watcharr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q "https://github.com/sbondCo/Watcharr/archive/refs/tags/v${RELEASE}.tar.gz" -O "$temp_file"
 | 
			
		||||
tar -xzf "$temp_file"
 | 
			
		||||
mv Watcharr-${RELEASE}/ /opt/watcharr
 | 
			
		||||
cd /opt/watcharr
 | 
			
		||||
$STD npm i
 | 
			
		||||
$STD npm run build
 | 
			
		||||
mv ./build ./server/ui
 | 
			
		||||
cd server
 | 
			
		||||
export CGO_ENABLED=1 GOOS=linux
 | 
			
		||||
go mod download
 | 
			
		||||
go build -o ./watcharr
 | 
			
		||||
cat <<EOF >/opt/start.sh
 | 
			
		||||
#! /bin/bash
 | 
			
		||||
source ~/.bashrc
 | 
			
		||||
cd /opt/watcharr/server
 | 
			
		||||
./watcharr
 | 
			
		||||
EOF
 | 
			
		||||
chmod +x /opt/start.sh
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Setup Watcharr"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/watcharr.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Watcharr Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
WorkingDirectory=/opt/watcharr/server
 | 
			
		||||
ExecStart=/opt/start.sh
 | 
			
		||||
Restart=always
 | 
			
		||||
User=root
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now watcharr
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										47
									
								
								install/zerotier-one-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								install/zerotier-one-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
#Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  mc \
 | 
			
		||||
  sudo \
 | 
			
		||||
  gnupg
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Zerotier-One"
 | 
			
		||||
curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/main/doc/contact%40zerotier.com.gpg' | gpg --import && \
 | 
			
		||||
if z="$(curl -s 'https://install.zerotier.com/' | gpg)"; then 
 | 
			
		||||
echo "$z" | sudo bash
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "Setup Zerotier-One"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up UI"
 | 
			
		||||
curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb
 | 
			
		||||
dpkg -i ztncui_0.8.14_amd64.deb
 | 
			
		||||
sh -c "echo ZT_TOKEN=$(cat /var/lib/zerotier-one/authtoken.secret) > /opt/key-networks/ztncui/.env"
 | 
			
		||||
echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env
 | 
			
		||||
echo NODE_ENV=production >> /opt/key-networks/ztncui/.env
 | 
			
		||||
chmod 400 /opt/key-networks/ztncui/.env
 | 
			
		||||
chown ztncui:ztncui /opt/key-networks/ztncui/.env
 | 
			
		||||
systemctl restart ztncui
 | 
			
		||||
msg_ok "Done setting up UI."
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										155
									
								
								install/zitadel-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								install/zitadel-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: dave-yap
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies (Patience)"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
    curl \
 | 
			
		||||
    sudo \
 | 
			
		||||
    mc \
 | 
			
		||||
    ca-certificates \
 | 
			
		||||
    wget
 | 
			
		||||
msg_ok "Installed Dependecies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Postgresql"
 | 
			
		||||
$STD apt-get install -y postgresql postgresql-common
 | 
			
		||||
DB_NAME="zitadel"
 | 
			
		||||
DB_USER="zitadel"
 | 
			
		||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
 | 
			
		||||
DB_ADMIN_USER="root"
 | 
			
		||||
DB_ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
 | 
			
		||||
systemctl start postgresql
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE USER $DB_ADMIN_USER WITH PASSWORD '$DB_ADMIN_PASS' SUPERUSER;"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_ADMIN_USER;"
 | 
			
		||||
{
 | 
			
		||||
    echo "Application Credentials"
 | 
			
		||||
    echo "DB_NAME: $DB_NAME"
 | 
			
		||||
    echo "DB_USER: $DB_USER"
 | 
			
		||||
    echo "DB_PASS: $DB_PASS"
 | 
			
		||||
    echo "DB_ADMIN_USER: $DB_ADMIN_USER"
 | 
			
		||||
    echo "DB_ADMIN_PASS: $DB_ADMIN_PASS"
 | 
			
		||||
} >> ~/zitadel.creds
 | 
			
		||||
msg_ok "Installed PostgreSQL"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Zitadel"
 | 
			
		||||
RELEASE=$(curl -si https://github.com/zitadel/zitadel/releases/latest | grep location: | cut -d '/' -f 8 | tr -d '\r')
 | 
			
		||||
wget -qc https://github.com/zitadel/zitadel/releases/download/$RELEASE/zitadel-linux-amd64.tar.gz -O - | tar -xz
 | 
			
		||||
mv zitadel-linux-amd64/zitadel /usr/local/bin
 | 
			
		||||
echo "${RELEASE}" >"/opt/zitadel_version.txt"
 | 
			
		||||
msg_ok "Installed Zitadel"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Zitadel Environments"
 | 
			
		||||
mkdir -p /opt/zitadel
 | 
			
		||||
echo "/opt/zitadel/config.yaml" > "/opt/zitadel/.config"
 | 
			
		||||
head -c 32 < <(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9') > "/opt/zitadel/.masterkey"
 | 
			
		||||
{
 | 
			
		||||
    echo "Config location: $(cat "/opt/zitadel/.config")"
 | 
			
		||||
    echo "Masterkey: $(cat "/opt/zitadel/.masterkey")"
 | 
			
		||||
} >> ~/zitadel.creds
 | 
			
		||||
cat <<EOF >/opt/zitadel/config.yaml
 | 
			
		||||
Port: 8080
 | 
			
		||||
ExternalPort: 8080
 | 
			
		||||
ExternalDomain: localhost
 | 
			
		||||
ExternalSecure: false
 | 
			
		||||
TLS:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
  KeyPath: ""
 | 
			
		||||
  Key: ""
 | 
			
		||||
  CertPath: ""
 | 
			
		||||
  Cert: ""
 | 
			
		||||
 | 
			
		||||
Database:
 | 
			
		||||
  postgres:
 | 
			
		||||
    Host: localhost
 | 
			
		||||
    Port: 5432
 | 
			
		||||
    Database: ${DB_NAME}
 | 
			
		||||
    User:
 | 
			
		||||
      Username: ${DB_USER}
 | 
			
		||||
      Password: ${DB_PASS}
 | 
			
		||||
      SSL:
 | 
			
		||||
        Mode: disable
 | 
			
		||||
        RootCert: ""
 | 
			
		||||
        Cert: ""
 | 
			
		||||
        Key: ""
 | 
			
		||||
    Admin:
 | 
			
		||||
      Username: ${DB_ADMIN_USER}
 | 
			
		||||
      Password: ${DB_ADMIN_PASS}
 | 
			
		||||
      SSL:
 | 
			
		||||
        Mode: disable
 | 
			
		||||
        RootCert: ""
 | 
			
		||||
        Cert: ""
 | 
			
		||||
        Key: ""
 | 
			
		||||
EOF
 | 
			
		||||
msg_ok "Installed Zitadel Enviroments"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Services"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/zitadel.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=ZITADEL Identiy Server
 | 
			
		||||
After=network.target postgresql.service
 | 
			
		||||
Wants=postgresql.service
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=zitadel
 | 
			
		||||
Group=zitadel
 | 
			
		||||
ExecStart=/usr/local/bin/zitadel start --masterkeyFile "/opt/zitadel/.masterkey" --config "/opt/zitadel/config.yaml"
 | 
			
		||||
Restart=always
 | 
			
		||||
RestartSec=5
 | 
			
		||||
TimeoutStartSec=0
 | 
			
		||||
 | 
			
		||||
# Security Hardening options
 | 
			
		||||
ProtectSystem=full
 | 
			
		||||
ProtectHome=true
 | 
			
		||||
PrivateTmp=true
 | 
			
		||||
NoNewPrivileges=true
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q zitadel.service
 | 
			
		||||
msg_ok "Created Services"
 | 
			
		||||
 | 
			
		||||
msg_info "Zitadel initial setup"
 | 
			
		||||
zitadel start-from-init --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml &>/dev/null &
 | 
			
		||||
sleep 60
 | 
			
		||||
kill $(lsof -i | awk '/zitadel/ {print $2}' | head -n1)
 | 
			
		||||
useradd zitadel
 | 
			
		||||
echo -e "$(zitadel -v | grep -oP 'v\d+\.\d+\.\d+')" > /opt/Zitadel_version.txt
 | 
			
		||||
msg_ok "Zitadel initialized"
 | 
			
		||||
 | 
			
		||||
msg_info "Set ExternalDomain to current IP and restart Zitadel"
 | 
			
		||||
IP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
 | 
			
		||||
sed -i "0,/localhost/s/localhost/${IP}/" /opt/zitadel/config.yaml
 | 
			
		||||
systemctl stop -q zitadel.service
 | 
			
		||||
zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml &>/dev/null 
 | 
			
		||||
systemctl restart -q zitadel.service
 | 
			
		||||
msg_ok "Zitadel restarted with ExternalDomain set to current IP"
 | 
			
		||||
 | 
			
		||||
msg_info "Create zitadel-rerun.sh"
 | 
			
		||||
cat <<EOF >~/zitadel-rerun.sh
 | 
			
		||||
systemctl stop zitadel.service
 | 
			
		||||
timeout --kill-after=5s 15s zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml
 | 
			
		||||
systemctl restart zitadel.service
 | 
			
		||||
EOF
 | 
			
		||||
msg_ok "Bash script for rerunning Zitadel after changing Zitadel config.yaml"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf ~/zitadel-linux-amd64
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										34
									
								
								json/apache-tika.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								json/apache-tika.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Apache Tika",
 | 
			
		||||
    "slug": "apache-tika",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        12
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-05",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 9998,
 | 
			
		||||
    "documentation": null,
 | 
			
		||||
    "website": "https://tika.apache.org/",
 | 
			
		||||
    "logo": "https://tika.apache.org/tika.png",
 | 
			
		||||
    "description": "The Apache Tika™ toolkit detects and extracts metadata and text from over a thousand different file types (such as PPT, XLS, and PDF). All of these file types can be parsed through a single interface, making Tika useful for search engine indexing, content analysis, translation, and much more.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/apache-tika.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 2024,
 | 
			
		||||
                "hdd": 10,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								json/barcode-buddy.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/barcode-buddy.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "Barcode Buddy",
 | 
			
		||||
  "slug": "barcode-buddy",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    24
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-02-08",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 80,
 | 
			
		||||
  "documentation": "https://barcodebuddy-documentation.readthedocs.io/en/latest/",
 | 
			
		||||
  "website": "https://github.com/Forceu/barcodebuddy",
 | 
			
		||||
  "logo": "https://raw.githubusercontent.com/Forceu/barcodebuddy/refs/heads/master/incl/img/favicon/android-icon-192x192.png",
 | 
			
		||||
  "description": "Barcode Buddy for Grocy is an extension for Grocy, allowing to pass barcodes to Grocy. It supports barcodes for products and chores. If you own a physical barcode scanner, it can be integrated, so that all barcodes scanned are automatically pushed to BarcodeBuddy/Grocy.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/barcode-buddy.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 512,
 | 
			
		||||
        "hdd": 3,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "After install enable the option \"Use Redis cache\" on the settings page.",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								json/cosmos.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								json/cosmos.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "Cosmos",
 | 
			
		||||
  "slug": "cosmos",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    2,
 | 
			
		||||
    3
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-02-07",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 80,
 | 
			
		||||
  "documentation": "https://cosmos-cloud.io/doc/1%20index/",
 | 
			
		||||
  "website": "https://cosmos-cloud.io/",
 | 
			
		||||
  "logo": "https://cosmos-cloud.io/Logo.png",
 | 
			
		||||
  "description": "Cosmos Cloud is a self-hosting platform that automates maintenance and security. It offers an app marketplace, reverse proxy management, container control, VPN integration, real-time monitoring, and disk management. Security features include SSO, anti-DDoS, and encryption. It simplifies self-hosting for all users.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/cosmos.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 8,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								json/crafty-controller.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/crafty-controller.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Crafty Controller",
 | 
			
		||||
    "slug": "crafty-controller",
 | 
			
		||||
    "categories": [
 | 
			
		||||
      24
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-01",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 8443,
 | 
			
		||||
    "documentation": "https://docs.craftycontrol.com/",
 | 
			
		||||
    "website": "https://craftycontrol.com/",
 | 
			
		||||
    "logo": "https://gitlab.com/crafty-controller/crafty-4/-/raw/master/app/frontend/static/assets/images/logo_long.svg",
 | 
			
		||||
    "description": "Crafty Controller is a free and open-source Minecraft launcher and manager that allows users to start and administer Minecraft servers from a user-friendly interface. The interface is run as a self-hosted web server that is accessible to devices on the local network by default and can be port forwarded to provide external access outside of your local network. Crafty is designed to be easy to install and use, requiring only a bit of technical knowledge and a desire to learn to get started. Crafty Controller is still actively being developed by Arcadia Technology and we are continually making major improvements to the software.\n\nCrafty Controller is a feature rich panel that allows you to create and run servers, manage players, run commands, change server settings, view and edit server files, and make backups. With the help of Crafty Controller managing a large number of Minecraft servers on separate versions is easy and intuitive to do.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
      {
 | 
			
		||||
        "type": "default",
 | 
			
		||||
        "script": "ct/crafty-controller.sh",
 | 
			
		||||
        "resources": {
 | 
			
		||||
          "cpu": 2,
 | 
			
		||||
          "ram": 4096,
 | 
			
		||||
          "hdd": 16,
 | 
			
		||||
          "os": "Debian",
 | 
			
		||||
          "version": "12"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
      "username": "admin",
 | 
			
		||||
      "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
      {
 | 
			
		||||
        "text": "Show password: `cat ~/crafty-controller.creds`",
 | 
			
		||||
        "type": "info"
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user