mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			testing_ac
			...
			tremor021-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					319a975fed | 
							
								
								
									
										458
									
								
								.github/AUTOLABELER_FEATURES.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										458
									
								
								.github/AUTOLABELER_FEATURES.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,458 +0,0 @@
 | 
			
		||||
# 🤖 Autolabeler Features
 | 
			
		||||
 | 
			
		||||
This document describes the automated features of our PR labeling system.
 | 
			
		||||
 | 
			
		||||
## 🎯 All Features
 | 
			
		||||
 | 
			
		||||
### 1. **Label Cleanup** ✨
 | 
			
		||||
 | 
			
		||||
Automatically removes outdated or conflicting labels when PR is updated.
 | 
			
		||||
 | 
			
		||||
**Example:**
 | 
			
		||||
 | 
			
		||||
- PR initially labeled with `feature` and `bugfix`
 | 
			
		||||
- User updates PR and only checks `bugfix`
 | 
			
		||||
- Bot removes `feature` label automatically
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
 | 
			
		||||
- Prevents label confusion
 | 
			
		||||
- Ensures accurate changelog categorization
 | 
			
		||||
- Maintains label consistency
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### 2. **Commit Message Analysis** 📝
 | 
			
		||||
 | 
			
		||||
Automatically detects change types from conventional commit messages.
 | 
			
		||||
 | 
			
		||||
**Supported Formats:**
 | 
			
		||||
 | 
			
		||||
- `fix:` or `fix(scope):` → adds `bugfix` label
 | 
			
		||||
- `feat:` or `feat(scope):` → adds `feature` label
 | 
			
		||||
- `refactor:` or `refactor(scope):` → adds `refactor` label
 | 
			
		||||
- `BREAKING CHANGE:` or `feat!:` → adds `breaking change` label
 | 
			
		||||
 | 
			
		||||
**Example:**
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
feat(docker): add support for custom networks
 | 
			
		||||
 | 
			
		||||
This adds support for user-defined networks
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
→ Automatically labeled with `feature`
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
 | 
			
		||||
- Works even if checkboxes are forgotten
 | 
			
		||||
- Supports standard Git conventions
 | 
			
		||||
- Combines with template checkboxes
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### 3. **Size Labels** 📏
 | 
			
		||||
 | 
			
		||||
Automatically adds size labels based on total lines changed.
 | 
			
		||||
 | 
			
		||||
**Size Categories:**
 | 
			
		||||
 | 
			
		||||
- `size: XS` → 1-10 lines (🟢 Green)
 | 
			
		||||
- `size: S` → 11-50 lines (🟢 Yellow-Green)
 | 
			
		||||
- `size: M` → 51-200 lines (🟡 Yellow)
 | 
			
		||||
- `size: L` → 201-500 lines (🟠 Orange)
 | 
			
		||||
- `size: XL` → 500+ lines (🔴 Red)
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
 | 
			
		||||
- Helps reviewers prioritize
 | 
			
		||||
- Quick visual indication of PR complexity
 | 
			
		||||
- Automatic and consistent
 | 
			
		||||
 | 
			
		||||
**Note:** Labels need to be created in repository first. See [SETUP_NEW_LABELS.md](SETUP_NEW_LABELS.md)
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### 4. **First-Time Contributor Welcome** 🎉
 | 
			
		||||
 | 
			
		||||
Special welcome message for contributors making their first PR.
 | 
			
		||||
 | 
			
		||||
**Example:**
 | 
			
		||||
 | 
			
		||||
```markdown
 | 
			
		||||
## 🎉 Welcome to the Community!
 | 
			
		||||
 | 
			
		||||
Thank you @username for your first contribution! 🙌
 | 
			
		||||
 | 
			
		||||
A maintainer will review your PR soon. Here are some helpful resources:
 | 
			
		||||
 | 
			
		||||
- Contributing Guide
 | 
			
		||||
- Code of Conduct
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
 | 
			
		||||
- Better onboarding experience
 | 
			
		||||
- Increases contributor retention
 | 
			
		||||
- Builds community
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### 5. **Documentation Check** 📚
 | 
			
		||||
 | 
			
		||||
Warns when code changes don't include documentation updates.
 | 
			
		||||
 | 
			
		||||
**Triggers Warning When:**
 | 
			
		||||
 | 
			
		||||
- Code files modified (`.sh`, `.func`, `.js`, `.go`, etc.)
 | 
			
		||||
- No documentation files modified (`.md`, `README`, etc.)
 | 
			
		||||
- Not a bugfix or refactor (features should have docs!)
 | 
			
		||||
 | 
			
		||||
**Example Warning:**
 | 
			
		||||
 | 
			
		||||
```markdown
 | 
			
		||||
📚 **Documentation update recommended**: Consider updating documentation
 | 
			
		||||
for these code changes.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
 | 
			
		||||
- Improves documentation coverage
 | 
			
		||||
- Reminds contributors about docs
 | 
			
		||||
- Better project maintainability
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### 6. **Related Issues Detection** 🔗
 | 
			
		||||
 | 
			
		||||
Automatically finds and links related open issues.
 | 
			
		||||
 | 
			
		||||
**How it works:**
 | 
			
		||||
 | 
			
		||||
- Extracts script names from changed files
 | 
			
		||||
- Searches open issues for matching names
 | 
			
		||||
- Links up to 5 most relevant issues
 | 
			
		||||
 | 
			
		||||
**Example:**
 | 
			
		||||
 | 
			
		||||
```markdown
 | 
			
		||||
## 🔗 Related Issues
 | 
			
		||||
 | 
			
		||||
This PR may be related to the following open issues:
 | 
			
		||||
 | 
			
		||||
- #123: Docker script fails on Ubuntu 22.04
 | 
			
		||||
- #456: Add network configuration options
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
 | 
			
		||||
- Better context for reviewers
 | 
			
		||||
- Automatic cross-referencing
 | 
			
		||||
- Helps track issue resolution
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### 7. **Validation Warnings** ⚠️
 | 
			
		||||
 | 
			
		||||
Provides helpful warnings when PR information is incomplete or inconsistent.
 | 
			
		||||
 | 
			
		||||
**Checks:**
 | 
			
		||||
 | 
			
		||||
- ✅ Change type checkbox is selected for script updates
 | 
			
		||||
- ✅ Website checkbox matches file changes
 | 
			
		||||
- ✅ Required labels are present
 | 
			
		||||
- ✅ Documentation updated for new features
 | 
			
		||||
 | 
			
		||||
**Example Warning:**
 | 
			
		||||
 | 
			
		||||
```markdown
 | 
			
		||||
## ⚠️ Validation Warnings
 | 
			
		||||
 | 
			
		||||
⚠️ **Missing change type**: Please check one of the change type checkboxes
 | 
			
		||||
(Bug fix, New feature, Refactoring, or Breaking change) in the PR description.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### 8. **Changelog Preview** 📝
 | 
			
		||||
 | 
			
		||||
Shows contributors exactly how their PR will appear in the changelog.
 | 
			
		||||
 | 
			
		||||
**Example Preview:**
 | 
			
		||||
 | 
			
		||||
```markdown
 | 
			
		||||
## 📝 Changelog Preview
 | 
			
		||||
 | 
			
		||||
This PR will appear in the changelog as:
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- #### 🐞 Bug Fixes
 | 
			
		||||
  - Fix docker script issue @username ([#123](url))
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Benefits:**
 | 
			
		||||
 | 
			
		||||
- Contributors see immediate feedback
 | 
			
		||||
- Reduces changelog errors
 | 
			
		||||
- Improves PR quality
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🏷️ Label Priority System
 | 
			
		||||
 | 
			
		||||
When multiple change types are checked, only the highest priority label is applied:
 | 
			
		||||
 | 
			
		||||
1. 🐞 **Bugfix** (highest priority)
 | 
			
		||||
2. 🔧 **Refactor**
 | 
			
		||||
3. ✨ **Feature**
 | 
			
		||||
4. 💥 **Breaking Change** (lowest priority)
 | 
			
		||||
 | 
			
		||||
**Rationale:**
 | 
			
		||||
 | 
			
		||||
- Bug fixes are most important for users
 | 
			
		||||
- Prevents PRs from appearing in multiple subcategories
 | 
			
		||||
- Maintains clean changelog structure
 | 
			
		||||
 | 
			
		||||
**Note:** This applies to both template checkboxes AND conventional commit messages!
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 📊 Changelog Categories
 | 
			
		||||
 | 
			
		||||
The bot automatically determines which changelog category your PR belongs to:
 | 
			
		||||
 | 
			
		||||
| Files Changed                        | Category                        | Note               |
 | 
			
		||||
| ------------------------------------ | ------------------------------- | ------------------ |
 | 
			
		||||
| `ct/`, `vm/`, `install/`, `turnkey/` | 🚀 Updated Scripts              | Standard scripts   |
 | 
			
		||||
| `tools/`                             | 🛠️ Updated Tools                | Utility tools      |
 | 
			
		||||
| `misc/`                              | 🔧 Core Updates                 | Core functionality |
 | 
			
		||||
| `frontend/` (not JSON)               | 🌐 Website                      | Frontend changes   |
 | 
			
		||||
| `frontend/public/json/`              | 🌐 Website > Script Information | Metadata updates   |
 | 
			
		||||
| Documentation files                  | 🧰 Maintenance                  | Docs, README, etc. |
 | 
			
		||||
 | 
			
		||||
**Multi-Category PRs:**
 | 
			
		||||
PRs that change files in multiple categories will appear in each relevant category.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🔄 Bot Behavior
 | 
			
		||||
 | 
			
		||||
### When PR is Opened/Edited:
 | 
			
		||||
 | 
			
		||||
1. ✅ Analyzes changed files
 | 
			
		||||
2. ✅ Parses PR template checkboxes
 | 
			
		||||
3. ✅ Analyzes commit messages (conventional commits)
 | 
			
		||||
4. ✅ Calculates size label
 | 
			
		||||
5. ✅ Checks if first-time contributor
 | 
			
		||||
6. ✅ Applies appropriate labels
 | 
			
		||||
7. ✅ Removes conflicting labels
 | 
			
		||||
8. ✅ Checks for validation issues
 | 
			
		||||
9. ✅ Finds related issues
 | 
			
		||||
10. ✅ Posts/updates comment with all info
 | 
			
		||||
 | 
			
		||||
### Comment Structure:
 | 
			
		||||
 | 
			
		||||
A single bot comment contains (in order):
 | 
			
		||||
 | 
			
		||||
1. 🎉 Welcome message (if first-time contributor)
 | 
			
		||||
2. ⚠️ Validation warnings (if any)
 | 
			
		||||
3. 📝 Changelog preview (always)
 | 
			
		||||
4. 🔗 Related issues (if found)
 | 
			
		||||
5. ℹ️ Footer with PR size
 | 
			
		||||
 | 
			
		||||
### Comment Updates:
 | 
			
		||||
 | 
			
		||||
- Bot updates its own comment when PR is edited (no spam)
 | 
			
		||||
- Only posts new comment if none exists
 | 
			
		||||
- Welcome message is preserved across updates
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 📝 Complete Example
 | 
			
		||||
 | 
			
		||||
Here's what a first-time contributor might see:
 | 
			
		||||
 | 
			
		||||
```markdown
 | 
			
		||||
## 🎉 Welcome to the Community!
 | 
			
		||||
 | 
			
		||||
Thank you @newuser for your first contribution! 🙌
 | 
			
		||||
 | 
			
		||||
A maintainer will review your PR soon. Here are some helpful resources:
 | 
			
		||||
 | 
			
		||||
- Contributing Guide
 | 
			
		||||
- Code of Conduct
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## ⚠️ Validation Warnings
 | 
			
		||||
 | 
			
		||||
📚 **Documentation update recommended**: Consider updating documentation
 | 
			
		||||
for these code changes.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 📝 Changelog Preview
 | 
			
		||||
 | 
			
		||||
This PR will appear in the changelog as:
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- #### ✨ New Features
 | 
			
		||||
  - Add Docker network support @newuser ([#789](url))
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🔗 Related Issues
 | 
			
		||||
 | 
			
		||||
This PR may be related to the following open issues:
 | 
			
		||||
 | 
			
		||||
- #456: Docker networking not working
 | 
			
		||||
- #123: Request: Custom network support
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
_This is an automated message from the PR labeler bot. PR size: size: M_
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🛠️ For Maintainers
 | 
			
		||||
 | 
			
		||||
### Debugging Label Issues
 | 
			
		||||
 | 
			
		||||
If labels aren't being applied correctly:
 | 
			
		||||
 | 
			
		||||
1. Check PR template checkboxes are properly formatted
 | 
			
		||||
2. Verify commit messages use conventional format
 | 
			
		||||
3. Look for bot comment explaining label decisions
 | 
			
		||||
4. Check GitHub Actions logs for errors
 | 
			
		||||
5. Verify all required labels exist in repository
 | 
			
		||||
 | 
			
		||||
### Modifying Label Behavior
 | 
			
		||||
 | 
			
		||||
**Config files:**
 | 
			
		||||
 | 
			
		||||
- `.github/autolabeler-config.json` - File path → label mappings
 | 
			
		||||
- `.github/changelog-pr-config.json` - Changelog categories
 | 
			
		||||
- `.github/workflows/autolabeler.yml` - Core logic
 | 
			
		||||
 | 
			
		||||
**Priority order** can be changed in `autolabeler.yml`:
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
const priorityOrder = ["bugfix", "refactor", "feature", "breaking change"];
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Size thresholds** can be adjusted:
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
if (totalChanges <= 10) labelsToAdd.add("size: XS");
 | 
			
		||||
else if (totalChanges <= 50) labelsToAdd.add("size: S");
 | 
			
		||||
// etc.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Creating Required Labels
 | 
			
		||||
 | 
			
		||||
Run these commands to create all size labels:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
gh label create "size: XS" --description "1-10 lines" --color "00ff00"
 | 
			
		||||
gh label create "size: S" --description "11-50 lines" --color "7fff00"
 | 
			
		||||
gh label create "size: M" --description "51-200 lines" --color "ffff00"
 | 
			
		||||
gh label create "size: L" --description "201-500 lines" --color "ff8c00"
 | 
			
		||||
gh label create "size: XL" --description "500+ lines" --color "ff0000"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
See [SETUP_NEW_LABELS.md](SETUP_NEW_LABELS.md) for full setup guide.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🧪 Testing Scenarios
 | 
			
		||||
 | 
			
		||||
### Test 1: Conventional Commits
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# Commit with conventional format
 | 
			
		||||
git commit -m "feat: add new feature"
 | 
			
		||||
# Expected: feature label, even without checkbox
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Test 2: Size Labels
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# Small PR (< 50 lines)
 | 
			
		||||
# Expected: size: S label
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Test 3: First-Time Contributor
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# Create PR from new contributor account
 | 
			
		||||
# Expected: Welcome message in bot comment
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Test 4: Documentation Check
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# Change .sh file, no .md changes
 | 
			
		||||
# Expected: Warning about missing docs
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Test 5: Related Issues
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# PR changes "docker.sh"
 | 
			
		||||
# Expected: Links to issues mentioning "docker"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🎉 Benefits Summary
 | 
			
		||||
 | 
			
		||||
✅ **Automation**: Less manual work for maintainers
 | 
			
		||||
✅ **Consistency**: All PRs follow same standard
 | 
			
		||||
✅ **Quality**: Multiple validation checks
 | 
			
		||||
✅ **Transparency**: Contributors see what happens
 | 
			
		||||
✅ **Community**: Better onboarding for new contributors
 | 
			
		||||
✅ **Context**: Automatic issue linking
 | 
			
		||||
✅ **Clean Changelogs**: Priority system prevents duplication
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🐛 Troubleshooting
 | 
			
		||||
 | 
			
		||||
**Labels not applied?**
 | 
			
		||||
 | 
			
		||||
- Check if PR template checkboxes are properly formatted
 | 
			
		||||
- Try using conventional commit messages
 | 
			
		||||
- Ensure files changed match expected patterns
 | 
			
		||||
- Look for validation warnings in bot comment
 | 
			
		||||
 | 
			
		||||
**Size label missing?**
 | 
			
		||||
 | 
			
		||||
- Labels need to be created first (see setup guide)
 | 
			
		||||
- Check if label was removed manually
 | 
			
		||||
- Verify workflow has permissions to add labels
 | 
			
		||||
 | 
			
		||||
**Wrong category?**
 | 
			
		||||
 | 
			
		||||
- Verify file paths (tools/ vs ct/ vs misc/)
 | 
			
		||||
- Check if multiple categories apply (intended behavior)
 | 
			
		||||
- Review `.github/changelog-pr-config.json`
 | 
			
		||||
 | 
			
		||||
**Bot comment not appearing?**
 | 
			
		||||
 | 
			
		||||
- Check GitHub Actions logs
 | 
			
		||||
- Verify bot has comment permissions
 | 
			
		||||
- May take a few seconds after PR creation
 | 
			
		||||
- Check if PR is from a fork (requires pull_request_target)
 | 
			
		||||
 | 
			
		||||
**Related issues not found?**
 | 
			
		||||
 | 
			
		||||
- Script name must match issue title/body
 | 
			
		||||
- Only searches open issues
 | 
			
		||||
- Limited to top 5 results
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
**Questions?** Check the workflow logs or ask in the repository discussions.
 | 
			
		||||
							
								
								
									
										11
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -11,8 +11,9 @@ body:
 | 
			
		||||
        - 🔎 If you encounter `[ERROR] in line 23: exit code *: while executing command "$@" > /dev/null 2>&1`, rerun the script with verbose mode before submitting the issue.  
 | 
			
		||||
        - 📜 **Read the script:** Familiarize yourself with the script's content and its purpose. This will help you understand the issue better and provide more relevant information
 | 
			
		||||
 | 
			
		||||
        Thank you for taking the time to report an issue! Please provide as much detail as possible to help us address the problem efficiently.
 | 
			
		||||
        Thank you for taking the time to report an issue! Please provide as much detail as possible to help us address the problem efficiently.  
 | 
			
		||||
 | 
			
		||||
     
 | 
			
		||||
  - type: input
 | 
			
		||||
    id: guidelines
 | 
			
		||||
    attributes:
 | 
			
		||||
@@ -33,7 +34,8 @@ body:
 | 
			
		||||
    id: script_command
 | 
			
		||||
    attributes:
 | 
			
		||||
      label: 📂 What was the exact command used to execute the script?
 | 
			
		||||
      placeholder: 'e.g., bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/zigbee2mqtt.sh)" or "update"'
 | 
			
		||||
      placeholder: "e.g., bash -c \"$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/zigbee2mqtt.sh)\" or \"update\""
 | 
			
		||||
    validations:
 | 
			
		||||
      required: true
 | 
			
		||||
 | 
			
		||||
  - type: checkboxes
 | 
			
		||||
@@ -54,15 +56,14 @@ body:
 | 
			
		||||
    attributes:
 | 
			
		||||
      label: 🖥️ Which Linux distribution are you using?
 | 
			
		||||
      options:
 | 
			
		||||
        -
 | 
			
		||||
        - 
 | 
			
		||||
        - Alpine
 | 
			
		||||
        - Debian 11
 | 
			
		||||
        - Debian 12
 | 
			
		||||
        - Debian 13
 | 
			
		||||
        - Ubuntu 22.04
 | 
			
		||||
        - Ubuntu 24.04
 | 
			
		||||
        - Ubuntu 25.04
 | 
			
		||||
        - Other
 | 
			
		||||
        - Ubuntu 24.10
 | 
			
		||||
    validations:
 | 
			
		||||
      required: true
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										79
									
								
								.github/SETUP_NEW_LABELS.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										79
									
								
								.github/SETUP_NEW_LABELS.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,79 +0,0 @@
 | 
			
		||||
# 🏷️ Setup New Labels
 | 
			
		||||
 | 
			
		||||
The autolabeler now uses additional size labels. These need to be created in your repository.
 | 
			
		||||
 | 
			
		||||
## Required Labels
 | 
			
		||||
 | 
			
		||||
### Size Labels (New)
 | 
			
		||||
 | 
			
		||||
These labels are automatically added based on the number of lines changed:
 | 
			
		||||
 | 
			
		||||
| Label      | Lines Changed | Color     | Description                   |
 | 
			
		||||
| ---------- | ------------- | --------- | ----------------------------- |
 | 
			
		||||
| `size: XS` | 1-10          | `#00ff00` | Extra Small - Minimal changes |
 | 
			
		||||
| `size: S`  | 11-50         | `#7fff00` | Small - Minor changes         |
 | 
			
		||||
| `size: M`  | 51-200        | `#ffff00` | Medium - Moderate changes     |
 | 
			
		||||
| `size: L`  | 201-500       | `#ff8c00` | Large - Significant changes   |
 | 
			
		||||
| `size: XL` | 500+          | `#ff0000` | Extra Large - Major changes   |
 | 
			
		||||
 | 
			
		||||
## Quick Setup Commands
 | 
			
		||||
 | 
			
		||||
Run these commands in your terminal to create all labels at once:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# Create size labels
 | 
			
		||||
gh label create "size: XS" --description "Extra Small - 1-10 lines changed" --color "00ff00"
 | 
			
		||||
gh label create "size: S" --description "Small - 11-50 lines changed" --color "7fff00"
 | 
			
		||||
gh label create "size: M" --description "Medium - 51-200 lines changed" --color "ffff00"
 | 
			
		||||
gh label create "size: L" --description "Large - 201-500 lines changed" --color "ff8c00"
 | 
			
		||||
gh label create "size: XL" --description "Extra Large - 500+ lines changed" --color "ff0000"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Manual Setup (GitHub UI)
 | 
			
		||||
 | 
			
		||||
1. Go to: `https://github.com/community-scripts/ProxmoxVE/labels`
 | 
			
		||||
2. Click "New label" for each label
 | 
			
		||||
3. Fill in:
 | 
			
		||||
   - **Name**: Use exact names from table above
 | 
			
		||||
   - **Description**: Copy from table
 | 
			
		||||
   - **Color**: Use hex codes from table (without #)
 | 
			
		||||
 | 
			
		||||
## Verification
 | 
			
		||||
 | 
			
		||||
After creating labels, test by:
 | 
			
		||||
 | 
			
		||||
1. Creating a small PR (< 10 lines) → should get `size: XS`
 | 
			
		||||
2. Check that bot comment includes size in footer
 | 
			
		||||
 | 
			
		||||
## Optional: Label Sync
 | 
			
		||||
 | 
			
		||||
For automated label management, consider using [github-label-sync](https://github.com/Financial-Times/github-label-sync):
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
  "size: XS": {
 | 
			
		||||
    "color": "00ff00",
 | 
			
		||||
    "description": "Extra Small - 1-10 lines changed"
 | 
			
		||||
  },
 | 
			
		||||
  "size: S": {
 | 
			
		||||
    "color": "7fff00",
 | 
			
		||||
    "description": "Small - 11-50 lines changed"
 | 
			
		||||
  },
 | 
			
		||||
  "size: M": {
 | 
			
		||||
    "color": "ffff00",
 | 
			
		||||
    "description": "Medium - 51-200 lines changed"
 | 
			
		||||
  },
 | 
			
		||||
  "size: L": {
 | 
			
		||||
    "color": "ff8c00",
 | 
			
		||||
    "description": "Large - 201-500 lines changed"
 | 
			
		||||
  },
 | 
			
		||||
  "size: XL": {
 | 
			
		||||
    "color": "ff0000",
 | 
			
		||||
    "description": "Extra Large - 500+ lines changed"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
**Note**: The autolabeler will work even if labels don't exist yet, but they won't be visible on PRs until created.
 | 
			
		||||
							
								
								
									
										13
									
								
								.github/autolabeler-config.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/autolabeler-config.json
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -101,11 +101,20 @@
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "tools": [
 | 
			
		||||
  "addon": [
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": [
 | 
			
		||||
        "tools/**"
 | 
			
		||||
        "tools/addon/**"
 | 
			
		||||
      ],
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "pve-tool": [
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": [
 | 
			
		||||
        "tools/pve/**"
 | 
			
		||||
      ],
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										175
									
								
								.github/changelog-pr-config.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										175
									
								
								.github/changelog-pr-config.json
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,10 +10,6 @@
 | 
			
		||||
    "labels": [
 | 
			
		||||
      "update script"
 | 
			
		||||
    ],
 | 
			
		||||
    "excludeLabels": [
 | 
			
		||||
      "tools",
 | 
			
		||||
      "core"
 | 
			
		||||
    ],
 | 
			
		||||
    "subCategories": [
 | 
			
		||||
      {
 | 
			
		||||
        "title": "🐞 Bug Fixes",
 | 
			
		||||
@@ -22,13 +18,6 @@
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "🔧 Refactor",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "refactor"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "✨ New Features",
 | 
			
		||||
        "labels": [
 | 
			
		||||
@@ -42,61 +31,6 @@
 | 
			
		||||
          "breaking change"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "title": "🛠️ Updated Tools",
 | 
			
		||||
    "labels": [
 | 
			
		||||
      "update script",
 | 
			
		||||
      "tools"
 | 
			
		||||
    ],
 | 
			
		||||
    "requireAllLabels": true,
 | 
			
		||||
    "subCategories": [
 | 
			
		||||
      {
 | 
			
		||||
        "title": "<22> Bug Fixes",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "bugfix"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "<22>🔧 Refactor",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "refactor"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "✨ New Features",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "feature"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "💥 Breaking Changes",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "breaking change"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "title": "🔧 Core Updates",
 | 
			
		||||
    "labels": [
 | 
			
		||||
      "update script",
 | 
			
		||||
      "core"
 | 
			
		||||
    ],
 | 
			
		||||
    "requireAllLabels": true,
 | 
			
		||||
    "subCategories": [
 | 
			
		||||
      {
 | 
			
		||||
        "title": "🐞 Bug Fixes",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "bugfix"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "🔧 Refactor",
 | 
			
		||||
@@ -104,63 +38,6 @@
 | 
			
		||||
          "refactor"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "✨ New Features",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "feature"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "💥 Breaking Changes",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "breaking change"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "title": "🌐 Website",
 | 
			
		||||
    "labels": [
 | 
			
		||||
      "website"
 | 
			
		||||
    ],
 | 
			
		||||
    "subCategories": [
 | 
			
		||||
      {
 | 
			
		||||
        "title": "<22> Bug Fixes",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "bugfix"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "<22> Refactor",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "refactor"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "✨ New Features",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "feature"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "<22> Breaking Changes",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "breaking change"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "<22> Script Information",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "json"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
@@ -177,13 +54,6 @@
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "🔧 Refactor",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "refactor"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "✨ New Features",
 | 
			
		||||
        "labels": [
 | 
			
		||||
@@ -199,7 +69,7 @@
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "<EFBFBD> API",
 | 
			
		||||
        "title": "📡 API",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "api"
 | 
			
		||||
        ],
 | 
			
		||||
@@ -225,6 +95,49 @@
 | 
			
		||||
          "maintenance"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "🔧 Refactor",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "refactor"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "title": "🌐 Website",
 | 
			
		||||
    "labels": [
 | 
			
		||||
      "website"
 | 
			
		||||
    ],
 | 
			
		||||
    "subCategories": [
 | 
			
		||||
      {
 | 
			
		||||
        "title": "🐞 Bug Fixes",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "bugfix"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "✨ New Features",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "feature"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "💥 Breaking Changes",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "breaking change"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "title": "📝 Script Information",
 | 
			
		||||
        "labels": [
 | 
			
		||||
          "json"
 | 
			
		||||
        ],
 | 
			
		||||
        "notes": []
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										340
									
								
								.github/workflows/autolabeler.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										340
									
								
								.github/workflows/autolabeler.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -35,7 +35,6 @@ jobs:
 | 
			
		||||
 | 
			
		||||
            const prNumber = context.payload.pull_request.number;
 | 
			
		||||
            const prBody = context.payload.pull_request.body || "";
 | 
			
		||||
            const prAuthor = context.payload.pull_request.user.login;
 | 
			
		||||
 | 
			
		||||
            let labelsToAdd = new Set();
 | 
			
		||||
 | 
			
		||||
@@ -46,24 +45,6 @@ jobs:
 | 
			
		||||
            });
 | 
			
		||||
            const prFiles = prListFilesResponse.data;
 | 
			
		||||
 | 
			
		||||
            // Get commits for commit message analysis
 | 
			
		||||
            const { data: commits } = await github.rest.pulls.listCommits({
 | 
			
		||||
              owner: context.repo.owner,
 | 
			
		||||
              repo: context.repo.repo,
 | 
			
		||||
              pull_number: prNumber,
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            // Check if this is a first-time contributor
 | 
			
		||||
            const { data: prsByAuthor } = await github.rest.pulls.list({
 | 
			
		||||
              owner: context.repo.owner,
 | 
			
		||||
              repo: context.repo.repo,
 | 
			
		||||
              state: 'all',
 | 
			
		||||
              per_page: 5
 | 
			
		||||
            });
 | 
			
		||||
            const isFirstTimeContributor = !prsByAuthor.some(pr => 
 | 
			
		||||
              pr.user.login === prAuthor && pr.number !== prNumber && pr.merged_at
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            for (const [label, rules] of Object.entries(autolabelerConfig)) {
 | 
			
		||||
              const shouldAddLabel = prFiles.some((prFile) => {
 | 
			
		||||
                return rules.some((rule) => {
 | 
			
		||||
@@ -76,316 +57,49 @@ jobs:
 | 
			
		||||
 | 
			
		||||
              if (shouldAddLabel) {
 | 
			
		||||
                labelsToAdd.add(label);
 | 
			
		||||
                if (label === "update script" || label === "new script") {
 | 
			
		||||
                if (label === "update script") {
 | 
			
		||||
                  for (const prFile of prFiles) {
 | 
			
		||||
                    const filename = prFile.filename;
 | 
			
		||||
                    if (filename.startsWith("vm/")) labelsToAdd.add("vm");
 | 
			
		||||
                    if (filename.startsWith("tools/")) labelsToAdd.add("tools");
 | 
			
		||||
                    if (filename.startsWith("misc/")) labelsToAdd.add("core");
 | 
			
		||||
                    if (filename.startsWith("tools/addon/")) labelsToAdd.add("addon");
 | 
			
		||||
                    if (filename.startsWith("tools/pve/")) labelsToAdd.add("pve-tool");
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Feature 2: Analyze commit messages for conventional commits
 | 
			
		||||
            const commitMessages = commits.map(c => c.commit.message).join('\n');
 | 
			
		||||
            const conventionalCommitLabels = [];
 | 
			
		||||
            if (labelsToAdd.size < 2) {
 | 
			
		||||
              const templateLabelMappings = {
 | 
			
		||||
                "🐞 **Bug fix**": "bugfix",
 | 
			
		||||
                "✨ **New feature**": "feature",
 | 
			
		||||
                "💥 **Breaking change**": "breaking change",
 | 
			
		||||
                "🆕 **New script**": "new script",
 | 
			
		||||
                "🌍 **Website update**": "website", // handled special
 | 
			
		||||
                "🔧 **Refactoring / Code Cleanup**": "refactor",
 | 
			
		||||
                "📝 **Documentation update**": "documentation" // mapped to maintenance
 | 
			
		||||
              };
 | 
			
		||||
 | 
			
		||||
            if (/^fix(\(.*?\))?:/im.test(commitMessages)) {
 | 
			
		||||
              conventionalCommitLabels.push("bugfix");
 | 
			
		||||
            }
 | 
			
		||||
            if (/^feat(\(.*?\))?:/im.test(commitMessages)) {
 | 
			
		||||
              conventionalCommitLabels.push("feature");
 | 
			
		||||
            }
 | 
			
		||||
            if (/^refactor(\(.*?\))?:/im.test(commitMessages)) {
 | 
			
		||||
              conventionalCommitLabels.push("refactor");
 | 
			
		||||
            }
 | 
			
		||||
            if (/BREAKING[:\s]CHANGE/i.test(commitMessages) || /^[a-z]+(\(.*?\))?!:/im.test(commitMessages)) {
 | 
			
		||||
              conventionalCommitLabels.push("breaking change");
 | 
			
		||||
            }
 | 
			
		||||
              for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
 | 
			
		||||
                const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
 | 
			
		||||
                const regex = new RegExp(`- \\[(x|X)\\]\\s*${escapedCheckbox}`, "i");
 | 
			
		||||
 | 
			
		||||
            // Parse PR template for content type labels (bugfix, feature, refactor, breaking change)
 | 
			
		||||
            const templateLabelMappings = {
 | 
			
		||||
              "🐞 **Bug fix**": "bugfix",
 | 
			
		||||
              "✨ **New feature**": "feature",
 | 
			
		||||
              "💥 **Breaking change**": "breaking change",
 | 
			
		||||
              "🆕 **New script**": "new script",
 | 
			
		||||
              "🌍 **Website update**": "website",
 | 
			
		||||
              "🔧 **Refactoring / Code Cleanup**": "refactor",
 | 
			
		||||
              "📝 **Documentation update**": "documentation"
 | 
			
		||||
            };
 | 
			
		||||
                if (regex.test(prBody)) {
 | 
			
		||||
                  if (label === "website") {
 | 
			
		||||
                    const hasJson = prFiles.some((f) => f.filename.startsWith("frontend/public/json/"));
 | 
			
		||||
                    const hasUpdateScript = labelsToAdd.has("update script");
 | 
			
		||||
                    const hasContentLabel = ["bugfix", "feature", "refactor"].some((l) => labelsToAdd.has(l));
 | 
			
		||||
 | 
			
		||||
            const contentLabels = ["bugfix", "feature", "refactor", "breaking change"];
 | 
			
		||||
            const checkedContentLabels = [];
 | 
			
		||||
 | 
			
		||||
            for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
 | 
			
		||||
              const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1");
 | 
			
		||||
              const regex = new RegExp(`- \\[(x|X)\\]\\s*${escapedCheckbox}`, "i");
 | 
			
		||||
 | 
			
		||||
              if (regex.test(prBody)) {
 | 
			
		||||
                if (label === "website") {
 | 
			
		||||
                  const hasJson = prFiles.some((f) => f.filename.startsWith("frontend/public/json/"));
 | 
			
		||||
                  labelsToAdd.add(hasJson ? "json" : "website");
 | 
			
		||||
                } else if (label === "documentation") {
 | 
			
		||||
                  labelsToAdd.add("maintenance");
 | 
			
		||||
                } else if (label === "new script") {
 | 
			
		||||
                  labelsToAdd.add("new script");
 | 
			
		||||
                } else if (contentLabels.includes(label)) {
 | 
			
		||||
                  checkedContentLabels.push(label);
 | 
			
		||||
                } else {
 | 
			
		||||
                  labelsToAdd.add(label);
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Priority system: Combine template checkboxes and conventional commits
 | 
			
		||||
            // Merge both sources
 | 
			
		||||
            const allCheckedLabels = [...new Set([...checkedContentLabels, ...conventionalCommitLabels])];
 | 
			
		||||
 | 
			
		||||
            // Priority: bugfix > refactor > feature > breaking change
 | 
			
		||||
            if (allCheckedLabels.length > 0) {
 | 
			
		||||
              const priorityOrder = ["bugfix", "refactor", "feature", "breaking change"];
 | 
			
		||||
              const highestPriorityLabel = priorityOrder.find(label => allCheckedLabels.includes(label));
 | 
			
		||||
              if (highestPriorityLabel) {
 | 
			
		||||
                labelsToAdd.add(highestPriorityLabel);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Feature 3: Add size labels based on changes
 | 
			
		||||
            const totalChanges = prFiles.reduce((sum, file) => sum + file.additions + file.deletions, 0);
 | 
			
		||||
            if (totalChanges <= 10) {
 | 
			
		||||
              labelsToAdd.add("size: XS");
 | 
			
		||||
            } else if (totalChanges <= 50) {
 | 
			
		||||
              labelsToAdd.add("size: S");
 | 
			
		||||
            } else if (totalChanges <= 200) {
 | 
			
		||||
              labelsToAdd.add("size: M");
 | 
			
		||||
            } else if (totalChanges <= 500) {
 | 
			
		||||
              labelsToAdd.add("size: L");
 | 
			
		||||
            } else {
 | 
			
		||||
              labelsToAdd.add("size: XL");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Get current PR labels
 | 
			
		||||
            const { data: currentPR } = await github.rest.pulls.get({
 | 
			
		||||
              owner: context.repo.owner,
 | 
			
		||||
              repo: context.repo.repo,
 | 
			
		||||
              pull_number: prNumber,
 | 
			
		||||
            });
 | 
			
		||||
            const currentLabels = currentPR.labels.map(label => label.name.toLowerCase());
 | 
			
		||||
 | 
			
		||||
            // Label Cleanup: Remove outdated content labels and size labels
 | 
			
		||||
            const allContentLabels = ["bugfix", "feature", "refactor", "breaking change"];
 | 
			
		||||
            const allSizeLabels = ["size: XS", "size: S", "size: M", "size: L", "size: XL"];
 | 
			
		||||
            const labelsToRemove = [
 | 
			
		||||
              ...allContentLabels.filter(label => currentLabels.includes(label) && !labelsToAdd.has(label)),
 | 
			
		||||
              ...allSizeLabels.filter(label => currentLabels.includes(label.toLowerCase()) && !labelsToAdd.has(label))
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
            for (const label of labelsToRemove) {
 | 
			
		||||
              try {
 | 
			
		||||
                await github.rest.issues.removeLabel({
 | 
			
		||||
                  owner: context.repo.owner,
 | 
			
		||||
                  repo: context.repo.repo,
 | 
			
		||||
                  issue_number: prNumber,
 | 
			
		||||
                  name: label,
 | 
			
		||||
                });
 | 
			
		||||
              } catch (error) {
 | 
			
		||||
                // Label might not exist, ignore
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Validation: Check for missing information
 | 
			
		||||
            const warnings = [];
 | 
			
		||||
            const hasUpdateOrNewScript = labelsToAdd.has("update script") || labelsToAdd.has("new script");
 | 
			
		||||
            const hasContentLabel = allContentLabels.some(label => labelsToAdd.has(label));
 | 
			
		||||
 | 
			
		||||
            if (hasUpdateOrNewScript && !hasContentLabel && !labelsToAdd.has("new script")) {
 | 
			
		||||
              warnings.push("⚠️ **Missing change type**: Please check one of the change type checkboxes (Bug fix, New feature, Refactoring, or Breaking change) in the PR description.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (labelsToAdd.has("website") && !labelsToAdd.has("json") && prFiles.some(f => f.filename.includes("frontend/"))) {
 | 
			
		||||
              const hasCheckbox = /- \[(x|X)\]\s*🌍 \*\*Website update\*\*/i.test(prBody);
 | 
			
		||||
              if (!hasCheckbox) {
 | 
			
		||||
                warnings.push("⚠️ **Missing checkbox**: Please check the '🌍 Website update' checkbox in the PR description.");
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Feature 5: Documentation check
 | 
			
		||||
            const codeFiles = prFiles.filter(f => /\.(sh|func|go|js|ts|tsx|jsx)$/.test(f.filename));
 | 
			
		||||
            const docFiles = prFiles.filter(f => /\.(md|txt)$/i.test(f.filename) || f.filename.includes('README'));
 | 
			
		||||
 | 
			
		||||
            if (codeFiles.length > 0 && docFiles.length === 0 && !labelsToAdd.has("refactor") && !labelsToAdd.has("bugfix")) {
 | 
			
		||||
              warnings.push("📚 **Documentation update recommended**: Consider updating documentation for these code changes.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Feature 6: Related issues detection
 | 
			
		||||
            let relatedIssuesText = "";
 | 
			
		||||
            const scriptFiles = prFiles.filter(f => /\.(sh|func)$/.test(f.filename));
 | 
			
		||||
            if (scriptFiles.length > 0) {
 | 
			
		||||
              const scriptNames = scriptFiles.map(f => {
 | 
			
		||||
                const match = f.filename.match(/([^\/]+)\.(sh|func)$/);
 | 
			
		||||
                return match ? match[1] : null;
 | 
			
		||||
              }).filter(Boolean);
 | 
			
		||||
 | 
			
		||||
              if (scriptNames.length > 0) {
 | 
			
		||||
                try {
 | 
			
		||||
                  const { data: openIssues } = await github.rest.issues.listForRepo({
 | 
			
		||||
                    owner: context.repo.owner,
 | 
			
		||||
                    repo: context.repo.repo,
 | 
			
		||||
                    state: 'open',
 | 
			
		||||
                    per_page: 100
 | 
			
		||||
                  });
 | 
			
		||||
 | 
			
		||||
                  const related = [];
 | 
			
		||||
                  for (const scriptName of scriptNames) {
 | 
			
		||||
                    const matchingIssues = openIssues.filter(issue => 
 | 
			
		||||
                      !issue.pull_request && 
 | 
			
		||||
                      (issue.title.toLowerCase().includes(scriptName.toLowerCase()) ||
 | 
			
		||||
                       (issue.body || '').toLowerCase().includes(scriptName.toLowerCase()))
 | 
			
		||||
                    );
 | 
			
		||||
                    related.push(...matchingIssues);
 | 
			
		||||
                  }
 | 
			
		||||
 | 
			
		||||
                  const uniqueRelated = [...new Map(related.map(i => [i.number, i])).values()];
 | 
			
		||||
                  if (uniqueRelated.length > 0) {
 | 
			
		||||
                    relatedIssuesText = "\n\n## 🔗 Related Issues\n\n";
 | 
			
		||||
                    relatedIssuesText += "This PR may be related to the following open issues:\n";
 | 
			
		||||
                    uniqueRelated.slice(0, 5).forEach(issue => {
 | 
			
		||||
                      relatedIssuesText += `- #${issue.number}: ${issue.title}\n`;
 | 
			
		||||
                    });
 | 
			
		||||
                    if (uniqueRelated.length > 5) {
 | 
			
		||||
                      relatedIssuesText += `- _...and ${uniqueRelated.length - 5} more_\n`;
 | 
			
		||||
                    if (!(hasUpdateScript && hasContentLabel)) {
 | 
			
		||||
                      labelsToAdd.add(hasJson ? "json" : "website");
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                } catch (error) {
 | 
			
		||||
                  console.error("Error fetching related issues:", error);
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Generate Changelog Preview
 | 
			
		||||
            let changelogPreview = "## 📝 Changelog Preview\n\n";
 | 
			
		||||
            changelogPreview += "This PR will appear in the changelog as:\n\n";
 | 
			
		||||
 | 
			
		||||
            const categories = [];
 | 
			
		||||
 | 
			
		||||
            if (labelsToAdd.has("new script")) {
 | 
			
		||||
              changelogPreview += "### 🆕 New Scripts\n";
 | 
			
		||||
              changelogPreview += `- ${currentPR.title} @${currentPR.user.login} ([#${prNumber}](${currentPR.html_url}))\n\n`;
 | 
			
		||||
            } else {
 | 
			
		||||
              if (labelsToAdd.has("update script")) {
 | 
			
		||||
                if (labelsToAdd.has("tools")) {
 | 
			
		||||
                  categories.push({ name: "🛠️ Updated Tools", label: labelsToAdd });
 | 
			
		||||
                } else if (labelsToAdd.has("core")) {
 | 
			
		||||
                  categories.push({ name: "🔧 Core Updates", label: labelsToAdd });
 | 
			
		||||
                } else {
 | 
			
		||||
                  categories.push({ name: "🚀 Updated Scripts", label: labelsToAdd });
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
              
 | 
			
		||||
              if (labelsToAdd.has("website") || labelsToAdd.has("json")) {
 | 
			
		||||
                categories.push({ name: "🌐 Website", label: labelsToAdd });
 | 
			
		||||
              }
 | 
			
		||||
              
 | 
			
		||||
              if (labelsToAdd.has("maintenance")) {
 | 
			
		||||
                categories.push({ name: "🧰 Maintenance", label: labelsToAdd });
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              for (const category of categories) {
 | 
			
		||||
                changelogPreview += `### ${category.name}\n`;
 | 
			
		||||
                
 | 
			
		||||
                const subCategoryMap = {
 | 
			
		||||
                  "bugfix": "  - #### 🐞 Bug Fixes",
 | 
			
		||||
                  "refactor": "  - #### 🔧 Refactor",
 | 
			
		||||
                  "feature": "  - #### ✨ New Features",
 | 
			
		||||
                  "breaking change": "  - #### 💥 Breaking Changes"
 | 
			
		||||
                };
 | 
			
		||||
                
 | 
			
		||||
                const matchedSubCat = allContentLabels.find(label => labelsToAdd.has(label));
 | 
			
		||||
                if (matchedSubCat && subCategoryMap[matchedSubCat]) {
 | 
			
		||||
                  changelogPreview += `${subCategoryMap[matchedSubCat]}\n`;
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                if (labelsToAdd.has("json")) {
 | 
			
		||||
                  changelogPreview += "  - #### 📝 Script Information\n";
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                changelogPreview += `    - ${currentPR.title} @${currentPR.user.login} ([#${prNumber}](${currentPR.html_url}))\n\n`;
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              if (categories.length === 0) {
 | 
			
		||||
                changelogPreview += "_This PR may not appear in the changelog. Please ensure proper labels are set._\n\n";
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Post comment with warnings and changelog preview
 | 
			
		||||
            if (warnings.length > 0 || changelogPreview || relatedIssuesText || isFirstTimeContributor) {
 | 
			
		||||
              let commentBody = "";
 | 
			
		||||
              
 | 
			
		||||
              // Feature 4: First-time contributor welcome
 | 
			
		||||
              if (isFirstTimeContributor) {
 | 
			
		||||
                commentBody += "## 🎉 Welcome to the Community!\n\n";
 | 
			
		||||
                commentBody += `Thank you **@${prAuthor}** for your first contribution! 🙌\n\n`;
 | 
			
		||||
                commentBody += "A maintainer will review your PR soon. Here are some helpful resources:\n";
 | 
			
		||||
                commentBody += "- [Contributing Guide](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md)\n";
 | 
			
		||||
                commentBody += "- [Code of Conduct](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CODE_OF_CONDUCT.md)\n\n";
 | 
			
		||||
                commentBody += "---\n\n";
 | 
			
		||||
              }
 | 
			
		||||
              
 | 
			
		||||
              if (warnings.length > 0) {
 | 
			
		||||
                commentBody += "## ⚠️ Validation Warnings\n\n";
 | 
			
		||||
                commentBody += warnings.join("\n\n") + "\n\n---\n\n";
 | 
			
		||||
              }
 | 
			
		||||
              
 | 
			
		||||
              commentBody += changelogPreview;
 | 
			
		||||
              
 | 
			
		||||
              if (relatedIssuesText) {
 | 
			
		||||
                commentBody += relatedIssuesText;
 | 
			
		||||
              }
 | 
			
		||||
              
 | 
			
		||||
              commentBody += "\n\n---\n";
 | 
			
		||||
              commentBody += `_This is an automated message from the PR labeler bot. PR size: ${Array.from(labelsToAdd).find(l => l.startsWith('size:')) || 'unknown'}_`;
 | 
			
		||||
 | 
			
		||||
              // Check if we already posted a comment
 | 
			
		||||
              const { data: comments } = await github.rest.issues.listComments({
 | 
			
		||||
                owner: context.repo.owner,
 | 
			
		||||
                repo: context.repo.repo,
 | 
			
		||||
                issue_number: prNumber,
 | 
			
		||||
              });
 | 
			
		||||
 | 
			
		||||
              const botComment = comments.find(comment => 
 | 
			
		||||
                comment.user.login === "github-actions[bot]" && 
 | 
			
		||||
                (comment.body.includes("Changelog Preview") || comment.body.includes("Welcome to the Community"))
 | 
			
		||||
              );
 | 
			
		||||
 | 
			
		||||
              if (botComment) {
 | 
			
		||||
                // Update existing comment (but keep welcome message if it was there)
 | 
			
		||||
                let updatedBody = commentBody;
 | 
			
		||||
                if (botComment.body.includes("Welcome to the Community") && !isFirstTimeContributor) {
 | 
			
		||||
                  // Preserve welcome message from original comment
 | 
			
		||||
                  const welcomeSection = botComment.body.match(/## 🎉 Welcome to the Community![\s\S]*?---\n\n/);
 | 
			
		||||
                  if (welcomeSection) {
 | 
			
		||||
                    updatedBody = welcomeSection[0] + commentBody;
 | 
			
		||||
                  } else if (label === "documentation") {
 | 
			
		||||
                    labelsToAdd.add("maintenance");
 | 
			
		||||
                  } else {
 | 
			
		||||
                    labelsToAdd.add(label);
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                await github.rest.issues.updateComment({
 | 
			
		||||
                  owner: context.repo.owner,
 | 
			
		||||
                  repo: context.repo.repo,
 | 
			
		||||
                  comment_id: botComment.id,
 | 
			
		||||
                  body: updatedBody,
 | 
			
		||||
                });
 | 
			
		||||
              } else {
 | 
			
		||||
                // Create new comment
 | 
			
		||||
                await github.rest.issues.createComment({
 | 
			
		||||
                  owner: context.repo.owner,
 | 
			
		||||
                  repo: context.repo.repo,
 | 
			
		||||
                  issue_number: prNumber,
 | 
			
		||||
                  body: commentBody,
 | 
			
		||||
                });
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (labelsToAdd.size === 0) {
 | 
			
		||||
              labelsToAdd.add("needs triage");
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										156
									
								
								.github/workflows/changelog-pr.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										156
									
								
								.github/workflows/changelog-pr.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -67,12 +67,29 @@ jobs:
 | 
			
		||||
              const categorizedPRs = changelogConfig.map(obj => ({
 | 
			
		||||
                ...obj,
 | 
			
		||||
                notes: [],
 | 
			
		||||
                requireAllLabels: obj.requireAllLabels ?? false,
 | 
			
		||||
                excludeLabels: obj.excludeLabels ?? [],
 | 
			
		||||
                subCategories: obj.subCategories ? obj.subCategories.map(sub => ({
 | 
			
		||||
                  ...sub,
 | 
			
		||||
                  notes: []
 | 
			
		||||
                })) : []
 | 
			
		||||
                subCategories: obj.subCategories ?? (
 | 
			
		||||
                  obj.labels.includes("update script") ? [
 | 
			
		||||
                    { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] },
 | 
			
		||||
                    { title: "✨ New Features", labels: ["feature"], notes: [] },
 | 
			
		||||
                    { title: "💥 Breaking Changes", labels: ["breaking change"], notes: [] },
 | 
			
		||||
                    { title: "🔧 Refactor", labels: ["refactor"], notes: [] },
 | 
			
		||||
                  ] :
 | 
			
		||||
                  obj.labels.includes("maintenance") ? [
 | 
			
		||||
                    { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] },
 | 
			
		||||
                    { title: "✨ New Features", labels: ["feature"], notes: [] },
 | 
			
		||||
                    { title: "💥 Breaking Changes", labels: ["breaking change"], notes: [] },
 | 
			
		||||
                    { title: "📡 API", labels: ["api"], notes: [] },
 | 
			
		||||
                    { title: "Github", labels: ["github"], notes: [] },
 | 
			
		||||
                    { title: "📝 Documentation", labels: ["maintenance"], notes: [] },
 | 
			
		||||
                    { title: "🔧 Refactor", labels: ["refactor"], notes: [] }
 | 
			
		||||
                  ] :
 | 
			
		||||
                  obj.labels.includes("website") ? [
 | 
			
		||||
                    { title: "🐞 Bug Fixes", labels: ["bugfix"], notes: [] },
 | 
			
		||||
                    { title: "✨ New Features", labels: ["feature"], notes: [] },
 | 
			
		||||
                    { title: "💥 Breaking Changes", labels: ["breaking change"], notes: [] },
 | 
			
		||||
                    { title: "Script Information", labels: ["json"], notes: [] }
 | 
			
		||||
                  ] : []
 | 
			
		||||
                )
 | 
			
		||||
              }));
 | 
			
		||||
 | 
			
		||||
              const latestDateInChangelog = new Date(process.env.LATEST_DATE);
 | 
			
		||||
@@ -98,92 +115,69 @@ jobs:
 | 
			
		||||
 | 
			
		||||
              for (const pr of filteredPRs) {
 | 
			
		||||
                const prLabels = pr.labels.map(label => label.name.toLowerCase());
 | 
			
		||||
                let prNote;
 | 
			
		||||
                
 | 
			
		||||
                if (pr.user.login.includes("push-app-to-main[bot]")) {
 | 
			
		||||
 | 
			
		||||
                  const scriptName = pr.title;
 | 
			
		||||
                  try {
 | 
			
		||||
                    const { data: relatedIssues } = await github.rest.issues.listForRepo({
 | 
			
		||||
                      owner: context.repo.owner,
 | 
			
		||||
                      repo: "ProxmoxVED",
 | 
			
		||||
                      state: "all",
 | 
			
		||||
                      labels: ["Started Migration To ProxmoxVE"]
 | 
			
		||||
                    });
 | 
			
		||||
                    try {
 | 
			
		||||
                      const { data: relatedIssues } = await github.rest.issues.listForRepo({
 | 
			
		||||
                        owner: context.repo.owner,
 | 
			
		||||
                        repo: "ProxmoxVED",
 | 
			
		||||
                        state: "all",
 | 
			
		||||
                        labels: ["Started Migration To ProxmoxVE"]
 | 
			
		||||
                      });
 | 
			
		||||
 | 
			
		||||
                    const matchingIssue = relatedIssues.find(issue =>
 | 
			
		||||
                      issue.title.toLowerCase().includes(scriptName.toLowerCase())
 | 
			
		||||
                    );
 | 
			
		||||
 | 
			
		||||
                    if (matchingIssue) {
 | 
			
		||||
                      const issueAuthor = matchingIssue.user.login;
 | 
			
		||||
                      prNote = `- ${pr.title} @${issueAuthor} ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
                    } else {
 | 
			
		||||
                      prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
                    }
 | 
			
		||||
                  } catch (error) {
 | 
			
		||||
                    console.error(`Error fetching related issues: ${error}`);
 | 
			
		||||
                    prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
                  }
 | 
			
		||||
                } else {
 | 
			
		||||
                  prNote = `- ${pr.title} @${pr.user.login} ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Handle "new script" separately - always goes to New Scripts category
 | 
			
		||||
                if (prLabels.includes("new script")) {
 | 
			
		||||
                  const newScriptCategory = categorizedPRs.find(category =>
 | 
			
		||||
                    category.title === "🆕 New Scripts" || category.labels.includes("new script")
 | 
			
		||||
                  );
 | 
			
		||||
                  if (newScriptCategory) {
 | 
			
		||||
                    newScriptCategory.notes.push(prNote);
 | 
			
		||||
                  }
 | 
			
		||||
                  continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // For other PRs, check all applicable categories (can appear in multiple)
 | 
			
		||||
                for (const category of categorizedPRs) {
 | 
			
		||||
                  // Skip "new script" and unlabelled categories
 | 
			
		||||
                  if (category.labels.includes("new script") || category.labels.length === 0) {
 | 
			
		||||
                    continue;
 | 
			
		||||
                  }
 | 
			
		||||
 | 
			
		||||
                  // Check if PR matches category requirements
 | 
			
		||||
                  let matchesCategory = false;
 | 
			
		||||
                  
 | 
			
		||||
                  if (category.requireAllLabels) {
 | 
			
		||||
                    // All labels must be present
 | 
			
		||||
                    matchesCategory = category.labels.every(label => prLabels.includes(label));
 | 
			
		||||
                  } else {
 | 
			
		||||
                    // At least one label must be present
 | 
			
		||||
                    matchesCategory = category.labels.some(label => prLabels.includes(label));
 | 
			
		||||
                  }
 | 
			
		||||
 | 
			
		||||
                  // Check exclude labels
 | 
			
		||||
                  if (matchesCategory && category.excludeLabels.length > 0) {
 | 
			
		||||
                    const hasExcludedLabel = category.excludeLabels.some(label => prLabels.includes(label));
 | 
			
		||||
                    if (hasExcludedLabel) {
 | 
			
		||||
                      matchesCategory = false;
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
 | 
			
		||||
                  if (matchesCategory) {
 | 
			
		||||
                    // Try to find matching subcategory
 | 
			
		||||
                    if (category.subCategories && category.subCategories.length > 0) {
 | 
			
		||||
                      const subCategory = category.subCategories.find(sub =>
 | 
			
		||||
                        sub.labels.some(label => prLabels.includes(label))
 | 
			
		||||
                      const matchingIssue = relatedIssues.find(issue =>
 | 
			
		||||
                        issue.title.toLowerCase().includes(scriptName.toLowerCase())
 | 
			
		||||
                      );
 | 
			
		||||
 | 
			
		||||
                      if (subCategory) {
 | 
			
		||||
                        subCategory.notes.push(prNote);
 | 
			
		||||
                      } else {
 | 
			
		||||
                        // No matching subcategory, add to main category
 | 
			
		||||
                        category.notes.push(prNote);
 | 
			
		||||
                      if (matchingIssue) {
 | 
			
		||||
                        const issueAuthor = matchingIssue.user.login;
 | 
			
		||||
                        const issueAuthorUrl = `https://github.com/${issueAuthor}`;
 | 
			
		||||
                        prNote = `- ${pr.title} [@${issueAuthor}](${issueAuthorUrl}) ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
                      }
 | 
			
		||||
                      else {
 | 
			
		||||
                        prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
                      }
 | 
			
		||||
                    } catch (error) {
 | 
			
		||||
                      console.error(`Error fetching related issues: ${error}`);
 | 
			
		||||
                      prNote = `- ${pr.title} ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
                    }
 | 
			
		||||
                }else{
 | 
			
		||||
                  prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                if (prLabels.includes("new script")) {
 | 
			
		||||
                  const newScriptCategory = categorizedPRs.find(category =>
 | 
			
		||||
                  category.title === "New Scripts" || category.labels.includes("new script"));
 | 
			
		||||
                  if (newScriptCategory) {
 | 
			
		||||
                  newScriptCategory.notes.push(prNote);
 | 
			
		||||
                  }
 | 
			
		||||
                } else {
 | 
			
		||||
 | 
			
		||||
                  let categorized = false;
 | 
			
		||||
                  const priorityCategories = categorizedPRs.slice();
 | 
			
		||||
                  for (const category of priorityCategories) {
 | 
			
		||||
                  if (categorized) break;
 | 
			
		||||
                  if (category.labels.some(label => prLabels.includes(label))) {
 | 
			
		||||
                    if (category.subCategories && category.subCategories.length > 0) {
 | 
			
		||||
                    const subCategory = category.subCategories.find(sub =>
 | 
			
		||||
                      sub.labels.some(label => prLabels.includes(label))
 | 
			
		||||
                    );
 | 
			
		||||
 | 
			
		||||
                    if (subCategory) {
 | 
			
		||||
                      subCategory.notes.push(prNote);
 | 
			
		||||
                    } else {
 | 
			
		||||
                      // No subcategories, add to main category
 | 
			
		||||
                      category.notes.push(prNote);
 | 
			
		||||
                    }
 | 
			
		||||
                    } else {
 | 
			
		||||
                    category.notes.push(prNote);
 | 
			
		||||
                    }
 | 
			
		||||
                    categorized = true;
 | 
			
		||||
                  }
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              return categorizedPRs;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										104
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -10,121 +10,17 @@
 | 
			
		||||
> [!CAUTION]
 | 
			
		||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
 | 
			
		||||
 | 
			
		||||
## 2025-11-04
 | 
			
		||||
 | 
			
		||||
## 2025-11-03
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
  - Donetick ([#8835](https://github.com/community-scripts/ProxmoxVE/pull/8835))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Immich: Pin version to 2.2.2 [@vhsdream](https://github.com/vhsdream) ([#8848](https://github.com/community-scripts/ProxmoxVE/pull/8848))
 | 
			
		||||
    - Asterisk: handle errors in version retrieval commands [@MickLesk](https://github.com/MickLesk) ([#8844](https://github.com/community-scripts/ProxmoxVE/pull/8844))
 | 
			
		||||
    - linkstack: fix wrong directory installation [@omertahaoztop](https://github.com/omertahaoztop) ([#8814](https://github.com/community-scripts/ProxmoxVE/pull/8814))
 | 
			
		||||
    - Remove BOM from shebang lines in ct scripts [@MickLesk](https://github.com/MickLesk) ([#8833](https://github.com/community-scripts/ProxmoxVE/pull/8833))
 | 
			
		||||
 | 
			
		||||
  - #### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
    - Removed: MeTube [@MickLesk](https://github.com/MickLesk) ([#8830](https://github.com/community-scripts/ProxmoxVE/pull/8830))
 | 
			
		||||
 | 
			
		||||
## 2025-11-02
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - Zigbee2MQTT: fix: pnpm workspace in update [@fkroeger](https://github.com/fkroeger) ([#8825](https://github.com/community-scripts/ProxmoxVE/pull/8825))
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Pangolin: Fix install and database migration [@tremor021](https://github.com/tremor021) ([#8828](https://github.com/community-scripts/ProxmoxVE/pull/8828))
 | 
			
		||||
    - MediaManager: fix BASE_PATH error preventing main page load [@vhsdream](https://github.com/vhsdream) ([#8821](https://github.com/community-scripts/ProxmoxVE/pull/8821))
 | 
			
		||||
 | 
			
		||||
## 2025-11-01
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
  - Pangolin ([#8809](https://github.com/community-scripts/ProxmoxVE/pull/8809))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - VictoriaMetrics: Fix release fetching for Victori Logs add-on [@tremor021](https://github.com/tremor021) ([#8807](https://github.com/community-scripts/ProxmoxVE/pull/8807))
 | 
			
		||||
    - Immich: Pin version to 2.2.1 [@vhsdream](https://github.com/vhsdream) ([#8800](https://github.com/community-scripts/ProxmoxVE/pull/8800))
 | 
			
		||||
    - jellyfin: fix: initial update [@CrazyWolf13](https://github.com/CrazyWolf13) ([#8784](https://github.com/community-scripts/ProxmoxVE/pull/8784))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
  - frontend: chore: bump debian OS [@CrazyWolf13](https://github.com/CrazyWolf13) ([#8798](https://github.com/community-scripts/ProxmoxVE/pull/8798))
 | 
			
		||||
 | 
			
		||||
## 2025-10-31
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Reitti: Fix missing data directory [@tremor021](https://github.com/tremor021) ([#8787](https://github.com/community-scripts/ProxmoxVE/pull/8787))
 | 
			
		||||
    - omada: fix update script with mongodb 8 [@MickLesk](https://github.com/MickLesk) ([#8724](https://github.com/community-scripts/ProxmoxVE/pull/8724))
 | 
			
		||||
    - Booklore: Fix port configuration for Nginx [@tremor021](https://github.com/tremor021) ([#8780](https://github.com/community-scripts/ProxmoxVE/pull/8780))
 | 
			
		||||
    - Fix paths in grist.sh [@mrinaldi](https://github.com/mrinaldi) ([#8777](https://github.com/community-scripts/ProxmoxVE/pull/8777))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
  - #### 📝 Script Information
 | 
			
		||||
 | 
			
		||||
    - Removed errant ` from wireguard.json [@AndrewDragonCh](https://github.com/AndrewDragonCh) ([#8791](https://github.com/community-scripts/ProxmoxVE/pull/8791))
 | 
			
		||||
 | 
			
		||||
## 2025-10-30
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
  - Livebook ([#8739](https://github.com/community-scripts/ProxmoxVE/pull/8739))
 | 
			
		||||
- Reitti ([#8736](https://github.com/community-scripts/ProxmoxVE/pull/8736))
 | 
			
		||||
- BentoPDF ([#8735](https://github.com/community-scripts/ProxmoxVE/pull/8735))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Open Archiver: Fix missing daemon-reload [@tremor021](https://github.com/tremor021) ([#8768](https://github.com/community-scripts/ProxmoxVE/pull/8768))
 | 
			
		||||
    - Open Archiver: Fix missing command in update procedure [@tremor021](https://github.com/tremor021) ([#8765](https://github.com/community-scripts/ProxmoxVE/pull/8765))
 | 
			
		||||
    - Kimai: Fix database connection string [@tremor021](https://github.com/tremor021) ([#8758](https://github.com/community-scripts/ProxmoxVE/pull/8758))
 | 
			
		||||
    - Add explicit exit calls to update_script functions [@MickLesk](https://github.com/MickLesk) ([#8752](https://github.com/community-scripts/ProxmoxVE/pull/8752))
 | 
			
		||||
    - kimai: Set global SQL mode to empty in install script [@MickLesk](https://github.com/MickLesk) ([#8747](https://github.com/community-scripts/ProxmoxVE/pull/8747))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - Immich: Updates for v2.2.0 [@vhsdream](https://github.com/vhsdream) ([#8770](https://github.com/community-scripts/ProxmoxVE/pull/8770))
 | 
			
		||||
    - Standardize update success messages in scripts [@MickLesk](https://github.com/MickLesk) ([#8757](https://github.com/community-scripts/ProxmoxVE/pull/8757))
 | 
			
		||||
    - core: add function cleanup_lxc [@MickLesk](https://github.com/MickLesk) ([#8749](https://github.com/community-scripts/ProxmoxVE/pull/8749))
 | 
			
		||||
    - Asterisk: add interactive version selection to installer [@MickLesk](https://github.com/MickLesk) ([#8726](https://github.com/community-scripts/ProxmoxVE/pull/8726))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
  - #### 📝 Script Information
 | 
			
		||||
 | 
			
		||||
    - Cronicle: Update default credentials [@tremor021](https://github.com/tremor021) ([#8720](https://github.com/community-scripts/ProxmoxVE/pull/8720))
 | 
			
		||||
 | 
			
		||||
## 2025-10-29
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Docker-VM: add workaround for libguestfs issue on Proxmox VE 9+ [@MickLesk](https://github.com/MickLesk) ([#8722](https://github.com/community-scripts/ProxmoxVE/pull/8722))
 | 
			
		||||
    - Dispatcharr: add folders in installer / add more build ressources [@MickLesk](https://github.com/MickLesk) ([#8708](https://github.com/community-scripts/ProxmoxVE/pull/8708))
 | 
			
		||||
    - LibreTranslate: bump torch version [@MickLesk](https://github.com/MickLesk) ([#8710](https://github.com/community-scripts/ProxmoxVE/pull/8710))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - Archivebox: add Chromium and Node modules [@MickLesk](https://github.com/MickLesk) ([#8725](https://github.com/community-scripts/ProxmoxVE/pull/8725))
 | 
			
		||||
 | 
			
		||||
  - #### 🔧 Refactor
 | 
			
		||||
 | 
			
		||||
    - tracktor: refactor envfile [@CrazyWolf13](https://github.com/CrazyWolf13) ([#8711](https://github.com/community-scripts/ProxmoxVE/pull/8711))
 | 
			
		||||
    - Kimai / Ghost / ManageMyDamnLife: Switch to MariaDB [@MickLesk](https://github.com/MickLesk) ([#8712](https://github.com/community-scripts/ProxmoxVE/pull/8712))
 | 
			
		||||
 | 
			
		||||
## 2025-10-28
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,7 @@ function update_script() {
 | 
			
		||||
    $STD apt -y autoclean
 | 
			
		||||
    $STD apt -y clean
 | 
			
		||||
    msg_ok "Cleanup Completed"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,6 @@ function update_script() {
 | 
			
		||||
      msg_info "Starting Service"
 | 
			
		||||
      systemctl start actualbudget
 | 
			
		||||
      msg_ok "Started Service"
 | 
			
		||||
      msg_ok "Updated successfully!"
 | 
			
		||||
    else
 | 
			
		||||
      msg_info "${APP} is already up to date"
 | 
			
		||||
    fi
 | 
			
		||||
@@ -52,7 +51,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Old Installation Found, you need to migrate your data and recreate to a new container"
 | 
			
		||||
    msg_info "Please follow the instructions on the ${APP} website to migrate your data"
 | 
			
		||||
    msg_info "https://actualbudget.org/docs/backup-restore/backup"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -73,7 +73,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf /opt/adventurelog-backup
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  RELEASE=$(curl -fsSL "https://www.ispyconnect.com/api/Agent/DownloadLocation4?platform=Linux64&fromVersion=0" | grep -o 'https://.*\.zip')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat ~/.agentdvr 2>/dev/null)" ]] || [[ ! -f ~/.agentdvr ]]; then
 | 
			
		||||
    msg_info "Stopping service"
 | 
			
		||||
@@ -39,14 +39,15 @@ function update_script() {
 | 
			
		||||
    curl -fsSL "$RELEASE" -o $(basename "$RELEASE")
 | 
			
		||||
    $STD unzip -o Agent_Linux64*.zip
 | 
			
		||||
    chmod +x ./Agent
 | 
			
		||||
    echo $RELEASE >~/.agentdvr
 | 
			
		||||
    echo $RELEASE > ~/.agentdvr
 | 
			
		||||
    rm -rf Agent_Linux64*.zip
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting service"
 | 
			
		||||
    systemctl start AgentDVR
 | 
			
		||||
    msg_ok "Service started"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated $APP successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting AdGuard Home"
 | 
			
		||||
  $STD rc-service adguardhome restart
 | 
			
		||||
  msg_ok "Restarted AdGuard Home"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
  if [[ ! -d /opt/bitmagnet ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/bitmagnet-io/bitmagnet/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [ "${RELEASE}" != "$(cat /opt/bitmagnet_version.txt)" ] || [ ! -f /opt/bitmagnet_version.txt ]; then
 | 
			
		||||
@@ -71,10 +71,11 @@ function update_script() {
 | 
			
		||||
    rm -f "$temp_file"
 | 
			
		||||
    echo "${RELEASE}" >/opt/bitmagnet_version.txt
 | 
			
		||||
    $STD service bitmagnet start
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,8 +32,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting Caddy"
 | 
			
		||||
  rc-service caddy restart
 | 
			
		||||
  msg_ok "Restarted Caddy"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit 0
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -37,12 +37,10 @@ function update_script() {
 | 
			
		||||
    case $CHOICE in
 | 
			
		||||
    1)
 | 
			
		||||
      $STD apk -U upgrade
 | 
			
		||||
      msg_ok "Updated successfully!"
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
  done
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting Forgejo"
 | 
			
		||||
  $STD rc-service forgejo restart
 | 
			
		||||
  msg_ok "Restarted Forgejo"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -46,11 +46,11 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    rc-service garage start || rc-service garage restart
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Update Successfully!"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. Garage is already at ${GITEA_RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit 0
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
  if [[ ! -d /opt/gatus ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [ "${RELEASE}" != "$(cat /opt/gatus_version.txt)" ] || [ ! -f /opt/gatus_version.txt ]; then
 | 
			
		||||
@@ -44,10 +44,11 @@ function update_script() {
 | 
			
		||||
    rm -f "$temp_file"
 | 
			
		||||
    echo "${RELEASE}" >/opt/gatus_version.txt
 | 
			
		||||
    $STD service gatus start
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,8 +32,6 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting Gitea"
 | 
			
		||||
  rc-service gitea restart
 | 
			
		||||
  msg_ok "Restarted Gitea"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -40,24 +40,20 @@ function update_script() {
 | 
			
		||||
    case $CHOICE in
 | 
			
		||||
    1)
 | 
			
		||||
      $STD apk -U upgrade
 | 
			
		||||
      msg_ok "Updated successfully!"
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    2)
 | 
			
		||||
      sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/grafana
 | 
			
		||||
      service grafana restart
 | 
			
		||||
      msg_ok "Allowed listening on all interfaces!"
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    3)
 | 
			
		||||
      sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/grafana
 | 
			
		||||
      service grafana restart
 | 
			
		||||
      msg_ok "Allowed listening only on ${LXCIP}!"
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
  done
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
  if [ ! -d /usr/share/nginx/html ]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/sharevb/it-tools/releases/latest | grep '"tag_name":' | cut -d '"' -f4)
 | 
			
		||||
@@ -37,10 +37,11 @@ function update_script() {
 | 
			
		||||
    cp -r /tmp/dist/* /usr/share/nginx/html
 | 
			
		||||
    rm -rf /tmp/dist
 | 
			
		||||
    rm -f it-tools.zip
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,14 +22,14 @@ catch_errors
 | 
			
		||||
function update_script() {
 | 
			
		||||
  [[ -d /opt/komodo ]] || {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
  COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
 | 
			
		||||
  if [[ -z "$COMPOSE_FILE" ]]; then
 | 
			
		||||
    msg_error "No valid compose file found in /opt/komodo!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  COMPOSE_BASENAME=$(basename "$COMPOSE_FILE")
 | 
			
		||||
 | 
			
		||||
@@ -38,25 +38,24 @@ function update_script() {
 | 
			
		||||
    echo -e "${YW}This configuration is no longer supported since Komodo v1.18.0.${CL}"
 | 
			
		||||
    echo -e "${YW}Please follow the migration guide:${CL}"
 | 
			
		||||
    echo -e "${BGN}https://github.com/community-scripts/ProxmoxVE/discussions/5689${CL}\n"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  BACKUP_FILE="/opt/komodo/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)"
 | 
			
		||||
  cp "$COMPOSE_FILE" "$BACKUP_FILE" || {
 | 
			
		||||
    msg_error "Failed to create backup of ${COMPOSE_BASENAME}!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  }
 | 
			
		||||
  GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}"
 | 
			
		||||
  if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then
 | 
			
		||||
    msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!"
 | 
			
		||||
    mv "$BACKUP_FILE" "$COMPOSE_FILE"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env pull
 | 
			
		||||
  $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
 | 
			
		||||
  msg_ok "Updated Alpine-Komodo"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit 0
 | 
			
		||||
  msg_ok "Updated ${APP}"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting MariaDB"
 | 
			
		||||
  $STD rc-service mariadb restart
 | 
			
		||||
  msg_ok "Restarted MariaDB"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,6 @@ function update_script() {
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
  done
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Updating Node-RED"
 | 
			
		||||
  $STD npm install -g --unsafe-perm node-red
 | 
			
		||||
  msg_ok "Updated Node-RED"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting PostgreSQL"
 | 
			
		||||
  $STD rc-service postgresql restart
 | 
			
		||||
  msg_ok "Restarted PostgreSQL"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting Prometheus"
 | 
			
		||||
  $STD rc-service prometheus restart
 | 
			
		||||
  msg_ok "Restarted Prometheus"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  if [ ! -d /opt/rclone ]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/rclone/rclone/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [ "${RELEASE}" != "$(cat /opt/rclone_version.txt)" ] || [ ! -f /opt/rclone_version.txt ]; then
 | 
			
		||||
@@ -34,10 +34,11 @@ function update_script() {
 | 
			
		||||
    $STD unzip -o "$temp_file" '*/**' -d /opt/rclone
 | 
			
		||||
    rm -f "$temp_file"
 | 
			
		||||
    echo "${RELEASE}" >/opt/rclone_version.txt
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ function update_script() {
 | 
			
		||||
      msg_info "Updating Redis"
 | 
			
		||||
      apk update && apk upgrade redis
 | 
			
		||||
      rc-service redis restart
 | 
			
		||||
      msg_ok "Updated successfully!"
 | 
			
		||||
      msg_ok "Redis updated successfully!"
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    2)
 | 
			
		||||
 
 | 
			
		||||
@@ -41,8 +41,9 @@ function update_script() {
 | 
			
		||||
  msg_info "Starting Service"
 | 
			
		||||
  $STD rc-service redlib start
 | 
			
		||||
  msg_ok "Started Service"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit 0
 | 
			
		||||
 | 
			
		||||
  msg_ok "Update Successful"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  if [[ ! -d /opt/rustdesk-server ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  APIRELEASE=$(curl -s https://api.github.com/repos/lejianwen/rustdesk-api/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
 
 | 
			
		||||
@@ -31,8 +31,8 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting Syncthing"
 | 
			
		||||
  $STD rc-service syncthing restart
 | 
			
		||||
  msg_ok "Restarted Syncthing"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit 0
 | 
			
		||||
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
  if [[ ! -d /opt/teamspeak-server ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  set +o pipefail && RELEASE=$(curl -fsSL https://teamspeak.com/en/downloads/#server | sed -n 's/.*teamspeak3-server_linux_amd64-\([0-9.]*[0-9]\).*/\1/p' | head -1) && set -o pipefail
 | 
			
		||||
@@ -40,10 +40,11 @@ function update_script() {
 | 
			
		||||
    rm -rf teamspeak3-server_linux_amd64
 | 
			
		||||
    echo "${RELEASE}" >~/.teamspeak-server
 | 
			
		||||
    $STD service teamspeak start
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ catch_errors
 | 
			
		||||
function update_script() {
 | 
			
		||||
  if [[ ! -d /opt/tinyauth ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating packages"
 | 
			
		||||
@@ -45,7 +45,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Restarting Tinyauth"
 | 
			
		||||
    $STD service tinyauth start
 | 
			
		||||
    msg_ok "Restarted Tinyauth"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Tinyauth"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -25,11 +25,10 @@ function update_script() {
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating traefik from edge"
 | 
			
		||||
  msg_info "Upgrading traefik from edge"
 | 
			
		||||
  $STD apk add traefik --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
 | 
			
		||||
  msg_ok "Updated traefik"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit 0
 | 
			
		||||
  msg_ok "Upgraded traefik"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -31,8 +31,8 @@ function update_script() {
 | 
			
		||||
  msg_info "Restarting Transmission"
 | 
			
		||||
  $STD rc-service transmission-daemon restart
 | 
			
		||||
  msg_ok "Restarted Transmission"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit 0
 | 
			
		||||
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ function update_script() {
 | 
			
		||||
    $STD ./wgd.sh start
 | 
			
		||||
    msg_ok "WGDashboard updated"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,8 +29,7 @@ function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  if [ "$UPD" == "1" ]; then
 | 
			
		||||
    $STD apk -U upgrade
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    exit 0
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf /opt/apache-tika/tika-server-standard-prev-version.jar
 | 
			
		||||
    msg_ok "Cleanup Completed"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,6 @@ function update_script() {
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,18 +28,12 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  NODE_VERSION="22" NODE_MODULE="@postlight/parser@latest,single-file-cli@latest" setup_nodejs
 | 
			
		||||
  NODE_VERSION="22" setup_nodejs
 | 
			
		||||
  PYTHON_VERSION="3.13" setup_uv
 | 
			
		||||
 | 
			
		||||
  if ! dpkg -l | grep -q "^ii  chromium "; then
 | 
			
		||||
    msg_info "Installing System Dependencies"
 | 
			
		||||
    $STD apt-get install -y chromium
 | 
			
		||||
    msg_ok "Installed System Dependencies"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_info "Stopping Service"
 | 
			
		||||
  msg_info "Stopping ArchiveBox"
 | 
			
		||||
  systemctl stop archivebox
 | 
			
		||||
  msg_ok "Stopped Service"
 | 
			
		||||
  msg_ok "Stopped ArchiveBox"
 | 
			
		||||
 | 
			
		||||
  msg_info "Upgrading Playwright"
 | 
			
		||||
  $STD uv pip install playwright --system
 | 
			
		||||
@@ -52,10 +46,11 @@ function update_script() {
 | 
			
		||||
  sudo -u archivebox archivebox init
 | 
			
		||||
  msg_ok "Updated ArchiveBox"
 | 
			
		||||
 | 
			
		||||
  msg_info "Starting Service"
 | 
			
		||||
  msg_info "Starting ArchiveBox"
 | 
			
		||||
  systemctl start archivebox
 | 
			
		||||
  msg_ok "Started Service"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  msg_ok "Started ArchiveBox"
 | 
			
		||||
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting service"
 | 
			
		||||
    systemctl start argus
 | 
			
		||||
    msg_ok "Service started"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								ct/aria2.sh
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								ct/aria2.sh
									
									
									
									
									
								
							@@ -20,19 +20,18 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /var ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /var ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating $APP LXC"
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -42,4 +41,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}:6880${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:6880${CL}"
 | 
			
		||||
@@ -32,7 +32,6 @@ function update_script() {
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,7 @@ function update_script() {
 | 
			
		||||
    $STD apt-get -y autoremove
 | 
			
		||||
    $STD apt-get -y autoclean
 | 
			
		||||
    msg_ok "Cleanup Completed"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start autobrr
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ function update_script() {
 | 
			
		||||
    systemctl start autocaliweb metadata-change-detector acw-ingest-service acw-auto-zipper
 | 
			
		||||
    msg_ok "Started Services"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ function update_script() {
 | 
			
		||||
    systemctl start uwsgi
 | 
			
		||||
    systemctl start nginx
 | 
			
		||||
    msg_ok "Services Started"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning up"
 | 
			
		||||
    rm -f "$temp_file"
 | 
			
		||||
    msg_ok "Cleaned up"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning up"
 | 
			
		||||
    rm -rf /opt/baikal-backup
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -102,7 +102,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Meilisearch"
 | 
			
		||||
    systemctl start meilisearch
 | 
			
		||||
    msg_ok "Started Meilisearch"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning up"
 | 
			
		||||
    rm -r /opt/barcodebuddy-backup
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -46,11 +46,11 @@ function update_script() {
 | 
			
		||||
    sed -i.bak 's/--only-binary=Pillow//g' /opt/bazarr/requirements.txt
 | 
			
		||||
    $STD uv pip install -r /opt/bazarr/requirements.txt --python /opt/bazarr/venv/bin/python3
 | 
			
		||||
    msg_ok "Setup Bazarr"
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start bazarr
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,62 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: vhsdream
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/alam00000/bentopdf
 | 
			
		||||
 | 
			
		||||
APP="BentoPDF"
 | 
			
		||||
var_tags="${var_tags:-pdf-editor}"
 | 
			
		||||
var_cpu="${var_cpu:-1}"
 | 
			
		||||
var_ram="${var_ram:-2048}"
 | 
			
		||||
var_disk="${var_disk:-4}"
 | 
			
		||||
var_os="${var_os:-debian}"
 | 
			
		||||
var_version="${var_version:-13}"
 | 
			
		||||
var_unprivileged="${var_unprivileged:-1}"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/bentopdf ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  NODE_VERSION="24" setup_nodejs
 | 
			
		||||
 | 
			
		||||
  if check_for_gh_release "bentopdf" "alam00000/bentopdf"; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    systemctl stop bentopdf
 | 
			
		||||
    msg_ok "Stopped Service"
 | 
			
		||||
 | 
			
		||||
    CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bentopdf" "alam00000/bentopdf" "tarball" "latest" "/opt/bentopdf"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating BentoPDF"
 | 
			
		||||
    cd /opt/bentopdf
 | 
			
		||||
    $STD npm ci --no-audit --no-fund
 | 
			
		||||
    export SIMPLE_MODE=true
 | 
			
		||||
    $STD npm run build -- --mode production
 | 
			
		||||
    msg_ok "Updated BentoPDF"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start bentopdf
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
  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}"
 | 
			
		||||
							
								
								
									
										40
									
								
								ct/beszel.sh
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								ct/beszel.sh
									
									
									
									
									
								
							@@ -20,27 +20,27 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/beszel ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/beszel ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop beszel-hub
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP"
 | 
			
		||||
    $STD /opt/beszel/beszel update
 | 
			
		||||
    sleep 2 && chmod +x /opt/beszel/beszel
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start beszel-hub
 | 
			
		||||
    msg_ok "Successfully started $APP"
 | 
			
		||||
    msg_ok "Update Successful"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Stopping Service"
 | 
			
		||||
  systemctl stop beszel-hub
 | 
			
		||||
  msg_info "Stopped Service"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating $APP"
 | 
			
		||||
  $STD /opt/beszel/beszel update
 | 
			
		||||
  sleep 2 && chmod +x /opt/beszel/beszel
 | 
			
		||||
  msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
  msg_info "Starting Service"
 | 
			
		||||
  systemctl start beszel-hub
 | 
			
		||||
  msg_ok "Successfully started $APP"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start bitmagnet-web
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start blocky
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,9 +29,9 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if check_for_gh_release "booklore" "booklore-app/BookLore"; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop booklore
 | 
			
		||||
    msg_info "Stopped Service"
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "backup old install"
 | 
			
		||||
    mv /opt/booklore /opt/booklore_bak
 | 
			
		||||
@@ -56,17 +56,17 @@ function update_script() {
 | 
			
		||||
    JAR_PATH=$(find /opt/booklore/booklore-api/build/libs -maxdepth 1 -type f -name "booklore-api-*.jar" ! -name "*plain*" | head -n1)
 | 
			
		||||
    if [[ -z "$JAR_PATH" ]]; then
 | 
			
		||||
      msg_error "Backend JAR not found"
 | 
			
		||||
      exit
 | 
			
		||||
      exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    cp "$JAR_PATH" /opt/booklore/dist/app.jar
 | 
			
		||||
    msg_ok "Built Backend"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start booklore
 | 
			
		||||
    systemctl reload nginx
 | 
			
		||||
    rm -rf /opt/booklore_bak
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf /opt/bookstack-backup
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ EOF
 | 
			
		||||
    apt-get install -y --allow-downgrades bunkerweb=${RELEASE}
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP} to ${RELEASE}"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -54,9 +54,8 @@ function update_script() {
 | 
			
		||||
      msg_error "PLEASE MAKE A BACKUP FIRST!"
 | 
			
		||||
      exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								ct/caddy.sh
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								ct/caddy.sh
									
									
									
									
									
								
							@@ -20,33 +20,31 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /etc/caddy ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating $APP LXC"
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
   header_info
 | 
			
		||||
   check_container_storage
 | 
			
		||||
   check_container_resources
 | 
			
		||||
   if [[ ! -d /etc/caddy ]]; then
 | 
			
		||||
      msg_error "No ${APP} Installation Found!"
 | 
			
		||||
      exit
 | 
			
		||||
   fi
 | 
			
		||||
   msg_info "Updating $APP LXC"
 | 
			
		||||
   $STD apt-get update
 | 
			
		||||
   $STD apt-get -y upgrade
 | 
			
		||||
   msg_ok "Updated $APP LXC"
 | 
			
		||||
 | 
			
		||||
  if command -v xcaddy >/dev/null 2>&1; then
 | 
			
		||||
    setup_go
 | 
			
		||||
    msg_info "Updating xCaddy"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk -F '"' '{print $4}')
 | 
			
		||||
    VERSION="${RELEASE#v}"
 | 
			
		||||
    curl -fsSL "https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${VERSION}_linux_amd64.deb" -o "xcaddy_${VERSION}_linux_amd64.deb"
 | 
			
		||||
    $STD dpkg -i "xcaddy_${VERSION}_linux_amd64.deb"
 | 
			
		||||
    rm -f "xcaddy_${VERSION}_linux_amd64.deb"
 | 
			
		||||
    $STD xcaddy build
 | 
			
		||||
    msg_ok "Updated xCaddy"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
    if command -v xcaddy >/dev/null 2>&1; then
 | 
			
		||||
      setup_go
 | 
			
		||||
      msg_info "Updating xCaddy"
 | 
			
		||||
      cd /opt
 | 
			
		||||
      RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk -F '"' '{print $4}')
 | 
			
		||||
      VERSION="${RELEASE#v}"
 | 
			
		||||
      curl -fsSL "https://github.com/caddyserver/xcaddy/releases/download/${RELEASE}/xcaddy_${VERSION}_linux_amd64.deb" -o "xcaddy_${VERSION}_linux_amd64.deb"
 | 
			
		||||
      $STD dpkg -i "xcaddy_${VERSION}_linux_amd64.deb"
 | 
			
		||||
      rm -f "xcaddy_${VERSION}_linux_amd64.deb"
 | 
			
		||||
      $STD xcaddy build
 | 
			
		||||
      msg_ok "Updated xCaddy"
 | 
			
		||||
   fi
 | 
			
		||||
   exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -104,7 +104,7 @@ function update_script() {
 | 
			
		||||
        ;;
 | 
			
		||||
      *)
 | 
			
		||||
        echo "Unsupported item $CHOICE!" >&2
 | 
			
		||||
        exit
 | 
			
		||||
        exit 1
 | 
			
		||||
        ;;
 | 
			
		||||
      esac
 | 
			
		||||
    done
 | 
			
		||||
@@ -124,7 +124,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Starting Service"
 | 
			
		||||
  systemctl start cps
 | 
			
		||||
  msg_ok "Started Service"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								ct/casaos.sh
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								ct/casaos.sh
									
									
									
									
									
								
							@@ -20,19 +20,18 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /var ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating ${APP} LXC"
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated ${APP} LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
   header_info
 | 
			
		||||
   check_container_storage
 | 
			
		||||
   check_container_resources
 | 
			
		||||
   if [[ ! -d /var ]]; then
 | 
			
		||||
      msg_error "No ${APP} Installation Found!"
 | 
			
		||||
      exit
 | 
			
		||||
   fi
 | 
			
		||||
   msg_info "Updating ${APP} LXC"
 | 
			
		||||
   $STD apt-get update
 | 
			
		||||
   $STD apt-get -y upgrade
 | 
			
		||||
   msg_ok "Updated ${APP} LXC"
 | 
			
		||||
   exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -42,4 +41,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}${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
			
		||||
@@ -68,7 +68,7 @@ function update_script() {
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  systemctl restart changedetection
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,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) }' | tr ' ' '\n' | grep -Ev 'rc|b' | sort -V | tail -n 1)
 | 
			
		||||
  msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
  $STD omd stop monitoring
 | 
			
		||||
@@ -40,8 +40,8 @@ function update_script() {
 | 
			
		||||
  $STD omd cleanup
 | 
			
		||||
  rm -rf /opt/checkmk.deb
 | 
			
		||||
  msg_ok "Updated ${APP}"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start cleanuparr
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,6 @@ function update_script() {
 | 
			
		||||
  $STD apt update
 | 
			
		||||
  $STD apt -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,16 +29,16 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if check_for_gh_release "cloudreve" "cloudreve/cloudreve"; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop cloudreve
 | 
			
		||||
    msg_info "Stopped Service"
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "cloudreve" "cloudreve/cloudreve" "prebuild" "latest" "/opt/cloudreve" "*linux_amd64.tar.gz"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start cloudreve
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,12 +27,11 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  msg_info "Updating ${APP} LXC"
 | 
			
		||||
  $STD apt update
 | 
			
		||||
  $STD apt -y upgrade
 | 
			
		||||
  msg_ok "Updated ${APP} LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start commafeed
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start configarr-task.timer
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully!"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,9 +28,9 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if check_for_gh_release "ConvertX" "C4illin/ConvertX"; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop convertx
 | 
			
		||||
    msg_info "Stopped Service"
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Move data-Folder"
 | 
			
		||||
    if [[ -d /opt/convertx/data ]]; then
 | 
			
		||||
@@ -48,10 +48,10 @@ function update_script() {
 | 
			
		||||
    $STD bun install
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start convertx
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,6 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_ok "${APP} updates itself automatically!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -38,4 +37,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}${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
			
		||||
@@ -67,7 +67,7 @@ function update_script() {
 | 
			
		||||
    systemctl start crafty-controller
 | 
			
		||||
    msg_ok "Started Crafty-Controller"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -62,6 +62,7 @@ function update_script() {
 | 
			
		||||
      sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
 | 
			
		||||
      $STD /opt/cronicle/bin/control.sh start
 | 
			
		||||
      msg_ok "Installed Cronicle Worker"
 | 
			
		||||
 | 
			
		||||
      echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n"
 | 
			
		||||
      exit
 | 
			
		||||
    fi
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function update_script() {
 | 
			
		||||
            msg_info "Updating ${APP} from version v${current_version} to v${latest_version}"
 | 
			
		||||
            $STD npm install -g cross-seed@latest
 | 
			
		||||
            systemctl restart cross-seed
 | 
			
		||||
            msg_ok "Updated successfully!"
 | 
			
		||||
            msg_ok "Updated Successfully"
 | 
			
		||||
        else
 | 
			
		||||
            msg_ok "${APP} is already at v${current_version}"
 | 
			
		||||
        fi
 | 
			
		||||
@@ -49,4 +49,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access cross-seed API using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:2468${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:2468${CL}"
 | 
			
		||||
@@ -29,9 +29,9 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if check_for_gh_release "cryptpad" "cryptpad/cryptpad"; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop cryptpad
 | 
			
		||||
    msg_info "Stopped Service"
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Backing up configuration"
 | 
			
		||||
    [ -f /opt/cryptpad/config/config.js ] && mv /opt/cryptpad/config/config.js /opt/
 | 
			
		||||
@@ -50,10 +50,10 @@ function update_script() {
 | 
			
		||||
    mv /opt/config.js /opt/cryptpad/config/
 | 
			
		||||
    msg_ok "Configuration restored"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start cryptpad
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,19 +20,18 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /var ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /var ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating $APP LXC"
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -42,4 +41,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}:8084${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8084${CL}"
 | 
			
		||||
@@ -62,7 +62,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Dashy"
 | 
			
		||||
    systemctl start dashy
 | 
			
		||||
    msg_ok "Started Dashy"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,6 @@ function update_script() {
 | 
			
		||||
  $STD apt update
 | 
			
		||||
  $STD apt -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,6 @@ function update_script() {
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -42,4 +41,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}${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
			
		||||
							
								
								
									
										25
									
								
								ct/deluge.sh
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								ct/deluge.sh
									
									
									
									
									
								
							@@ -20,19 +20,18 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -f /etc/systemd/system/deluged.service ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -f /etc/systemd/system/deluged.service ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    pip3 install deluge[all] --upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating $APP LXC"
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  pip3 install deluge[all] --upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -42,4 +41,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}:8112${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8112${CL}"
 | 
			
		||||
@@ -121,7 +121,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning up"
 | 
			
		||||
    rm -f /tmp/dispatcharr_db_*.sql
 | 
			
		||||
    msg_ok "Cleanup completed"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Update Successfully!"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,6 @@ function update_script() {
 | 
			
		||||
  $STD apt-get -y autoremove
 | 
			
		||||
  $STD apt-get -y autoclean
 | 
			
		||||
  msg_ok "Cleanup complete"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								ct/dockge.sh
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								ct/dockge.sh
									
									
									
									
									
								
							@@ -20,20 +20,19 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/dockge ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/dockge ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    cd /opt/dockge
 | 
			
		||||
    docker compose pull
 | 
			
		||||
    docker compose up -d
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
  cd /opt/dockge
 | 
			
		||||
  $STD docker compose pull
 | 
			
		||||
  $STD docker compose up -d
 | 
			
		||||
  msg_ok "Updated ${APP}"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -43,4 +42,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}:5001${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5001${CL}"
 | 
			
		||||
@@ -55,7 +55,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start docmost
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf /opt/v${RELEASE}.zip
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -1,63 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: fstof
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/donetick/donetick
 | 
			
		||||
 | 
			
		||||
APP="Donetick"
 | 
			
		||||
var_tags="${var_tags:-productivity;tasks}"
 | 
			
		||||
var_cpu="${var_cpu:-1}"
 | 
			
		||||
var_ram="${var_ram:-512}"
 | 
			
		||||
var_disk="${var_disk:-2}"
 | 
			
		||||
var_os="${var_os:-debian}"
 | 
			
		||||
var_version="${var_version:-13}"
 | 
			
		||||
var_unprivileged="${var_unprivileged:-1}"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
 | 
			
		||||
  if [[ ! -d /opt/donetick ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if check_for_gh_release "donetick" "donetick/donetick"; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    systemctl stop donetick
 | 
			
		||||
    msg_ok "Stopped Service"
 | 
			
		||||
 | 
			
		||||
    msg_info "Backing Up Configurations"
 | 
			
		||||
    mv /opt/donetick/config/selfhosted.yml /opt/donetick/donetick.db /opt
 | 
			
		||||
    msg_ok "Backed Up Configurations"
 | 
			
		||||
 | 
			
		||||
    CLEAN_INSTALL=1 fetch_and_deploy_gh_release "donetick" "donetick/donetick" "prebuild" "latest" "/opt/donetick" "donetick_Linux_x86_64.tar.gz"
 | 
			
		||||
 | 
			
		||||
    msg_info "Restoring Configurations"
 | 
			
		||||
    mv /opt/selfhosted.yml /opt/donetick/config
 | 
			
		||||
    mv /opt/donetick.db /opt/donetick
 | 
			
		||||
    msg_ok "Restored Configurations"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start donetick
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
  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}:2021${CL}"
 | 
			
		||||
@@ -30,7 +30,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -41,4 +41,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 IP:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}${IP}:80${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}${IP}:80${CL}"
 | 
			
		||||
@@ -29,16 +29,16 @@ function update_script() {
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if check_for_gh_release "duplicati" "duplicati/duplicati"; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop duplicati
 | 
			
		||||
    msg_info "Stopped Service"
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    fetch_and_deploy_gh_release "duplicati" "duplicati/duplicati" "binary" "latest" "/opt/duplicati" "duplicati-*-linux-x64-gui.deb"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start duplicati
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
    msg_ok "Update Successful"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -61,8 +61,8 @@ function update_script() {
 | 
			
		||||
      $STD yarn global add serve
 | 
			
		||||
      $STD yarn install --ignore-engines
 | 
			
		||||
      $STD yarn build
 | 
			
		||||
      mv ./dist ../ &&
 | 
			
		||||
        rm -rf * &&
 | 
			
		||||
      mv ./dist ../ && \
 | 
			
		||||
        rm -rf * && \
 | 
			
		||||
        mv ../dist ./
 | 
			
		||||
      if [[ -z $(grep "ExecStart=/usr/local/bin/serve" /etc/systemd/system/synapse-admin.service) ]]; then
 | 
			
		||||
        sed -i 's|^ExecStart=.*|ExecStart=/usr/local/bin/serve -s dist -l 5173|' /etc/systemd/system/synapse-admin.service
 | 
			
		||||
@@ -71,7 +71,7 @@ function update_script() {
 | 
			
		||||
      systemctl start synapse-admin
 | 
			
		||||
      echo "${RELEASE}" >/opt/"${APP}"_version.txt
 | 
			
		||||
      rm -f "$temp_file"
 | 
			
		||||
      msg_ok "Updated successfully!"
 | 
			
		||||
      msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
      msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    systemctl start emby-server
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -f "$DEB_FILE"
 | 
			
		||||
    msg_ok "Cleanup Completed"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Update Successful"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. EMQX is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ function update_script() {
 | 
			
		||||
    systemctl start ersatzTV
 | 
			
		||||
    msg_ok "Started ErsatzTV"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if check_for_gh_release "ersatztv-ffmpeg" "ErsatzTV/ErsatzTV-ffmpeg"; then
 | 
			
		||||
@@ -57,7 +57,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Starting ErsatzTV"
 | 
			
		||||
    systemctl start ersatzTV
 | 
			
		||||
    msg_ok "Started ErsatzTV"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ function update_script() {
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -f /etc/systemd/system/esphomeDashboard.service ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_info "Stopping Service"
 | 
			
		||||
@@ -81,7 +81,7 @@ EOF
 | 
			
		||||
  msg_info "Starting Service"
 | 
			
		||||
  systemctl start esphomeDashboard
 | 
			
		||||
  msg_ok "Started Service"
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ function update_script() {
 | 
			
		||||
  msg_info "Updating evcc LXC"
 | 
			
		||||
  $STD apt update
 | 
			
		||||
  $STD apt --only-upgrade install -y evcc
 | 
			
		||||
  msg_ok "Updated successfully!"
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -41,4 +41,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}:7070${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7070${CL}"
 | 
			
		||||
@@ -29,9 +29,9 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if check_for_gh_release "excalidraw" "excalidraw/excalidraw"; then
 | 
			
		||||
    msg_info "Stopping Service"
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop excalidraw
 | 
			
		||||
    msg_info "Stopped Service"
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    rm -rf /opt/excalidraw
 | 
			
		||||
    fetch_and_deploy_gh_release "excalidraw" "excalidraw/excalidraw"
 | 
			
		||||
@@ -41,10 +41,10 @@ function update_script() {
 | 
			
		||||
    $STD yarn
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Service"
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start excalidraw
 | 
			
		||||
    msg_ok "Started Service"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,6 @@ function update_script() {
 | 
			
		||||
    echo "${gitVersionNumber}" >"/opt/${APP}_version.txt"
 | 
			
		||||
    rm -r /opt/fenrus-data-backup/
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
    msg_ok "Updated successfully!"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already up to date"
 | 
			
		||||
  fi
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user