mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 02:12:49 +00:00 
			
		
		
		
	Compare commits
	
		
			134 Commits
		
	
	
		
			2025-02-09
			...
			2025-02-12
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					3b905f29ef | ||
| 
						 | 
					f2512b032f | ||
| 
						 | 
					29d3073539 | ||
| 
						 | 
					2a91a5d2e9 | ||
| 
						 | 
					2492497417 | ||
| 
						 | 
					dc3a0eca69 | ||
| 
						 | 
					d5714eb749 | ||
| 
						 | 
					bd90b30300 | ||
| 
						 | 
					5946079f47 | ||
| 
						 | 
					72b546e945 | ||
| 
						 | 
					65f8495a12 | ||
| 
						 | 
					ab64e7e013 | ||
| 
						 | 
					80053c1cc3 | ||
| 
						 | 
					067c962baf | ||
| 
						 | 
					e5c6953e98 | ||
| 
						 | 
					03d8d095cc | ||
| 
						 | 
					22f44d117a | ||
| 
						 | 
					417d4089d7 | ||
| 
						 | 
					c892401218 | ||
| 
						 | 
					3483ea7025 | ||
| 
						 | 
					9ec1b651cd | ||
| 
						 | 
					f06b37f180 | ||
| 
						 | 
					ca01015586 | ||
| 
						 | 
					362b5cd031 | ||
| 
						 | 
					64e9eac80f | ||
| 
						 | 
					e4c2485823 | ||
| 
						 | 
					a5f77f23e9 | ||
| 
						 | 
					0f7ff181df | ||
| 
						 | 
					1788551393 | ||
| 
						 | 
					1c9d23713d | ||
| 
						 | 
					3f779e14fa | ||
| 
						 | 
					58eff8c4cb | ||
| 
						 | 
					6c495bcafc | ||
| 
						 | 
					6de6b1542c | ||
| 
						 | 
					62425bc514 | ||
| 
						 | 
					8cf1c2969b | ||
| 
						 | 
					5d56822d1b | ||
| 
						 | 
					c014bc200e | ||
| 
						 | 
					56de05a392 | ||
| 
						 | 
					76ca5181ae | ||
| 
						 | 
					8181518c24 | ||
| 
						 | 
					ba636ed25d | ||
| 
						 | 
					e797cba504 | ||
| 
						 | 
					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 | 
							
								
								
									
										2
									
								
								.github/CONTRIBUTOR_GUIDE/ct/AppName.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/CONTRIBUTOR_GUIDE/ct/AppName.sh
									
									
									
									
										vendored
									
									
								
							@@ -46,8 +46,6 @@ function update_script() {
 | 
			
		||||
    # Crawling the new version and checking whether an update is required
 | 
			
		||||
    RELEASE=$(curl -fsSL [RELEASE_URL] | [PARSE_RELEASE_COMMAND])
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
        msg_info "Updating $APP"
 | 
			
		||||
 | 
			
		||||
        # Stopping Services
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop [SERVICE_NAME]
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,6 @@ body:
 | 
			
		||||
        required: true
 | 
			
		||||
      - label: "I have searched existing [discussions](https://github.com/community-scripts/ProxmoxVE/discussions?discussions_q=) and found no duplicate requests."
 | 
			
		||||
        required: true
 | 
			
		||||
      - label: "This is not a game-related request."
 | 
			
		||||
        required: true
 | 
			
		||||
- type: markdown
 | 
			
		||||
  attributes:
 | 
			
		||||
    value: "Thanks for submitting your request! The team will review it and reach out if we need more information."
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								.github/autolabeler-config.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/autolabeler-config.json
									
									
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": "modified",
 | 
			
		||||
      "includeGlobs": ["ct/**", "install/**", "misc/**", "turnkey/**", "vm/**"],
 | 
			
		||||
      "excludeGlobs": ["misc/build.func", "misc/install.func"]
 | 
			
		||||
      "excludeGlobs": ["misc/build.func", "misc/install.func", "misc/api.func"]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "delete script": [
 | 
			
		||||
@@ -51,13 +51,20 @@
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["*.md", ".github/**", "misc/*.func", "ct/create_lxc.sh"],
 | 
			
		||||
      "excludeGlobs": ["misc/api.func"]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
   "api": [
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["api/**", "misc/api.func"],
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "high risk": [
 | 
			
		||||
    {
 | 
			
		||||
      "fileStatus": null,
 | 
			
		||||
      "includeGlobs": ["misc/build.func", "misc/install.func"],
 | 
			
		||||
      "includeGlobs": ["misc/build.func", "misc/install.func", "ct/create_lxc.sh"],
 | 
			
		||||
      "excludeGlobs": []
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								.github/changelog-pr-config.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								.github/changelog-pr-config.json
									
									
									
									
										vendored
									
									
								
							@@ -1,30 +1,34 @@
 | 
			
		||||
[
 | 
			
		||||
    {
 | 
			
		||||
        "title": "💥 Breaking Changes",
 | 
			
		||||
        "labels": ["breaking change"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "✨ New Scripts",
 | 
			
		||||
        "labels": ["new script"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🚀 Updated Scripts",
 | 
			
		||||
        "labels": ["update script"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🌐 Website",
 | 
			
		||||
        "labels": ["website"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🐞 Bug Fixes",
 | 
			
		||||
        "labels": ["bug fix"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "🧰 Maintenance",
 | 
			
		||||
        "labels": ["maintenance"]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "title": "❔ Unlabelled",
 | 
			
		||||
        "labels": []
 | 
			
		||||
    }
 | 
			
		||||
  {
 | 
			
		||||
      "title": "💥 Breaking Changes",
 | 
			
		||||
      "labels": ["breaking change"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "✨ New Scripts",
 | 
			
		||||
      "labels": ["new script"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🚀 Updated Scripts",
 | 
			
		||||
      "labels": ["update script"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🌐 Website",
 | 
			
		||||
      "labels": ["website"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🐞 Bug Fixes",
 | 
			
		||||
      "labels": ["bug fix"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "🧰 Maintenance",
 | 
			
		||||
      "labels": ["maintenance"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "📡 API",
 | 
			
		||||
      "labels": ["api"]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
      "title": "❔ Unlabelled",
 | 
			
		||||
      "labels": []
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							@@ -1,28 +1,25 @@
 | 
			
		||||
## ✍️ Description
 | 
			
		||||
## ✍️ Description  
 | 
			
		||||
<!-- Provide a clear and concise description of your changes. -->  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
- - -
 | 
			
		||||
- Related Issue: #
 | 
			
		||||
- Related PR: #
 | 
			
		||||
- Related Discussion: #
 | 
			
		||||
- - - 
 | 
			
		||||
## 🔗 Related PR / Discussion / Issue  
 | 
			
		||||
Link: #
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## ✅ Prerequisites
 | 
			
		||||
The following steps must be completed for the pull request to be considered:  
 | 
			
		||||
- [] Self-review performed (I have reviewed my code to ensure it follows established patterns and conventions.)  
 | 
			
		||||
- [] Testing performed (I have thoroughly tested my changes and verified expected functionality.)
 | 
			
		||||
 | 
			
		||||
## 🛠️ Type of Change
 | 
			
		||||
Please check the relevant options:  
 | 
			
		||||
- [] Bug fix (non-breaking change that resolves an issue)  
 | 
			
		||||
- [] New feature (non-breaking change that adds functionality)  
 | 
			
		||||
- [] Breaking change (fix or feature that would cause existing functionality to change unexpectedly)  
 | 
			
		||||
- [] New script (a fully functional and thoroughly tested script or set of scripts)  
 | 
			
		||||
## ✅ Prerequisites  
 | 
			
		||||
Before this PR can be reviewed, the following must be completed:  
 | 
			
		||||
- [] **Self-review performed** – Code follows established patterns and conventions.  
 | 
			
		||||
- [] **Testing performed** – Changes have been thoroughly tested and verified.  
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
## 📋 Additional Information (optional)
 | 
			
		||||
Provide any extra context or screenshots about the feature or fix here.  
 | 
			
		||||
 | 
			
		||||
## 🛠️ Type of Change  
 | 
			
		||||
Select all that apply:  
 | 
			
		||||
- [] 🐞 **Bug fix** – Resolves an issue without breaking functionality.  
 | 
			
		||||
- [] ✨ **New feature** – Adds new, non-breaking functionality.  
 | 
			
		||||
- [] 💥 **Breaking change** – Alters existing functionality in a way that may require updates.  
 | 
			
		||||
- [] 🆕 **New script** – A fully functional and tested script or script set.  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 📋 Additional Information (optional)  
 | 
			
		||||
<!-- Provide extra context, screenshots, or references if needed. -->  
 | 
			
		||||
 
 | 
			
		||||
@@ -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'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							@@ -30,15 +30,15 @@ jobs:
 | 
			
		||||
 | 
			
		||||
      - name: Get latest dates in changelog
 | 
			
		||||
        run: |
 | 
			
		||||
          # Extract the latest and second latest dates from changelog
 | 
			
		||||
          DATES=$(grep '^## [0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}' CHANGELOG.md | head -n 2 | awk '{print $2}')
 | 
			
		||||
          # Extrahiere die neuesten zwei Daten aus dem Changelog
 | 
			
		||||
          DATES=$(grep -E '^## [0-9]{4}-[0-9]{2}-[0-9]{2}' CHANGELOG.md | head -n 2 | awk '{print $2}')
 | 
			
		||||
 | 
			
		||||
          LATEST_DATE=$(echo "$DATES" | sed -n '1p')
 | 
			
		||||
          SECOND_LATEST_DATE=$(echo "$DATES" | sed -n '2p')
 | 
			
		||||
          TODAY=$(date -u +%Y-%m-%d)
 | 
			
		||||
 | 
			
		||||
          echo "TODAY=$TODAY" >> $GITHUB_ENV
 | 
			
		||||
          if [ "$LATEST_DATE" == "$TODAY" ]; then
 | 
			
		||||
          if [[ "$LATEST_DATE" == "$TODAY" ]]; then
 | 
			
		||||
            echo "LATEST_DATE=$SECOND_LATEST_DATE" >> $GITHUB_ENV
 | 
			
		||||
          else
 | 
			
		||||
            echo "LATEST_DATE=$LATEST_DATE" >> $GITHUB_ENV
 | 
			
		||||
@@ -55,10 +55,10 @@ jobs:
 | 
			
		||||
            const configPath = path.resolve(process.env.CONFIG_PATH);
 | 
			
		||||
            const fileContent = await fs.readFile(configPath, 'utf-8');
 | 
			
		||||
            const changelogConfig = JSON.parse(fileContent);
 | 
			
		||||
            const categorizedPRs = changelogConfig.map((obj) => ({ ...obj, notes: [] }));
 | 
			
		||||
            const categorizedPRs = changelogConfig.map(obj => ({ ...obj, notes: [] }));
 | 
			
		||||
 | 
			
		||||
            const latestDateInChangelog = new Date(process.env.LATEST_DATE);
 | 
			
		||||
            latestDateInChangelog.setUTCHours(23,59,59,999);
 | 
			
		||||
            latestDateInChangelog.setUTCHours(23, 59, 59, 999);
 | 
			
		||||
 | 
			
		||||
            const { data: pulls } = await github.rest.pulls.list({
 | 
			
		||||
              owner: context.repo.owner,
 | 
			
		||||
@@ -70,18 +70,16 @@ jobs:
 | 
			
		||||
              per_page: 100,
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            pulls.filter((pr) => 
 | 
			
		||||
            pulls.filter(pr => 
 | 
			
		||||
              pr.merged_at && 
 | 
			
		||||
              new Date(pr.merged_at) > latestDateInChangelog && 
 | 
			
		||||
              !pr.labels.some((label) => ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()))
 | 
			
		||||
            ).forEach((pr) => {
 | 
			
		||||
              const prLabels = pr.labels.map((label) => label.name.toLowerCase());
 | 
			
		||||
              !pr.labels.some(label => ["invalid", "wontdo", process.env.AUTOMATED_PR_LABEL].includes(label.name.toLowerCase()))
 | 
			
		||||
            ).forEach(pr => {
 | 
			
		||||
              const prLabels = pr.labels.map(label => label.name.toLowerCase());
 | 
			
		||||
              const prNote = `- ${pr.title} [@${pr.user.login}](https://github.com/${pr.user.login}) ([#${pr.number}](${pr.html_url}))`;
 | 
			
		||||
 | 
			
		||||
              for (const { labels, notes } of categorizedPRs) {
 | 
			
		||||
                const prHasCategoryLabel = labels.some((label) => prLabels.includes(label));
 | 
			
		||||
                const isUnlabelledCategory = labels.length === 0;
 | 
			
		||||
                if (prHasCategoryLabel || isUnlabelledCategory) {
 | 
			
		||||
                if (labels.length === 0 || labels.some(label => prLabels.includes(label))) {
 | 
			
		||||
                  notes.push(prNote);
 | 
			
		||||
                  break;
 | 
			
		||||
                }
 | 
			
		||||
@@ -102,7 +100,7 @@ jobs:
 | 
			
		||||
            const changelogPath = path.resolve('CHANGELOG.md');
 | 
			
		||||
            const categorizedPRs = ${{ steps.get-categorized-prs.outputs.result }};
 | 
			
		||||
 | 
			
		||||
            let newReleaseNotes = `## ${today}\n\n### Changed\n\n`;
 | 
			
		||||
            let newReleaseNotes = `## ${today}\n\n### Changes\n\n`;
 | 
			
		||||
            for (const { title, notes } of categorizedPRs) {
 | 
			
		||||
              if (notes.length > 0) {
 | 
			
		||||
                newReleaseNotes += `### ${title}\n\n${notes.join("\n")}\n\n`;
 | 
			
		||||
@@ -112,21 +110,21 @@ jobs:
 | 
			
		||||
            const changelogContent = await fs.readFile(changelogPath, 'utf-8');
 | 
			
		||||
            const changelogIncludesTodaysReleaseNotes = changelogContent.includes(`\n## ${today}`);
 | 
			
		||||
 | 
			
		||||
            // Replace todays release notes or insert release notes above previous release notes
 | 
			
		||||
            const regex = changelogIncludesTodaysReleaseNotes ? 
 | 
			
		||||
              new RegExp(`## ${today}.*(?=## ${latestDateInChangelog})`, "gs") :
 | 
			
		||||
              new RegExp(`(?=## ${latestDateInChangelog})`, "gs");
 | 
			
		||||
            // Ersetze oder füge Release Notes ein
 | 
			
		||||
            const regex = changelogIncludesTodaysReleaseNotes 
 | 
			
		||||
              ? new RegExp(`## ${today}.*(?=## ${latestDateInChangelog})`, "gs") 
 | 
			
		||||
              : new RegExp(`(?=## ${latestDateInChangelog})`, "gs");
 | 
			
		||||
 | 
			
		||||
            const newChangelogContent = changelogContent.replace(regex, newReleaseNotes)
 | 
			
		||||
            const newChangelogContent = changelogContent.replace(regex, newReleaseNotes);
 | 
			
		||||
            await fs.writeFile(changelogPath, newChangelogContent);
 | 
			
		||||
 | 
			
		||||
      - name: Check if there are any changes
 | 
			
		||||
      - name: Check for changes
 | 
			
		||||
        id: verify-diff
 | 
			
		||||
        run: |
 | 
			
		||||
          git diff --quiet . || echo "changed=true" >> $GITHUB_OUTPUT
 | 
			
		||||
          git diff --quiet . || echo "changed=true" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
      - name: Commit and push changes to separate branch
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
      - name: Commit and push changes
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global user.name "github-actions[bot]"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
@@ -136,7 +134,7 @@ jobs:
 | 
			
		||||
          git push origin $BRANCH_NAME --force
 | 
			
		||||
 | 
			
		||||
      - name: Create pull request if not exists
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -150,7 +148,7 @@ jobs:
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -158,9 +156,9 @@ jobs:
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
      - name: Re-approve pull request after update
 | 
			
		||||
        if: steps.verify-diff.outputs.changed == 'true'
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										139
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
			
		||||
name: Run Scripts on PVE Node
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    branches:
 | 
			
		||||
      - main
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'install/*.sh'
 | 
			
		||||
      - 'ct/*.sh'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  run-install-script:
 | 
			
		||||
    runs-on: pvenode
 | 
			
		||||
    steps:          
 | 
			
		||||
      - name: Checkout PR branch
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          ref: ${{ github.event.pull_request.head.ref }}
 | 
			
		||||
          fetch-depth: 0  
 | 
			
		||||
      - name: Add Git safe directory
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global --add safe.directory /__w/ProxmoxVE/ProxmoxVE
 | 
			
		||||
      
 | 
			
		||||
      - name: Set up GH_TOKEN
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "GH_TOKEN=${GH_TOKEN}" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files in PR
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        run: | 
 | 
			
		||||
          CHANGED_FILES=$(gh pr diff --name-only ${{ github.event.pull_request.number }})  
 | 
			
		||||
          CHANGED_FILES=$(echo "$CHANGED_FILES" | tr '\n' ' ')  
 | 
			
		||||
          echo "Changed files: $CHANGED_FILES"  
 | 
			
		||||
          echo "SCRIPT=$CHANGED_FILES" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
      - name: Get scripts
 | 
			
		||||
        id: check-install-script
 | 
			
		||||
        run: |
 | 
			
		||||
          ALL_FILES=()
 | 
			
		||||
          ADDED_FILES=()  
 | 
			
		||||
          for FILE in ${{ env.SCRIPT }}; do           
 | 
			
		||||
            if [[ $FILE =~ ^install/.*-install\.sh$ ]] || [[ $FILE =~ ^ct/.*\.sh$ ]]; then             
 | 
			
		||||
              STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
              if [[ ! " ${ADDED_FILES[@]} " =~ " $STRIPPED_NAME " ]]; then
 | 
			
		||||
                ALL_FILES+=("$FILE")
 | 
			
		||||
                ADDED_FILES+=("$STRIPPED_NAME")  # Mark this base file as added (without the path)
 | 
			
		||||
              fi
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          ALL_FILES=$(echo "${ALL_FILES[@]}" | xargs)
 | 
			
		||||
          echo "$ALL_FILES"
 | 
			
		||||
          echo "ALL_FILES=$ALL_FILES" >> $GITHUB_ENV
 | 
			
		||||
        
 | 
			
		||||
      - name: Run scripts
 | 
			
		||||
        id: run-install
 | 
			
		||||
        continue-on-error: true
 | 
			
		||||
        run: |
 | 
			
		||||
          set +e  
 | 
			
		||||
          #run for each files in /ct
 | 
			
		||||
          for FILE in ${{ env.ALL_FILES }}; do            
 | 
			
		||||
            echo "Running: $FILE"
 | 
			
		||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
            if [[ $FILE =~ ^install/.*-install\.sh$ ]]; then
 | 
			
		||||
              CT_SCRIPT="ct/$STRIPPED_NAME.sh"
 | 
			
		||||
              if [[ ! -f $CT_SCRIPT ]]; then
 | 
			
		||||
                echo "No CT script found for $STRIPPED_NAME"
 | 
			
		||||
                exit 1
 | 
			
		||||
              fi
 | 
			
		||||
                echo "Found CT script for $STRIPPED_NAME"
 | 
			
		||||
                chmod +x "$CT_SCRIPT"
 | 
			
		||||
                RUNNING_FILE=$CT_SCRIPT
 | 
			
		||||
            elif [[ $FILE =~ ^ct/.*\.sh$ ]]; then
 | 
			
		||||
              INSTALL_SCRIPT="install/$STRIPPED_NAME-install.sh"
 | 
			
		||||
              if [[ ! -f $INSTALL_SCRIPT ]]; then
 | 
			
		||||
                echo "No install script found for $STRIPPED_NAME"
 | 
			
		||||
                exit 1
 | 
			
		||||
              fi
 | 
			
		||||
                echo "Found install script for $STRIPPED_NAME"
 | 
			
		||||
                chmod +x "$INSTALL_SCRIPT"
 | 
			
		||||
                RUNNING_FILE=$FILE
 | 
			
		||||
            fi
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-build.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-install.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
			
		||||
            git checkout origin/main .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
            sed -i 's|source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)|source .github/workflows/scripts/app-test/pr-build.func|g' "$RUNNING_FILE"
 | 
			
		||||
            chmod +x $RUNNING_FILE         
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-install.func
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-alpine-install.func
 | 
			
		||||
            chmod +x .github/workflows/scripts/app-test/pr-build.func
 | 
			
		||||
 | 
			
		||||
            ERROR_MSG=$(./$RUNNING_FILE 2>&1 > /dev/null)
 | 
			
		||||
            echo "Finished running $FILE"
 | 
			
		||||
            if [ -n "$ERROR_MSG" ]; then
 | 
			
		||||
              echo "ERROR in $STRIPPED_NAME: $ERROR_MSG"
 | 
			
		||||
              echo "$ERROR_MSG" > result_$STRIPPED_NAME.log
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          set -e  # Restore exit-on-error
 | 
			
		||||
      
 | 
			
		||||
      - name: Cleanup PVE Node
 | 
			
		||||
        run: |
 | 
			
		||||
          containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}' | awk '{print $1}')
 | 
			
		||||
        
 | 
			
		||||
          for container_id in $containers; do
 | 
			
		||||
            status=$(pct status $container_id | awk '{print $2}')
 | 
			
		||||
            if [[ $status == "running" ]]; then
 | 
			
		||||
                pct stop $container_id
 | 
			
		||||
                pct destroy $container_id
 | 
			
		||||
            fi            
 | 
			
		||||
          done
 | 
			
		||||
      
 | 
			
		||||
      - name: Post error comments
 | 
			
		||||
        run: |
 | 
			
		||||
          ERROR="false"
 | 
			
		||||
          SEARCH_LINE=".github/workflows/scripts/app-test/pr-build.func: line"
 | 
			
		||||
          for FILE in ${{ env.ALL_FILES }}; do
 | 
			
		||||
            STRIPPED_NAME=$(basename "$FILE" | sed 's/-install//' | sed 's/\.sh$//')
 | 
			
		||||
            if [[ ! -f result_$STRIPPED_NAME.log ]]; then
 | 
			
		||||
              continue
 | 
			
		||||
            fi
 | 
			
		||||
            ERROR_MSG=$(cat result_$STRIPPED_NAME.log)
 | 
			
		||||
      
 | 
			
		||||
            if [ -n "$ERROR_MSG" ]; then
 | 
			
		||||
              CLEANED_ERROR_MSG=$(echo "$ERROR_MSG" | sed "s|$SEARCH_LINE.*||")
 | 
			
		||||
              echo "Posting error message for $FILE"
 | 
			
		||||
              echo ${CLEANED_ERROR_MSG}
 | 
			
		||||
              gh pr comment ${{ github.event.pull_request.number }} \
 | 
			
		||||
                --body ":warning: The script _**$FILE**_ failed with the following message: <br> <div><strong>${CLEANED_ERROR_MSG}</strong></div>"
 | 
			
		||||
 | 
			
		||||
              ERROR="true"
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
          echo "ERROR=$ERROR" >> $GITHUB_ENV
 | 
			
		||||
      - name: Fail if error
 | 
			
		||||
        if: ${{ env.ERROR }} == 'true'
 | 
			
		||||
        run: exit 1 
 | 
			
		||||
							
								
								
									
										88
									
								
								.github/workflows/scripts/app-test/pr-alpine-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								.github/workflows/scripts/app-test/pr-alpine-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    STD=""
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RETRY_NUM=10
 | 
			
		||||
RETRY_EVERY=3
 | 
			
		||||
i=$RETRY_NUM
 | 
			
		||||
 | 
			
		||||
setting_up_container() {
 | 
			
		||||
  while [ $i -gt 0 ]; do
 | 
			
		||||
    if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" != "" ]; then
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
    echo 1>&2 -en "No Network! "
 | 
			
		||||
    sleep $RETRY_EVERY
 | 
			
		||||
    i=$((i - 1))
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if [ "$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d'/' -f1)" = "" ]; then
 | 
			
		||||
    echo 1>&2 -e "\n No Network After $RETRY_NUM Tries"
 | 
			
		||||
    echo -e "Check Network Settings"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  msg_ok "Set up Container OS"
 | 
			
		||||
  msg_ok "Network Connected: $(hostname -i)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
network_check() {
 | 
			
		||||
  RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
 | 
			
		||||
  if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to $RESOLVEDIP"; fi
 | 
			
		||||
  set -e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
 msg_info "Updating Container OS"
 | 
			
		||||
  apk update
 | 
			
		||||
  apk upgrade
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
motd_ssh() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
   return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										259
									
								
								.github/workflows/scripts/app-test/pr-build.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								.github/workflows/scripts/app-test/pr-build.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,259 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
variables() {
 | 
			
		||||
  NSAPP=$(echo ${APP,,} | tr -d ' ') 
 | 
			
		||||
  var_install="${NSAPP}-install"     
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
			
		||||
timezone=$(cat /etc/timezone)
 | 
			
		||||
header_info(){ 
 | 
			
		||||
  return  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
base_settings() {
 | 
			
		||||
  
 | 
			
		||||
  CT_TYPE="1"
 | 
			
		||||
  DISK_SIZE="4"
 | 
			
		||||
  CORE_COUNT="1"
 | 
			
		||||
  RAM_SIZE="1024"
 | 
			
		||||
  VERBOSE="${1:-no}"
 | 
			
		||||
  PW=""
 | 
			
		||||
  CT_ID=$NEXTID
 | 
			
		||||
  HN="Testing"
 | 
			
		||||
  BRG="vmbr0"
 | 
			
		||||
  NET="dhcp"
 | 
			
		||||
  GATE=""
 | 
			
		||||
  APT_CACHER=""
 | 
			
		||||
  APT_CACHER_IP=""
 | 
			
		||||
  DISABLEIP6="no"
 | 
			
		||||
  MTU=""
 | 
			
		||||
  SD=""
 | 
			
		||||
  NS=""
 | 
			
		||||
  MAC=""
 | 
			
		||||
  VLAN=""
 | 
			
		||||
  SSH="no"
 | 
			
		||||
  SSH_AUTHORIZED_KEY=""
 | 
			
		||||
  TAGS="community-script;"
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  CT_TYPE=${var_unprivileged:-$CT_TYPE}
 | 
			
		||||
  DISK_SIZE=${var_disk:-$DISK_SIZE}
 | 
			
		||||
  CORE_COUNT=${var_cpu:-$CORE_COUNT}
 | 
			
		||||
  RAM_SIZE=${var_ram:-$RAM_SIZE}
 | 
			
		||||
  VERB=${var_verbose:-$VERBOSE}
 | 
			
		||||
  TAGS="${TAGS}${var_tags:-}"
 | 
			
		||||
 | 
			
		||||
  if [ -z "$var_os" ]; then
 | 
			
		||||
    var_os="debian"
 | 
			
		||||
  fi
 | 
			
		||||
  if [ -z "$var_version" ]; then
 | 
			
		||||
    var_version="12"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  # Colors
 | 
			
		||||
  YW=$(echo "\033[33m")
 | 
			
		||||
  YWB=$(echo "\033[93m")
 | 
			
		||||
  BL=$(echo "\033[36m")
 | 
			
		||||
  RD=$(echo "\033[01;31m")
 | 
			
		||||
  BGN=$(echo "\033[4;92m")
 | 
			
		||||
  GN=$(echo "\033[1;92m")
 | 
			
		||||
  DGN=$(echo "\033[32m")
 | 
			
		||||
 | 
			
		||||
  # Formatting
 | 
			
		||||
  CL=$(echo "\033[m")
 | 
			
		||||
  UL=$(echo "\033[4m")
 | 
			
		||||
  BOLD=$(echo "\033[1m")
 | 
			
		||||
  BFR="\\r\\033[K"
 | 
			
		||||
  HOLD=" "
 | 
			
		||||
  TAB="  "
 | 
			
		||||
 | 
			
		||||
  # Icons
 | 
			
		||||
  CM="${TAB}✔️${TAB}${CL}"
 | 
			
		||||
  CROSS="${TAB}✖️${TAB}${CL}"
 | 
			
		||||
  INFO="${TAB}💡${TAB}${CL}"
 | 
			
		||||
  OS="${TAB}🖥️${TAB}${CL}"
 | 
			
		||||
  OSVERSION="${TAB}🌟${TAB}${CL}"
 | 
			
		||||
  CONTAINERTYPE="${TAB}📦${TAB}${CL}"
 | 
			
		||||
  DISKSIZE="${TAB}💾${TAB}${CL}"
 | 
			
		||||
  CPUCORE="${TAB}🧠${TAB}${CL}"
 | 
			
		||||
  RAMSIZE="${TAB}🛠️${TAB}${CL}"
 | 
			
		||||
  SEARCH="${TAB}🔍${TAB}${CL}"
 | 
			
		||||
  VERIFYPW="${TAB}🔐${TAB}${CL}"
 | 
			
		||||
  CONTAINERID="${TAB}🆔${TAB}${CL}"
 | 
			
		||||
  HOSTNAME="${TAB}🏠${TAB}${CL}"
 | 
			
		||||
  BRIDGE="${TAB}🌉${TAB}${CL}"
 | 
			
		||||
  NETWORK="${TAB}📡${TAB}${CL}"
 | 
			
		||||
  GATEWAY="${TAB}🌐${TAB}${CL}"
 | 
			
		||||
  DISABLEIPV6="${TAB}🚫${TAB}${CL}"
 | 
			
		||||
  DEFAULT="${TAB}⚙️${TAB}${CL}"
 | 
			
		||||
  MACADDRESS="${TAB}🔗${TAB}${CL}"
 | 
			
		||||
  VLANTAG="${TAB}🏷️${TAB}${CL}"
 | 
			
		||||
  ROOTSSH="${TAB}🔑${TAB}${CL}"
 | 
			
		||||
  CREATING="${TAB}🚀${TAB}${CL}"
 | 
			
		||||
  ADVANCED="${TAB}🧩${TAB}${CL}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# This function handles errors
 | 
			
		||||
error_handler() {  
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit "$error_message"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
start(){
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
build_container() {
 | 
			
		||||
 
 | 
			
		||||
  if [ "$CT_TYPE" == "1" ]; then
 | 
			
		||||
    FEATURES="keyctl=1,nesting=1"
 | 
			
		||||
  else
 | 
			
		||||
    FEATURES="nesting=1"
 | 
			
		||||
  fi
 | 
			
		||||
  TEMP_DIR=$(mktemp -d)
 | 
			
		||||
  pushd $TEMP_DIR >/dev/null
 | 
			
		||||
  if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-alpine-install.func)"
 | 
			
		||||
  else
 | 
			
		||||
    export FUNCTIONS_FILE_PATH="$(cat /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-install.func)"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  export CACHER="$APT_CACHER"
 | 
			
		||||
  export CACHER_IP="$APT_CACHER_IP"
 | 
			
		||||
  export tz=""
 | 
			
		||||
  export DISABLEIPV6="$DISABLEIP6"
 | 
			
		||||
  export APPLICATION="$APP"
 | 
			
		||||
  export app="$NSAPP"
 | 
			
		||||
  export PASSWORD="$PW"
 | 
			
		||||
  export VERBOSE="$VERB"
 | 
			
		||||
  export SSH_ROOT="${SSH}"
 | 
			
		||||
  export SSH_AUTHORIZED_KEY
 | 
			
		||||
  export CTID="$CT_ID"
 | 
			
		||||
  export CTTYPE="$CT_TYPE"
 | 
			
		||||
  export PCT_OSTYPE="$var_os"
 | 
			
		||||
  export PCT_OSVERSION="$var_version"
 | 
			
		||||
  export PCT_DISK_SIZE="$DISK_SIZE"
 | 
			
		||||
  export tz="$timezone"
 | 
			
		||||
  export PCT_OPTIONS="
 | 
			
		||||
    -features $FEATURES
 | 
			
		||||
    -hostname $HN
 | 
			
		||||
    -tags $TAGS
 | 
			
		||||
    $SD
 | 
			
		||||
    $NS
 | 
			
		||||
    -net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
 | 
			
		||||
    -onboot 1
 | 
			
		||||
    -cores $CORE_COUNT
 | 
			
		||||
    -memory $RAM_SIZE
 | 
			
		||||
    -unprivileged $CT_TYPE
 | 
			
		||||
    $PW
 | 
			
		||||
  "
 | 
			
		||||
  echo "Container ID: $CTID"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  # This executes create_lxc.sh and creates the container and .conf file
 | 
			
		||||
  bash /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/.github/workflows/scripts/app-test/pr-create-lxc.sh
 | 
			
		||||
 | 
			
		||||
  LXC_CONFIG=/etc/pve/lxc/${CTID}.conf
 | 
			
		||||
  if [ "$CT_TYPE" == "0" ]; then
 | 
			
		||||
    cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# USB passthrough
 | 
			
		||||
lxc.cgroup2.devices.allow: a
 | 
			
		||||
lxc.cap.drop:
 | 
			
		||||
lxc.cgroup2.devices.allow: c 188:* rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 189:* rwm
 | 
			
		||||
lxc.mount.entry: /dev/serial/by-id  dev/serial/by-id  none bind,optional,create=dir
 | 
			
		||||
lxc.mount.entry: /dev/ttyUSB0       dev/ttyUSB0       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyUSB1       dev/ttyUSB1       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyACM0       dev/ttyACM0       none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/ttyACM1       dev/ttyACM1       none bind,optional,create=file
 | 
			
		||||
EOF
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$CT_TYPE" == "0" ]; then
 | 
			
		||||
    if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" ]]; then
 | 
			
		||||
      cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
lxc.cgroup2.devices.allow: c 226:0 rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 226:128 rwm
 | 
			
		||||
lxc.cgroup2.devices.allow: c 29:0 rwm
 | 
			
		||||
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
 | 
			
		||||
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
 | 
			
		||||
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
 | 
			
		||||
EOF
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    if [[ "$APP" == "Channels" || "$APP" == "Emby" || "$APP" == "ErsatzTV" || "$APP" == "Frigate" || "$APP" == "Jellyfin" || "$APP" == "Plex" || "$APP" == "Scrypted" || "$APP" == "Tdarr" || "$APP" == "Unmanic" || "$APP" == "Ollama" ]]; then
 | 
			
		||||
      if [[ -e "/dev/dri/renderD128" ]]; then
 | 
			
		||||
        if [[ -e "/dev/dri/card0" ]]; then
 | 
			
		||||
          cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
dev0: /dev/dri/card0,gid=44
 | 
			
		||||
dev1: /dev/dri/renderD128,gid=104
 | 
			
		||||
EOF
 | 
			
		||||
        else
 | 
			
		||||
          cat <<EOF >>$LXC_CONFIG
 | 
			
		||||
# VAAPI hardware transcoding
 | 
			
		||||
dev0: /dev/dri/card1,gid=44
 | 
			
		||||
dev1: /dev/dri/renderD128,gid=104
 | 
			
		||||
EOF
 | 
			
		||||
        fi
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # This starts the container and executes <app>-install.sh
 | 
			
		||||
  msg_info "Starting LXC Container"
 | 
			
		||||
  pct start "$CTID"
 | 
			
		||||
  msg_ok "Started LXC Container"
 | 
			
		||||
 | 
			
		||||
  if [[ ! -f "/root/actions-runner/_work/ProxmoxVE/ProxmoxVE/install/$var_install.sh" ]]; then
 | 
			
		||||
    msg_error "No install script found for $APP"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
    if [ "$var_os" == "alpine" ]; then
 | 
			
		||||
    sleep 3
 | 
			
		||||
    pct exec "$CTID" -- /bin/sh -c 'cat <<EOF >/etc/apk/repositories
 | 
			
		||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
 | 
			
		||||
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
 | 
			
		||||
EOF'
 | 
			
		||||
    pct exec "$CTID" -- ash -c "apk add bash >/dev/null"
 | 
			
		||||
  fi
 | 
			
		||||
  lxc-attach -n "$CTID" -- bash -c "$(< /root/actions-runner/_work/ProxmoxVE/ProxmoxVE/install/$var_install.sh)"
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
description(){
 | 
			
		||||
 return
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										158
									
								
								.github/workflows/scripts/app-test/pr-create-lxc.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								.github/workflows/scripts/app-test/pr-create-lxc.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
    local exit_code="$?"
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  local error_message="Failure in line $line_number: exit code $exit_code: while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit 100
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
VALIDCT=$(pvesm status -content rootdir | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALIDCT" ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid Container Storage location."
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
VALIDTMP=$(pvesm status -content vztmpl | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALIDTMP" ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid Template Storage location."
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function select_storage() {
 | 
			
		||||
  local CLASS=$1
 | 
			
		||||
  local CONTENT
 | 
			
		||||
  local CONTENT_LABEL
 | 
			
		||||
  case $CLASS in
 | 
			
		||||
  container)
 | 
			
		||||
    CONTENT='rootdir'
 | 
			
		||||
    CONTENT_LABEL='Container'
 | 
			
		||||
    ;;
 | 
			
		||||
  template)
 | 
			
		||||
    CONTENT='vztmpl'
 | 
			
		||||
    CONTENT_LABEL='Container template'
 | 
			
		||||
    ;;
 | 
			
		||||
  *) false || { msg_error "Invalid storage class."; exit 201; };;
 | 
			
		||||
  esac
 | 
			
		||||
  
 | 
			
		||||
  local -a MENU
 | 
			
		||||
  while read -r line; do
 | 
			
		||||
    local TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
    local TYPE=$(echo $line | awk '{printf "%-10s", $2}')
 | 
			
		||||
    local FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}')
 | 
			
		||||
    local ITEM="Type: $TYPE Free: $FREE "
 | 
			
		||||
    local OFFSET=2
 | 
			
		||||
    if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
 | 
			
		||||
      local MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
 | 
			
		||||
    fi
 | 
			
		||||
    MENU+=("$TAG" "$ITEM" "OFF")
 | 
			
		||||
  done < <(pvesm status -content $CONTENT | awk 'NR>1')
 | 
			
		||||
  
 | 
			
		||||
  if [ $((${#MENU[@]}/3)) -eq 1 ]; then
 | 
			
		||||
    printf ${MENU[0]}
 | 
			
		||||
  else
 | 
			
		||||
   msg_error "STORAGE ISSUES!"
 | 
			
		||||
    exit 202  
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[[ "${CTID:-}" ]] || { msg_error "You need to set 'CTID' variable."; exit 203; }
 | 
			
		||||
[[ "${PCT_OSTYPE:-}" ]] || { msg_error "You need to set 'PCT_OSTYPE' variable."; exit 204; }
 | 
			
		||||
 | 
			
		||||
[ "$CTID" -ge "100" ] || { msg_error "ID cannot be less than 100."; exit 205; }
 | 
			
		||||
 | 
			
		||||
if pct status $CTID &>/dev/null; then
 | 
			
		||||
  echo -e "ID '$CTID' is already in use."
 | 
			
		||||
  unset CTID
 | 
			
		||||
  msg_error "Cannot use ID that is already in use."
 | 
			
		||||
  exit 206
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
TEMPLATE_STORAGE=$(select_storage template) || exit
 | 
			
		||||
msg_ok "Using  $TEMPLATE_STORAGE   for Template Storage."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CONTAINER_STORAGE=$(select_storage container) || exit
 | 
			
		||||
msg_ok "Using  $CONTAINER_STORAGE   for Container Storage."
 | 
			
		||||
 | 
			
		||||
msg_info "Updating LXC Template List"
 | 
			
		||||
pveam update >/dev/null
 | 
			
		||||
msg_ok "Updated LXC Template List"
 | 
			
		||||
 | 
			
		||||
TEMPLATE_SEARCH=${PCT_OSTYPE}-${PCT_OSVERSION:-}
 | 
			
		||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($TEMPLATE_SEARCH.*\)/\1/p" | sort -t - -k 2 -V)
 | 
			
		||||
[ ${#TEMPLATES[@]} -gt 0 ] || { msg_error "Unable to find a template when searching for '$TEMPLATE_SEARCH'."; exit 207; }
 | 
			
		||||
TEMPLATE="${TEMPLATES[-1]}"
 | 
			
		||||
 | 
			
		||||
TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE"
 | 
			
		||||
 | 
			
		||||
if ! pveam list "$TEMPLATE_STORAGE" | grep -q "$TEMPLATE"; then
 | 
			
		||||
  [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
  msg_info "Downloading LXC Template"
 | 
			
		||||
  pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||
 | 
			
		||||
    { msg_error "A problem occurred while downloading the LXC template."; exit 208; }
 | 
			
		||||
  msg_ok "Downloaded LXC Template"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >> /etc/subuid
 | 
			
		||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >> /etc/subgid
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
 | 
			
		||||
[[ " ${PCT_OPTIONS[@]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}")
 | 
			
		||||
 | 
			
		||||
echo "${PCT_OPTIONS[@]}"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info "Creating LXC Container"
 | 
			
		||||
  if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
      [[ -f "$TEMPLATE_PATH" ]] && rm -f "$TEMPLATE_PATH"
 | 
			
		||||
      
 | 
			
		||||
    msg_ok "Template integrity check completed"
 | 
			
		||||
    pveam download "$TEMPLATE_STORAGE" "$TEMPLATE" >/dev/null ||    
 | 
			
		||||
      { msg_error "A problem occurred while re-downloading the LXC template."; exit 208; }
 | 
			
		||||
    
 | 
			
		||||
    msg_ok "Re-downloaded LXC Template"
 | 
			
		||||
    if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" &>/dev/null; then
 | 
			
		||||
        msg_error "A problem occurred while trying to create container after re-downloading template."
 | 
			
		||||
      exit 200
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
msg_ok "LXC Container  $CTID   was successfully created."
 | 
			
		||||
							
								
								
									
										93
									
								
								.github/workflows/scripts/app-test/pr-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								.github/workflows/scripts/app-test/pr-install.func
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
color() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
catch_errors() {
 | 
			
		||||
  set -Eeuo pipefail
 | 
			
		||||
  trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
error_handler() {
 | 
			
		||||
  local line_number="$1"
 | 
			
		||||
  local command="$2"
 | 
			
		||||
  SCRIPT_NAME=$(basename "$0")
 | 
			
		||||
  local error_message="$SCRIPT_NAME: Failure in line $line_number while executing command $command"
 | 
			
		||||
  echo -e "\n$error_message"
 | 
			
		||||
  exit "$error_message"
 | 
			
		||||
}
 | 
			
		||||
verb_ip6() {
 | 
			
		||||
    STD=""
 | 
			
		||||
    return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_info() {
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -ne "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_ok() { 
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
msg_error() {
 | 
			
		||||
  
 | 
			
		||||
  local msg="$1"
 | 
			
		||||
  echo -e "${msg}\n"
 | 
			
		||||
}
 | 
			
		||||
  RETRY_NUM=10
 | 
			
		||||
  RETRY_EVERY=3
 | 
			
		||||
setting_up_container() {
 | 
			
		||||
  sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
 | 
			
		||||
  locale_line=$(grep -v '^#' /etc/locale.gen | grep -E '^[a-zA-Z]' | awk '{print $1}' | head -n 1)
 | 
			
		||||
  echo "LANG=${locale_line}" >/etc/default/locale
 | 
			
		||||
  locale-gen >/dev/null
 | 
			
		||||
  export LANG=${locale_line}
 | 
			
		||||
  echo $tz >/etc/timezone
 | 
			
		||||
  ln -sf /usr/share/zoneinfo/$tz /etc/localtime
 | 
			
		||||
  
 | 
			
		||||
  for ((i = RETRY_NUM; i > 0; i--)); do
 | 
			
		||||
    if [ "$(hostname -I)" != "" ]; then
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
    echo 1>&2 -en "No Network! "
 | 
			
		||||
    sleep $RETRY_EVERY
 | 
			
		||||
  done
 | 
			
		||||
  if [ "$(hostname -I)" = "" ]; then
 | 
			
		||||
    echo 1>&2 -e "\nNo Network After $RETRY_NUM Tries"
 | 
			
		||||
    echo -e "Check Network Settings"
 | 
			
		||||
    exit 101
 | 
			
		||||
  fi
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  systemctl disable -q --now systemd-networkd-wait-online.service
 | 
			
		||||
  msg_ok "Set up Container OS"
 | 
			
		||||
  msg_ok "Network Connected: $(hostname -I)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
network_check() {
 | 
			
		||||
  RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
 | 
			
		||||
  if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to $RESOLVEDIP"; fi
 | 
			
		||||
  set -e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
  msg_info "Updating Container OS"
 | 
			
		||||
  apt-get update
 | 
			
		||||
  apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
 | 
			
		||||
  rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
motd_ssh() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
   return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								.github/workflows/scripts/update-json.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/scripts/update-json.sh
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
FILE=$1
 | 
			
		||||
TODAY=$(date -u +"%Y-%m-%d")
 | 
			
		||||
 | 
			
		||||
if [[ -z "$FILE" ]]; then
 | 
			
		||||
    echo "No file specified. Exiting."
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ ! -f "$FILE" ]]; then
 | 
			
		||||
    echo "File $FILE not found. Exiting."
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
DATE_IN_JSON=$(jq -r '.date_created' "$FILE" 2>/dev/null || echo "")
 | 
			
		||||
 | 
			
		||||
if [[ "$DATE_IN_JSON" != "$TODAY" ]]; then
 | 
			
		||||
    jq --arg date "$TODAY" '.date_created = $date' "$FILE" > tmp.json && mv tmp.json "$FILE"
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										118
									
								
								.github/workflows/update_json_date.yml.bak
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										118
									
								
								.github/workflows/update_json_date.yml.bak
									
									
									
									
										vendored
									
									
								
							@@ -1,48 +1,88 @@
 | 
			
		||||
name: Update JSON Date
 | 
			
		||||
name: Auto Update JSON-Date
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    types: [opened, synchronize, reopened]
 | 
			
		||||
        
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      - main
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  list-files:
 | 
			
		||||
  update-json-dates:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
      pull-requests: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - name: Checkout PR Branch
 | 
			
		||||
      uses: actions/checkout@v4
 | 
			
		||||
      with:
 | 
			
		||||
        ref: ${{ github.event.pull_request.head.ref }}
 | 
			
		||||
      - name: Generate a token
 | 
			
		||||
        id: generate-token
 | 
			
		||||
        uses: actions/create-github-app-token@v1
 | 
			
		||||
        with:
 | 
			
		||||
          app-id: ${{ vars.APP_ID }}
 | 
			
		||||
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
    - name: Fetch PR changes
 | 
			
		||||
      run: |
 | 
			
		||||
          git remote add fork https://github.com/${{ github.event.pull_request.head.repo.full_name }}.git
 | 
			
		||||
          git fetch fork ${{ github.event.pull_request.head.ref }}:pullreq
 | 
			
		||||
          git checkout pullreq
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0  # Full history for proper detection
 | 
			
		||||
 | 
			
		||||
    - name: Update JSON
 | 
			
		||||
      id: changed-files
 | 
			
		||||
      run: |
 | 
			
		||||
          FILES=$(gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files --jq '.[].filename' | tr '\n' ' ')
 | 
			
		||||
          echo "changed_files=${FILES}"
 | 
			
		||||
          for FILE in $FILES; do
 | 
			
		||||
            if [[ "$FILE" =~ /(.*)\.json ]]; then
 | 
			
		||||
              NAME="${BASH_REMATCH[1]}"
 | 
			
		||||
            else
 | 
			
		||||
              echo "no new JSON in ${FILES}"
 | 
			
		||||
              continue
 | 
			
		||||
            fi
 | 
			
		||||
          
 | 
			
		||||
            JSON_FILE="json/${NAME}.json"
 | 
			
		||||
            if [[ -f "$JSON_FILE" ]]; then
 | 
			
		||||
              echo "Updating date_created in $JSON_FILE"
 | 
			
		||||
              jq --arg date "$(date +%Y-%m-%d)" '.date_created = $date' "$JSON_FILE" > tmp.json && mv tmp.json "$JSON_FILE"
 | 
			
		||||
            else
 | 
			
		||||
              echo "JSON file $FILES not found"
 | 
			
		||||
      - name: Set up Git
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global user.name "GitHub Actions"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
 | 
			
		||||
      - name: Find JSON files with incorrect date_created
 | 
			
		||||
        id: find_wrong_json
 | 
			
		||||
        run: |
 | 
			
		||||
          TODAY=$(date -u +"%Y-%m-%d")
 | 
			
		||||
          > incorrect_json_files.txt
 | 
			
		||||
 | 
			
		||||
          for FILE in json/*.json; do
 | 
			
		||||
            if [[ -f "$FILE" ]]; then
 | 
			
		||||
              DATE_IN_JSON=$(jq -r '.date_created' "$FILE" 2>/dev/null || echo "")
 | 
			
		||||
 | 
			
		||||
              if [[ "$DATE_IN_JSON" != "$TODAY" ]]; then
 | 
			
		||||
                echo "$FILE" >> incorrect_json_files.txt
 | 
			
		||||
              fi
 | 
			
		||||
            fi
 | 
			
		||||
          done
 | 
			
		||||
             
 | 
			
		||||
          git config --global user.name "github-actions[bot]"
 | 
			
		||||
          git config --global user.email "github-actions[bot]@users.noreply.github.com"
 | 
			
		||||
          git diff --exit-code || git commit -am "Updating Dates in affected JSON files."
 | 
			
		||||
          git push 
 | 
			
		||||
      env:
 | 
			
		||||
 | 
			
		||||
          if [[ -s incorrect_json_files.txt ]]; then
 | 
			
		||||
            echo "CHANGED=true" >> $GITHUB_ENV
 | 
			
		||||
          else
 | 
			
		||||
            echo "CHANGED=false" >> $GITHUB_ENV
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Run update script
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          chmod +x .github/workflows/scripts/update-json.sh
 | 
			
		||||
          while read -r FILE; do
 | 
			
		||||
            .github/workflows/scripts/update-json.sh "$FILE"
 | 
			
		||||
          done < incorrect_json_files.txt
 | 
			
		||||
 | 
			
		||||
      - name: Commit and create PR if changes exist
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
          git add json/*.json
 | 
			
		||||
          git commit -m "Auto-update date_created in incorrect JSON files"
 | 
			
		||||
          git checkout -b pr-fix-json-dates
 | 
			
		||||
          git push origin pr-fix-json-dates --force
 | 
			
		||||
          gh pr create --title "[core] Fix incorrect JSON date_created fields" \
 | 
			
		||||
                       --body "This PR is auto-generated to fix incorrect `date_created` fields in JSON files." \
 | 
			
		||||
                       --head pr-fix-json-dates \
 | 
			
		||||
                       --base main \
 | 
			
		||||
                       --label "automated pr"
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: env.CHANGED == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          PR_NUMBER=$(gh pr list --head "pr-fix-json-dates" --json number --jq '.[].number')
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										97
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										97
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -17,6 +17,103 @@ 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-12
 | 
			
		||||
 | 
			
		||||
### Changes
 | 
			
		||||
 | 
			
		||||
### 💥 Breaking Changes
 | 
			
		||||
 | 
			
		||||
- Frigate: Use Fixed Version 14 [@MickLesk](https://github.com/MickLesk) ([#2288](https://github.com/community-scripts/ProxmoxVE/pull/2288))
 | 
			
		||||
 | 
			
		||||
### ✨ New Scripts
 | 
			
		||||
 | 
			
		||||
- New Script: Kometa [@tremor021](https://github.com/tremor021) ([#2281](https://github.com/community-scripts/ProxmoxVE/pull/2281))
 | 
			
		||||
- New Script: Excalidraw [@tremor021](https://github.com/tremor021) ([#2285](https://github.com/community-scripts/ProxmoxVE/pull/2285))
 | 
			
		||||
- New Script: Graylog [@tremor021](https://github.com/tremor021) ([#2270](https://github.com/community-scripts/ProxmoxVE/pull/2270))
 | 
			
		||||
- New Script: TasmoCompiler [@tremor021](https://github.com/tremor021) ([#2235](https://github.com/community-scripts/ProxmoxVE/pull/2235))
 | 
			
		||||
- New script: cross-seed [@jmatraszek](https://github.com/jmatraszek) ([#2186](https://github.com/community-scripts/ProxmoxVE/pull/2186))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
- FIX: Frigate - remove bad variable [@tremor021](https://github.com/tremor021) ([#2323](https://github.com/community-scripts/ProxmoxVE/pull/2323))
 | 
			
		||||
- Fix: Kometa - Fix wrong web site address [@tremor021](https://github.com/tremor021) ([#2318](https://github.com/community-scripts/ProxmoxVE/pull/2318))
 | 
			
		||||
- Fix: var_tags instead of TAGS in some CT's [@MickLesk](https://github.com/MickLesk) ([#2310](https://github.com/community-scripts/ProxmoxVE/pull/2310))
 | 
			
		||||
- Update ubuntu2410-vm.sh: Fix typo in API call. [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2305](https://github.com/community-scripts/ProxmoxVE/pull/2305))
 | 
			
		||||
- Fix: Myspeed Installation (g++) [@MickLesk](https://github.com/MickLesk) ([#2308](https://github.com/community-scripts/ProxmoxVE/pull/2308))
 | 
			
		||||
- Fix: Pingvin wrong variable used for version tracking [@alberanid](https://github.com/alberanid) ([#2302](https://github.com/community-scripts/ProxmoxVE/pull/2302))
 | 
			
		||||
- Fix: SQL Server 2022 - remove unnecessary sudo [@tremor021](https://github.com/tremor021) ([#2282](https://github.com/community-scripts/ProxmoxVE/pull/2282))
 | 
			
		||||
- fix: frigate pin version [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2296](https://github.com/community-scripts/ProxmoxVE/pull/2296))
 | 
			
		||||
- Fix changedetection: Correct Browser install [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#2277](https://github.com/community-scripts/ProxmoxVE/pull/2277))
 | 
			
		||||
- Paperless-AI: add dependency "make" [@MickLesk](https://github.com/MickLesk) ([#2289](https://github.com/community-scripts/ProxmoxVE/pull/2289))
 | 
			
		||||
- Fix: Typo OPNsense VM [@chpego](https://github.com/chpego) ([#2291](https://github.com/community-scripts/ProxmoxVE/pull/2291))
 | 
			
		||||
- Fix: CraftyControler fix java default [@CrazyWolf13](https://github.com/CrazyWolf13) ([#2286](https://github.com/community-scripts/ProxmoxVE/pull/2286))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
- Fix: some jsons (debian instead Debian in OS) [@MickLesk](https://github.com/MickLesk) ([#2311](https://github.com/community-scripts/ProxmoxVE/pull/2311))
 | 
			
		||||
- Website: Add After-Install Note for Ubuntu VM 22.04/24.04/24.10 and Debian VM [@MickLesk](https://github.com/MickLesk) ([#2307](https://github.com/community-scripts/ProxmoxVE/pull/2307))
 | 
			
		||||
- Fix: duplicate 'VM' name in opnsense-vm.json [@nayzm](https://github.com/nayzm) ([#2293](https://github.com/community-scripts/ProxmoxVE/pull/2293))
 | 
			
		||||
 | 
			
		||||
## 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
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="2FAuth"
 | 
			
		||||
TAGS="2fa;authenticator"
 | 
			
		||||
var_tags="2fa;authenticator"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="512"
 | 
			
		||||
var_disk="2"
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/r
 | 
			
		||||
 | 
			
		||||
#App Default Values
 | 
			
		||||
APP="Apache-Guacamole"
 | 
			
		||||
TAGS="webserver;remote"
 | 
			
		||||
var_tags="webserver;remote"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										54
									
								
								ct/cross-seed.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								ct/cross-seed.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
#!/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: Jakub Matraszek (jmatraszek)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://www.cross-seed.org
 | 
			
		||||
 | 
			
		||||
APP="cross-seed"
 | 
			
		||||
var_tags="arr"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="2"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
 | 
			
		||||
    if command -v cross-seed &> /dev/null; then
 | 
			
		||||
        current_version=$(cross-seed --version)
 | 
			
		||||
        latest_version=$(npm show cross-seed version)
 | 
			
		||||
        if [ "$current_version" != "$latest_version" ]; then
 | 
			
		||||
            msg_info "Updating ${APP} from version v${current_version} to v${latest_version}"
 | 
			
		||||
            npm install -g cross-seed@latest &> /dev/null
 | 
			
		||||
            systemctl restart cross-seed
 | 
			
		||||
            msg_ok "Updated Successfully"
 | 
			
		||||
        else
 | 
			
		||||
            msg_ok "${APP} is already at v${current_version}"
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    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 cross-seed API using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:2468${CL}"
 | 
			
		||||
@@ -6,7 +6,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
# Source: https://github.com/duplicati/duplicati/
 | 
			
		||||
 | 
			
		||||
APP="Duplicati"
 | 
			
		||||
TAGS="backup"
 | 
			
		||||
var_tags="backup"
 | 
			
		||||
var_cpu="1"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										74
									
								
								ct/excalidraw.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								ct/excalidraw.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Slaviša Arežina (tremor021)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/excalidraw/excalidraw
 | 
			
		||||
 | 
			
		||||
APP="Excalidraw"
 | 
			
		||||
TAGS="diagrams"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="3072"
 | 
			
		||||
var_disk="6"
 | 
			
		||||
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/excalidraw ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/excalidraw/excalidraw/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/excalidraw_version.txt)" ]] || [[ ! -f /opt/excalidraw_version.txt ]]; then
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop excalidraw
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        cd /tmp
 | 
			
		||||
        temp_file=$(mktemp)
 | 
			
		||||
        wget -q "https://github.com/excalidraw/excalidraw/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
 | 
			
		||||
        tar xzf $temp_file
 | 
			
		||||
        rm -rf /opt/excalidraw
 | 
			
		||||
        mv excalidraw-${RELEASE} /opt/excalidraw
 | 
			
		||||
        cd /opt/excalidraw
 | 
			
		||||
        yarn &> /dev/null
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start excalidraw
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf $temp_file
 | 
			
		||||
        msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
        echo "${RELEASE}" >/opt/excalidraw_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}:3000${CL}"
 | 
			
		||||
							
								
								
									
										46
									
								
								ct/freshrss.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								ct/freshrss.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: bvdberg01
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/FreshRSS/FreshRSS
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="FreshRSS"
 | 
			
		||||
var_tags="RSS"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="1024"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
# App Output & Base Settings
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
# Core
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/freshrss ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_error "FreshRSS should be updated via the user interface."
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
 | 
			
		||||
							
								
								
									
										59
									
								
								ct/graylog.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								ct/graylog.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
#!/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://graylog.org/
 | 
			
		||||
 | 
			
		||||
APP="Graylog"
 | 
			
		||||
TAGS="logging"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="8192"
 | 
			
		||||
var_disk="30"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
 | 
			
		||||
    if [[ ! -d /etc/graylog ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop graylog-datanode
 | 
			
		||||
    systemctl stop graylog-server
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP"
 | 
			
		||||
    apt-get update &> /dev/null
 | 
			
		||||
    apt-get upgrade -y &> /dev/null
 | 
			
		||||
    msg_ok "Updated $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start graylog-datanode
 | 
			
		||||
    systemctl start graylog-server
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Update Successful"
 | 
			
		||||
    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}:9000${CL}"
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/cross-seed
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/cross-seed
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
                                                      __
 | 
			
		||||
  ______________  __________      ________  ___  ____/ /
 | 
			
		||||
 / ___/ ___/ __ \/ ___/ ___/_____/ ___/ _ \/ _ \/ __  / 
 | 
			
		||||
/ /__/ /  / /_/ (__  |__  )_____(__  )  __/  __/ /_/ /  
 | 
			
		||||
\___/_/   \____/____/____/     /____/\___/\___/\__,_/   
 | 
			
		||||
                                                        
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/excalidraw
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/excalidraw
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ______                ___     __                   
 | 
			
		||||
   / ____/  ___________ _/ (_)___/ /________ __      __
 | 
			
		||||
  / __/ | |/_/ ___/ __ `/ / / __  / ___/ __ `/ | /| / /
 | 
			
		||||
 / /____>  </ /__/ /_/ / / / /_/ / /  / /_/ /| |/ |/ / 
 | 
			
		||||
/_____/_/|_|\___/\__,_/_/_/\__,_/_/   \__,_/ |__/|__/  
 | 
			
		||||
                                                       
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/freshrss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/freshrss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ______               __    ____  __________
 | 
			
		||||
   / ____/_______  _____/ /_  / __ \/ ___/ ___/
 | 
			
		||||
  / /_  / ___/ _ \/ ___/ __ \/ /_/ /\__ \\__ \ 
 | 
			
		||||
 / __/ / /  /  __(__  ) / / / _, _/___/ /__/ / 
 | 
			
		||||
/_/   /_/   \___/____/_/ /_/_/ |_|/____/____/  
 | 
			
		||||
                                               
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/graylog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/graylog
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
   ______                 __           
 | 
			
		||||
  / ____/________ ___  __/ /___  ____ _
 | 
			
		||||
 / / __/ ___/ __ `/ / / / / __ \/ __ `/
 | 
			
		||||
/ /_/ / /  / /_/ / /_/ / / /_/ / /_/ / 
 | 
			
		||||
\____/_/   \__,_/\__, /_/\____/\__, /  
 | 
			
		||||
                /____/        /____/   
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/kometa
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/kometa
									
									
									
									
									
										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/tasmocompiler
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/tasmocompiler
									
									
									
									
									
										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 @@
 | 
			
		||||
 _____   _ __            __     __
 | 
			
		||||
/__  /  (_) /_____ _____/ /__  / /
 | 
			
		||||
  / /  / / __/ __ `/ __  / _ \/ / 
 | 
			
		||||
 / /__/ / /_/ /_/ / /_/ /  __/ /  
 | 
			
		||||
/____/_/\__/\__,_/\__,_/\___/_/   
 | 
			
		||||
                                  
 | 
			
		||||
							
								
								
									
										80
									
								
								ct/kometa.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								ct/kometa.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/Kometa-Team/Kometa
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="Kometa"
 | 
			
		||||
TAGS="media;streaming"
 | 
			
		||||
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 "/opt/kometa/kometa.py" ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/Kometa-Team/Kometa/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    if [[ "${RELEASE}" != "$(cat /opt/kometa_version.txt)" ]] || [[ ! -f /opt/kometa_version.txt ]]; then
 | 
			
		||||
        msg_info "Updating $APP"
 | 
			
		||||
        msg_info "Stopping $APP"
 | 
			
		||||
        systemctl stop kometa
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating $APP to ${RELEASE}"
 | 
			
		||||
        cd /tmp
 | 
			
		||||
        temp_file=$(mktemp)
 | 
			
		||||
        RELEASE=$(curl -s https://api.github.com/repos/Kometa-Team/Kometa/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
        wget -q "https://github.com/Kometa-Team/Kometa/archive/refs/tags/v${RELEASE}.tar.gz" -O "$temp_file"
 | 
			
		||||
        tar -xzf "$temp_file"
 | 
			
		||||
        cp /opt/kometa/config/config.yml /opt
 | 
			
		||||
        rm -rf /opt/kometa
 | 
			
		||||
        mv Kometa-${RELEASE} /opt/kometa
 | 
			
		||||
        cd /opt/kometa
 | 
			
		||||
        rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
        pip install -r requirements.txt --ignore-installed &> /dev/null
 | 
			
		||||
        mkdir -p config/assets
 | 
			
		||||
        cp /opt/config.yml config/config.yml
 | 
			
		||||
        echo "${RELEASE}" >/opt/kometa_version.txt
 | 
			
		||||
        msg_ok "Updated $APP to ${RELEASE}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start kometa
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -f $temp_file
 | 
			
		||||
        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}${CL}"
 | 
			
		||||
@@ -34,7 +34,7 @@ function update_script() {
 | 
			
		||||
    fi
 | 
			
		||||
   
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/stonith404/pingvin-share/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    if [[ ! -f /opt/$pingvin_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/pingvin_version.txt)" ]]; then
 | 
			
		||||
    if [[ ! -f /opt/pingvin_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/pingvin_version.txt)" ]]; then
 | 
			
		||||
      
 | 
			
		||||
      msg_info "Stopping Pingvin Share"
 | 
			
		||||
      systemctl stop pm2-root.service
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
 | 
			
		||||
# App Default Values
 | 
			
		||||
APP="PocketID"
 | 
			
		||||
TAGS="identity-provider"
 | 
			
		||||
var_tags="identity-provider"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="4"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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}"
 | 
			
		||||
@@ -6,7 +6,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
# Source: https://github.com/YuukanOO/seelf
 | 
			
		||||
 | 
			
		||||
APP="seelf"
 | 
			
		||||
TAGS="server;docker"
 | 
			
		||||
var_tags="server;docker"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="4096"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/kris701/ProxmoxVE/refs/heads/main/misc/build.func)
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Kristian Skov
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
@@ -46,4 +46,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following IP:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}${IP}:1433${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}${IP}:1433${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="SuwayomiServer"
 | 
			
		||||
var_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}"
 | 
			
		||||
							
								
								
									
										71
									
								
								ct/tasmocompiler.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								ct/tasmocompiler.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Slaviša Arežina (tremor021)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/benzino77/tasmocompiler
 | 
			
		||||
 | 
			
		||||
APP="TasmoCompiler"
 | 
			
		||||
var_tags="compiler"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="2048"
 | 
			
		||||
var_disk="10"
 | 
			
		||||
var_os="debian"
 | 
			
		||||
var_version="12"
 | 
			
		||||
var_unprivileged="1"
 | 
			
		||||
 | 
			
		||||
header_info "$APP"
 | 
			
		||||
base_settings
 | 
			
		||||
 | 
			
		||||
variables
 | 
			
		||||
color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/tasmocompiler ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -s https://api.github.com/repos/benzino77/tasmocompiler/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 tasmocompiler
 | 
			
		||||
        msg_ok "Stopped $APP"
 | 
			
		||||
        msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
        cd /opt
 | 
			
		||||
        rm -rf /opt/tasmocompiler
 | 
			
		||||
        RELEASE=$(curl -s https://api.github.com/repos/benzino77/tasmocompiler/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
        wget -q https://github.com/benzino77/tasmocompiler/archive/refs/tags/v${RELEASE}.tar.gz
 | 
			
		||||
        tar xzf v${RELEASE}.tar.gz
 | 
			
		||||
        mv tasmocompiler-${RELEASE}/ /opt/tasmocompiler/
 | 
			
		||||
        cd /opt/tasmocompiler
 | 
			
		||||
        yarn install &> /dev/null
 | 
			
		||||
        export NODE_OPTIONS=--openssl-legacy-provider
 | 
			
		||||
        npm i &> /dev/null
 | 
			
		||||
        yarn build &> /dev/null
 | 
			
		||||
        msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
        msg_info "Starting $APP"
 | 
			
		||||
        systemctl start tasmocompiler
 | 
			
		||||
        msg_ok "Started $APP"
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_info "Cleaning up"
 | 
			
		||||
        rm -r "/opt/v${RELEASE}.tar.gz"
 | 
			
		||||
        msg_ok "Cleaned"
 | 
			
		||||
        msg_ok "Update Successful"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at v${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
var_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}"
 | 
			
		||||
@@ -7,7 +7,7 @@ source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/m
 | 
			
		||||
 | 
			
		||||
#App Default Values
 | 
			
		||||
APP="Zammad"
 | 
			
		||||
TAGS="webserver;ticket-system"
 | 
			
		||||
var_tags="webserver;ticket-system"
 | 
			
		||||
var_disk="8"
 | 
			
		||||
var_cpu="2"
 | 
			
		||||
var_ram="4096"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,10 @@ mkdir /opt/browserless
 | 
			
		||||
$STD python3 -m pip install playwright
 | 
			
		||||
$STD git clone https://github.com/browserless/chrome /opt/browserless
 | 
			
		||||
$STD npm install --prefix /opt/browserless
 | 
			
		||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps chrome chromium firefox webkit
 | 
			
		||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps &>/dev/null
 | 
			
		||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome &>/dev/null
 | 
			
		||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install chromium firefox webkit &>/dev/null
 | 
			
		||||
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force msedge
 | 
			
		||||
$STD npm run build --prefix /opt/browserless
 | 
			
		||||
$STD npm run build:function --prefix /opt/browserless
 | 
			
		||||
$STD npm prune production --prefix /opt/browserless
 | 
			
		||||
 
 | 
			
		||||
@@ -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,18 @@ $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 TemurinJDK"
 | 
			
		||||
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,11,17,21}-jre
 | 
			
		||||
sudo update-alternatives --set java /usr/lib/jvm/temurin-21-jre-amd64/bin/java
 | 
			
		||||
msg_ok "Installed TemurinJDK"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  python3 \
 | 
			
		||||
@@ -39,7 +44,6 @@ $STD apt-get install -y \
 | 
			
		||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Craty-Controller (Patience)"
 | 
			
		||||
useradd crafty -m -s /bin/bash
 | 
			
		||||
cd /opt
 | 
			
		||||
@@ -71,7 +75,7 @@ After=network.target
 | 
			
		||||
Type=simple
 | 
			
		||||
User=crafty
 | 
			
		||||
WorkingDirectory=/opt/crafty-controller/crafty/crafty-4
 | 
			
		||||
Environment=PATH=/opt/crafty-controller/crafty/.venv/bin:$PATH
 | 
			
		||||
Environment=PATH=/usr/lib/jvm/temurin-21-jre-amd64/bin:/opt/crafty-controller/crafty/.venv/bin:$PATH
 | 
			
		||||
ExecStart=/opt/crafty-controller/crafty/.venv/bin/python3 main.py -d
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
 | 
			
		||||
@@ -94,4 +98,4 @@ msg_info "Cleaning up"
 | 
			
		||||
rm -rf /opt/crafty-4-v${RELEASE}.zip
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										63
									
								
								install/cross-seed-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								install/cross-seed-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: Jakub Matraszek (jmatraszek)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://www.cross-seed.org
 | 
			
		||||
 | 
			
		||||
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 \
 | 
			
		||||
  gnupg
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_23.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Setup Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
msg_ok "Setup Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Cross-Seed"
 | 
			
		||||
$STD npm install cross-seed@latest -g
 | 
			
		||||
$STD cross-seed gen-config
 | 
			
		||||
msg_ok "Setup Cross-Seed"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/cross-seed.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Cross-Seed daemon Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
ExecStart=cross-seed daemon
 | 
			
		||||
Restart=always
 | 
			
		||||
User=root
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now cross-seed
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										73
									
								
								install/excalidraw-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								install/excalidraw-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
#!/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/excalidraw/excalidraw
 | 
			
		||||
 | 
			
		||||
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 \
 | 
			
		||||
  gnupg \
 | 
			
		||||
  xdg-utils
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Setup Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Node.js"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
$STD npm install -g yarn
 | 
			
		||||
msg_ok "Setup Node.js"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Excalidraw"
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/excalidraw/excalidraw/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q "https://github.com/excalidraw/excalidraw/archive/refs/tags/v${RELEASE}.tar.gz" -O $temp_file
 | 
			
		||||
tar xzf $temp_file
 | 
			
		||||
mv excalidraw-${RELEASE} /opt/excalidraw
 | 
			
		||||
cd /opt/excalidraw
 | 
			
		||||
$STD yarn
 | 
			
		||||
echo "${RELEASE}" >/opt/excalidraw_version.txt
 | 
			
		||||
msg_ok "Setup Excalidraw"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/excalidraw.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Excalidraw Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
WorkingDirectory=/opt/excalidraw
 | 
			
		||||
ExecStart=/usr/bin/yarn start --host
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now excalidraw
 | 
			
		||||
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"
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
@@ -48,13 +48,13 @@ if [[ "$CTTYPE" == "0" ]]; then
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "Set Up Hardware Acceleration"
 | 
			
		||||
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/blakeblackshear/frigate/releases/latest | jq -r '.tag_name')
 | 
			
		||||
#RELEASE=$(curl -s https://api.github.com/repos/blakeblackshear/frigate/releases/latest | jq -r '.tag_name')
 | 
			
		||||
msg_ok "Stop spinner to prevent segmentation fault"
 | 
			
		||||
msg_info "Installing Frigate $RELEASE (Perseverance)"
 | 
			
		||||
msg_info "Installing Frigate v0.14.1 (Perseverance)"
 | 
			
		||||
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
 | 
			
		||||
cd ~
 | 
			
		||||
mkdir -p /opt/frigate/models
 | 
			
		||||
wget -q https://github.com/blakeblackshear/frigate/archive/refs/tags/${RELEASE}.tar.gz -O frigate.tar.gz
 | 
			
		||||
wget -q https://github.com/blakeblackshear/frigate/archive/refs/tags/v0.14.1.tar.gz -O frigate.tar.gz
 | 
			
		||||
tar -xzf frigate.tar.gz -C /opt/frigate --strip-components 1
 | 
			
		||||
rm -rf frigate.tar.gz
 | 
			
		||||
cd /opt/frigate
 | 
			
		||||
@@ -102,7 +102,7 @@ else
 | 
			
		||||
  sed -i -e 's/^kvm:x:104:$/render:x:104:frigate/' -e 's/^render:x:105:$/kvm:x:105:/' /etc/group
 | 
			
		||||
fi
 | 
			
		||||
echo "tmpfs   /tmp/cache      tmpfs   defaults        0       0" >> /etc/fstab
 | 
			
		||||
msg_ok "Installed Frigate $RELEASE"
 | 
			
		||||
msg_ok "Installed Frigate"
 | 
			
		||||
 | 
			
		||||
if grep -q -o -m1 -E 'avx[^ ]*' /proc/cpuinfo; then
 | 
			
		||||
  msg_ok "AVX Support Detected"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										65
									
								
								install/graylog-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								install/graylog-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
#!/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://graylog.org/
 | 
			
		||||
 | 
			
		||||
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 \
 | 
			
		||||
  gnupg
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup MongoDB"
 | 
			
		||||
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
 | 
			
		||||
echo "deb [signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] https://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main" >/etc/apt/sources.list.d/mongodb-org-7.0.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y mongodb-org
 | 
			
		||||
$STD apt-mark hold mongodb-org
 | 
			
		||||
systemctl enable -q --now mongod
 | 
			
		||||
msg_ok "Setup MongoDB"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Graylog Data Node"
 | 
			
		||||
PASSWORD_SECRET=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16)
 | 
			
		||||
wget -q https://packages.graylog2.org/repo/packages/graylog-6.1-repository_latest.deb
 | 
			
		||||
$STD dpkg -i graylog-6.1-repository_latest.deb
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install graylog-datanode -y
 | 
			
		||||
sed -i "s/password_secret =/password_secret = $PASSWORD_SECRET/g" /etc/graylog/datanode/datanode.conf
 | 
			
		||||
systemctl enable -q --now graylog-datanode
 | 
			
		||||
msg_ok "Setup Graylog Data Node"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup ${APPLICATION}"
 | 
			
		||||
$STD apt-get install graylog-server
 | 
			
		||||
ROOT_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c16)
 | 
			
		||||
{
 | 
			
		||||
    echo "${APPLICATION} Credentials"
 | 
			
		||||
    echo "Admin User: admin"
 | 
			
		||||
    echo "Admin Password: ${ROOT_PASSWORD}"
 | 
			
		||||
} >> ~/graylog.creds
 | 
			
		||||
ROOT_PASSWORD=$(echo -n $ROOT_PASSWORD | shasum -a 256 | awk '{print $1}')
 | 
			
		||||
sed -i "s/password_secret =/password_secret = $PASSWORD_SECRET/g" /etc/graylog/server/server.conf
 | 
			
		||||
sed -i "s/root_password_sha2 =/root_password_sha2 = $ROOT_PASSWORD/g" /etc/graylog/server/server.conf
 | 
			
		||||
sed -i 's/#http_bind_address = 127.0.0.1.*/http_bind_address = 0.0.0.0:9000/g' /etc/graylog/server/server.conf
 | 
			
		||||
systemctl enable -q --now graylog-server
 | 
			
		||||
msg_ok "Setup ${APPLICATION}"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f graylog-*-repository_latest.deb
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
							
								
								
									
										74
									
								
								install/kometa-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								install/kometa-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
#!/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/Kometa-Team/Kometa
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<< "$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
    curl \
 | 
			
		||||
    mc \
 | 
			
		||||
    sudo
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Python 3"
 | 
			
		||||
$STD apt-get install python3-pip -y
 | 
			
		||||
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
			
		||||
msg_ok "Setup Python 3"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Kometa"
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/Kometa-Team/Kometa/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q "https://github.com/Kometa-Team/Kometa/archive/refs/tags/v${RELEASE}.tar.gz" -O "$temp_file"
 | 
			
		||||
tar -xzf "$temp_file"
 | 
			
		||||
mv Kometa-${RELEASE} /opt/kometa
 | 
			
		||||
cd /opt/kometa
 | 
			
		||||
$STD pip install -r requirements.txt --ignore-installed
 | 
			
		||||
mkdir -p config/assets
 | 
			
		||||
cp config/config.yml.template config/config.yml
 | 
			
		||||
echo "${RELEASE}" >/opt/kometa_version.txt
 | 
			
		||||
msg_ok "Setup Kometa"
 | 
			
		||||
 | 
			
		||||
read -p "Enter your TMDb API key: " TMDBKEY
 | 
			
		||||
read -p "Enter your Plex URL: " PLEXURL
 | 
			
		||||
read -p "Enter your Plex token: " PLEXTOKEN
 | 
			
		||||
sed -i -e "s#url: http://192.168.1.12:32400#url: $PLEXURL#g" /opt/kometa/config/config.yml
 | 
			
		||||
sed -i -e "s/token: ####################/token: $PLEXTOKEN/g" /opt/kometa/config/config.yml
 | 
			
		||||
sed -i -e "s/apikey: ################################/apikey: $TMDBKEY/g" /opt/kometa/config/config.yml
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/kometa.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Kometa Service
 | 
			
		||||
After=network-online.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
WorkingDirectory=/opt/kometa
 | 
			
		||||
ExecStart=/usr/bin/python3 kometa.py
 | 
			
		||||
Restart=always
 | 
			
		||||
RestartSec=30
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable --now -q kometa
 | 
			
		||||
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"
 | 
			
		||||
@@ -1,10 +1,8 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 tteck
 | 
			
		||||
# Author: tteck
 | 
			
		||||
# Co-Author: MickLesk (Canbiz)
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Author: MickLesk (Canbiz)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/gnmyt/myspeed
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
@@ -18,6 +16,9 @@ update_os
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  curl \
 | 
			
		||||
  build-essential \
 | 
			
		||||
  g++ \
 | 
			
		||||
  make \
 | 
			
		||||
  sudo \
 | 
			
		||||
  make \
 | 
			
		||||
  gpg \
 | 
			
		||||
@@ -73,4 +74,4 @@ msg_info "Cleaning up"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
rm -rf /opt/MySpeed-$RELEASE.zip
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,11 @@ $STD apt-get install -y \
 | 
			
		||||
	curl \
 | 
			
		||||
	sudo \
 | 
			
		||||
	mc \
 | 
			
		||||
	gpg
 | 
			
		||||
	gpg \
 | 
			
		||||
  make \
 | 
			
		||||
  gcc \
 | 
			
		||||
  g++ \
 | 
			
		||||
  build-essential
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
@@ -23,11 +23,13 @@ $STD apt install -y \
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup SQL Server 2022"
 | 
			
		||||
$STD curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
 | 
			
		||||
$STD curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | tee /etc/apt/sources.list.d/mssql-server-2022.list
 | 
			
		||||
curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg
 | 
			
		||||
curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | sudo tee /etc/apt/sources.list.d/mssql-server-2022.list
 | 
			
		||||
#$STD curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc
 | 
			
		||||
#$STD curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | tee /etc/apt/sources.list.d/mssql-server-2022.list
 | 
			
		||||
$STD apt-get clean *
 | 
			
		||||
$STD apt-get update -y
 | 
			
		||||
$STD apt-get install -y mssql-server
 | 
			
		||||
apt-get install -y mssql-server
 | 
			
		||||
msg_ok "Setup Server 2022"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing SQL Server Tools"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
							
								
								
									
										87
									
								
								install/tasmocompiler-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								install/tasmocompiler-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
#!/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/benzino77/tasmocompiler
 | 
			
		||||
 | 
			
		||||
# Import Functions und Setup
 | 
			
		||||
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 \
 | 
			
		||||
  gnupg \
 | 
			
		||||
  git
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Python3"
 | 
			
		||||
$STD apt-get install -y python3-venv
 | 
			
		||||
msg_ok "Setup Python3"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Node.js & yarn"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
$STD npm install -g yarn
 | 
			
		||||
msg_ok "Setup Node.js & yarn"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Platformio"
 | 
			
		||||
curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
 | 
			
		||||
$STD python3 get-platformio.py
 | 
			
		||||
msg_ok "Setup Platformio"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup TasmoCompiler"
 | 
			
		||||
mkdir /tmp/Tasmota
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/benzino77/tasmocompiler/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
wget -q https://github.com/benzino77/tasmocompiler/archive/refs/tags/v${RELEASE}.tar.gz -O /tmp/v${RELEASE}.tar.gz
 | 
			
		||||
cd /tmp
 | 
			
		||||
tar xzf /tmp/v${RELEASE}.tar.gz
 | 
			
		||||
mv tasmocompiler-${RELEASE}/ /opt/tasmocompiler/
 | 
			
		||||
cd /opt/tasmocompiler
 | 
			
		||||
$STD yarn install
 | 
			
		||||
export NODE_OPTIONS=--openssl-legacy-provider
 | 
			
		||||
$STD npm i
 | 
			
		||||
$STD yarn build
 | 
			
		||||
mkdir -p /usr/local/bin
 | 
			
		||||
ln -s ~/.platformio/penv/bin/platformio /usr/local/bin/platformio
 | 
			
		||||
ln -s ~/.platformio/penv/bin/pio /usr/local/bin/pio
 | 
			
		||||
ln -s ~/.platformio/penv/bin/piodebuggdb /usr/local/bin/piodebuggdb
 | 
			
		||||
echo "${RELEASE}" >"/opt/tasmocompiler_version.txt"
 | 
			
		||||
msg_ok "Setup TasmoCompiler"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/tasmocompiler.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=TasmoCompiler Service
 | 
			
		||||
After=multi-user.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=root
 | 
			
		||||
ExecStart=/usr/bin/node /opt/tasmocompiler/server/app.js
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now tasmocompiler
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f /tmp/v${RELEASE}.tar.gz
 | 
			
		||||
$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"
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
          "cpu": 1,
 | 
			
		||||
          "ram": 512,
 | 
			
		||||
          "hdd": 2,
 | 
			
		||||
          "os": "Debian",
 | 
			
		||||
          "os": "debian",
 | 
			
		||||
          "version": "12"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 4,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								json/cross-seed.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/cross-seed.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "cross-seed",
 | 
			
		||||
    "slug": "cross-seed",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        14
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-07",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 2468,
 | 
			
		||||
    "documentation": "https://www.cross-seed.org/docs/category/basics",
 | 
			
		||||
    "website": "https://www.cross-seed.org/",
 | 
			
		||||
    "logo": "https://www.cross-seed.org/img/cross-seed.svg",
 | 
			
		||||
    "description": "cross-seed is an app designed to help you download torrents that you can cross seed based on your existing torrents. It is designed to match conservatively to minimize manual intervention.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/cross-seed.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 1024,
 | 
			
		||||
                "hdd": 2,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
      {
 | 
			
		||||
        "text": "After the installation cross-seed will fail to start with an empty configuration. To fix this, edit `~/.cross-seed/config.js` to properly configure cross-seed, then restart by running `systemctl restart cross-seed`.",
 | 
			
		||||
        "type": "info"
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
@@ -30,5 +30,10 @@
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
      "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "after installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/836´",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -32,8 +32,8 @@
 | 
			
		||||
    },
 | 
			
		||||
    "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"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								json/excalidraw.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								json/excalidraw.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Excalidraw",
 | 
			
		||||
    "slug": "excalidraw",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        12
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-12",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 3000,
 | 
			
		||||
    "documentation": "https://docs.excalidraw.com/docs",
 | 
			
		||||
    "website": "https://excalidraw.com/",
 | 
			
		||||
    "logo": "https://docs.excalidraw.com/img/logo.svg",
 | 
			
		||||
    "description": "An open source virtual hand-drawn style whiteboard. Collaborative and end-to-end encrypted.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
      {
 | 
			
		||||
        "type": "default",
 | 
			
		||||
        "script": "ct/excalidraw.sh",
 | 
			
		||||
        "resources": {
 | 
			
		||||
          "cpu": 2,
 | 
			
		||||
          "ram": 3072,
 | 
			
		||||
          "hdd": 6,
 | 
			
		||||
          "os": "debian",
 | 
			
		||||
          "version": "12"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
      "username": null,
 | 
			
		||||
      "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
  }
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 1024,
 | 
			
		||||
        "hdd": 2,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										43
									
								
								json/graylog.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								json/graylog.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Graylog",
 | 
			
		||||
    "slug": "graylog",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        9
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-12",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 9000,
 | 
			
		||||
    "documentation": "https://go2docs.graylog.org/current/home.htm",
 | 
			
		||||
    "website": "https://graylog.org/",
 | 
			
		||||
    "logo": "https://graylog.org/wp-content/uploads/2023/11/gl-logo-horiz-all-white-1200w-300x96.png.webp",
 | 
			
		||||
    "description": "Graylog is a free and open log management platform.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/graylog.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 2,
 | 
			
		||||
                "ram": 8192,
 | 
			
		||||
                "hdd": 30,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
        "text": "Initial Setup credentials: `tail /var/log/graylog-server/server.log` after the server starts for the first time.",
 | 
			
		||||
        "type": "info"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
        "text": "Type `cat ~/graylog.creds` to get admin password that you use to log in AFTER the Initial Setup",
 | 
			
		||||
        "type": "info"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
          "cpu": 2,
 | 
			
		||||
          "ram": 1024,
 | 
			
		||||
          "hdd": 4,
 | 
			
		||||
          "os": "Debian",
 | 
			
		||||
          "os": "debian",
 | 
			
		||||
          "version": "12"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 7,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								json/kometa.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/kometa.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Kometa",
 | 
			
		||||
    "slug": "kometa",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        13
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-12",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": null,
 | 
			
		||||
    "documentation": "https://kometa.wiki/en/latest/",
 | 
			
		||||
    "website": "https://github.com/Kometa-Team/Kometa",
 | 
			
		||||
    "logo": "https://kometa.wiki/en/latest/assets/icon.png",
 | 
			
		||||
    "description": "Kometa (formerly known as Plex Meta Manager) is a powerful tool designed to give you complete control over your media libraries",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
      {
 | 
			
		||||
        "type": "default",
 | 
			
		||||
        "script": "ct/kometa.sh",
 | 
			
		||||
        "resources": {
 | 
			
		||||
          "cpu": 1,
 | 
			
		||||
          "ram": 1024,
 | 
			
		||||
          "hdd": 4,
 | 
			
		||||
          "os": "debian",
 | 
			
		||||
          "version": "12"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
      "username": null,
 | 
			
		||||
      "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
      {
 | 
			
		||||
        "text": "During installation you will be prompted to input your TMDb key, Plex URL and Plex token. Make sure you have them ready.",
 | 
			
		||||
        "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": [
 | 
			
		||||
    {
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 10,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@@ -36,4 +36,4 @@
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 1024,
 | 
			
		||||
        "hdd": 5,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
          "cpu": 2,
 | 
			
		||||
          "ram": 2048,
 | 
			
		||||
          "hdd": 4,
 | 
			
		||||
          "os": "Debian",
 | 
			
		||||
          "os": "debian",
 | 
			
		||||
          "version": "12"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								json/opnsense-vm.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								json/opnsense-vm.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "OPNsense",
 | 
			
		||||
  "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"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
          "cpu": 2,
 | 
			
		||||
          "ram": 2048,
 | 
			
		||||
          "hdd": 10,
 | 
			
		||||
          "os": "Debian",
 | 
			
		||||
          "os": "debian",
 | 
			
		||||
          "version": "12"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 4,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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/tasmocompiler.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								json/tasmocompiler.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "TasmoCompiler",
 | 
			
		||||
    "slug": "tasmocompiler",
 | 
			
		||||
    "categories": [
 | 
			
		||||
        16
 | 
			
		||||
    ],
 | 
			
		||||
    "date_created": "2025-02-10",
 | 
			
		||||
    "type": "ct",
 | 
			
		||||
    "updateable": true,
 | 
			
		||||
    "privileged": false,
 | 
			
		||||
    "interface_port": 3000,
 | 
			
		||||
    "documentation": "https://github.com/benzino77/tasmocompiler/blob/master/README.md",
 | 
			
		||||
    "website": "https://github.com/benzino77/tasmocompiler",
 | 
			
		||||
    "logo": "https://github.com/benzino77/tasmocompiler/raw/master/docs/logo/tasmocompiler-symbol.svg",
 | 
			
		||||
    "description": "TasmoCompiler is a simple web GUI which allows you to compile fantastic Tasmota firmware with your own settings.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
            "type": "default",
 | 
			
		||||
            "script": "ct/tasmocompiler.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 2,
 | 
			
		||||
                "ram": 2048,
 | 
			
		||||
                "hdd": 10,
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
}
 | 
			
		||||
@@ -30,5 +30,10 @@
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
      "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "after installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/272´",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,5 +30,10 @@
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
      "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "after installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/272´",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,5 +30,10 @@
 | 
			
		||||
        "username": null,
 | 
			
		||||
        "password": null
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
      "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "after installation, checkout: ´https://github.com/community-scripts/ProxmoxVE/discussions/272´",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 1024,
 | 
			
		||||
        "hdd": 5,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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.",
 | 
			
		||||
@@ -31,4 +31,4 @@
 | 
			
		||||
        "password": "password"
 | 
			
		||||
    },
 | 
			
		||||
    "notes": []
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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,12 +7,12 @@
 | 
			
		||||
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"
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user