mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 02:12:49 +00:00 
			
		
		
		
	Compare commits
	
		
			91 Commits
		
	
	
		
			2025-02-09
			...
			2025-02-11
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					ecc294953b | ||
| 
						 | 
					e9d8b30de0 | ||
| 
						 | 
					4a42012906 | ||
| 
						 | 
					37016259e1 | ||
| 
						 | 
					bf5fc97e1a | ||
| 
						 | 
					1c89ef3f12 | ||
| 
						 | 
					b2d022edff | ||
| 
						 | 
					a5a143111c | ||
| 
						 | 
					9338fdeebf | ||
| 
						 | 
					6a486d4d73 | ||
| 
						 | 
					e55db3cb75 | ||
| 
						 | 
					b39078af7e | ||
| 
						 | 
					8e8e631d22 | ||
| 
						 | 
					a34da2459d | ||
| 
						 | 
					81a64c2cff | ||
| 
						 | 
					414a6617f8 | ||
| 
						 | 
					4af819f449 | ||
| 
						 | 
					229016ca10 | ||
| 
						 | 
					51f3f97967 | ||
| 
						 | 
					c548c3bd88 | ||
| 
						 | 
					0877e6a2f2 | ||
| 
						 | 
					133aa1a1f2 | ||
| 
						 | 
					c32e71cae3 | ||
| 
						 | 
					a71bdb6f06 | ||
| 
						 | 
					f6bc82e77a | ||
| 
						 | 
					5736b6aa5c | ||
| 
						 | 
					c30b080e44 | ||
| 
						 | 
					61567a66b0 | ||
| 
						 | 
					e23137eb63 | ||
| 
						 | 
					8acf81b937 | ||
| 
						 | 
					f1683ad39f | ||
| 
						 | 
					33ee969d91 | ||
| 
						 | 
					f03471133e | ||
| 
						 | 
					cdbabcac89 | ||
| 
						 | 
					0122e70b1d | ||
| 
						 | 
					a4037c151e | ||
| 
						 | 
					5d58d6d14f | ||
| 
						 | 
					8a1446ac4e | ||
| 
						 | 
					1ce3929d66 | ||
| 
						 | 
					dd62089b61 | ||
| 
						 | 
					8cda7e4dd8 | ||
| 
						 | 
					bc3abdfe91 | ||
| 
						 | 
					e793dfff3a | ||
| 
						 | 
					12ec0b46bc | ||
| 
						 | 
					55fa65e168 | ||
| 
						 | 
					6de6216bc6 | ||
| 
						 | 
					1bca424acf | ||
| 
						 | 
					a51e688388 | ||
| 
						 | 
					c40fc2b159 | ||
| 
						 | 
					d859646dac | ||
| 
						 | 
					a0e0f28c66 | ||
| 
						 | 
					8595675531 | ||
| 
						 | 
					70435b9e5a | ||
| 
						 | 
					1731f5274b | ||
| 
						 | 
					6a775f6026 | ||
| 
						 | 
					0b3e63bd3f | ||
| 
						 | 
					514ff1fbe7 | ||
| 
						 | 
					85bf9f319b | ||
| 
						 | 
					dff4e735f0 | ||
| 
						 | 
					b81b9c574b | ||
| 
						 | 
					f82eb87476 | ||
| 
						 | 
					d47bd677da | ||
| 
						 | 
					2c32b7fa94 | ||
| 
						 | 
					4d996c95e0 | ||
| 
						 | 
					90473b7b10 | ||
| 
						 | 
					e4f756ce73 | ||
| 
						 | 
					10159e934f | ||
| 
						 | 
					865e6fd3d7 | ||
| 
						 | 
					a1dd57ded6 | ||
| 
						 | 
					1c808b95a8 | ||
| 
						 | 
					0c024515f1 | ||
| 
						 | 
					4c7d82f4eb | ||
| 
						 | 
					e4ee00b403 | ||
| 
						 | 
					d380fdd0ea | ||
| 
						 | 
					9756ac639b | ||
| 
						 | 
					7105f67145 | ||
| 
						 | 
					35547c4316 | ||
| 
						 | 
					ccc71a7225 | ||
| 
						 | 
					c5101d3358 | ||
| 
						 | 
					5bbf197a8d | ||
| 
						 | 
					70b5c62c9f | ||
| 
						 | 
					33ef8aadbe | ||
| 
						 | 
					e989bbba29 | ||
| 
						 | 
					3f35900914 | ||
| 
						 | 
					e5f738b567 | ||
| 
						 | 
					6fc357ecd0 | ||
| 
						 | 
					758659a91e | ||
| 
						 | 
					b05858c6e9 | ||
| 
						 | 
					a481e89cad | ||
| 
						 | 
					b9094e306e | ||
| 
						 | 
					31c8617258 | 
@@ -30,8 +30,6 @@ body:
 | 
			
		||||
        required: true
 | 
			
		||||
      - label: "I have searched existing [discussions](https://github.com/community-scripts/ProxmoxVE/discussions?discussions_q=) and found no duplicate requests."
 | 
			
		||||
        required: true
 | 
			
		||||
      - label: "This is not a game-related request."
 | 
			
		||||
        required: true
 | 
			
		||||
- type: markdown
 | 
			
		||||
  attributes:
 | 
			
		||||
    value: "Thanks for submitting your request! The team will review it and reach out if we need more information."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								.github/autolabeler-config.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/autolabeler-config.json
									
									
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": "modified",
 | 
			
		||||
      "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"],
 | 
			
		||||
      "excludeGlobs": ["misc/build.func", "misc/install.func"]
 | 
			
		||||
      "excludeGlobs": ["misc/build.func", "misc/install.func", "misc/api.func"]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "delete script": [
 | 
			
		||||
@@ -51,13 +51,20 @@
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["*.md", ".github/**", "misc/*.func", "ct/create_lxc.sh"],
 | 
			
		||||
      "excludeGlobs": ["misc/api.func"]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
   "api": [
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["api/**", "misc/api.func"],
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "high risk": [
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["misc/build.func", "misc/install.func"],
 | 
			
		||||
      "includeGlobs": ["misc/build.func", "misc/install.func", "ct/create_lxc.sh"],
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								.github/changelog-pr-config.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								.github/changelog-pr-config.json
									
									
									
									
										vendored
									
									
								
							@@ -1,30 +1,34 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "title": "💥 Breaking Changes",
 | 
			
		||||
        "labels": ["breaking change"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "✨ New Scripts",
 | 
			
		||||
        "labels": ["new script"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🚀 Updated Scripts",
 | 
			
		||||
        "labels": ["update script"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🌐 Website",
 | 
			
		||||
        "labels": ["website"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🐞 Bug Fixes",
 | 
			
		||||
        "labels": ["bug fix"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🧰 Maintenance",
 | 
			
		||||
        "labels": ["maintenance"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "❔ Unlabelled",
 | 
			
		||||
        "labels": []
 | 
			
		||||
    }
 | 
			
		||||
  {
 | 
			
		||||
      "title": "💥 Breaking Changes",
 | 
			
		||||
      "labels": ["breaking change"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "✨ New Scripts",
 | 
			
		||||
      "labels": ["new script"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🚀 Updated Scripts",
 | 
			
		||||
      "labels": ["update script"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🌐 Website",
 | 
			
		||||
      "labels": ["website"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🐞 Bug Fixes",
 | 
			
		||||
      "labels": ["bug fix"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🧰 Maintenance",
 | 
			
		||||
      "labels": ["maintenance"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "📡 API",
 | 
			
		||||
      "labels": ["api"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "❔ Unlabelled",
 | 
			
		||||
      "labels": []
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							@@ -1,28 +1,25 @@
 | 
			
		||||
## ✍️ Description  
 | 
			
		||||
<!-- Provide a clear and concise description of your changes. -->  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 🔗 Related PR / Discussion / Issue  
 | 
			
		||||
Link: #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
- - -
 | 
			
		||||
- Related Issue: #
 | 
			
		||||
- Related PR: #
 | 
			
		||||
- Related Discussion: #
 | 
			
		||||
- - - 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## ✅ Prerequisites  
 | 
			
		||||
The following steps must be completed for the pull request to be considered:  
 | 
			
		||||
- [] Self-review performed (I have reviewed my code to ensure it follows established patterns and conventions.)  
 | 
			
		||||
- [] Testing performed (I have thoroughly tested my changes and verified expected functionality.)
 | 
			
		||||
Before this PR can be reviewed, the following must be completed:  
 | 
			
		||||
- [] **Self-review performed** – Code follows established patterns and conventions.  
 | 
			
		||||
- [] **Testing performed** – Changes have been thoroughly tested and verified.  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 🛠️ Type of Change  
 | 
			
		||||
Please check the relevant options:  
 | 
			
		||||
- [] Bug fix (non-breaking change that resolves an issue)  
 | 
			
		||||
- [] New feature (non-breaking change that adds functionality)  
 | 
			
		||||
- [] Breaking change (fix or feature that would cause existing functionality to change unexpectedly)  
 | 
			
		||||
- [] New script (a fully functional and thoroughly tested script or set of scripts)  
 | 
			
		||||
Select all that apply:  
 | 
			
		||||
- [] 🐞 **Bug fix** – Resolves an issue without breaking functionality.  
 | 
			
		||||
- [] ✨ **New feature** – Adds new, non-breaking functionality.  
 | 
			
		||||
- [] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.  
 | 
			
		||||
- [] 🆕 **New script** – A fully functional and tested script or script set.  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
## 📋 Additional Information (optional)  
 | 
			
		||||
Provide any extra context or screenshots about the feature or fix here.  
 | 
			
		||||
 | 
			
		||||
<!-- Provide extra context, screenshots, or references if needed. -->  
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,13 @@ jobs:
 | 
			
		||||
      pull-requests: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Generate a token
 | 
			
		||||
        id: generate-token
 | 
			
		||||
        uses: actions/create-github-app-token@v1
 | 
			
		||||
        with:
 | 
			
		||||
          app-id: ${{ vars.APP_ID }}
 | 
			
		||||
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
      # Step 1: Checkout repository
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v2
 | 
			
		||||
@@ -71,7 +78,7 @@ jobs:
 | 
			
		||||
                       --base main \
 | 
			
		||||
                       --label "automated pr"
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
      
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										48
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							@@ -30,15 +30,15 @@ jobs:
 | 
			
		||||
 | 
			
		||||
      - name: Get latest dates in changelog
 | 
			
		||||
        run: |
 | 
			
		||||
          # Extract the latest and second latest dates from changelog
 | 
			
		||||
          DATES=$(grep '^## [0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}' CHANGELOG.md | head -n 2 | awk '{print $2}')
 | 
			
		||||
          # Extrahiere die neuesten zwei Daten aus dem Changelog
 | 
			
		||||
          DATES=$(grep -E '^## [0-9]{4}-[0-9]{2}-[0-9]{2}' CHANGELOG.md | head -n 2 | awk '{print $2}')
 | 
			
		||||
 | 
			
		||||
          LATEST_DATE=$(echo "$DATES" | sed -n '1p')
 | 
			
		||||
          SECOND_LATEST_DATE=$(echo "$DATES" | sed -n '2p')
 | 
			
		||||
          TODAY=$(date -u +%Y-%m-%d)
 | 
			
		||||
 | 
			
		||||
          echo "TODAY=$TODAY" >> $GITHUB_ENV
 | 
			
		||||
          if [ "$LATEST_DATE" == "$TODAY" ]; then
 | 
			
		||||
          if [[ "$LATEST_DATE" == "$TODAY" ]]; then
 | 
			
		||||
            echo "LATEST_DATE=$SECOND_LATEST_DATE" >> $GITHUB_ENV
 | 
			
		||||
          else
 | 
			
		||||
            echo "LATEST_DATE=$LATEST_DATE" >> $GITHUB_ENV
 | 
			
		||||
@@ -55,10 +55,10 @@ jobs:
 | 
			
		||||
            const configPath = path.resolve(process.env.CONFIG_PATH);
 | 
			
		||||
            const fileContent = await fs.readFile(configPath, 'utf-8');
 | 
			
		||||
            const changelogConfig = JSON.parse(fileContent);
 | 
			
		||||
            const categorizedPRs = changelogConfig.map((obj) => ({ ...obj, notes: [] }));
 | 
			
		||||
            const categorizedPRs = changelogConfig.map(obj => ({ ...obj, notes: [] }));
 | 
			
		||||
 | 
			
		||||
            const latestDateInChangelog = new Date(process.env.LATEST_DATE);
 | 
			
		||||
            latestDateInChangelog.setUTCHours(23,59,59,999);
 | 
			
		||||
            latestDateInChangelog.setUTCHours(23, 59, 59, 999);
 | 
			
		||||
 | 
			
		||||
            const { data: pulls } = await github.rest.pulls.list({
 | 
			
		||||
              owner: context.repo.owner,
 | 
			
		||||
@@ -70,18 +70,16 @@ jobs:
 | 
			
		||||
              per_page: 100,
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            pulls.filter((pr) => 
 | 
			
		||||
            pulls.filter(pr => 
 | 
			
		||||
              pr.merged_at && 
 | 
			
		||||
              new Date(pr.merged_at) > latestDateInChangelog && 
 | 
			
		||||
              !pr.labels.some((label) => ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()))
 | 
			
		||||
            ).forEach((pr) => {
 | 
			
		||||
              const prLabels = pr.labels.map((label) => label.name.toLowerCase());
 | 
			
		||||
              !pr.labels.some(label => ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()))
 | 
			
		||||
            ).forEach(pr => {
 | 
			
		||||
              const prLabels = pr.labels.map(label => label.name.toLowerCase());
 | 
			
		||||
              const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
 | 
			
		||||
              for (const { labels, notes } of categorizedPRs) {
 | 
			
		||||
                const prHasCategoryLabel = labels.some((label) => prLabels.includes(label));
 | 
			
		||||
                const isUnlabelledCategory = labels.length === 0;
 | 
			
		||||
                if (prHasCategoryLabel || isUnlabelledCategory) {
 | 
			
		||||
                if (labels.length === 0 || labels.some(label => prLabels.includes(label))) {
 | 
			
		||||
                  notes.push(prNote);
 | 
			
		||||
                  break;
 | 
			
		||||
                }
 | 
			
		||||
@@ -102,7 +100,7 @@ jobs:
 | 
			
		||||
            const changelogPath = path.resolve('CHANGELOG.md');
 | 
			
		||||
            const categorizedPRs = ${{ steps.get-categorized-prs.outputs.result }};
 | 
			
		||||
 | 
			
		||||
            let newReleaseNotes = `## ${today}\n\n### Changed\n\n`;
 | 
			
		||||
            let newReleaseNotes = `## ${today}\n\n### Changes\n\n`;
 | 
			
		||||
            for (const { title, notes } of categorizedPRs) {
 | 
			
		||||
              if (notes.length > 0) {
 | 
			
		||||
                newReleaseNotes += `### ${title}\n\n${notes.join("\n")}\n\n`;
 | 
			
		||||
@@ -112,21 +110,21 @@ jobs:
 | 
			
		||||
            const changelogContent = await fs.readFile(changelogPath, 'utf-8');
 | 
			
		||||
            const changelogIncludesTodaysReleaseNotes = changelogContent.includes(`\n## ${today}`);
 | 
			
		||||
 | 
			
		||||
            // Replace todays release notes or insert release notes above previous release notes
 | 
			
		||||
            const regex = changelogIncludesTodaysReleaseNotes ? 
 | 
			
		||||
              new RegExp(`## ${today}.*(?=## ${latestDateInChangelog})`, "gs") :
 | 
			
		||||
              new RegExp(`(?=## ${latestDateInChangelog})`, "gs");
 | 
			
		||||
            // Ersetze oder füge Release Notes ein
 | 
			
		||||
            const regex = changelogIncludesTodaysReleaseNotes 
 | 
			
		||||
              ? new RegExp(`## ${today}.*(?=## ${latestDateInChangelog})`, "gs") 
 | 
			
		||||
              : new RegExp(`(?=## ${latestDateInChangelog})`, "gs");
 | 
			
		||||
 | 
			
		||||
            const newChangelogContent = changelogContent.replace(regex, newReleaseNotes)
 | 
			
		||||
            const newChangelogContent = changelogContent.replace(regex, newReleaseNotes);
 | 
			
		||||
            await fs.writeFile(changelogPath, newChangelogContent);
 | 
			
		||||
 | 
			
		||||
      - name: Check if there are any changes
 | 
			
		||||
      - name: Check for changes
 | 
			
		||||
        id: verify-diff
 | 
			
		||||
        run: |
 | 
			
		||||
          git diff --quiet . || echo "changed=true" >> $GITHUB_OUTPUT
 | 
			
		||||
          git diff --quiet . || echo "changed=true" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
      - name: Commit and push changes to separate branch
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
      - name: Commit and push changes
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global user.name "github-actions[bot]"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
@@ -136,7 +134,7 @@ jobs:
 | 
			
		||||
          git push origin $BRANCH_NAME --force
 | 
			
		||||
 | 
			
		||||
      - name: Create pull request if not exists
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -150,7 +148,7 @@ jobs:
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -160,7 +158,7 @@ jobs:
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Re-approve pull request after update
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										139
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
			
		||||
name: Run Scripts on PVE Node
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    branches:
 | 
			
		||||
      - main
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'install/*.sh'
 | 
			
		||||
      - 'ct/*.sh'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  run-install-script:
 | 
			
		||||
    runs-on: pvenode
 | 
			
		||||
    steps:          
 | 
			
		||||
      - name: Checkout PR branch
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          ref: ${{ github.event.pull_request.head.ref }}
 | 
			
		||||
          fetch-depth: 0  
 | 
			
		||||
      - name: Add Git safe directory
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global --add safe.directory /__w/ProxmoxVE/ProxmoxVE
 | 
			
		||||
      
 | 
			
		||||
      - name: Set up GH_TOKEN
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "GH_TOKEN=${GH_TOKEN}" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files in PR
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        run: | 
 | 
			
		||||
          CHANGED_FILES=$(gh pr diff --name-only ${{ github.event.pull_request.number }})  
 | 
			
		||||
          CHANGED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')  
 | 
			
		||||
          echo "Changed files: $CHANGED_FILES"  
 | 
			
		||||
          echo "SCRIPT=$CHANGED_FILES" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
      - name: Get scripts
 | 
			
		||||
        id: check-install-script
 | 
			
		||||
        run: |
 | 
			
		||||
          ALL_FILES=()
 | 
			
		||||
          ADDED_FILES=()  
 | 
			
		||||
          for FILE in ${{ env.SCRIPT }}; do           
 | 
			
		||||
            if [[ $FILE =~ ^install/.*-install\.sh$ ]] || [[ $FILE =~ ^ct/.*\.sh$ ]]; then             
 | 
			
		||||
              STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
              if [[ ! " ${ADDED_FILES[@]} " =~ " $STRIPPED_NAME " ]]; then
 | 
			
		||||
                ALL_FILES+=("$FILE")
 | 
			
		||||
                ADDED_FILES+=("$STRIPPED_NAME")  # Mark this base file as added (without the path)
 | 
			
		||||
              fi
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          ALL_FILES=$(echo "${ALL_FILES[@]}" | xargs)
 | 
			
		||||
          echo "$ALL_FILES"
 | 
			
		||||
          echo "ALL_FILES=$ALL_FILES" >> $GITHUB_ENV
 | 
			
		||||
        
 | 
			
		||||
      - name: Run scripts
 | 
			
		||||
        id: run-install
 | 
			
		||||
        continue-on-error: true
 | 
			
		||||
        run: |
 | 
			
		||||
          set +e  
 | 
			
		||||
          #run for each files in /ct
 | 
			
		||||
          for FILE in ${{ env.ALL_FILES }}; do            
 | 
			
		||||
            echo "Running: $FILE"
 | 
			
		||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
            if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
 | 
			
		||||
              CT_SCRIPT="ct/$STRIPPED_NAME.sh"
 | 
			
		||||
              if [[ ! -f $CT_SCRIPT ]]; then
 | 
			
		||||
                echo "No CT script found for $STRIPPED_NAME"
 | 
			
		||||
                exit 1
 | 
			
		||||
              fi
 | 
			
		||||
                echo "Found CT script for $STRIPPED_NAME"
 | 
			
		||||
                chmod +x "$CT_SCRIPT"
 | 
			
		||||
                RUNNING_FILE=$CT_SCRIPT
 | 
			
		||||
            elif [[ $FILE =~ ^ct/.*\.sh$ ]]; then
 | 
			
		||||
              INSTALL_SCRIPT="install/$STRIPPED_NAME-install.sh"
 | 
			
		||||
              if [[ ! -f $INSTALL_SCRIPT ]]; then
 | 
			
		||||
                echo "No install script found for $STRIPPED_NAME"
 | 
			
		||||
                exit 1
 | 
			
		||||
              fi
 | 
			
		||||
                echo "Found install script for $STRIPPED_NAME"
 | 
			
		||||
                chmod +x "$INSTALL_SCRIPT"
 | 
			
		||||
                RUNNING_FILE=$FILE
 | 
			
		||||
            fi
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-build.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-install.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
            sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source .github/workflows/scripts/app-test/pr-build.func|g' "$RUNNING_FILE"
 | 
			
		||||
            chmod +x $RUNNING_FILE         
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-install.func
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-build.func
 | 
			
		||||
 | 
			
		||||
            ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
 | 
			
		||||
            echo "Finished running $FILE"
 | 
			
		||||
            if [ -n "$ERROR_MSG" ]; then
 | 
			
		||||
              echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
 | 
			
		||||
              echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          set -e  # Restore exit-on-error
 | 
			
		||||
      
 | 
			
		||||
      - name: Cleanup PVE Node
 | 
			
		||||
        run: |
 | 
			
		||||
          containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}' | awk '{print $1}')
 | 
			
		||||
        
 | 
			
		||||
          for container_id in $containers; do
 | 
			
		||||
            status=$(pct status $container_id | awk '{print $2}')
 | 
			
		||||
            if [[ $status == "running" ]]; then
 | 
			
		||||
                pct stop $container_id
 | 
			
		||||
                pct destroy $container_id
 | 
			
		||||
            fi            
 | 
			
		||||
          done
 | 
			
		||||
      
 | 
			
		||||
      - name: Post error comments
 | 
			
		||||
        run: |
 | 
			
		||||
          ERROR="false"
 | 
			
		||||
          SEARCH_LINE=".github/workflows/scripts/app-test/pr-build.func: line"
 | 
			
		||||
          for FILE in ${{ env.ALL_FILES }}; do
 | 
			
		||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
            if [[ ! -f result_$STRIPPED_NAME.log ]]; then
 | 
			
		||||
              continue
 | 
			
		||||
            fi
 | 
			
		||||
            ERROR_MSG=$(cat result_$STRIPPED_NAME.log)
 | 
			
		||||
      
 | 
			
		||||
            if [ -n "$ERROR_MSG" ]; then
 | 
			
		||||
              CLEANED_ERROR_MSG=$(echo "$ERROR_MSG" | sed "s|$SEARCH_LINE.*||")
 | 
			
		||||
              echo "Posting error message for $FILE"
 | 
			
		||||
              echo ${CLEANED_ERROR_MSG}
 | 
			
		||||
              gh pr comment ${{ github.event.pull_request.number }} \
 | 
			
		||||
                --body ":warning: The script _**$FILE**_ failed with the following message: <br> <div><strong>${CLEANED_ERROR_MSG}</strong></div>"
 | 
			
		||||
 | 
			
		||||
              ERROR="true"
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          echo "ERROR=$ERROR" >> $GITHUB_ENV
 | 
			
		||||
      - name: Fail if error
 | 
			
		||||
        if: ${{ env.ERROR }} == 'true'
 | 
			
		||||
        run: exit 1 
 | 
			
		||||
							
								
								
									
										88
									
								
								.github/workflows/scripts/app-test/pr-alpine-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								.github/workflows/scripts/app-test/pr-alpine-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    STD=""
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RETRY_NUM=10
 | 
			
		||||
RETRY_EVERY=3
 | 
			
		||||
i=$RETRY_NUM
 | 
			
		||||
 | 
			
		||||
setting_up_container() {
 | 
			
		||||
  while [ $i -gt 0 ]; do
 | 
			
		||||
    if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" != "" ]; then
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
    echo 1>&2 -en "No Network! "
 | 
			
		||||
    sleep $RETRY_EVERY
 | 
			
		||||
    i=$((i - 1))
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" = "" ]; then
 | 
			
		||||
    echo 1>&2 -e "\n No Network After $RETRY_NUM Tries"
 | 
			
		||||
    echo -e "Check Network Settings"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  msg_ok "Set up Container OS"
 | 
			
		||||
  msg_ok "Network Connected: $(hostname -i)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
network_check() {
 | 
			
		||||
  RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
 | 
			
		||||
  if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to $RESOLVEDIP"; fi
 | 
			
		||||
  set -e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
 msg_info "Updating Container OS"
 | 
			
		||||
  apk update
 | 
			
		||||
  apk upgrade
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
motd_ssh() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
   return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										259
									
								
								.github/workflows/scripts/app-test/pr-build.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								.github/workflows/scripts/app-test/pr-build.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,259 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
variables() {
 | 
			
		||||
  NSAPP=$(echo ${APP,,} | tr -d ' ') 
 | 
			
		||||
  var_install="${NSAPP}-install"     
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
timezone=$(cat /etc/timezone)
 | 
			
		||||
header_info(){ 
 | 
			
		||||
  return  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
base_settings() {
 | 
			
		||||
  
 | 
			
		||||
  CT_TYPE="1"
 | 
			
		||||
  DISK_SIZE="4"
 | 
			
		||||
  CORE_COUNT="1"
 | 
			
		||||
  RAM_SIZE="1024"
 | 
			
		||||
  VERBOSE="${1:-no}"
 | 
			
		||||
  PW=""
 | 
			
		||||
  CT_ID=$NEXTID
 | 
			
		||||
  HN="Testing"
 | 
			
		||||
  BRG="vmbr0"
 | 
			
		||||
  NET="dhcp"
 | 
			
		||||
  GATE=""
 | 
			
		||||
  APT_CACHER=""
 | 
			
		||||
  APT_CACHER_IP=""
 | 
			
		||||
  DISABLEIP6="no"
 | 
			
		||||
  MTU=""
 | 
			
		||||
  SD=""
 | 
			
		||||
  NS=""
 | 
			
		||||
  MAC=""
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  SSH="no"
 | 
			
		||||
  SSH_AUTHORIZED_KEY=""
 | 
			
		||||
  TAGS="community-script;"
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  CT_TYPE=${var_unprivileged:-$CT_TYPE}
 | 
			
		||||
  DISK_SIZE=${var_disk:-$DISK_SIZE}
 | 
			
		||||
  CORE_COUNT=${var_cpu:-$CORE_COUNT}
 | 
			
		||||
  RAM_SIZE=${var_ram:-$RAM_SIZE}
 | 
			
		||||
  VERB=${var_verbose:-$VERBOSE}
 | 
			
		||||
  TAGS="${TAGS}${var_tags:-}"
 | 
			
		||||
 | 
			
		||||
  if [ -z "$var_os" ]; then
 | 
			
		||||
    var_os="debian"
 | 
			
		||||
  fi
 | 
			
		||||
  if [ -z "$var_version" ]; then
 | 
			
		||||
    var_version="12"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  # Colors
 | 
			
		||||
  YW=$(echo "\033[33m")
 | 
			
		||||
  YWB=$(echo "\033[93m")
 | 
			
		||||
  BL=$(echo "\033[36m")
 | 
			
		||||
  RD=$(echo "\033[01;31m")
 | 
			
		||||
  BGN=$(echo "\033[4;92m")
 | 
			
		||||
  GN=$(echo "\033[1;92m")
 | 
			
		||||
  DGN=$(echo "\033[32m")
 | 
			
		||||
 | 
			
		||||
  # Formatting
 | 
			
		||||
  CL=$(echo "\033[m")
 | 
			
		||||
  UL=$(echo "\033[4m")
 | 
			
		||||
  BOLD=$(echo "\033[1m")
 | 
			
		||||
  BFR="\\r\\033[K"
 | 
			
		||||
  HOLD=" "
 | 
			
		||||
  TAB="  "
 | 
			
		||||
 | 
			
		||||
  # Icons
 | 
			
		||||
  CM="${TAB}✔️${TAB}${CL}"
 | 
			
		||||
  CROSS="${TAB}✖️${TAB}${CL}"
 | 
			
		||||
  INFO="${TAB}💡${TAB}${CL}"
 | 
			
		||||
  OS="${TAB}🖥️${TAB}${CL}"
 | 
			
		||||
  OSVERSION="${TAB}🌟${TAB}${CL}"
 | 
			
		||||
  CONTAINERTYPE="${TAB}📦${TAB}${CL}"
 | 
			
		||||
  DISKSIZE="${TAB}💾${TAB}${CL}"
 | 
			
		||||
  CPUCORE="${TAB}🧠${TAB}${CL}"
 | 
			
		||||
  RAMSIZE="${TAB}🛠️${TAB}${CL}"
 | 
			
		||||
  SEARCH="${TAB}🔍${TAB}${CL}"
 | 
			
		||||
  VERIFYPW="${TAB}🔐${TAB}${CL}"
 | 
			
		||||
  CONTAINERID="${TAB}🆔${TAB}${CL}"
 | 
			
		||||
  HOSTNAME="${TAB}🏠${TAB}${CL}"
 | 
			
		||||
  BRIDGE="${TAB}🌉${TAB}${CL}"
 | 
			
		||||
  NETWORK="${TAB}📡${TAB}${CL}"
 | 
			
		||||
  GATEWAY="${TAB}🌐${TAB}${CL}"
 | 
			
		||||
  DISABLEIPV6="${TAB}🚫${TAB}${CL}"
 | 
			
		||||
  DEFAULT="${TAB}⚙️${TAB}${CL}"
 | 
			
		||||
  MACADDRESS="${TAB}🔗${TAB}${CL}"
 | 
			
		||||
  VLANTAG="${TAB}🏷️${TAB}${CL}"
 | 
			
		||||
  ROOTSSH="${TAB}🔑${TAB}${CL}"
 | 
			
		||||
  CREATING="${TAB}🚀${TAB}${CL}"
 | 
			
		||||
  ADVANCED="${TAB}🧩${TAB}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function handles errors
 | 
			
		||||
error_handler() {  
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit "$error_message"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
start(){
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
build_container() {
 | 
			
		||||
 
 | 
			
		||||
  if [ "$CT_TYPE" == "1" ]; then
 | 
			
		||||
    FEATURES="keyctl=1,nesting=1"
 | 
			
		||||
  else
 | 
			
		||||
    FEATURES="nesting=1"
 | 
			
		||||
  fi
 | 
			
		||||
  TEMP_DIR=$(mktemp -d)
 | 
			
		||||
  pushd $TEMP_DIR >/dev/null
 | 
			
		||||
  if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-alpine-install.func)"
 | 
			
		||||
  else
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-install.func)"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  export CACHER="$APT_CACHER"
 | 
			
		||||
  export CACHER_IP="$APT_CACHER_IP"
 | 
			
		||||
  export tz=""
 | 
			
		||||
  export DISABLEIPV6="$DISABLEIP6"
 | 
			
		||||
  export APPLICATION="$APP"
 | 
			
		||||
  export app="$NSAPP"
 | 
			
		||||
  export PASSWORD="$PW"
 | 
			
		||||
  export VERBOSE="$VERB"
 | 
			
		||||
  export SSH_ROOT="${SSH}"
 | 
			
		||||
  export SSH_AUTHORIZED_KEY
 | 
			
		||||
  export CTID="$CT_ID"
 | 
			
		||||
  export CTTYPE="$CT_TYPE"
 | 
			
		||||
  export PCT_OSTYPE="$var_os"
 | 
			
		||||
  export PCT_OSVERSION="$var_version"
 | 
			
		||||
  export PCT_DISK_SIZE="$DISK_SIZE"
 | 
			
		||||
  export tz="$timezone"
 | 
			
		||||
  export PCT_OPTIONS="
 | 
			
		||||
    -features $FEATURES
 | 
			
		||||
    -hostname $HN
 | 
			
		||||
    -tags $TAGS
 | 
			
		||||
    $SD
 | 
			
		||||
    $NS
 | 
			
		||||
    -net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
 | 
			
		||||
    -onboot 1
 | 
			
		||||
    -cores $CORE_COUNT
 | 
			
		||||
    -memory $RAM_SIZE
 | 
			
		||||
    -unprivileged $CT_TYPE
 | 
			
		||||
    $PW
 | 
			
		||||
  "
 | 
			
		||||
  echo "Container ID: $CTID"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # This executes create_lxc.sh and creates the container and .conf file
 | 
			
		||||
  bash /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
 | 
			
		||||
  LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
 | 
			
		||||
  if [ "$CT_TYPE" == "0" ]; then
 | 
			
		||||
    cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# USB passthrough
 | 
			
		||||
lxc.cgroup2.devices.allow: a
 | 
			
		||||
lxc.cap.drop:
 | 
			
		||||
lxc.cgroup2.devices.allow: c 188:* rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 189:* rwm
 | 
			
		||||
lxc.mount.entry: /dev/serial/by-id  dev/serial/by-id  none bind,optional,create=dir
 | 
			
		||||
lxc.mount.entry: /dev/ttyUSB0       dev/ttyUSB0       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyUSB1       dev/ttyUSB1       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyACM0       dev/ttyACM0       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyACM1       dev/ttyACM1       none bind,optional,create=file
 | 
			
		||||
EOF
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$CT_TYPE" == "0" ]; then
 | 
			
		||||
    if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" ]]; then
 | 
			
		||||
      cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
lxc.cgroup2.devices.allow: c 226:0 rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 226:128 rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 29:0 rwm
 | 
			
		||||
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
 | 
			
		||||
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
 | 
			
		||||
EOF
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" ]]; then
 | 
			
		||||
      if [[ -e "/dev/dri/renderD128" ]]; then
 | 
			
		||||
        if [[ -e "/dev/dri/card0" ]]; then
 | 
			
		||||
          cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
dev0: /dev/dri/card0,gid=44
 | 
			
		||||
dev1: /dev/dri/renderD128,gid=104
 | 
			
		||||
EOF
 | 
			
		||||
        else
 | 
			
		||||
          cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
dev0: /dev/dri/card1,gid=44
 | 
			
		||||
dev1: /dev/dri/renderD128,gid=104
 | 
			
		||||
EOF
 | 
			
		||||
        fi
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # This starts the container and executes <app>-install.sh
 | 
			
		||||
  msg_info "Starting LXC Container"
 | 
			
		||||
  pct start "$CTID"
 | 
			
		||||
  msg_ok "Started LXC Container"
 | 
			
		||||
 | 
			
		||||
  if [[ ! -f "/root/actions-runner/_work/ProxmoxVE/ProxmoxVE/install/$var_install.sh" ]]; then
 | 
			
		||||
    msg_error "No install script found for $APP"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
    if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
    sleep 3
 | 
			
		||||
    pct exec "$CTID" -- /bin/sh -c 'cat <<EOF >/etc/apk/repositories
 | 
			
		||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
 | 
			
		||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
 | 
			
		||||
EOF'
 | 
			
		||||
    pct exec "$CTID" -- ash -c "apk add bash >/dev/null"
 | 
			
		||||
  fi
 | 
			
		||||
  lxc-attach -n "$CTID" -- bash -c "$(< /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/install/$var_install.sh)"
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
description(){
 | 
			
		||||
 return
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										158
									
								
								.github/workflows/scripts/app-test/pr-create-lxc.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								.github/workflows/scripts/app-test/pr-create-lxc.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
    local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  local error_message="Failure in line $line_number: exit code $exit_code: while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit 100
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
VALIDCT=$(pvesm status -content rootdir | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALIDCT" ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid Container Storage location."
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
VALIDTMP=$(pvesm status -content vztmpl | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALIDTMP" ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid Template Storage location."
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function select_storage() {
 | 
			
		||||
  local CLASS=$1
 | 
			
		||||
  local CONTENT
 | 
			
		||||
  local CONTENT_LABEL
 | 
			
		||||
  case $CLASS in
 | 
			
		||||
  container)
 | 
			
		||||
    CONTENT='rootdir'
 | 
			
		||||
    CONTENT_LABEL='Container'
 | 
			
		||||
    ;;
 | 
			
		||||
  template)
 | 
			
		||||
    CONTENT='vztmpl'
 | 
			
		||||
    CONTENT_LABEL='Container template'
 | 
			
		||||
    ;;
 | 
			
		||||
  *) false || { msg_error "Invalid storage class."; exit 201; };;
 | 
			
		||||
  esac
 | 
			
		||||
  
 | 
			
		||||
  local -a MENU
 | 
			
		||||
  while read -r line; do
 | 
			
		||||
    local TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
    local TYPE=$(echo $line | awk '{printf "%-10s", $2}')
 | 
			
		||||
    local FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}')
 | 
			
		||||
    local ITEM="Type: $TYPE Free: $FREE "
 | 
			
		||||
    local OFFSET=2
 | 
			
		||||
    if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
 | 
			
		||||
      local MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
 | 
			
		||||
    fi
 | 
			
		||||
    MENU+=("$TAG" "$ITEM" "OFF")
 | 
			
		||||
  done < <(pvesm status -content $CONTENT | awk 'NR>1')
 | 
			
		||||
  
 | 
			
		||||
  if [ $((${#MENU[@]}/3)) -eq 1 ]; then
 | 
			
		||||
    printf ${MENU[0]}
 | 
			
		||||
  else
 | 
			
		||||
   msg_error "STORAGE ISSUES!"
 | 
			
		||||
    exit 202  
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[[ "${CTID:-}" ]] || { msg_error "You need to set 'CTID' variable."; exit 203; }
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || { msg_error "You need to set 'PCT_OSTYPE' variable."; exit 204; }
 | 
			
		||||
 | 
			
		||||
[ "$CTID" -ge "100" ] || { msg_error "ID cannot be less than 100."; exit 205; }
 | 
			
		||||
 | 
			
		||||
if pct status $CTID &>/dev/null; then
 | 
			
		||||
  echo -e "ID '$CTID' is already in use."
 | 
			
		||||
  unset CTID
 | 
			
		||||
  msg_error "Cannot use ID that is already in use."
 | 
			
		||||
  exit 206
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEMPLATE_STORAGE=$(select_storage template) || exit
 | 
			
		||||
msg_ok "Using  $TEMPLATE_STORAGE   for Template Storage."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CONTAINER_STORAGE=$(select_storage container) || exit
 | 
			
		||||
msg_ok "Using  $CONTAINER_STORAGE   for Container Storage."
 | 
			
		||||
 | 
			
		||||
msg_info "Updating LXC Template List"
 | 
			
		||||
pveam update >/dev/null
 | 
			
		||||
msg_ok "Updated LXC Template List"
 | 
			
		||||
 | 
			
		||||
TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-}
 | 
			
		||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V)
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || { msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'."; exit 207; }
 | 
			
		||||
TEMPLATE="${TEMPLATES[-1]}"
 | 
			
		||||
 | 
			
		||||
TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
			
		||||
 | 
			
		||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
 | 
			
		||||
  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
  msg_info "Downloading LXC Template"
 | 
			
		||||
  pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
 | 
			
		||||
    { msg_error "A problem occurred while downloading the LXC template."; exit 208; }
 | 
			
		||||
  msg_ok "Downloaded LXC Template"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >> /etc/subuid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >> /etc/subgid
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
 | 
			
		||||
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}")
 | 
			
		||||
 | 
			
		||||
echo "${PCT_OPTIONS[@]}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info "Creating LXC Container"
 | 
			
		||||
  if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
      [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
      
 | 
			
		||||
    msg_ok "Template integrity check completed"
 | 
			
		||||
    pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||    
 | 
			
		||||
      { msg_error "A problem occurred while re-downloading the LXC template."; exit 208; }
 | 
			
		||||
    
 | 
			
		||||
    msg_ok "Re-downloaded LXC Template"
 | 
			
		||||
    if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
        msg_error "A problem occurred while trying to create container after re-downloading template."
 | 
			
		||||
      exit 200
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
msg_ok "LXC Container  $CTID   was successfully created."
 | 
			
		||||
							
								
								
									
										93
									
								
								.github/workflows/scripts/app-test/pr-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								.github/workflows/scripts/app-test/pr-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit "$error_message"
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    STD=""
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
  RETRY_NUM=10
 | 
			
		||||
  RETRY_EVERY=3
 | 
			
		||||
setting_up_container() {
 | 
			
		||||
  sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
 | 
			
		||||
  locale_line=$(grep -v '^#' /etc/locale.gen | grep -E '^[a-zA-Z]' | awk '{print $1}' | head -n 1)
 | 
			
		||||
  echo "LANG=${locale_line}" >/etc/default/locale
 | 
			
		||||
  locale-gen >/dev/null
 | 
			
		||||
  export LANG=${locale_line}
 | 
			
		||||
  echo $tz >/etc/timezone
 | 
			
		||||
  ln -sf /usr/share/zoneinfo/$tz /etc/localtime
 | 
			
		||||
  
 | 
			
		||||
  for ((i = RETRY_NUM; i > 0; i--)); do
 | 
			
		||||
    if [ "$(hostname -I)" != "" ]; then
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
    echo 1>&2 -en "No Network! "
 | 
			
		||||
    sleep $RETRY_EVERY
 | 
			
		||||
  done
 | 
			
		||||
  if [ "$(hostname -I)" = "" ]; then
 | 
			
		||||
    echo 1>&2 -e "\nNo Network After $RETRY_NUM Tries"
 | 
			
		||||
    echo -e "Check Network Settings"
 | 
			
		||||
    exit 101
 | 
			
		||||
  fi
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  systemctl disable -q --now systemd-networkd-wait-online.service
 | 
			
		||||
  msg_ok "Set up Container OS"
 | 
			
		||||
  msg_ok "Network Connected: $(hostname -I)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
network_check() {
 | 
			
		||||
  RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
 | 
			
		||||
  if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to $RESOLVEDIP"; fi
 | 
			
		||||
  set -e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
  msg_info "Updating Container OS"
 | 
			
		||||
  apt-get update
 | 
			
		||||
  apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
motd_ssh() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
   return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								.github/workflows/scripts/update-json.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/scripts/update-json.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
FILE=$1
 | 
			
		||||
TODAY=$(date -u +"%Y-%m-%d")
 | 
			
		||||
 | 
			
		||||
if [[ -z "$FILE" ]]; then
 | 
			
		||||
    echo "No file specified. Exiting."
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ! -f "$FILE" ]]; then
 | 
			
		||||
    echo "File $FILE not found. Exiting."
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
DATE_IN_JSON=$(jq -r '.date_created' "$FILE" 2>/dev/null || echo "")
 | 
			
		||||
 | 
			
		||||
if [[ "$DATE_IN_JSON" != "$TODAY" ]]; then
 | 
			
		||||
    jq --arg date "$TODAY" '.date_created = $date' "$FILE" > tmp.json && mv tmp.json "$FILE"
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										112
									
								
								.github/workflows/update_json_date.yml.bak
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										112
									
								
								.github/workflows/update_json_date.yml.bak
									
									
									
									
										vendored
									
									
								
							@@ -1,48 +1,88 @@
 | 
			
		||||
name: Update JSON Date
 | 
			
		||||
name: Auto Update JSON-Date
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    types: [opened, synchronize, reopened]
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      - main
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  list-files:
 | 
			
		||||
  update-json-dates:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
      pull-requests: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout PR Branch
 | 
			
		||||
      uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        ref: ${{ github.event.pull_request.head.ref }}
 | 
			
		||||
      - name: Generate a token
 | 
			
		||||
        id: generate-token
 | 
			
		||||
        uses: actions/create-github-app-token@v1
 | 
			
		||||
        with:
 | 
			
		||||
          app-id: ${{ vars.APP_ID }}
 | 
			
		||||
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
    - name: Fetch PR changes
 | 
			
		||||
      run: |
 | 
			
		||||
          git remote add fork https://github.com/${{ github.event.pull_request.head.repo.full_name }}.git
 | 
			
		||||
          git fetch fork ${{ github.event.pull_request.head.ref }}:pullreq
 | 
			
		||||
          git checkout pullreq
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0  # Full history for proper detection
 | 
			
		||||
 | 
			
		||||
    - name: Update JSON
 | 
			
		||||
      id: changed-files
 | 
			
		||||
      run: |
 | 
			
		||||
          FILES=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --jq '.[].filename' | tr '\n' ' ')
 | 
			
		||||
          echo "changed_files=${FILES}"
 | 
			
		||||
          for FILE in $FILES; do
 | 
			
		||||
            if [[ "$FILE" =~ /(.*)\.json ]]; then
 | 
			
		||||
              NAME="${BASH_REMATCH[1]}"
 | 
			
		||||
            else
 | 
			
		||||
              echo "no new JSON in ${FILES}"
 | 
			
		||||
              continue
 | 
			
		||||
            fi
 | 
			
		||||
      - name: Set up Git
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global user.name "GitHub Actions"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
 | 
			
		||||
            JSON_FILE="json/${NAME}.json"
 | 
			
		||||
            if [[ -f "$JSON_FILE" ]]; then
 | 
			
		||||
              echo "Updating date_created in $JSON_FILE"
 | 
			
		||||
              jq --arg date "$(date +%Y-%m-%d)" '.date_created = $date' "$JSON_FILE" > tmp.json && mv tmp.json "$JSON_FILE"
 | 
			
		||||
            else
 | 
			
		||||
              echo "JSON file $FILES not found"
 | 
			
		||||
      - name: Find JSON files with incorrect date_created
 | 
			
		||||
        id: find_wrong_json
 | 
			
		||||
        run: |
 | 
			
		||||
          TODAY=$(date -u +"%Y-%m-%d")
 | 
			
		||||
          > incorrect_json_files.txt
 | 
			
		||||
 | 
			
		||||
          for FILE in json/*.json; do
 | 
			
		||||
            if [[ -f "$FILE" ]]; then
 | 
			
		||||
              DATE_IN_JSON=$(jq -r '.date_created' "$FILE" 2>/dev/null || echo "")
 | 
			
		||||
 | 
			
		||||
              if [[ "$DATE_IN_JSON" != "$TODAY" ]]; then
 | 
			
		||||
                echo "$FILE" >> incorrect_json_files.txt
 | 
			
		||||
              fi
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
 | 
			
		||||
          git config --global user.name "github-actions[bot]"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
          git diff --exit-code || git commit -am "Updating Dates in affected JSON files."
 | 
			
		||||
          git push 
 | 
			
		||||
      env:
 | 
			
		||||
          if [[ -s incorrect_json_files.txt ]]; then
 | 
			
		||||
            echo "CHANGED=true" >> $GITHUB_ENV
 | 
			
		||||
          else
 | 
			
		||||
            echo "CHANGED=false" >> $GITHUB_ENV
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Run update script
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          chmod +x .github/workflows/scripts/update-json.sh
 | 
			
		||||
          while read -r FILE; do
 | 
			
		||||
            .github/workflows/scripts/update-json.sh "$FILE"
 | 
			
		||||
          done < incorrect_json_files.txt
 | 
			
		||||
 | 
			
		||||
      - name: Commit and create PR if changes exist
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          git add json/*.json
 | 
			
		||||
          git commit -m "Auto-update date_created in incorrect JSON files"
 | 
			
		||||
          git checkout -b pr-fix-json-dates
 | 
			
		||||
          git push origin pr-fix-json-dates --force
 | 
			
		||||
          gh pr create --title "[core] Fix incorrect JSON date_created fields" \
 | 
			
		||||
                       --body "This PR is auto-generated to fix incorrect `date_created` fields in JSON files." \
 | 
			
		||||
                       --head pr-fix-json-dates \
 | 
			
		||||
                       --base main \
 | 
			
		||||
                       --label "automated pr"
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          PR_NUMBER=$(gh pr list --head "pr-fix-json-dates" --json number --jq '.[].number')
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -17,6 +17,66 @@ All LXC instances created using this repository come pre-installed with Midnight
 | 
			
		||||
Do not break established syntax in this file, as it is automatically updated by a Github Workflow
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 2025-02-11
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Opnsense VM [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2097](https://github.com/community-scripts/ProxmoxVE/pull/2097))
 | 
			
		||||
- New Script: Watcharr [@tremor021](https://github.com/tremor021) ([#2243](https://github.com/community-scripts/ProxmoxVE/pull/2243))
 | 
			
		||||
- New Script: Suwayomi-Server [@tremor021](https://github.com/tremor021) ([#2139](https://github.com/community-scripts/ProxmoxVE/pull/2139))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Fix Photoprism: Add defaults.yml for CLI Tool [@MickLesk](https://github.com/MickLesk) ([#2261](https://github.com/community-scripts/ProxmoxVE/pull/2261))
 | 
			
		||||
- Update Checkmk: include Patch versions in Release grepping [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2264](https://github.com/community-scripts/ProxmoxVE/pull/2264))
 | 
			
		||||
- Fix: Apache Guacamole Version Crawling - only latest Version [@MickLesk](https://github.com/MickLesk) ([#2258](https://github.com/community-scripts/ProxmoxVE/pull/2258))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Update Komodo icon [@bannert1337](https://github.com/bannert1337) ([#2263](https://github.com/community-scripts/ProxmoxVE/pull/2263))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- Add Workflow to test Scripts [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2269](https://github.com/community-scripts/ProxmoxVE/pull/2269))
 | 
			
		||||
 | 
			
		||||
## 2025-02-10
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
- [Fix] Filebrowser - Add Static Path for DB [@MickLesk](https://github.com/MickLesk) ([#2207](https://github.com/community-scripts/ProxmoxVE/pull/2207))
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Prometheus Paperless-NGX Exporter [@andygrunwald](https://github.com/andygrunwald) ([#2153](https://github.com/community-scripts/ProxmoxVE/pull/2153))
 | 
			
		||||
- New Script: Proxmox Mail Gateway [@thost96](https://github.com/thost96) ([#1906](https://github.com/community-scripts/ProxmoxVE/pull/1906))
 | 
			
		||||
- New Script: FreshRSS [@bvdberg01](https://github.com/bvdberg01) ([#2226](https://github.com/community-scripts/ProxmoxVE/pull/2226))
 | 
			
		||||
- New Script: Zitadel [@dave-yap](https://github.com/dave-yap) ([#2141](https://github.com/community-scripts/ProxmoxVE/pull/2141))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- Feature: Automatic Deletion of choosen LXC's (lxc-delete.sh) [@MickLesk](https://github.com/MickLesk) ([#2228](https://github.com/community-scripts/ProxmoxVE/pull/2228))
 | 
			
		||||
- Quickfix: Crafty-Controller remove unnecessary \ [@MickLesk](https://github.com/MickLesk) ([#2233](https://github.com/community-scripts/ProxmoxVE/pull/2233))
 | 
			
		||||
- Fix: Crafty-Controller java versions and set default [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2199](https://github.com/community-scripts/ProxmoxVE/pull/2199))
 | 
			
		||||
- Feature: Add optional Port for Filebrowser [@MickLesk](https://github.com/MickLesk) ([#2224](https://github.com/community-scripts/ProxmoxVE/pull/2224))
 | 
			
		||||
- [core] Prevent double spinner [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2203](https://github.com/community-scripts/ProxmoxVE/pull/2203))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Website: Fix Zitadel Logo & Created-Date [@MickLesk](https://github.com/MickLesk) ([#2217](https://github.com/community-scripts/ProxmoxVE/pull/2217))
 | 
			
		||||
- Fixed URL typo zerotier-one.json [@Divaksh](https://github.com/Divaksh) ([#2206](https://github.com/community-scripts/ProxmoxVE/pull/2206))
 | 
			
		||||
- evcc.json Clarify the config file location [@mvdw](https://github.com/mvdw) ([#2193](https://github.com/community-scripts/ProxmoxVE/pull/2193))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
- [gh]: Improve Workflows, Templates, Handling [@MickLesk](https://github.com/MickLesk) ([#2214](https://github.com/community-scripts/ProxmoxVE/pull/2214))
 | 
			
		||||
- [core] Fix app-header workflow and add API [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2204](https://github.com/community-scripts/ProxmoxVE/pull/2204))
 | 
			
		||||
- Fix: "read -p" does not support color formatting [@PhoenixEmik](https://github.com/PhoenixEmik) ([#2191](https://github.com/community-scripts/ProxmoxVE/pull/2191))
 | 
			
		||||
- [API] Add API to vms [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2021](https://github.com/community-scripts/ProxmoxVE/pull/2021))
 | 
			
		||||
 | 
			
		||||
## 2025-02-09
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ function update_script() {
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }') 
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | tr ' ' '\n' | grep -v '\-rc' | sort -V | tail -n 1) 
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    omd stop monitoring &>/dev/null
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										46
									
								
								ct/freshrss.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								ct/freshrss.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: bvdberg01
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/FreshRSS/FreshRSS
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="FreshRSS"
 | 
			
		||||
var_tags="RSS"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/freshrss ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_error "FreshRSS should be updated via the user interface."
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/freshrss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/freshrss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ______               __    ____  __________
 | 
			
		||||
   / ____/_______  _____/ /_  / __ \/ ___/ ___/
 | 
			
		||||
  / /_  / ___/ _ \/ ___/ __ \/ /_/ /\__ \\__ \ 
 | 
			
		||||
 / __/ / /  /  __(__  ) / / / _, _/___/ /__/ / 
 | 
			
		||||
/_/   /_/   \___/____/_/ /_/_/ |_|/____/____/  
 | 
			
		||||
                                               
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/prometheus-paperless-ngx-exporter
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/prometheus-paperless-ngx-exporter
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____                            __  __                          ____                        __                     _   _________  __      ______                      __           
 | 
			
		||||
   / __ \_________  ____ ___  ___  / /_/ /_  ___  __  _______      / __ \____ _____  ___  _____/ /__  __________      / | / / ____/ |/ /     / ____/  ______  ____  _____/ /____  _____
 | 
			
		||||
  / /_/ / ___/ __ \/ __ `__ \/ _ \/ __/ __ \/ _ \/ / / / ___/_____/ /_/ / __ `/ __ \/ _ \/ ___/ / _ \/ ___/ ___/_____/  |/ / / __ |   /_____/ __/ | |/_/ __ \/ __ \/ ___/ __/ _ \/ ___/
 | 
			
		||||
 / ____/ /  / /_/ / / / / / /  __/ /_/ / / /  __/ /_/ (__  )_____/ ____/ /_/ / /_/ /  __/ /  / /  __(__  |__  )_____/ /|  / /_/ //   /_____/ /____>  </ /_/ / /_/ / /  / /_/  __/ /    
 | 
			
		||||
/_/   /_/   \____/_/ /_/ /_/\___/\__/_/ /_/\___/\__,_/____/     /_/    \__,_/ .___/\___/_/  /_/\___/____/____/     /_/ |_/\____//_/|_|    /_____/_/|_/ .___/\____/_/   \__/\___/_/     
 | 
			
		||||
                                                                           /_/                                                                      /_/                                
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/proxmox-mail-gateway
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/proxmox-mail-gateway
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ____                                             __  ___      _ __      ______      __                          
 | 
			
		||||
   / __ \_________  _  ______ ___  ____  _  __      /  |/  /___ _(_) /     / ____/___ _/ /____ _      ______ ___  __
 | 
			
		||||
  / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/_____/ /|_/ / __ `/ / /_____/ / __/ __ `/ __/ _ \ | /| / / __ `/ / / /
 | 
			
		||||
 / ____/ /  / /_/ />  </ / / / / / /_/ />  </_____/ /  / / /_/ / / /_____/ /_/ / /_/ / /_/  __/ |/ |/ / /_/ / /_/ / 
 | 
			
		||||
/_/   /_/   \____/_/|_/_/ /_/ /_/\____/_/|_|     /_/  /_/\__,_/_/_/      \____/\__,_/\__/\___/|__/|__/\__,_/\__, /  
 | 
			
		||||
                                                                                                           /____/   
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/suwayomiserver
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/suwayomiserver
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
   _____                                            _      _____                          
 | 
			
		||||
  / ___/__  ___      ______ ___  ______  ____ ___  (_)    / ___/___  ______   _____  _____
 | 
			
		||||
  \__ \/ / / / | /| / / __ `/ / / / __ \/ __ `__ \/ /_____\__ \/ _ \/ ___/ | / / _ \/ ___/
 | 
			
		||||
 ___/ / /_/ /| |/ |/ / /_/ / /_/ / /_/ / / / / / / /_____/__/ /  __/ /   | |/ /  __/ /    
 | 
			
		||||
/____/\__,_/ |__/|__/\__,_/\__, /\____/_/ /_/ /_/_/     /____/\___/_/    |___/\___/_/     
 | 
			
		||||
                          /____/                                                          
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/watcharr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/watcharr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
 _       __      __       __                   
 | 
			
		||||
| |     / /___ _/ /______/ /_  ____ ___________
 | 
			
		||||
| | /| / / __ `/ __/ ___/ __ \/ __ `/ ___/ ___/
 | 
			
		||||
| |/ |/ / /_/ / /_/ /__/ / / / /_/ / /  / /    
 | 
			
		||||
|__/|__/\__,_/\__/\___/_/ /_/\__,_/_/  /_/     
 | 
			
		||||
                                               
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/zitadel
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/zitadel
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
 _____   _ __            __     __
 | 
			
		||||
/__  /  (_) /_____ _____/ /__  / /
 | 
			
		||||
  / /  / / __/ __ `/ __  / _ \/ / 
 | 
			
		||||
 / /__/ / /_/ /_/ / /_/ /  __/ /  
 | 
			
		||||
/____/_/\__/\__,_/\__,_/\___/_/   
 | 
			
		||||
                                  
 | 
			
		||||
							
								
								
									
										67
									
								
								ct/prometheus-paperless-ngx-exporter.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										67
									
								
								ct/prometheus-paperless-ngx-exporter.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Andy Grunwald (andygrunwald)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/hansmi/prometheus-paperless-exporter
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Prometheus-Paperless-NGX-Exporter"
 | 
			
		||||
var_tags="monitoring;alerting"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="256"
 | 
			
		||||
var_disk="2"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -f /etc/systemd/system/prometheus-paperless-ngx-exporter.service ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/hansmi/prometheus-paperless-exporter/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop prometheus-paperless-ngx-exporter
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to v${RELEASE}"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    wget -q https://github.com/hansmi/prometheus-paperless-exporter/releases/download/v${RELEASE}/prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
    tar -xf prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
    cp -rf prometheus-paperless-exporter_${RELEASE}_linux_amd64/prometheus-paperless-exporter /usr/local/bin/
 | 
			
		||||
    rm -rf prometheus-paperless-exporter_${RELEASE}_linux_amd64/ prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start prometheus-paperless-ngx-exporter
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8081/metrics${CL}"
 | 
			
		||||
							
								
								
									
										43
									
								
								ct/proxmox-mail-gateway.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								ct/proxmox-mail-gateway.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: thost96 (thost96)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://www.proxmox.com/en/products/proxmox-mail-gateway
 | 
			
		||||
 | 
			
		||||
APP="Proxmox-Mail-Gateway"
 | 
			
		||||
var_tags="mail"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="4096"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -e /usr/bin/pmgproxy ]]; then msg_error "No ${APP} Installation Found!"; exit; fi
 | 
			
		||||
  msg_info "Updating ${APP}"
 | 
			
		||||
  apt-get update &>/dev/null
 | 
			
		||||
  apt-get -y upgrade &>/dev/null
 | 
			
		||||
  msg_ok "Updated ${APP}"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8006/${CL}"
 | 
			
		||||
							
								
								
									
										66
									
								
								ct/suwayomiserver.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								ct/suwayomiserver.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/Suwayomi/Suwayomi-Server
 | 
			
		||||
 | 
			
		||||
APP="Suwayomi-Server"
 | 
			
		||||
TAGS="media;manga"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
 | 
			
		||||
    if [[ ! -f /usr/bin/suwayomi-server ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/suwayomi-server_version.txt)" ]] || [[ ! -f /opt/suwayomi-server_version.txt ]]; then
 | 
			
		||||
        msg_info "Updating $APP"
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop suwayomi-server
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        cd /tmp
 | 
			
		||||
        URL=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' |  tail -n+2 | head -n 1)
 | 
			
		||||
        wget -q $URL
 | 
			
		||||
        $STD dpkg -i /tmp/*.deb
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start suwayomi-server
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -f *.deb
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
        echo "${RELEASE}" >/opt/suwayomi-server_version.txt.txt
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4567${CL}"
 | 
			
		||||
							
								
								
									
										80
									
								
								ct/watcharr.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								ct/watcharr.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Slaviša Arežina (tremor021)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/sbondCo/Watcharr
 | 
			
		||||
 | 
			
		||||
APP="Watcharr"
 | 
			
		||||
TAGS="media"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/watcharr ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/sbondCo/Watcharr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
        msg_info "Updating $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop watcharr
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        temp_file=$(mktemp)
 | 
			
		||||
        wget -q "https://github.com/sbondCo/Watcharr/archive/refs/tags/v${RELEASE}.tar.gz" -O "$temp_file"
 | 
			
		||||
        tar -xzf "$temp_file"
 | 
			
		||||
        rm -f /opt/watcharr/server/watcharr
 | 
			
		||||
        rm -rf /opt/watcharr/server/ui
 | 
			
		||||
        mv Watcharr-${RELEASE}/ /opt/watcharr
 | 
			
		||||
        cd /opt/watcharr
 | 
			
		||||
        export GOOS=linux
 | 
			
		||||
        npm i &> /dev/null
 | 
			
		||||
        npm run build &> /dev/null
 | 
			
		||||
        mv ./build ./server/ui
 | 
			
		||||
        cd server
 | 
			
		||||
        go mod download
 | 
			
		||||
        go build -o ./watcharr
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start watcharr
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -f ${temp_file}
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3080${CL}"
 | 
			
		||||
							
								
								
									
										70
									
								
								ct/zitadel.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								ct/zitadel.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: dave-yap (dave-yap)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://zitadel.com/
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Zitadel"
 | 
			
		||||
var_tags="identity-provider"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="8"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -f /etc/systemd/system/zitadel.service ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -si https://github.com/zitadel/zitadel/releases/latest | grep location: | cut -d '/' -f 8 | tr -d '\r')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt | grep -oP '\d+\.\d+\.\d+')" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop zitadel
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
        
 | 
			
		||||
        msg_info "Updating $APP to ${RELEASE}"
 | 
			
		||||
        cd /tmp
 | 
			
		||||
        wget -qc https://github.com/zitadel/zitadel/releases/download/$RELEASE/zitadel-linux-amd64.tar.gz -O - | tar -xz
 | 
			
		||||
        mv zitadel-linux-amd64/zitadel /usr/local/bin
 | 
			
		||||
        zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml --init-projections=true &>/dev/null
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Updated $APP to ${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start zitadel
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf /tmp/zitadel-linux-amd64
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
      else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/ui/console${CL}"
 | 
			
		||||
@@ -41,7 +41,7 @@ $STD apt-get install -y \
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Apache Tomcat"
 | 
			
		||||
RELEASE=$(wget -qO- https://dlcdn.apache.org/tomcat/tomcat-9/ | grep -oP '(?<=href=")v[^"/]+(?=/")' | sed 's/^v//')
 | 
			
		||||
RELEASE=$(wget -qO- https://dlcdn.apache.org/tomcat/tomcat-9/ | grep -oP '(?<=href=")v[^"/]+(?=/")' | sed 's/^v//' | sort -V | tail -n1)
 | 
			
		||||
mkdir -p /opt/apache-guacamole/tomcat9
 | 
			
		||||
mkdir -p /opt/apache-guacamole/server
 | 
			
		||||
wget -qO- "https://dlcdn.apache.org/tomcat/tomcat-9/v${RELEASE}/bin/apache-tomcat-${RELEASE}.tar.gz" | tar -xz -C /opt/apache-guacamole/tomcat9 --strip-components=1
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ $STD apt-get install -y \
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Install Checkmk"
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | head -n 1)
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/checkmk/checkmk/tags | grep "name" | awk '{print substr($2, 3, length($2)-4) }' | tr ' ' '\n' | grep -v '\-rc' | sort -V | tail -n 1)
 | 
			
		||||
wget -q https://download.checkmk.com/checkmk/${RELEASE}/check-mk-raw-${RELEASE}_0.bookworm_amd64.deb -O /opt/checkmk.deb
 | 
			
		||||
$STD apt-get install -y /opt/checkmk.deb
 | 
			
		||||
echo "${RELEASE}" >"/opt/checkmk_version.txt"
 | 
			
		||||
 
 | 
			
		||||
@@ -23,13 +23,23 @@ $STD apt-get install -y \
 | 
			
		||||
  lsb-release \
 | 
			
		||||
  apt-transport-https \
 | 
			
		||||
  coreutils \
 | 
			
		||||
  software-properties-common \
 | 
			
		||||
  openjdk-17-jdk 
 | 
			
		||||
wget -q https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.deb
 | 
			
		||||
$STD sudo dpkg -i jdk-21_linux-x64_bin.deb
 | 
			
		||||
rm -f jdk-21_linux-x64_bin.deb
 | 
			
		||||
  software-properties-common
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up TermurinJDK"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  temurin-8-jre \
 | 
			
		||||
  temurin-11-jre \
 | 
			
		||||
  temurin-17-jre \
 | 
			
		||||
  temurin-21-jre \
 | 
			
		||||
  temurin-23-jre
 | 
			
		||||
sudo update-alternatives --set java /usr/lib/jvm/temurin-21-jre-amd64/bin/java
 | 
			
		||||
msg_ok "Installed TermurinJDK"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  python3 \
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										84
									
								
								install/freshrss-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								install/freshrss-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: bvdberg01
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  postgresql \
 | 
			
		||||
  apache2 \
 | 
			
		||||
  php-{curl,dom,json,ctype,pgsql,gmp,mbstring,iconv,zip} \
 | 
			
		||||
  libapache2-mod-php
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PostgreSQL"
 | 
			
		||||
DB_NAME=freshrss
 | 
			
		||||
DB_USER=freshrss
 | 
			
		||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE ROLE $DB_USER WITH LOGIN PASSWORD '$DB_PASS';"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER TEMPLATE template0;"
 | 
			
		||||
{
 | 
			
		||||
echo "FreshRSS Credentials"
 | 
			
		||||
echo "FreshRSS Database User: $DB_USER"
 | 
			
		||||
echo "FreshRSS Database Password: $DB_PASS"
 | 
			
		||||
echo "FreshRSS Database Name: $DB_NAME"
 | 
			
		||||
} >> ~/freshrss.creds
 | 
			
		||||
msg_ok "Set up PostgreSQL"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing FreshRSS"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/FreshRSS/FreshRSS/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
cd /opt
 | 
			
		||||
wget -q "https://github.com/FreshRSS/FreshRSS/archive/refs/tags/${RELEASE}.zip"
 | 
			
		||||
unzip -q "${RELEASE}.zip"
 | 
			
		||||
mv "/opt/FreshRSS-${RELEASE}" /opt/freshrss
 | 
			
		||||
cd /opt/freshrss
 | 
			
		||||
chown -R www-data:www-data /opt/freshrss
 | 
			
		||||
chmod -R g+rX /opt/freshrss
 | 
			
		||||
chmod -R g+w /opt/freshrss/data/
 | 
			
		||||
msg_ok "Installed FreshRSS"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/apache2/sites-available/freshrss.conf
 | 
			
		||||
<VirtualHost *:80>
 | 
			
		||||
    ServerName freshrss
 | 
			
		||||
    DocumentRoot /opt/freshrss/p
 | 
			
		||||
 | 
			
		||||
    <Directory /opt/freshrss/p>
 | 
			
		||||
        Options FollowSymLinks
 | 
			
		||||
        AllowOverride All
 | 
			
		||||
        Require all granted
 | 
			
		||||
    </Directory>
 | 
			
		||||
 | 
			
		||||
    ErrorLog /var/log/apache2/freshrss_error.log
 | 
			
		||||
    CustomLog /var/log/apache2/freshrss_access.log combined
 | 
			
		||||
 | 
			
		||||
    AllowEncodedSlashes On
 | 
			
		||||
</VirtualHost>
 | 
			
		||||
EOF
 | 
			
		||||
$STD a2ensite freshrss
 | 
			
		||||
$STD a2enmod rewrite
 | 
			
		||||
$STD a2dissite 000-default.conf
 | 
			
		||||
$STD systemctl reload apache2
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf "/opt/${RELEASE}.zip"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -62,6 +62,35 @@ PHOTOPRISM_PUBLIC='false'
 | 
			
		||||
PHOTOPRISM_DEBUG='false'
 | 
			
		||||
EOF
 | 
			
		||||
ln -sf /opt/photoprism/bin/photoprism /usr/local/bin/photoprism
 | 
			
		||||
 | 
			
		||||
mkdir -p /etc/photoprism/
 | 
			
		||||
cat <<EOF >/etc/photoprism/defaults.yml
 | 
			
		||||
ConfigPath: "~/.config/photoprism"
 | 
			
		||||
StoragePath: "/opt/photoprism/storage"
 | 
			
		||||
OriginalsPath: "/opt/photoprism/photos/originals"
 | 
			
		||||
ImportPath: "/media"
 | 
			
		||||
AdminUser: "admin"
 | 
			
		||||
AdminPassword: "changeme"
 | 
			
		||||
AuthMode: "password"
 | 
			
		||||
DatabaseDriver: "sqlite"
 | 
			
		||||
HttpHost: "0.0.0.0"
 | 
			
		||||
HttpPort: 2342
 | 
			
		||||
HttpCompression: "gzip"
 | 
			
		||||
DisableTLS: false
 | 
			
		||||
DefaultTLS: true
 | 
			
		||||
Experimental: false
 | 
			
		||||
DisableWebDAV: false
 | 
			
		||||
DisableSettings: false
 | 
			
		||||
DisableTensorFlow: false
 | 
			
		||||
DisableFaces: false
 | 
			
		||||
DisableClassification: false
 | 
			
		||||
DisableVectors: false
 | 
			
		||||
DisableRaw: false
 | 
			
		||||
RawPresets: false
 | 
			
		||||
JpegQuality: 85
 | 
			
		||||
DetectNSFW: false
 | 
			
		||||
UploadNSFW: true
 | 
			
		||||
EOF
 | 
			
		||||
msg_ok "Installed PhotoPrism"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								install/prometheus-paperless-ngx-exporter-install.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										64
									
								
								install/prometheus-paperless-ngx-exporter-install.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Andy Grunwald (andygrunwald)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/hansmi/prometheus-paperless-exporter
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Prometheus Paperless NGX Exporter"
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/hansmi/prometheus-paperless-exporter/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q https://github.com/hansmi/prometheus-paperless-exporter/releases/download/v${RELEASE}/prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
tar -xf prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
mv prometheus-paperless-exporter_${RELEASE}_linux_amd64/prometheus-paperless-exporter /usr/local/bin/
 | 
			
		||||
mkdir -p /etc/prometheus-paperless-ngx-exporter
 | 
			
		||||
cat <<EOF > /etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file
 | 
			
		||||
SECRET_AUTH_TOKEN
 | 
			
		||||
EOF
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Installed Prometheus Paperless NGX Exporter"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/prometheus-paperless-ngx-exporter.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Prometheus Paperless NGX Exporter
 | 
			
		||||
Wants=network-online.target
 | 
			
		||||
After=network-online.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
User=root
 | 
			
		||||
Restart=always
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=/usr/local/bin/prometheus-paperless-exporter \
 | 
			
		||||
    --paperless_url=http://paperless.example.org \
 | 
			
		||||
    --paperless_auth_token_file=/etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file
 | 
			
		||||
ExecReload=/bin/kill -HUP \$MAINPID
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now prometheus-paperless-ngx-exporter
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
rm -rf prometheus-paperless-exporter_${RELEASE}_linux_amd64/ prometheus-paperless-exporter_${RELEASE}_linux_amd64.tar.gz
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										36
									
								
								install/proxmox-mail-gateway-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								install/proxmox-mail-gateway-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: thost96 (thost96)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get -y install \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  wget
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Proxmox Mail Gateway"
 | 
			
		||||
wget -q https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg
 | 
			
		||||
echo "deb http://download.proxmox.com/debian/pmg bookworm pmg-no-subscription" > /etc/apt/sources.list.d/pmg.list
 | 
			
		||||
$STD apt-get update 
 | 
			
		||||
$STD apt-get -y install proxmox-mailgateway-container
 | 
			
		||||
msg_ok "Installed Proxmox Mail Gateway"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										53
									
								
								install/suwayomiserver-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								install/suwayomiserver-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: tremor021
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/Suwayomi/Suwayomi-Server
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  openjdk-17-jre \
 | 
			
		||||
  libc++-dev
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Settting up Suwayomi-Server"
 | 
			
		||||
URL=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' |  tail -n+2 | head -n 1)
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
			
		||||
wget -q $URL
 | 
			
		||||
$STD dpkg -i *.deb
 | 
			
		||||
echo ${RELEASE} >/opt/suwayomi-server_version.txt
 | 
			
		||||
msg_ok "Done setting up Suwayomi-Server"
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/suwayomi-server.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Suwayomi-Server Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
ExecStart=/usr/bin/suwayomi-server
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now suwayomi-server
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f *.deb
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										93
									
								
								install/watcharr-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								install/watcharr-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Slaviša Arežina (tremor021)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/sbondCo/Watcharr
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  sudo \
 | 
			
		||||
  mc \
 | 
			
		||||
  gcc \
 | 
			
		||||
  gnupg
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Golang"
 | 
			
		||||
set +o pipefail
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
golang_tarball=$(curl -s https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
			
		||||
wget -q https://golang.org/dl/"$golang_tarball" -O "$temp_file"
 | 
			
		||||
tar -C /usr/local -xzf "$temp_file"
 | 
			
		||||
ln -sf /usr/local/go/bin/go /usr/local/bin/go
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_ok "Setup Golang"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Node.js"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
msg_ok "Setup Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Watcharr"
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/sbondCo/Watcharr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q "https://github.com/sbondCo/Watcharr/archive/refs/tags/v${RELEASE}.tar.gz" -O "$temp_file"
 | 
			
		||||
tar -xzf "$temp_file"
 | 
			
		||||
mv Watcharr-${RELEASE}/ /opt/watcharr
 | 
			
		||||
cd /opt/watcharr
 | 
			
		||||
$STD npm i
 | 
			
		||||
$STD npm run build
 | 
			
		||||
mv ./build ./server/ui
 | 
			
		||||
cd server
 | 
			
		||||
export CGO_ENABLED=1 GOOS=linux
 | 
			
		||||
go mod download
 | 
			
		||||
go build -o ./watcharr
 | 
			
		||||
cat <<EOF >/opt/start.sh
 | 
			
		||||
#! /bin/bash
 | 
			
		||||
source ~/.bashrc
 | 
			
		||||
cd /opt/watcharr/server
 | 
			
		||||
./watcharr
 | 
			
		||||
EOF
 | 
			
		||||
chmod +x /opt/start.sh
 | 
			
		||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Setup Watcharr"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/watcharr.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Watcharr Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
WorkingDirectory=/opt/watcharr/server
 | 
			
		||||
ExecStart=/opt/start.sh
 | 
			
		||||
Restart=always
 | 
			
		||||
User=root
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now watcharr
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										155
									
								
								install/zitadel-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								install/zitadel-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: dave-yap
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies (Patience)"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
    curl \
 | 
			
		||||
    sudo \
 | 
			
		||||
    mc \
 | 
			
		||||
    ca-certificates \
 | 
			
		||||
    wget
 | 
			
		||||
msg_ok "Installed Dependecies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Postgresql"
 | 
			
		||||
$STD apt-get install -y postgresql postgresql-common
 | 
			
		||||
DB_NAME="zitadel"
 | 
			
		||||
DB_USER="zitadel"
 | 
			
		||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
 | 
			
		||||
DB_ADMIN_USER="root"
 | 
			
		||||
DB_ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
 | 
			
		||||
systemctl start postgresql
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE USER $DB_ADMIN_USER WITH PASSWORD '$DB_ADMIN_PASS' SUPERUSER;"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_ADMIN_USER;"
 | 
			
		||||
{
 | 
			
		||||
    echo "Application Credentials"
 | 
			
		||||
    echo "DB_NAME: $DB_NAME"
 | 
			
		||||
    echo "DB_USER: $DB_USER"
 | 
			
		||||
    echo "DB_PASS: $DB_PASS"
 | 
			
		||||
    echo "DB_ADMIN_USER: $DB_ADMIN_USER"
 | 
			
		||||
    echo "DB_ADMIN_PASS: $DB_ADMIN_PASS"
 | 
			
		||||
} >> ~/zitadel.creds
 | 
			
		||||
msg_ok "Installed PostgreSQL"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Zitadel"
 | 
			
		||||
RELEASE=$(curl -si https://github.com/zitadel/zitadel/releases/latest | grep location: | cut -d '/' -f 8 | tr -d '\r')
 | 
			
		||||
wget -qc https://github.com/zitadel/zitadel/releases/download/$RELEASE/zitadel-linux-amd64.tar.gz -O - | tar -xz
 | 
			
		||||
mv zitadel-linux-amd64/zitadel /usr/local/bin
 | 
			
		||||
echo "${RELEASE}" >"/opt/zitadel_version.txt"
 | 
			
		||||
msg_ok "Installed Zitadel"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Zitadel Environments"
 | 
			
		||||
mkdir -p /opt/zitadel
 | 
			
		||||
echo "/opt/zitadel/config.yaml" > "/opt/zitadel/.config"
 | 
			
		||||
head -c 32 < <(openssl rand -base64 48 | tr -dc 'a-zA-Z0-9') > "/opt/zitadel/.masterkey"
 | 
			
		||||
{
 | 
			
		||||
    echo "Config location: $(cat "/opt/zitadel/.config")"
 | 
			
		||||
    echo "Masterkey: $(cat "/opt/zitadel/.masterkey")"
 | 
			
		||||
} >> ~/zitadel.creds
 | 
			
		||||
cat <<EOF >/opt/zitadel/config.yaml
 | 
			
		||||
Port: 8080
 | 
			
		||||
ExternalPort: 8080
 | 
			
		||||
ExternalDomain: localhost
 | 
			
		||||
ExternalSecure: false
 | 
			
		||||
TLS:
 | 
			
		||||
  Enabled: false
 | 
			
		||||
  KeyPath: ""
 | 
			
		||||
  Key: ""
 | 
			
		||||
  CertPath: ""
 | 
			
		||||
  Cert: ""
 | 
			
		||||
 | 
			
		||||
Database:
 | 
			
		||||
  postgres:
 | 
			
		||||
    Host: localhost
 | 
			
		||||
    Port: 5432
 | 
			
		||||
    Database: ${DB_NAME}
 | 
			
		||||
    User:
 | 
			
		||||
      Username: ${DB_USER}
 | 
			
		||||
      Password: ${DB_PASS}
 | 
			
		||||
      SSL:
 | 
			
		||||
        Mode: disable
 | 
			
		||||
        RootCert: ""
 | 
			
		||||
        Cert: ""
 | 
			
		||||
        Key: ""
 | 
			
		||||
    Admin:
 | 
			
		||||
      Username: ${DB_ADMIN_USER}
 | 
			
		||||
      Password: ${DB_ADMIN_PASS}
 | 
			
		||||
      SSL:
 | 
			
		||||
        Mode: disable
 | 
			
		||||
        RootCert: ""
 | 
			
		||||
        Cert: ""
 | 
			
		||||
        Key: ""
 | 
			
		||||
EOF
 | 
			
		||||
msg_ok "Installed Zitadel Enviroments"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Services"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/zitadel.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=ZITADEL Identiy Server
 | 
			
		||||
After=network.target postgresql.service
 | 
			
		||||
Wants=postgresql.service
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=zitadel
 | 
			
		||||
Group=zitadel
 | 
			
		||||
ExecStart=/usr/local/bin/zitadel start --masterkeyFile "/opt/zitadel/.masterkey" --config "/opt/zitadel/config.yaml"
 | 
			
		||||
Restart=always
 | 
			
		||||
RestartSec=5
 | 
			
		||||
TimeoutStartSec=0
 | 
			
		||||
 | 
			
		||||
# Security Hardening options
 | 
			
		||||
ProtectSystem=full
 | 
			
		||||
ProtectHome=true
 | 
			
		||||
PrivateTmp=true
 | 
			
		||||
NoNewPrivileges=true
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q zitadel.service
 | 
			
		||||
msg_ok "Created Services"
 | 
			
		||||
 | 
			
		||||
msg_info "Zitadel initial setup"
 | 
			
		||||
zitadel start-from-init --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml &>/dev/null &
 | 
			
		||||
sleep 60
 | 
			
		||||
kill $(lsof -i | awk '/zitadel/ {print $2}' | head -n1)
 | 
			
		||||
useradd zitadel
 | 
			
		||||
echo -e "$(zitadel -v | grep -oP 'v\d+\.\d+\.\d+')" > /opt/Zitadel_version.txt
 | 
			
		||||
msg_ok "Zitadel initialized"
 | 
			
		||||
 | 
			
		||||
msg_info "Set ExternalDomain to current IP and restart Zitadel"
 | 
			
		||||
IP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
 | 
			
		||||
sed -i "0,/localhost/s/localhost/${IP}/" /opt/zitadel/config.yaml
 | 
			
		||||
systemctl stop -q zitadel.service
 | 
			
		||||
zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml &>/dev/null 
 | 
			
		||||
systemctl restart -q zitadel.service
 | 
			
		||||
msg_ok "Zitadel restarted with ExternalDomain set to current IP"
 | 
			
		||||
 | 
			
		||||
msg_info "Create zitadel-rerun.sh"
 | 
			
		||||
cat <<EOF >~/zitadel-rerun.sh
 | 
			
		||||
systemctl stop zitadel.service
 | 
			
		||||
timeout --kill-after=5s 15s zitadel setup --masterkeyFile /opt/zitadel/.masterkey --config /opt/zitadel/config.yaml
 | 
			
		||||
systemctl restart zitadel.service
 | 
			
		||||
EOF
 | 
			
		||||
msg_ok "Bash script for rerunning Zitadel after changing Zitadel config.yaml"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -rf ~/zitadel-linux-amd64
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -32,7 +32,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
            "text": "entering `evcc configure` in the LXC terminal will guide you through the creation of a configuration file for evcc.",
 | 
			
		||||
            "text": "To configure evcc, type `cd /etc` followed by `evcc configure` in the evcc LXC shell",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								json/freshrss.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/freshrss.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "FreshRSS",
 | 
			
		||||
  "slug": "freshrss",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    12
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-02-10",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 80,
 | 
			
		||||
  "documentation": "https://freshrss.github.io/FreshRSS/en/",
 | 
			
		||||
  "website": "https://freshrss.org/",
 | 
			
		||||
  "logo": "https://freshrss.org/images/icon.svg",
 | 
			
		||||
  "description": "FreshRSS is a self-hosted RSS and Atom feed aggregator that lets users collect, organize, and read from multiple sources in one place. It is lightweight, easy to work with, powerful, and customizable.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/freshrss.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 1024,
 | 
			
		||||
        "hdd": 4,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "Database credentials: `cat ~/freshrss.creds`",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
  "interface_port": 9120,
 | 
			
		||||
  "documentation": "https://komo.do/docs/intro",
 | 
			
		||||
  "website": "https://komo.do",
 | 
			
		||||
  "logo": "https://komo.do/img/logo512.png",
 | 
			
		||||
  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/komodo.svg",
 | 
			
		||||
  "description": "Komodo is a build and deployment system that automates the creation of versioned Docker images from Git repositories and facilitates the deployment of Docker containers and Docker Compose setups. It provides features such as build automation triggered by Git pushes, deployment management, and monitoring of uptime and logs across multiple servers. The core API and associated agent are developed in Rust.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								json/opnsense-vm.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/opnsense-vm.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "OPNsense-VM",
 | 
			
		||||
  "slug": "opnsense-vm",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    4
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-02-11",
 | 
			
		||||
  "type": "vm",
 | 
			
		||||
  "updateable": false,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 443,
 | 
			
		||||
  "documentation": "https://docs.opnsense.org/",
 | 
			
		||||
  "website": "https://opnsense.org/",
 | 
			
		||||
  "logo": "https://raw.githubusercontent.com/opnsense/core/master/src/opnsense/scripts/OPNsense/CaptivePortal/htdocs_default/images/default-logo.png",
 | 
			
		||||
  "description": "OPNsense is an open-source firewall and routing platform based on FreeBSD. It provides advanced security features, including intrusion detection, VPN support, traffic shaping, and web filtering, with an intuitive web interface for easy management. Known for its reliability and regular updates, OPNsense is a popular choice for both businesses and home networks.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "vm/opnsense-vm.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 4,
 | 
			
		||||
        "ram": 8192,
 | 
			
		||||
        "hdd": 10,
 | 
			
		||||
        "os": "FreeBSD",
 | 
			
		||||
        "version": "latest"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": "root",
 | 
			
		||||
    "password": "opnsense"
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "It will fail with default settings if there is no vmbr0 and vmbr1 on your node. Use advanced settings in this case.",
 | 
			
		||||
      "type": "warning"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								json/prometheus-paperless-ngx-exporter.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								json/prometheus-paperless-ngx-exporter.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Prometheus Paperless NGX Exporter",
 | 
			
		||||
    "slug": "prometheus-paperless-ngx-exporter",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        9
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-07",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 3000,
 | 
			
		||||
    "documentation": null,
 | 
			
		||||
    "website": "https://github.com/hansmi/prometheus-paperless-exporter",
 | 
			
		||||
    "logo": "https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/resources/logo/web/svg/square.svg",
 | 
			
		||||
    "description": "Prometheus metrics exporter for Paperless-NGX, a document management system transforming physical documents into a searchable online archive. The exporter relies on Paperless' REST API.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/prometheus-paperless-ngx-exporter.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 256,
 | 
			
		||||
                "hdd": 2,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
            "text": "Please adjust the Paperless URL in the systemd unit file: /etc/systemd/system/prometheus-paperless-ngx-exporter.service",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "text": "Please adjust the Paperless authentication token in the configuration file: /etc/prometheus-paperless-ngx-exporter/paperless_auth_token_file",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								json/proxmox-mail-gateway.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/proxmox-mail-gateway.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Promox Mail Gateway",
 | 
			
		||||
    "slug": "proxmox-mail-gateway",
 | 
			
		||||
    "categories": [
 | 
			
		||||
            1
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-04",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 8006,
 | 
			
		||||
    "documentation": "https://pmg.proxmox.com/pmg-docs/pmg-admin-guide.html",
 | 
			
		||||
    "website": "https://www.proxmox.com/en/products/proxmox-mail-gateway/overview",
 | 
			
		||||
    "logo": "https://raw.githubusercontent.com/home-assistant/brands/master/core_integrations/proxmoxve/icon.png",
 | 
			
		||||
    "description": "Proxmox Mail Gateway is the leading open-source email security solution helping you to protect your mail server against all email threats from the moment they emerge.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/proxmox-mail-gateway.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 2,
 | 
			
		||||
                "ram": 4096,
 | 
			
		||||
                "hdd": 10,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": "root",
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
        "text": "Set a root password if using autologin. This will be the PMG password. `passwd root`",
 | 
			
		||||
        "type": "warning"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								json/suwayomi-server.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/suwayomi-server.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Suwayomi-Server",
 | 
			
		||||
    "slug": "suwayomi-server",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        13
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-07",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 4567,
 | 
			
		||||
    "documentation": "https://github.com/Suwayomi/Suwayomi-Server/wiki",
 | 
			
		||||
    "website": "https://github.com/Suwayomi/Suwayomi-Server",
 | 
			
		||||
    "logo": "https://github.com/Suwayomi/Suwayomi-Server/raw/master/server/src/main/resources/icon/faviconlogo.png",
 | 
			
		||||
    "description": "A free and open source manga reader server that runs extensions built for Mihon (Tachiyomi).",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/suwayomiserver.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 1024,
 | 
			
		||||
                "hdd": 4,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
            "text": "This application is conflicting with Kaspersky products. You need to disable Kaspersky in order to use this application.",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								json/watcharr.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								json/watcharr.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Watcharr",
 | 
			
		||||
    "slug": "watcharr",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        13
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-12",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 3080,
 | 
			
		||||
    "documentation": "https://watcharr.app/docs/introduction",
 | 
			
		||||
    "website": "https://watcharr.app/",
 | 
			
		||||
    "logo": "https://watcharr.app/img/favicon.png",
 | 
			
		||||
    "description": "Open source, self-hostable watched list for all your content with user authentication, modern and clean UI and a very simple setup.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/watcharr.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 1024,
 | 
			
		||||
                "hdd": 4,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
}
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 3443,
 | 
			
		||||
    "documentation": "https://https://docs.zerotier.com/",
 | 
			
		||||
    "documentation": "https://docs.zerotier.com/",
 | 
			
		||||
    "website": "https://www.zerotier.com/",
 | 
			
		||||
    "logo": "https://www.zerotier.com/wp-content/uploads/2025/01/Logo-White.svg",
 | 
			
		||||
    "description": "ZeroTier is a secure network overlay that allows you to manage all of your network resources as if they were on the same LAN. The software-defined solution can be deployed in minutes from anywhere. No matter how many devices you need to connect, or where they are in the world, ZeroTier makes global networking simple.",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								json/zitadel.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								json/zitadel.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Zitadel",
 | 
			
		||||
    "slug": "Zitadel",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        6
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-10",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 8080,
 | 
			
		||||
    "documentation": "https://zitadel.com/docs/guides/overview",
 | 
			
		||||
    "website": "https://zitadel.com",
 | 
			
		||||
    "logo": "https://raw.githubusercontent.com/zitadel/zitadel/refs/heads/main/console/src/assets/icons/android-chrome-512x512.png",
 | 
			
		||||
    "description": "Zitadel is an open-source identity and access management (IAM) solution designed to provide secure authentication, authorization, and user management for modern applications and services. Built with a focus on flexibility, scalability, and security, Zitadel offers a comprehensive set of features for developers and organizations looking to implement robust identity management.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/zitadel.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 1024,
 | 
			
		||||
                "hdd": 8,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": "zitadel-admin@zitadel.localhost",
 | 
			
		||||
        "password": "Password1!"
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
            "text": "Application credentials: `cat ~/zitadel.creds`",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "text": "Change the ExternalDomain value in `/opt/zitadel/config.yaml` to your domain/hostname/IP and run `bash zitadel-rerun.sh`",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
@@ -46,6 +46,9 @@ EOF
 | 
			
		||||
 | 
			
		||||
post_to_api_vm() {
 | 
			
		||||
 | 
			
		||||
  if [[ ! -f /usr/local/community-scripts/diagnostics ]]; then
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
  DIAGNOSTICS=$(grep -i "^DIAGNOSTICS=" /usr/local/community-scripts/diagnostics | awk -F'=' '{print $2}')
 | 
			
		||||
  if ! command -v curl &> /dev/null; then
 | 
			
		||||
    return
 | 
			
		||||
@@ -55,7 +58,6 @@ post_to_api_vm() {
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if [ -z "$RANDOM_UUID" ]; then
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
@@ -114,8 +116,8 @@ EOF
 | 
			
		||||
)
 | 
			
		||||
   
 | 
			
		||||
  RESPONSE=$(curl -s -o response.txt -w "%{http_code}" -L -X POST "$API_URL" --post301 --post302 \
 | 
			
		||||
      -H "Content-Type: application/json" \
 | 
			
		||||
      -d "$JSON_PAYLOAD") || true
 | 
			
		||||
    -H "Content-Type: application/json" \
 | 
			
		||||
    -d "$JSON_PAYLOAD") || true
 | 
			
		||||
 | 
			
		||||
  POST_UPDATE_DONE=true
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -956,7 +956,8 @@ check_container_resources() {
 | 
			
		||||
  if [[ "$current_ram" -lt "$var_ram" ]] || [[ "$current_cpu" -lt "$var_cpu" ]]; then
 | 
			
		||||
    echo -e "\n${INFO}${HOLD} ${GN}Required: ${var_cpu} CPU, ${var_ram}MB RAM ${CL}| ${RD}Current: ${current_cpu} CPU, ${current_ram}MB RAM${CL}"
 | 
			
		||||
    echo -e "${YWB}Please ensure that the ${APP} LXC is configured with at least ${var_cpu} vCPU and ${var_ram} MB RAM for the build process.${CL}\n"
 | 
			
		||||
    read -r -p "${INFO}${HOLD} May cause data loss! ${INFO} Continue update with under-provisioned LXC? <yes/No>  " prompt
 | 
			
		||||
    echo -ne "${INFO}${HOLD} May cause data loss! ${INFO} Continue update with under-provisioned LXC? <yes/No>  "
 | 
			
		||||
    read -r prompt
 | 
			
		||||
    # Check if the input is 'yes', otherwise exit with status 1
 | 
			
		||||
    if [[ ! ${prompt,,} =~ ^(yes)$ ]]; then
 | 
			
		||||
      echo -e "${CROSS}${HOLD} ${YWB}Exiting based on user input.${CL}"
 | 
			
		||||
@@ -975,7 +976,8 @@ check_container_storage() {
 | 
			
		||||
  if (( usage > 80 )); then
 | 
			
		||||
    # Prompt the user for confirmation to continue
 | 
			
		||||
    echo -e "${INFO}${HOLD} ${YWB}Warning: Storage is dangerously low (${usage}%).${CL}"
 | 
			
		||||
    read -r -p "Continue anyway? <y/N>  " prompt
 | 
			
		||||
    echo -ne "Continue anyway? <y/N>  "
 | 
			
		||||
    read -r prompt
 | 
			
		||||
    # Check if the input is 'y' or 'yes', otherwise exit with status 1
 | 
			
		||||
    if [[ ! ${prompt,,} =~ ^(y|yes)$ ]]; then
 | 
			
		||||
      echo -e "${CROSS}${HOLD}${YWB}Exiting based on user input.${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,10 @@ INFO="${BL}ℹ️${CL}"
 | 
			
		||||
APP="FileBrowser"
 | 
			
		||||
INSTALL_PATH="/usr/local/bin/filebrowser"
 | 
			
		||||
SERVICE_PATH="/etc/systemd/system/filebrowser.service"
 | 
			
		||||
DB_PATH="/root/filebrowser.db"
 | 
			
		||||
DB_PATH="/usr/local/community-scripts/filebrowser.db"
 | 
			
		||||
IP=$(hostname -I | awk '{print $1}')
 | 
			
		||||
DEFAULT_PORT=8080
 | 
			
		||||
 | 
			
		||||
header_info
 | 
			
		||||
 | 
			
		||||
function msg_info() {
 | 
			
		||||
@@ -69,6 +71,9 @@ if [ -f "$INSTALL_PATH" ]; then
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo -e "${YW}⚠️ ${APP} is not installed.${CL}"
 | 
			
		||||
read -r -p "Enter port number (Default: ${DEFAULT_PORT}): " PORT
 | 
			
		||||
PORT=${PORT:-$DEFAULT_PORT}
 | 
			
		||||
 | 
			
		||||
read -r -p "Would you like to install ${APP}? (y/n): " install_prompt
 | 
			
		||||
if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
			
		||||
    msg_info "Installing ${APP}"
 | 
			
		||||
@@ -76,38 +81,50 @@ if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
			
		||||
    curl -fsSL https://github.com/filebrowser/filebrowser/releases/latest/download/linux-amd64-filebrowser.tar.gz | tar -xzv -C /usr/local/bin &>/dev/null
 | 
			
		||||
    msg_ok "Installed ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Creating FileBrowser directory"
 | 
			
		||||
    mkdir -p /usr/local/community-scripts
 | 
			
		||||
    chown root:root /usr/local/community-scripts
 | 
			
		||||
    chmod 755 /usr/local/community-scripts
 | 
			
		||||
    msg_ok "Directory created successfully"
 | 
			
		||||
 | 
			
		||||
    read -r -p "Would you like to use No Authentication? (y/N): " auth_prompt
 | 
			
		||||
    if [[ "${auth_prompt,,}" =~ ^(y|yes)$ ]]; then
 | 
			
		||||
        msg_info "Configuring No Authentication"
 | 
			
		||||
        filebrowser config init -a '0.0.0.0' &>/dev/null
 | 
			
		||||
        filebrowser config set -a '0.0.0.0' --auth.method=noauth &>/dev/null
 | 
			
		||||
          cd /usr/local/community-scripts
 | 
			
		||||
          filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null
 | 
			
		||||
          filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null
 | 
			
		||||
          filebrowser config init --auth.method=noauth &>/dev/null
 | 
			
		||||
          filebrowser config set --auth.method=noauth &>/dev/null
 | 
			
		||||
          filebrowser users add ID 1 --perm.admin &>/dev/null  
 | 
			
		||||
        msg_ok "No Authentication configured"
 | 
			
		||||
    else
 | 
			
		||||
        msg_info "Setting up default authentication"
 | 
			
		||||
        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
 | 
			
		||||
        cd /usr/local/community-scripts
 | 
			
		||||
        filebrowser config init -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null
 | 
			
		||||
        filebrowser config set -a '0.0.0.0' -p "$PORT" -d "$DB_PATH" &>/dev/null
 | 
			
		||||
        filebrowser users add admin helper-scripts.com --perm.admin --database "$DB_PATH" &>/dev/null
 | 
			
		||||
        msg_ok "Default authentication configured (admin:helper-scripts.com)"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    msg_info "Creating service"
 | 
			
		||||
    cat <<EOF >/etc/systemd/system/filebrowser.service
 | 
			
		||||
    cat <<EOF > "$SERVICE_PATH"
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Filebrowser
 | 
			
		||||
After=network-online.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
User=root
 | 
			
		||||
WorkingDirectory=/root/
 | 
			
		||||
ExecStart=/usr/local/bin/filebrowser -r /
 | 
			
		||||
WorkingDirectory=/usr/local/community-scripts
 | 
			
		||||
ExecStart=/usr/local/bin/filebrowser -r / -d "$DB_PATH" -p "$PORT"
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=default.target
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
    systemctl enable -q --now filebrowser.service
 | 
			
		||||
    msg_ok "Service created successfully"
 | 
			
		||||
 | 
			
		||||
    echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:8080${CL}"
 | 
			
		||||
    echo -e "${CM} ${GN}${APP} is reachable at: ${BL}http://$IP:$PORT${CL}"
 | 
			
		||||
else
 | 
			
		||||
    echo -e "${YW}⚠️ Installation skipped. Exiting.${CL}"
 | 
			
		||||
    exit 0
 | 
			
		||||
 
 | 
			
		||||
@@ -7,11 +7,11 @@
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
    ____  ____  ____ _  __ __  _______ _  __    __   _  ________   ____  ________    __________________
 | 
			
		||||
   / __ \/ __ \/ __ \ |/ //  |/  / __ \ |/ /   / /  | |/ / ____/  / __ \/ ____/ /   / ____/_  __/ ____/
 | 
			
		||||
  / /_/ / /_/ / / / /   // /|_/ / / / /   /   / /   |   / /      / / / / __/ / /   / __/   / / / __/   
 | 
			
		||||
 / ____/ _, _/ /_/ /   |/ /  / / /_/ /   |   / /___/   / /___   / /_/ / /___/ /___/ /___  / / / /___   
 | 
			
		||||
/_/   /_/ |_|\____/_/|_/_/  /_/\____/_/|_|  /_____/_/|_\____/  /_____/_____/_____/_____/ /_/ /_____/   
 | 
			
		||||
    ____                                          __   _  ________   ____       __     __     
 | 
			
		||||
   / __ \_________  _  ______ ___  ____  _  __   / /  | |/ / ____/  / __ \___  / /__  / /____ 
 | 
			
		||||
  / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/  / /   |   / /      / / / / _ \/ / _ \/ __/ _ \
 | 
			
		||||
 / ____/ /  / /_/ />  </ / / / / / /_/ />  <   / /___/   / /___   / /_/ /  __/ /  __/ /_/  __/
 | 
			
		||||
/_/   /_/   \____/_/|_/_/ /_/ /_/\____/_/|_|  /_____/_/|_\____/  /_____/\___/_/\___/\__/\___/ 
 | 
			
		||||
                                                                                              
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -33,29 +33,26 @@ set -eEuo pipefail
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
RD=$(echo "\033[01;31m")
 | 
			
		||||
CM='\xE2\x9C\x94\033'
 | 
			
		||||
GN=$(echo "\033[1;92m")
 | 
			
		||||
CL=$(echo "\033[m")
 | 
			
		||||
TAB="  "
 | 
			
		||||
CM="${TAB}✔️${TAB}${CL}"
 | 
			
		||||
 | 
			
		||||
header_info
 | 
			
		||||
echo "Loading..."
 | 
			
		||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This Will Delete LXC Containers. Proceed?" 10 58 || exit
 | 
			
		||||
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Proxmox VE LXC Deletion" --yesno "This will delete LXC containers. Proceed?" 10 58 || exit
 | 
			
		||||
 | 
			
		||||
NODE=$(hostname)
 | 
			
		||||
 | 
			
		||||
# Get list of containers with ID and hostname
 | 
			
		||||
containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}')
 | 
			
		||||
 | 
			
		||||
# Exit if no containers are found
 | 
			
		||||
if [ -z "$containers" ]; then
 | 
			
		||||
    whiptail --title "LXC Container Delete" --msgbox "There are no LXC Container available!" 10 60
 | 
			
		||||
    whiptail --title "LXC Container Delete" --msgbox "No LXC containers available!" 10 60
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
menu_items=()
 | 
			
		||||
FORMAT="%-10s %-15s %-10s"
 | 
			
		||||
 | 
			
		||||
# Format container data for menu display
 | 
			
		||||
while read -r container; do
 | 
			
		||||
    container_id=$(echo $container | awk '{print $1}')
 | 
			
		||||
    container_name=$(echo $container | awk '{print $2}')
 | 
			
		||||
@@ -64,49 +61,50 @@ while read -r container; do
 | 
			
		||||
    menu_items+=("$container_id" "$formatted_line" "OFF")
 | 
			
		||||
done <<< "$containers"
 | 
			
		||||
 | 
			
		||||
# Display selection menu
 | 
			
		||||
CHOICES=$(whiptail --title "LXC Container Delete" \
 | 
			
		||||
                   --checklist "Choose LXC container to delete:" 25 60 13 \
 | 
			
		||||
                   --checklist "Select LXC containers to delete:" 25 60 13 \
 | 
			
		||||
                   "${menu_items[@]}" 3>&2 2>&1 1>&3)
 | 
			
		||||
 | 
			
		||||
if [ -z "$CHOICES" ]; then
 | 
			
		||||
    whiptail --title "LXC Container Delete" \
 | 
			
		||||
             --msgbox "No containers have been selected!" 10 60
 | 
			
		||||
             --msgbox "No containers selected!" 10 60
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Process selected containers
 | 
			
		||||
read -p "Delete containers manually or automatically? (Default: manual) m/a: " DELETE_MODE
 | 
			
		||||
DELETE_MODE=${DELETE_MODE:-m}
 | 
			
		||||
 | 
			
		||||
selected_ids=$(echo "$CHOICES" | tr -d '"' | tr -s ' ' '\n')
 | 
			
		||||
 | 
			
		||||
for container_id in $selected_ids; do
 | 
			
		||||
    status=$(pct status $container_id)
 | 
			
		||||
 | 
			
		||||
    # Stop container if running
 | 
			
		||||
    if [ "$status" == "status: running" ]; then
 | 
			
		||||
        echo -e "${BL}[Info]${GN} Stop container $container_id...${CL}"
 | 
			
		||||
        echo -e "${BL}[Info]${GN} Stopping container $container_id...${CL}"
 | 
			
		||||
        pct stop $container_id &
 | 
			
		||||
        sleep 5
 | 
			
		||||
        echo -e "${BL}[Info]${GN} Container $container_id stopped.${CL}"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Confirm deletion
 | 
			
		||||
    read -p "Are you sure you want to delete Container $container_id? (y/N): " CONFIRM
 | 
			
		||||
    if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
 | 
			
		||||
        echo -e "${BL}[Info]${GN} Deleting container $container_id...${CL}"
 | 
			
		||||
    if [[ "$DELETE_MODE" == "a" ]]; then
 | 
			
		||||
        echo -e "${BL}[Info]${GN} Automatically deleting container $container_id...${CL}"
 | 
			
		||||
        pct destroy "$container_id" -f &
 | 
			
		||||
        pid=$!
 | 
			
		||||
        spinner $pid
 | 
			
		||||
        if [ $? -eq 0 ]; then
 | 
			
		||||
            echo "Container $container_id was successfully deleted."
 | 
			
		||||
        else
 | 
			
		||||
            whiptail --title "Error" --msgbox "Error deleting container $container_id." 10 60
 | 
			
		||||
        fi
 | 
			
		||||
    elif [[ "$CONFIRM" =~ ^[Nn]$ ]]; then
 | 
			
		||||
        echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}"
 | 
			
		||||
        [ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
 | 
			
		||||
    else
 | 
			
		||||
        echo -e "${RD}[Error]${CL} Invalid input, skipping container $container_id."
 | 
			
		||||
        read -p "Delete container $container_id? (y/N): " CONFIRM
 | 
			
		||||
        if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
 | 
			
		||||
            echo -e "${BL}[Info]${GN} Deleting container $container_id...${CL}"
 | 
			
		||||
            pct destroy "$container_id" -f &
 | 
			
		||||
            pid=$!
 | 
			
		||||
            spinner $pid
 | 
			
		||||
            [ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
 | 
			
		||||
        else
 | 
			
		||||
            echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}"
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
header_info
 | 
			
		||||
echo -e "${GN}The deletion process has been completed.${CL}\n"
 | 
			
		||||
echo -e "${GN}Deletion process completed.${CL}\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,9 @@
 | 
			
		||||
# Author: MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -17,6 +20,12 @@ EOF
 | 
			
		||||
}
 | 
			
		||||
header_info
 | 
			
		||||
echo -e "\n Loading..."
 | 
			
		||||
#API VARIABLES
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="arch-linux-vm"
 | 
			
		||||
var_os="arch-linux"
 | 
			
		||||
var_version=" "
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
 | 
			
		||||
@@ -56,10 +65,13 @@ THIN="discard=on,ssd=1,"
 | 
			
		||||
set -e
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "${commad}"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -111,7 +123,7 @@ function check_root() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pve_check() {
 | 
			
		||||
  if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
 if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
    msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
 | 
			
		||||
    echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
 | 
			
		||||
    echo -e "Exiting..."
 | 
			
		||||
@@ -164,6 +176,7 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
 | 
			
		||||
@@ -181,6 +194,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -377,6 +391,7 @@ arch_check
 | 
			
		||||
pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
@@ -493,5 +508,6 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Arch Linux VM"
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,8 @@
 | 
			
		||||
# Author: MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -19,6 +21,11 @@ header_info
 | 
			
		||||
echo -e "\n Loading..."
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="debian12vm"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
@@ -56,11 +63,14 @@ THIN="discard=on,ssd=1,"
 | 
			
		||||
set -e
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  post_update_to_api "failed" "${command}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
}
 | 
			
		||||
@@ -74,6 +84,7 @@ function cleanup_vmid() {
 | 
			
		||||
 | 
			
		||||
function cleanup() {
 | 
			
		||||
  popd >/dev/null
 | 
			
		||||
  post_update_to_api "done" "none"
 | 
			
		||||
  rm -rf $TEMP_DIR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +122,7 @@ function check_root() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pve_check() {
 | 
			
		||||
  if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
 if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
    msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
 | 
			
		||||
    echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
 | 
			
		||||
    echo -e "Exiting..."
 | 
			
		||||
@@ -164,6 +175,7 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
 | 
			
		||||
@@ -181,6 +193,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -378,6 +391,8 @@ pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
  TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
@@ -439,7 +454,7 @@ done
 | 
			
		||||
 | 
			
		||||
msg_info "Creating a Debian 12 VM"
 | 
			
		||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
			
		||||
  -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
  -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
			
		||||
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,8 @@
 | 
			
		||||
# Author: thost96 (thost96)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -19,6 +21,12 @@ header_info
 | 
			
		||||
echo -e "\n Loading..."
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="debian12vm"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
DISK_SIZE="8G"
 | 
			
		||||
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
@@ -36,10 +44,13 @@ THIN="discard=on,ssd=1,"
 | 
			
		||||
set -e
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "${command}"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -91,7 +102,7 @@ function check_root() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pve_check() {
 | 
			
		||||
  if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
 if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
    msg_error "This version of Proxmox Virtual Environment is not supported"
 | 
			
		||||
    echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
 | 
			
		||||
    echo -e "Exiting..."
 | 
			
		||||
@@ -144,6 +155,7 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
 | 
			
		||||
@@ -160,6 +172,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -341,6 +354,7 @@ arch_check
 | 
			
		||||
pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
@@ -417,7 +431,7 @@ msg_ok "Added Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image suc
 | 
			
		||||
 | 
			
		||||
msg_info "Creating a Docker VM"
 | 
			
		||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
			
		||||
  -name $HN -tags proxmox-helper-scripts,debian12,docker -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
  -name $HN -tags community-script,debian12,docker -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
			
		||||
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
@@ -465,4 +479,5 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Docker VM"
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,9 @@
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -21,6 +24,13 @@ echo -e "\n Loading..."
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
VERSIONS=(stable beta dev)
 | 
			
		||||
#API VARIABLES
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="homeassistant-os"
 | 
			
		||||
var_os="homeassistant"
 | 
			
		||||
DISK_SIZE="32G"
 | 
			
		||||
#
 | 
			
		||||
for version in "${VERSIONS[@]}"; do
 | 
			
		||||
  eval "$version=$(curl -s https://raw.githubusercontent.com/home-assistant/version/master/$version.json | grep "ova" | cut -d '"' -f 4)"
 | 
			
		||||
done
 | 
			
		||||
@@ -41,6 +51,8 @@ SPINNER_PID=""
 | 
			
		||||
set -Eeuo pipefail
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
 | 
			
		||||
@@ -48,6 +60,7 @@ function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "${command}"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -167,6 +180,8 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  var_version="${stable}"
 | 
			
		||||
  echo -e "${DGN}Using HAOS Version: ${BGN}${BRANCH}${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
@@ -184,11 +199,13 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  if BRANCH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HAOS VERSION" --radiolist "Choose Version" --cancel-button Exit-Script 10 58 3 \
 | 
			
		||||
    "$stable" "Stable  " ON \
 | 
			
		||||
    "$beta" "Beta  " OFF \
 | 
			
		||||
    "$dev" "Dev  " OFF \
 | 
			
		||||
    3>&1 1>&2 2>&3); then
 | 
			
		||||
    var_version="${BRANCH}"
 | 
			
		||||
    echo -e "${DGN}Using HAOS Version: ${BGN}$BRANCH${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
@@ -376,6 +393,9 @@ pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
  TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
@@ -463,4 +483,7 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Home Assistant OS VM"
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,9 @@
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
    __  ____ __              __  _ __      ____              __            ____  _____    ________  ______
 | 
			
		||||
@@ -20,6 +23,14 @@ header_info
 | 
			
		||||
echo -e "Loading..."
 | 
			
		||||
GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
#API VARIABLES
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="mikrotik-router-os"
 | 
			
		||||
var_os="mikrotik"
 | 
			
		||||
var_version=" "
 | 
			
		||||
DISK_SIZE="1G"
 | 
			
		||||
#
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
HA=$(echo "\033[1;34m")
 | 
			
		||||
@@ -39,6 +50,8 @@ shopt -s expand_aliases
 | 
			
		||||
alias die='EXIT=$? LINE=$LINENO error_exit'
 | 
			
		||||
trap die ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_exit() {
 | 
			
		||||
  trap - ERR
 | 
			
		||||
  local reason="Unknown failure occurred."
 | 
			
		||||
@@ -86,6 +99,7 @@ function msg_ok() {
 | 
			
		||||
  echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
 | 
			
		||||
}
 | 
			
		||||
function default_settings() {
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}$NEXTID${CL}"
 | 
			
		||||
  VMID=$NEXTID
 | 
			
		||||
  echo -e "${DGN}Using Hostname: ${BGN}mikrotik-routeros-chr${CL}"
 | 
			
		||||
@@ -107,6 +121,7 @@ function default_settings() {
 | 
			
		||||
  echo -e "${BL}Creating a Mikrotik RouterOS CHR VM using the above default settings${CL}"
 | 
			
		||||
}
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" 3>&1 1>&2 2>&3)
 | 
			
		||||
  exitstatus=$?
 | 
			
		||||
  if [ $exitstatus = 0 ]; then
 | 
			
		||||
@@ -203,6 +218,8 @@ function start_script() {
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
start_script
 | 
			
		||||
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
  TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
@@ -287,4 +304,5 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Mikrotik RouterOS CHR VM"
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,8 @@
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -17,6 +19,14 @@ EOF
 | 
			
		||||
}
 | 
			
		||||
header_info
 | 
			
		||||
echo -e "\n Loading..."
 | 
			
		||||
#API VARIABLES
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="turnkey-nextcloud"
 | 
			
		||||
var_os="turnkey-nextcloud"
 | 
			
		||||
var_version=" "
 | 
			
		||||
DISK_SIZE="12G"
 | 
			
		||||
#
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
NAME="TurnKey Nexcloud VM"
 | 
			
		||||
@@ -36,10 +46,13 @@ THIN="discard=on,ssd=1"
 | 
			
		||||
set -e
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "${command}"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -142,6 +155,7 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="no"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
 | 
			
		||||
@@ -158,6 +172,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -340,6 +355,8 @@ pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
  TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
@@ -422,4 +439,5 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started $NAME"
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,8 @@
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Based on work from https://i12bretro.github.io/tutorials/0405.html
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -21,6 +23,14 @@ EOF
 | 
			
		||||
}
 | 
			
		||||
header_info
 | 
			
		||||
echo -e "Loading..."
 | 
			
		||||
#API VARIABLES
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="openwrt-vm"
 | 
			
		||||
var_os="openwrt"
 | 
			
		||||
var_version=" "
 | 
			
		||||
DISK_SIZE="0.5G"
 | 
			
		||||
#
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
@@ -39,10 +49,13 @@ CROSS="${RD}✗${CL}"
 | 
			
		||||
set -Eeo pipefail
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "$command"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -209,6 +222,7 @@ function default_settings() {
 | 
			
		||||
  LAN_VLAN=",tag=999"
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}"
 | 
			
		||||
  echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}"
 | 
			
		||||
@@ -227,6 +241,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -399,6 +414,7 @@ arch_check
 | 
			
		||||
pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
@@ -518,4 +534,5 @@ VLAN_FINISH=""
 | 
			
		||||
if [ "$VLAN" == "" ] && [ "$VLAN2" != "999" ]; then
 | 
			
		||||
  VLAN_FINISH=" Please remember to adjust the VLAN tags to suit your network."
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n${VLAN_FINISH}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										677
									
								
								vm/opnsense-vm.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										677
									
								
								vm/opnsense-vm.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,677 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<$(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF" 
 | 
			
		||||
   ____  ____  _   __                        
 | 
			
		||||
  / __ \/ __ \/ | / /_______  ____  ________ 
 | 
			
		||||
 / / / / /_/ /  |/ / ___/ _ \/ __ \/ ___/ _ \
 | 
			
		||||
/ /_/ / ____/ /|  (__  )  __/ / / (__  )  __/
 | 
			
		||||
\____/_/   /_/ |_/____/\___/_/ /_/____/\___/ 
 | 
			
		||||
                                                                         
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
header_info
 | 
			
		||||
echo -e "Loading..."
 | 
			
		||||
#API VARIABLES
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="opnsense-vm"
 | 
			
		||||
var_os="opnsense"
 | 
			
		||||
var_version="25.1"
 | 
			
		||||
#
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
HA=$(echo "\033[1;34m")
 | 
			
		||||
RD=$(echo "\033[01;31m")
 | 
			
		||||
BGN=$(echo "\033[4;92m")
 | 
			
		||||
GN=$(echo "\033[1;92m")
 | 
			
		||||
DGN=$(echo "\033[32m")
 | 
			
		||||
CL=$(echo "\033[m")
 | 
			
		||||
BFR="\\r\\033[K"
 | 
			
		||||
HOLD="-"
 | 
			
		||||
CM="${GN}✓${CL}"
 | 
			
		||||
CROSS="${RD}✗${CL}"
 | 
			
		||||
set -Eeo pipefail
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "$command"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function cleanup_vmid() {
 | 
			
		||||
  if qm status $VMID &>/dev/null; then
 | 
			
		||||
    qm stop $VMID &>/dev/null
 | 
			
		||||
    qm destroy $VMID &>/dev/null
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function cleanup() {
 | 
			
		||||
  popd >/dev/null
 | 
			
		||||
  post_update_to_api "done" "none"
 | 
			
		||||
  rm -rf $TEMP_DIR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEMP_DIR=$(mktemp -d)
 | 
			
		||||
pushd $TEMP_DIR >/dev/null
 | 
			
		||||
function send_line_to_vm() {
 | 
			
		||||
  echo -e "${DGN}Sending line: ${YW}$1${CL}"
 | 
			
		||||
  for ((i = 0; i < ${#1}; i++)); do
 | 
			
		||||
    character=${1:i:1}
 | 
			
		||||
    case $character in
 | 
			
		||||
    " ") character="spc" ;;
 | 
			
		||||
    "-") character="minus" ;;
 | 
			
		||||
    "=") character="equal" ;;
 | 
			
		||||
    ",") character="comma" ;;
 | 
			
		||||
    ".") character="dot" ;;
 | 
			
		||||
    "/") character="slash" ;;
 | 
			
		||||
    "'") character="apostrophe" ;;
 | 
			
		||||
    ";") character="semicolon" ;;
 | 
			
		||||
    '\') character="backslash" ;;
 | 
			
		||||
    '`') character="grave_accent" ;;
 | 
			
		||||
    "[") character="bracket_left" ;;
 | 
			
		||||
    "]") character="bracket_right" ;;
 | 
			
		||||
    "_") character="shift-minus" ;;
 | 
			
		||||
    "+") character="shift-equal" ;;
 | 
			
		||||
    "?") character="shift-slash" ;;
 | 
			
		||||
    "<") character="shift-comma" ;;
 | 
			
		||||
    ">") character="shift-dot" ;;
 | 
			
		||||
    '"') character="shift-apostrophe" ;;
 | 
			
		||||
    ":") character="shift-semicolon" ;;
 | 
			
		||||
    "|") character="shift-backslash" ;;
 | 
			
		||||
    "~") character="shift-grave_accent" ;;
 | 
			
		||||
    "{") character="shift-bracket_left" ;;
 | 
			
		||||
    "}") character="shift-bracket_right" ;;
 | 
			
		||||
    "A") character="shift-a" ;;
 | 
			
		||||
    "B") character="shift-b" ;;
 | 
			
		||||
    "C") character="shift-c" ;;
 | 
			
		||||
    "D") character="shift-d" ;;
 | 
			
		||||
    "E") character="shift-e" ;;
 | 
			
		||||
    "F") character="shift-f" ;;
 | 
			
		||||
    "G") character="shift-g" ;;
 | 
			
		||||
    "H") character="shift-h" ;;
 | 
			
		||||
    "I") character="shift-i" ;;
 | 
			
		||||
    "J") character="shift-j" ;;
 | 
			
		||||
    "K") character="shift-k" ;;
 | 
			
		||||
    "L") character="shift-l" ;;
 | 
			
		||||
    "M") character="shift-m" ;;
 | 
			
		||||
    "N") character="shift-n" ;;
 | 
			
		||||
    "O") character="shift-o" ;;
 | 
			
		||||
    "P") character="shift-p" ;;
 | 
			
		||||
    "Q") character="shift-q" ;;
 | 
			
		||||
    "R") character="shift-r" ;;
 | 
			
		||||
    "S") character="shift-s" ;;
 | 
			
		||||
    "T") character="shift-t" ;;
 | 
			
		||||
    "U") character="shift-u" ;;
 | 
			
		||||
    "V") character="shift-v" ;;
 | 
			
		||||
    "W") character="shift-w" ;;
 | 
			
		||||
    "X") character="shift=x" ;;
 | 
			
		||||
    "Y") character="shift-y" ;;
 | 
			
		||||
    "Z") character="shift-z" ;;
 | 
			
		||||
    "!") character="shift-1" ;;
 | 
			
		||||
    "@") character="shift-2" ;;
 | 
			
		||||
    "#") character="shift-3" ;;
 | 
			
		||||
    '$') character="shift-4" ;;
 | 
			
		||||
    "%") character="shift-5" ;;
 | 
			
		||||
    "^") character="shift-6" ;;
 | 
			
		||||
    "&") character="shift-7" ;;
 | 
			
		||||
    "*") character="shift-8" ;;
 | 
			
		||||
    "(") character="shift-9" ;;
 | 
			
		||||
    ")") character="shift-0" ;;
 | 
			
		||||
    esac
 | 
			
		||||
    qm sendkey $VMID "$character"
 | 
			
		||||
  done
 | 
			
		||||
  qm sendkey $VMID ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEMP_DIR=$(mktemp -d)
 | 
			
		||||
pushd $TEMP_DIR >/dev/null
 | 
			
		||||
 | 
			
		||||
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "OpnSense VM" --yesno "This will create a New OpnSense VM. Proceed?" 10 58); then
 | 
			
		||||
  :
 | 
			
		||||
else
 | 
			
		||||
  header_info && echo -e "⚠ User exited script \n" && exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne " ${HOLD} ${YW}${msg}..."
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function msg_ok() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function msg_error() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pve_check() {
 | 
			
		||||
  if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then
 | 
			
		||||
    msg_error "This version of Proxmox Virtual Environment is not supported"
 | 
			
		||||
    echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
 | 
			
		||||
    echo -e "Exiting..."
 | 
			
		||||
    sleep 2
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function arch_check() {
 | 
			
		||||
  if [ "$(dpkg --print-architecture)" != "amd64" ]; then
 | 
			
		||||
    echo -e "\n ${CROSS} This script will not work with PiMox! \n"
 | 
			
		||||
    echo -e "Exiting..."
 | 
			
		||||
    sleep 2
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function ssh_check() {
 | 
			
		||||
  if command -v pveversion >/dev/null 2>&1; then
 | 
			
		||||
    if [ -n "${SSH_CLIENT:+x}" ]; then
 | 
			
		||||
      if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then
 | 
			
		||||
        echo "you've been warned"
 | 
			
		||||
      else
 | 
			
		||||
        clear
 | 
			
		||||
        exit
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function exit-script() {
 | 
			
		||||
  clear
 | 
			
		||||
  echo -e "⚠  User exited script \n"
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function default_settings() {
 | 
			
		||||
  VMID="$NEXTID"
 | 
			
		||||
  FORMAT=",efitype=4m"
 | 
			
		||||
  MACHINE=""
 | 
			
		||||
  DISK_CACHE=""
 | 
			
		||||
  HN="opnsense"
 | 
			
		||||
  CPU_TYPE=""
 | 
			
		||||
  CORE_COUNT="4"
 | 
			
		||||
  RAM_SIZE="8192"
 | 
			
		||||
  BRG="vmbr0"
 | 
			
		||||
  IP_ADDR=""
 | 
			
		||||
  WAN_IP_ADDR=""
 | 
			
		||||
  LAN_GW=""
 | 
			
		||||
  WAN_GW=""
 | 
			
		||||
  NETMASK=""
 | 
			
		||||
  WAN_NETMASK=""
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MAC=$GEN_MAC
 | 
			
		||||
  WAN_MAC=$GEN_MAC_LAN
 | 
			
		||||
  WAN_BRG="vmbr1"
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
 | 
			
		||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}"
 | 
			
		||||
  echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}"
 | 
			
		||||
  echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}"
 | 
			
		||||
  if ! grep -q "^iface ${BRG}" /etc/network/interfaces; then
 | 
			
		||||
  msg_error "Bridge '${BRG}' does not exist in /etc/network/interfaces"
 | 
			
		||||
  exit
 | 
			
		||||
  else
 | 
			
		||||
    echo -e "${DGN}Using LAN Bridge: ${BGN}${BRG}${CL}"
 | 
			
		||||
  fi
 | 
			
		||||
  echo -e "${DGN}Using LAN VLAN: ${BGN}Default${CL}"
 | 
			
		||||
  echo -e "${DGN}Using LAN MAC Address: ${BGN}${MAC}${CL}"
 | 
			
		||||
  echo -e "${DGN}Using WAN MAC Address: ${BGN}${WAN_MAC}${CL}"
 | 
			
		||||
  if ! grep -q "^iface ${WAN_BRG}" /etc/network/interfaces; then
 | 
			
		||||
    msg_error "Bridge '${WAN_BRG}' does not exist in /etc/network/interfaces"
 | 
			
		||||
    exit
 | 
			
		||||
  else
 | 
			
		||||
    echo -e "${DGN}Using WAN Bridge: ${BGN}${WAN_BRG}${CL}"
 | 
			
		||||
  fi
 | 
			
		||||
  echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
 | 
			
		||||
  echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}"
 | 
			
		||||
  echo -e "${BL}Creating a OpnSense VM using the above default settings${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  local ip_regex='^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$'
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
        VMID="$NEXTID"
 | 
			
		||||
      fi
 | 
			
		||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
			
		||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
			
		||||
        sleep 2
 | 
			
		||||
        continue
 | 
			
		||||
      fi
 | 
			
		||||
      echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}"
 | 
			
		||||
      break
 | 
			
		||||
    else
 | 
			
		||||
      exit-script
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \
 | 
			
		||||
    "i440fx" "Machine i440fx" ON \
 | 
			
		||||
    "q35" "Machine q35" OFF \
 | 
			
		||||
    3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ $MACH = q35 ]; then
 | 
			
		||||
      echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}"
 | 
			
		||||
      FORMAT=""
 | 
			
		||||
      MACHINE=" -machine q35"
 | 
			
		||||
    else
 | 
			
		||||
      echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}"
 | 
			
		||||
      FORMAT=",efitype=4m"
 | 
			
		||||
      MACHINE=""
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
 | 
			
		||||
    "0" "KVM64 (Default)" ON \
 | 
			
		||||
    "1" "Host" OFF \
 | 
			
		||||
    3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ $CPU_TYPE1 = "1" ]; then
 | 
			
		||||
      echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}"
 | 
			
		||||
      CPU_TYPE=" -cpu host"
 | 
			
		||||
    else
 | 
			
		||||
      echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}"
 | 
			
		||||
      CPU_TYPE=""
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
 | 
			
		||||
    "0" "None (Default)" ON \
 | 
			
		||||
    "1" "Write Through" OFF \
 | 
			
		||||
    3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ $DISK_CACHE = "1" ]; then
 | 
			
		||||
      echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}"
 | 
			
		||||
      DISK_CACHE="cache=writethrough,"
 | 
			
		||||
    else
 | 
			
		||||
      echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
 | 
			
		||||
      DISK_CACHE=""
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 OpnSense --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $VM_NAME ]; then
 | 
			
		||||
      HN="OpnSense"
 | 
			
		||||
    else
 | 
			
		||||
      HN=$(echo ${VM_NAME,,} | tr -d ' ')
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 4 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $CORE_COUNT ]; then
 | 
			
		||||
      CORE_COUNT="2"
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 8192 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $RAM_SIZE ]; then
 | 
			
		||||
      RAM_SIZE="8192"
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN Bridge" 8 58 vmbr0 --title "LAN BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $BRG ]; then
 | 
			
		||||
      BRG="vmbr0"
 | 
			
		||||
    fi
 | 
			
		||||
    if ! grep -q "^iface ${BRG}" /etc/network/interfaces; then
 | 
			
		||||
      msg_error "Bridge '${BRG}' does not exist in /etc/network/interfaces"
 | 
			
		||||
      exit
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${DGN}Using LAN Bridge: ${BGN}$BRG${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if IP_ADDR=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN IP" 8 58 $IP_ADDR --title "LAN IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $IP_ADDR ]; then
 | 
			
		||||
      echo -e "${DGN}Using DHCP AS LAN IP ADDRESS${CL}"
 | 
			
		||||
    else
 | 
			
		||||
      if [[ -n "$IP_ADDR" && ! "$IP_ADDR" =~ $ip_regex ]]; then
 | 
			
		||||
        msg_error "Invalid IP Address format for LAN IP. Needs to be 0.0.0.0, was $IP_ADDR"
 | 
			
		||||
        exit
 | 
			
		||||
      fi
 | 
			
		||||
      echo -e "${DGN}Using LAN IP ADDRESS: ${BGN}$IP_ADDR${CL}"
 | 
			
		||||
      if LAN_GW=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN GATEWAY IP" 8 58 $LAN_GW --title "LAN GATEWAY IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
        if [ -z $LAN_GW ]; then
 | 
			
		||||
          echo -e "${DGN}Gateway needs to be set if ip is not dhcp${CL}"
 | 
			
		||||
          exit-script
 | 
			
		||||
        fi
 | 
			
		||||
        if [[ -n "$LAN_GW" && ! "$LAN_GW" =~ $ip_regex ]]; then
 | 
			
		||||
          msg_error "Invalid IP Address format for Gateway. Needs to be 0.0.0.0, was $LAN_GW"
 | 
			
		||||
          exit
 | 
			
		||||
        fi
 | 
			
		||||
        echo -e "${DGN}Using LAN GATEWAY ADDRESS: ${BGN}$LAN_GW${CL}"
 | 
			
		||||
      fi
 | 
			
		||||
      if NETMASK=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN netmmask (24 for example)" 8 58 $NETMASK --title "LAN NETMASK" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
        if [ -z $NETMASK ]; then
 | 
			
		||||
          echo -e "${DGN}Netmask needs to be set if ip is not dhcp${CL}"
 | 
			
		||||
        fi
 | 
			
		||||
        if [[ -n "$NETMASK" && ! ("$NETMASK" =~ ^[0-9]+$ && "$NETMASK" -ge 1 && "$NETMASK" -le 32) ]]; then
 | 
			
		||||
          msg_error "Invalid LAN NETMASK format. Needs to be 1-32, was $NETMASK"
 | 
			
		||||
          exit
 | 
			
		||||
        fi
 | 
			
		||||
        echo -e "${DGN}Using LAN NETMASK: ${BGN}$NETMASK${CL}"
 | 
			
		||||
      else
 | 
			
		||||
        exit-script
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if WAN_BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN Bridge" 8 58 vmbr1 --title "WAN BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $WAN_BRG ]; then
 | 
			
		||||
      WAN_BRG="vmbr1"
 | 
			
		||||
    fi
 | 
			
		||||
    if ! grep -q "^iface ${WAN_BRG}" /etc/network/interfaces; then
 | 
			
		||||
      msg_error "WAN Bridge '${WAN_BRG}' does not exist in /etc/network/interfaces"
 | 
			
		||||
      exit
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${DGN}Using WAN Bridge: ${BGN}$WAN_BRG${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if WAN_IP_ADDR=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN IP" 8 58 $WAN_IP_ADDR --title "WAN IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $WAN_IP_ADDR ]; then
 | 
			
		||||
      echo -e "${DGN}Using DHCP AS WAN IP ADDRESS${CL}"
 | 
			
		||||
    else
 | 
			
		||||
      if [[ -n "$WAN_IP_ADDR" && ! "$WAN_IP_ADDR" =~ $ip_regex ]]; then
 | 
			
		||||
        msg_error "Invalid IP Address format for WAN IP. Needs to be 0.0.0.0, was $WAN_IP_ADDR"
 | 
			
		||||
        exit
 | 
			
		||||
      fi
 | 
			
		||||
      echo -e "${DGN}Using WAN IP ADDRESS: ${BGN}$WAN_IP_ADDR${CL}"
 | 
			
		||||
      if WAN_GW=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN GATEWAY IP" 8 58 $WAN_GW --title "WAN GATEWAY IP ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
        if [ -z $WAN_GW ]; then
 | 
			
		||||
          echo -e "${DGN}Gateway needs to be set if ip is not dhcp${CL}"
 | 
			
		||||
          exit-script
 | 
			
		||||
        fi
 | 
			
		||||
        if [[ -n "$WAN_GW" && ! "$WAN_GW" =~ $ip_regex ]]; then
 | 
			
		||||
          msg_error "Invalid IP Address format for WAN Gateway. Needs to be 0.0.0.0, was $WAN_GW"
 | 
			
		||||
          exit
 | 
			
		||||
        fi
 | 
			
		||||
        echo -e "${DGN}Using WAN GATEWAY ADDRESS: ${BGN}$WAN_GW${CL}"
 | 
			
		||||
      else
 | 
			
		||||
        exit-script
 | 
			
		||||
      fi
 | 
			
		||||
      if WAN_NETMASK=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN netmmask (24 for example)" 8 58 $WAN_NETMASK --title "WAN NETMASK" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
        if [ -z $WAN_NETMASK ]; then
 | 
			
		||||
          echo -e "${DGN}WAN Netmask needs to be set if ip is not dhcp${CL}"
 | 
			
		||||
        fi
 | 
			
		||||
        if [[ -n "$WAN_NETMASK" && ! ("$WAN_NETMASK" =~ ^[0-9]+$ && "$WAN_NETMASK" -ge 1 && "$WAN_NETMASK" -le 32) ]]; then
 | 
			
		||||
          msg_error "Invalid WAN NETMASK format. Needs to be 1-32, was $WAN_NETMASK"
 | 
			
		||||
          exit
 | 
			
		||||
        fi
 | 
			
		||||
        echo -e "${DGN}Using WAN NETMASK: ${BGN}$WAN_NETMASK${CL}"
 | 
			
		||||
      else
 | 
			
		||||
        exit-script
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
  if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a WAN MAC Address" 8 58 $GEN_MAC --title "WAN MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $MAC1 ]; then
 | 
			
		||||
      MAC="$GEN_MAC"
 | 
			
		||||
    else
 | 
			
		||||
      MAC="$MAC1"
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${DGN}Using LAN MAC Address: ${BGN}$MAC${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if MAC2=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a LAN MAC Address" 8 58 $GEN_MAC_LAN --title "LAN MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ -z $MAC2 ]; then
 | 
			
		||||
      WAN_MAC="$GEN_MAC_LAN"
 | 
			
		||||
    else
 | 
			
		||||
      WAN_MAC="$MAC2"
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${DGN}Using WAN MAC Address: ${BGN}$WAN_MAC${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create OpnSense VM?" --no-button Do-Over 10 58); then
 | 
			
		||||
    echo -e "${RD}Creating a OpnSense VM using the above advanced settings${CL}"
 | 
			
		||||
  else
 | 
			
		||||
    header_info
 | 
			
		||||
    echo -e "${RD}Using Advanced Settings${CL}"
 | 
			
		||||
    advanced_settings
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function start_script() {
 | 
			
		||||
  if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
 | 
			
		||||
    header_info
 | 
			
		||||
    echo -e "${BL}Using Default Settings${CL}"
 | 
			
		||||
    default_settings
 | 
			
		||||
  else
 | 
			
		||||
    header_info
 | 
			
		||||
    echo -e "${RD}Using Advanced Settings${CL}"
 | 
			
		||||
    advanced_settings
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
arch_check
 | 
			
		||||
pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
  TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
  TYPE=$(echo $line | awk '{printf "%-10s", $2}')
 | 
			
		||||
  FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}')
 | 
			
		||||
  ITEM="  Type: $TYPE Free: $FREE "
 | 
			
		||||
  OFFSET=2
 | 
			
		||||
  if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
 | 
			
		||||
    MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
 | 
			
		||||
  fi
 | 
			
		||||
  STORAGE_MENU+=("$TAG" "$ITEM" "OFF")
 | 
			
		||||
done < <(pvesm status -content images | awk 'NR>1')
 | 
			
		||||
VALID=$(pvesm status -content images | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALID" ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid storage location."
 | 
			
		||||
  exit
 | 
			
		||||
elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then
 | 
			
		||||
  STORAGE=${STORAGE_MENU[0]}
 | 
			
		||||
else
 | 
			
		||||
  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 ${HN}?\nTo make a selection, use the Spacebar.\n" \
 | 
			
		||||
      16 $(($MSG_MAX_LENGTH + 23)) 6 \
 | 
			
		||||
      "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit
 | 
			
		||||
  done
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location."
 | 
			
		||||
msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
 | 
			
		||||
msg_info "Retrieving the URL for the OpnSense Qcow2 Disk Image"
 | 
			
		||||
URL=https://download.freebsd.org/releases/VM-IMAGES/14.2-RELEASE/amd64/Latest/FreeBSD-14.2-RELEASE-amd64.qcow2.xz
 | 
			
		||||
sleep 2
 | 
			
		||||
msg_ok "${CL}${BL}${URL}${CL}"
 | 
			
		||||
wget -q --show-progress $URL
 | 
			
		||||
echo -en "\e[1A\e[0K"
 | 
			
		||||
FILE=Fressbsd.qcow2
 | 
			
		||||
unxz -cv $(basename $URL) > ${FILE}
 | 
			
		||||
msg_ok "Downloaded ${CL}${BL}${FILE}${CL}"
 | 
			
		||||
 | 
			
		||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}')
 | 
			
		||||
case $STORAGE_TYPE in
 | 
			
		||||
nfs | dir)
 | 
			
		||||
  DISK_EXT=".qcow2"
 | 
			
		||||
  DISK_REF="$VMID/"
 | 
			
		||||
  DISK_IMPORT="-format qcow2"
 | 
			
		||||
  THIN=""
 | 
			
		||||
  ;;
 | 
			
		||||
btrfs)
 | 
			
		||||
  DISK_EXT=".raw"
 | 
			
		||||
  DISK_REF="$VMID/"
 | 
			
		||||
  DISK_IMPORT="-format raw"
 | 
			
		||||
  FORMAT=",efitype=4m"
 | 
			
		||||
  THIN=""
 | 
			
		||||
  ;;
 | 
			
		||||
esac
 | 
			
		||||
for i in {0,1}; do
 | 
			
		||||
  disk="DISK$i"
 | 
			
		||||
  eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-}
 | 
			
		||||
  eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk}
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
msg_info "Creating a OpnSense VM"
 | 
			
		||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
			
		||||
  -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
			
		||||
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
  -efidisk0 ${DISK0_REF}${FORMAT} \
 | 
			
		||||
  -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \
 | 
			
		||||
  -boot order=scsi0 \
 | 
			
		||||
  -serial0 socket >/dev/null \
 | 
			
		||||
  -tags community-scripts
 | 
			
		||||
qm resize $VMID scsi0 10G >/dev/null
 | 
			
		||||
  DESCRIPTION=$(cat <<EOF
 | 
			
		||||
<div align='center'>
 | 
			
		||||
  <a href='https://Helper-Scripts.com' target='_blank' rel='noopener noreferrer'>
 | 
			
		||||
    <img src='https://raw.githubusercontent.com/michelroegl-brunner/ProxmoxVE/refs/heads/develop/misc/images/logo-81x112.png' alt='Logo' style='width:81px;height:112px;'/>
 | 
			
		||||
  </a>
 | 
			
		||||
 | 
			
		||||
  <h2 style='font-size: 24px; margin: 20px 0;'>OpnSense VM</h2>
 | 
			
		||||
 | 
			
		||||
  <p style='margin: 16px 0;'>
 | 
			
		||||
    <a href='https://ko-fi.com/community_scripts' target='_blank' rel='noopener noreferrer'>
 | 
			
		||||
      <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' />
 | 
			
		||||
    </a>
 | 
			
		||||
  </p>
 | 
			
		||||
  
 | 
			
		||||
  <span style='margin: 0 10px;'>
 | 
			
		||||
    <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i>
 | 
			
		||||
    <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a>
 | 
			
		||||
  </span>
 | 
			
		||||
  <span style='margin: 0 10px;'>
 | 
			
		||||
    <i class="fa fa-comments fa-fw" style="color: #f5f5f5;"></i>
 | 
			
		||||
    <a href='https://github.com/community-scripts/ProxmoxVE/discussions' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Discussions</a>
 | 
			
		||||
  </span>
 | 
			
		||||
  <span style='margin: 0 10px;'>
 | 
			
		||||
    <i class="fa fa-exclamation-circle fa-fw" style="color: #f5f5f5;"></i>
 | 
			
		||||
    <a href='https://github.com/community-scripts/ProxmoxVE/issues' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>Issues</a>
 | 
			
		||||
  </span>
 | 
			
		||||
</div>
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
  qm set "$VMID" -description "$DESCRIPTION" >/dev/null  
 | 
			
		||||
 | 
			
		||||
msg_info "Bridge interfaces are being added."
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
  -net0 virtio,bridge=${BRG},macaddr=${MAC}${VLAN}${MTU} 2>/dev/null
 | 
			
		||||
msg_ok "Bridge interfaces have been successfully added."
 | 
			
		||||
  
 | 
			
		||||
msg_ok "Created a OpnSense VM ${CL}${BL}(${HN})"
 | 
			
		||||
  msg_ok "Starting OpnSense VM (Patience this takes 20-30 minutes)"
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  sleep 90
 | 
			
		||||
  send_line_to_vm "root"
 | 
			
		||||
  send_line_to_vm "fetch https://raw.githubusercontent.com/opnsense/update/master/src/bootstrap/opnsense-bootstrap.sh.in"
 | 
			
		||||
  qm set $VMID \
 | 
			
		||||
    -net1 virtio,bridge=${WAN_BRG},macaddr=${WAN_MAC} &>/dev/null
 | 
			
		||||
  sleep 10
 | 
			
		||||
  send_line_to_vm "sh ./opnsense-bootstrap.sh.in -y -f -r 25.1"
 | 
			
		||||
  msg_ok "OpnSense VM is being installed, do not close the terminal, or the installation will fail."
 | 
			
		||||
  #We need to wait for the OpnSense build proccess to finish, this takes a few minutes
 | 
			
		||||
  sleep 1000
 | 
			
		||||
  send_line_to_vm "root"
 | 
			
		||||
  send_line_to_vm "opnsense"
 | 
			
		||||
  send_line_to_vm "2"
 | 
			
		||||
 | 
			
		||||
  if [ "$IP_ADDR" != "" ]; then
 | 
			
		||||
    send_line_to_vm "1"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "${IP_ADDR}"
 | 
			
		||||
    send_line_to_vm "${NETMASK}"
 | 
			
		||||
    send_line_to_vm "${LAN_GW}"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm " "
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm " "
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n"    
 | 
			
		||||
  else
 | 
			
		||||
    send_line_to_vm "1"
 | 
			
		||||
    send_line_to_vm "y"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n"  
 | 
			
		||||
    send_line_to_vm " "
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n"   
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
  fi
 | 
			
		||||
  #we need to wait for the Config changes to be saved
 | 
			
		||||
  sleep 20
 | 
			
		||||
  if [ "$WAN_IP_ADDR" != "" ]; then
 | 
			
		||||
    send_line_to_vm "2"
 | 
			
		||||
    send_line_to_vm "2"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "${WAN_IP_ADDR}"
 | 
			
		||||
    send_line_to_vm "${NETMASK}"
 | 
			
		||||
    send_line_to_vm "${LAN_GW}"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm " "
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm " "
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n"
 | 
			
		||||
    send_line_to_vm "n" 
 | 
			
		||||
  fi
 | 
			
		||||
  sleep 10
 | 
			
		||||
  send_line_to_vm "0"
 | 
			
		||||
  msg_ok "Started OpnSense VM"
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
if [ "$IP_ADDR" != "" ]; then
 | 
			
		||||
  echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
  echo -e "${TAB}${GATEWAY}${BGN}http://${IP_ADDR}${CL}"
 | 
			
		||||
else
 | 
			
		||||
  echo -e "${INFO}${YW} LAN IP was DHCP.${CL}"
 | 
			
		||||
  echo -e "${INFO}${BGN}To find the IP login to the VM shell${CL}"
 | 
			
		||||
fi
 | 
			
		||||
@@ -5,6 +5,8 @@
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -17,6 +19,14 @@ EOF
 | 
			
		||||
}
 | 
			
		||||
header_info
 | 
			
		||||
echo -e "\n Loading..."
 | 
			
		||||
#API VARIABLES
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="turnkey-owncloud-vm"
 | 
			
		||||
var_os="owncloud"
 | 
			
		||||
var_version="12"
 | 
			
		||||
DISK_SIZE="12G"
 | 
			
		||||
#
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
NAME="TurnKey ownCloud VM"
 | 
			
		||||
@@ -36,10 +46,13 @@ THIN="discard=on,ssd=1"
 | 
			
		||||
set -e
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "$command"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -142,6 +155,7 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="no"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
 | 
			
		||||
@@ -158,6 +172,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -340,6 +355,8 @@ pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
  TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
@@ -422,4 +439,5 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started $NAME"
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,8 @@
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
                                      ____  _ __  ___                                        
 | 
			
		||||
@@ -22,6 +24,14 @@ EOF
 | 
			
		||||
clear
 | 
			
		||||
header_info
 | 
			
		||||
echo -e "Loading..."
 | 
			
		||||
#API VARIABLES
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="pimox-haos-vm"
 | 
			
		||||
var_os="pimox-haos"
 | 
			
		||||
var_version=" "
 | 
			
		||||
DISK_SIZE="32G"
 | 
			
		||||
#
 | 
			
		||||
GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]')
 | 
			
		||||
USEDID=$(pvesh get /cluster/resources --type vm --output-format yaml | egrep -i 'vmid' | awk '{print substr($2, 1, length($2)-0) }')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
@@ -48,11 +58,14 @@ shopt -s expand_aliases
 | 
			
		||||
alias die='EXIT=$? LINE=$LINENO error_exit'
 | 
			
		||||
trap die ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_exit() {
 | 
			
		||||
  trap - ERR
 | 
			
		||||
  local reason="Unknown failure occurred."
 | 
			
		||||
  local msg="${1:-$reason}"
 | 
			
		||||
  local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE"
 | 
			
		||||
  post_update_to_api "failed" "unknown"
 | 
			
		||||
  echo -e "$flag $msg" 1>&2
 | 
			
		||||
  [ ! -z ${VMID-} ] && cleanup_vmid
 | 
			
		||||
  exit $EXIT
 | 
			
		||||
@@ -106,6 +119,7 @@ function msg_error() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function default_settings() {
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${DGN}Using HAOS Version: ${BGN}${STABLE}${CL}"
 | 
			
		||||
  BRANCH=${STABLE}
 | 
			
		||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}$NEXTID${CL}"
 | 
			
		||||
@@ -129,6 +143,7 @@ function default_settings() {
 | 
			
		||||
  echo -e "${BL}Creating a HAOS VM using the above default settings${CL}"
 | 
			
		||||
}
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  BRANCH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "HAOS VERSION" --radiolist "Choose Version" --cancel-button Exit-Script 10 58 3 \
 | 
			
		||||
    "$STABLE" "Stable" ON \
 | 
			
		||||
    "$BETA" "Beta" OFF \
 | 
			
		||||
@@ -250,6 +265,7 @@ function START_SCRIPT() {
 | 
			
		||||
}
 | 
			
		||||
ARCH_CHECK
 | 
			
		||||
START_SCRIPT
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
while read -r line; do
 | 
			
		||||
  TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
  TYPE=$(echo $line | awk '{printf "%-10s", $2}')
 | 
			
		||||
@@ -322,4 +338,5 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Home Assistant OS VM"
 | 
			
		||||
fi
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,8 @@
 | 
			
		||||
# Author: MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -19,6 +21,11 @@ header_info
 | 
			
		||||
echo -e "\n Loading..."
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="ubuntu-2204-vm"
 | 
			
		||||
var_os="ubuntu"
 | 
			
		||||
var_version="2204"
 | 
			
		||||
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
@@ -56,10 +63,13 @@ THIN="discard=on,ssd=1,"
 | 
			
		||||
set -e
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "$command"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -111,7 +121,7 @@ function check_root() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pve_check() {
 | 
			
		||||
  if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
 if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
    msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
 | 
			
		||||
    echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
 | 
			
		||||
    echo -e "Exiting..."
 | 
			
		||||
@@ -164,6 +174,7 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
 | 
			
		||||
@@ -181,6 +192,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -377,6 +389,7 @@ arch_check
 | 
			
		||||
pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
@@ -439,7 +452,7 @@ done
 | 
			
		||||
 | 
			
		||||
msg_info "Creating a Ubuntu 22.04 VM"
 | 
			
		||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
			
		||||
  -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
  -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
			
		||||
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
@@ -493,7 +506,7 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Ubuntu 22.04 VM"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "Setup Cloud-Init before starting \n
 | 
			
		||||
More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n"
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,8 @@
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -20,6 +22,11 @@ header_info
 | 
			
		||||
echo -e "\n Loading..."
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="ubuntu-2404-vm"
 | 
			
		||||
var_os="ubuntu"
 | 
			
		||||
var_version="2404"
 | 
			
		||||
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")		   
 | 
			
		||||
@@ -57,10 +64,13 @@ THIN="discard=on,ssd=1,"
 | 
			
		||||
set -e
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "$command"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -112,7 +122,7 @@ function check_root() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pve_check() {
 | 
			
		||||
  if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
 if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
    msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
 | 
			
		||||
    echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
 | 
			
		||||
    echo -e "Exiting..."
 | 
			
		||||
@@ -165,6 +175,7 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
 | 
			
		||||
@@ -182,6 +193,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -377,6 +389,7 @@ arch_check
 | 
			
		||||
pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
@@ -439,7 +452,7 @@ done
 | 
			
		||||
 | 
			
		||||
msg_info "Creating a Ubuntu 24.04 VM"
 | 
			
		||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
			
		||||
  -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
  -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
			
		||||
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
@@ -493,7 +506,7 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Ubuntu 24.04 VM"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
post_update_to_api "done" "none"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "Setup Cloud-Init before starting \n
 | 
			
		||||
More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n"
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,8 @@
 | 
			
		||||
# Author: MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< $(wget -qLO - https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
@@ -19,6 +21,11 @@ header_info
 | 
			
		||||
echo -e "\n Loading..."
 | 
			
		||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
			
		||||
METHOD=""
 | 
			
		||||
NSAPP="ubuntu-2410-vm"
 | 
			
		||||
var_os="ubuntu"
 | 
			
		||||
var_version="2410"
 | 
			
		||||
 | 
			
		||||
YW=$(echo "\033[33m")
 | 
			
		||||
BL=$(echo "\033[36m")
 | 
			
		||||
@@ -56,10 +63,13 @@ THIN="discard=on,ssd=1,"
 | 
			
		||||
set -e
 | 
			
		||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT 
 | 
			
		||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
			
		||||
function error_handler() {
 | 
			
		||||
  local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  post_update_to_api "failed" "$command"
 | 
			
		||||
  local error_message="${RD}[ERROR]${CL} in line ${RD}$line_number${CL}: exit code ${RD}$exit_code${CL}: while executing command ${YW}$command${CL}"
 | 
			
		||||
  echo -e "\n$error_message\n"
 | 
			
		||||
  cleanup_vmid
 | 
			
		||||
@@ -111,7 +121,7 @@ function check_root() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pve_check() {
 | 
			
		||||
  if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
 if ! pveversion | grep -Eq "pve-manager/8\.[1-3](\.[0-9]+)*"; then
 | 
			
		||||
    msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
 | 
			
		||||
    echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
 | 
			
		||||
    echo -e "Exiting..."
 | 
			
		||||
@@ -164,6 +174,7 @@ function default_settings() {
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  MTU=""
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
 | 
			
		||||
@@ -181,6 +192,7 @@ function default_settings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function advanced_settings() {
 | 
			
		||||
  METHOD="advanced"
 | 
			
		||||
  while true; do
 | 
			
		||||
    if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
			
		||||
      if [ -z "$VMID" ]; then
 | 
			
		||||
@@ -377,6 +389,7 @@ arch_check
 | 
			
		||||
pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
@@ -439,7 +452,7 @@ done
 | 
			
		||||
 | 
			
		||||
msg_info "Creating a Ubuntu 24.10 VM"
 | 
			
		||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
			
		||||
  -name $HN -tags proxmox-helper-scripts -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
  -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
			
		||||
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
@@ -493,7 +506,7 @@ if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
  msg_ok "Started Ubuntu 24.10 VM"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
post_update_to_api "done" "none"s
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "Setup Cloud-Init before starting \n
 | 
			
		||||
More info at https://github.com/community-scripts/ProxmoxVE/discussions/272 \n"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user