mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	Compare commits
	
		
			131 Commits
		
	
	
		
			2025-02-16
			...
			2025-02-24
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					03424f0474 | ||
| 
						 | 
					bf9edf41d9 | ||
| 
						 | 
					377d11bf48 | ||
| 
						 | 
					42ad6832ea | ||
| 
						 | 
					e2b6296cdf | ||
| 
						 | 
					a3b1984d0a | ||
| 
						 | 
					f24286b717 | ||
| 
						 | 
					375275b9c0 | ||
| 
						 | 
					8c41fb692b | ||
| 
						 | 
					5de3075252 | ||
| 
						 | 
					c72e8d3da6 | ||
| 
						 | 
					40469c5de5 | ||
| 
						 | 
					6827056a1d | ||
| 
						 | 
					1172662095 | ||
| 
						 | 
					43dc12074d | ||
| 
						 | 
					6eb272ba4a | ||
| 
						 | 
					1bb6e4e899 | ||
| 
						 | 
					157657b298 | ||
| 
						 | 
					188712936f | ||
| 
						 | 
					0e5be846be | ||
| 
						 | 
					05364685af | ||
| 
						 | 
					03a2c41718 | ||
| 
						 | 
					de4f7c3166 | ||
| 
						 | 
					ba0153539d | ||
| 
						 | 
					8a64d345a4 | ||
| 
						 | 
					62939edc2e | ||
| 
						 | 
					56a7505f15 | ||
| 
						 | 
					01a02c41ff | ||
| 
						 | 
					a03a1034de | ||
| 
						 | 
					ece3ad2b13 | ||
| 
						 | 
					20cc7572a5 | ||
| 
						 | 
					7700b1a541 | ||
| 
						 | 
					fc9a7f2cd4 | ||
| 
						 | 
					a97a56bf88 | ||
| 
						 | 
					de2e785731 | ||
| 
						 | 
					eb3a2e41ed | ||
| 
						 | 
					acf5eda756 | ||
| 
						 | 
					df110695cd | ||
| 
						 | 
					ebf63f55e6 | ||
| 
						 | 
					0a1248861b | ||
| 
						 | 
					10d4ce4eef | ||
| 
						 | 
					35f635bdb4 | ||
| 
						 | 
					27c764afd3 | ||
| 
						 | 
					1f500d5aeb | ||
| 
						 | 
					4e13134774 | ||
| 
						 | 
					2dbd03b74c | ||
| 
						 | 
					0084169c02 | ||
| 
						 | 
					4aabbefcc8 | ||
| 
						 | 
					6daeb7e288 | ||
| 
						 | 
					81b367df07 | ||
| 
						 | 
					0f410e11eb | ||
| 
						 | 
					0a9dffb7a1 | ||
| 
						 | 
					67b90f5582 | ||
| 
						 | 
					eaceba3ed3 | ||
| 
						 | 
					d7dceede4b | ||
| 
						 | 
					9c867b467a | ||
| 
						 | 
					d35a01f5c4 | ||
| 
						 | 
					1e2f953a8f | ||
| 
						 | 
					2937516869 | ||
| 
						 | 
					92d2065f1d | ||
| 
						 | 
					13c2f50f19 | ||
| 
						 | 
					dccc45d492 | ||
| 
						 | 
					a9362e0b4a | ||
| 
						 | 
					10c46723fe | ||
| 
						 | 
					666e170f7d | ||
| 
						 | 
					109c48694e | ||
| 
						 | 
					d0cd58e923 | ||
| 
						 | 
					16b8bbfca6 | ||
| 
						 | 
					209aa220b0 | ||
| 
						 | 
					dd8db43dea | ||
| 
						 | 
					7d40e148e9 | ||
| 
						 | 
					ef6eeea608 | ||
| 
						 | 
					0c13b71466 | ||
| 
						 | 
					e1c25a3c8e | ||
| 
						 | 
					e5bfb8f8a3 | ||
| 
						 | 
					4dfcd32d92 | ||
| 
						 | 
					167deb5d7f | ||
| 
						 | 
					8cb3007d66 | ||
| 
						 | 
					49bcd30e77 | ||
| 
						 | 
					1e2954a993 | ||
| 
						 | 
					fe5711d9c4 | ||
| 
						 | 
					33f812179f | ||
| 
						 | 
					d7a2614819 | ||
| 
						 | 
					dc259847af | ||
| 
						 | 
					9bcd1cd237 | ||
| 
						 | 
					3a1ae8f7c0 | ||
| 
						 | 
					9cbe196913 | ||
| 
						 | 
					d0c8b1c15b | ||
| 
						 | 
					2efdea9a29 | ||
| 
						 | 
					978dc549f4 | ||
| 
						 | 
					d4d8943c9f | ||
| 
						 | 
					12a1f46703 | ||
| 
						 | 
					15d20a54b3 | ||
| 
						 | 
					bedfbd232d | ||
| 
						 | 
					3c289e7235 | ||
| 
						 | 
					450d2410d9 | ||
| 
						 | 
					e1ecc8d6cf | ||
| 
						 | 
					e9d9da3355 | ||
| 
						 | 
					6d3c442464 | ||
| 
						 | 
					1a8f5a4007 | ||
| 
						 | 
					20414d9659 | ||
| 
						 | 
					1fe8bc05b3 | ||
| 
						 | 
					049afa994b | ||
| 
						 | 
					ba41bcd561 | ||
| 
						 | 
					4aa84c265d | ||
| 
						 | 
					436945b711 | ||
| 
						 | 
					b749119a1c | ||
| 
						 | 
					87c61de11e | ||
| 
						 | 
					b293638c40 | ||
| 
						 | 
					d1e0c2d164 | ||
| 
						 | 
					7e6a7468df | ||
| 
						 | 
					1ffe6b1c3c | ||
| 
						 | 
					a76733df60 | ||
| 
						 | 
					70f5280fcc | ||
| 
						 | 
					4cbe90597e | ||
| 
						 | 
					0afe60e11a | ||
| 
						 | 
					6982d02489 | ||
| 
						 | 
					031aefe05a | ||
| 
						 | 
					fa01cfd840 | ||
| 
						 | 
					331bc0f5a6 | ||
| 
						 | 
					7e9eb2f98a | ||
| 
						 | 
					5a72b1e523 | ||
| 
						 | 
					2693fabac2 | ||
| 
						 | 
					ce16be6393 | ||
| 
						 | 
					b694c339cb | ||
| 
						 | 
					3957b46d98 | ||
| 
						 | 
					54929e4b0d | ||
| 
						 | 
					ca20d52ac1 | ||
| 
						 | 
					e22a6dad6f | ||
| 
						 | 
					ee84468498 | ||
| 
						 | 
					746f19b0b8 | 
@@ -40,27 +40,27 @@ Before contributing, please ensure that you have the following setup:
 | 
			
		||||
   - [Shell Format](https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format)
 | 
			
		||||
 | 
			
		||||
### Important Notes
 | 
			
		||||
- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh) as templates when creating new scripts.
 | 
			
		||||
- Use [AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh) and [AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh) as templates when creating new scripts.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
# 🚀 The Application Script (ct/AppName.sh)
 | 
			
		||||
 | 
			
		||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/ct/AppName.md).
 | 
			
		||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.md).
 | 
			
		||||
- These scripts are responsible for container creation, setting the necessary variables and handling the update of the application once installed.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
# 🛠 The Installation Script (install/AppName-install.sh)
 | 
			
		||||
 | 
			
		||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/install/AppName-install.md).
 | 
			
		||||
- You can find all coding standards, as well as the structure for this file [here](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.md).
 | 
			
		||||
- These scripts are responsible for the installation of the application.
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
## 🚀 Building Your Own Scripts
 | 
			
		||||
 | 
			
		||||
Start with the [template script](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh)
 | 
			
		||||
Start with the [template script](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh)
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
@@ -99,8 +99,8 @@ Open a Pull Request from your feature branch to the main repository branch. You
 | 
			
		||||
 | 
			
		||||
## 📚 Pages
 | 
			
		||||
 | 
			
		||||
- [CT Template: AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/ct/AppName.sh)
 | 
			
		||||
- [Install Template: AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/install/AppName-install.sh)
 | 
			
		||||
- [JSON Template: AppName.json](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_GUIDE/json/AppName.json)
 | 
			
		||||
- [CT Template: AppName.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/ct/AppName.sh)
 | 
			
		||||
- [Install Template: AppName-install.sh](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/install/AppName-install.sh)
 | 
			
		||||
- [JSON Template: AppName.json](https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/json/AppName.json)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -95,7 +95,7 @@ Example:
 | 
			
		||||
>| Variable | Description | Notes |
 | 
			
		||||
>|----------|-------------|-------|
 | 
			
		||||
>| `APP` | Application name | Must match ct\AppName.sh |
 | 
			
		||||
>| `TAGS` | Proxmox display tags without Spaces, only ; | Limit the number |  
 | 
			
		||||
>| `var_tags` | Proxmox display tags without Spaces, only ; | Limit the number |  
 | 
			
		||||
>| `var_cpu` | CPU cores | Number of cores |
 | 
			
		||||
>| `var_ram` | RAM | In MB |
 | 
			
		||||
>| `var_disk` | Disk capacity | In GB |
 | 
			
		||||
@@ -193,13 +193,13 @@ wget -q
 | 
			
		||||
unzip -q
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- If a command does not come with this functionality use `&>/dev/null` to suppress it's output.
 | 
			
		||||
- If a command does not come with this functionality use `$STD` to suppress it's output.
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
php artisan migrate --force &>/dev/null
 | 
			
		||||
php artisan config:clear &>/dev/null
 | 
			
		||||
$STD php artisan migrate --force 
 | 
			
		||||
$STD php artisan config:clear 
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 3.5 **Backups**
 | 
			
		||||
@@ -8,7 +8,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="[APP_NAME]"
 | 
			
		||||
# Name of the app (e.g. Google, Adventurelog, Apache-Guacamole"
 | 
			
		||||
TAGS="[TAGS]"
 | 
			
		||||
var_tags="[TAGS]"
 | 
			
		||||
# Tags for Proxmox VE, maximum 2 pcs., no spaces allowed, separated by a semicolon ; (e.g. database | adblock;dhcp) 
 | 
			
		||||
var_cpu="[CPU]"
 | 
			
		||||
# Number of cores (1-X) (e.g. 4) - default are 2
 | 
			
		||||
							
								
								
									
										32
									
								
								.github/changelog-pr-config.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								.github/changelog-pr-config.json
									
									
									
									
										vendored
									
									
								
							@@ -1,34 +1,34 @@
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
      "title": "💥 Breaking Changes",
 | 
			
		||||
      "labels": ["breaking change"]
 | 
			
		||||
    "title": "💥 Breaking Changes",
 | 
			
		||||
    "labels": ["breaking change"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "✨ New Scripts",
 | 
			
		||||
      "labels": ["new script"]
 | 
			
		||||
    "title": "🆕 New Scripts",
 | 
			
		||||
    "labels": ["new script"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🚀 Updated Scripts",
 | 
			
		||||
      "labels": ["update script"]
 | 
			
		||||
    "title": "🐞 Bug Fixes",
 | 
			
		||||
    "labels": ["bugfix"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🌐 Website",
 | 
			
		||||
      "labels": ["website"]
 | 
			
		||||
    "title": "✨ New Features",
 | 
			
		||||
    "labels": ["feature"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🐞 Bug Fixes",
 | 
			
		||||
      "labels": ["bug fix"]
 | 
			
		||||
    "title": "🌐 Website",
 | 
			
		||||
    "labels": ["website"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🧰 Maintenance",
 | 
			
		||||
      "labels": ["maintenance"]
 | 
			
		||||
    "title": "📡 API",
 | 
			
		||||
    "labels": ["api"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "📡 API",
 | 
			
		||||
      "labels": ["api"]
 | 
			
		||||
    "title": "🧰 Maintenance",
 | 
			
		||||
    "labels": ["maintenance"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "❔ Unlabelled",
 | 
			
		||||
      "labels": []
 | 
			
		||||
    "title": "❔ Unlabelled",
 | 
			
		||||
    "labels": []
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								.github/workflows/autolabeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								.github/workflows/autolabeler.yml
									
									
									
									
										vendored
									
									
								
							@@ -19,7 +19,7 @@ jobs:
 | 
			
		||||
      - name: Install minimatch
 | 
			
		||||
        run: npm install minimatch
 | 
			
		||||
 | 
			
		||||
      - name: Label PR based on config rules
 | 
			
		||||
      - name: Label PR based on file changes and PR template
 | 
			
		||||
        uses: actions/github-script@v7
 | 
			
		||||
        with:
 | 
			
		||||
          script: |
 | 
			
		||||
@@ -32,6 +32,10 @@ jobs:
 | 
			
		||||
            const autolabelerConfig = JSON.parse(fileContent);
 | 
			
		||||
 | 
			
		||||
            const prNumber = context.payload.pull_request.number;
 | 
			
		||||
            const prBody = context.payload.pull_request.body;
 | 
			
		||||
            
 | 
			
		||||
            let labelsToAdd = new Set();
 | 
			
		||||
 | 
			
		||||
            const prListFilesResponse = await github.rest.pulls.listFiles({
 | 
			
		||||
              owner: context.repo.owner,
 | 
			
		||||
              repo: context.repo.repo,
 | 
			
		||||
@@ -51,12 +55,32 @@ jobs:
 | 
			
		||||
              });
 | 
			
		||||
 | 
			
		||||
              if (shouldAddLabel) {
 | 
			
		||||
                console.log(`Adding label ${label} to PR ${prNumber}`);
 | 
			
		||||
                await github.rest.issues.addLabels({
 | 
			
		||||
                  owner: context.repo.owner,
 | 
			
		||||
                  repo: context.repo.repo,
 | 
			
		||||
                  issue_number: prNumber,
 | 
			
		||||
                  labels: [label],
 | 
			
		||||
                });
 | 
			
		||||
                labelsToAdd.add(label);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const templateLabelMappings = {
 | 
			
		||||
              "🐞 bug fix": "bugfix",
 | 
			
		||||
              "✨ new feature": "feature",
 | 
			
		||||
              "💥 breaking change": "breaking change",
 | 
			
		||||
              "🆕 new script": "new script"
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
 | 
			
		||||
              const regex = new RegExp(`- \\[x\\] ${checkbox}`, "i"); // Match only checked checkboxes
 | 
			
		||||
              if (regex.test(prBody)) {
 | 
			
		||||
                labelsToAdd.add(label);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            console.log(`Labels to add: ${Array.from(labelsToAdd).join(", ")}`);
 | 
			
		||||
 | 
			
		||||
            if (labelsToAdd.size > 0) {
 | 
			
		||||
              console.log(`Adding labels ${Array.from(labelsToAdd).join(", ")} to PR ${prNumber}`);
 | 
			
		||||
              await github.rest.issues.addLabels({
 | 
			
		||||
                owner: context.repo.owner,
 | 
			
		||||
                repo: context.repo.repo,
 | 
			
		||||
                issue_number: prNumber,
 | 
			
		||||
                labels: Array.from(labelsToAdd),
 | 
			
		||||
              });
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							@@ -78,11 +78,30 @@ jobs:
 | 
			
		||||
              const prLabels = pr.labels.map(label => label.name.toLowerCase());
 | 
			
		||||
              const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
 | 
			
		||||
              let isCategorized = false;
 | 
			
		||||
 | 
			
		||||
              for (const { labels, notes } of categorizedPRs) {
 | 
			
		||||
                if (labels.length === 0 || labels.some(label => prLabels.includes(label))) {
 | 
			
		||||
                // If no labels are specified (e.g., "Unlabelled"), assign to this category
 | 
			
		||||
                if (labels.length === 0 && prLabels.length === 0) {
 | 
			
		||||
                  notes.push(prNote);
 | 
			
		||||
                  isCategorized = true;
 | 
			
		||||
                  break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // If labels are specified, check if PR has ALL required labels
 | 
			
		||||
                if (labels.length > 0 && labels.every(label => prLabels.includes(label.toLowerCase()))) {
 | 
			
		||||
                  notes.push(prNote);
 | 
			
		||||
                  isCategorized = true;
 | 
			
		||||
                  break;
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              // If PR is not categorized, assign it to the "Unlabelled" category
 | 
			
		||||
              if (!isCategorized) {
 | 
			
		||||
                const unlabelledCategory = categorizedPRs.find(cat => cat.title === "❔ Unlabelled");
 | 
			
		||||
                if (unlabelledCategory) {
 | 
			
		||||
                  unlabelledCategory.notes.push(prNote);
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
@@ -110,7 +129,6 @@ jobs:
 | 
			
		||||
            const changelogContent = await fs.readFile(changelogPath, 'utf-8');
 | 
			
		||||
            const changelogIncludesTodaysReleaseNotes = changelogContent.includes(`\n## ${today}`);
 | 
			
		||||
 | 
			
		||||
            // Ersetze oder füge Release Notes ein
 | 
			
		||||
            const regex = changelogIncludesTodaysReleaseNotes 
 | 
			
		||||
              ? new RegExp(`## ${today}.*(?=## ${latestDateInChangelog})`, "gs") 
 | 
			
		||||
              : new RegExp(`(?=## ${latestDateInChangelog})`, "gs");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
								
							@@ -13,7 +13,7 @@ jobs:
 | 
			
		||||
  run-install-script:
 | 
			
		||||
    runs-on: pvenode
 | 
			
		||||
    steps:          
 | 
			
		||||
      - name: Checkout PR branch (supports forks)
 | 
			
		||||
      - name: Checkout PR branch
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          ref: ${{ github.event.pull_request.head.ref }}
 | 
			
		||||
@@ -39,6 +39,7 @@ jobs:
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
      - name: Get scripts
 | 
			
		||||
        id: check-install-script
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -68,11 +69,11 @@ jobs:
 | 
			
		||||
            echo "Running Test for: $STRIPPED_NAME"
 | 
			
		||||
            if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
 | 
			
		||||
              CT_SCRIPT="ct/$STRIPPED_NAME.sh"
 | 
			
		||||
              echo $CT_SCRIPT
 | 
			
		||||
              if [[ ! -f $CT_SCRIPT ]]; then
 | 
			
		||||
                echo "No CT script found for $STRIPPED_NAME"
 | 
			
		||||
                ERROR_MSG="No CT script found for $FILE"
 | 
			
		||||
                echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
			
		||||
                continue
 | 
			
		||||
                RUN=false
 | 
			
		||||
              fi
 | 
			
		||||
                echo "Found CT script for $STRIPPED_NAME"
 | 
			
		||||
                chmod +x "$CT_SCRIPT"
 | 
			
		||||
@@ -82,32 +83,19 @@ jobs:
 | 
			
		||||
              if [[ ! -f $INSTALL_SCRIPT ]]; then
 | 
			
		||||
                echo "No install script found for $STRIPPED_NAME"
 | 
			
		||||
                ERROR_MSG="No install script found for $FILE"
 | 
			
		||||
                echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
			
		||||
                continue
 | 
			
		||||
                RUN=false
 | 
			
		||||
              fi                
 | 
			
		||||
                echo "Found install script for $STRIPPED_NAME"
 | 
			
		||||
                chmod +x "$INSTALL_SCRIPT"
 | 
			
		||||
                RUNNING_FILE=$FILE
 | 
			
		||||
            fi
 | 
			
		||||
            git remote add community-scripts https://github.com/community-scripts/ProxmoxVE.git
 | 
			
		||||
            git fetch community-scripts
 | 
			
		||||
            rm -f .github/workflows/scripts/app-test/pr-build.func || true
 | 
			
		||||
            rm -f .github/workflows/scripts/app-test/pr-install.func || true
 | 
			
		||||
            rm -f .github/workflows/scripts/app-test/pr-alpine-install.func || true
 | 
			
		||||
            rm -f .github/workflows/scripts/app-test/pr-create-lxc.sh || true
 | 
			
		||||
            git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-build.func
 | 
			
		||||
            git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-install.func
 | 
			
		||||
            git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
			
		||||
            git checkout community-scripts/main -- .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
            chmod +x $RUNNING_FILE         
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-install.func
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-build.func
 | 
			
		||||
            sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source .github/workflows/scripts/app-test/pr-build.func|g' "$RUNNING_FILE"
 | 
			
		||||
            echo "Executing $RUNNING_FILE"
 | 
			
		||||
            ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
 | 
			
		||||
            echo "Finished running $FILE"
 | 
			
		||||
            if [[ $RUN != "false" ]]; then
 | 
			
		||||
              chmod +x $RUNNING_FILE         
 | 
			
		||||
              sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/.github/workflows/scripts/app-test/pr-build.func)|g' "$RUNNING_FILE"
 | 
			
		||||
              echo "Executing $RUNNING_FILE"
 | 
			
		||||
              ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
 | 
			
		||||
              echo "Finished running $FILE"
 | 
			
		||||
            fi  
 | 
			
		||||
            if [ -n "$ERROR_MSG" ]; then
 | 
			
		||||
              echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
 | 
			
		||||
              echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
			
		||||
@@ -127,10 +115,11 @@ jobs:
 | 
			
		||||
            fi            
 | 
			
		||||
          done
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
      - name: Post error comments
 | 
			
		||||
        run: |
 | 
			
		||||
          ERROR="false"
 | 
			
		||||
          SEARCH_LINE=".github/workflows/scripts/app-test/pr-build.func: line 253:"
 | 
			
		||||
          SEARCH_LINE=".github/workflows/scripts/app-test/pr-build.func: line 255"
 | 
			
		||||
          for FILE in ${{ env.ALL_FILES }}; do
 | 
			
		||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
            if [[ ! -f result_$STRIPPED_NAME.log ]]; then
 | 
			
		||||
@@ -145,8 +134,6 @@ jobs:
 | 
			
		||||
              gh pr comment ${{ github.event.pull_request.number }} \
 | 
			
		||||
                --repo ${{ github.repository }} \
 | 
			
		||||
                --body ":warning: The script _**$FILE**_ failed with the following message: <br> <div><strong>${CLEANED_ERROR_MSG}</strong></div>"
 | 
			
		||||
 | 
			
		||||
              
 | 
			
		||||
              ERROR="true"
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
@@ -157,3 +144,5 @@ jobs:
 | 
			
		||||
      - name: Fail if error
 | 
			
		||||
        if: ${{ env.ERROR == 'true' }}
 | 
			
		||||
        run: exit 1 
 | 
			
		||||
      
 | 
			
		||||
  
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# Author: Michel Roegl-Brunner (michelroegl-brunner)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
@@ -11,7 +11,7 @@ catch_errors() {
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# This function handles errors
 | 
			
		||||
error_handler() {
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
@@ -21,8 +21,8 @@ error_handler() {
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    STD=""
 | 
			
		||||
    return
 | 
			
		||||
  STD=""
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
@@ -71,7 +71,7 @@ network_check() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
 msg_info "Updating Container OS"
 | 
			
		||||
  msg_info "Updating Container OS"
 | 
			
		||||
  apk update
 | 
			
		||||
  apk upgrade
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
@@ -82,7 +82,5 @@ motd_ssh() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
   return
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								.github/workflows/scripts/app-test/pr-build.func
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.github/workflows/scripts/app-test/pr-build.func
									
									
									
									
										vendored
									
									
								
							@@ -6,11 +6,12 @@
 | 
			
		||||
variables() {
 | 
			
		||||
  NSAPP=$(echo ${APP,,} | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces.
 | 
			
		||||
  var_install="${NSAPP}-install"     # sets the var_install variable by appending "-install" to the value of NSAPP.
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
timezone=$(cat /etc/timezone)
 | 
			
		||||
header_info(){ 
 | 
			
		||||
header_info() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -20,10 +21,10 @@ base_settings() {
 | 
			
		||||
  DISK_SIZE="4"
 | 
			
		||||
  CORE_COUNT="1"
 | 
			
		||||
  RAM_SIZE="1024"
 | 
			
		||||
  VERBOSE="${1:-no}"
 | 
			
		||||
  VERBOSE="no"
 | 
			
		||||
  PW=""
 | 
			
		||||
  CT_ID=$NEXTID
 | 
			
		||||
  HN="Testing"
 | 
			
		||||
  HN=$NSAPP
 | 
			
		||||
  BRG="vmbr0"
 | 
			
		||||
  NET="dhcp"
 | 
			
		||||
  GATE=""
 | 
			
		||||
@@ -130,7 +131,7 @@ msg_error() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
start(){
 | 
			
		||||
start() {
 | 
			
		||||
  base_settings
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
@@ -146,9 +147,9 @@ build_container() {
 | 
			
		||||
  TEMP_DIR=$(mktemp -d)
 | 
			
		||||
  pushd $TEMP_DIR >/dev/null
 | 
			
		||||
  if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-alpine-install.func)"
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/.github/workflows/scripts/app-test/pr-alpine-install.func)"
 | 
			
		||||
  else
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-install.func)"
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/.github/workflows/scripts/app-test/pr-install.func)"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  export CACHER="$APT_CACHER"
 | 
			
		||||
@@ -182,9 +183,8 @@ build_container() {
 | 
			
		||||
  "
 | 
			
		||||
  echo "Container ID: $CTID"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # This executes create_lxc.sh and creates the container and .conf file
 | 
			
		||||
  bash /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
  bash -c "$(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/.github/workflows/scripts/app-test/pr-create-lxc.sh)"
 | 
			
		||||
 | 
			
		||||
  LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
 | 
			
		||||
  if [ "$CT_TYPE" == "0" ]; then
 | 
			
		||||
@@ -233,6 +233,7 @@ EOF
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # This starts the container and executes <app>-install.sh
 | 
			
		||||
  msg_info "Starting LXC Container"
 | 
			
		||||
  pct start "$CTID"
 | 
			
		||||
@@ -242,7 +243,7 @@ EOF
 | 
			
		||||
    msg_error "No install script found for $APP"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
    if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
  if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
    sleep 3
 | 
			
		||||
    pct exec "$CTID" -- /bin/sh -c 'cat <<EOF >/etc/apk/repositories
 | 
			
		||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
 | 
			
		||||
@@ -250,11 +251,10 @@ http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
 | 
			
		||||
EOF'
 | 
			
		||||
    pct exec "$CTID" -- ash -c "apk add bash >/dev/null"
 | 
			
		||||
  fi
 | 
			
		||||
  lxc-attach -n "$CTID" -- bash -c "$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/install/$var_install.sh)" $var_install.sh
 | 
			
		||||
  lxc-attach -n "$CTID" -- bash -c "$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/install/$var_install.sh)"
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
description(){
 | 
			
		||||
 IP=$(pct exec "$CTID" ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
 | 
			
		||||
 return
 | 
			
		||||
description() {
 | 
			
		||||
  IP=$(pct exec "$CTID" ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
 | 
			
		||||
}
 | 
			
		||||
@@ -11,8 +11,9 @@ catch_errors() {
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function handles errors
 | 
			
		||||
error_handler() {
 | 
			
		||||
    local exit_code="$?"
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  local error_message="Failure in line $line_number: exit code $exit_code: while executing command $command"
 | 
			
		||||
@@ -20,7 +21,7 @@ error_handler() {
 | 
			
		||||
  exit 100
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    return
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
@@ -39,7 +40,6 @@ msg_error() {
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
VALIDCT=$(pvesm status -content rootdir | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALIDCT" ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid Container Storage location."
 | 
			
		||||
@@ -64,7 +64,10 @@ function select_storage() {
 | 
			
		||||
    CONTENT='vztmpl'
 | 
			
		||||
    CONTENT_LABEL='Container template'
 | 
			
		||||
    ;;
 | 
			
		||||
  *) false || { msg_error "Invalid storage class."; exit 201; };;
 | 
			
		||||
  *) false || {
 | 
			
		||||
    msg_error "Invalid storage class."
 | 
			
		||||
    exit 201
 | 
			
		||||
  } ;;
 | 
			
		||||
  esac
 | 
			
		||||
 | 
			
		||||
  # This Queries all storage locations
 | 
			
		||||
@@ -82,21 +85,30 @@ function select_storage() {
 | 
			
		||||
  done < <(pvesm status -content $CONTENT | awk 'NR>1')
 | 
			
		||||
 | 
			
		||||
  # Select storage location
 | 
			
		||||
  if [ $((${#MENU[@]}/3)) -eq 1 ]; then
 | 
			
		||||
  if [ $((${#MENU[@]} / 3)) -eq 1 ]; then
 | 
			
		||||
    printf ${MENU[0]}
 | 
			
		||||
  else
 | 
			
		||||
   msg_error "STORAGE ISSUES!"
 | 
			
		||||
    msg_error "STORAGE ISSUES!"
 | 
			
		||||
    exit 202
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[[ "${CTID:-}" ]] || {
 | 
			
		||||
  msg_error "You need to set 'CTID' variable."
 | 
			
		||||
  exit 203
 | 
			
		||||
}
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || {
 | 
			
		||||
  msg_error "You need to set 'PCT_OSTYPE' variable."
 | 
			
		||||
  exit 204
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Test if ID is valid
 | 
			
		||||
[ "$CTID" -ge "100" ] || {
 | 
			
		||||
  msg_error "ID cannot be less than 100."
 | 
			
		||||
  exit 205
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[[ "${CTID:-}" ]] || { msg_error "You need to set 'CTID' variable."; exit 203; }
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || { msg_error "You need to set 'PCT_OSTYPE' variable."; exit 204; }
 | 
			
		||||
 | 
			
		||||
[ "$CTID" -ge "100" ] || { msg_error "ID cannot be less than 100."; exit 205; }
 | 
			
		||||
 | 
			
		||||
# Test if ID is in use
 | 
			
		||||
if pct status $CTID &>/dev/null; then
 | 
			
		||||
  echo -e "ID '$CTID' is already in use."
 | 
			
		||||
  unset CTID
 | 
			
		||||
@@ -110,10 +122,12 @@ CONTAINER_STORAGE=$(select_storage container) || exit
 | 
			
		||||
 | 
			
		||||
pveam update >/dev/null
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-}
 | 
			
		||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V)
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || { msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'."; exit 207; }
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || {
 | 
			
		||||
  msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'."
 | 
			
		||||
  exit 207
 | 
			
		||||
}
 | 
			
		||||
TEMPLATE="${TEMPLATES[-1]}"
 | 
			
		||||
 | 
			
		||||
TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
			
		||||
@@ -121,28 +135,29 @@ TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
			
		||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
 | 
			
		||||
  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
  pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
 | 
			
		||||
    { msg_error "A problem occurred while downloading the LXC template."; exit 208; }
 | 
			
		||||
    {
 | 
			
		||||
      msg_error "A problem occurred while downloading the LXC template."
 | 
			
		||||
      exit 208
 | 
			
		||||
    }
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >> /etc/subuid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >> /etc/subgid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >>/etc/subgid
 | 
			
		||||
 | 
			
		||||
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
 | 
			
		||||
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}")
 | 
			
		||||
 | 
			
		||||
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
 | 
			
		||||
  pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
 | 
			
		||||
    {
 | 
			
		||||
      msg_error "A problem occurred while re-downloading the LXC template."
 | 
			
		||||
      exit 208
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
      [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
    pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||    
 | 
			
		||||
      { msg_error "A problem occurred while re-downloading the LXC template."; exit 208; }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
        msg_error "A problem occurred while trying to create container after re-downloading template."
 | 
			
		||||
      exit 200
 | 
			
		||||
    fi
 | 
			
		||||
    msg_error "A problem occurred while trying to create container after re-downloading template."
 | 
			
		||||
    exit 200
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 
 | 
			
		||||
@@ -1,31 +1,31 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# Author: Michel Roegl-Brunner (michelroegl-brunner)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SCRIPT_NAME="${BASH_SOURCE[0]:-unknown_script}"
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Euoe pipefail
 | 
			
		||||
  set -Euo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command '$command'"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit 300
 | 
			
		||||
  local error_message="Failure in line $line_number while executing command '$command'"   
 | 
			
		||||
  echo -e "\n$error_message\n" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    STD="silent"
 | 
			
		||||
    silent() { 
 | 
			
		||||
        "$@" >/dev/null 2>&1 || error_handler "${BASH_LINENO[0]}" "$*"
 | 
			
		||||
    }
 | 
			
		||||
  STD="silent"
 | 
			
		||||
  silent() {
 | 
			
		||||
    "$@" >/dev/null 2>&1 || error_handler "${BASH_LINENO[0]}" "$*"
 | 
			
		||||
  }
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
@@ -43,9 +43,11 @@ msg_error() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
  RETRY_NUM=10
 | 
			
		||||
  RETRY_EVERY=3
 | 
			
		||||
 | 
			
		||||
RETRY_NUM=10
 | 
			
		||||
RETRY_EVERY=3
 | 
			
		||||
setting_up_container() {
 | 
			
		||||
 | 
			
		||||
  sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
 | 
			
		||||
  locale_line=$(grep -v '^#' /etc/locale.gen | grep -E '^[a-zA-Z]' | awk '{print $1}' | head -n 1)
 | 
			
		||||
  echo "LANG=${locale_line}" >/etc/default/locale
 | 
			
		||||
@@ -58,7 +60,6 @@ setting_up_container() {
 | 
			
		||||
    if [ "$(hostname -I)" != "" ]; then
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
    echo 1>&2 -en "No Network! "
 | 
			
		||||
    sleep $RETRY_EVERY
 | 
			
		||||
  done
 | 
			
		||||
  if [ "$(hostname -I)" = "" ]; then
 | 
			
		||||
@@ -68,8 +69,6 @@ setting_up_container() {
 | 
			
		||||
  fi
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  systemctl disable -q --now systemd-networkd-wait-online.service
 | 
			
		||||
  msg_ok "Set up Container OS"
 | 
			
		||||
  msg_ok "Network Connected: $(hostname -I)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
network_check() {
 | 
			
		||||
@@ -79,11 +78,10 @@ network_check() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
  msg_info "Updating Container OS"
 | 
			
		||||
  apt-get update
 | 
			
		||||
  apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
 | 
			
		||||
  export DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
  apt-get update >/dev/null 2>&1
 | 
			
		||||
  apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade >/dev/null
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
motd_ssh() {
 | 
			
		||||
@@ -91,5 +89,5 @@ motd_ssh() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
   return
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										0
									
								
								.editorconfig → .vscode/.editorconfig
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								.editorconfig → .vscode/.editorconfig
									
									
									
									
										vendored
									
									
								
							
							
								
								
									
										138
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -17,6 +17,144 @@ All LXC instances created using this repository come pre-installed with Midnight
 | 
			
		||||
Do not break established syntax in this file, as it is automatically updated by a Github Workflow
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 2025-02-24
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: wger [@tremor021](https://github.com/tremor021) ([#2574](https://github.com/community-scripts/ProxmoxVE/pull/2574))
 | 
			
		||||
- New Script: VictoriaMetrics [@tremor021](https://github.com/tremor021) ([#2565](https://github.com/community-scripts/ProxmoxVE/pull/2565))
 | 
			
		||||
- New Script: Authelia [@thost96](https://github.com/thost96) ([#2060](https://github.com/community-scripts/ProxmoxVE/pull/2060))
 | 
			
		||||
- New Script: Jupyter Notebook [@Dave-code-creater](https://github.com/Dave-code-creater) ([#2561](https://github.com/community-scripts/ProxmoxVE/pull/2561))
 | 
			
		||||
 | 
			
		||||
### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
- Fix Docmost: default upload size and saving data when updating [@bvdberg01](https://github.com/bvdberg01) ([#2598](https://github.com/community-scripts/ProxmoxVE/pull/2598))
 | 
			
		||||
- Fix: homarr db migration [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2575](https://github.com/community-scripts/ProxmoxVE/pull/2575))
 | 
			
		||||
- Fix: Wireguard - Restart wgdashboard automatically after update [@LostALice](https://github.com/LostALice) ([#2587](https://github.com/community-scripts/ProxmoxVE/pull/2587))
 | 
			
		||||
- Fix: Authelia Unbound Variable Argon2id [@MickLesk](https://github.com/MickLesk) ([#2604](https://github.com/community-scripts/ProxmoxVE/pull/2604))
 | 
			
		||||
- Fix: Omada check for AVX Support and use the correct MongoDB Version [@MickLesk](https://github.com/MickLesk) ([#2600](https://github.com/community-scripts/ProxmoxVE/pull/2600))
 | 
			
		||||
- Fix: Update-Script Firefly III based on their docs [@MickLesk](https://github.com/MickLesk) ([#2534](https://github.com/community-scripts/ProxmoxVE/pull/2534))
 | 
			
		||||
 | 
			
		||||
### ✨ New Features
 | 
			
		||||
 | 
			
		||||
- Feature: Template-Check, Better Handling of Downloads, Better Network… [@MickLesk](https://github.com/MickLesk) ([#2592](https://github.com/community-scripts/ProxmoxVE/pull/2592))
 | 
			
		||||
- Feature: Possibility to perform updates in silent / verbose (+ logging) [@MickLesk](https://github.com/MickLesk) ([#2583](https://github.com/community-scripts/ProxmoxVE/pull/2583))
 | 
			
		||||
- Feature: Use Verbose Mode for all Scripts (removed &>/dev/null) [@MickLesk](https://github.com/MickLesk) ([#2596](https://github.com/community-scripts/ProxmoxVE/pull/2596))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Fix: Authelia - Make user enter their domain manually [@tremor021](https://github.com/tremor021) ([#2618](https://github.com/community-scripts/ProxmoxVE/pull/2618))
 | 
			
		||||
- Website: Change Info for PiHole Password [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2602](https://github.com/community-scripts/ProxmoxVE/pull/2602))
 | 
			
		||||
- Fix: Jupyter Json (missing logo & improve name on website) [@MickLesk](https://github.com/MickLesk) ([#2584](https://github.com/community-scripts/ProxmoxVE/pull/2584))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- [gh] Update Script Test Workflow [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2599](https://github.com/community-scripts/ProxmoxVE/pull/2599))
 | 
			
		||||
- [gh] Contributor-Guide: Update AppName.md & AppName.sh [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2603](https://github.com/community-scripts/ProxmoxVE/pull/2603))
 | 
			
		||||
 | 
			
		||||
## 2025-02-23
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Hev socks5 server [@miviro](https://github.com/miviro) ([#2454](https://github.com/community-scripts/ProxmoxVE/pull/2454))
 | 
			
		||||
- New Script: bolt.diy [@tremor021](https://github.com/tremor021) ([#2528](https://github.com/community-scripts/ProxmoxVE/pull/2528))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: Wireguard - Remove setting NAT as its already in PostUp/Down [@tremor021](https://github.com/tremor021) ([#2510](https://github.com/community-scripts/ProxmoxVE/pull/2510))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Fix: Home Assistant Core - fixed wrong text in application description on website [@TMigue](https://github.com/TMigue) ([#2576](https://github.com/community-scripts/ProxmoxVE/pull/2576))
 | 
			
		||||
 | 
			
		||||
## 2025-02-22
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Fix a few broken icon links [@Snarkenfaugister](https://github.com/Snarkenfaugister) ([#2548](https://github.com/community-scripts/ProxmoxVE/pull/2548))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- Fix: URL's in CONTRIBUTING.md [@bvdberg01](https://github.com/bvdberg01) ([#2552](https://github.com/community-scripts/ProxmoxVE/pull/2552))
 | 
			
		||||
 | 
			
		||||
## 2025-02-21
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Add ZFS to Podman. Now it works on ZFS! [@jaminmc](https://github.com/jaminmc) ([#2526](https://github.com/community-scripts/ProxmoxVE/pull/2526))
 | 
			
		||||
- Fix: Tianji - Downgrade Node [@MickLesk](https://github.com/MickLesk) ([#2530](https://github.com/community-scripts/ProxmoxVE/pull/2530))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- [gh] General Cleanup & Moving Files / Folders [@MickLesk](https://github.com/MickLesk) ([#2532](https://github.com/community-scripts/ProxmoxVE/pull/2532))
 | 
			
		||||
 | 
			
		||||
## 2025-02-20
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
- Breaking: Actual Budget Script (HTTPS / DB Migration / New Structure) - Read Description [@MickLesk](https://github.com/MickLesk) ([#2496](https://github.com/community-scripts/ProxmoxVE/pull/2496))
 | 
			
		||||
- Pihole & Unbound: Installation for Pihole V6 (read description) [@MickLesk](https://github.com/MickLesk) ([#2505](https://github.com/community-scripts/ProxmoxVE/pull/2505))
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Dolibarr [@tremor021](https://github.com/tremor021) ([#2502](https://github.com/community-scripts/ProxmoxVE/pull/2502))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: Pingvin Share - Update not copying to correct directory [@tremor021](https://github.com/tremor021) ([#2521](https://github.com/community-scripts/ProxmoxVE/pull/2521))
 | 
			
		||||
- WikiJS: Prepare for Using PostgreSQL [@MickLesk](https://github.com/MickLesk) ([#2516](https://github.com/community-scripts/ProxmoxVE/pull/2516))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- [gh] better handling of labels [@MickLesk](https://github.com/MickLesk) ([#2517](https://github.com/community-scripts/ProxmoxVE/pull/2517))
 | 
			
		||||
 | 
			
		||||
## 2025-02-19
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: file replacement in Watcharr Update Script [@Clusters](https://github.com/Clusters) ([#2498](https://github.com/community-scripts/ProxmoxVE/pull/2498))
 | 
			
		||||
- Fix: Kometa - fixed successful setup message and added info to json [@tremor021](https://github.com/tremor021) ([#2495](https://github.com/community-scripts/ProxmoxVE/pull/2495))
 | 
			
		||||
- Fix: Actual Budget, add missing .env when updating [@MickLesk](https://github.com/MickLesk) ([#2494](https://github.com/community-scripts/ProxmoxVE/pull/2494))
 | 
			
		||||
 | 
			
		||||
## 2025-02-18
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Docmost [@MickLesk](https://github.com/MickLesk) ([#2472](https://github.com/community-scripts/ProxmoxVE/pull/2472))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: SQL Server 2022 | GPG & Install [@MickLesk](https://github.com/MickLesk) ([#2476](https://github.com/community-scripts/ProxmoxVE/pull/2476))
 | 
			
		||||
- Feature: PBS Bare Metal Installation - Allow Microcode [@MickLesk](https://github.com/MickLesk) ([#2477](https://github.com/community-scripts/ProxmoxVE/pull/2477))
 | 
			
		||||
- Fix: MagicMirror force Node version and fix backups [@tremor021](https://github.com/tremor021) ([#2468](https://github.com/community-scripts/ProxmoxVE/pull/2468))
 | 
			
		||||
- Update BunkerWeb scripts to latest NGINX and specs [@TheophileDiot](https://github.com/TheophileDiot) ([#2466](https://github.com/community-scripts/ProxmoxVE/pull/2466))
 | 
			
		||||
 | 
			
		||||
## 2025-02-17
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
- Zipline: Prepare for Version 4.0.0 [@MickLesk](https://github.com/MickLesk) ([#2455](https://github.com/community-scripts/ProxmoxVE/pull/2455))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix: Zipline increase SECRET to 42 chars [@V1d1o7](https://github.com/V1d1o7) ([#2444](https://github.com/community-scripts/ProxmoxVE/pull/2444))
 | 
			
		||||
 | 
			
		||||
## 2025-02-16
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 
 | 
			
		||||
@@ -19,10 +19,10 @@
 | 
			
		||||
    <a href="https://ko-fi.com/community_scripts">
 | 
			
		||||
      <img src="https://img.shields.io/badge/Support-FF5F5F?style=for-the-badge&logo=ko-fi&logoColor=white" alt="Donate" />
 | 
			
		||||
    </a>
 | 
			
		||||
    <a href="https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTING.md">
 | 
			
		||||
    <a href="https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/CONTRIBUTING.md">
 | 
			
		||||
      <img src="https://img.shields.io/badge/Contribute-ff4785?style=for-the-badge&logo=git&logoColor=white" alt="Contribute" />
 | 
			
		||||
    </a> 
 | 
			
		||||
    <a href="https://github.com/community-scripts/ProxmoxVE/blob/main/USER_SUBMITTED_GUIDES.md">
 | 
			
		||||
    <a href="https://github.com/community-scripts/ProxmoxVE/blob/main/.github/CONTRIBUTOR_AND_GUIDES/USER_SUBMITTED_GUIDES.md">
 | 
			
		||||
      <img src="https://img.shields.io/badge/Guides-0077b5?style=for-the-badge&logo=read-the-docs&logoColor=white" alt="Guides" />
 | 
			
		||||
    </a> 
 | 
			
		||||
    <a href="https://github.com/community-scripts/ProxmoxVE/blob/main/CHANGELOG.md">
 | 
			
		||||
 
 | 
			
		||||
@@ -35,8 +35,8 @@ function update_script() {
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/2fauth_version.txt)" ]] || [[ ! -f /opt/2fauth_version.txt ]]; then
 | 
			
		||||
        msg_info "Updating $APP to ${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        apt-get update &>/dev/null
 | 
			
		||||
        apt-get -y upgrade &>/dev/null
 | 
			
		||||
        $STD apt-get update
 | 
			
		||||
        $STD apt-get -y upgrade
 | 
			
		||||
 | 
			
		||||
        # Creating Backup
 | 
			
		||||
        msg_info "Creating Backup"
 | 
			
		||||
@@ -55,7 +55,7 @@ function update_script() {
 | 
			
		||||
        chmod -R 755 "/opt/2fauth"
 | 
			
		||||
 | 
			
		||||
        export COMPOSER_ALLOW_SUPERUSER=1
 | 
			
		||||
        composer install --no-dev --prefer-source &>/dev/null
 | 
			
		||||
        $STD composer install --no-dev --prefer-source
 | 
			
		||||
 | 
			
		||||
        php artisan 2fauth:install
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,10 +26,12 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    if [[ ! -d /opt/actualbudget ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
        exit 1
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/actualbudget/actual/releases/latest | \
 | 
			
		||||
              grep "tag_name" | awk -F '"' '{print substr($4, 2)}')
 | 
			
		||||
 | 
			
		||||
    if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then
 | 
			
		||||
        msg_info "Stopping ${APP}"
 | 
			
		||||
        systemctl stop actualbudget
 | 
			
		||||
@@ -37,32 +39,78 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating ${APP} to ${RELEASE}"
 | 
			
		||||
        cd /tmp
 | 
			
		||||
        wget -q https://github.com/actualbudget/actual-server/archive/refs/tags/v${RELEASE}.tar.gz
 | 
			
		||||
        wget -q "https://github.com/actualbudget/actual-server/archive/refs/tags/v${RELEASE}.tar.gz"
 | 
			
		||||
 | 
			
		||||
        mv /opt/actualbudget /opt/actualbudget_bak
 | 
			
		||||
        tar -xzf v${RELEASE}.tar.gz >/dev/null 2>&1
 | 
			
		||||
        $STD tar -xzf "v${RELEASE}.tar.gz"
 | 
			
		||||
        mv *ctual-server-* /opt/actualbudget
 | 
			
		||||
        rm -rf /opt/actualbudget/.env
 | 
			
		||||
        mv /opt/actualbudget_bak/.env /opt/actualbudget
 | 
			
		||||
        mv /opt/actualbudget_bak/.migrate /opt/actualbudget
 | 
			
		||||
        mv /opt/actualbudget_bak/server-files /opt/actualbudget/server-files
 | 
			
		||||
 | 
			
		||||
        mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
 | 
			
		||||
        for dir in server-files .migrate user-files migrations; do
 | 
			
		||||
            if [[ -d /opt/actualbudget_bak/$dir ]]; then
 | 
			
		||||
                mv /opt/actualbudget_bak/$dir/* /opt/actualbudget-data/$dir/ || true
 | 
			
		||||
            fi
 | 
			
		||||
        done
 | 
			
		||||
        if [[ -f /opt/actualbudget-data/migrate/.migrations ]]; then
 | 
			
		||||
            sed -i 's/null/1732656575219/g' /opt/actualbudget-data/migrate/.migrations
 | 
			
		||||
            sed -i 's/null/1732656575220/g' /opt/actualbudget-data/migrate/.migrations
 | 
			
		||||
        fi
 | 
			
		||||
        if [[ -f /opt/actualbudget/server-files/account.sqlite ]] && [[ ! -f /opt/actualbudget-data/server-files/account.sqlite ]]; then
 | 
			
		||||
            mv /opt/actualbudget/server-files/account.sqlite /opt/actualbudget-data/server-files/account.sqlite
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        if [[ -f /opt/actualbudget_bak/.env ]]; then
 | 
			
		||||
            mv /opt/actualbudget_bak/.env /opt/actualbudget-data/.env
 | 
			
		||||
        else
 | 
			
		||||
            cat <<EOF > /opt/actualbudget-data/.env
 | 
			
		||||
ACTUAL_UPLOAD_DIR=/opt/actualbudget-data/upload
 | 
			
		||||
ACTUAL_DATA_DIR=/opt/actualbudget-data
 | 
			
		||||
ACTUAL_SERVER_FILES_DIR=/opt/actualbudget-data/server-files
 | 
			
		||||
ACTUAL_USER_FILES=/opt/actualbudget-data/user-files
 | 
			
		||||
PORT=5006
 | 
			
		||||
ACTUAL_TRUSTED_PROXIES="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.1/32,::1/128,fc00::/7"
 | 
			
		||||
ACTUAL_HTTPS_KEY=/opt/actualbudget/selfhost.key
 | 
			
		||||
ACTUAL_HTTPS_CERT=/opt/actualbudget/selfhost.crt
 | 
			
		||||
EOF
 | 
			
		||||
        fi
 | 
			
		||||
        cd /opt/actualbudget
 | 
			
		||||
        yarn install &>/dev/null
 | 
			
		||||
        echo "${RELEASE}" >/opt/actualbudget_version.txt
 | 
			
		||||
        $STD yarn install
 | 
			
		||||
        echo "${RELEASE}" > /opt/actualbudget_version.txt
 | 
			
		||||
        msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting ${APP}"
 | 
			
		||||
        cat <<EOF > /etc/systemd/system/actualbudget.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Actual Budget Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=root
 | 
			
		||||
Group=root
 | 
			
		||||
WorkingDirectory=/opt/actualbudget
 | 
			
		||||
EnvironmentFile=/opt/actualbudget-data/.env
 | 
			
		||||
ExecStart=/usr/bin/yarn start
 | 
			
		||||
Restart=always
 | 
			
		||||
RestartSec=10
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
        systemctl daemon-reload
 | 
			
		||||
        systemctl start actualbudget
 | 
			
		||||
        msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf /opt/actualbudget_bak
 | 
			
		||||
        rm -rf /tmp/v${RELEASE}.tar.gz
 | 
			
		||||
        rm -rf "/tmp/v${RELEASE}.tar.gz"
 | 
			
		||||
        msg_ok "Cleaned"
 | 
			
		||||
        msg_ok "Updated Successfully"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
    exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -72,4 +120,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}:5006${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:5006${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -43,15 +43,15 @@ function update_script() {
 | 
			
		||||
    mv /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
 | 
			
		||||
    mv /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
 | 
			
		||||
    cd /opt/adventurelog/backend/server
 | 
			
		||||
    pip install --upgrade pip &>/dev/null
 | 
			
		||||
    pip install -r requirements.txt &>/dev/null
 | 
			
		||||
    python3 manage.py collectstatic --noinput &>/dev/null
 | 
			
		||||
    python3 manage.py migrate &>/dev/null
 | 
			
		||||
    $STD pip install --upgrade pip
 | 
			
		||||
    $STD pip install -r requirements.txt
 | 
			
		||||
    $STD python3 manage.py collectstatic --noinput
 | 
			
		||||
    $STD python3 manage.py migrate
 | 
			
		||||
 | 
			
		||||
    mv /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
 | 
			
		||||
    cd /opt/adventurelog/frontend
 | 
			
		||||
    pnpm install &>/dev/null
 | 
			
		||||
    pnpm run build &>/dev/null
 | 
			
		||||
    $STD pnpm install
 | 
			
		||||
    $STD pnpm run build
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ if [ ! -d /usr/share/nginx/html ]; then
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/CorentinTh/it-tools/releases/latest | grep '"tag_name":' | cut -d '"' -f4)
 | 
			
		||||
if [ "${RELEASE}" != "$(cat /opt/${APP}_version.txt 2>/dev/null)" ] || [ ! -f /opt/${APP}_version.txt ]; then
 | 
			
		||||
if [ "${RELEASE}" != "$(cat /opt/${APP}_version.txt" ] || [ ! -f /opt/${APP}_version.txt ]; then
 | 
			
		||||
    DOWNLOAD_URL="https://github.com/CorentinTh/it-tools/releases/download/${RELEASE}/it-tools-${RELEASE#v}.zip"
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    curl -fsSL -o it-tools.zip "$DOWNLOAD_URL"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								ct/authelia.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								ct/authelia.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: thost96 (thost96)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://www.authelia.com/
 | 
			
		||||
 | 
			
		||||
APP="Authelia"
 | 
			
		||||
TAGS=""
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="512"
 | 
			
		||||
var_disk="2"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d "/etc/authelia/" ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/authelia/authelia/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(/usr/bin/authelia -v | awk '{print substr($3, 2, length($2)) }' )" ]]; then
 | 
			
		||||
        msg_info "Updating $APP to ${RELEASE}"
 | 
			
		||||
        $STD apt-get update
 | 
			
		||||
        $STD apt-get -y upgrade
 | 
			
		||||
        wget -q "https://github.com/authelia/authelia/releases/download/${RELEASE}/authelia_${RELEASE}_amd64.deb"
 | 
			
		||||
        $STD dpkg -i "authelia_${RELEASE}_amd64.deb"
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -f "authelia_${RELEASE}_amd64.deb"
 | 
			
		||||
        $STD apt-get -y autoremove
 | 
			
		||||
        $STD apt-get -y autoclean
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
        msg_ok "Updated $APP to ${RELEASE}"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9091${CL}"
 | 
			
		||||
@@ -40,11 +40,11 @@ function update_script() {
 | 
			
		||||
    tar -xzf authentik.tar.gz -C /opt/authentik --strip-components 1 --overwrite
 | 
			
		||||
    rm -rf authentik.tar.gz
 | 
			
		||||
    cd /opt/authentik/website
 | 
			
		||||
    npm install &>/dev/null
 | 
			
		||||
    npm run build-bundled &>/dev/null
 | 
			
		||||
    $STD npm install
 | 
			
		||||
    $STD npm run build-bundled
 | 
			
		||||
    cd /opt/authentik/web
 | 
			
		||||
    npm install &>/dev/null
 | 
			
		||||
    npm run build &>/dev/null
 | 
			
		||||
    $STD npm install
 | 
			
		||||
    $STD npm run build
 | 
			
		||||
    msg_ok "Built ${APP} website"
 | 
			
		||||
 | 
			
		||||
    msg_info "Building ${APP} server"
 | 
			
		||||
@@ -56,15 +56,15 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    msg_info "Installing Python Dependencies"
 | 
			
		||||
    cd /opt/authentik
 | 
			
		||||
    poetry install --only=main --no-ansi --no-interaction --no-root &>/dev/null
 | 
			
		||||
    poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt &>/dev/null
 | 
			
		||||
    pip install --no-cache-dir -r requirements.txt &>/dev/null
 | 
			
		||||
    pip install . &>/dev/null
 | 
			
		||||
    $STD poetry install --only=main --no-ansi --no-interaction --no-root
 | 
			
		||||
    $STD poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt
 | 
			
		||||
    $STD pip install --no-cache-dir -r requirements.txt
 | 
			
		||||
    $STD pip install .
 | 
			
		||||
    msg_ok "Installed Python Dependencies"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE} (Patience)"
 | 
			
		||||
    cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints
 | 
			
		||||
    bash /opt/authentik/lifecycle/ak migrate &>/dev/null
 | 
			
		||||
    $STD bash /opt/authentik/lifecycle/ak migrate
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,8 +25,8 @@ function update_script() {
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /var/lib/bazarr/ ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,8 +25,8 @@ function update_script() {
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /var ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
 | 
			
		||||
        msg_info "Updating $APP LXC"
 | 
			
		||||
        apt-get update &>/dev/null
 | 
			
		||||
        apt-get -y upgrade &>/dev/null
 | 
			
		||||
        $STD apt-get update
 | 
			
		||||
        $STD apt-get -y upgrade
 | 
			
		||||
        msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										71
									
								
								ct/boltdiy.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								ct/boltdiy.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Slaviša Arežina (tremor021)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/stackblitz-labs/bolt.diy/
 | 
			
		||||
 | 
			
		||||
APP="boltdiy"
 | 
			
		||||
TAGS="code;ai"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="3072"
 | 
			
		||||
var_disk="6"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/bolt.diy ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/stackblitz-labs/bolt.diy/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/boltdiy_version.txt)" ]] || [[ ! -f /opt/boltdiy_version.txt ]]; then
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop boltdiy
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        temp_dir=$(mktemp -d)
 | 
			
		||||
        temp_file=$(mktemp)
 | 
			
		||||
        cd $temp_dir
 | 
			
		||||
        wget -q "https://github.com/stackblitz-labs/bolt.diy/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
 | 
			
		||||
        tar xzf $temp_file
 | 
			
		||||
        cp -rf bolt.diy-${RELEASE}/* /opt/bolt.diy
 | 
			
		||||
        cd /opt/bolt.diy
 | 
			
		||||
        $STD pnpm install
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start boltdiy
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf $temp_file
 | 
			
		||||
        rm -rf $temp_dir
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
        echo "${RELEASE}" >/opt/boltdiy_version.txt
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5173${CL}"
 | 
			
		||||
@@ -39,12 +39,13 @@ function update_script() {
 | 
			
		||||
    unzip -q /opt/v${RELEASE}.zip -d /opt
 | 
			
		||||
    mv /opt/BookStack-${RELEASE} /opt/bookstack
 | 
			
		||||
    cp /opt/bookstack-backup/.env /opt/bookstack/.env
 | 
			
		||||
    cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ 2>/dev/null || true
 | 
			
		||||
    cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ 2>/dev/null || true
 | 
			
		||||
    cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ 2>/dev/null || true
 | 
			
		||||
    cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ || true
 | 
			
		||||
    cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ || true
 | 
			
		||||
    cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ || true
 | 
			
		||||
    cd /opt/bookstack
 | 
			
		||||
    COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev &>/dev/null
 | 
			
		||||
    php artisan migrate --force &>/dev/null
 | 
			
		||||
    export COMPOSER_ALLOW_SUPERUSER=1 
 | 
			
		||||
    $STD composer install --no-dev
 | 
			
		||||
    $STD php artisan migrate --force
 | 
			
		||||
    chown www-data:www-data -R /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage
 | 
			
		||||
    chmod -R 755 /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage
 | 
			
		||||
    chmod -R 775 /opt/bookstack/storage /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
APP="BunkerWeb"
 | 
			
		||||
var_tags="webserver"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_ram="4096"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
@@ -34,7 +34,7 @@ Pin: version ${RELEASE}
 | 
			
		||||
Pin-Priority: 1001
 | 
			
		||||
EOF
 | 
			
		||||
  apt-get update
 | 
			
		||||
  apt-get install -y nginx=1.26.2*
 | 
			
		||||
  apt-get install -y nginx=1.26.3*
 | 
			
		||||
  apt-get install -y bunkerweb=${RELEASE}
 | 
			
		||||
  echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
  msg_ok "Updated ${APP} to ${RELEASE}"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
      exit
 | 
			
		||||
   fi
 | 
			
		||||
   msg_info "Updating $APP LXC"
 | 
			
		||||
   apt-get update &>/dev/null
 | 
			
		||||
   apt-get -y upgrade &>/dev/null
 | 
			
		||||
   $STD apt-get update
 | 
			
		||||
   $STD apt-get -y upgrade
 | 
			
		||||
   msg_ok "Updated $APP LXC"
 | 
			
		||||
   exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -115,10 +115,10 @@ function update_script() {
 | 
			
		||||
      echo "${options[*]}"
 | 
			
		||||
    )
 | 
			
		||||
    echo $cps_options >/opt/calibre-web/options.txt
 | 
			
		||||
    pip install --upgrade calibreweb[$cps_options] &>/dev/null
 | 
			
		||||
    $STD pip install --upgrade calibreweb[$cps_options]
 | 
			
		||||
  else
 | 
			
		||||
    rm -rf /opt/calibre-web/options.txt
 | 
			
		||||
    pip install --upgrade calibreweb &>/dev/null
 | 
			
		||||
    $STD pip install --upgrade calibreweb
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_info "Starting ${APP}"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
      exit
 | 
			
		||||
   fi
 | 
			
		||||
   msg_info "Updating ${APP} LXC"
 | 
			
		||||
   apt-get update &>/dev/null
 | 
			
		||||
   apt-get -y upgrade &>/dev/null
 | 
			
		||||
   $STD apt-get update
 | 
			
		||||
   $STD apt-get -y upgrade
 | 
			
		||||
   msg_ok "Updated ${APP} LXC"
 | 
			
		||||
   exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,31 +31,31 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
  if ! dpkg -s libjpeg-dev >/dev/null 2>&1; then
 | 
			
		||||
    msg_info "Installing Dependencies"
 | 
			
		||||
    apt-get update
 | 
			
		||||
    apt-get install -y libjpeg-dev
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get install -y libjpeg-dev
 | 
			
		||||
    msg_ok "Updated Dependencies"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
  pip3 install changedetection.io --upgrade &>/dev/null
 | 
			
		||||
  $STD pip3 install changedetection.io --upgrade
 | 
			
		||||
  msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating Playwright"
 | 
			
		||||
  pip3 install playwright --upgrade &>/dev/null
 | 
			
		||||
  $STD pip3 install playwright --upgrade
 | 
			
		||||
  msg_ok "Updated Playwright"
 | 
			
		||||
 | 
			
		||||
  if [[ -f /etc/systemd/system/browserless.service ]]; then
 | 
			
		||||
    msg_info "Updating Browserless (Patience)"
 | 
			
		||||
    git -C /opt/browserless/ fetch --all &>/dev/null
 | 
			
		||||
    git -C /opt/browserless/ reset --hard origin/main &>/dev/null
 | 
			
		||||
    npm update --prefix /opt/browserless &>/dev/null
 | 
			
		||||
    /opt/browserless/node_modules/playwright-core/cli.js install --with-deps &>/dev/null
 | 
			
		||||
    $STD git -C /opt/browserless/ fetch --all
 | 
			
		||||
    $STD git -C /opt/browserless/ reset --hard origin/main
 | 
			
		||||
    $STD npm update --prefix /opt/browserless
 | 
			
		||||
    $STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps
 | 
			
		||||
    # Update Chrome separately, as it has to be done with the force option. Otherwise the installation of other browsers will not be done if Chrome is already installed.
 | 
			
		||||
    /opt/browserless/node_modules/playwright-core/cli.js install --force chrome &>/dev/null
 | 
			
		||||
    /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit &>/dev/null
 | 
			
		||||
    npm run build --prefix /opt/browserless &>/dev/null
 | 
			
		||||
    npm run build:function --prefix /opt/browserless &>/dev/null
 | 
			
		||||
    npm prune production --prefix /opt/browserless &>/dev/null
 | 
			
		||||
    $STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome
 | 
			
		||||
    $STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit
 | 
			
		||||
    $STD npm run build --prefix /opt/browserless
 | 
			
		||||
    $STD npm run build:function --prefix /opt/browserless
 | 
			
		||||
    $STD npm prune production --prefix /opt/browserless
 | 
			
		||||
    systemctl restart browserless
 | 
			
		||||
    msg_ok "Updated Browserless"
 | 
			
		||||
  else
 | 
			
		||||
 
 | 
			
		||||
@@ -30,14 +30,14 @@ function update_script() {
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | tr ' ' '\n' | grep -v '\-rc' | sort -V | tail -n 1) 
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    omd stop monitoring &>/dev/null
 | 
			
		||||
    omd cp monitoring monitoringbackup &>/dev/null
 | 
			
		||||
    $STD omd stop monitoring
 | 
			
		||||
    $STD omd cp monitoring monitoringbackup
 | 
			
		||||
    wget -q https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb -O /opt/checkmk.deb
 | 
			
		||||
    apt-get install -y /opt/checkmk.deb &>/dev/null
 | 
			
		||||
    omd --force -V ${RELEASE}.cre update --conflict=install monitoring &>/dev/null
 | 
			
		||||
    omd start monitoring &>/dev/null
 | 
			
		||||
    omd -f rm monitoringbackup  &>/dev/null
 | 
			
		||||
    omd cleanup &>/dev/null
 | 
			
		||||
    $STD apt-get install -y /opt/checkmk.deb
 | 
			
		||||
    $STD omd --force -V ${RELEASE}.cre update --conflict=install monitoring
 | 
			
		||||
    $STD omd start monitoring
 | 
			
		||||
    $STD omd -f rm monitoringbackup 
 | 
			
		||||
    $STD omd cleanup
 | 
			
		||||
    rm -rf /opt/checkmk.deb
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
  else
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
      exit
 | 
			
		||||
   fi
 | 
			
		||||
   msg_info "Updating $APP LXC"
 | 
			
		||||
   apt-get update &>/dev/null
 | 
			
		||||
   apt-get -y upgrade &>/dev/null
 | 
			
		||||
   $STD apt-get update
 | 
			
		||||
   $STD apt-get -y upgrade
 | 
			
		||||
   msg_ok "Updated $APP LXC"
 | 
			
		||||
   exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -36,48 +36,48 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
  if [ "$UPD" == "1" ]; then
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated ${APP} LXC"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if [ "$UPD" == "2" ]; then
 | 
			
		||||
    msg_info "Installing dependencies (patience)"
 | 
			
		||||
    apt-get install -y attr &>/dev/null
 | 
			
		||||
    apt-get install -y nfs-kernel-server &>/dev/null
 | 
			
		||||
    apt-get install -y samba &>/dev/null
 | 
			
		||||
    apt-get install -y samba-common-bin &>/dev/null
 | 
			
		||||
    apt-get install -y winbind &>/dev/null
 | 
			
		||||
    apt-get install -y gawk &>/dev/null
 | 
			
		||||
    $STD apt-get install -y attr
 | 
			
		||||
    $STD apt-get install -y nfs-kernel-server
 | 
			
		||||
    $STD apt-get install -y samba
 | 
			
		||||
    $STD apt-get install -y samba-common-bin
 | 
			
		||||
    $STD apt-get install -y winbind
 | 
			
		||||
    $STD apt-get install -y gawk
 | 
			
		||||
    msg_ok "Installed dependencies"
 | 
			
		||||
    msg_info "Installing Cockpit file sharing"
 | 
			
		||||
    wget -q $(curl -s https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
 | 
			
		||||
    dpkg -i cockpit-file-sharing_*focal_all.deb &>/dev/null
 | 
			
		||||
    $STD dpkg -i cockpit-file-sharing_*focal_all.deb
 | 
			
		||||
    rm cockpit-file-sharing_*focal_all.deb
 | 
			
		||||
    msg_ok "Installed Cockpit file sharing"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if [ "$UPD" == "3" ]; then
 | 
			
		||||
    msg_info "Installing dependencies (patience)"
 | 
			
		||||
    apt-get install -y psmisc &>/dev/null
 | 
			
		||||
    apt-get install -y samba &>/dev/null
 | 
			
		||||
    apt-get install -y samba-common-bin &>/dev/null
 | 
			
		||||
    $STD apt-get install -y psmisc
 | 
			
		||||
    $STD apt-get install -y samba
 | 
			
		||||
    $STD apt-get install -y samba-common-bin
 | 
			
		||||
    msg_ok "Installed dependencies"
 | 
			
		||||
    msg_info "Installing Cockpit identities"
 | 
			
		||||
    wget -q $(curl -s https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
 | 
			
		||||
    dpkg -i cockpit-identities_*focal_all.deb &>/dev/null
 | 
			
		||||
    $STD dpkg -i cockpit-identities_*focal_all.deb
 | 
			
		||||
    rm cockpit-identities_*focal_all.deb
 | 
			
		||||
    msg_ok "Installed Cockpit identities"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  if [ "$UPD" == "4" ]; then
 | 
			
		||||
    msg_info "Installing dependencies"
 | 
			
		||||
    apt-get install -y rsync &>/dev/null
 | 
			
		||||
    apt-get install -y zip &>/dev/null
 | 
			
		||||
    $STD apt-get install -y rsync
 | 
			
		||||
    $STD apt-get install -y zip
 | 
			
		||||
    msg_ok "Installed dependencies"
 | 
			
		||||
    msg_info "Installing Cockpit navigator"
 | 
			
		||||
    wget -q $(curl -s https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
 | 
			
		||||
    dpkg -i cockpit-navigator_*focal_all.deb &>/dev/null
 | 
			
		||||
    $STD dpkg -i cockpit-navigator_*focal_all.deb
 | 
			
		||||
    rm cockpit-navigator_*focal_all.deb
 | 
			
		||||
    msg_ok "Installed Cockpit navigator"
 | 
			
		||||
    exit
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										121
									
								
								ct/create_lxc.sh
									
									
									
									
									
								
							
							
						
						
									
										121
									
								
								ct/create_lxc.sh
									
									
									
									
									
								
							@@ -36,7 +36,7 @@ trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
 | 
			
		||||
# This function handles errors
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
 | 
			
		||||
  printf "\e[?25h"
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
@@ -57,7 +57,7 @@ function spinner() {
 | 
			
		||||
 | 
			
		||||
  while true; do
 | 
			
		||||
    printf "\r ${color}%s${CL}" "${frames[spin_i]}"
 | 
			
		||||
    spin_i=$(( (spin_i + 1) % ${#frames[@]} ))
 | 
			
		||||
    spin_i=$(((spin_i + 1) % ${#frames[@]}))
 | 
			
		||||
    sleep "$interval"
 | 
			
		||||
  done
 | 
			
		||||
}
 | 
			
		||||
@@ -70,9 +70,16 @@ function msg_info() {
 | 
			
		||||
  SPINNER_PID=$!
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function msg_warn() {
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
 | 
			
		||||
  printf "\e[?25h"
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${BFR}${INFO}${YWB}${msg}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function displays a success message with a green color.
 | 
			
		||||
function msg_ok() {
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
 | 
			
		||||
  printf "\e[?25h"
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${BFR}${CM}${GN}${msg}${CL}"
 | 
			
		||||
@@ -80,7 +87,7 @@ function msg_ok() {
 | 
			
		||||
 | 
			
		||||
# This function displays a error message with a red color.
 | 
			
		||||
function msg_error() {
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi
 | 
			
		||||
  printf "\e[?25h"
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
 | 
			
		||||
@@ -113,7 +120,10 @@ function select_storage() {
 | 
			
		||||
    CONTENT='vztmpl'
 | 
			
		||||
    CONTENT_LABEL='Container template'
 | 
			
		||||
    ;;
 | 
			
		||||
  *) false || { msg_error "Invalid storage class."; exit 201; };
 | 
			
		||||
  *) false || {
 | 
			
		||||
    msg_error "Invalid storage class."
 | 
			
		||||
    exit 201
 | 
			
		||||
  } ;;
 | 
			
		||||
  esac
 | 
			
		||||
 | 
			
		||||
  # This Queries all storage locations
 | 
			
		||||
@@ -131,15 +141,18 @@ function select_storage() {
 | 
			
		||||
  done < <(pvesm status -content $CONTENT | awk 'NR>1')
 | 
			
		||||
 | 
			
		||||
  # Select storage location
 | 
			
		||||
  if [ $((${#MENU[@]}/3)) -eq 1 ]; then
 | 
			
		||||
  if [ $((${#MENU[@]} / 3)) -eq 1 ]; then
 | 
			
		||||
    printf ${MENU[0]}
 | 
			
		||||
  else
 | 
			
		||||
    local STORAGE
 | 
			
		||||
    while [ -z "${STORAGE:+x}" ]; do
 | 
			
		||||
      STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \
 | 
			
		||||
      "Which storage pool you would like to use for the ${CONTENT_LABEL,,}?\nTo make a selection, use the Spacebar.\n" \
 | 
			
		||||
      16 $(($MSG_MAX_LENGTH + 23)) 6 \
 | 
			
		||||
      "${MENU[@]}" 3>&1 1>&2 2>&3) || { msg_error "Menu aborted."; exit 202; }
 | 
			
		||||
        "Which storage pool you would like to use for the ${CONTENT_LABEL,,}?\nTo make a selection, use the Spacebar.\n" \
 | 
			
		||||
        16 $(($MSG_MAX_LENGTH + 23)) 6 \
 | 
			
		||||
        "${MENU[@]}" 3>&1 1>&2 2>&3) || {
 | 
			
		||||
        msg_error "Menu aborted."
 | 
			
		||||
        exit 202
 | 
			
		||||
      }
 | 
			
		||||
      if [ $? -ne 0 ]; then
 | 
			
		||||
        echo -e "${CROSS}${RD} Menu aborted by user.${CL}"
 | 
			
		||||
        exit 0
 | 
			
		||||
@@ -149,14 +162,37 @@ function select_storage() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
# Test if required variables are set
 | 
			
		||||
[[ "${CTID:-}" ]] || { msg_error "You need to set 'CTID' variable."; exit 203; }
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || { msg_error "You need to set 'PCT_OSTYPE' variable."; exit 204; }
 | 
			
		||||
[[ "${CTID:-}" ]] || {
 | 
			
		||||
  msg_error "You need to set 'CTID' variable."
 | 
			
		||||
  exit 203
 | 
			
		||||
}
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || {
 | 
			
		||||
  msg_error "You need to set 'PCT_OSTYPE' variable."
 | 
			
		||||
  exit 204
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Test if ID is valid
 | 
			
		||||
[ "$CTID" -ge "100" ] || { msg_error "ID cannot be less than 100."; exit 205; }
 | 
			
		||||
[ "$CTID" -ge "100" ] || {
 | 
			
		||||
  msg_error "ID cannot be less than 100."
 | 
			
		||||
  exit 205
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Check for network connectivity (IPv4 & IPv6)
 | 
			
		||||
#function check_network() {
 | 
			
		||||
#  local CHECK_URLS=("8.8.8.8" "1.1.1.1" "9.9.9.9" "2606:4700:4700::1111" "2001:4860:4860::8888" "2620:fe::fe")
 | 
			
		||||
#
 | 
			
		||||
#  for url in "${CHECK_URLS[@]}"; do
 | 
			
		||||
#    if ping -c 1 -W 2 "$url" &>/dev/null; then
 | 
			
		||||
#      return 0 # Success: At least one connection works
 | 
			
		||||
#    fi
 | 
			
		||||
#  done
 | 
			
		||||
#
 | 
			
		||||
#  msg_error "No network connection detected. Check your internet connection."
 | 
			
		||||
#  exit 101
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
# Test if ID is in use
 | 
			
		||||
if pct status $CTID &>/dev/null; then
 | 
			
		||||
if qm status "$CTID" &>/dev/null || pct status "$CTID" &>/dev/null; then
 | 
			
		||||
  echo -e "ID '$CTID' is already in use."
 | 
			
		||||
  unset CTID
 | 
			
		||||
  msg_error "Cannot use ID that is already in use."
 | 
			
		||||
@@ -173,46 +209,73 @@ msg_ok "Using ${BL}$CONTAINER_STORAGE${CL} ${GN}for Container Storage."
 | 
			
		||||
 | 
			
		||||
# Update LXC template list
 | 
			
		||||
msg_info "Updating LXC Template List"
 | 
			
		||||
#check_network
 | 
			
		||||
pveam update >/dev/null
 | 
			
		||||
msg_ok "Updated LXC Template List"
 | 
			
		||||
 | 
			
		||||
# Get LXC template string
 | 
			
		||||
TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-}
 | 
			
		||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V)
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || { msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'."; exit 207; }
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || {
 | 
			
		||||
  msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'."
 | 
			
		||||
  exit 207
 | 
			
		||||
}
 | 
			
		||||
TEMPLATE="${TEMPLATES[-1]}"
 | 
			
		||||
 | 
			
		||||
TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
			
		||||
# Check if template exists, if corrupt remove and redownload
 | 
			
		||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
 | 
			
		||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE" || ! zstdcat "$TEMPLATE_PATH" | tar -tf - >/dev/null 2>&1; then
 | 
			
		||||
  msg_warn "Template $TEMPLATE not found in storage or seems to be corrupted. Redownloading."
 | 
			
		||||
  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
  msg_info "Downloading LXC Template"
 | 
			
		||||
  pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
 | 
			
		||||
    { msg_error "A problem occurred while downloading the LXC template."; exit 208; }
 | 
			
		||||
  msg_ok "Downloaded LXC Template"
 | 
			
		||||
 | 
			
		||||
  # Download with 3 attempts
 | 
			
		||||
  for attempt in {1..3}; do
 | 
			
		||||
    msg_info "Attempt $attempt: Downloading LXC template..."
 | 
			
		||||
 | 
			
		||||
    if timeout 120 pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null; then
 | 
			
		||||
      msg_ok "Template download successful."
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [ $attempt -eq 3 ]; then
 | 
			
		||||
      msg_error "Three failed attempts. Aborting."
 | 
			
		||||
      exit 208
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    sleep $((attempt * 5))
 | 
			
		||||
  done
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "LXC Template is ready to use."
 | 
			
		||||
 | 
			
		||||
# Check and fix subuid/subgid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >> /etc/subuid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >> /etc/subgid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >>/etc/subgid
 | 
			
		||||
 | 
			
		||||
# Combine all options
 | 
			
		||||
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
 | 
			
		||||
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}")
 | 
			
		||||
 | 
			
		||||
# Create container with template integrity check
 | 
			
		||||
msg_info "Creating LXC Container"
 | 
			
		||||
  if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
      [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
  msg_error "Container creation failed. Checking if template is corrupted."
 | 
			
		||||
 | 
			
		||||
    msg_ok "Template integrity check completed"
 | 
			
		||||
    pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||    
 | 
			
		||||
      { msg_error "A problem occurred while re-downloading the LXC template."; exit 208; }
 | 
			
		||||
  if ! zstdcat "$TEMPLATE_PATH" | tar -tf - >/dev/null 2>&1; then
 | 
			
		||||
    msg_error "Template appears to be corrupted. Removing and re-downloading."
 | 
			
		||||
    rm -f "$TEMPLATE_PATH"
 | 
			
		||||
 | 
			
		||||
    if ! timeout 120 pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null; then
 | 
			
		||||
      msg_error "Failed to re-download template."
 | 
			
		||||
      exit 208
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    msg_ok "Re-downloaded LXC Template"
 | 
			
		||||
 | 
			
		||||
    if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
        msg_error "A problem occurred while trying to create container after re-downloading template."
 | 
			
		||||
      msg_error "Container creation failed after re-downloading template."
 | 
			
		||||
      exit 200
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    msg_error "Container creation failed, but template is not corrupted."
 | 
			
		||||
    exit 209
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "LXC Container ${BL}$CTID${CL} ${GN}was successfully created."
 | 
			
		||||
 
 | 
			
		||||
@@ -36,12 +36,12 @@ function update_script() {
 | 
			
		||||
    if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
 | 
			
		||||
      if ! command -v npm >/dev/null 2>&1; then
 | 
			
		||||
        echo "Installing NPM..."
 | 
			
		||||
        apt-get install -y npm >/dev/null 2>&1
 | 
			
		||||
        $STD apt-get install -y npm
 | 
			
		||||
        echo "Installed NPM..."
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    /opt/cronicle/bin/control.sh upgrade &>/dev/null
 | 
			
		||||
    $STD /opt/cronicle/bin/control.sh upgrade
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
@@ -49,7 +49,7 @@ function update_script() {
 | 
			
		||||
    if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
 | 
			
		||||
      if ! command -v npm >/dev/null 2>&1; then
 | 
			
		||||
        echo "Installing NPM..."
 | 
			
		||||
        apt-get install -y npm >/dev/null 2>&1
 | 
			
		||||
        $STD apt-get install -y npm
 | 
			
		||||
        echo "Installed NPM..."
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
@@ -57,12 +57,12 @@ function update_script() {
 | 
			
		||||
    IP=$(hostname -I | awk '{print $1}')
 | 
			
		||||
    msg_info "Installing Dependencies"
 | 
			
		||||
 | 
			
		||||
    apt-get install -y git &>/dev/null
 | 
			
		||||
    apt-get install -y make &>/dev/null
 | 
			
		||||
    apt-get install -y g++ &>/dev/null
 | 
			
		||||
    apt-get install -y gcc &>/dev/null
 | 
			
		||||
    apt-get install -y ca-certificates &>/dev/null
 | 
			
		||||
    apt-get install -y gnupg &>/dev/null
 | 
			
		||||
    $STD apt-get install -y git
 | 
			
		||||
    $STD apt-get install -y make
 | 
			
		||||
    $STD apt-get install -y g++
 | 
			
		||||
    $STD apt-get install -y gcc
 | 
			
		||||
    $STD apt-get install -y ca-certificates
 | 
			
		||||
    $STD apt-get install -y gnupg
 | 
			
		||||
    msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
    msg_info "Setting up Node.js Repository"
 | 
			
		||||
@@ -72,21 +72,21 @@ function update_script() {
 | 
			
		||||
    msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
    msg_info "Installing Node.js"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get install -y nodejs &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get install -y nodejs
 | 
			
		||||
    msg_ok "Installed Node.js"
 | 
			
		||||
 | 
			
		||||
    msg_info "Installing Cronicle Worker"
 | 
			
		||||
    mkdir -p /opt/cronicle
 | 
			
		||||
    cd /opt/cronicle
 | 
			
		||||
    tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1 &>/dev/null
 | 
			
		||||
    npm install &>/dev/null
 | 
			
		||||
    node bin/build.js dist &>/dev/null
 | 
			
		||||
    $STD tar zxvf <(curl -fsSL https://github.com/jhuckaby/Cronicle/archive/${LATEST}.tar.gz) --strip-components 1
 | 
			
		||||
    $STD npm install
 | 
			
		||||
    $STD node bin/build.js dist
 | 
			
		||||
    sed -i "s/localhost:3012/${IP}:3012/g" /opt/cronicle/conf/config.json
 | 
			
		||||
    /opt/cronicle/bin/control.sh start &>/dev/null
 | 
			
		||||
    cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled &>/dev/null
 | 
			
		||||
    $STD /opt/cronicle/bin/control.sh start
 | 
			
		||||
    $STD cp /opt/cronicle/bin/cronicled.init /etc/init.d/cronicled
 | 
			
		||||
    chmod 775 /etc/init.d/cronicled
 | 
			
		||||
    update-rc.d cronicled defaults &>/dev/null
 | 
			
		||||
    $STD update-rc.d cronicled defaults
 | 
			
		||||
    msg_ok "Installed Cronicle Worker"
 | 
			
		||||
    echo -e "\n Add Masters secret key to /opt/cronicle/conf/config.json \n"
 | 
			
		||||
    exit
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ function update_script() {
 | 
			
		||||
        latest_version=$(npm show cross-seed version)
 | 
			
		||||
        if [ "$current_version" != "$latest_version" ]; then
 | 
			
		||||
            msg_info "Updating ${APP} from version v${current_version} to v${latest_version}"
 | 
			
		||||
            npm install -g cross-seed@latest &> /dev/null
 | 
			
		||||
            $STD npm install -g cross-seed@latest
 | 
			
		||||
            systemctl restart cross-seed
 | 
			
		||||
            msg_ok "Updated Successfully"
 | 
			
		||||
        else
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating $APP LXC"
 | 
			
		||||
  apt-get update &>/dev/null
 | 
			
		||||
  apt-get -y upgrade &>/dev/null
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    pip3 install deluge[all] --upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated ${APP} LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										72
									
								
								ct/docmost.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								ct/docmost.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://docmost.com/
 | 
			
		||||
 | 
			
		||||
APP="Docmost"
 | 
			
		||||
var_tags="documents"
 | 
			
		||||
var_cpu="3"
 | 
			
		||||
var_ram="3072"
 | 
			
		||||
var_disk="7"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/docmost ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/docmost/docmost/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop docmost
 | 
			
		||||
    msg_ok "${APP} Stopped"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cp /opt/docmost/.env /opt/
 | 
			
		||||
    cp -r /opt/docmost/data /opt/
 | 
			
		||||
    rm -rf /opt/docmost
 | 
			
		||||
    temp_file=$(mktemp)
 | 
			
		||||
    wget -q "https://github.com/docmost/docmost/archive/refs/tags/v${RELEASE}.tar.gz" -O "$temp_file"
 | 
			
		||||
    tar -xzf "$temp_file"
 | 
			
		||||
    mv docmost-${RELEASE} /opt/docmost
 | 
			
		||||
    cd /opt/docmost
 | 
			
		||||
    mv /opt/.env /opt/docmost/.env
 | 
			
		||||
    mv /opt/data /opt/docmost/data
 | 
			
		||||
    $STD pnpm install --force
 | 
			
		||||
    $STD pnpm build
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start docmost
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -f ${temp_file}
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
			
		||||
							
								
								
									
										41
									
								
								ct/dolibarr.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								ct/dolibarr.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Slaviša Arežina (tremor021)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/Dolibarr/dolibarr/
 | 
			
		||||
 | 
			
		||||
APP="Dolibarr"
 | 
			
		||||
var_tags="erp;accounting"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="6"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /usr/share/dolibarr ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_error "To update ${APP}, use the applications web interface."
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}/dolibarr/install${CL}"
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,8 +33,8 @@ function update_script() {
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP}"
 | 
			
		||||
    wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_amd64.deb &>/dev/null
 | 
			
		||||
    dpkg -i emby-server-deb_${LATEST}_amd64.deb &>/dev/null
 | 
			
		||||
    $STD wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${LATEST}/emby-server-deb_${LATEST}_amd64.deb
 | 
			
		||||
    $STD dpkg -i emby-server-deb_${LATEST}_amd64.deb
 | 
			
		||||
    rm emby-server-deb_${LATEST}_amd64.deb
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,9 +33,9 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating ESPHome"
 | 
			
		||||
  if [[ -d /srv/esphome ]]; then
 | 
			
		||||
    source /srv/esphome/bin/activate &>/dev/null
 | 
			
		||||
    $STD source /srv/esphome/bin/activate
 | 
			
		||||
  fi
 | 
			
		||||
  pip3 install -U esphome &>/dev/null
 | 
			
		||||
  $STD pip3 install -U esphome
 | 
			
		||||
  msg_ok "Updated ESPHome"
 | 
			
		||||
 | 
			
		||||
  msg_info "Starting ESPHome"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating evcc LXC"
 | 
			
		||||
  apt update &>/dev/null
 | 
			
		||||
  apt --only-upgrade install -y evcc &>/dev/null
 | 
			
		||||
  $STD apt update
 | 
			
		||||
  $STD apt --only-upgrade install -y evcc
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ function update_script() {
 | 
			
		||||
        rm -rf /opt/excalidraw
 | 
			
		||||
        mv excalidraw-${RELEASE} /opt/excalidraw
 | 
			
		||||
        cd /opt/excalidraw
 | 
			
		||||
        yarn &> /dev/null
 | 
			
		||||
        $STD yarn
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -37,21 +37,19 @@ check_container_resources
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cp /opt/firefly/.env /opt/.env
 | 
			
		||||
    cp -r /opt/firefly/storage /opt/storage
 | 
			
		||||
    rm -rf /opt/firefly/*
 | 
			
		||||
    cd /opt
 | 
			
		||||
    wget -q "https://github.com/firefly-iii/firefly-iii/releases/download/v${RELEASE}/FireflyIII-v${RELEASE}.tar.gz"
 | 
			
		||||
    tar -xzf FireflyIII-v${RELEASE}.tar.gz -C /opt/firefly --exclude='storage'
 | 
			
		||||
    cp /opt/.env /opt/firefly/.env
 | 
			
		||||
    cp -r /opt/storage /opt/firefly/storage
 | 
			
		||||
    cd /opt/firefly 
 | 
			
		||||
    composer install --no-dev --no-interaction &>/dev/null
 | 
			
		||||
    php artisan migrate --seed --force &>/dev/null
 | 
			
		||||
    php artisan firefly:decrypt-all &>/dev/null
 | 
			
		||||
    php artisan cache:clear &>/dev/null
 | 
			
		||||
    php artisan view:clear &>/dev/null
 | 
			
		||||
    php artisan firefly:upgrade-database &>/dev/null
 | 
			
		||||
    php artisan firefly:laravel-passport-keys &>/dev/null
 | 
			
		||||
    chown -R www-data:www-data /opt/firefly
 | 
			
		||||
    chmod -R 775 /opt/firefly/storage
 | 
			
		||||
 | 
			
		||||
    $STD php artisan migrate --seed --force
 | 
			
		||||
    $STD php artisan cache:clear
 | 
			
		||||
    $STD php artisan view:clear
 | 
			
		||||
    $STD php artisan firefly-iii:upgrade-database
 | 
			
		||||
    $STD php artisan firefly-iii:laravel-passport-keys
 | 
			
		||||
    echo "${RELEASE}" >"/opt/${APP}_version.txt"
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ function update_script() {
 | 
			
		||||
        latest_version=$(npm show ghost-cli version)
 | 
			
		||||
        if [ "$current_version" != "$latest_version" ]; then
 | 
			
		||||
            msg_info "Updating ${APP} from version v${current_version} to v${latest_version}"
 | 
			
		||||
            npm install -g ghost-cli@latest &> /dev/null
 | 
			
		||||
            $STD npm install -g ghost-cli@latest
 | 
			
		||||
            msg_ok "Updated Successfully"
 | 
			
		||||
        else
 | 
			
		||||
            msg_ok "${APP} is already at v${current_version}"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
      exit
 | 
			
		||||
   fi
 | 
			
		||||
   msg_info "Updating ${APP}"
 | 
			
		||||
   apt-get update &>/dev/null
 | 
			
		||||
   apt-get -y upgrade &>/dev/null
 | 
			
		||||
   $STD apt-get update
 | 
			
		||||
   $STD apt-get -y upgrade
 | 
			
		||||
   msg_ok "Updated Successfully"
 | 
			
		||||
   exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,8 +34,8 @@ function update_script() {
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP"
 | 
			
		||||
    apt-get update &> /dev/null
 | 
			
		||||
    apt-get upgrade -y &> /dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get upgrade -y
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
 
 | 
			
		||||
@@ -51,15 +51,15 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    cd grist
 | 
			
		||||
    msg_info "Installing Dependencies"
 | 
			
		||||
    yarn install >/dev/null 2>&1
 | 
			
		||||
    $STD yarn install
 | 
			
		||||
    msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
    msg_info "Building"
 | 
			
		||||
    yarn run build:prod >/dev/null 2>&1
 | 
			
		||||
    $STD yarn run build:prod
 | 
			
		||||
    msg_ok "Done building"
 | 
			
		||||
 | 
			
		||||
    msg_info "Installing Python"
 | 
			
		||||
    yarn run install:python >/dev/null 2>&1
 | 
			
		||||
    $STD yarn run install:python
 | 
			
		||||
    msg_ok "Installed Python"
 | 
			
		||||
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/authelia
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/authelia
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ___         __  __         ___      
 | 
			
		||||
   /   | __  __/ /_/ /_  ___  / (_)___ _
 | 
			
		||||
  / /| |/ / / / __/ __ \/ _ \/ / / __ `/
 | 
			
		||||
 / ___ / /_/ / /_/ / / /  __/ / / /_/ / 
 | 
			
		||||
/_/  |_\__,_/\__/_/ /_/\___/_/_/\__,_/  
 | 
			
		||||
                                        
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/boltdiy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/boltdiy
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    __          ____      ___      
 | 
			
		||||
   / /_  ____  / / /_____/ (_)_  __
 | 
			
		||||
  / __ \/ __ \/ / __/ __  / / / / /
 | 
			
		||||
 / /_/ / /_/ / / /_/ /_/ / / /_/ / 
 | 
			
		||||
/_.___/\____/_/\__/\__,_/_/\__, /  
 | 
			
		||||
                          /____/   
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/docmost
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/docmost
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____                                  __ 
 | 
			
		||||
   / __ \____  _________ ___  ____  _____/ /_
 | 
			
		||||
  / / / / __ \/ ___/ __ `__ \/ __ \/ ___/ __/
 | 
			
		||||
 / /_/ / /_/ / /__/ / / / / / /_/ (__  ) /_  
 | 
			
		||||
/_____/\____/\___/_/ /_/ /_/\____/____/\__/  
 | 
			
		||||
                                             
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/dolibarr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/dolibarr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____        ___ __                   
 | 
			
		||||
   / __ \____  / (_) /_  ____ ___________
 | 
			
		||||
  / / / / __ \/ / / __ \/ __ `/ ___/ ___/
 | 
			
		||||
 / /_/ / /_/ / / / /_/ / /_/ / /  / /    
 | 
			
		||||
/_____/\____/_/_/_.___/\__,_/_/  /_/     
 | 
			
		||||
                                         
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/hev-socks5-server
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/hev-socks5-server
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    __                                    __        ______                                    
 | 
			
		||||
   / /_  ___ _   __      _________  _____/ /_______/ ____/     ________  ______   _____  _____
 | 
			
		||||
  / __ \/ _ \ | / /_____/ ___/ __ \/ ___/ //_/ ___/___ \______/ ___/ _ \/ ___/ | / / _ \/ ___/
 | 
			
		||||
 / / / /  __/ |/ /_____(__  ) /_/ / /__/ ,< (__  )___/ /_____(__  )  __/ /   | |/ /  __/ /    
 | 
			
		||||
/_/ /_/\___/|___/     /____/\____/\___/_/|_/____/_____/     /____/\___/_/    |___/\___/_/     
 | 
			
		||||
                                                                                              
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/jupyternotebook
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/jupyternotebook
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
       __                  __               _   __      __       __                __  
 | 
			
		||||
      / /_  ______  __  __/ /____  _____   / | / /___  / /____  / /_  ____  ____  / /__
 | 
			
		||||
 __  / / / / / __ \/ / / / __/ _ \/ ___/  /  |/ / __ \/ __/ _ \/ __ \/ __ \/ __ \/ //_/
 | 
			
		||||
/ /_/ / /_/ / /_/ / /_/ / /_/  __/ /     / /|  / /_/ / /_/  __/ /_/ / /_/ / /_/ / ,<   
 | 
			
		||||
\____/\__,_/ .___/\__, /\__/\___/_/     /_/ |_/\____/\__/\___/_.___/\____/\____/_/|_|  
 | 
			
		||||
          /_/    /____/                                                                
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/victoriametrics
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/victoriametrics
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
 _    ___      __             _       __  ___     __       _          
 | 
			
		||||
| |  / (_)____/ /_____  _____(_)___ _/  |/  /__  / /______(_)_________
 | 
			
		||||
| | / / / ___/ __/ __ \/ ___/ / __ `/ /|_/ / _ \/ __/ ___/ / ___/ ___/
 | 
			
		||||
| |/ / / /__/ /_/ /_/ / /  / / /_/ / /  / /  __/ /_/ /  / / /__(__  ) 
 | 
			
		||||
|___/_/\___/\__/\____/_/  /_/\__,_/_/  /_/\___/\__/_/  /_/\___/____/  
 | 
			
		||||
                                                                      
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/wger
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/wger
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
                          
 | 
			
		||||
 _      ______ ____  _____
 | 
			
		||||
| | /| / / __ `/ _ \/ ___/
 | 
			
		||||
| |/ |/ / /_/ /  __/ /    
 | 
			
		||||
|__/|__/\__, /\___/_/     
 | 
			
		||||
       /____/             
 | 
			
		||||
@@ -44,8 +44,8 @@ function update_script() {
 | 
			
		||||
    VER=$(curl -s https://api.github.com/repos/linuxserver/Heimdall/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    cp -R Heimdall-${VER}/* /opt/Heimdall
 | 
			
		||||
    cd /opt/Heimdall
 | 
			
		||||
    apt-get install -y composer &>/dev/null
 | 
			
		||||
    COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload &>/dev/null
 | 
			
		||||
    $STD apt-get install -y composer
 | 
			
		||||
    $STD COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated Heimdall Dashboard to ${RELEASE}"
 | 
			
		||||
    msg_info "Restoring Data"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								ct/hev-socks5-server.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								ct/hev-socks5-server.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: miviro
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/heiher/hev-socks5-server
 | 
			
		||||
 | 
			
		||||
APP="hev-socks5-server"
 | 
			
		||||
TAGS="proxy,socks5"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="512"
 | 
			
		||||
var_disk="2"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
 | 
			
		||||
    if [[ ! -f /opt/${APP} ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/heiher/${APP}/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop $APP
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        curl -L -o "${APP}" "https://github.com/heiher/${APP}/releases/download/${RELEASE}/hev-socks5-server-linux-x86_64"
 | 
			
		||||
        mv ${APP} /opt/${APP}
 | 
			
		||||
        chmod +x /opt/${APP}
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start $APP
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it with a SOCKS5 client using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}${IP}:1080${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} and the credentials stored at /root/hev.creds${CL}"
 | 
			
		||||
@@ -35,7 +35,7 @@ function update_script() {
 | 
			
		||||
    msg_ok "Stopped Services"
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    if [[ $(corepack -v) < "0.31.0" ]]; then
 | 
			
		||||
      npm install -g corepack@0.31.0 &>/dev/null
 | 
			
		||||
      $STD npm install -g corepack@0.31.0
 | 
			
		||||
    fi
 | 
			
		||||
    cd /opt
 | 
			
		||||
    if [[ -f /opt/hoarder/.env ]] && [[ ! -f /etc/hoarder/hoarder.env ]]; then
 | 
			
		||||
@@ -47,14 +47,14 @@ function update_script() {
 | 
			
		||||
    unzip -q v${RELEASE}.zip
 | 
			
		||||
    mv hoarder-${RELEASE} /opt/hoarder
 | 
			
		||||
    cd /opt/hoarder/apps/web
 | 
			
		||||
    pnpm install --frozen-lockfile &>/dev/null
 | 
			
		||||
    pnpm exec next build --experimental-build-mode compile &>/dev/null
 | 
			
		||||
    $STD pnpm install --frozen-lockfile
 | 
			
		||||
    $STD pnpm exec next build --experimental-build-mode compile
 | 
			
		||||
    cp -r /opt/hoarder/apps/web/.next/standalone/apps/web/server.js /opt/hoarder/apps/web
 | 
			
		||||
    cd /opt/hoarder/apps/workers
 | 
			
		||||
    pnpm install --frozen-lockfile &>/dev/null
 | 
			
		||||
    $STD pnpm install --frozen-lockfile
 | 
			
		||||
    export DATA_DIR=/opt/hoarder_data
 | 
			
		||||
    cd /opt/hoarder/packages/db
 | 
			
		||||
    pnpm migrate &>/dev/null
 | 
			
		||||
    $STD pnpm migrate
 | 
			
		||||
    sed -i "s/SERVER_VERSION=${PREV_RELEASE}/SERVER_VERSION=${RELEASE}/" /etc/hoarder/hoarder.env
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								ct/homarr.sh
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								ct/homarr.sh
									
									
									
									
									
								
							@@ -38,11 +38,14 @@ fi
 | 
			
		||||
if [[ ! -f /opt/run_homarr.sh ]]; then
 | 
			
		||||
        msg_info "Detected outdated and missing service files"
 | 
			
		||||
        msg_error "Warning - The port of homarr changed from 3000 to 7575"
 | 
			
		||||
        apt-get install -y nginx gettext openssl gpg &>/dev/null
 | 
			
		||||
        $STD apt-get install -y nginx gettext openssl gpg
 | 
			
		||||
        sed -i '/^NODE_ENV=/d' /opt/homarr/.env && echo "NODE_ENV='production'" >> /opt/homarr/.env
 | 
			
		||||
        sed -i '/^DB_DIALECT=/d' /opt/homarr/.env && echo "DB_DIALECT='sqlite'" >> /opt/homarr/.env
 | 
			
		||||
        cat <<'EOF' >/opt/run_homarr.sh
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
set -a
 | 
			
		||||
source /opt/homarr/.env
 | 
			
		||||
set +a
 | 
			
		||||
export DB_DIALECT='sqlite'
 | 
			
		||||
export AUTH_SECRET=$(openssl rand -base64 32)
 | 
			
		||||
node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT
 | 
			
		||||
@@ -85,6 +88,25 @@ fi
 | 
			
		||||
    msg_ok "Backup Data"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating and rebuilding ${APP} to v${RELEASE} (Patience)"
 | 
			
		||||
    rm /opt/run_homarr.sh
 | 
			
		||||
    cat <<'EOF' >/opt/run_homarr.sh
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
set -a
 | 
			
		||||
source /opt/homarr/.env
 | 
			
		||||
set +a
 | 
			
		||||
export DB_DIALECT='sqlite'
 | 
			
		||||
export AUTH_SECRET=$(openssl rand -base64 32)
 | 
			
		||||
node /opt/homarr_db/migrations/$DB_DIALECT/migrate.cjs /opt/homarr_db/migrations/$DB_DIALECT
 | 
			
		||||
export HOSTNAME=$(ip route get 1.1.1.1 | grep -oP 'src \K[^ ]+')
 | 
			
		||||
envsubst '${HOSTNAME}' < /etc/nginx/templates/nginx.conf > /etc/nginx/nginx.conf
 | 
			
		||||
nginx -g 'daemon off;' &
 | 
			
		||||
redis-server /opt/homarr/packages/redis/redis.conf &
 | 
			
		||||
node apps/tasks/tasks.cjs &
 | 
			
		||||
node apps/websocket/wssServer.cjs &
 | 
			
		||||
node apps/nextjs/server.js & PID=$!
 | 
			
		||||
wait $PID
 | 
			
		||||
EOF
 | 
			
		||||
    chmod +x /opt/run_homarr.sh
 | 
			
		||||
    wget -q "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip"
 | 
			
		||||
    unzip -q v${RELEASE}.zip
 | 
			
		||||
    rm -rf v${RELEASE}.zip
 | 
			
		||||
@@ -92,8 +114,8 @@ fi
 | 
			
		||||
    mv homarr-${RELEASE} /opt/homarr
 | 
			
		||||
    mv /opt/homarr-data-backup/.env /opt/homarr/.env
 | 
			
		||||
    cd /opt/homarr
 | 
			
		||||
    pnpm install &>/dev/null
 | 
			
		||||
    pnpm build &>/dev/null
 | 
			
		||||
    $STD pnpm install
 | 
			
		||||
    $STD pnpm build
 | 
			
		||||
    cp /opt/homarr/apps/nextjs/next.config.ts .
 | 
			
		||||
    cp /opt/homarr/apps/nextjs/package.json .
 | 
			
		||||
    cp -r /opt/homarr/packages/db/migrations /opt/homarr_db/migrations
 | 
			
		||||
 
 | 
			
		||||
@@ -59,7 +59,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating Home Assistant"
 | 
			
		||||
    source /srv/homeassistant/bin/activate
 | 
			
		||||
    pip install ${BR}--upgrade homeassistant &>/dev/null
 | 
			
		||||
    $STD pip install ${BR}--upgrade homeassistant
 | 
			
		||||
    msg_ok "Updated Home Assistant"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting Home Assistant"
 | 
			
		||||
@@ -72,10 +72,10 @@ function update_script() {
 | 
			
		||||
  fi
 | 
			
		||||
  if [ "$UPD" == "2" ]; then
 | 
			
		||||
    msg_info "Installing Home Assistant Community Store (HACS)"
 | 
			
		||||
    apt update &>/dev/null
 | 
			
		||||
    apt install -y unzip &>/dev/null
 | 
			
		||||
    $STD apt update
 | 
			
		||||
    $STD apt install -y unzip
 | 
			
		||||
    cd .homeassistant
 | 
			
		||||
    bash <(curl -fsSL https://get.hacs.xyz) &>/dev/null
 | 
			
		||||
    $STD bash <(curl -fsSL https://get.hacs.xyz)
 | 
			
		||||
    msg_ok "Installed Home Assistant Community Store (HACS)"
 | 
			
		||||
    echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
 | 
			
		||||
    exit
 | 
			
		||||
@@ -85,17 +85,17 @@ function update_script() {
 | 
			
		||||
    read -r -p "Would you like to use No Authentication? <y/N> " prompt
 | 
			
		||||
    msg_info "Installing FileBrowser"
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g')
 | 
			
		||||
    curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/$RELEASE/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
 | 
			
		||||
    $STD curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/$RELEASE/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin
 | 
			
		||||
 | 
			
		||||
    if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
			
		||||
      filebrowser config init -a '0.0.0.0' &>/dev/null
 | 
			
		||||
      filebrowser config set -a '0.0.0.0' &>/dev/null
 | 
			
		||||
      filebrowser config set --auth.method=noauth &>/dev/null
 | 
			
		||||
      filebrowser users add ID 1 --perm.admin &>/dev/null
 | 
			
		||||
      $STD filebrowser config init -a '0.0.0.0'
 | 
			
		||||
      $STD filebrowser config set -a '0.0.0.0'
 | 
			
		||||
      $STD filebrowser config set --auth.method=noauth
 | 
			
		||||
      $STD filebrowser users add ID 1 --perm.admin
 | 
			
		||||
    else
 | 
			
		||||
      filebrowser config init -a '0.0.0.0' &>/dev/null
 | 
			
		||||
      filebrowser config set -a '0.0.0.0' &>/dev/null
 | 
			
		||||
      filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null
 | 
			
		||||
      $STD filebrowser config init -a '0.0.0.0'
 | 
			
		||||
      $STD filebrowser config set -a '0.0.0.0'
 | 
			
		||||
      $STD filebrowser users add admin helper-scripts.com --perm.admin
 | 
			
		||||
    fi
 | 
			
		||||
    msg_ok "Installed FileBrowser"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -61,10 +61,10 @@ function update_script() {
 | 
			
		||||
  fi
 | 
			
		||||
  if [ "$UPD" == "3" ]; then
 | 
			
		||||
    msg_info "Installing Home Assistant Community Store (HACS)"
 | 
			
		||||
    apt update &>/dev/null
 | 
			
		||||
    apt install unzip &>/dev/null
 | 
			
		||||
    $STD apt update
 | 
			
		||||
    $STD apt install unzip
 | 
			
		||||
    cd /var/lib/docker/volumes/hass_config/_data
 | 
			
		||||
    bash <(curl -fsSL https://get.hacs.xyz) &>/dev/null
 | 
			
		||||
    $STD bash <(curl -fsSL https://get.hacs.xyz)
 | 
			
		||||
    msg_ok "Installed Home Assistant Community Store (HACS)"
 | 
			
		||||
    echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
 | 
			
		||||
    exit
 | 
			
		||||
@@ -73,10 +73,10 @@ function update_script() {
 | 
			
		||||
    IP=$(hostname -I | awk '{print $1}')
 | 
			
		||||
    msg_info "Installing FileBrowser"
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g')
 | 
			
		||||
    curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
 | 
			
		||||
    filebrowser config init -a '0.0.0.0' &>/dev/null
 | 
			
		||||
    filebrowser config set -a '0.0.0.0' &>/dev/null
 | 
			
		||||
    filebrowser users add admin helper-scripts.com --perm.admin &>/dev/null
 | 
			
		||||
    $STD curl -fsSL https://github.com/filebrowser/filebrowser/releases/download/v2.23.0/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin
 | 
			
		||||
    $STD filebrowser config init -a '0.0.0.0'
 | 
			
		||||
    $STD filebrowser config set -a '0.0.0.0'
 | 
			
		||||
    $STD filebrowser users add admin helper-scripts.com --perm.admin
 | 
			
		||||
    msg_ok "Installed FileBrowser"
 | 
			
		||||
 | 
			
		||||
    msg_info "Creating Service"
 | 
			
		||||
@@ -91,7 +91,7 @@ ExecStart=/usr/local/bin/filebrowser -r /
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=default.target" >$service_path
 | 
			
		||||
 | 
			
		||||
    systemctl enable --now filebrowser.service &>/dev/null
 | 
			
		||||
    $STD systemctl enable --now filebrowser.service
 | 
			
		||||
    msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get install -y homebridge &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get install -y homebridge
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@ function update_script() {
 | 
			
		||||
  if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
 | 
			
		||||
    if ! command -v npm >/dev/null 2>&1; then
 | 
			
		||||
      echo "Installing NPM..."
 | 
			
		||||
      apt-get install -y npm >/dev/null 2>&1
 | 
			
		||||
      npm install -g pnpm >/dev/null 2>&1
 | 
			
		||||
      $STD apt-get install -y npm
 | 
			
		||||
      $STD npm install -g pnpm
 | 
			
		||||
      echo "Installed NPM..."
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
@@ -45,11 +45,11 @@ function update_script() {
 | 
			
		||||
    cp -r homepage-${RELEASE}/* /opt/homepage/
 | 
			
		||||
    rm -rf homepage-${RELEASE}
 | 
			
		||||
    cd /opt/homepage
 | 
			
		||||
    npx --yes update-browserslist-db@latest >/dev/null 2>&1
 | 
			
		||||
    pnpm install >/dev/null 2>&1
 | 
			
		||||
    $STD npx --yes update-browserslist-db@latest
 | 
			
		||||
    $STD pnpm install
 | 
			
		||||
    export NEXT_PUBLIC_VERSION="v$RELEASE"
 | 
			
		||||
    export NEXT_PUBLIC_REVISION="source"
 | 
			
		||||
    pnpm build >/dev/null 2>&1
 | 
			
		||||
    $STD pnpm build
 | 
			
		||||
    systemctl start homepage
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated Homepage to v${RELEASE}"
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ function update_script() {
 | 
			
		||||
    rm -rf /opt/homer/*
 | 
			
		||||
    cd /opt/homer
 | 
			
		||||
    wget -q https://github.com/bastienwirtz/homer/releases/latest/download/homer.zip
 | 
			
		||||
    unzip homer.zip &>/dev/null
 | 
			
		||||
    $STD unzip homer.zip
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Restoring assets directory"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating $APP LXC"
 | 
			
		||||
  apt-get update &>/dev/null
 | 
			
		||||
  apt-get -y upgrade &>/dev/null
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated $APP LXC"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
            exit
 | 
			
		||||
      fi
 | 
			
		||||
      msg_info "Updating ${APP} LXC"
 | 
			
		||||
      apt-get update &>/dev/null
 | 
			
		||||
      apt-get install -y hyperion &>/dev/null
 | 
			
		||||
      $STD apt-get update
 | 
			
		||||
      $STD apt-get install -y hyperion
 | 
			
		||||
      msg_ok "Updated Successfully"
 | 
			
		||||
      exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
  apt-get update &>/dev/null
 | 
			
		||||
  apt-get -y upgrade &>/dev/null
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
  msg_ok "Updated Successfully"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    wget -q https://github.com/inspircd/inspircd/releases/download/v${RELEASE}/inspircd_${RELEASE}.deb12u1_amd64.deb
 | 
			
		||||
    apt-get install "./inspircd_${RELEASE}.deb12u1_amd64.deb" -y &>/dev/nul
 | 
			
		||||
    $STD apt-get install "./inspircd_${RELEASE}.deb12u1_amd64.deb" -y
 | 
			
		||||
    echo "${RELEASE}" >"/opt/${APP}_version.txt"
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,9 +28,9 @@ function update_script() {
 | 
			
		||||
          exit
 | 
			
		||||
     fi
 | 
			
		||||
     msg_info "Updating ${APP} LXC"
 | 
			
		||||
     apt-get update &>/dev/null
 | 
			
		||||
     apt-get -y upgrade &>/dev/null
 | 
			
		||||
     apt-get -y --with-new-pkgs upgrade jellyfin jellyfin-server &>/dev/null
 | 
			
		||||
     $STD apt-get update
 | 
			
		||||
     $STD apt-get -y upgrade
 | 
			
		||||
     $STD apt-get -y --with-new-pkgs upgrade jellyfin jellyfin-server
 | 
			
		||||
     msg_ok "Updated ${APP} LXC"
 | 
			
		||||
     exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,8 +35,8 @@ function update_script() {
 | 
			
		||||
        msg_ok "Updating Node.js Repository"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating Packages"
 | 
			
		||||
        apt-get update &>/dev/null
 | 
			
		||||
        apt-get -y upgrade &>/dev/null
 | 
			
		||||
        $STD apt-get update
 | 
			
		||||
        $STD apt-get -y upgrade
 | 
			
		||||
        msg_ok "Updating Packages"
 | 
			
		||||
        
 | 
			
		||||
        msg_info "Cleaning up"
 | 
			
		||||
@@ -53,10 +53,10 @@ function update_script() {
 | 
			
		||||
    
 | 
			
		||||
    if [ -z "$pnpm_current" ]; then
 | 
			
		||||
        msg_error "pnpm not found. Installing version $pnpm_desired..."
 | 
			
		||||
        npm install -g pnpm@"$pnpm_desired" &>/dev/null
 | 
			
		||||
        $STD npm install -g pnpm@"$pnpm_desired"
 | 
			
		||||
    elif ! node -e "const semver = require('semver'); process.exit(semver.satisfies('$pnpm_current', '$pnpm_desired') ? 0 : 1)" ; then
 | 
			
		||||
        msg_error "Updating pnpm from version $pnpm_current to $pnpm_desired..."
 | 
			
		||||
        npm install -g pnpm@"$pnpm_desired" &>/dev/null
 | 
			
		||||
        $STD npm install -g pnpm@"$pnpm_desired"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "pnpm is already installed and satisfies version $pnpm_desired."
 | 
			
		||||
    fi
 | 
			
		||||
@@ -70,9 +70,9 @@ function update_script() {
 | 
			
		||||
    systemctl stop jellyseerr
 | 
			
		||||
    rm -rf dist .next node_modules
 | 
			
		||||
    export CYPRESS_INSTALL_BINARY=0
 | 
			
		||||
    pnpm install --frozen-lockfile &>/dev/null
 | 
			
		||||
    $STD pnpm install --frozen-lockfile
 | 
			
		||||
    export NODE_OPTIONS="--max-old-space-size=3072"
 | 
			
		||||
    pnpm build &>/dev/null
 | 
			
		||||
    $STD pnpm build
 | 
			
		||||
 | 
			
		||||
    cat <<EOF >/etc/systemd/system/jellyseerr.service
 | 
			
		||||
[Unit]
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								ct/jupyternotebook.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								ct/jupyternotebook.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Dave-code-creater (Tan Dat, Ta)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://jupyter.org/
 | 
			
		||||
 | 
			
		||||
APP="Jupyter Notebook"
 | 
			
		||||
var_tags="ai;dev-tools"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="ubuntu"
 | 
			
		||||
var_version="24.04"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get install -y upgrade
 | 
			
		||||
    $STD pip3 install jupyter --upgrade
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8888${CL}"
 | 
			
		||||
@@ -30,7 +30,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    systemctl stop kavita
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/Kareadita/Kavita/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
    tar -xvzf <(curl -fsSL https://github.com/Kareadita/Kavita/releases/download/$RELEASE/kavita-linux-x64.tar.gz) --no-same-owner &>/dev/null
 | 
			
		||||
    $STD tar -xvzf <(curl -fsSL https://github.com/Kareadita/Kavita/releases/download/$RELEASE/kavita-linux-x64.tar.gz) --no-same-owner
 | 
			
		||||
    rm -rf Kavita/config
 | 
			
		||||
    cp -r Kavita/* /opt/Kavita
 | 
			
		||||
    rm -rf Kavita
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@ function update_script() {
 | 
			
		||||
  msg_info "Updating ${APP} LXC"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating packages"
 | 
			
		||||
  apt-get update &>/dev/null
 | 
			
		||||
  apt-get -y upgrade &>/dev/null
 | 
			
		||||
  $STD apt-get update
 | 
			
		||||
  $STD apt-get -y upgrade
 | 
			
		||||
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/keycloak/keycloak/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
  msg_info "Updating Keycloak to v$RELEASE"
 | 
			
		||||
 
 | 
			
		||||
@@ -41,8 +41,8 @@ function update_script() {
 | 
			
		||||
    mv kimai-${RELEASE} /opt/kimai
 | 
			
		||||
    mv /opt/.env /opt/kimai/.env
 | 
			
		||||
    cd /opt/kimai
 | 
			
		||||
    composer install --no-dev --optimize-autoloader &>/dev/null
 | 
			
		||||
    bin/console kimai:update &>/dev/null
 | 
			
		||||
    $STD composer install --no-dev --optimize-autoloader
 | 
			
		||||
    $STD bin/console kimai:update
 | 
			
		||||
    chown -R :www-data .
 | 
			
		||||
    chmod -R g+r .
 | 
			
		||||
    chmod -R g+rw var/
 | 
			
		||||
 
 | 
			
		||||
@@ -43,12 +43,12 @@ function update_script() {
 | 
			
		||||
    cp -r /opt/koillection-backup/.env.local /opt/koillection
 | 
			
		||||
    cp -r /opt/koillection-backup/public/uploads/. /opt/koillection/public/uploads/
 | 
			
		||||
    export COMPOSER_ALLOW_SUPERUSER=1
 | 
			
		||||
    composer install --no-dev -o --no-interaction --classmap-authoritative &>/dev/null
 | 
			
		||||
    php bin/console doctrine:migrations:migrate --no-interaction &>/dev/null
 | 
			
		||||
    php bin/console app:translations:dump &>/dev/null
 | 
			
		||||
    $STD composer install --no-dev -o --no-interaction --classmap-authoritative
 | 
			
		||||
    $STD php bin/console doctrine:migrations:migrate --no-interaction
 | 
			
		||||
    $STD php bin/console app:translations:dump
 | 
			
		||||
    cd assets/
 | 
			
		||||
    yarn install &>/dev/null
 | 
			
		||||
    yarn build &>/dev/null
 | 
			
		||||
    $STD yarn install
 | 
			
		||||
    $STD yarn build
 | 
			
		||||
    chown -R www-data:www-data /opt/koillection/public/uploads
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ function update_script() {
 | 
			
		||||
        mv Kometa-${RELEASE} /opt/kometa
 | 
			
		||||
        cd /opt/kometa
 | 
			
		||||
        rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
        pip install -r requirements.txt --ignore-installed &> /dev/null
 | 
			
		||||
        $STD pip install -r requirements.txt --ignore-installed
 | 
			
		||||
        mkdir -p config/assets
 | 
			
		||||
        cp /opt/config.yml config/config.yml
 | 
			
		||||
        echo "${RELEASE}" >/opt/kometa_version.txt
 | 
			
		||||
@@ -73,5 +73,5 @@ 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 "${INFO}${YW} Access the LXC at following IP address:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}${IP}${CL}"
 | 
			
		||||
@@ -54,7 +54,7 @@ function update_script() {
 | 
			
		||||
        exit 1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    docker compose -p komodo -f "/opt/komodo/$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d &>/dev/null 
 | 
			
		||||
    $STD docker compose -p komodo -f "/opt/komodo/$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@ function update_script() {
 | 
			
		||||
  RELEASE=$(wget -q https://github.com/ipfs/kubo/releases/latest -O - | grep "title>Release" | cut -d " " -f 4)
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    wget -q "https://github.com/ipfs/kubo/releases/download/${RELEASE}/kubo_${RELEASE}_linux-amd64.tar.gz"
 | 
			
		||||
    tar -xzf "kubo_${RELEASE}_linux-amd64.tar.gz" -C /usr/local
 | 
			
		||||
    systemctl restart ipfs.service
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ function update_script() {
 | 
			
		||||
    msg_ok "LazyLibrarian Stopped"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    git -C /opt/LazyLibrarian pull origin master &>/dev/null
 | 
			
		||||
    $STD git -C /opt/LazyLibrarian pull origin master
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting LazyLibrarian"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,8 @@ function update_script() {
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Updating $APP LXC"
 | 
			
		||||
    apt-get update &>/dev/null
 | 
			
		||||
    apt-get -y upgrade &>/dev/null
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get -y upgrade
 | 
			
		||||
    msg_ok "Updated $APP LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user