mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	Compare commits
	
		
			106 Commits
		
	
	
		
			2025-05-01
			...
			2025-05-09
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					456b00882d | ||
| 
						 | 
					9b8a30c84f | ||
| 
						 | 
					3b90e3fe15 | ||
| 
						 | 
					5e3a5bb24c | ||
| 
						 | 
					7413a03009 | ||
| 
						 | 
					bb1c9d73c4 | ||
| 
						 | 
					3b5a901832 | ||
| 
						 | 
					a62a4876ec | ||
| 
						 | 
					9d21ceacc3 | ||
| 
						 | 
					c604aeb064 | ||
| 
						 | 
					9b9ed2f6e1 | ||
| 
						 | 
					1ddc74d2b5 | ||
| 
						 | 
					ee9f6dd818 | ||
| 
						 | 
					a1754dff4e | ||
| 
						 | 
					4827a17ba3 | ||
| 
						 | 
					b5ed7b9f4e | ||
| 
						 | 
					ab9760194d | ||
| 
						 | 
					abb5b6d5ac | ||
| 
						 | 
					4656fe21f9 | ||
| 
						 | 
					93e503eb87 | ||
| 
						 | 
					6ab80dc5e3 | ||
| 
						 | 
					ceaff9006a | ||
| 
						 | 
					c749fe6fb0 | ||
| 
						 | 
					402586756f | ||
| 
						 | 
					19800da808 | ||
| 
						 | 
					d62da0c982 | ||
| 
						 | 
					41df1d5a76 | ||
| 
						 | 
					bcdf8f15e7 | ||
| 
						 | 
					326cbc3bec | ||
| 
						 | 
					607d966322 | ||
| 
						 | 
					69298090ce | ||
| 
						 | 
					9c7d50fdff | ||
| 
						 | 
					fabbe8fe59 | ||
| 
						 | 
					6abb55ba86 | ||
| 
						 | 
					9cddbbd986 | ||
| 
						 | 
					31c7c9301c | ||
| 
						 | 
					c9aad3a54d | ||
| 
						 | 
					ebc17e120e | ||
| 
						 | 
					1ebb1782fa | ||
| 
						 | 
					cce3ca1996 | ||
| 
						 | 
					eb6018ac01 | ||
| 
						 | 
					3b54371d5c | ||
| 
						 | 
					67cd29e9f2 | ||
| 
						 | 
					0f4c14ff41 | ||
| 
						 | 
					5d9795139e | ||
| 
						 | 
					0bbbd5de10 | ||
| 
						 | 
					8963d8dec9 | ||
| 
						 | 
					eeb7766f36 | ||
| 
						 | 
					e7d4630fa5 | ||
| 
						 | 
					0f19440864 | ||
| 
						 | 
					d0a3510b96 | ||
| 
						 | 
					0946b5220f | ||
| 
						 | 
					d5a64ee41c | ||
| 
						 | 
					067d60978c | ||
| 
						 | 
					4b89174542 | ||
| 
						 | 
					0a2a1b4692 | ||
| 
						 | 
					4d99838209 | ||
| 
						 | 
					27ac2633c7 | ||
| 
						 | 
					1bff7fe861 | ||
| 
						 | 
					a9c36a9417 | ||
| 
						 | 
					8e26cd4d9d | ||
| 
						 | 
					237c920893 | ||
| 
						 | 
					354d95eb2d | ||
| 
						 | 
					e7f0f09dee | ||
| 
						 | 
					093a1aacf6 | ||
| 
						 | 
					afbac8e2f0 | ||
| 
						 | 
					17c3163a2a | ||
| 
						 | 
					f0a96b9a7b | ||
| 
						 | 
					e5766da56d | ||
| 
						 | 
					0239abb126 | ||
| 
						 | 
					06960d3023 | ||
| 
						 | 
					fd813b8936 | ||
| 
						 | 
					fa9c39f212 | ||
| 
						 | 
					536c3d113d | ||
| 
						 | 
					23281bdc0c | ||
| 
						 | 
					cc5d8e162b | ||
| 
						 | 
					5c43513295 | ||
| 
						 | 
					6c648f4b89 | ||
| 
						 | 
					9f88b1b1fb | ||
| 
						 | 
					0ea0f56e1b | ||
| 
						 | 
					bff0ab3d3d | ||
| 
						 | 
					1f56a8cc6d | ||
| 
						 | 
					eaebc184b1 | ||
| 
						 | 
					b9594538ca | ||
| 
						 | 
					8e56da691a | ||
| 
						 | 
					c9f739ae3b | ||
| 
						 | 
					2ba1aaa383 | ||
| 
						 | 
					4510e7b4d8 | ||
| 
						 | 
					9f1bf85b42 | ||
| 
						 | 
					a2a528c294 | ||
| 
						 | 
					15ec09d71c | ||
| 
						 | 
					57a18aec76 | ||
| 
						 | 
					8fa1743dd6 | ||
| 
						 | 
					78bb1ee195 | ||
| 
						 | 
					130031e4f9 | ||
| 
						 | 
					ea9f91036e | ||
| 
						 | 
					783e7518f8 | ||
| 
						 | 
					64595b08ce | ||
| 
						 | 
					43d67cff58 | ||
| 
						 | 
					4ae2eb2bfa | ||
| 
						 | 
					6220e272af | ||
| 
						 | 
					dc36ba409c | ||
| 
						 | 
					15deb9c658 | ||
| 
						 | 
					07d87334d5 | ||
| 
						 | 
					39300b2b6e | ||
| 
						 | 
					3b2aa30d48 | 
@@ -10,6 +10,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  update-app-files:
 | 
					  update-app-files:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
@@ -90,14 +91,15 @@ jobs:
 | 
				
			|||||||
            gh pr review $PR_NUMBER --approve
 | 
					            gh pr review $PR_NUMBER --approve
 | 
				
			||||||
          fi
 | 
					          fi
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
      - name: Re-approve pull request after update
 | 
					      - name: Approve pull request and merge
 | 
				
			||||||
        if: env.changed == 'true'
 | 
					        if: env.changed == 'true'
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
					          GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number')
 | 
					          PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number')
 | 
				
			||||||
          if [ -n "$PR_NUMBER" ]; then
 | 
					          if [ -n "$PR_NUMBER" ]; then
 | 
				
			||||||
            gh pr review $PR_NUMBER --approve
 | 
					            gh pr review $PR_NUMBER --approve
 | 
				
			||||||
 | 
					            gh pr merge $PR_NUMBER --squash --admin
 | 
				
			||||||
          fi
 | 
					          fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      # Step 8: Output success message when no changes
 | 
					      # Step 8: Output success message when no changes
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/workflows/autolabeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/autolabeler.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,6 +7,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  autolabeler:
 | 
					  autolabeler:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      pull-requests: write
 | 
					      pull-requests: write
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,6 +7,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  update-changelog-pull-request:
 | 
					  update-changelog-pull-request:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    env:
 | 
					    env:
 | 
				
			||||||
      CONFIG_PATH: .github/changelog-pr-config.json
 | 
					      CONFIG_PATH: .github/changelog-pr-config.json
 | 
				
			||||||
@@ -263,6 +264,17 @@ jobs:
 | 
				
			|||||||
            gh pr review $PR_NUMBER --approve
 | 
					            gh pr review $PR_NUMBER --approve
 | 
				
			||||||
          fi
 | 
					          fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Approve pull request and merge
 | 
				
			||||||
 | 
					        if: env.changed == 'true'
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
 | 
				
			||||||
 | 
					          if [ -n "$PR_NUMBER" ]; then
 | 
				
			||||||
 | 
					            gh pr review $PR_NUMBER --approve
 | 
				
			||||||
 | 
					            gh pr merge $PR_NUMBER --squash --admin
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Re-approve pull request after update
 | 
					      - name: Re-approve pull request after update
 | 
				
			||||||
        if: env.changed == 'true'
 | 
					        if: env.changed == 'true'
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/workflows/close-discussion.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/close-discussion.yml
									
									
									
									
										vendored
									
									
								
							@@ -11,6 +11,7 @@ permissions:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  close-discussion:
 | 
					  close-discussion:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/workflows/close-ttek-issues.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/close-ttek-issues.yaml
									
									
									
									
										vendored
									
									
								
							@@ -5,6 +5,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  close_tteck_issues:
 | 
					  close_tteck_issues:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Auto-close if tteck script detected
 | 
					      - name: Auto-close if tteck script detected
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/close_issue_in_dev.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/close_issue_in_dev.yaml
									
									
									
									
										vendored
									
									
								
							@@ -5,7 +5,7 @@ on:
 | 
				
			|||||||
      - closed
 | 
					      - closed
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  close_issue:
 | 
					  close_issue:
 | 
				
			||||||
    if: github.event.pull_request.merged == true
 | 
					    if: github.event.pull_request.merged == true && github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								.github/workflows/crawl-versions.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/crawl-versions.yaml
									
									
									
									
										vendored
									
									
								
							@@ -12,6 +12,7 @@ permissions:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  crawl-versions:
 | 
					  crawl-versions:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
@@ -103,6 +104,17 @@ jobs:
 | 
				
			|||||||
            gh pr review $PR_NUMBER --approve
 | 
					            gh pr review $PR_NUMBER --approve
 | 
				
			||||||
          fi
 | 
					          fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Approve pull request and merge
 | 
				
			||||||
 | 
					        if: env.changed == 'true'
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          PR_NUMBER=$(gh pr list --head "update_versions" --json number --jq '.[].number')
 | 
				
			||||||
 | 
					          if [ -n "$PR_NUMBER" ]; then
 | 
				
			||||||
 | 
					            gh pr review $PR_NUMBER --approve
 | 
				
			||||||
 | 
					            gh pr merge $PR_NUMBER --squash --admin
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Re-approve pull request after update
 | 
					      - name: Re-approve pull request after update
 | 
				
			||||||
        if: env.changed == 'true'
 | 
					        if: env.changed == 'true'
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: ubuntu-latest #To ensure it always builds we use the github runner with all the right tooling
 | 
					    runs-on: ubuntu-latest #To ensure it always builds we use the github runner with all the right tooling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/workflows/delete-json-branch.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/delete-json-branch.yml
									
									
									
									
										vendored
									
									
								
							@@ -9,6 +9,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  delete_branch:
 | 
					  delete_branch:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout the code
 | 
					      - name: Checkout the code
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								.github/workflows/frontend-cicd.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/frontend-cicd.yml
									
									
									
									
										vendored
									
									
								
							@@ -25,6 +25,7 @@ concurrency:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  build:
 | 
					  build:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    defaults:
 | 
					    defaults:
 | 
				
			||||||
      run:
 | 
					      run:
 | 
				
			||||||
@@ -63,7 +64,7 @@ jobs:
 | 
				
			|||||||
  deploy:
 | 
					  deploy:
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    needs: build
 | 
					    needs: build
 | 
				
			||||||
    if: github.ref == 'refs/heads/main'
 | 
					    if: github.ref == 'refs/heads/main' && github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      pages: write
 | 
					      pages: write
 | 
				
			||||||
      id-token: write
 | 
					      id-token: write
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/workflows/github-release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/github-release.yml
									
									
									
									
										vendored
									
									
								
							@@ -7,6 +7,7 @@ on:
 | 
				
			|||||||
  
 | 
					  
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  create-daily-release:
 | 
					  create-daily-release:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
      contents: write
 | 
					      contents: write
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/script-test.yml
									
									
									
									
										vendored
									
									
								
							@@ -11,6 +11,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  run-install-script:
 | 
					  run-install-script:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: pvenode
 | 
					    runs-on: pvenode
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout PR branch
 | 
					      - name: Checkout PR branch
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/workflows/script_format.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/script_format.yml
									
									
									
									
										vendored
									
									
								
							@@ -11,6 +11,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  run-install-script:
 | 
					  run-install-script:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: pvenode
 | 
					    runs-on: pvenode
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout PR branch (supports forks)
 | 
					      - name: Checkout PR branch (supports forks)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								.github/workflows/update-json-date.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/update-json-date.yml
									
									
									
									
										vendored
									
									
								
							@@ -10,6 +10,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  update-app-files:
 | 
					  update-app-files:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
@@ -125,6 +126,16 @@ jobs:
 | 
				
			|||||||
          if [ -n "$PR_NUMBER" ]; then
 | 
					          if [ -n "$PR_NUMBER" ]; then
 | 
				
			||||||
            gh pr review $PR_NUMBER --approve
 | 
					            gh pr review $PR_NUMBER --approve
 | 
				
			||||||
          fi
 | 
					          fi
 | 
				
			||||||
 | 
					      - name: Approve pull request and merge
 | 
				
			||||||
 | 
					        if: env.changed == 'true'
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
 | 
				
			||||||
 | 
					        run: |
 | 
				
			||||||
 | 
					          PR_NUMBER=$(gh pr list --head "${{ env.BRANCH_NAME }}" --json number --jq '.[].number')
 | 
				
			||||||
 | 
					          if [ -n "$PR_NUMBER" ]; then
 | 
				
			||||||
 | 
					            gh pr review $PR_NUMBER --approve
 | 
				
			||||||
 | 
					            gh pr merge $PR_NUMBER --squash --admin
 | 
				
			||||||
 | 
					          fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: No changes detected
 | 
					      - name: No changes detected
 | 
				
			||||||
        if: env.changed == 'false'
 | 
					        if: env.changed == 'false'
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								.github/workflows/validate-filenames.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/validate-filenames.yml
									
									
									
									
										vendored
									
									
								
							@@ -9,6 +9,7 @@ on:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  check-files:
 | 
					  check-files:
 | 
				
			||||||
 | 
					    if: github.repository == 'community-scripts/ProxmoxVE'
 | 
				
			||||||
    name: Check changed files
 | 
					    name: Check changed files
 | 
				
			||||||
    runs-on: runner-cluster-htl-set
 | 
					    runs-on: runner-cluster-htl-set
 | 
				
			||||||
    permissions:
 | 
					    permissions:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										150
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										150
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -14,6 +14,156 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
 | 
				
			|||||||
All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
 | 
					All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-09
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Authentik: change install to UV & increase resources to 10GB RAM [@MickLesk](https://github.com/MickLesk) ([#4364](https://github.com/community-scripts/ProxmoxVE/pull/4364))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - HomeAssistant-Core: update script for 2025.5+ [@MickLesk](https://github.com/MickLesk) ([#4363](https://github.com/community-scripts/ProxmoxVE/pull/4363))
 | 
				
			||||||
 | 
					    - Feature: autologin for Alpine [@MickLesk](https://github.com/MickLesk) ([#4344](https://github.com/community-scripts/ProxmoxVE/pull/4344))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 💾 Core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - fix: detect all bridge types, not just vmbr prefix [@filippolauria](https://github.com/filippolauria) ([#4351](https://github.com/community-scripts/ProxmoxVE/pull/4351))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📂 Github
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Add a Repo check to all Workflows [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4339](https://github.com/community-scripts/ProxmoxVE/pull/4339))
 | 
				
			||||||
 | 
					    - Auto-Merge Automatic PR [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4343](https://github.com/community-scripts/ProxmoxVE/pull/4343))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-08
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - SearXNG: fix to resolve yaml dependency error [@Biendeo](https://github.com/Biendeo) ([#4322](https://github.com/community-scripts/ProxmoxVE/pull/4322))
 | 
				
			||||||
 | 
					    - Bugfix: Mikrotik & Pimox HAOS VM (NEXTID) [@MickLesk](https://github.com/MickLesk) ([#4313](https://github.com/community-scripts/ProxmoxVE/pull/4313))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 💾 Core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - build.func Change the menu for Bridge Selection [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4326](https://github.com/community-scripts/ProxmoxVE/pull/4326))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - FAQ: Explanation "updatable" [@tremor021](https://github.com/tremor021) ([#4300](https://github.com/community-scripts/ProxmoxVE/pull/4300))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-07
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Alpine scripts: Set minimum disk space to 0.5GB [@tremor021](https://github.com/tremor021) ([#4288](https://github.com/community-scripts/ProxmoxVE/pull/4288))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - SuwayomiServer: Bump Java to v21, code formating [@tremor021](https://github.com/tremor021) ([#3987](https://github.com/community-scripts/ProxmoxVE/pull/3987))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Feature: get correct next VMID [@MickLesk](https://github.com/MickLesk) ([#4292](https://github.com/community-scripts/ProxmoxVE/pull/4292))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - OpenWebUI: Update docs link [@tremor021](https://github.com/tremor021) ([#4298](https://github.com/community-scripts/ProxmoxVE/pull/4298))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-06
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - alpine-transmission ([#4277](https://github.com/community-scripts/ProxmoxVE/pull/4277))
 | 
				
			||||||
 | 
					- streamlink-webui ([#4262](https://github.com/community-scripts/ProxmoxVE/pull/4262))
 | 
				
			||||||
 | 
					- Fumadocs ([#4263](https://github.com/community-scripts/ProxmoxVE/pull/4263))
 | 
				
			||||||
 | 
					- alpine-rclone ([#4265](https://github.com/community-scripts/ProxmoxVE/pull/4265))
 | 
				
			||||||
 | 
					- alpine-tinyauth ([#4264](https://github.com/community-scripts/ProxmoxVE/pull/4264))
 | 
				
			||||||
 | 
					- Re-Add: ActualBudget [@MickLesk](https://github.com/MickLesk) ([#4228](https://github.com/community-scripts/ProxmoxVE/pull/4228))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - whiptail menu - cancel button now exists the advanced menu [@MickLesk](https://github.com/MickLesk) ([#4259](https://github.com/community-scripts/ProxmoxVE/pull/4259))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-05
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🆕 New Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Alpine-Komodo [@MickLesk](https://github.com/MickLesk) ([#4234](https://github.com/community-scripts/ProxmoxVE/pull/4234))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Docker VM: Fix variable doublequoting [@tremor021](https://github.com/tremor021) ([#4245](https://github.com/community-scripts/ProxmoxVE/pull/4245))
 | 
				
			||||||
 | 
					    - Alpine-Vaultwarden: Fix sed and better cert generation [@tremor021](https://github.com/tremor021) ([#4232](https://github.com/community-scripts/ProxmoxVE/pull/4232))
 | 
				
			||||||
 | 
					    - Apache Guacamole: Fix Version Grepping [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4229](https://github.com/community-scripts/ProxmoxVE/pull/4229))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### ✨ New Features
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Docker-VM: Add Disk Size choice [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4241](https://github.com/community-scripts/ProxmoxVE/pull/4241))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🔧 Refactor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Refactor: Komodo update logic [@MickLesk](https://github.com/MickLesk) ([#4231](https://github.com/community-scripts/ProxmoxVE/pull/4231))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🧰 Maintenance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 💾 Core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - tools.func: better function handling + gs as new helper [@MickLesk](https://github.com/MickLesk) ([#4238](https://github.com/community-scripts/ProxmoxVE/pull/4238))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-04
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Code Server: Update misleading name, description and icon. [@ArmainAP](https://github.com/ArmainAP) ([#4211](https://github.com/community-scripts/ProxmoxVE/pull/4211))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-03
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - Vaultwarden: Enable HTTPS by default [@tremor021](https://github.com/tremor021) ([#4197](https://github.com/community-scripts/ProxmoxVE/pull/4197))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Vaultwarden: Fix access URL [@tremor021](https://github.com/tremor021) ([#4199](https://github.com/community-scripts/ProxmoxVE/pull/4199))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - SFTPGo: Switch updatable to true on website [@tremor021](https://github.com/tremor021) ([#4186](https://github.com/community-scripts/ProxmoxVE/pull/4186))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 2025-05-02
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - NetBox: Fix typo in sed command, preventing install [@tremor021](https://github.com/tremor021) ([#4179](https://github.com/community-scripts/ProxmoxVE/pull/4179))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 🌐 Website
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 🐞 Bug Fixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Changed the random script button to be the same as all the other buttons [@BramSuurdje](https://github.com/BramSuurdje) ([#4183](https://github.com/community-scripts/ProxmoxVE/pull/4183))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  - #### 📝 Script Information
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - Habitica: correct config path [@DrDonoso](https://github.com/DrDonoso) ([#4181](https://github.com/community-scripts/ProxmoxVE/pull/4181))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 2025-05-01
 | 
					## 2025-05-01
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 🚀 Updated Scripts
 | 
					### 🚀 Updated Scripts
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										67
									
								
								ct/actualbudget.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								ct/actualbudget.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: MickLesk (CanbiZ)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://actualbudget.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Actual Budget"
 | 
				
			||||||
 | 
					var_tags="finance"
 | 
				
			||||||
 | 
					var_cpu="2"
 | 
				
			||||||
 | 
					var_ram="2048"
 | 
				
			||||||
 | 
					var_disk="4"
 | 
				
			||||||
 | 
					var_os="debian"
 | 
				
			||||||
 | 
					var_version="12"
 | 
				
			||||||
 | 
					var_unprivileged="1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ ! -d /opt/actualbudget ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  NODE_VERSION="22"
 | 
				
			||||||
 | 
					  install_node_and_modules
 | 
				
			||||||
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					  if [[ -f /opt/actualbudget-data/config.json ]]; then
 | 
				
			||||||
 | 
					    if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then
 | 
				
			||||||
 | 
					      msg_info "Stopping ${APP}"
 | 
				
			||||||
 | 
					      systemctl stop actualbudget
 | 
				
			||||||
 | 
					      msg_ok "${APP} Stopped"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      msg_info "Updating ${APP} to ${RELEASE}"
 | 
				
			||||||
 | 
					      $STD npm update -g @actual-app/sync-server
 | 
				
			||||||
 | 
					      echo "${RELEASE}" >/opt/actualbudget_version.txt
 | 
				
			||||||
 | 
					      msg_ok "Updated ${APP} to ${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      msg_info "Starting ${APP}"
 | 
				
			||||||
 | 
					      systemctl start actualbudget
 | 
				
			||||||
 | 
					      msg_ok "Restarted ${APP}"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      msg_info "${APP} is already up to date"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_info "Old Installation Found, you need to migrate your data and recreate to a new container"
 | 
				
			||||||
 | 
					    msg_info "Please follow the instructions on the ${APP} website to migrate your data"
 | 
				
			||||||
 | 
					    msg_info "https://actualbudget.org/docs/backup-restore/backup"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  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}https://${IP}:5006${CL}"
 | 
				
			||||||
@@ -9,7 +9,7 @@ APP="Alpine-IT-Tools"
 | 
				
			|||||||
var_tags="${var_tags:-alpine;development}"
 | 
					var_tags="${var_tags:-alpine;development}"
 | 
				
			||||||
var_cpu="${var_cpu:-1}"
 | 
					var_cpu="${var_cpu:-1}"
 | 
				
			||||||
var_ram="${var_ram:-256}"
 | 
					var_ram="${var_ram:-256}"
 | 
				
			||||||
var_disk="${var_disk:-0.2}"
 | 
					var_disk="${var_disk:-0.5}"
 | 
				
			||||||
var_os="${var_os:-alpine}"
 | 
					var_os="${var_os:-alpine}"
 | 
				
			||||||
var_version="${var_version:-3.21}"
 | 
					var_version="${var_version:-3.21}"
 | 
				
			||||||
var_unprivileged="${var_unprivileged:-1}"
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										58
									
								
								ct/alpine-komodo.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ct/alpine-komodo.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: MickLesk (CanbiZ)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://komo.do
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Alpine-Komodo"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-docker,alpine}"
 | 
				
			||||||
 | 
					var_cpu="${var_cpu:-1}"
 | 
				
			||||||
 | 
					var_ram="${var_ram:-1024}"
 | 
				
			||||||
 | 
					var_disk="${var_disk:-10}"
 | 
				
			||||||
 | 
					var_os="${var_os:-alpine}"
 | 
				
			||||||
 | 
					var_version="${var_version:-3.21}"
 | 
				
			||||||
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  [[ -d /opt/komodo ]] || {
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating ${APP}"
 | 
				
			||||||
 | 
					  COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
 | 
				
			||||||
 | 
					  if [[ -z "$COMPOSE_FILE" ]]; then
 | 
				
			||||||
 | 
					    msg_error "No valid compose file found in /opt/komodo!"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  COMPOSE_BASENAME=$(basename "$COMPOSE_FILE")
 | 
				
			||||||
 | 
					  BACKUP_FILE="/opt/komodo/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)"
 | 
				
			||||||
 | 
					  cp "$COMPOSE_FILE" "$BACKUP_FILE" || {
 | 
				
			||||||
 | 
					    msg_error "Failed to create backup of ${COMPOSE_BASENAME}!"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}"
 | 
				
			||||||
 | 
					  if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then
 | 
				
			||||||
 | 
					    msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!"
 | 
				
			||||||
 | 
					    mv "$BACKUP_FILE" "$COMPOSE_FILE"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
 | 
				
			||||||
 | 
					  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}http://${IP}:9120${CL}"
 | 
				
			||||||
							
								
								
									
										55
									
								
								ct/alpine-rclone.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								ct/alpine-rclone.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: Slaviša Arežina (tremor021)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/rclone/rclone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Alpine-rclone"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-alpine;backup}"
 | 
				
			||||||
 | 
					var_cpu="${var_cpu:-1}"
 | 
				
			||||||
 | 
					var_ram="${var_ram:-256}"
 | 
				
			||||||
 | 
					var_disk="${var_disk:-1}"
 | 
				
			||||||
 | 
					var_os="${var_os:-alpine}"
 | 
				
			||||||
 | 
					var_version="${var_version:-3.21}"
 | 
				
			||||||
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [ ! -d /opt/rclone ]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RELEASE=$(curl -s https://api.github.com/repos/rclone/rclone/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					  if [ "${RELEASE}" != "$(cat /opt/rclone_version.txt)" ] || [ ! -f /opt/rclone_version.txt ]; then
 | 
				
			||||||
 | 
					    msg_info "Updating ${APP} LXC"
 | 
				
			||||||
 | 
					    temp_file=$(mktemp)
 | 
				
			||||||
 | 
					    curl -fsSL "https://github.com/rclone/rclone/releases/download/v${RELEASE}/rclone-v${RELEASE}-linux-amd64.zip" -o "$temp_file"
 | 
				
			||||||
 | 
					    $STD unzip -o "$temp_file" '*/**' -d /opt/rclone
 | 
				
			||||||
 | 
					    rm -f "$temp_file"
 | 
				
			||||||
 | 
					    echo "${RELEASE}" >/opt/rclone_version.txt
 | 
				
			||||||
 | 
					    msg_ok "Updated Successfully"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exit 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following IP:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
				
			||||||
							
								
								
									
										70
									
								
								ct/alpine-tinyauth.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								ct/alpine-tinyauth.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: Slaviša Arežina (tremor021)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/steveiliop56/tinyauth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Alpine-tinyauth"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-alpine;auth}"
 | 
				
			||||||
 | 
					var_cpu="${var_cpu:-1}"
 | 
				
			||||||
 | 
					var_ram="${var_ram:-512}"
 | 
				
			||||||
 | 
					var_disk="${var_disk:-3}"
 | 
				
			||||||
 | 
					var_os="${var_os:-alpine}"
 | 
				
			||||||
 | 
					var_version="${var_version:-3.21}"
 | 
				
			||||||
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  if [[ ! -d /opt/tinyauth ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating Alpine Packages"
 | 
				
			||||||
 | 
					  $STD apk update
 | 
				
			||||||
 | 
					  $STD apk upgrade
 | 
				
			||||||
 | 
					  msg_ok "Updated Alpine Packages"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating tinyauth"
 | 
				
			||||||
 | 
					  RELEASE=$(curl -s https://api.github.com/repos/steveiliop56/tinyauth/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					  if [ "${RELEASE}" != "$(cat /opt/tinyauth_version.txt)" ] || [ ! -f /opt/tinyauth_version.txt ]; then
 | 
				
			||||||
 | 
					    $STD service tinyauth stop
 | 
				
			||||||
 | 
					    temp_file=$(mktemp)
 | 
				
			||||||
 | 
					    cp /opt/tinyauth/.env /opt
 | 
				
			||||||
 | 
					    rm -rf /opt/tinyauth
 | 
				
			||||||
 | 
					    mkdir -p /opt/tinyauth
 | 
				
			||||||
 | 
					    curl -fsSL "https://github.com/steveiliop56/tinyauth/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
				
			||||||
 | 
					    tar -xzf "$temp_file" -C /opt/tinyauth --strip-components=1
 | 
				
			||||||
 | 
					    cd /opt/tinyauth/frontend
 | 
				
			||||||
 | 
					    $STD bun install
 | 
				
			||||||
 | 
					    $STD bun run build
 | 
				
			||||||
 | 
					    mv dist /opt/tinyauth/internal/assets/
 | 
				
			||||||
 | 
					    cd /opt/tinyauth
 | 
				
			||||||
 | 
					    $STD go mod download
 | 
				
			||||||
 | 
					    CGO_ENABLED=0 go build -ldflags "-s -w"
 | 
				
			||||||
 | 
					    cp /opt/.env /opt/tinyauth
 | 
				
			||||||
 | 
					    echo "${RELEASE}" >/opt/tinyauth_version.txt
 | 
				
			||||||
 | 
					    rm -f "$temp_file"
 | 
				
			||||||
 | 
					    msg_info "Restarting tinyauth"
 | 
				
			||||||
 | 
					    $STD service tinyauth start
 | 
				
			||||||
 | 
					    msg_ok "Restarted tinyauth"
 | 
				
			||||||
 | 
					    msg_ok "Updated tinyauth"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  exit 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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}"
 | 
				
			||||||
							
								
								
									
										45
									
								
								ct/alpine-transmission.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								ct/alpine-transmission.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					source <(curl -s https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: Slaviša Arežina (tremor021)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://transmissionbt.com/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Alpine-Transmission"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-alpine;torrent}"
 | 
				
			||||||
 | 
					var_cpu="${var_cpu:-1}"
 | 
				
			||||||
 | 
					var_ram="${var_ram:-256}"
 | 
				
			||||||
 | 
					var_disk="${var_disk:-1}"
 | 
				
			||||||
 | 
					var_os="${var_os:-alpine}"
 | 
				
			||||||
 | 
					var_version="${var_version:-3.21}"
 | 
				
			||||||
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  msg_info "Updating Alpine Packages"
 | 
				
			||||||
 | 
					  $STD apk -U upgrade
 | 
				
			||||||
 | 
					  msg_ok "Updated Alpine Packages"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating Transmission"
 | 
				
			||||||
 | 
					  $STD apk upgrade transmission-daemon
 | 
				
			||||||
 | 
					  msg_ok "Updated Transmission"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Restarting Transmission"
 | 
				
			||||||
 | 
					  $STD rc-service transmission-daemon restart
 | 
				
			||||||
 | 
					  msg_ok "Restarted Transmission"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exit 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start
 | 
				
			||||||
 | 
					build_container
 | 
				
			||||||
 | 
					description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
 | 
					echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9091${CL}"
 | 
				
			||||||
@@ -9,7 +9,7 @@ APP="Alpine"
 | 
				
			|||||||
var_tags="${var_tags:-os;alpine}"
 | 
					var_tags="${var_tags:-os;alpine}"
 | 
				
			||||||
var_cpu="${var_cpu:-1}"
 | 
					var_cpu="${var_cpu:-1}"
 | 
				
			||||||
var_ram="${var_ram:-512}"
 | 
					var_ram="${var_ram:-512}"
 | 
				
			||||||
var_disk="${var_disk:-0.1}"
 | 
					var_disk="${var_disk:-0.5}"
 | 
				
			||||||
var_os="${var_os:-alpine}"
 | 
					var_os="${var_os:-alpine}"
 | 
				
			||||||
var_version="${var_version:-3.21}"
 | 
					var_version="${var_version:-3.21}"
 | 
				
			||||||
var_unprivileged="${var_unprivileged:-1}"
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
@@ -20,9 +20,11 @@ color
 | 
				
			|||||||
catch_errors
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function update_script() {
 | 
					function update_script() {
 | 
				
			||||||
  UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
 | 
					  UPD=$(
 | 
				
			||||||
 | 
					    whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
 | 
				
			||||||
      "1" "Check for Alpine Updates" ON \
 | 
					      "1" "Check for Alpine Updates" ON \
 | 
				
			||||||
    3>&1 1>&2 2>&3)
 | 
					      3>&1 1>&2 2>&3
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  header_info
 | 
					  header_info
 | 
				
			||||||
  if [ "$UPD" == "1" ]; then
 | 
					  if [ "$UPD" == "1" ]; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ APP="Authentik"
 | 
				
			|||||||
var_tags="${var_tags:-identity-provider}"
 | 
					var_tags="${var_tags:-identity-provider}"
 | 
				
			||||||
var_disk="${var_disk:-12}"
 | 
					var_disk="${var_disk:-12}"
 | 
				
			||||||
var_cpu="${var_cpu:-6}"
 | 
					var_cpu="${var_cpu:-6}"
 | 
				
			||||||
var_ram="${var_ram:-8192}"
 | 
					var_ram="${var_ram:-10240}"
 | 
				
			||||||
var_os="${var_os:-debian}"
 | 
					var_os="${var_os:-debian}"
 | 
				
			||||||
var_version="${var_version:-12}"
 | 
					var_version="${var_version:-12}"
 | 
				
			||||||
var_unprivileged="${var_unprivileged:-1}"
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
@@ -29,6 +29,13 @@ function update_script() {
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/goauthentik/authentik/releases/latest | grep "tarball_url" | awk '{print substr($2, 2, length($2)-3)}')
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/goauthentik/authentik/releases/latest | grep "tarball_url" | awk '{print substr($2, 2, length($2)-3)}')
 | 
				
			||||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
					  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
				
			||||||
 | 
					    NODE_VERSION="22"
 | 
				
			||||||
 | 
					    PG_VERSION="16"
 | 
				
			||||||
 | 
					    setup_uv
 | 
				
			||||||
 | 
					    install_postgresql
 | 
				
			||||||
 | 
					    install_node_and_modules
 | 
				
			||||||
 | 
					    install_go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Stopping ${APP}"
 | 
					    msg_info "Stopping ${APP}"
 | 
				
			||||||
    systemctl stop authentik-server
 | 
					    systemctl stop authentik-server
 | 
				
			||||||
    systemctl stop authentik-worker
 | 
					    systemctl stop authentik-worker
 | 
				
			||||||
@@ -54,17 +61,14 @@ function update_script() {
 | 
				
			|||||||
    go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/
 | 
					    go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/
 | 
				
			||||||
    msg_ok "Built ${APP} server"
 | 
					    msg_ok "Built ${APP} server"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Installing Python Dependencies"
 | 
					    msg_info "Building Authentik"
 | 
				
			||||||
    cd /opt/authentik
 | 
					    cd /opt/authentik
 | 
				
			||||||
    $STD poetry install --only=main --no-ansi --no-interaction --no-root
 | 
					    $STD uv sync --frozen --no-install-project --no-dev
 | 
				
			||||||
    $STD poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt
 | 
					    uv run python -m lifecycle.migrate
 | 
				
			||||||
    $STD pip install --no-cache-dir -r requirements.txt
 | 
					    ln -s /opt/authentik/.venv/bin/gunicorn /usr/local/bin/gunicorn
 | 
				
			||||||
    $STD pip install .
 | 
					    ln -s /opt/authentik/.venv/bin/celery /usr/local/bin/celery
 | 
				
			||||||
    msg_ok "Installed Python Dependencies"
 | 
					    msg_ok "Authentik built"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating ${APP} to v${RELEASE} (Patience)"
 | 
					 | 
				
			||||||
    cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints
 | 
					 | 
				
			||||||
    $STD bash /opt/authentik/lifecycle/ak migrate
 | 
					 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
					    msg_ok "Updated ${APP} to v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										72
									
								
								ct/fumadocs.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								ct/fumadocs.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: MickLesk (CanbiZ)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/fuma-nama/fumadoc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="Fumadocs"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-documentation}"
 | 
				
			||||||
 | 
					var_cpu="${var_cpu:-2}"
 | 
				
			||||||
 | 
					var_ram="${var_ram:-2048}"
 | 
				
			||||||
 | 
					var_disk="${var_disk:-5}"
 | 
				
			||||||
 | 
					var_os="${var_os:-debian}"
 | 
				
			||||||
 | 
					var_version="${var_version:-12}"
 | 
				
			||||||
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ ! -d /opt/fumadocs ]]; then
 | 
				
			||||||
 | 
					    msg_error "No installation found in /opt/fumadocs!"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ ! -f /opt/fumadocs/.projectname ]]; then
 | 
				
			||||||
 | 
					    msg_error "Project name file not found: /opt/fumadocs/.projectname!"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  NODE_VERSION="22" NODE_MODULE="pnpm@latest" install_node_and_modules
 | 
				
			||||||
 | 
					  PROJECT_NAME=$(</opt/fumadocs/.projectname)
 | 
				
			||||||
 | 
					  PROJECT_DIR="/opt/fumadocs/${PROJECT_NAME}"
 | 
				
			||||||
 | 
					  SERVICE_NAME="fumadocs_${PROJECT_NAME}.service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ ! -d "$PROJECT_DIR" ]]; then
 | 
				
			||||||
 | 
					    msg_error "Project directory does not exist: $PROJECT_DIR"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Stopping service $SERVICE_NAME"
 | 
				
			||||||
 | 
					  systemctl stop "$SERVICE_NAME"
 | 
				
			||||||
 | 
					  msg_ok "Stopped service $SERVICE_NAME"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating dependencies using pnpm"
 | 
				
			||||||
 | 
					  cd "$PROJECT_DIR"
 | 
				
			||||||
 | 
					  $STD pnpm up --latest
 | 
				
			||||||
 | 
					  $STD pnpm build
 | 
				
			||||||
 | 
					  msg_ok "Updated dependencies using pnpm"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Starting service $SERVICE_NAME"
 | 
				
			||||||
 | 
					  systemctl start "$SERVICE_NAME"
 | 
				
			||||||
 | 
					  msg_ok "Started service $SERVICE_NAME"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_ok "Fumadocs successfully updated"
 | 
				
			||||||
 | 
					  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}"
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/actualbudget
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/actualbudget
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ___        __              __   ____            __           __ 
 | 
				
			||||||
 | 
					   /   | _____/ /___  ______ _/ /  / __ )__  ______/ /___ ____  / /_
 | 
				
			||||||
 | 
					  / /| |/ ___/ __/ / / / __ `/ /  / __  / / / / __  / __ `/ _ \/ __/
 | 
				
			||||||
 | 
					 / ___ / /__/ /_/ /_/ / /_/ / /  / /_/ / /_/ / /_/ / /_/ /  __/ /_  
 | 
				
			||||||
 | 
					/_/  |_\___/\__/\__,_/\__,_/_/  /_____/\__,_/\__,_/\__, /\___/\__/  
 | 
				
			||||||
 | 
					                                                  /____/            
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/alpine-komodo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/alpine-komodo
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ___    __      _                  __ __                          __    
 | 
				
			||||||
 | 
					   /   |  / /___  (_)___  ___        / //_/___  ____ ___  ____  ____/ /___ 
 | 
				
			||||||
 | 
					  / /| | / / __ \/ / __ \/ _ \______/ ,< / __ \/ __ `__ \/ __ \/ __  / __ \
 | 
				
			||||||
 | 
					 / ___ |/ / /_/ / / / / /  __/_____/ /| / /_/ / / / / / / /_/ / /_/ / /_/ /
 | 
				
			||||||
 | 
					/_/  |_/_/ .___/_/_/ /_/\___/     /_/ |_\____/_/ /_/ /_/\____/\__,_/\____/ 
 | 
				
			||||||
 | 
					        /_/                                                                
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/alpine-rclone
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/alpine-rclone
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ___    __      _                            __               
 | 
				
			||||||
 | 
					   /   |  / /___  (_)___  ___        __________/ /___  ____  ___ 
 | 
				
			||||||
 | 
					  / /| | / / __ \/ / __ \/ _ \______/ ___/ ___/ / __ \/ __ \/ _ \
 | 
				
			||||||
 | 
					 / ___ |/ / /_/ / / / / /  __/_____/ /  / /__/ / /_/ / / / /  __/
 | 
				
			||||||
 | 
					/_/  |_/_/ .___/_/_/ /_/\___/     /_/   \___/_/\____/_/ /_/\___/ 
 | 
				
			||||||
 | 
					        /_/                                                      
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/alpine-tinyauth
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/alpine-tinyauth
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ___    __      _                  __  _                         __  __  
 | 
				
			||||||
 | 
					   /   |  / /___  (_)___  ___        / /_(_)___  __  ______ ___  __/ /_/ /_ 
 | 
				
			||||||
 | 
					  / /| | / / __ \/ / __ \/ _ \______/ __/ / __ \/ / / / __ `/ / / / __/ __ \
 | 
				
			||||||
 | 
					 / ___ |/ / /_/ / / / / /  __/_____/ /_/ / / / / /_/ / /_/ / /_/ / /_/ / / /
 | 
				
			||||||
 | 
					/_/  |_/_/ .___/_/_/ /_/\___/      \__/_/_/ /_/\__, /\__,_/\__,_/\__/_/ /_/ 
 | 
				
			||||||
 | 
					        /_/                                   /____/                        
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/alpine-transmission
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/alpine-transmission
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ___    __      _                ______                                _           _           
 | 
				
			||||||
 | 
					   /   |  / /___  (_)___  ___      /_  __/________ _____  _________ ___  (_)_________(_)___  ____ 
 | 
				
			||||||
 | 
					  / /| | / / __ \/ / __ \/ _ \______/ / / ___/ __ `/ __ \/ ___/ __ `__ \/ / ___/ ___/ / __ \/ __ \
 | 
				
			||||||
 | 
					 / ___ |/ / /_/ / / / / /  __/_____/ / / /  / /_/ / / / (__  ) / / / / / (__  |__  ) / /_/ / / / /
 | 
				
			||||||
 | 
					/_/  |_/_/ .___/_/_/ /_/\___/     /_/ /_/   \__,_/_/ /_/____/_/ /_/ /_/_/____/____/_/\____/_/ /_/ 
 | 
				
			||||||
 | 
					        /_/                                                                                       
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/fumadocs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/fumadocs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					    ______                          __               
 | 
				
			||||||
 | 
					   / ____/_  ______ ___  ____ _____/ /___  __________
 | 
				
			||||||
 | 
					  / /_  / / / / __ `__ \/ __ `/ __  / __ \/ ___/ ___/
 | 
				
			||||||
 | 
					 / __/ / /_/ / / / / / / /_/ / /_/ / /_/ / /__(__  ) 
 | 
				
			||||||
 | 
					/_/    \__,_/_/ /_/ /_/\__,_/\__,_/\____/\___/____/  
 | 
				
			||||||
 | 
					                                                     
 | 
				
			||||||
							
								
								
									
										6
									
								
								ct/headers/streamlink-webui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/streamlink-webui
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					         __                            ___       __                      __          _ 
 | 
				
			||||||
 | 
					   _____/ /_________  ____ _____ ___  / (_)___  / /__     _      _____  / /_  __  __(_)
 | 
				
			||||||
 | 
					  / ___/ __/ ___/ _ \/ __ `/ __ `__ \/ / / __ \/ //_/____| | /| / / _ \/ __ \/ / / / / 
 | 
				
			||||||
 | 
					 (__  ) /_/ /  /  __/ /_/ / / / / / / / / / / / ,< /_____/ |/ |/ /  __/ /_/ / /_/ / /  
 | 
				
			||||||
 | 
					/____/\__/_/   \___/\__,_/_/ /_/ /_/_/_/_/ /_/_/|_|      |__/|__/\___/_.___/\__,_/_/   
 | 
				
			||||||
 | 
					                                                                                       
 | 
				
			||||||
@@ -21,8 +21,6 @@ catch_errors
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function update_script() {
 | 
					function update_script() {
 | 
				
			||||||
  header_info
 | 
					  header_info
 | 
				
			||||||
 | 
					 | 
				
			||||||
  # OS Check
 | 
					 | 
				
			||||||
  if ! lsb_release -d | grep -q "Ubuntu 24.10"; then
 | 
					  if ! lsb_release -d | grep -q "Ubuntu 24.10"; then
 | 
				
			||||||
    msg_error "Wrong OS detected. This script only supports Ubuntu 24.10."
 | 
					    msg_error "Wrong OS detected. This script only supports Ubuntu 24.10."
 | 
				
			||||||
    msg_error "Read Guide: https://github.com/community-scripts/ProxmoxVE/discussions/1549"
 | 
					    msg_error "Read Guide: https://github.com/community-scripts/ProxmoxVE/discussions/1549"
 | 
				
			||||||
@@ -32,54 +30,88 @@ function update_script() {
 | 
				
			|||||||
  check_container_resources
 | 
					  check_container_resources
 | 
				
			||||||
  if [[ ! -d /srv/homeassistant ]]; then
 | 
					  if [[ ! -d /srv/homeassistant ]]; then
 | 
				
			||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit 1
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  PY=$(ls /srv/homeassistant/lib/)
 | 
					  setup_uv
 | 
				
			||||||
  IP=$(hostname -I | awk '{print $1}')
 | 
					  IP=$(hostname -I | awk '{print $1}')
 | 
				
			||||||
  UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
 | 
					  UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
 | 
				
			||||||
    "1" "Update Core" ON \
 | 
					    "1" "Update Core" ON \
 | 
				
			||||||
    "2" "Install HACS" OFF \
 | 
					    "2" "Install HACS" OFF \
 | 
				
			||||||
    "3" "Install FileBrowser" OFF \
 | 
					    "3" "Install FileBrowser" OFF \
 | 
				
			||||||
    3>&1 1>&2 2>&3)
 | 
					    3>&1 1>&2 2>&3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if [ "$UPD" == "1" ]; then
 | 
					  if [ "$UPD" == "1" ]; then
 | 
				
			||||||
    if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SELECT BRANCH" --yesno "Use Beta Branch?" 10 58); then
 | 
					    if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SELECT BRANCH" --yesno "Use Beta Branch?" 10 58); then
 | 
				
			||||||
      clear
 | 
					      clear
 | 
				
			||||||
      header_info
 | 
					      header_info
 | 
				
			||||||
      echo -e "${GN}Updating to Beta Version${CL}"
 | 
					      echo -e "${GN}Updating to Beta Version${CL}"
 | 
				
			||||||
      BR="--pre "
 | 
					      BR="--pre"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      clear
 | 
					      clear
 | 
				
			||||||
      header_info
 | 
					      header_info
 | 
				
			||||||
      echo -e "${GN}Updating to Stable Version${CL}"
 | 
					      echo -e "${GN}Updating to Stable Version${CL}"
 | 
				
			||||||
      BR=""
 | 
					      BR=""
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Stopping Home Assistant"
 | 
					    msg_info "Stopping Home Assistant"
 | 
				
			||||||
    systemctl stop homeassistant
 | 
					    systemctl stop homeassistant
 | 
				
			||||||
    msg_ok "Stopped Home Assistant"
 | 
					    msg_ok "Stopped Home Assistant"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [[ -d /srv/homeassistant/bin ]]; then
 | 
				
			||||||
 | 
					      msg_info "Migrating to .venv-based structure"
 | 
				
			||||||
 | 
					      $STD source /srv/homeassistant/bin/activate
 | 
				
			||||||
 | 
					      PY_VER=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
 | 
				
			||||||
 | 
					      $STD deactivate
 | 
				
			||||||
 | 
					      mv /srv/homeassistant "/srv/homeassistant_backup_$PY_VER"
 | 
				
			||||||
 | 
					      mkdir -p /srv/homeassistant
 | 
				
			||||||
 | 
					      cd /srv/homeassistant
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      $STD uv python install 3.13
 | 
				
			||||||
 | 
					      UV_PYTHON=$(uv python list | awk '/3\.13\.[0-9]+.*\/root\/.local/ {print $2; exit}')
 | 
				
			||||||
 | 
					      if [[ -z "$UV_PYTHON" ]]; then
 | 
				
			||||||
 | 
					        msg_error "No local Python 3.13 found via uv"
 | 
				
			||||||
 | 
					        exit 1
 | 
				
			||||||
 | 
					      fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      $STD uv venv .venv --python "$UV_PYTHON"
 | 
				
			||||||
 | 
					      $STD source .venv/bin/activate
 | 
				
			||||||
 | 
					      $STD uv pip install homeassistant mysqlclient psycopg2-binary isal webrtcvad wheel
 | 
				
			||||||
 | 
					      mkdir -p /root/.homeassistant
 | 
				
			||||||
 | 
					      msg_ok "Migration complete"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      source /srv/homeassistant/.venv/bin/activate
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating Home Assistant"
 | 
					    msg_info "Updating Home Assistant"
 | 
				
			||||||
    source /srv/homeassistant/bin/activate
 | 
					    $STD uv pip install $BR --upgrade homeassistant
 | 
				
			||||||
    $STD pip install ${BR}--upgrade homeassistant
 | 
					 | 
				
			||||||
    msg_ok "Updated Home Assistant"
 | 
					    msg_ok "Updated Home Assistant"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting Home Assistant"
 | 
					    msg_info "Starting Home Assistant"
 | 
				
			||||||
 | 
					    if [[ -f /etc/systemd/system/homeassistant.service ]] && grep -q "/srv/homeassistant/bin/python3" /etc/systemd/system/homeassistant.service; then
 | 
				
			||||||
 | 
					      sed -i 's|ExecStart=/srv/homeassistant/bin/python3|ExecStart=/srv/homeassistant/.venv/bin/python3|' /etc/systemd/system/homeassistant.service
 | 
				
			||||||
 | 
					      sed -i 's|PATH=/srv/homeassistant/bin|PATH=/srv/homeassistant/.venv/bin|' /etc/systemd/system/homeassistant.service
 | 
				
			||||||
 | 
					      $STD systemctl daemon-reload
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    systemctl start homeassistant
 | 
					    systemctl start homeassistant
 | 
				
			||||||
    sleep 2
 | 
					    sleep 5
 | 
				
			||||||
    msg_ok "Started Home Assistant"
 | 
					    msg_ok "Started Home Assistant"
 | 
				
			||||||
    msg_ok "Update Successful"
 | 
					    msg_ok "Update Successful"
 | 
				
			||||||
    echo -e "\n  Go to http://${IP}:8123 \n"
 | 
					    echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8123${CL}"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if [ "$UPD" == "2" ]; then
 | 
					  if [ "$UPD" == "2" ]; then
 | 
				
			||||||
    msg_info "Installing Home Assistant Community Store (HACS)"
 | 
					    msg_info "Installing Home Assistant Community Store (HACS)"
 | 
				
			||||||
    $STD apt update
 | 
					    $STD apt update
 | 
				
			||||||
    $STD apt install -y unzip
 | 
					    $STD apt install -y unzip
 | 
				
			||||||
    cd .homeassistant
 | 
					    cd /root/.homeassistant
 | 
				
			||||||
    $STD bash <(curl -fsSL https://get.hacs.xyz)
 | 
					    $STD bash <(curl -fsSL https://get.hacs.xyz)
 | 
				
			||||||
    msg_ok "Installed Home Assistant Community Store (HACS)"
 | 
					    msg_ok "Installed Home Assistant Community Store (HACS)"
 | 
				
			||||||
    echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
 | 
					    echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if [ "$UPD" == "3" ]; then
 | 
					  if [ "$UPD" == "3" ]; then
 | 
				
			||||||
    set +Eeuo pipefail
 | 
					    set +Eeuo pipefail
 | 
				
			||||||
    read -r -p "Would you like to use No Authentication? <y/N> " prompt
 | 
					    read -r -p "Would you like to use No Authentication? <y/N> " prompt
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								ct/komodo.sh
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								ct/komodo.sh
									
									
									
									
									
								
							@@ -23,39 +23,33 @@ function update_script() {
 | 
				
			|||||||
  header_info
 | 
					  header_info
 | 
				
			||||||
  check_container_storage
 | 
					  check_container_storage
 | 
				
			||||||
  check_container_resources
 | 
					  check_container_resources
 | 
				
			||||||
    if [[ ! -d /opt/komodo ]]; then
 | 
					 | 
				
			||||||
        msg_error "No ${APP} Installation Found!"
 | 
					 | 
				
			||||||
        exit
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    msg_info "Updating ${APP}"
 | 
					 | 
				
			||||||
    COMPOSE_FILE=""
 | 
					 | 
				
			||||||
    for file in /opt/komodo/*.compose.yaml; do
 | 
					 | 
				
			||||||
        if [[ "$file" != "compose.env" ]]; then
 | 
					 | 
				
			||||||
            COMPOSE_FILE="${file#/opt/komodo/}"
 | 
					 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  [[ -d /opt/komodo ]] || {
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Updating ${APP}"
 | 
				
			||||||
 | 
					  COMPOSE_FILE=$(find /opt/komodo -maxdepth 1 -type f -name '*.compose.yaml' ! -name 'compose.env' | head -n1)
 | 
				
			||||||
  if [[ -z "$COMPOSE_FILE" ]]; then
 | 
					  if [[ -z "$COMPOSE_FILE" ]]; then
 | 
				
			||||||
    msg_error "No valid compose file found in /opt/komodo!"
 | 
					    msg_error "No valid compose file found in /opt/komodo!"
 | 
				
			||||||
    exit 1
 | 
					    exit 1
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					  COMPOSE_BASENAME=$(basename "$COMPOSE_FILE")
 | 
				
			||||||
    BACKUP_FILE="${COMPOSE_FILE}.bak_$(date +%Y%m%d_%H%M%S)"
 | 
					  BACKUP_FILE="/opt/komodo/${COMPOSE_BASENAME}.bak_$(date +%Y%m%d_%H%M%S)"
 | 
				
			||||||
    mv "/opt/komodo/$COMPOSE_FILE" "/opt/komodo/$BACKUP_FILE" || {
 | 
					  cp "$COMPOSE_FILE" "$BACKUP_FILE" || {
 | 
				
			||||||
        msg_error "Failed to create backup of $COMPOSE_FILE!"
 | 
					    msg_error "Failed to create backup of ${COMPOSE_BASENAME}!"
 | 
				
			||||||
    exit 1
 | 
					    exit 1
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_BASENAME}"
 | 
				
			||||||
    GITHUB_URL="https://raw.githubusercontent.com/moghtech/komodo/main/compose/${COMPOSE_FILE}"
 | 
					  if ! curl -fsSL "$GITHUB_URL" -o "$COMPOSE_FILE"; then
 | 
				
			||||||
    if ! curl -fsSL "$GITHUB_URL" -o "/opt/komodo/${COMPOSE_FILE}"; then
 | 
					    msg_error "Failed to download ${COMPOSE_BASENAME} from GitHub!"
 | 
				
			||||||
        msg_error "Failed to download ${COMPOSE_FILE} from GitHub!"
 | 
					    mv "$BACKUP_FILE" "$COMPOSE_FILE"
 | 
				
			||||||
        mv "/opt/komodo/${BACKUP_FILE}" "/opt/komodo/${COMPOSE_FILE}"
 | 
					 | 
				
			||||||
    exit 1
 | 
					    exit 1
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					  $STD docker compose -p komodo -f "$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
 | 
				
			||||||
    $STD docker compose -p komodo -f "/opt/komodo/$COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
 | 
					 | 
				
			||||||
  msg_ok "Updated ${APP}"
 | 
					  msg_ok "Updated ${APP}"
 | 
				
			||||||
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start
 | 
					start
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,10 @@ function update_script() {
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
					  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
				
			||||||
 | 
					    NODE_VERSION="22"
 | 
				
			||||||
 | 
					    NODE_MODULE="yarn@latest"
 | 
				
			||||||
 | 
					    install_node_and_modules
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    msg_info "Stopping ${APP}"
 | 
					    msg_info "Stopping ${APP}"
 | 
				
			||||||
    systemctl stop linkwarden
 | 
					    systemctl stop linkwarden
 | 
				
			||||||
    msg_ok "Stopped ${APP}"
 | 
					    msg_ok "Stopped ${APP}"
 | 
				
			||||||
@@ -46,7 +50,7 @@ function update_script() {
 | 
				
			|||||||
    mv /opt/linkwarden/.env /opt/.env
 | 
					    mv /opt/linkwarden/.env /opt/.env
 | 
				
			||||||
    rm -rf /opt/linkwarden
 | 
					    rm -rf /opt/linkwarden
 | 
				
			||||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					    RELEASE=$(curl -fsSL https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
    curl -fsSL "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip")
 | 
					    curl -fsSL "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip" -o ${RELEASE}.zip
 | 
				
			||||||
    unzip -q ${RELEASE}.zip
 | 
					    unzip -q ${RELEASE}.zip
 | 
				
			||||||
    mv linkwarden-${RELEASE:1} /opt/linkwarden
 | 
					    mv linkwarden-${RELEASE:1} /opt/linkwarden
 | 
				
			||||||
    cd /opt/linkwarden
 | 
					    cd /opt/linkwarden
 | 
				
			||||||
@@ -54,8 +58,9 @@ function update_script() {
 | 
				
			|||||||
    $STD npx playwright install-deps
 | 
					    $STD npx playwright install-deps
 | 
				
			||||||
    $STD yarn playwright install
 | 
					    $STD yarn playwright install
 | 
				
			||||||
    cp /opt/.env /opt/linkwarden/.env
 | 
					    cp /opt/.env /opt/linkwarden/.env
 | 
				
			||||||
    $STD yarn build
 | 
					    $STD yarn prisma:generate
 | 
				
			||||||
    $STD yarn prisma migrate deploy
 | 
					    $STD yarn web:build
 | 
				
			||||||
 | 
					    $STD yarn prisma:deploy
 | 
				
			||||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
					    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
				
			||||||
    msg_ok "Updated ${APP} to ${RELEASE}"
 | 
					    msg_ok "Updated ${APP} to ${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,8 +8,8 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
 | 
				
			|||||||
APP="Open WebUI"
 | 
					APP="Open WebUI"
 | 
				
			||||||
var_tags="${var_tags:-ai;interface}"
 | 
					var_tags="${var_tags:-ai;interface}"
 | 
				
			||||||
var_cpu="${var_cpu:-4}"
 | 
					var_cpu="${var_cpu:-4}"
 | 
				
			||||||
var_ram="${var_ram:-4096}"
 | 
					var_ram="${var_ram:-8192}"
 | 
				
			||||||
var_disk="${var_disk:-16}"
 | 
					var_disk="${var_disk:-25}"
 | 
				
			||||||
var_os="${var_os:-debian}"
 | 
					var_os="${var_os:-debian}"
 | 
				
			||||||
var_version="${var_version:-12}"
 | 
					var_version="${var_version:-12}"
 | 
				
			||||||
var_unprivileged="${var_unprivileged:-1}"
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ function update_script() {
 | 
				
			|||||||
        msg_error "No ${APP} Installation Found!"
 | 
					        msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
        exit
 | 
					        exit
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					    setup_uv
 | 
				
			||||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					    RELEASE=$(curl -fsSL https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
    if [[ -f /opt/${APP}_version.txt ]] && [[ "${RELEASE}" == "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
					    if [[ -f /opt/${APP}_version.txt ]] && [[ "${RELEASE}" == "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
				
			||||||
        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
					        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										75
									
								
								ct/streamlink-webui.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								ct/streamlink-webui.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: CrazyWolf13
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/CrazyWolf13/streamlink-webui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					APP="streamlink-webui"
 | 
				
			||||||
 | 
					var_tags="${var_tags:-download,streaming}"
 | 
				
			||||||
 | 
					var_cpu="${var_cpu:-2}"
 | 
				
			||||||
 | 
					var_ram="${var_ram:-2048}"
 | 
				
			||||||
 | 
					var_disk="${var_disk:-10}"
 | 
				
			||||||
 | 
					var_os="${var_os:-debian}"
 | 
				
			||||||
 | 
					var_version="${var_version:-12}"
 | 
				
			||||||
 | 
					var_unprivileged="${var_unprivileged:-1}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header_info "$APP"
 | 
				
			||||||
 | 
					variables
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_script() {
 | 
				
			||||||
 | 
					  header_info
 | 
				
			||||||
 | 
					  check_container_storage
 | 
				
			||||||
 | 
					  check_container_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ ! -d /opt/streamlink-webui ]]; then
 | 
				
			||||||
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
 | 
					    exit
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RELEASE=$(curl -fsSL https://api.github.com/repos/CrazyWolf13/streamlink-webui/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
 | 
					  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
				
			||||||
 | 
					    msg_info "Starting Update"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    msg_info "Stopping $APP"
 | 
				
			||||||
 | 
					    systemctl stop ${APP}
 | 
				
			||||||
 | 
					    msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rm -rf /opt/${APP}
 | 
				
			||||||
 | 
					    NODE_VERSION="22"
 | 
				
			||||||
 | 
					    NODE_MODULE="npm,yarn"
 | 
				
			||||||
 | 
					    install_node_and_modules
 | 
				
			||||||
 | 
					    setup_uv
 | 
				
			||||||
 | 
					    fetch_and_deploy_gh_release "CrazyWolf13/streamlink-webui"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Updating $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					    $STD uv venv /opt/"${APP}"/backend/src/.venv
 | 
				
			||||||
 | 
					    source /opt/"${APP}"/backend/src/.venv/bin/activate
 | 
				
			||||||
 | 
					    $STD uv pip install -r /opt/"${APP}"/backend/src/requirements.txt --python=/opt/"${APP}"/backend/src/.venv
 | 
				
			||||||
 | 
					    cd /opt/"${APP}"/frontend/src
 | 
				
			||||||
 | 
					    $STD yarn install
 | 
				
			||||||
 | 
					    $STD yarn build
 | 
				
			||||||
 | 
					    chmod +x /opt/"${APP}"/start.sh
 | 
				
			||||||
 | 
					    msg_ok "Updated $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info "Starting $APP"
 | 
				
			||||||
 | 
					    systemctl start ${APP}
 | 
				
			||||||
 | 
					    msg_ok "Started $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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}:8000${CL}"
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
					source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
				
			||||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
# Author: tremor021
 | 
					# Author: Slaviša Arežina (tremor021)
 | 
				
			||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# Source: https://github.com/Suwayomi/Suwayomi-Server
 | 
					# Source: https://github.com/Suwayomi/Suwayomi-Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,24 +28,33 @@ function update_script() {
 | 
				
			|||||||
    msg_error "No ${APP} Installation Found!"
 | 
					    msg_error "No ${APP} Installation Found!"
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					  if dpkg -l | grep -q "openjdk-17-jre"; then
 | 
				
			||||||
 | 
					    $STD apt-get remove -y openjdk-17-jre
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  JAVA_VERSION=21 install_java
 | 
				
			||||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					  RELEASE=$(curl -fsSL 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
 | 
					  if [[ "${RELEASE}" != "$(cat /opt/suwayomi-server_version.txt)" ]] || [[ ! -f /opt/suwayomi-server_version.txt ]]; then
 | 
				
			||||||
    msg_info "Updating $APP"
 | 
					    msg_info "Updating $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Stopping $APP"
 | 
					    msg_info "Stopping $APP"
 | 
				
			||||||
    systemctl stop suwayomi-server
 | 
					    systemctl stop suwayomi-server
 | 
				
			||||||
    msg_ok "Stopped $APP"
 | 
					    msg_ok "Stopped $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating $APP to v${RELEASE}"
 | 
					    msg_info "Updating $APP to v${RELEASE}"
 | 
				
			||||||
        cd /tmp
 | 
					    temp_file=$(mktemp)
 | 
				
			||||||
        URL=$(curl -fsSL 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 -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
        curl -fsSL "$URL" -o $(basename "$URL")
 | 
					    curl -fsSL "https://github.com/Suwayomi/Suwayomi-Server/releases/download/${RELEASE}/Suwayomi-Server-${RELEASE}-debian-all.deb" -o "$temp_file"
 | 
				
			||||||
        $STD dpkg -i /tmp/*.deb
 | 
					    $STD dpkg -i "$temp_file"
 | 
				
			||||||
    msg_ok "Updated $APP to v${RELEASE}"
 | 
					    msg_ok "Updated $APP to v${RELEASE}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting $APP"
 | 
					    msg_info "Starting $APP"
 | 
				
			||||||
    systemctl start suwayomi-server
 | 
					    systemctl start suwayomi-server
 | 
				
			||||||
    msg_ok "Started $APP"
 | 
					    msg_ok "Started $APP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Cleaning Up"
 | 
					    msg_info "Cleaning Up"
 | 
				
			||||||
        rm -f *.deb
 | 
					    rm -f "$temp_file"
 | 
				
			||||||
    msg_ok "Cleanup Completed"
 | 
					    msg_ok "Cleanup Completed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    echo "${RELEASE}" >/opt/suwayomi-server_version.txt.txt
 | 
					    echo "${RELEASE}" >/opt/suwayomi-server_version.txt.txt
 | 
				
			||||||
    msg_ok "Update Successful"
 | 
					    msg_ok "Update Successful"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -76,12 +76,12 @@ function update_script() {
 | 
				
			|||||||
    msg_ok "Stopped Vaultwarden"
 | 
					    msg_ok "Stopped Vaultwarden"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Updating Web-Vault to $WVRELEASE"
 | 
					    msg_info "Updating Web-Vault to $WVRELEASE"
 | 
				
			||||||
    $STD curl -fsSLO https://github.com/dani-garcia/bw_web_builds/releases/download/$WVRELEASE/bw_web_$WVRELEASE.tar.gz
 | 
					    $STD curl -fsSLO https://github.com/dani-garcia/bw_web_builds/releases/download/"$WVRELEASE"/bw_web_"$WVRELEASE".tar.gz
 | 
				
			||||||
    $STD tar -zxf bw_web_$WVRELEASE.tar.gz -C /opt/vaultwarden/
 | 
					    $STD tar -zxf bw_web_"$WVRELEASE".tar.gz -C /opt/vaultwarden/
 | 
				
			||||||
    msg_ok "Updated Web-Vault"
 | 
					    msg_ok "Updated Web-Vault"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Cleaning up"
 | 
					    msg_info "Cleaning up"
 | 
				
			||||||
    rm bw_web_$WVRELEASE.tar.gz
 | 
					    rm bw_web_"$WVRELEASE".tar.gz
 | 
				
			||||||
    msg_ok "Cleaned"
 | 
					    msg_ok "Cleaned"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_info "Starting Vaultwarden"
 | 
					    msg_info "Starting Vaultwarden"
 | 
				
			||||||
@@ -94,7 +94,7 @@ function update_script() {
 | 
				
			|||||||
    if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Set the ADMIN_TOKEN" 10 58 3>&1 1>&2 2>&3); then
 | 
					    if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Set the ADMIN_TOKEN" 10 58 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [[ -z "$NEWTOKEN" ]]; then exit; fi
 | 
					      if [[ -z "$NEWTOKEN" ]]; then exit; fi
 | 
				
			||||||
      if ! command -v argon2 >/dev/null 2>&1; then $STD apt-get install -y argon2; fi
 | 
					      if ! command -v argon2 >/dev/null 2>&1; then $STD apt-get install -y argon2; fi
 | 
				
			||||||
      TOKEN=$(echo -n ${NEWTOKEN} | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e)
 | 
					      TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e)
 | 
				
			||||||
      sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env
 | 
					      sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env
 | 
				
			||||||
      if [[ -f /opt/vaultwarden/data/config.json ]]; then
 | 
					      if [[ -f /opt/vaultwarden/data/config.json ]]; then
 | 
				
			||||||
        sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json
 | 
					        sed -i "s|\"admin_token\":.*|\"admin_token\": \"${TOKEN}\"|" /opt/vaultwarden/data/config.json
 | 
				
			||||||
@@ -112,4 +112,4 @@ description
 | 
				
			|||||||
msg_ok "Completed Successfully!\n"
 | 
					msg_ok "Completed Successfully!\n"
 | 
				
			||||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
					echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
				
			||||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
					echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
				
			||||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
 | 
					echo -e "${TAB}${GATEWAY}${BGN}https://${IP}:8000${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										35
									
								
								frontend/public/json/actualbudget.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								frontend/public/json/actualbudget.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "name": "Actual Budget",
 | 
				
			||||||
 | 
					    "slug": "actualbudget",
 | 
				
			||||||
 | 
					    "categories": [
 | 
				
			||||||
 | 
					        23
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "date_created": "2025-05-06",
 | 
				
			||||||
 | 
					    "type": "ct",
 | 
				
			||||||
 | 
					    "updateable": true,
 | 
				
			||||||
 | 
					    "privileged": false,
 | 
				
			||||||
 | 
					    "interface_port": 5006,
 | 
				
			||||||
 | 
					    "documentation": "https://github.com/community-scripts/ProxmoxVE/discussions/807",
 | 
				
			||||||
 | 
					    "website": "https://actualbudget.org/",
 | 
				
			||||||
 | 
					    "config_path": "/opt/actualbudget-data/config.json",
 | 
				
			||||||
 | 
					    "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/actual-budget.svg",
 | 
				
			||||||
 | 
					    "description": "Actual Budget is a super fast and privacy-focused app for managing your finances. At its heart is the well proven and much loved Envelope Budgeting methodology.",
 | 
				
			||||||
 | 
					    "install_methods": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "type": "default",
 | 
				
			||||||
 | 
					            "script": "ct/actualbudget.sh",
 | 
				
			||||||
 | 
					            "resources": {
 | 
				
			||||||
 | 
					                "cpu": 2,
 | 
				
			||||||
 | 
					                "ram": 2048,
 | 
				
			||||||
 | 
					                "hdd": 4,
 | 
				
			||||||
 | 
					                "os": "debian",
 | 
				
			||||||
 | 
					                "version": "12"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "default_credentials": {
 | 
				
			||||||
 | 
					        "username": null,
 | 
				
			||||||
 | 
					        "password": null
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "notes": []
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -21,7 +21,7 @@
 | 
				
			|||||||
      "resources": {
 | 
					      "resources": {
 | 
				
			||||||
        "cpu": 1,
 | 
					        "cpu": 1,
 | 
				
			||||||
        "ram": 256,
 | 
					        "ram": 256,
 | 
				
			||||||
              "hdd": 0.2,
 | 
					        "hdd": 0.5,
 | 
				
			||||||
        "os": "alpine",
 | 
					        "os": "alpine",
 | 
				
			||||||
        "version": "3.21"
 | 
					        "version": "3.21"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -32,7 +32,7 @@
 | 
				
			|||||||
      "resources": {
 | 
					      "resources": {
 | 
				
			||||||
        "cpu": 1,
 | 
					        "cpu": 1,
 | 
				
			||||||
        "ram": 256,
 | 
					        "ram": 256,
 | 
				
			||||||
              "hdd": 0.2,
 | 
					        "hdd": 0.5,
 | 
				
			||||||
        "os": "alpine",
 | 
					        "os": "alpine",
 | 
				
			||||||
        "version": "3.21"
 | 
					        "version": "3.21"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -44,4 +44,3 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "notes": []
 | 
					  "notes": []
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										55
									
								
								frontend/public/json/alpine-rclone.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								frontend/public/json/alpine-rclone.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "Alpine-rclone",
 | 
				
			||||||
 | 
					  "slug": "alpine-rclone",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    11
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-05-06",
 | 
				
			||||||
 | 
					  "type": "ct",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": 3000,
 | 
				
			||||||
 | 
					  "documentation": "https://rclone.org/docs/",
 | 
				
			||||||
 | 
					  "website": "https://rclone.org/",
 | 
				
			||||||
 | 
					  "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/svg/rclone.svg",
 | 
				
			||||||
 | 
					  "config_path": "~/.config/rclone/rclone.conf",
 | 
				
			||||||
 | 
					  "description": "Rclone is a command-line program to manage files on cloud storage. It is a feature-rich alternative to cloud vendors' web storage interfaces",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "ct/alpine-rclone.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 1,
 | 
				
			||||||
 | 
					        "ram": 256,
 | 
				
			||||||
 | 
					        "hdd": 1,
 | 
				
			||||||
 | 
					        "os": "alpine",
 | 
				
			||||||
 | 
					        "version": "3.21"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "alpine",
 | 
				
			||||||
 | 
					      "script": "ct/alpine-rclone.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 1,
 | 
				
			||||||
 | 
					        "ram": 256,
 | 
				
			||||||
 | 
					        "hdd": 1,
 | 
				
			||||||
 | 
					        "os": "alpine",
 | 
				
			||||||
 | 
					        "version": "3.21"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": null,
 | 
				
			||||||
 | 
					    "password": null
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "info",
 | 
				
			||||||
 | 
					      "text": "`cat ~/rclone.creds` to view login credentials"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "info",
 | 
				
			||||||
 | 
					      "text": "`htpasswd -b -B /opt/rclone/login.pwd newuser newuserpassword` to add more users."
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										51
									
								
								frontend/public/json/alpine-tinyauth.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								frontend/public/json/alpine-tinyauth.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "Alpine-tinyauth",
 | 
				
			||||||
 | 
					  "slug": "alpine-tinyauth",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    6
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-05-06",
 | 
				
			||||||
 | 
					  "type": "ct",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": 3000,
 | 
				
			||||||
 | 
					  "documentation": "https://tinyauth.app/docs/getting-started.html",
 | 
				
			||||||
 | 
					  "website": "https://tinyauth.app/",
 | 
				
			||||||
 | 
					  "logo": "https://raw.githubusercontent.com/steveiliop56/tinyauth/refs/heads/main/frontend/public/android-chrome-192x192.png",
 | 
				
			||||||
 | 
					  "config_path": "/opt/tinyauth/.env",
 | 
				
			||||||
 | 
					  "description": "Tinyauth is a simple authentication middleware that adds simple username/password login or OAuth with Google, Github and any generic provider to all of your docker apps. It is designed for traefik but it can be extended to work with all reverse proxies like caddy and nginx.",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "ct/alpine-tinyauth.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 1,
 | 
				
			||||||
 | 
					        "ram": 256,
 | 
				
			||||||
 | 
					        "hdd": 3,
 | 
				
			||||||
 | 
					        "os": "alpine",
 | 
				
			||||||
 | 
					        "version": "3.21"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "alpine",
 | 
				
			||||||
 | 
					      "script": "ct/alpine-tinyauth.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 1,
 | 
				
			||||||
 | 
					        "ram": 256,
 | 
				
			||||||
 | 
					        "hdd": 3,
 | 
				
			||||||
 | 
					        "os": "alpine",
 | 
				
			||||||
 | 
					        "version": "3.21"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": null,
 | 
				
			||||||
 | 
					    "password": null
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "info",
 | 
				
			||||||
 | 
					      "text": "`cat ~/tinyauth.creds` to view login credentials"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -21,7 +21,7 @@
 | 
				
			|||||||
      "resources": {
 | 
					      "resources": {
 | 
				
			||||||
        "cpu": 1,
 | 
					        "cpu": 1,
 | 
				
			||||||
        "ram": 512,
 | 
					        "ram": 512,
 | 
				
			||||||
                "hdd": 0.1,
 | 
					        "hdd": 0.5,
 | 
				
			||||||
        "os": "alpine",
 | 
					        "os": "alpine",
 | 
				
			||||||
        "version": "3.21"
 | 
					        "version": "3.21"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -32,7 +32,7 @@
 | 
				
			|||||||
      "resources": {
 | 
					      "resources": {
 | 
				
			||||||
        "cpu": 1,
 | 
					        "cpu": 1,
 | 
				
			||||||
        "ram": 512,
 | 
					        "ram": 512,
 | 
				
			||||||
                "hdd": 0.1,
 | 
					        "hdd": 0.5,
 | 
				
			||||||
        "os": "alpine",
 | 
					        "os": "alpine",
 | 
				
			||||||
        "version": "3.21"
 | 
					        "version": "3.21"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -49,4 +49,3 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@
 | 
				
			|||||||
            "script": "ct/authentik.sh",
 | 
					            "script": "ct/authentik.sh",
 | 
				
			||||||
            "resources": {
 | 
					            "resources": {
 | 
				
			||||||
                "cpu": 6,
 | 
					                "cpu": 6,
 | 
				
			||||||
                "ram": 8192,
 | 
					                "ram": 10240,
 | 
				
			||||||
                "hdd": 12,
 | 
					                "hdd": 12,
 | 
				
			||||||
                "os": "debian",
 | 
					                "os": "debian",
 | 
				
			||||||
                "version": "12"
 | 
					                "version": "12"
 | 
				
			||||||
@@ -33,7 +33,11 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    "notes": [
 | 
					    "notes": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "text": "Authentik is very resource-heavy, it is recommended to use at least 8GB RAM anytime!",
 | 
					            "text": "Authentik is very resource-heavy, it is recommended to use at least 10GB RAM anytime!",
 | 
				
			||||||
 | 
					            "type": "warning"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "text": "Some updates don't work due to massive dependency errors, it's recommended to do a backup before updating or a pg_dump and a new LXC.",
 | 
				
			||||||
            "type": "warning"
 | 
					            "type": "warning"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,39 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "name": "VS Code Server",
 | 
					 | 
				
			||||||
  "slug": "code-server",
 | 
					 | 
				
			||||||
  "categories": [1, 20, 11],
 | 
					 | 
				
			||||||
  "date_created": "2024-05-02",
 | 
					 | 
				
			||||||
  "type": "addon",
 | 
					 | 
				
			||||||
  "updateable": false,
 | 
					 | 
				
			||||||
  "privileged": false,
 | 
					 | 
				
			||||||
  "interface_port": 8680,
 | 
					 | 
				
			||||||
  "documentation": null,
 | 
					 | 
				
			||||||
  "website": null,
 | 
					 | 
				
			||||||
  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/visual-studio-code.svg",
 | 
					 | 
				
			||||||
  "config_path": "",
 | 
					 | 
				
			||||||
  "description": "VS Code Server is a service you can run on a remote development machine, like your desktop PC or a virtual machine (VM). It allows you to securely connect to that remote machine from anywhere through a vscode.dev URL, without the requirement of SSH.",
 | 
					 | 
				
			||||||
  "install_methods": [
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      "type": "default",
 | 
					 | 
				
			||||||
      "script": "tools/addon/code-server.sh",
 | 
					 | 
				
			||||||
      "resources": {
 | 
					 | 
				
			||||||
        "cpu": null,
 | 
					 | 
				
			||||||
        "ram": null,
 | 
					 | 
				
			||||||
        "hdd": null,
 | 
					 | 
				
			||||||
        "os": null,
 | 
					 | 
				
			||||||
        "version": null
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
  "default_credentials": {
 | 
					 | 
				
			||||||
    "username": null,
 | 
					 | 
				
			||||||
    "password": null
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "notes": [
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      "text": "Execute within an existing LXC Console",
 | 
					 | 
				
			||||||
      "type": "warning"
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
							
								
								
									
										42
									
								
								frontend/public/json/coder-code-server.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								frontend/public/json/coder-code-server.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "Coder Code Server",
 | 
				
			||||||
 | 
					  "slug": "coder-code-server",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    1,
 | 
				
			||||||
 | 
					    20,
 | 
				
			||||||
 | 
					    11
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2024-05-02",
 | 
				
			||||||
 | 
					  "type": "addon",
 | 
				
			||||||
 | 
					  "updateable": false,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": 8680,
 | 
				
			||||||
 | 
					  "documentation": "https://coder.com/docs/code-server",
 | 
				
			||||||
 | 
					  "website": "https://coder.com/",
 | 
				
			||||||
 | 
					  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/coder.svg",
 | 
				
			||||||
 | 
					  "config_path": "",
 | 
				
			||||||
 | 
					  "description": "Coder Code Server is an open-source project that enables you to run Visual Studio Code (VS Code) on a remote machine, such as a desktop PC or virtual server. It serves a web-based version of VS Code that you can access from any browser via a URL, allowing remote development without needing an SSH connection. Unlike the official VS Code Server used by vscode.dev for Remote Tunnels, code-server is developed by Coder and operates independently, providing similar capabilities through a self-hosted solution.",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "tools/addon/coder-code-server.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": null,
 | 
				
			||||||
 | 
					        "ram": null,
 | 
				
			||||||
 | 
					        "hdd": null,
 | 
				
			||||||
 | 
					        "os": null,
 | 
				
			||||||
 | 
					        "version": null
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": null,
 | 
				
			||||||
 | 
					    "password": null
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "Execute within an existing LXC Console",
 | 
				
			||||||
 | 
					      "type": "warning"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,35 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
    "name": "Documenso",
 | 
					 | 
				
			||||||
    "slug": "documenso",
 | 
					 | 
				
			||||||
    "categories": [
 | 
					 | 
				
			||||||
        12
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "date_created": "2025-04-28",
 | 
					 | 
				
			||||||
    "type": "ct",
 | 
					 | 
				
			||||||
    "updateable": true,
 | 
					 | 
				
			||||||
    "privileged": false,
 | 
					 | 
				
			||||||
    "interface_port": 3000,
 | 
					 | 
				
			||||||
    "documentation": "https://documenso.com/",
 | 
					 | 
				
			||||||
    "website": "https://documenso.com/",
 | 
					 | 
				
			||||||
    "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/documenso.svg",
 | 
					 | 
				
			||||||
    "config_path": "/opt/documenso/.env",
 | 
					 | 
				
			||||||
    "description": "Signing documents digitally should be fast and easy and should be the best practice for every document signed worldwide. This is technically quite easy today, but it also introduces a new party to every signature: The signing tool providers. While this is not a problem in itself, it should make us think about how we want these providers of trust to work. Documenso aims to be the world's most trusted document-signing tool. This trust is built by empowering you to self-host Documenso and review how it works under the hood.",
 | 
					 | 
				
			||||||
    "install_methods": [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            "type": "default",
 | 
					 | 
				
			||||||
            "script": "ct/documenso.sh",
 | 
					 | 
				
			||||||
            "resources": {
 | 
					 | 
				
			||||||
                "cpu": 4,
 | 
					 | 
				
			||||||
                "ram": 6144,
 | 
					 | 
				
			||||||
                "hdd": 10,
 | 
					 | 
				
			||||||
                "os": "Debian",
 | 
					 | 
				
			||||||
                "version": "12"
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "default_credentials": {
 | 
					 | 
				
			||||||
        "username": "helper-scripts@local.com",
 | 
					 | 
				
			||||||
        "password": "helper-scripts"
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "notes": []
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										35
									
								
								frontend/public/json/fumadocs.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								frontend/public/json/fumadocs.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "Fumadocs",
 | 
				
			||||||
 | 
					  "slug": "fumadocs",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    10
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-05-06",
 | 
				
			||||||
 | 
					  "type": "ct",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": 3000,
 | 
				
			||||||
 | 
					  "documentation": "https://fumadocs.vercel.app/docs/ui",
 | 
				
			||||||
 | 
					  "website": "https://fumadocs.vercel.app/",
 | 
				
			||||||
 | 
					  "logo": "https://raw.githubusercontent.com/fuma-nama/fumadocs/refs/heads/dev/documents/logo.png",
 | 
				
			||||||
 | 
					  "config_path": "",
 | 
				
			||||||
 | 
					  "description": "Fumadocs is a flexible and high-performance framework for creating well-structured documentation websites using Next.js. It allows developers to write content and transform it into structured data. Fumadocs supports various content sources, including MDX and Content Collections, and integrates search solutions like Orama and Algolia. It also provides interactive components to enhance the user experience.",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "ct/fumadocs.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 2,
 | 
				
			||||||
 | 
					        "ram": 2048,
 | 
				
			||||||
 | 
					        "hdd": 5,
 | 
				
			||||||
 | 
					        "os": "Debian",
 | 
				
			||||||
 | 
					        "version": "12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": null,
 | 
				
			||||||
 | 
					    "password": null
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": []
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
  "documentation": "https://github.com/HabitRPG/habitica/wiki",
 | 
					  "documentation": "https://github.com/HabitRPG/habitica/wiki",
 | 
				
			||||||
  "website": "https://habitica.com/",
 | 
					  "website": "https://habitica.com/",
 | 
				
			||||||
  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/habitica.svg",
 | 
					  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/habitica.svg",
 | 
				
			||||||
  "config_path": "/etc/headscale/config.yaml",
 | 
					  "config_path": "/opt/habitica/config.json",
 | 
				
			||||||
  "description": "Habitica is an open-source habit-building program that treats your life like a role-playing game. Level up as you succeed, lose HP as you fail, and earn Gold to buy weapons and armor!",
 | 
					  "description": "Habitica is an open-source habit-building program that treats your life like a role-playing game. Level up as you succeed, lose HP as you fail, and earn Gold to buy weapons and armor!",
 | 
				
			||||||
  "install_methods": [
 | 
					  "install_methods": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -35,11 +35,6 @@
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
      "text": "It takes a minute or two after installation for web UI to start, please be patient.",
 | 
					      "text": "It takes a minute or two after installation for web UI to start, please be patient.",
 | 
				
			||||||
      "type": "info"
 | 
					      "type": "info"
 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      "text": "Config file is at `/opt/habitica/config.json`",
 | 
					 | 
				
			||||||
      "type": "info"
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,17 @@
 | 
				
			|||||||
        "os": "debian",
 | 
					        "os": "debian",
 | 
				
			||||||
        "version": "12"
 | 
					        "version": "12"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "alpine",
 | 
				
			||||||
 | 
					      "script": "ct/alpine-komodo.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 1,
 | 
				
			||||||
 | 
					        "ram": 1024,
 | 
				
			||||||
 | 
					        "hdd": 10,
 | 
				
			||||||
 | 
					        "os": "alpine",
 | 
				
			||||||
 | 
					        "version": "3.21"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "default_credentials": {
 | 
					  "default_credentials": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
  "updateable": true,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 8080,
 | 
					  "interface_port": 8080,
 | 
				
			||||||
    "documentation": null,
 | 
					  "documentation": "https://docs.openwebui.com/",
 | 
				
			||||||
  "website": "https://openwebui.com/",
 | 
					  "website": "https://openwebui.com/",
 | 
				
			||||||
  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/open-webui.svg",
 | 
					  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/open-webui.svg",
 | 
				
			||||||
  "config_path": "/opt/open-webui/.env",
 | 
					  "config_path": "/opt/open-webui/.env",
 | 
				
			||||||
@@ -20,8 +20,8 @@
 | 
				
			|||||||
      "script": "ct/openwebui.sh",
 | 
					      "script": "ct/openwebui.sh",
 | 
				
			||||||
      "resources": {
 | 
					      "resources": {
 | 
				
			||||||
        "cpu": 4,
 | 
					        "cpu": 4,
 | 
				
			||||||
                "ram": 4096,
 | 
					        "ram": 8192,
 | 
				
			||||||
                "hdd": 16,
 | 
					        "hdd": 25,
 | 
				
			||||||
        "os": "debian",
 | 
					        "os": "debian",
 | 
				
			||||||
        "version": "12"
 | 
					        "version": "12"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@
 | 
				
			|||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "date_created": "2024-05-02",
 | 
					  "date_created": "2024-05-02",
 | 
				
			||||||
  "type": "ct",
 | 
					  "type": "ct",
 | 
				
			||||||
  "updateable": false,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 8080,
 | 
					  "interface_port": 8080,
 | 
				
			||||||
  "documentation": "https://docs.sftpgo.com/latest/",
 | 
					  "documentation": "https://docs.sftpgo.com/latest/",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										40
									
								
								frontend/public/json/streamlink-webui.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								frontend/public/json/streamlink-webui.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "Streamlink WebUI",
 | 
				
			||||||
 | 
					  "slug": "streamlink-webui",
 | 
				
			||||||
 | 
					  "categories": [
 | 
				
			||||||
 | 
					    11
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "date_created": "2025-05-06",
 | 
				
			||||||
 | 
					  "type": "ct",
 | 
				
			||||||
 | 
					  "updateable": true,
 | 
				
			||||||
 | 
					  "privileged": false,
 | 
				
			||||||
 | 
					  "interface_port": 8000,
 | 
				
			||||||
 | 
					  "documentation": "https://github.com/CrazyWolf13/streamlink-webui",
 | 
				
			||||||
 | 
					  "config_path": "/opt/streamlink-webui.env",
 | 
				
			||||||
 | 
					  "website": "https://github.com/CrazyWolf13/streamlink-webui",
 | 
				
			||||||
 | 
					  "logo": null,
 | 
				
			||||||
 | 
					  "description": "a simple web-ui to the well-known streamlink cli application, which allows you to save twitch streams to your local disk.",
 | 
				
			||||||
 | 
					  "install_methods": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "default",
 | 
				
			||||||
 | 
					      "script": "ct/streamlink-webui.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 2,
 | 
				
			||||||
 | 
					        "ram": 2048,
 | 
				
			||||||
 | 
					        "hdd": 5,
 | 
				
			||||||
 | 
					        "os": "Debian",
 | 
				
			||||||
 | 
					        "version": "12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "default_credentials": {
 | 
				
			||||||
 | 
					    "username": "null",
 | 
				
			||||||
 | 
					    "password": "null"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "text": "This app requires a Twitch cliend_ID and client_secret, set it in the config file. Look in the application documentation on how to obtain it.",
 | 
				
			||||||
 | 
					      "type": "info"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,40 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
    "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",
 | 
					 | 
				
			||||||
    "config_path": "",
 | 
					 | 
				
			||||||
    "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"
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    ]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -4,15 +4,15 @@
 | 
				
			|||||||
  "categories": [
 | 
					  "categories": [
 | 
				
			||||||
    11
 | 
					    11
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
    "date_created": "2024-05-02",
 | 
					  "date_created": "2025-05-02",
 | 
				
			||||||
  "type": "ct",
 | 
					  "type": "ct",
 | 
				
			||||||
    "updateable": false,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 9091,
 | 
					  "interface_port": 9091,
 | 
				
			||||||
    "documentation": null,
 | 
					  "documentation": "https://github.com/transmission/transmission/blob/main/docs/README.md",
 | 
				
			||||||
  "website": "https://transmissionbt.com/",
 | 
					  "website": "https://transmissionbt.com/",
 | 
				
			||||||
  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/transmission.svg",
 | 
					  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/transmission.svg",
 | 
				
			||||||
    "config_path": "/etc/transmission-daemon/settings.json",
 | 
					  "config_path": "Debian `/etc/transmission-daemon/settings.json` | Alpine `/var/lib/transmission/config/settings.json`",
 | 
				
			||||||
  "description": "Transmission is a free, open-source BitTorrent client known for its fast download speeds and ease of use. It supports various platforms such as Windows, Linux, and macOS and has features like web interface, peer exchange, and encrypted transfers.",
 | 
					  "description": "Transmission is a free, open-source BitTorrent client known for its fast download speeds and ease of use. It supports various platforms such as Windows, Linux, and macOS and has features like web interface, peer exchange, and encrypted transfers.",
 | 
				
			||||||
  "install_methods": [
 | 
					  "install_methods": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -25,11 +25,31 @@
 | 
				
			|||||||
        "os": "debian",
 | 
					        "os": "debian",
 | 
				
			||||||
        "version": "12"
 | 
					        "version": "12"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "alpine",
 | 
				
			||||||
 | 
					      "script": "ct/alpine-transmission.sh",
 | 
				
			||||||
 | 
					      "resources": {
 | 
				
			||||||
 | 
					        "cpu": 1,
 | 
				
			||||||
 | 
					        "ram": 256,
 | 
				
			||||||
 | 
					        "hdd": 1,
 | 
				
			||||||
 | 
					        "os": "alpine",
 | 
				
			||||||
 | 
					        "version": "3.21"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "default_credentials": {
 | 
					  "default_credentials": {
 | 
				
			||||||
        "username": "transmission",
 | 
					    "username": null,
 | 
				
			||||||
        "password": "transmission"
 | 
					    "password": null
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
    "notes": []
 | 
					  "notes": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "info",
 | 
				
			||||||
 | 
					      "text": "Script disables whitelisting by default. Change config to suit your needs."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "type": "info",
 | 
				
			||||||
 | 
					      "text": "Alpine script sets initial disk size to 1GB. Please adjust for your needs after installation ends."
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
  "updateable": true,
 | 
					  "updateable": true,
 | 
				
			||||||
  "privileged": false,
 | 
					  "privileged": false,
 | 
				
			||||||
  "interface_port": 8000,
 | 
					  "interface_port": 8000,
 | 
				
			||||||
    "documentation": null,
 | 
					  "documentation": "https://github.com/dani-garcia/vaultwarden/wiki",
 | 
				
			||||||
  "website": "https://github.com/dani-garcia/vaultwarden/",
 | 
					  "website": "https://github.com/dani-garcia/vaultwarden/",
 | 
				
			||||||
  "logo": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/resources/vaultwarden-icon-white.svg",
 | 
					  "logo": "https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/resources/vaultwarden-icon-white.svg",
 | 
				
			||||||
  "config_path": "/opt/vaultwarden/.env",
 | 
					  "config_path": "/opt/vaultwarden/.env",
 | 
				
			||||||
@@ -44,7 +44,7 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "notes": [
 | 
					  "notes": [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
            "text": "Vaultwarden needs to be behind a proxy (Nginx Proxy Manager, Caddy, etc) to obtain HTTPS and to allow clients to connect. If you try to open the web page directly on the new container, the web site will not load",
 | 
					      "text": "Application uses self-signed certificate for HTTPS to work and is enabled by default. If you need a different setup, please read the documentation.",
 | 
				
			||||||
      "type": "warning"
 | 
					      "type": "warning"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -53,4 +53,3 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -16,7 +16,10 @@ import React from "react";
 | 
				
			|||||||
import { Badge } from "./ui/badge";
 | 
					import { Badge } from "./ui/badge";
 | 
				
			||||||
import { Button } from "./ui/button";
 | 
					import { Button } from "./ui/button";
 | 
				
			||||||
import { DialogTitle } from "./ui/dialog";
 | 
					import { DialogTitle } from "./ui/dialog";
 | 
				
			||||||
import { Sparkles } from "lucide-react"; // <- Hinzugefügt
 | 
					import { Sparkles } from "lucide-react";
 | 
				
			||||||
 | 
					import { TooltipContent, TooltipProvider } from "./ui/tooltip";
 | 
				
			||||||
 | 
					import { TooltipTrigger } from "./ui/tooltip";
 | 
				
			||||||
 | 
					import { Tooltip } from "./ui/tooltip";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const formattedBadge = (type: string) => {
 | 
					export const formattedBadge = (type: string) => {
 | 
				
			||||||
  switch (type) {
 | 
					  switch (type) {
 | 
				
			||||||
@@ -111,16 +114,19 @@ export default function CommandMenu() {
 | 
				
			|||||||
          </kbd>
 | 
					          </kbd>
 | 
				
			||||||
        </Button>
 | 
					        </Button>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Button
 | 
					        <TooltipProvider>
 | 
				
			||||||
          variant="outline"
 | 
					          <Tooltip delayDuration={100}>
 | 
				
			||||||
          size="icon"
 | 
					            <TooltipTrigger asChild>
 | 
				
			||||||
          onClick={openRandomScript}
 | 
					              <Button variant="outline" size="icon" onClick={openRandomScript} disabled={isLoading} className="hidden lg:flex">
 | 
				
			||||||
          title="Open random script"
 | 
					                <Sparkles className="size-4" />
 | 
				
			||||||
          disabled={isLoading}
 | 
					                <span className="sr-only">Open Random Script</span>
 | 
				
			||||||
          className="h-9 w-9"
 | 
					 | 
				
			||||||
        >
 | 
					 | 
				
			||||||
          <Sparkles className="h-5 w-5" />
 | 
					 | 
				
			||||||
              </Button>
 | 
					              </Button>
 | 
				
			||||||
 | 
					            </TooltipTrigger>
 | 
				
			||||||
 | 
					            <TooltipContent>
 | 
				
			||||||
 | 
					              <p>Open Random Script</p>
 | 
				
			||||||
 | 
					            </TooltipContent>
 | 
				
			||||||
 | 
					          </Tooltip>
 | 
				
			||||||
 | 
					        </TooltipProvider>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <CommandDialog open={open} onOpenChange={setOpen}>
 | 
					      <CommandDialog open={open} onOpenChange={setOpen}>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,8 +41,8 @@ export default function CodeCopyButton({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className="mt-4 flex">
 | 
					    <div className="mt-4 flex">
 | 
				
			||||||
      <Card className="flex items-center overflow-x-auto bg-primary-foreground pl-4">
 | 
					      <Card className="flex items-center overflow-x-auto bg-primary-foreground pl-4 [&::-webkit-scrollbar]:h-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-muted-foreground/20">
 | 
				
			||||||
        <div className="overflow-x-auto whitespace-pre-wrap text-nowrap break-all pr-4 text-sm">
 | 
					        <div className="overflow-x-auto whitespace-pre-wrap text-nowrap break-all pr-4 text-sm [&::-webkit-scrollbar]:h-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-muted-foreground/20">
 | 
				
			||||||
          {!isMobile && children ? children : "Copy install command"}
 | 
					          {!isMobile && children ? children : "Copy install command"}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <button
 | 
					        <button
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,4 +34,9 @@ export const FAQ_Items = [
 | 
				
			|||||||
    content:
 | 
					    content:
 | 
				
			||||||
      "If an LXC script fails, run it again using Verbose mode. Standard mode hides detailed output for neatness, showing only progress. Verbose mode displays all messages, which helps you (and us) diagnose the error. Include this verbose output if you report the issue.",
 | 
					      "If an LXC script fails, run it again using Verbose mode. Standard mode hides detailed output for neatness, showing only progress. Verbose mode displays all messages, which helps you (and us) diagnose the error. Include this verbose output if you report the issue.",
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    title: "What does \"Updatable\" and \"Not updatable\" mean?",
 | 
				
			||||||
 | 
					    content:
 | 
				
			||||||
 | 
					      "Updatable means that script has a function that is used to update the installed application to the latest version available. Not updatable means that script doesn't have a function that can safely update the application to the latest version available, so only the LXC OS is updated.",
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										91
									
								
								install/actualbudget-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								install/actualbudget-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: MickLesk (CanbiZ)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://actualbudget.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing Actual Budget"
 | 
				
			||||||
 | 
					cd /opt
 | 
				
			||||||
 | 
					RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					NODE_VERSION="22"
 | 
				
			||||||
 | 
					install_node_and_modules
 | 
				
			||||||
 | 
					mkdir -p /opt/actualbudget-data/{server-files,upload,migrate,user-files,migrations,config}
 | 
				
			||||||
 | 
					chown -R root:root /opt/actualbudget-data
 | 
				
			||||||
 | 
					chmod -R 755 /opt/actualbudget-data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat <<EOF >/opt/actualbudget-data/config.json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "port": 5006,
 | 
				
			||||||
 | 
					  "hostname": "::",
 | 
				
			||||||
 | 
					  "serverFiles": "/opt/actualbudget-data/server-files",
 | 
				
			||||||
 | 
					  "userFiles": "/opt/actualbudget-data/user-files",
 | 
				
			||||||
 | 
					  "trustedProxies": [
 | 
				
			||||||
 | 
					    "10.0.0.0/8",
 | 
				
			||||||
 | 
					    "172.16.0.0/12",
 | 
				
			||||||
 | 
					    "192.168.0.0/16",
 | 
				
			||||||
 | 
					    "127.0.0.0/8",
 | 
				
			||||||
 | 
					    "::1/128",
 | 
				
			||||||
 | 
					    "fc00::/7"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "https": {
 | 
				
			||||||
 | 
					    "key": "/opt/actualbudget/selfhost.key",
 | 
				
			||||||
 | 
					    "cert": "/opt/actualbudget/selfhost.crt"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mkdir -p /opt/actualbudget
 | 
				
			||||||
 | 
					cd /opt/actualbudget
 | 
				
			||||||
 | 
					$STD npm install --location=global @actual-app/sync-server
 | 
				
			||||||
 | 
					$STD openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfhost.key -out selfhost.crt <<EOF
 | 
				
			||||||
 | 
					US
 | 
				
			||||||
 | 
					California
 | 
				
			||||||
 | 
					San Francisco
 | 
				
			||||||
 | 
					My Organization
 | 
				
			||||||
 | 
					My Unit
 | 
				
			||||||
 | 
					localhost
 | 
				
			||||||
 | 
					myemail@example.com
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					echo "${RELEASE}" >"/opt/actualbudget_version.txt"
 | 
				
			||||||
 | 
					msg_ok "Installed Actual Budget"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Creating Service"
 | 
				
			||||||
 | 
					cat <<EOF >/etc/systemd/system/actualbudget.service
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=Actual Budget Service
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					Type=simple
 | 
				
			||||||
 | 
					User=root
 | 
				
			||||||
 | 
					Group=root
 | 
				
			||||||
 | 
					WorkingDirectory=/opt/actualbudget
 | 
				
			||||||
 | 
					Environment=ACTUAL_UPLOAD_FILE_SIZE_LIMIT_MB=20
 | 
				
			||||||
 | 
					Environment=ACTUAL_UPLOAD_SYNC_ENCRYPTED_FILE_SYNC_SIZE_LIMIT_MB=50
 | 
				
			||||||
 | 
					Environment=ACTUAL_UPLOAD_FILE_SYNC_SIZE_LIMIT_MB=20
 | 
				
			||||||
 | 
					ExecStart=/usr/bin/actual-server --config /opt/actualbudget-data/config.json
 | 
				
			||||||
 | 
					Restart=always
 | 
				
			||||||
 | 
					RestartSec=10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					systemctl enable -q --now actualbudget
 | 
				
			||||||
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
							
								
								
									
										79
									
								
								install/alpine-komodo-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								install/alpine-komodo-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: MickLesk (CanbiZ)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://komo.do/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
 | 
					$STD apk add --no-cache ca-certificates openssl
 | 
				
			||||||
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Setup Docker Repository"
 | 
				
			||||||
 | 
					$STD apk add --no-cache docker docker-cli docker-compose openrc
 | 
				
			||||||
 | 
					msg_ok "Setup Docker Repository"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Enabling Docker Service"
 | 
				
			||||||
 | 
					$STD rc-update add docker boot
 | 
				
			||||||
 | 
					$STD service docker start
 | 
				
			||||||
 | 
					msg_ok "Enabled Docker Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "Choose the database for Komodo installation:"
 | 
				
			||||||
 | 
					echo "1) MongoDB (recommended)"
 | 
				
			||||||
 | 
					echo "2) SQLite"
 | 
				
			||||||
 | 
					echo "3) PostgreSQL"
 | 
				
			||||||
 | 
					read -rp "Enter your choice (default: 1): " DB_CHOICE
 | 
				
			||||||
 | 
					DB_CHOICE=${DB_CHOICE:-1}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case $DB_CHOICE in
 | 
				
			||||||
 | 
					1)
 | 
				
			||||||
 | 
					  DB_COMPOSE_FILE="mongo.compose.yaml"
 | 
				
			||||||
 | 
					  ;;
 | 
				
			||||||
 | 
					2)
 | 
				
			||||||
 | 
					  DB_COMPOSE_FILE="sqlite.compose.yaml"
 | 
				
			||||||
 | 
					  ;;
 | 
				
			||||||
 | 
					3)
 | 
				
			||||||
 | 
					  DB_COMPOSE_FILE="postgres.compose.yaml"
 | 
				
			||||||
 | 
					  ;;
 | 
				
			||||||
 | 
					*)
 | 
				
			||||||
 | 
					  echo "Invalid choice. Defaulting to MongoDB."
 | 
				
			||||||
 | 
					  DB_COMPOSE_FILE="mongo.compose.yaml"
 | 
				
			||||||
 | 
					  ;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mkdir -p /opt/komodo
 | 
				
			||||||
 | 
					cd /opt/komodo
 | 
				
			||||||
 | 
					curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/$DB_COMPOSE_FILE" -o "$(basename "$DB_COMPOSE_FILE")"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Setup Komodo Environment"
 | 
				
			||||||
 | 
					curl -fsSL "https://raw.githubusercontent.com/moghtech/komodo/main/compose/compose.env" -o "/opt/komodo/compose.env"
 | 
				
			||||||
 | 
					DB_PASSWORD=$(openssl rand -base64 16 | tr -d '/+=')
 | 
				
			||||||
 | 
					PASSKEY=$(openssl rand -base64 24 | tr -d '/+=')
 | 
				
			||||||
 | 
					WEBHOOK_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
 | 
				
			||||||
 | 
					JWT_SECRET=$(openssl rand -base64 24 | tr -d '/+=')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sed -i "s/^KOMODO_DB_USERNAME=.*/KOMODO_DB_USERNAME=komodo_admin/" /opt/komodo/compose.env
 | 
				
			||||||
 | 
					sed -i "s/^KOMODO_DB_PASSWORD=.*/KOMODO_DB_PASSWORD=${DB_PASSWORD}/" /opt/komodo/compose.env
 | 
				
			||||||
 | 
					sed -i "s/^KOMODO_PASSKEY=.*/KOMODO_PASSKEY=${PASSKEY}/" /opt/komodo/compose.env
 | 
				
			||||||
 | 
					sed -i "s/^KOMODO_WEBHOOK_SECRET=.*/KOMODO_WEBHOOK_SECRET=${WEBHOOK_SECRET}/" /opt/komodo/compose.env
 | 
				
			||||||
 | 
					sed -i "s/^KOMODO_JWT_SECRET=.*/KOMODO_JWT_SECRET=${JWT_SECRET}/" /opt/komodo/compose.env
 | 
				
			||||||
 | 
					msg_ok "Setup Komodo Environment"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Initialize Komodo"
 | 
				
			||||||
 | 
					$STD docker compose -p komodo -f "/opt/komodo/$DB_COMPOSE_FILE" --env-file /opt/komodo/compose.env up -d
 | 
				
			||||||
 | 
					msg_ok "Initialized Komodo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					$STD apk cache clean
 | 
				
			||||||
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
							
								
								
									
										68
									
								
								install/alpine-rclone-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								install/alpine-rclone-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					#!/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/rclone/rclone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing dependencies"
 | 
				
			||||||
 | 
					$STD apk add --no-cache \
 | 
				
			||||||
 | 
					  unzip \
 | 
				
			||||||
 | 
					  apache2-utils
 | 
				
			||||||
 | 
					msg_ok "Installed dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing rclone"
 | 
				
			||||||
 | 
					temp_file=$(mktemp)
 | 
				
			||||||
 | 
					mkdir -p /opt/rclone
 | 
				
			||||||
 | 
					RELEASE=$(curl -s https://api.github.com/repos/rclone/rclone/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					curl -fsSL "https://github.com/rclone/rclone/releases/download/v${RELEASE}/rclone-v${RELEASE}-linux-amd64.zip" -o "$temp_file"
 | 
				
			||||||
 | 
					$STD unzip -j "$temp_file" '*/**' -d /opt/rclone
 | 
				
			||||||
 | 
					cd /opt/rclone
 | 
				
			||||||
 | 
					RCLONE_PASSWORD=$(head -c 16 /dev/urandom | xxd -p -c 16)
 | 
				
			||||||
 | 
					$STD htpasswd -cb -B login.pwd admin "$RCLONE_PASSWORD"
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  echo "rclone-Credentials"
 | 
				
			||||||
 | 
					  echo "rclone User Name: admin"
 | 
				
			||||||
 | 
					  echo "rclone Password: $RCLONE_PASSWORD"
 | 
				
			||||||
 | 
					} >>~/rclone.creds
 | 
				
			||||||
 | 
					echo "${RELEASE}" >/opt/rclone_version.txt
 | 
				
			||||||
 | 
					rm -f "$temp_file"
 | 
				
			||||||
 | 
					msg_ok "Installed rclone"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Enabling rclone Service"
 | 
				
			||||||
 | 
					cat <<EOF >/etc/init.d/rclone
 | 
				
			||||||
 | 
					#!/sbin/openrc-run
 | 
				
			||||||
 | 
					description="rclone Service"
 | 
				
			||||||
 | 
					command="/opt/rclone/rclone"
 | 
				
			||||||
 | 
					command_args="rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-htpasswd /opt/rclone/login.pwd"
 | 
				
			||||||
 | 
					command_background="true"
 | 
				
			||||||
 | 
					command_user="root"
 | 
				
			||||||
 | 
					pidfile="/var/run/rclone.pid"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depend() {
 | 
				
			||||||
 | 
					    use net
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					chmod +x /etc/init.d/rclone
 | 
				
			||||||
 | 
					$STD rc-update add rclone default
 | 
				
			||||||
 | 
					msg_ok "Enabled rclone Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Starting rclone"
 | 
				
			||||||
 | 
					$STD service rclone start
 | 
				
			||||||
 | 
					msg_ok "Started rclone"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					rm -rf "$temp_file"
 | 
				
			||||||
 | 
					$STD apk cache clean
 | 
				
			||||||
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
							
								
								
									
										83
									
								
								install/alpine-tinyauth-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								install/alpine-tinyauth-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					#!/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/steveiliop56/tinyauth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
 | 
					$STD apk add --no-cache \
 | 
				
			||||||
 | 
					  npm \
 | 
				
			||||||
 | 
					  curl \
 | 
				
			||||||
 | 
					  go
 | 
				
			||||||
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing tinyauth"
 | 
				
			||||||
 | 
					temp_file=$(mktemp)
 | 
				
			||||||
 | 
					$STD npm install -g bun
 | 
				
			||||||
 | 
					mkdir -p /opt/tinyauth
 | 
				
			||||||
 | 
					RELEASE=$(curl -s https://api.github.com/repos/steveiliop56/tinyauth/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					curl -fsSL "https://github.com/steveiliop56/tinyauth/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
				
			||||||
 | 
					tar -xzf "$temp_file" -C /opt/tinyauth --strip-components=1
 | 
				
			||||||
 | 
					cd /opt/tinyauth/frontend
 | 
				
			||||||
 | 
					$STD bun install
 | 
				
			||||||
 | 
					$STD bun run build
 | 
				
			||||||
 | 
					mv dist /opt/tinyauth/internal/assets/
 | 
				
			||||||
 | 
					cd /opt/tinyauth
 | 
				
			||||||
 | 
					$STD go mod download
 | 
				
			||||||
 | 
					CGO_ENABLED=0 go build -ldflags "-s -w"
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  echo "tinyauth Credentials"
 | 
				
			||||||
 | 
					  echo "Username: admin@example.com"
 | 
				
			||||||
 | 
					  echo "Password: admin"
 | 
				
			||||||
 | 
					} >>~/tinyauth.creds
 | 
				
			||||||
 | 
					echo "${RELEASE}" >/opt/tinyauth_version.txt
 | 
				
			||||||
 | 
					msg_ok "Installed tinyauth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Enabling tinyauth Service"
 | 
				
			||||||
 | 
					SECRET=$(head -c 16 /dev/urandom | xxd -p -c 16 | tr -d '\n')
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  echo "SECRET=${SECRET}"
 | 
				
			||||||
 | 
					  echo "USERS=admin@example.com:\$2a\$10\$CrTK.W7WXSClo3ZY1yJUFupg5UdV8WNcynEhZhJFNjhGQB.Ga0ZDm"
 | 
				
			||||||
 | 
					  echo "APP_URL=http://localhost:3000"
 | 
				
			||||||
 | 
					} >>/opt/tinyauth/.env
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat <<EOF >/etc/init.d/tinyauth
 | 
				
			||||||
 | 
					#!/sbin/openrc-run
 | 
				
			||||||
 | 
					description="tinyauth Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					command="/opt/tinyauth/tinyauth"
 | 
				
			||||||
 | 
					directory="/opt/tinyauth"
 | 
				
			||||||
 | 
					command_user="root"
 | 
				
			||||||
 | 
					command_background="true"
 | 
				
			||||||
 | 
					pidfile="/var/run/tinyauth.pid"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start_pre() {
 | 
				
			||||||
 | 
					    if [ -f "/opt/tinyauth/.env" ]; then
 | 
				
			||||||
 | 
					        export \$(grep -v '^#' /opt/tinyauth/.env | xargs)
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depend() {
 | 
				
			||||||
 | 
					    use net
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					chmod +x /etc/init.d/tinyauth
 | 
				
			||||||
 | 
					$STD rc-update add tinyauth default
 | 
				
			||||||
 | 
					msg_ok "Enabled tinyauth Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Starting tinyauth"
 | 
				
			||||||
 | 
					$STD service tinyauth start
 | 
				
			||||||
 | 
					msg_ok "Started tinyauth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
							
								
								
									
										32
									
								
								install/alpine-transmission-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								install/alpine-transmission-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					#!/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://transmissionbt.com/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing Transmission"
 | 
				
			||||||
 | 
					$STD apk add --no-cache transmission-cli transmission-daemon
 | 
				
			||||||
 | 
					$STD rc-service transmission-daemon start
 | 
				
			||||||
 | 
					$STD rc-service transmission-daemon stop
 | 
				
			||||||
 | 
					sed -i '{s/"rpc-whitelist-enabled": true/"rpc-whitelist-enabled": false/g; s/"rpc-host-whitelist-enabled": true,/"rpc-host-whitelist-enabled": false,/g}' /var/lib/transmission/config/settings.json
 | 
				
			||||||
 | 
					msg_ok "Installed Transmission"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Enabling Transmission Service"
 | 
				
			||||||
 | 
					$STD rc-update add transmission-daemon default
 | 
				
			||||||
 | 
					msg_ok "Enabled Transmission Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Starting Transmission"
 | 
				
			||||||
 | 
					$STD rc-service transmission-daemon start
 | 
				
			||||||
 | 
					msg_ok "Started Transmission"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 tteck
 | 
					# Copyright (c) 2021-2025 tteck
 | 
				
			||||||
# Author: tteck (tteckster)
 | 
					# Author: tteck (tteckster) | Co-Author: Slaviša Arežina (tremor021)
 | 
				
			||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# Source: https://github.com/dani-garcia/vaultwarden
 | 
					# Source: https://github.com/dani-garcia/vaultwarden
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -14,24 +14,24 @@ network_check
 | 
				
			|||||||
update_os
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Dependencies"
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
$STD apk add newt
 | 
					$STD apk add --no-cache \
 | 
				
			||||||
$STD apk add curl
 | 
					  openssl \
 | 
				
			||||||
$STD apk add openssl
 | 
					  argon2
 | 
				
			||||||
$STD apk add openssh
 | 
					 | 
				
			||||||
$STD apk add nano
 | 
					 | 
				
			||||||
$STD apk add mc
 | 
					 | 
				
			||||||
$STD apk add argon2
 | 
					 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Alpine-Vaultwarden"
 | 
					msg_info "Installing Alpine-Vaultwarden"
 | 
				
			||||||
$STD apk add vaultwarden
 | 
					$STD apk add --no-cache vaultwarden
 | 
				
			||||||
sed -i -e 's|export WEB_VAULT_ENABLED=.*|export WEB_VAULT_ENABLED=true|' /etc/conf.d/vaultwarden
 | 
					sed -i 's|export WEB_VAULT_ENABLED=.*|export WEB_VAULT_ENABLED=true|' /etc/conf.d/vaultwarden
 | 
				
			||||||
echo -e "export ADMIN_TOKEN=''" >>/etc/conf.d/vaultwarden
 | 
					echo -e "export ADMIN_TOKEN=''" >>/etc/conf.d/vaultwarden
 | 
				
			||||||
echo -e "export ROCKET_ADDRESS=0.0.0.0" >>/etc/conf.d/vaultwarden
 | 
					echo -e "export ROCKET_ADDRESS=0.0.0.0" >>/etc/conf.d/vaultwarden
 | 
				
			||||||
 | 
					echo -e "export ROCKET_TLS='{certs=\"/etc/ssl/certs/vaultwarden-selfsigned.crt\",key=\"/etc/ssl/private/vaultwarden-selfsigned.key\"}'" >>/etc/conf.d/vaultwarden
 | 
				
			||||||
 | 
					$STD openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/vaultwarden-selfsigned.key -out /etc/ssl/certs/vaultwarden-selfsigned.crt -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost"
 | 
				
			||||||
 | 
					chown vaultwarden:vaultwarden /etc/ssl/certs/vaultwarden-selfsigned.crt
 | 
				
			||||||
 | 
					chown vaultwarden:vaultwarden /etc/ssl/private/vaultwarden-selfsigned.key
 | 
				
			||||||
msg_ok "Installed Alpine-Vaultwarden"
 | 
					msg_ok "Installed Alpine-Vaultwarden"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Web-Vault"
 | 
					msg_info "Installing Web-Vault"
 | 
				
			||||||
$STD apk add vaultwarden-web-vault
 | 
					$STD apk add --no-cache vaultwarden-web-vault
 | 
				
			||||||
msg_ok "Installed Web-Vault"
 | 
					msg_ok "Installed Web-Vault"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Starting Alpine-Vaultwarden"
 | 
					msg_info "Starting Alpine-Vaultwarden"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,7 +52,7 @@ msg_ok "Setup Apache Tomcat"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
msg_info "Setup Apache Guacamole"
 | 
					msg_info "Setup Apache Guacamole"
 | 
				
			||||||
mkdir -p /etc/guacamole/{extensions,lib}
 | 
					mkdir -p /etc/guacamole/{extensions,lib}
 | 
				
			||||||
RELEASE_SERVER=$(curl -fsSL https://api.github.com/repos/apache/guacamole-server/tags | jq -r '.[0].name')
 | 
					RELEASE_SERVER=$(curl -fsSL https://api.github.com/repos/apache/guacamole-server/tags | jq -r '.[].name' | grep -v -- '-RC' | head -n 1)
 | 
				
			||||||
curl -fsSL "https://api.github.com/repos/apache/guacamole-server/tarball/refs/tags/${RELEASE_SERVER}" | tar -xz --strip-components=1 -C /opt/apache-guacamole/server
 | 
					curl -fsSL "https://api.github.com/repos/apache/guacamole-server/tarball/refs/tags/${RELEASE_SERVER}" | tar -xz --strip-components=1 -C /opt/apache-guacamole/server
 | 
				
			||||||
cd /opt/apache-guacamole/server
 | 
					cd /opt/apache-guacamole/server
 | 
				
			||||||
$STD autoreconf -fi
 | 
					$STD autoreconf -fi
 | 
				
			||||||
@@ -60,7 +60,7 @@ $STD ./configure --with-init-dir=/etc/init.d --enable-allow-freerdp-snapshots
 | 
				
			|||||||
$STD make
 | 
					$STD make
 | 
				
			||||||
$STD make install
 | 
					$STD make install
 | 
				
			||||||
$STD ldconfig
 | 
					$STD ldconfig
 | 
				
			||||||
RELEASE_CLIENT=$(curl -fsSL https://api.github.com/repos/apache/guacamole-client/tags | jq -r '.[0].name')
 | 
					RELEASE_CLIENT=$(curl -fsSL https://api.github.com/repos/apache/guacamole-client/tags | jq -r '.[].name' | grep -v -- '-RC' | head -n 1)
 | 
				
			||||||
curl -fsSL "https://downloads.apache.org/guacamole/${RELEASE_CLIENT}/binary/guacamole-${RELEASE_CLIENT}.war" -o "/opt/apache-guacamole/tomcat9/webapps/guacamole.war"
 | 
					curl -fsSL "https://downloads.apache.org/guacamole/${RELEASE_CLIENT}/binary/guacamole-${RELEASE_CLIENT}.war" -o "/opt/apache-guacamole/tomcat9/webapps/guacamole.war"
 | 
				
			||||||
cd /root
 | 
					cd /root
 | 
				
			||||||
curl -fsSL "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.26.tar.gz" -o "/root/mysql-connector-java-8.0.26.tar.gz"
 | 
					curl -fsSL "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.26.tar.gz" -o "/root/mysql-connector-java-8.0.26.tar.gz"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,6 @@ update_os
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Dependencies (Patience)"
 | 
					msg_info "Installing Dependencies (Patience)"
 | 
				
			||||||
$STD apt-get install -y \
 | 
					$STD apt-get install -y \
 | 
				
			||||||
  gpg \
 | 
					 | 
				
			||||||
  pkg-config \
 | 
					  pkg-config \
 | 
				
			||||||
  libffi-dev \
 | 
					  libffi-dev \
 | 
				
			||||||
  build-essential \
 | 
					  build-essential \
 | 
				
			||||||
@@ -33,9 +32,15 @@ $STD apt-get install -y \
 | 
				
			|||||||
  libxmlsec1-openssl \
 | 
					  libxmlsec1-openssl \
 | 
				
			||||||
  libmaxminddb0 \
 | 
					  libmaxminddb0 \
 | 
				
			||||||
  python3-pip \
 | 
					  python3-pip \
 | 
				
			||||||
 | 
					  redis-server \
 | 
				
			||||||
  git
 | 
					  git
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setup_uv
 | 
				
			||||||
 | 
					PG_VERSION="16" install_postgresql
 | 
				
			||||||
 | 
					NODE_VERSION="22" install_node_and_modules
 | 
				
			||||||
 | 
					install_go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing yq"
 | 
					msg_info "Installing yq"
 | 
				
			||||||
cd /tmp
 | 
					cd /tmp
 | 
				
			||||||
YQ_LATEST="$(curl -fsSL https://api.github.com/repos/mikefarah/yq/releases/latest | grep -Po '"tag_name": "\K.*?(?=")')"
 | 
					YQ_LATEST="$(curl -fsSL https://api.github.com/repos/mikefarah/yq/releases/latest | grep -Po '"tag_name": "\K.*?(?=")')"
 | 
				
			||||||
@@ -56,46 +61,8 @@ cat <<EOF >/etc/GeoIP.conf
 | 
				
			|||||||
EOF
 | 
					EOF
 | 
				
			||||||
msg_ok "Installed GeoIP"
 | 
					msg_ok "Installed GeoIP"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setting up Python 3"
 | 
					 | 
				
			||||||
cd /tmp
 | 
					 | 
				
			||||||
curl -fsSL "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz" -o "Python.tgz"
 | 
					 | 
				
			||||||
tar -zxf Python.tgz
 | 
					 | 
				
			||||||
cd Python-3.12.1
 | 
					 | 
				
			||||||
$STD ./configure --enable-optimizations
 | 
					 | 
				
			||||||
$STD make altinstall
 | 
					 | 
				
			||||||
cd ~
 | 
					 | 
				
			||||||
$STD update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 1
 | 
					 | 
				
			||||||
msg_ok "Setup Python 3"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Setting up Node.js Repository"
 | 
					 | 
				
			||||||
mkdir -p /etc/apt/keyrings
 | 
					 | 
				
			||||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
					 | 
				
			||||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
					 | 
				
			||||||
msg_ok "Set up Node.js Repository"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Installing Node.js"
 | 
					 | 
				
			||||||
$STD apt-get update
 | 
					 | 
				
			||||||
$STD apt-get install -y nodejs
 | 
					 | 
				
			||||||
msg_ok "Installed Node.js"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Installing Golang"
 | 
					 | 
				
			||||||
set +o pipefail
 | 
					 | 
				
			||||||
temp_file=$(mktemp)
 | 
					 | 
				
			||||||
golang_tarball=$(curl -fsSL https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
 | 
					 | 
				
			||||||
curl -fsSL "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 "Installed Golang"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Installing Redis"
 | 
					 | 
				
			||||||
$STD apt-get install -y redis-server
 | 
					 | 
				
			||||||
systemctl enable -q --now redis-server
 | 
					 | 
				
			||||||
msg_ok "Installed Redis"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Installing PostgreSQL"
 | 
					msg_info "Installing PostgreSQL"
 | 
				
			||||||
$STD apt-get install -y postgresql postgresql-contrib
 | 
					$STD apt-get install -y postgresql-16 postgresql-contrib-16
 | 
				
			||||||
DB_NAME="authentik"
 | 
					DB_NAME="authentik"
 | 
				
			||||||
DB_USER="authentik"
 | 
					DB_USER="authentik"
 | 
				
			||||||
DB_PASS="$(openssl rand -base64 18 | cut -c1-13)"
 | 
					DB_PASS="$(openssl rand -base64 18 | cut -c1-13)"
 | 
				
			||||||
@@ -111,25 +78,29 @@ RELEASE=$(curl -fsSL https://api.github.com/repos/goauthentik/authentik/releases
 | 
				
			|||||||
mkdir -p /opt/authentik
 | 
					mkdir -p /opt/authentik
 | 
				
			||||||
curl -fsSL "${RELEASE}" -o "authentik.tar.gz"
 | 
					curl -fsSL "${RELEASE}" -o "authentik.tar.gz"
 | 
				
			||||||
tar -xzf authentik.tar.gz -C /opt/authentik --strip-components 1 --overwrite
 | 
					tar -xzf authentik.tar.gz -C /opt/authentik --strip-components 1 --overwrite
 | 
				
			||||||
 | 
					export NODE_OPTIONS="--max-old-space-size=4096"
 | 
				
			||||||
cd /opt/authentik/website
 | 
					cd /opt/authentik/website
 | 
				
			||||||
$STD npm install
 | 
					$STD npm install
 | 
				
			||||||
$STD npm run build-bundled
 | 
					$STD npm run build-bundled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cd /opt/authentik/web
 | 
					cd /opt/authentik/web
 | 
				
			||||||
$STD npm install
 | 
					$STD npm install
 | 
				
			||||||
$STD npm run build
 | 
					$STD npm run build
 | 
				
			||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
					
 | 
				
			||||||
cd /opt/authentik
 | 
					cd /opt/authentik
 | 
				
			||||||
$STD go mod download
 | 
					$STD go mod download
 | 
				
			||||||
$STD go build -o /go/authentik ./cmd/server
 | 
					$STD go build -o /go/authentik ./cmd/server
 | 
				
			||||||
$STD go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/
 | 
					$STD go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/
 | 
				
			||||||
cd /opt/authentik
 | 
					$STD uv sync --frozen --no-install-project --no-dev
 | 
				
			||||||
$STD pip3 install --upgrade pip
 | 
					#$STD pip3 install --no-cache-dir --upgrade pip
 | 
				
			||||||
$STD pip3 install poetry poetry-plugin-export
 | 
					#$STD pip3 install --upgrade pip
 | 
				
			||||||
ln -s /usr/local/bin/poetry /usr/bin/poetry
 | 
					#$STD pip3 install poetry poetry-plugin-export
 | 
				
			||||||
$STD poetry install --only=main --no-ansi --no-interaction --no-root
 | 
					
 | 
				
			||||||
$STD poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt
 | 
					#ln -s /usr/local/bin/poetry /usr/bin/poetry
 | 
				
			||||||
$STD pip install --no-cache-dir -r requirements.txt
 | 
					#$STD poetry install --only=main --no-ansi --no-interaction --no-root
 | 
				
			||||||
$STD pip install .
 | 
					#$STD poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt
 | 
				
			||||||
 | 
					#$STD pip install --no-cache-dir -r requirements.txt
 | 
				
			||||||
 | 
					#$STD pip install .
 | 
				
			||||||
mkdir -p /etc/authentik
 | 
					mkdir -p /etc/authentik
 | 
				
			||||||
mv /opt/authentik/authentik/lib/default.yml /etc/authentik/config.yml
 | 
					mv /opt/authentik/authentik/lib/default.yml /etc/authentik/config.yml
 | 
				
			||||||
$STD yq -i ".secret_key = \"$(openssl rand -hex 32)\"" /etc/authentik/config.yml
 | 
					$STD yq -i ".secret_key = \"$(openssl rand -hex 32)\"" /etc/authentik/config.yml
 | 
				
			||||||
@@ -137,23 +108,30 @@ $STD yq -i ".postgresql.password = \"${DB_PASS}\"" /etc/authentik/config.yml
 | 
				
			|||||||
$STD yq -i ".geoip = \"/opt/authentik/tests/GeoLite2-City-Test.mmdb\"" /etc/authentik/config.yml
 | 
					$STD yq -i ".geoip = \"/opt/authentik/tests/GeoLite2-City-Test.mmdb\"" /etc/authentik/config.yml
 | 
				
			||||||
cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints
 | 
					cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints
 | 
				
			||||||
$STD yq -i ".blueprints_dir = \"/opt/authentik/blueprints\"" /etc/authentik/config.yml
 | 
					$STD yq -i ".blueprints_dir = \"/opt/authentik/blueprints\"" /etc/authentik/config.yml
 | 
				
			||||||
ln -s /usr/bin/python3 /usr/bin/python
 | 
					#ln -s /usr/bin/python3 /usr/bin/python
 | 
				
			||||||
ln -s /usr/local/bin/gunicorn /usr/bin/gunicorn
 | 
					#ln -s /usr/local/bin/gunicorn /usr/bin/gunicorn
 | 
				
			||||||
ln -s /usr/local/bin/celery /usr/bin/celery
 | 
					#ln -s /usr/local/bin/celery /usr/bin/celery
 | 
				
			||||||
$STD bash /opt/authentik/lifecycle/ak migrate
 | 
					#$STD bash /opt/authentik/lifecycle/ak migrate
 | 
				
			||||||
cd ~
 | 
					cd /opt/authentik
 | 
				
			||||||
 | 
					uv run python -m lifecycle.migrate
 | 
				
			||||||
 | 
					ln -s /opt/authentik/.venv/bin/gunicorn /usr/local/bin/gunicorn
 | 
				
			||||||
 | 
					ln -s /opt/authentik/.venv/bin/celery /usr/local/bin/celery
 | 
				
			||||||
 | 
					echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
				
			||||||
msg_ok "Installed authentik"
 | 
					msg_ok "Installed authentik"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Services"
 | 
					msg_info "Creating Services"
 | 
				
			||||||
cat <<EOF >/etc/systemd/system/authentik-server.service
 | 
					cat <<EOF >/etc/systemd/system/authentik-server.service
 | 
				
			||||||
[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description = authentik Server
 | 
					Description=authentik Go Server (API Gateway)
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					Wants=redis.service postgresql.service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
ExecStart=/opt/authentik/authentik-server
 | 
					 | 
				
			||||||
WorkingDirectory=/opt/authentik/
 | 
					WorkingDirectory=/opt/authentik/
 | 
				
			||||||
 | 
					ExecStart=/opt/authentik/authentik-server
 | 
				
			||||||
Restart=always
 | 
					Restart=always
 | 
				
			||||||
RestartSec=5
 | 
					RestartSec=5
 | 
				
			||||||
 | 
					Environment=DJANGO_SETTINGS_MODULE=authentik.root.settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
@@ -161,21 +139,49 @@ EOF
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
cat <<EOF >/etc/systemd/system/authentik-worker.service
 | 
					cat <<EOF >/etc/systemd/system/authentik-worker.service
 | 
				
			||||||
[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description = authentik Worker
 | 
					Description=authentik Celery Worker
 | 
				
			||||||
 | 
					After=network.target redis.service postgresql.service
 | 
				
			||||||
 | 
					Requires=redis.service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
Environment=DJANGO_SETTINGS_MODULE="authentik.root.settings"
 | 
					Type=simple
 | 
				
			||||||
ExecStart=celery -A authentik.root.celery worker -Ofair --max-tasks-per-child=1 --autoscale 3,1 -E -B -s /tmp/celerybeat-schedule -Q authentik,authentik_scheduled,authentik_events
 | 
					WorkingDirectory=/opt/authentik
 | 
				
			||||||
WorkingDirectory=/opt/authentik/authentik
 | 
					ExecStart=/opt/authentik/.venv/bin/celery \
 | 
				
			||||||
 | 
					  -A authentik.root.celery worker \
 | 
				
			||||||
 | 
					  -Ofair \
 | 
				
			||||||
 | 
					  --max-tasks-per-child=1 \
 | 
				
			||||||
 | 
					  --autoscale 3,1 \
 | 
				
			||||||
 | 
					  -Q authentik,authentik_scheduled,authentik_events \
 | 
				
			||||||
 | 
					  -E
 | 
				
			||||||
Restart=always
 | 
					Restart=always
 | 
				
			||||||
RestartSec=5
 | 
					RestartSec=5
 | 
				
			||||||
 | 
					Environment=DJANGO_SETTINGS_MODULE=authentik.root.settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
systemctl enable -q --now authentik-server
 | 
					
 | 
				
			||||||
sleep 2
 | 
					cat <<EOF >/etc/systemd/system/authentik-celery-beat.service
 | 
				
			||||||
systemctl enable -q --now authentik-worker
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=authentik Celery Beat Scheduler
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					Type=simple
 | 
				
			||||||
 | 
					WorkingDirectory=/opt/authentik
 | 
				
			||||||
 | 
					ExecStart=/opt/authentik/.venv/bin/celery \
 | 
				
			||||||
 | 
					  -A authentik.root.celery beat \
 | 
				
			||||||
 | 
					  -s /tmp/celerybeat-schedule
 | 
				
			||||||
 | 
					Restart=always
 | 
				
			||||||
 | 
					RestartSec=5
 | 
				
			||||||
 | 
					#User=authentik
 | 
				
			||||||
 | 
					Environment=DJANGO_SETTINGS_MODULE=authentik.root.settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					systemctl enable -q --now authentik-server authentik-worker authentik-celery-beat
 | 
				
			||||||
msg_ok "Created Services"
 | 
					msg_ok "Created Services"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										53
									
								
								install/fumadocs-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								install/fumadocs-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: MickLesk (CanbiZ)
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
 | 
					$STD apt-get install -y \
 | 
				
			||||||
 | 
					  ca-certificates
 | 
				
			||||||
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NODE_VERSION="22" NODE_MODULE="pnpm@latest" install_node_and_modules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Installing Fumadocs"
 | 
				
			||||||
 | 
					mkdir -p /opt/fumadocs
 | 
				
			||||||
 | 
					cd /opt/fumadocs
 | 
				
			||||||
 | 
					pnpm create fumadocs-app
 | 
				
			||||||
 | 
					PROJECT_NAME=$(find . -maxdepth 1 -type d ! -name '.' ! -name '..' | sed 's|^\./||')
 | 
				
			||||||
 | 
					echo "$PROJECT_NAME" >/opt/fumadocs/.projectname
 | 
				
			||||||
 | 
					msg_ok "Installed Fumadocs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Creating Service"
 | 
				
			||||||
 | 
					cat <<EOF >/etc/systemd/system/fumadocs_$PROJECT_NAME.service
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=Fumadocs Documentation Server
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					WorkingDirectory=/opt/fumadocs/$PROJECT_NAME
 | 
				
			||||||
 | 
					ExecStart=/usr/bin/pnpm run dev
 | 
				
			||||||
 | 
					Restart=always
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					systemctl enable -q --now fumadocs_$PROJECT_NAME
 | 
				
			||||||
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
@@ -46,29 +46,33 @@ $STD apt-get install -y \
 | 
				
			|||||||
  pkg-config
 | 
					  pkg-config
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setup_uv
 | 
				
			||||||
msg_info "Setup Python3"
 | 
					msg_info "Setup Python3"
 | 
				
			||||||
$STD apt-get update
 | 
					 | 
				
			||||||
$STD rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
 | 
					 | 
				
			||||||
$STD apt-get remove --purge -y python3.12 python3.12-dev python3.12-venv
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$STD apt-get install -y \
 | 
					$STD apt-get install -y \
 | 
				
			||||||
  python3.13 \
 | 
					  python3.13 \
 | 
				
			||||||
  python3-pip \
 | 
					 | 
				
			||||||
  python3.13-dev \
 | 
					  python3.13-dev \
 | 
				
			||||||
  python3.13-venv
 | 
					  python3.13-venv
 | 
				
			||||||
 | 
					 | 
				
			||||||
ln -sf /usr/bin/python3.13 /usr/bin/python3
 | 
					 | 
				
			||||||
msg_ok "Setup Python3"
 | 
					msg_ok "Setup Python3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Preparing Python 3.13 for uv"
 | 
				
			||||||
 | 
					$STD uv python install 3.13
 | 
				
			||||||
 | 
					UV_PYTHON=$(uv python list | awk '/3\.13\.[0-9]+.*\/root\/.local/ {print $2; exit}')
 | 
				
			||||||
 | 
					if [[ -z "$UV_PYTHON" ]]; then
 | 
				
			||||||
 | 
					  msg_error "No local Python 3.13 found via uv"
 | 
				
			||||||
 | 
					  exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					msg_ok "Prepared Python 3.13"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setting up Home Assistant-Core environment"
 | 
					msg_info "Setting up Home Assistant-Core environment"
 | 
				
			||||||
mkdir /srv/homeassistant
 | 
					rm -rf /srv/homeassistant
 | 
				
			||||||
 | 
					mkdir -p /srv/homeassistant
 | 
				
			||||||
cd /srv/homeassistant
 | 
					cd /srv/homeassistant
 | 
				
			||||||
python3 -m venv .
 | 
					$STD uv venv .venv --python "$UV_PYTHON"
 | 
				
			||||||
source bin/activate
 | 
					source .venv/bin/activate
 | 
				
			||||||
msg_ok "Created virtual environment"
 | 
					msg_ok "Created virtual environment"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Home Assistant-Core"
 | 
					msg_info "Installing Home Assistant-Core"
 | 
				
			||||||
$STD python3 -m pip install webrtcvad wheel homeassistant mysqlclient psycopg2-binary isal
 | 
					$STD uv pip install homeassistant mysqlclient psycopg2-binary isal webrtcvad wheel
 | 
				
			||||||
mkdir -p /root/.homeassistant
 | 
					mkdir -p /root/.homeassistant
 | 
				
			||||||
msg_ok "Installed Home Assistant-Core"
 | 
					msg_ok "Installed Home Assistant-Core"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -77,16 +81,19 @@ cat <<EOF >/etc/systemd/system/homeassistant.service
 | 
				
			|||||||
[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description=Home Assistant
 | 
					Description=Home Assistant
 | 
				
			||||||
After=network-online.target
 | 
					After=network-online.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
Type=simple
 | 
					Type=simple
 | 
				
			||||||
WorkingDirectory=/root/.homeassistant
 | 
					WorkingDirectory=/root/.homeassistant
 | 
				
			||||||
Environment="PATH=/srv/homeassistant/bin:/usr/local/bin:/usr/bin:/usr/local/bin/uv"
 | 
					Environment="PATH=/srv/homeassistant/.venv/bin:/usr/local/bin:/usr/bin"
 | 
				
			||||||
ExecStart=/srv/homeassistant/bin/python3 -m homeassistant --config /root/.homeassistant
 | 
					ExecStart=/srv/homeassistant/.venv/bin/python3 -m homeassistant --config /root/.homeassistant
 | 
				
			||||||
Restart=always
 | 
					Restart=always
 | 
				
			||||||
RestartForceExitStatus=100
 | 
					RestartForceExitStatus=100
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
systemctl enable -q --now homeassistant
 | 
					systemctl enable -q --now homeassistant
 | 
				
			||||||
msg_ok "Created Service"
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,23 +18,15 @@ msg_info "Installing Dependencies"
 | 
				
			|||||||
$STD apt-get install -y \
 | 
					$STD apt-get install -y \
 | 
				
			||||||
  make \
 | 
					  make \
 | 
				
			||||||
  git \
 | 
					  git \
 | 
				
			||||||
  postgresql \
 | 
					 | 
				
			||||||
  build-essential \
 | 
					  build-essential \
 | 
				
			||||||
  cargo \
 | 
					  cargo
 | 
				
			||||||
  gnupg
 | 
					 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Setting up Node.js Repository"
 | 
					NODE_VERSION="22"
 | 
				
			||||||
mkdir -p /etc/apt/keyrings
 | 
					NODE_MODULE="yarn@latest"
 | 
				
			||||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
					install_node_and_modules
 | 
				
			||||||
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
 | 
					PG_VERSION="15"
 | 
				
			||||||
msg_ok "Set up Node.js Repository"
 | 
					install_postgresql
 | 
				
			||||||
 | 
					 | 
				
			||||||
msg_info "Installing Node.js/Yarn"
 | 
					 | 
				
			||||||
$STD apt-get update
 | 
					 | 
				
			||||||
$STD apt-get install -y nodejs
 | 
					 | 
				
			||||||
$STD npm install -g yarn
 | 
					 | 
				
			||||||
msg_ok "Installed Node.js/Yarn"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Rust"
 | 
					msg_info "Installing Rust"
 | 
				
			||||||
curl -fsSL https://sh.rustup.rs -o rustup-init.sh
 | 
					curl -fsSL https://sh.rustup.rs -o rustup-init.sh
 | 
				
			||||||
@@ -92,7 +84,7 @@ fi
 | 
				
			|||||||
msg_info "Installing Linkwarden (Patience)"
 | 
					msg_info "Installing Linkwarden (Patience)"
 | 
				
			||||||
cd /opt
 | 
					cd /opt
 | 
				
			||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					RELEASE=$(curl -fsSL https://api.github.com/repos/linkwarden/linkwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
curl -fsSL "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip" -o $(basename "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip")
 | 
					curl -fsSL "https://github.com/linkwarden/linkwarden/archive/refs/tags/${RELEASE}.zip" -o ${RELEASE}.zip
 | 
				
			||||||
unzip -q ${RELEASE}.zip
 | 
					unzip -q ${RELEASE}.zip
 | 
				
			||||||
mv linkwarden-${RELEASE:1} /opt/linkwarden
 | 
					mv linkwarden-${RELEASE:1} /opt/linkwarden
 | 
				
			||||||
cd /opt/linkwarden
 | 
					cd /opt/linkwarden
 | 
				
			||||||
@@ -106,8 +98,9 @@ NEXTAUTH_SECRET=${SECRET_KEY}
 | 
				
			|||||||
NEXTAUTH_URL=http://${IP}:3000
 | 
					NEXTAUTH_URL=http://${IP}:3000
 | 
				
			||||||
DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}
 | 
					DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@localhost:5432/${DB_NAME}
 | 
				
			||||||
" >$env_path
 | 
					" >$env_path
 | 
				
			||||||
$STD yarn build
 | 
					$STD yarn prisma:generate
 | 
				
			||||||
$STD yarn prisma migrate deploy
 | 
					$STD yarn web:build
 | 
				
			||||||
 | 
					$STD yarn prisma:deploy
 | 
				
			||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
					echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
				
			||||||
msg_ok "Installed Linkwarden"
 | 
					msg_ok "Installed Linkwarden"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -121,7 +114,7 @@ After=network.target
 | 
				
			|||||||
Type=exec
 | 
					Type=exec
 | 
				
			||||||
Environment=PATH=$PATH
 | 
					Environment=PATH=$PATH
 | 
				
			||||||
WorkingDirectory=/opt/linkwarden
 | 
					WorkingDirectory=/opt/linkwarden
 | 
				
			||||||
ExecStart=/usr/bin/yarn start
 | 
					ExecStart=/usr/bin/yarn concurrently:start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Install]
 | 
					[Install]
 | 
				
			||||||
WantedBy=multi-user.target
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,7 +54,7 @@ cd /opt
 | 
				
			|||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/netbox-community/netbox/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
					RELEASE=$(curl -fsSL https://api.github.com/repos/netbox-community/netbox/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
curl -fsSL "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip")
 | 
					curl -fsSL "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/netbox-community/netbox/archive/refs/tags/v${RELEASE}.zip")
 | 
				
			||||||
unzip -q "v${RELEASE}.zip"
 | 
					unzip -q "v${RELEASE}.zip"
 | 
				
			||||||
mv /opt/netbox-${RELEASE}/ /opt/netbox
 | 
					mv /opt/netbox-"${RELEASE}"/ /opt/netbox
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$STD adduser --system --group netbox
 | 
					$STD adduser --system --group netbox
 | 
				
			||||||
chown --recursive netbox /opt/netbox/netbox/media/
 | 
					chown --recursive netbox /opt/netbox/netbox/media/
 | 
				
			||||||
@@ -68,8 +68,8 @@ ESCAPED_SECRET_KEY=$(printf '%s\n' "$SECRET_KEY" | sed 's/[&/\]/\\&/g')
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
sed -i 's/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = ["*"]/' /opt/netbox/netbox/netbox/configuration.py
 | 
					sed -i 's/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = ["*"]/' /opt/netbox/netbox/netbox/configuration.py
 | 
				
			||||||
sed -i "s|SECRET_KEY = ''|SECRET_KEY = '${ESCAPED_SECRET_KEY}'|" /opt/netbox/netbox/netbox/configuration.py
 | 
					sed -i "s|SECRET_KEY = ''|SECRET_KEY = '${ESCAPED_SECRET_KEY}'|" /opt/netbox/netbox/netbox/configuration.py
 | 
				
			||||||
sed -i "/DATABASE = {/,/}/s/'USER': '[^']*'/'USER': '$DB_USER'/" /opt/netbox/netbox/netbox/configuration.py
 | 
					sed -i "/DATABASES = {/,/}/s/'USER': '[^']*'/'USER': '$DB_USER'/" /opt/netbox/netbox/netbox/configuration.py
 | 
				
			||||||
sed -i "/DATABASE = {/,/}/s/'PASSWORD': '[^']*'/'PASSWORD': '$DB_PASS'/" /opt/netbox/netbox/netbox/configuration.py
 | 
					sed -i "/DATABASES = {/,/}/s/'PASSWORD': '[^']*'/'PASSWORD': '$DB_PASS'/" /opt/netbox/netbox/netbox/configuration.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$STD /opt/netbox/upgrade.sh
 | 
					$STD /opt/netbox/upgrade.sh
 | 
				
			||||||
ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
 | 
					ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
 | 
				
			||||||
@@ -85,7 +85,7 @@ mv /opt/netbox/contrib/*.service /etc/systemd/system/
 | 
				
			|||||||
systemctl daemon-reload
 | 
					systemctl daemon-reload
 | 
				
			||||||
systemctl enable -q --now netbox netbox-rq
 | 
					systemctl enable -q --now netbox netbox-rq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
 | 
					echo "${RELEASE}" >/opt/"${APPLICATION}"_version.txt
 | 
				
			||||||
echo -e "Netbox Secret: \e[32m$SECRET_KEY\e[0m" >>~/netbox.creds
 | 
					echo -e "Netbox Secret: \e[32m$SECRET_KEY\e[0m" >>~/netbox.creds
 | 
				
			||||||
msg_ok "Installed NetBox"
 | 
					msg_ok "Installed NetBox"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,7 +40,7 @@ sudo -u searxng python3 -m venv /usr/local/searxng/searx-pyenv
 | 
				
			|||||||
source /usr/local/searxng/searx-pyenv/bin/activate
 | 
					source /usr/local/searxng/searx-pyenv/bin/activate
 | 
				
			||||||
$STD pip install --upgrade pip setuptools wheel
 | 
					$STD pip install --upgrade pip setuptools wheel
 | 
				
			||||||
$STD pip install pyyaml
 | 
					$STD pip install pyyaml
 | 
				
			||||||
$STD pip install -e /usr/local/searxng/searxng-src
 | 
					$STD pip install --use-pep517 --no-build-isolation -e /usr/local/searxng/searxng-src
 | 
				
			||||||
SECRET_KEY=$(openssl rand -hex 32)
 | 
					SECRET_KEY=$(openssl rand -hex 32)
 | 
				
			||||||
cat <<EOF >/etc/searxng/settings.yml
 | 
					cat <<EOF >/etc/searxng/settings.yml
 | 
				
			||||||
# SearXNG settings
 | 
					# SearXNG settings
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										66
									
								
								install/streamlink-webui-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								install/streamlink-webui-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
 | 
					# Author: CrazyWolf13
 | 
				
			||||||
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					# Source: https://github.com/CrazyWolf13/streamlink-webui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Import Functions und Setup
 | 
				
			||||||
 | 
					source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
				
			||||||
 | 
					color
 | 
				
			||||||
 | 
					verb_ip6
 | 
				
			||||||
 | 
					catch_errors
 | 
				
			||||||
 | 
					setting_up_container
 | 
				
			||||||
 | 
					network_check
 | 
				
			||||||
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NODE_VERSION="22"
 | 
				
			||||||
 | 
					NODE_MODULE="npm@latest,yarn@latest"
 | 
				
			||||||
 | 
					install_node_and_modules
 | 
				
			||||||
 | 
					setup_uv
 | 
				
			||||||
 | 
					fetch_and_deploy_gh_release "CrazyWolf13/streamlink-webui"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Setup ${APPLICATION}"
 | 
				
			||||||
 | 
					mkdir -p "/opt/${APPLICATION}-download"
 | 
				
			||||||
 | 
					$STD uv venv /opt/"${APPLICATION}"/backend/src/.venv
 | 
				
			||||||
 | 
					source /opt/"${APPLICATION}"/backend/src/.venv/bin/activate
 | 
				
			||||||
 | 
					$STD uv pip install -r /opt/streamlink-webui/backend/src/requirements.txt --python=/opt/"${APPLICATION}"/backend/src/.venv
 | 
				
			||||||
 | 
					cd /opt/"${APPLICATION}"/frontend/src
 | 
				
			||||||
 | 
					$STD yarn install
 | 
				
			||||||
 | 
					$STD yarn build
 | 
				
			||||||
 | 
					chmod +x /opt/"${APPLICATION}"/start.sh
 | 
				
			||||||
 | 
					msg_ok "Setup ${APPLICATION}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Creating Service"
 | 
				
			||||||
 | 
					cat <<'EOF' >/opt/"${APPLICATION}".env
 | 
				
			||||||
 | 
					CLIENT_ID='your_client_id'
 | 
				
			||||||
 | 
					CLIENT_SECRET='your_client_secret'
 | 
				
			||||||
 | 
					DOWNLOAD_PATH='/opt/streamlink-webui-download'
 | 
				
			||||||
 | 
					# BASE_URL='https://sub.domain.com' \
 | 
				
			||||||
 | 
					# REVERSE_PROXY=True \
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat <<EOF >/etc/systemd/system/"${APPLICATION}".service
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=${APPLICATION} Service
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					EnvironmentFile=/opt/${APPLICATION}.env
 | 
				
			||||||
 | 
					WorkingDirectory=/opt/${APPLICATION}/backend/src
 | 
				
			||||||
 | 
					ExecStart=/bin/bash -c 'source /opt/${APPLICATION}/backend/src/.venv/bin/activate && exec /opt/${APPLICATION}/start.sh'
 | 
				
			||||||
 | 
					Restart=always
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					systemctl enable -q --now "${APPLICATION}"
 | 
				
			||||||
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motd_ssh
 | 
				
			||||||
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
# Author: tremor021
 | 
					# Author: Slaviša Arežina (tremor021)
 | 
				
			||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
# Source: https://github.com/Suwayomi/Suwayomi-Server
 | 
					# Source: https://github.com/Suwayomi/Suwayomi-Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -14,18 +14,19 @@ network_check
 | 
				
			|||||||
update_os
 | 
					update_os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Dependencies"
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
$STD apt-get install -y \
 | 
					$STD apt-get install -y libc++-dev
 | 
				
			||||||
  openjdk-17-jre \
 | 
					 | 
				
			||||||
  libc++-dev
 | 
					 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					JAVA_VERSION=21 install_java
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Settting up Suwayomi-Server"
 | 
					msg_info "Settting up Suwayomi-Server"
 | 
				
			||||||
URL=$(curl -fsSL 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)
 | 
					temp_file=$(mktemp)
 | 
				
			||||||
RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
curl -fsSL "$URL" -o $(basename "$URL")
 | 
					curl -fsSL "https://github.com/Suwayomi/Suwayomi-Server/releases/download/${RELEASE}/Suwayomi-Server-${RELEASE}-debian-all.deb" -o "$temp_file"
 | 
				
			||||||
$STD dpkg -i *.deb
 | 
					$STD dpkg -i "$temp_file"
 | 
				
			||||||
echo ${RELEASE} >/opt/suwayomi-server_version.txt
 | 
					echo "${RELEASE}" >/opt/suwayomi-server_version.txt
 | 
				
			||||||
msg_ok "Done setting up Suwayomi-Server"
 | 
					msg_ok "Done setting up Suwayomi-Server"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Service"
 | 
					msg_info "Creating Service"
 | 
				
			||||||
cat <<EOF >/etc/systemd/system/suwayomi-server.service
 | 
					cat <<EOF >/etc/systemd/system/suwayomi-server.service
 | 
				
			||||||
[Unit]
 | 
					[Unit]
 | 
				
			||||||
@@ -41,10 +42,12 @@ WantedBy=multi-user.target
 | 
				
			|||||||
EOF
 | 
					EOF
 | 
				
			||||||
systemctl enable -q --now suwayomi-server
 | 
					systemctl enable -q --now suwayomi-server
 | 
				
			||||||
msg_ok "Created Service"
 | 
					msg_ok "Created Service"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
motd_ssh
 | 
					motd_ssh
 | 
				
			||||||
customize
 | 
					customize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Cleaning up"
 | 
					msg_info "Cleaning up"
 | 
				
			||||||
rm -f *.deb
 | 
					rm -f "$temp_file"
 | 
				
			||||||
$STD apt-get -y autoremove
 | 
					$STD apt-get -y autoremove
 | 
				
			||||||
$STD apt-get -y autoclean
 | 
					$STD apt-get -y autoclean
 | 
				
			||||||
msg_ok "Cleaned"
 | 
					msg_ok "Cleaned"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,28 +15,23 @@ update_os
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Dependencies"
 | 
					msg_info "Installing Dependencies"
 | 
				
			||||||
$STD apt-get update
 | 
					$STD apt-get update
 | 
				
			||||||
$STD apt-get -qqy install \
 | 
					$STD apt-get install -y git \
 | 
				
			||||||
  git \
 | 
					 | 
				
			||||||
  build-essential \
 | 
					  build-essential \
 | 
				
			||||||
  pkgconf \
 | 
					  pkgconf \
 | 
				
			||||||
  libssl-dev \
 | 
					  libssl-dev \
 | 
				
			||||||
  libmariadb-dev-compat \
 | 
					  libmariadb-dev-compat \
 | 
				
			||||||
  libpq-dev \
 | 
					  libpq-dev \
 | 
				
			||||||
  argon2
 | 
					  argon2 \
 | 
				
			||||||
 | 
					  ssl-cert
 | 
				
			||||||
msg_ok "Installed Dependencies"
 | 
					msg_ok "Installed Dependencies"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WEBVAULT=$(curl -fsSL https://api.github.com/repos/dani-garcia/bw_web_builds/releases/latest |
 | 
					WEBVAULT=$(curl -fsSL https://api.github.com/repos/dani-garcia/bw_web_builds/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
  grep "tag_name" |
 | 
					VAULT=$(curl -fsSL https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
  awk '{print substr($2, 2, length($2)-3) }')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
VAULT=$(curl -fsSL https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest |
 | 
					 | 
				
			||||||
  grep "tag_name" |
 | 
					 | 
				
			||||||
  awk '{print substr($2, 2, length($2)-3) }')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Rust"
 | 
					msg_info "Installing Rust"
 | 
				
			||||||
curl -fsSL https://sh.rustup.rs -o rustup-init.sh
 | 
					curl -fsSL https://sh.rustup.rs -o rustup-init.sh
 | 
				
			||||||
$STD bash rustup-init.sh -y --profile minimal
 | 
					$STD bash rustup-init.sh -y --profile minimal
 | 
				
			||||||
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc
 | 
					echo 'export PATH="$HOME/.cargo/bin:$PATH"' >>~/.bashrc
 | 
				
			||||||
export PATH="$HOME/.cargo/bin:$PATH"
 | 
					export PATH="$HOME/.cargo/bin:$PATH"
 | 
				
			||||||
rm rustup-init.sh
 | 
					rm rustup-init.sh
 | 
				
			||||||
msg_ok "Installed Rust"
 | 
					msg_ok "Installed Rust"
 | 
				
			||||||
@@ -54,19 +49,23 @@ mkdir -p /opt/vaultwarden/data
 | 
				
			|||||||
cp target/release/vaultwarden /opt/vaultwarden/bin/
 | 
					cp target/release/vaultwarden /opt/vaultwarden/bin/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Downloading Web-Vault ${WEBVAULT}"
 | 
					msg_info "Downloading Web-Vault ${WEBVAULT}"
 | 
				
			||||||
$STD curl -fsSLO https://github.com/dani-garcia/bw_web_builds/releases/download/$WEBVAULT/bw_web_$WEBVAULT.tar.gz
 | 
					$STD curl -fsSLO https://github.com/dani-garcia/bw_web_builds/releases/download/"$WEBVAULT"/bw_web_"$WEBVAULT".tar.gz
 | 
				
			||||||
$STD tar -xzf bw_web_$WEBVAULT.tar.gz -C /opt/vaultwarden/
 | 
					$STD tar -xzf bw_web_"$WEBVAULT".tar.gz -C /opt/vaultwarden/
 | 
				
			||||||
msg_ok "Downloaded Web-Vault ${WEBVAULT}"
 | 
					msg_ok "Downloaded Web-Vault ${WEBVAULT}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cat <<EOF >/opt/vaultwarden/.env
 | 
					cat <<EOF >/opt/vaultwarden/.env
 | 
				
			||||||
ADMIN_TOKEN=''
 | 
					ADMIN_TOKEN=''
 | 
				
			||||||
ROCKET_ADDRESS=0.0.0.0
 | 
					ROCKET_ADDRESS=0.0.0.0
 | 
				
			||||||
 | 
					ROCKET_TLS='{certs="/opt/vaultwarden/ssl-cert-snakeoil.pem",key="/opt/vaultwarden/ssl-cert-snakeoil.key"}'
 | 
				
			||||||
DATA_FOLDER=/opt/vaultwarden/data
 | 
					DATA_FOLDER=/opt/vaultwarden/data
 | 
				
			||||||
DATABASE_MAX_CONNS=10
 | 
					DATABASE_MAX_CONNS=10
 | 
				
			||||||
WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault
 | 
					WEB_VAULT_FOLDER=/opt/vaultwarden/web-vault
 | 
				
			||||||
WEB_VAULT_ENABLED=true
 | 
					WEB_VAULT_ENABLED=true
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mv /etc/ssl/certs/ssl-cert-snakeoil.pem /opt/vaultwarden/
 | 
				
			||||||
 | 
					mv /etc/ssl/private/ssl-cert-snakeoil.key /opt/vaultwarden/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Creating Service"
 | 
					msg_info "Creating Service"
 | 
				
			||||||
chown -R vaultwarden:vaultwarden /opt/vaultwarden/
 | 
					chown -R vaultwarden:vaultwarden /opt/vaultwarden/
 | 
				
			||||||
chown root:root /opt/vaultwarden/bin/vaultwarden
 | 
					chown root:root /opt/vaultwarden/bin/vaultwarden
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -190,10 +190,29 @@ validate_tz() {
 | 
				
			|||||||
customize() {
 | 
					customize() {
 | 
				
			||||||
  if [[ "$PASSWORD" == "" ]]; then
 | 
					  if [[ "$PASSWORD" == "" ]]; then
 | 
				
			||||||
    msg_info "Customizing Container"
 | 
					    msg_info "Customizing Container"
 | 
				
			||||||
    bash -c "passwd -d root" >/dev/null 2>&1
 | 
					    passwd -d root >/dev/null 2>&1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Ensure agetty is available
 | 
				
			||||||
 | 
					    apk add --no-cache --force-broken-world util-linux >/dev/null 2>&1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Create persistent autologin boot script
 | 
				
			||||||
 | 
					    mkdir -p /etc/local.d
 | 
				
			||||||
 | 
					    cat <<'EOF' >/etc/local.d/autologin.start
 | 
				
			||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					sed -i 's|^tty1::respawn:.*|tty1::respawn:/sbin/agetty --autologin root --noclear tty1 38400 linux|' /etc/inittab
 | 
				
			||||||
 | 
					kill -HUP 1
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					    touch /root/.hushlogin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    chmod +x /etc/local.d/autologin.start
 | 
				
			||||||
 | 
					    rc-update add local >/dev/null 2>&1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Apply autologin immediately for current session
 | 
				
			||||||
 | 
					    /etc/local.d/autologin.start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    msg_ok "Customized Container"
 | 
					    msg_ok "Customized Container"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  echo "bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)\"" >/usr/bin/update
 | 
					  echo "bash -c \"\$(curl -fsSL https://github.com/community-scripts/ProxmoxVE/raw/main/ct/${app}.sh)\"" >/usr/bin/update
 | 
				
			||||||
  chmod +x /usr/bin/update
 | 
					  chmod +x /usr/bin/update
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -477,7 +477,7 @@ advanced_settings() {
 | 
				
			|||||||
      echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
 | 
					      echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit
 | 
					    exit_script
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if CT_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 "$NSAPP" --title "HOSTNAME" 3>&1 1>&2 2>&3); then
 | 
					  if CT_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 "$NSAPP" --title "HOSTNAME" 3>&1 1>&2 2>&3); then
 | 
				
			||||||
@@ -528,15 +528,17 @@ advanced_settings() {
 | 
				
			|||||||
    exit_script
 | 
					    exit_script
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
 | 
					  BRIDGES=$( ip link show | grep -oP '(?<=: )vmbr\d+' | sort)
 | 
				
			||||||
    if [ -z "$BRG" ]; then
 | 
					  if [[ -z "$BRIDGES" ]]; then
 | 
				
			||||||
    BRG="vmbr0"
 | 
					    BRG="vmbr0"
 | 
				
			||||||
    echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
 | 
					    echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --menu "Select network bridge:" 15 40 6 $(echo "$BRIDGES" | awk '{print $0, "Bridge"}') 3>&1 1>&2 2>&3)
 | 
				
			||||||
 | 
					      if [ -z "$BRG" ]; then
 | 
				
			||||||
 | 
					        exit_script
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
 | 
					        echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    exit_script
 | 
					 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while true; do
 | 
					  while true; do
 | 
				
			||||||
@@ -1441,7 +1443,7 @@ silent() {
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exit_script() {
 | 
					api_exit_script() {
 | 
				
			||||||
  exit_code=$? # Capture the exit status of the last executed command
 | 
					  exit_code=$? # Capture the exit status of the last executed command
 | 
				
			||||||
  #200 exit codes indicate error in create_lxc.sh
 | 
					  #200 exit codes indicate error in create_lxc.sh
 | 
				
			||||||
  #100 exit codes indicate error in install.func
 | 
					  #100 exit codes indicate error in install.func
 | 
				
			||||||
@@ -1465,7 +1467,7 @@ exit_script() {
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
trap 'exit_script' EXIT
 | 
					trap 'api_exit_script' EXIT
 | 
				
			||||||
trap 'post_update_to_api "failed" "$BASH_COMMAND"' ERR
 | 
					trap 'post_update_to_api "failed" "$BASH_COMMAND"' ERR
 | 
				
			||||||
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT
 | 
					trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT
 | 
				
			||||||
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
					trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					#!/bin/bash
 | 
				
			||||||
install_node_and_modules() {
 | 
					install_node_and_modules() {
 | 
				
			||||||
  local NODE_VERSION="${NODE_VERSION:-22}"
 | 
					  local NODE_VERSION="${NODE_VERSION:-22}"
 | 
				
			||||||
  local NODE_MODULE="${NODE_MODULE:-}"
 | 
					  local NODE_MODULE="${NODE_MODULE:-}"
 | 
				
			||||||
@@ -47,7 +48,7 @@ install_node_and_modules() {
 | 
				
			|||||||
    msg_ok "Installed Node.js ${NODE_VERSION}"
 | 
					    msg_ok "Installed Node.js ${NODE_VERSION}"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    export NODE_OPTIONS="--max_old_space_size=4096"
 | 
					  export NODE_OPTIONS="--max-old-space-size=4096"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Install global Node modules
 | 
					  # Install global Node modules
 | 
				
			||||||
  if [[ -n "$NODE_MODULE" ]]; then
 | 
					  if [[ -n "$NODE_MODULE" ]]; then
 | 
				
			||||||
@@ -345,7 +346,7 @@ install_go() {
 | 
				
			|||||||
  esac
 | 
					  esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Determine version
 | 
					  # Determine version
 | 
				
			||||||
    if [[ -z "$GO_VERSION" || "$GO_VERSION" == "latest" ]]; then
 | 
					  if [[ -z "${GO_VERSION:-}" || "${GO_VERSION}" == "latest" ]]; then
 | 
				
			||||||
    GO_VERSION=$(curl -fsSL https://go.dev/VERSION?m=text | head -n1 | sed 's/^go//')
 | 
					    GO_VERSION=$(curl -fsSL https://go.dev/VERSION?m=text | head -n1 | sed 's/^go//')
 | 
				
			||||||
    if [[ -z "$GO_VERSION" ]]; then
 | 
					    if [[ -z "$GO_VERSION" ]]; then
 | 
				
			||||||
      msg_error "Could not determine latest Go version"
 | 
					      msg_error "Could not determine latest Go version"
 | 
				
			||||||
@@ -389,7 +390,7 @@ install_go() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install_java() {
 | 
					install_java() {
 | 
				
			||||||
    local JAVA_VERSION="${JAVA_VERSION:-17}"
 | 
					  local JAVA_VERSION="${JAVA_VERSION:-21}"
 | 
				
			||||||
  local DISTRO_CODENAME
 | 
					  local DISTRO_CODENAME
 | 
				
			||||||
  DISTRO_CODENAME=$(awk -F= '/VERSION_CODENAME/ { print $2 }' /etc/os-release)
 | 
					  DISTRO_CODENAME=$(awk -F= '/VERSION_CODENAME/ { print $2 }' /etc/os-release)
 | 
				
			||||||
  local DESIRED_PACKAGE="temurin-${JAVA_VERSION}-jdk"
 | 
					  local DESIRED_PACKAGE="temurin-${JAVA_VERSION}-jdk"
 | 
				
			||||||
@@ -478,7 +479,7 @@ install_mongodb() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
fetch_and_deploy_gh_release() {
 | 
					fetch_and_deploy_gh_release() {
 | 
				
			||||||
  local repo="$1"
 | 
					  local repo="$1"
 | 
				
			||||||
    local app=$(echo ${APPLICATION,,} | tr -d ' ')
 | 
					  local app=${APP:-$(echo "${APPLICATION,,}" | tr -d ' ')}
 | 
				
			||||||
  local api_url="https://api.github.com/repos/$repo/releases/latest"
 | 
					  local api_url="https://api.github.com/repos/$repo/releases/latest"
 | 
				
			||||||
  local header=()
 | 
					  local header=()
 | 
				
			||||||
  local attempt=0
 | 
					  local attempt=0
 | 
				
			||||||
@@ -658,8 +659,8 @@ setup_local_ip_helper() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  # Install networkd-dispatcher if not present
 | 
					  # Install networkd-dispatcher if not present
 | 
				
			||||||
  if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then
 | 
					  if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then
 | 
				
			||||||
      $STD apt-get update -qq
 | 
					    apt-get update -qq
 | 
				
			||||||
      $STD apt-get install -yq networkd-dispatcher
 | 
					    apt-get install -yq networkd-dispatcher
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Write update_local_ip.sh
 | 
					  # Write update_local_ip.sh
 | 
				
			||||||
@@ -757,6 +758,34 @@ import_local_ip() {
 | 
				
			|||||||
  export LOCAL_IP
 | 
					  export LOCAL_IP
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function download_with_progress() {
 | 
				
			||||||
 | 
					  local url="$1"
 | 
				
			||||||
 | 
					  local output="$2"
 | 
				
			||||||
 | 
					  if [ -n "$SPINNER_PID" ] && ps -p "$SPINNER_PID" >/dev/null; then kill "$SPINNER_PID" >/dev/null; fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ! command -v pv &>/dev/null; then
 | 
				
			||||||
 | 
					    $STD apt-get install -y pv
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					  set -o pipefail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Content-Length aus HTTP-Header holen
 | 
				
			||||||
 | 
					  local content_length
 | 
				
			||||||
 | 
					  content_length=$(curl -fsSLI "$url" | awk '/Content-Length/ {print $2}' | tr -d '\r' || true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ -z "$content_length" ]]; then
 | 
				
			||||||
 | 
					    #msg_warn "Content-Length not available, falling back to plain download"
 | 
				
			||||||
 | 
					    if ! curl -fL# -o "$output" "$url"; then
 | 
				
			||||||
 | 
					      msg_error "Download failed"
 | 
				
			||||||
 | 
					      return 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    if ! curl -fsSL "$url" | pv -s "$content_length" >"$output"; then
 | 
				
			||||||
 | 
					      msg_error "Download failed"
 | 
				
			||||||
 | 
					      return 1
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function setup_uv() {
 | 
					function setup_uv() {
 | 
				
			||||||
  $STD msg_info "Checking uv installation..."
 | 
					  $STD msg_info "Checking uv installation..."
 | 
				
			||||||
  UV_BIN="/usr/local/bin/uv"
 | 
					  UV_BIN="/usr/local/bin/uv"
 | 
				
			||||||
@@ -818,3 +847,57 @@ function ensure_usr_local_bin_persist() {
 | 
				
			|||||||
    chmod +x "$PROFILE_FILE"
 | 
					    chmod +x "$PROFILE_FILE"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function setup_gs() {
 | 
				
			||||||
 | 
					  msg_info "Setup Ghostscript"
 | 
				
			||||||
 | 
					  mkdir -p /tmp
 | 
				
			||||||
 | 
					  TMP_DIR=$(mktemp -d)
 | 
				
			||||||
 | 
					  CURRENT_VERSION=$(gs --version 2>/dev/null || echo "0")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RELEASE_JSON=$(curl -fsSL https://api.github.com/repos/ArtifexSoftware/ghostpdl-downloads/releases/latest)
 | 
				
			||||||
 | 
					  LATEST_VERSION=$(echo "$RELEASE_JSON" | grep '"tag_name":' | head -n1 | cut -d '"' -f4 | sed 's/^gs//')
 | 
				
			||||||
 | 
					  LATEST_VERSION_DOTTED=$(echo "$RELEASE_JSON" | grep '"name":' | head -n1 | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ -z "$LATEST_VERSION" ]]; then
 | 
				
			||||||
 | 
					    msg_error "Could not determine latest Ghostscript version from GitHub."
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if dpkg --compare-versions "$CURRENT_VERSION" ge "$LATEST_VERSION_DOTTED"; then
 | 
				
			||||||
 | 
					    msg_ok "Ghostscript is already at version $CURRENT_VERSION"
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  msg_info "Installing/Updating Ghostscript to $LATEST_VERSION_DOTTED"
 | 
				
			||||||
 | 
					  curl -fsSL "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs${LATEST_VERSION}/ghostscript-${LATEST_VERSION_DOTTED}.tar.gz" -o "$TMP_DIR/ghostscript.tar.gz"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ! tar -xzf "$TMP_DIR/ghostscript.tar.gz" -C "$TMP_DIR"; then
 | 
				
			||||||
 | 
					    msg_error "Failed to extract Ghostscript archive."
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cd "$TMP_DIR/ghostscript-${LATEST_VERSION_DOTTED}" || {
 | 
				
			||||||
 | 
					    msg_error "Failed to enter Ghostscript source directory."
 | 
				
			||||||
 | 
					    rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  $STD apt-get install -y build-essential libpng-dev zlib1g-dev
 | 
				
			||||||
 | 
					  ./configure >/dev/null && make && sudo make install >/dev/null
 | 
				
			||||||
 | 
					  local EXIT_CODE=$?
 | 
				
			||||||
 | 
					  hash -r
 | 
				
			||||||
 | 
					  if [[ ! -x "$(command -v gs)" ]]; then
 | 
				
			||||||
 | 
					    if [[ -x /usr/local/bin/gs ]]; then
 | 
				
			||||||
 | 
					      ln -sf /usr/local/bin/gs /usr/bin/gs
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  rm -rf "$TMP_DIR"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ $EXIT_CODE -eq 0 ]]; then
 | 
				
			||||||
 | 
					    msg_ok "Ghostscript installed/updated to version $LATEST_VERSION_DOTTED"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    msg_error "Ghostscript installation failed"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ CL=$(echo "\033[m")
 | 
				
			|||||||
BFR="\\r\\033[K"
 | 
					BFR="\\r\\033[K"
 | 
				
			||||||
HOLD="-"
 | 
					HOLD="-"
 | 
				
			||||||
CM="${GN}✓${CL}"
 | 
					CM="${GN}✓${CL}"
 | 
				
			||||||
APP="Code Server"
 | 
					APP="Coder Code Server"
 | 
				
			||||||
hostname="$(hostname)"
 | 
					hostname="$(hostname)"
 | 
				
			||||||
set -o errexit
 | 
					set -o errexit
 | 
				
			||||||
set -o errtrace
 | 
					set -o errtrace
 | 
				
			||||||
@@ -42,7 +42,7 @@ function error_exit() {
 | 
				
			|||||||
  local msg="${1:-$reason}"
 | 
					  local msg="${1:-$reason}"
 | 
				
			||||||
  local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE"
 | 
					  local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE"
 | 
				
			||||||
  echo -e "$flag $msg" 1>&2
 | 
					  echo -e "$flag $msg" 1>&2
 | 
				
			||||||
    exit $EXIT
 | 
					  exit "$EXIT"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
clear
 | 
					clear
 | 
				
			||||||
header_info
 | 
					header_info
 | 
				
			||||||
@@ -84,18 +84,18 @@ VERSION=$(curl -fsSL https://api.github.com/repos/coder/code-server/releases/lat
 | 
				
			|||||||
  awk '{print substr($2, 3, length($2)-4) }')
 | 
					  awk '{print substr($2, 3, length($2)-4) }')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_info "Installing Code-Server v${VERSION}"
 | 
					msg_info "Installing Code-Server v${VERSION}"
 | 
				
			||||||
curl -fOL https://github.com/coder/code-server/releases/download/v$VERSION/code-server_${VERSION}_amd64.deb &>/dev/null
 | 
					curl -fOL https://github.com/coder/code-server/releases/download/v"$VERSION"/code-server_"${VERSION}"_amd64.deb &>/dev/null
 | 
				
			||||||
dpkg -i code-server_${VERSION}_amd64.deb &>/dev/null
 | 
					dpkg -i code-server_"${VERSION}"_amd64.deb &>/dev/null
 | 
				
			||||||
rm -rf code-server_${VERSION}_amd64.deb
 | 
					rm -rf code-server_"${VERSION}"_amd64.deb
 | 
				
			||||||
mkdir -p ~/.config/code-server/
 | 
					mkdir -p ~/.config/code-server/
 | 
				
			||||||
systemctl enable -q --now code-server@$USER
 | 
					systemctl enable -q --now code-server@"$USER"
 | 
				
			||||||
cat <<EOF >~/.config/code-server/config.yaml
 | 
					cat <<EOF >~/.config/code-server/config.yaml
 | 
				
			||||||
bind-addr: 0.0.0.0:8680
 | 
					bind-addr: 0.0.0.0:8680
 | 
				
			||||||
auth: none
 | 
					auth: none
 | 
				
			||||||
password: 
 | 
					password: 
 | 
				
			||||||
cert: false
 | 
					cert: false
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
systemctl restart code-server@$USER
 | 
					systemctl restart code-server@"$USER"
 | 
				
			||||||
msg_ok "Installed Code-Server v${VERSION} on $hostname"
 | 
					msg_ok "Installed Code-Server v${VERSION} on $hostname"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo -e "${APP} should be reachable by going to the following URL.
 | 
					echo -e "${APP} should be reachable by going to the following URL.
 | 
				
			||||||
@@ -26,7 +26,6 @@ NSAPP="arch-linux-vm"
 | 
				
			|||||||
var_os="arch-linux"
 | 
					var_os="arch-linux"
 | 
				
			||||||
var_version=" "
 | 
					var_version=" "
 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
YW=$(echo "\033[33m")
 | 
					YW=$(echo "\033[33m")
 | 
				
			||||||
BL=$(echo "\033[36m")
 | 
					BL=$(echo "\033[36m")
 | 
				
			||||||
@@ -76,6 +75,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -161,7 +177,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_SIZE="4G"
 | 
					  DISK_SIZE="4G"
 | 
				
			||||||
@@ -194,10 +210,11 @@ function default_settings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,6 @@ EOF
 | 
				
			|||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "\n Loading..."
 | 
					echo -e "\n Loading..."
 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="debian12vm"
 | 
					NSAPP="debian12vm"
 | 
				
			||||||
@@ -75,6 +74,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -161,7 +177,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_SIZE="8G"
 | 
					  DISK_SIZE="8G"
 | 
				
			||||||
@@ -194,10 +210,11 @@ function default_settings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										197
									
								
								vm/docker-vm.sh
									
									
									
									
									
								
							
							
						
						
									
										197
									
								
								vm/docker-vm.sh
									
									
									
									
									
								
							@@ -1,12 +1,12 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
					# Copyright (c) 2021-2025 community-scripts ORG
 | 
				
			||||||
# Author: thost96 (thost96)
 | 
					# Author: thost96 (thost96) | Co-Author: michelroegl-brunner
 | 
				
			||||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
					# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
					source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function header_info {
 | 
					function header_info() {
 | 
				
			||||||
  clear
 | 
					  clear
 | 
				
			||||||
  cat <<"EOF"
 | 
					  cat <<"EOF"
 | 
				
			||||||
    ____             __                _    ____  ___
 | 
					    ____             __                _    ____  ___
 | 
				
			||||||
@@ -20,7 +20,6 @@ EOF
 | 
				
			|||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "\n Loading..."
 | 
					echo -e "\n Loading..."
 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="debian12vm"
 | 
					NSAPP="debian12vm"
 | 
				
			||||||
@@ -36,10 +35,30 @@ BGN=$(echo "\033[4;92m")
 | 
				
			|||||||
GN=$(echo "\033[1;92m")
 | 
					GN=$(echo "\033[1;92m")
 | 
				
			||||||
DGN=$(echo "\033[32m")
 | 
					DGN=$(echo "\033[32m")
 | 
				
			||||||
CL=$(echo "\033[m")
 | 
					CL=$(echo "\033[m")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CL=$(echo "\033[m")
 | 
				
			||||||
 | 
					BOLD=$(echo "\033[1m")
 | 
				
			||||||
BFR="\\r\\033[K"
 | 
					BFR="\\r\\033[K"
 | 
				
			||||||
HOLD="-"
 | 
					HOLD=" "
 | 
				
			||||||
CM="${GN}✓${CL}"
 | 
					TAB="  "
 | 
				
			||||||
CROSS="${RD}✗${CL}"
 | 
					
 | 
				
			||||||
 | 
					CM="${TAB}✔️${TAB}${CL}"
 | 
				
			||||||
 | 
					CROSS="${TAB}✖️${TAB}${CL}"
 | 
				
			||||||
 | 
					INFO="${TAB}💡${TAB}${CL}"
 | 
				
			||||||
 | 
					OS="${TAB}🖥️${TAB}${CL}"
 | 
				
			||||||
 | 
					CONTAINERTYPE="${TAB}📦${TAB}${CL}"
 | 
				
			||||||
 | 
					DISKSIZE="${TAB}💾${TAB}${CL}"
 | 
				
			||||||
 | 
					CPUCORE="${TAB}🧠${TAB}${CL}"
 | 
				
			||||||
 | 
					RAMSIZE="${TAB}🛠️${TAB}${CL}"
 | 
				
			||||||
 | 
					CONTAINERID="${TAB}🆔${TAB}${CL}"
 | 
				
			||||||
 | 
					HOSTNAME="${TAB}🏠${TAB}${CL}"
 | 
				
			||||||
 | 
					BRIDGE="${TAB}🌉${TAB}${CL}"
 | 
				
			||||||
 | 
					GATEWAY="${TAB}🌐${TAB}${CL}"
 | 
				
			||||||
 | 
					DEFAULT="${TAB}⚙️${TAB}${CL}"
 | 
				
			||||||
 | 
					MACADDRESS="${TAB}🔗${TAB}${CL}"
 | 
				
			||||||
 | 
					VLANTAG="${TAB}🏷️${TAB}${CL}"
 | 
				
			||||||
 | 
					CREATING="${TAB}🚀${TAB}${CL}"
 | 
				
			||||||
 | 
					ADVANCED="${TAB}🧩${TAB}${CL}"
 | 
				
			||||||
THIN="discard=on,ssd=1,"
 | 
					THIN="discard=on,ssd=1,"
 | 
				
			||||||
set -e
 | 
					set -e
 | 
				
			||||||
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
					trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
 | 
				
			||||||
@@ -56,6 +75,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -65,30 +101,31 @@ function cleanup_vmid() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function cleanup() {
 | 
					function cleanup() {
 | 
				
			||||||
  popd >/dev/null
 | 
					  popd >/dev/null
 | 
				
			||||||
 | 
					  post_update_to_api "done" "none"
 | 
				
			||||||
  rm -rf $TEMP_DIR
 | 
					  rm -rf $TEMP_DIR
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEMP_DIR=$(mktemp -d)
 | 
					TEMP_DIR=$(mktemp -d)
 | 
				
			||||||
pushd $TEMP_DIR >/dev/null
 | 
					pushd $TEMP_DIR >/dev/null
 | 
				
			||||||
if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Docker VM" --yesno "This will create a New Docker VM. Proceed?" 10 58; then
 | 
					if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Debian 12 VM" --yesno "This will create a New Debian 12 VM. Proceed?" 10 58; then
 | 
				
			||||||
  :
 | 
					  :
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
  header_info && echo -e "⚠ User exited script \n" && exit
 | 
					  header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function msg_info() {
 | 
					function msg_info() {
 | 
				
			||||||
  local msg="$1"
 | 
					  local msg="$1"
 | 
				
			||||||
  echo -ne " ${HOLD} ${YW}${msg}..."
 | 
					  echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function msg_ok() {
 | 
					function msg_ok() {
 | 
				
			||||||
  local msg="$1"
 | 
					  local msg="$1"
 | 
				
			||||||
  echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
 | 
					  echo -e "${BFR}${CM}${GN}${msg}${CL}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function msg_error() {
 | 
					function msg_error() {
 | 
				
			||||||
  local msg="$1"
 | 
					  local msg="$1"
 | 
				
			||||||
  echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}"
 | 
					  echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function check_root() {
 | 
					function check_root() {
 | 
				
			||||||
@@ -103,7 +140,7 @@ function check_root() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function pve_check() {
 | 
					function pve_check() {
 | 
				
			||||||
  if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then
 | 
					  if ! pveversion | grep -Eq "pve-manager/8\.[1-4](\.[0-9]+)*"; then
 | 
				
			||||||
    msg_error "This version of Proxmox Virtual Environment is not supported"
 | 
					    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 "Requires Proxmox Virtual Environment Version 8.1 or later."
 | 
				
			||||||
    echo -e "Exiting..."
 | 
					    echo -e "Exiting..."
 | 
				
			||||||
    sleep 2
 | 
					    sleep 2
 | 
				
			||||||
@@ -113,13 +150,12 @@ function pve_check() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function arch_check() {
 | 
					function arch_check() {
 | 
				
			||||||
  if [ "$(dpkg --print-architecture)" != "amd64" ]; then
 | 
					  if [ "$(dpkg --print-architecture)" != "amd64" ]; then
 | 
				
			||||||
    if [ "$(dpkg --print-architecture)" != "arm64" ]; then
 | 
					    echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n"
 | 
				
			||||||
      msg_error "This script will not work with your CPU Architekture \n"
 | 
					    echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n"
 | 
				
			||||||
    echo -e "Exiting..."
 | 
					    echo -e "Exiting..."
 | 
				
			||||||
    sleep 2
 | 
					    sleep 2
 | 
				
			||||||
    exit
 | 
					    exit
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function ssh_check() {
 | 
					function ssh_check() {
 | 
				
			||||||
@@ -137,15 +173,16 @@ function ssh_check() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function exit-script() {
 | 
					function exit-script() {
 | 
				
			||||||
  clear
 | 
					  clear
 | 
				
			||||||
  echo -e "⚠  User exited script \n"
 | 
					  echo -e "\n${CROSS}${RD}User exited script${CL}\n"
 | 
				
			||||||
  exit
 | 
					  exit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_CACHE=""
 | 
					  DISK_CACHE=""
 | 
				
			||||||
 | 
					  DISK_SIZE="8G"
 | 
				
			||||||
  HN="docker"
 | 
					  HN="docker"
 | 
				
			||||||
  CPU_TYPE=""
 | 
					  CPU_TYPE=""
 | 
				
			||||||
  CORE_COUNT="2"
 | 
					  CORE_COUNT="2"
 | 
				
			||||||
@@ -156,34 +193,36 @@ function default_settings() {
 | 
				
			|||||||
  MTU=""
 | 
					  MTU=""
 | 
				
			||||||
  START_VM="yes"
 | 
					  START_VM="yes"
 | 
				
			||||||
  METHOD="default"
 | 
					  METHOD="default"
 | 
				
			||||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
					  echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using Machine Type: ${BGN}i440fx${CL}"
 | 
					  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
 | 
					  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using Hostname: ${BGN}${HN}${CL}"
 | 
					  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}"
 | 
					  echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}"
 | 
				
			||||||
  echo -e "${DGN}Allocated Cores: ${BGN}${CORE_COUNT}${CL}"
 | 
					  echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
 | 
				
			||||||
  echo -e "${DGN}Allocated RAM: ${BGN}${RAM_SIZE}${CL}"
 | 
					  echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using Bridge: ${BGN}${BRG}${CL}"
 | 
					  echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using MAC Address: ${BGN}${MAC}${CL}"
 | 
					  echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using VLAN: ${BGN}Default${CL}"
 | 
					  echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}${MAC}${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}"
 | 
					  echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}"
 | 
				
			||||||
  echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}"
 | 
					  echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}"
 | 
				
			||||||
  echo -e "${BL}Creating a Docker VM using the above default settings${CL}"
 | 
					  echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
 | 
				
			||||||
 | 
					  echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above default settings${CL}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
        sleep 2
 | 
					        sleep 2
 | 
				
			||||||
        continue
 | 
					        continue
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      echo -e "${DGN}Virtual Machine ID: ${BGN}$VMID${CL}"
 | 
					      echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}"
 | 
				
			||||||
      break
 | 
					      break
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      exit-script
 | 
					      exit-script
 | 
				
			||||||
@@ -195,11 +234,11 @@ function advanced_settings() {
 | 
				
			|||||||
    "q35" "Machine q35" OFF \
 | 
					    "q35" "Machine q35" OFF \
 | 
				
			||||||
    3>&1 1>&2 2>&3); then
 | 
					    3>&1 1>&2 2>&3); then
 | 
				
			||||||
    if [ $MACH = q35 ]; then
 | 
					    if [ $MACH = q35 ]; then
 | 
				
			||||||
      echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}"
 | 
					      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
 | 
				
			||||||
      FORMAT=""
 | 
					      FORMAT=""
 | 
				
			||||||
      MACHINE=" -machine q35"
 | 
					      MACHINE=" -machine q35"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      echo -e "${DGN}Using Machine Type: ${BGN}$MACH${CL}"
 | 
					      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
 | 
				
			||||||
      FORMAT=",efitype=4m"
 | 
					      FORMAT=",efitype=4m"
 | 
				
			||||||
      MACHINE=""
 | 
					      MACHINE=""
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
@@ -207,28 +246,43 @@ function advanced_settings() {
 | 
				
			|||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
 | 
					    DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ')
 | 
				
			||||||
 | 
					    if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then
 | 
				
			||||||
 | 
					      DISK_SIZE="${DISK_SIZE}G"
 | 
				
			||||||
 | 
					      echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}"
 | 
				
			||||||
 | 
					    elif [[ "$DISK_SIZE" =~ ^[0-9]+G$ ]]; then
 | 
				
			||||||
 | 
					      echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}"
 | 
				
			||||||
 | 
					      exit-script
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    exit-script
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
 | 
					  if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
 | 
				
			||||||
    "0" "None (Default)" ON \
 | 
					    "0" "None (Default)" ON \
 | 
				
			||||||
    "1" "Write Through" OFF \
 | 
					    "1" "Write Through" OFF \
 | 
				
			||||||
    3>&1 1>&2 2>&3); then
 | 
					    3>&1 1>&2 2>&3); then
 | 
				
			||||||
    if [ $DISK_CACHE = "1" ]; then
 | 
					    if [ $DISK_CACHE = "1" ]; then
 | 
				
			||||||
      echo -e "${DGN}Using Disk Cache: ${BGN}Write Through${CL}"
 | 
					      echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}Write Through${CL}"
 | 
				
			||||||
      DISK_CACHE="cache=writethrough,"
 | 
					      DISK_CACHE="cache=writethrough,"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      echo -e "${DGN}Using Disk Cache: ${BGN}None${CL}"
 | 
					      echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
 | 
				
			||||||
      DISK_CACHE=""
 | 
					      DISK_CACHE=""
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 docker --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
					  if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 debian --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
    if [ -z $VM_NAME ]; then
 | 
					    if [ -z $VM_NAME ]; then
 | 
				
			||||||
      HN="docker"
 | 
					      HN="debian"
 | 
				
			||||||
      echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
 | 
					      echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      HN=$(echo ${VM_NAME,,} | tr -d ' ')
 | 
					      HN=$(echo ${VM_NAME,,} | tr -d ' ')
 | 
				
			||||||
      echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}"
 | 
					      echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
@@ -239,10 +293,10 @@ function advanced_settings() {
 | 
				
			|||||||
    "1" "Host" OFF \
 | 
					    "1" "Host" OFF \
 | 
				
			||||||
    3>&1 1>&2 2>&3); then
 | 
					    3>&1 1>&2 2>&3); then
 | 
				
			||||||
    if [ $CPU_TYPE1 = "1" ]; then
 | 
					    if [ $CPU_TYPE1 = "1" ]; then
 | 
				
			||||||
      echo -e "${DGN}Using CPU Model: ${BGN}Host${CL}"
 | 
					      echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}"
 | 
				
			||||||
      CPU_TYPE=" -cpu host"
 | 
					      CPU_TYPE=" -cpu host"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      echo -e "${DGN}Using CPU Model: ${BGN}KVM64${CL}"
 | 
					      echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
 | 
				
			||||||
      CPU_TYPE=""
 | 
					      CPU_TYPE=""
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
@@ -252,20 +306,20 @@ function advanced_settings() {
 | 
				
			|||||||
  if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
					  if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
    if [ -z $CORE_COUNT ]; then
 | 
					    if [ -z $CORE_COUNT ]; then
 | 
				
			||||||
      CORE_COUNT="2"
 | 
					      CORE_COUNT="2"
 | 
				
			||||||
      echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
 | 
					      echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
 | 
					      echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 4096 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
					  if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
    if [ -z $RAM_SIZE ]; then
 | 
					    if [ -z $RAM_SIZE ]; then
 | 
				
			||||||
      RAM_SIZE="4096"
 | 
					      RAM_SIZE="2048"
 | 
				
			||||||
      echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
 | 
					      echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
 | 
					      echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
@@ -274,9 +328,9 @@ function advanced_settings() {
 | 
				
			|||||||
  if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
					  if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
    if [ -z $BRG ]; then
 | 
					    if [ -z $BRG ]; then
 | 
				
			||||||
      BRG="vmbr0"
 | 
					      BRG="vmbr0"
 | 
				
			||||||
      echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
 | 
					      echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}"
 | 
					      echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
@@ -285,10 +339,10 @@ function advanced_settings() {
 | 
				
			|||||||
  if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
					  if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
    if [ -z $MAC1 ]; then
 | 
					    if [ -z $MAC1 ]; then
 | 
				
			||||||
      MAC="$GEN_MAC"
 | 
					      MAC="$GEN_MAC"
 | 
				
			||||||
      echo -e "${DGN}Using MAC Address: ${BGN}$MAC${CL}"
 | 
					      echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      MAC="$MAC1"
 | 
					      MAC="$MAC1"
 | 
				
			||||||
      echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
 | 
					      echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
@@ -298,10 +352,10 @@ function advanced_settings() {
 | 
				
			|||||||
    if [ -z $VLAN1 ]; then
 | 
					    if [ -z $VLAN1 ]; then
 | 
				
			||||||
      VLAN1="Default"
 | 
					      VLAN1="Default"
 | 
				
			||||||
      VLAN=""
 | 
					      VLAN=""
 | 
				
			||||||
      echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
 | 
					      echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      VLAN=",tag=$VLAN1"
 | 
					      VLAN=",tag=$VLAN1"
 | 
				
			||||||
      echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
 | 
					      echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
@@ -311,28 +365,28 @@ function advanced_settings() {
 | 
				
			|||||||
    if [ -z $MTU1 ]; then
 | 
					    if [ -z $MTU1 ]; then
 | 
				
			||||||
      MTU1="Default"
 | 
					      MTU1="Default"
 | 
				
			||||||
      MTU=""
 | 
					      MTU=""
 | 
				
			||||||
      echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
 | 
					      echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      MTU=",mtu=$MTU1"
 | 
					      MTU=",mtu=$MTU1"
 | 
				
			||||||
      echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
 | 
					      echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}"
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then
 | 
					  if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then
 | 
				
			||||||
    echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}"
 | 
					    echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}"
 | 
				
			||||||
    START_VM="yes"
 | 
					    START_VM="yes"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    echo -e "${DGN}Start VM when completed: ${BGN}no${CL}"
 | 
					    echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}no${CL}"
 | 
				
			||||||
    START_VM="no"
 | 
					    START_VM="no"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Docker VM?" --no-button Do-Over 10 58); then
 | 
					  if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Debian 12 VM?" --no-button Do-Over 10 58); then
 | 
				
			||||||
    echo -e "${RD}Creating a Docker VM using the above advanced settings${CL}"
 | 
					    echo -e "${CREATING}${BOLD}${DGN}Creating a Debian 12 VM using the above advanced settings${CL}"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    header_info
 | 
					    header_info
 | 
				
			||||||
    echo -e "${RD}Using Advanced Settings${CL}"
 | 
					    echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}"
 | 
				
			||||||
    advanced_settings
 | 
					    advanced_settings
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -340,15 +394,14 @@ function advanced_settings() {
 | 
				
			|||||||
function start_script() {
 | 
					function start_script() {
 | 
				
			||||||
  if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
 | 
					  if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
 | 
				
			||||||
    header_info
 | 
					    header_info
 | 
				
			||||||
    echo -e "${BL}Using Default Settings${CL}"
 | 
					    echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}"
 | 
				
			||||||
    default_settings
 | 
					    default_settings
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    header_info
 | 
					    header_info
 | 
				
			||||||
    echo -e "${RD}Using Advanced Settings${CL}"
 | 
					    echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}"
 | 
				
			||||||
    advanced_settings
 | 
					    advanced_settings
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
check_root
 | 
					check_root
 | 
				
			||||||
arch_check
 | 
					arch_check
 | 
				
			||||||
pve_check
 | 
					pve_check
 | 
				
			||||||
@@ -393,7 +446,7 @@ echo -en "\e[1A\e[0K"
 | 
				
			|||||||
FILE=$(basename $URL)
 | 
					FILE=$(basename $URL)
 | 
				
			||||||
msg_ok "Downloaded ${CL}${BL}${FILE}${CL}"
 | 
					msg_ok "Downloaded ${CL}${BL}${FILE}${CL}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}')
 | 
					STORAGE_TYPE=$(pvesm status -storage "$STORAGE" | awk 'NR>1 {print $2}')
 | 
				
			||||||
case $STORAGE_TYPE in
 | 
					case $STORAGE_TYPE in
 | 
				
			||||||
nfs | dir)
 | 
					nfs | dir)
 | 
				
			||||||
  DISK_EXT=".qcow2"
 | 
					  DISK_EXT=".qcow2"
 | 
				
			||||||
@@ -430,12 +483,12 @@ msg_ok "Added Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image suc
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
msg_info "Creating a Docker VM"
 | 
					msg_info "Creating a Docker VM"
 | 
				
			||||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
					qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
				
			||||||
  -name $HN -tags community-script,debian12,docker -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
					  -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
				
			||||||
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
					pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
				
			||||||
qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
					qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
				
			||||||
qm set $VMID \
 | 
					qm set $VMID \
 | 
				
			||||||
  -efidisk0 ${DISK0_REF}${FORMAT} \
 | 
					  -efidisk0 ${DISK0_REF}${FORMAT} \
 | 
				
			||||||
  -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=2G \
 | 
					  -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \
 | 
				
			||||||
  -boot order=scsi0 \
 | 
					  -boot order=scsi0 \
 | 
				
			||||||
  -serial0 socket >/dev/null
 | 
					  -serial0 socket >/dev/null
 | 
				
			||||||
qm resize $VMID scsi0 8G >/dev/null
 | 
					qm resize $VMID scsi0 8G >/dev/null
 | 
				
			||||||
@@ -473,6 +526,14 @@ EOF
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
qm set "$VMID" -description "$DESCRIPTION" >/dev/null
 | 
					qm set "$VMID" -description "$DESCRIPTION" >/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -n "$DISK_SIZE" ]; then
 | 
				
			||||||
 | 
					  msg_info "Resizing disk to $DISK_SIZE GB"
 | 
				
			||||||
 | 
					  qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					  msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB"
 | 
				
			||||||
 | 
					  qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
msg_ok "Created a Docker VM ${CL}${BL}(${HN})"
 | 
					msg_ok "Created a Docker VM ${CL}${BL}(${HN})"
 | 
				
			||||||
if [ "$START_VM" == "yes" ]; then
 | 
					if [ "$START_VM" == "yes" ]; then
 | 
				
			||||||
  msg_info "Starting Docker VM"
 | 
					  msg_info "Starting Docker VM"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,15 +21,13 @@ EOF
 | 
				
			|||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "\n Loading..."
 | 
					echo -e "\n Loading..."
 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
VERSIONS=(stable beta dev)
 | 
					VERSIONS=(stable beta dev)
 | 
				
			||||||
#API VARIABLES
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="homeassistant-os"
 | 
					NSAPP="homeassistant-os"
 | 
				
			||||||
var_os="homeassistant"
 | 
					var_os="homeassistant"
 | 
				
			||||||
DISK_SIZE="32G"
 | 
					DISK_SIZE="32G"
 | 
				
			||||||
#
 | 
					
 | 
				
			||||||
for version in "${VERSIONS[@]}"; do
 | 
					for version in "${VERSIONS[@]}"; do
 | 
				
			||||||
  eval "$version=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep '"ova"' | cut -d '"' -f 4)"
 | 
					  eval "$version=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep '"ova"' | cut -d '"' -f 4)"
 | 
				
			||||||
done
 | 
					done
 | 
				
			||||||
@@ -65,6 +63,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -166,7 +181,7 @@ function exit-script() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  BRANCH="$stable"
 | 
					  BRANCH="$stable"
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_CACHE="cache=writethrough,"
 | 
					  DISK_CACHE="cache=writethrough,"
 | 
				
			||||||
@@ -210,10 +225,11 @@ function advanced_settings() {
 | 
				
			|||||||
    exit-script
 | 
					    exit-script
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID="$VMID"
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,15 +21,12 @@ clear
 | 
				
			|||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "Loading..."
 | 
					echo -e "Loading..."
 | 
				
			||||||
GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]')
 | 
					GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
#API VARIABLES
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="mikrotik-router-os"
 | 
					NSAPP="mikrotik-router-os"
 | 
				
			||||||
var_os="mikrotik"
 | 
					var_os="mikrotik"
 | 
				
			||||||
var_version=" "
 | 
					var_version=" "
 | 
				
			||||||
DISK_SIZE="1G"
 | 
					DISK_SIZE="1G"
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
YW=$(echo "\033[33m")
 | 
					YW=$(echo "\033[33m")
 | 
				
			||||||
BL=$(echo "\033[36m")
 | 
					BL=$(echo "\033[36m")
 | 
				
			||||||
HA=$(echo "\033[1;34m")
 | 
					HA=$(echo "\033[1;34m")
 | 
				
			||||||
@@ -60,6 +57,24 @@ function error_exit() {
 | 
				
			|||||||
  [ ! -z ${VMID-} ] && cleanup_vmid
 | 
					  [ ! -z ${VMID-} ] && cleanup_vmid
 | 
				
			||||||
  exit $EXIT
 | 
					  exit $EXIT
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if $(qm status $VMID &>/dev/null); then
 | 
					  if $(qm status $VMID &>/dev/null); then
 | 
				
			||||||
    if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then
 | 
					    if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then
 | 
				
			||||||
@@ -99,8 +114,8 @@ function msg_ok() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  METHOD="default"
 | 
					  METHOD="default"
 | 
				
			||||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}$NEXTID${CL}"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  VMID=$NEXTID
 | 
					  echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using Hostname: ${BGN}mikrotik-routeros-chr${CL}"
 | 
					  echo -e "${DGN}Using Hostname: ${BGN}mikrotik-routeros-chr${CL}"
 | 
				
			||||||
  HN=mikrotik-routeros-chr
 | 
					  HN=mikrotik-routeros-chr
 | 
				
			||||||
  echo -e "${DGN}Allocated Cores: ${BGN}1${CL}"
 | 
					  echo -e "${DGN}Allocated Cores: ${BGN}1${CL}"
 | 
				
			||||||
@@ -121,7 +136,8 @@ function default_settings() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
  VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" 3>&1 1>&2 2>&3)
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
 | 
					  VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" 3>&1 1>&2 2>&3)
 | 
				
			||||||
  exitstatus=$?
 | 
					  exitstatus=$?
 | 
				
			||||||
  if [ $exitstatus = 0 ]; then
 | 
					  if [ $exitstatus = 0 ]; then
 | 
				
			||||||
    echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}"
 | 
					    echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,16 +19,13 @@ EOF
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "\n Loading..."
 | 
					echo -e "\n Loading..."
 | 
				
			||||||
#API VARIABLES
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="turnkey-nextcloud"
 | 
					NSAPP="turnkey-nextcloud"
 | 
				
			||||||
var_os="turnkey-nextcloud"
 | 
					var_os="turnkey-nextcloud"
 | 
				
			||||||
var_version=" "
 | 
					var_version=" "
 | 
				
			||||||
DISK_SIZE="12G"
 | 
					DISK_SIZE="12G"
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
NAME="TurnKey Nexcloud VM"
 | 
					NAME="TurnKey Nexcloud VM"
 | 
				
			||||||
YW=$(echo "\033[33m")
 | 
					YW=$(echo "\033[33m")
 | 
				
			||||||
BL=$(echo "\033[36m")
 | 
					BL=$(echo "\033[36m")
 | 
				
			||||||
@@ -58,6 +55,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -142,7 +156,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_CACHE=""
 | 
					  DISK_CACHE=""
 | 
				
			||||||
@@ -173,10 +187,11 @@ function default_settings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,17 +23,15 @@ EOF
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "Loading..."
 | 
					echo -e "Loading..."
 | 
				
			||||||
#API VARIABLES
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="openwrt-vm"
 | 
					NSAPP="openwrt-vm"
 | 
				
			||||||
var_os="openwrt"
 | 
					var_os="openwrt"
 | 
				
			||||||
var_version=" "
 | 
					var_version=" "
 | 
				
			||||||
DISK_SIZE="0.5G"
 | 
					DISK_SIZE="0.5G"
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					
 | 
				
			||||||
YW=$(echo "\033[33m")
 | 
					YW=$(echo "\033[33m")
 | 
				
			||||||
BL=$(echo "\033[36m")
 | 
					BL=$(echo "\033[36m")
 | 
				
			||||||
HA=$(echo "\033[1;34m")
 | 
					HA=$(echo "\033[1;34m")
 | 
				
			||||||
@@ -61,6 +59,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -208,7 +223,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID=$NEXTID
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  HN=openwrt
 | 
					  HN=openwrt
 | 
				
			||||||
  CORE_COUNT="1"
 | 
					  CORE_COUNT="1"
 | 
				
			||||||
  RAM_SIZE="256"
 | 
					  RAM_SIZE="256"
 | 
				
			||||||
@@ -242,10 +257,11 @@ function default_settings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,7 @@ var_version="25.1"
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					
 | 
				
			||||||
YW=$(echo "\033[33m")
 | 
					YW=$(echo "\033[33m")
 | 
				
			||||||
BL=$(echo "\033[36m")
 | 
					BL=$(echo "\033[36m")
 | 
				
			||||||
HA=$(echo "\033[1;34m")
 | 
					HA=$(echo "\033[1;34m")
 | 
				
			||||||
@@ -54,6 +54,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -202,7 +219,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_CACHE=""
 | 
					  DISK_CACHE=""
 | 
				
			||||||
@@ -252,10 +269,11 @@ function default_settings() {
 | 
				
			|||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  local ip_regex='^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$'
 | 
					  local ip_regex='^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$'
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,17 +19,15 @@ EOF
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "\n Loading..."
 | 
					echo -e "\n Loading..."
 | 
				
			||||||
#API VARIABLES
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="turnkey-owncloud-vm"
 | 
					NSAPP="turnkey-owncloud-vm"
 | 
				
			||||||
var_os="owncloud"
 | 
					var_os="owncloud"
 | 
				
			||||||
var_version="12"
 | 
					var_version="12"
 | 
				
			||||||
DISK_SIZE="12G"
 | 
					DISK_SIZE="12G"
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
NAME="TurnKey ownCloud VM"
 | 
					NAME="TurnKey ownCloud VM"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
YW=$(echo "\033[33m")
 | 
					YW=$(echo "\033[33m")
 | 
				
			||||||
BL=$(echo "\033[36m")
 | 
					BL=$(echo "\033[36m")
 | 
				
			||||||
HA=$(echo "\033[1;34m")
 | 
					HA=$(echo "\033[1;34m")
 | 
				
			||||||
@@ -58,6 +56,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -142,7 +157,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_CACHE=""
 | 
					  DISK_CACHE=""
 | 
				
			||||||
@@ -173,10 +188,11 @@ function default_settings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,17 +24,14 @@ EOF
 | 
				
			|||||||
clear
 | 
					clear
 | 
				
			||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "Loading..."
 | 
					echo -e "Loading..."
 | 
				
			||||||
#API VARIABLES
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="pimox-haos-vm"
 | 
					NSAPP="pimox-haos-vm"
 | 
				
			||||||
var_os="pimox-haos"
 | 
					var_os="pimox-haos"
 | 
				
			||||||
var_version=" "
 | 
					var_version=" "
 | 
				
			||||||
DISK_SIZE="32G"
 | 
					DISK_SIZE="32G"
 | 
				
			||||||
#
 | 
					 | 
				
			||||||
GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]')
 | 
					GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]')
 | 
				
			||||||
USEDID=$(pvesh get /cluster/resources --type vm --output-format yaml | egrep -i 'vmid' | awk '{print substr($2, 1, length($2)-0) }')
 | 
					USEDID=$(pvesh get /cluster/resources --type vm --output-format yaml | egrep -i 'vmid' | awk '{print substr($2, 1, length($2)-0) }')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
STABLE=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					STABLE=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
BETA=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/beta.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					BETA=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/beta.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
DEV=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/dev.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
 | 
					DEV=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/dev.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
 | 
				
			||||||
@@ -70,6 +67,24 @@ function error_exit() {
 | 
				
			|||||||
  [ ! -z ${VMID-} ] && cleanup_vmid
 | 
					  [ ! -z ${VMID-} ] && cleanup_vmid
 | 
				
			||||||
  exit $EXIT
 | 
					  exit $EXIT
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if $(qm status $VMID &>/dev/null); then
 | 
					  if $(qm status $VMID &>/dev/null); then
 | 
				
			||||||
    if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then
 | 
					    if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then
 | 
				
			||||||
@@ -122,8 +137,8 @@ function default_settings() {
 | 
				
			|||||||
  METHOD="default"
 | 
					  METHOD="default"
 | 
				
			||||||
  echo -e "${DGN}Using HAOS Version: ${BGN}${STABLE}${CL}"
 | 
					  echo -e "${DGN}Using HAOS Version: ${BGN}${STABLE}${CL}"
 | 
				
			||||||
  BRANCH=${STABLE}
 | 
					  BRANCH=${STABLE}
 | 
				
			||||||
  echo -e "${DGN}Using Virtual Machine ID: ${BGN}$NEXTID${CL}"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  VMID=$NEXTID
 | 
					  echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}"
 | 
				
			||||||
  echo -e "${DGN}Using Hostname: ${BGN}haos${STABLE}${CL}"
 | 
					  echo -e "${DGN}Using Hostname: ${BGN}haos${STABLE}${CL}"
 | 
				
			||||||
  HN=haos${STABLE}
 | 
					  HN=haos${STABLE}
 | 
				
			||||||
  echo -e "${DGN}Allocated Cores: ${BGN}2${CL}"
 | 
					  echo -e "${DGN}Allocated Cores: ${BGN}2${CL}"
 | 
				
			||||||
@@ -151,10 +166,11 @@ function advanced_settings() {
 | 
				
			|||||||
    3>&1 1>&2 2>&3)
 | 
					    3>&1 1>&2 2>&3)
 | 
				
			||||||
  exitstatus=$?
 | 
					  exitstatus=$?
 | 
				
			||||||
  if [ $exitstatus = 0 ]; then echo -e "${DGN}Using HAOS Version: ${BGN}$BRANCH${CL}"; fi
 | 
					  if [ $exitstatus = 0 ]; then echo -e "${DGN}Using HAOS Version: ${BGN}$BRANCH${CL}"; fi
 | 
				
			||||||
  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)
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
 | 
					  VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3)
 | 
				
			||||||
  exitstatus=$?
 | 
					  exitstatus=$?
 | 
				
			||||||
  if [ -z $VMID ]; then
 | 
					  if [ -z $VMID ]; then
 | 
				
			||||||
    VMID="$NEXTID"
 | 
					    VMID="$VMID"
 | 
				
			||||||
    echo -e "${DGN}Virtual Machine: ${BGN}$VMID${CL}"
 | 
					    echo -e "${DGN}Virtual Machine: ${BGN}$VMID${CL}"
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    if echo "$USEDID" | egrep -q "$VMID"; then
 | 
					    if echo "$USEDID" | egrep -q "$VMID"; then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,6 @@ EOF
 | 
				
			|||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "\n Loading..."
 | 
					echo -e "\n Loading..."
 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="ubuntu-2204-vm"
 | 
					NSAPP="ubuntu-2204-vm"
 | 
				
			||||||
@@ -33,8 +32,6 @@ RD=$(echo "\033[01;31m")
 | 
				
			|||||||
BGN=$(echo "\033[4;92m")
 | 
					BGN=$(echo "\033[4;92m")
 | 
				
			||||||
GN=$(echo "\033[1;92m")
 | 
					GN=$(echo "\033[1;92m")
 | 
				
			||||||
DGN=$(echo "\033[32m")
 | 
					DGN=$(echo "\033[32m")
 | 
				
			||||||
CL=$(echo "\033[m")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CL=$(echo "\033[m")
 | 
					CL=$(echo "\033[m")
 | 
				
			||||||
BOLD=$(echo "\033[1m")
 | 
					BOLD=$(echo "\033[1m")
 | 
				
			||||||
BFR="\\r\\033[K"
 | 
					BFR="\\r\\033[K"
 | 
				
			||||||
@@ -75,6 +72,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -160,7 +174,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_SIZE="5G"
 | 
					  DISK_SIZE="5G"
 | 
				
			||||||
@@ -193,10 +207,11 @@ function default_settings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,6 @@ EOF
 | 
				
			|||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "\n Loading..."
 | 
					echo -e "\n Loading..."
 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="ubuntu-2404-vm"
 | 
					NSAPP="ubuntu-2404-vm"
 | 
				
			||||||
@@ -76,6 +75,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -161,7 +177,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_SIZE="7G"
 | 
					  DISK_SIZE="7G"
 | 
				
			||||||
@@ -194,10 +210,11 @@ function default_settings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,6 @@ EOF
 | 
				
			|||||||
header_info
 | 
					header_info
 | 
				
			||||||
echo -e "\n Loading..."
 | 
					echo -e "\n Loading..."
 | 
				
			||||||
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
					GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
 | 
				
			||||||
NEXTID=$(pvesh get /cluster/nextid)
 | 
					 | 
				
			||||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
					RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
 | 
				
			||||||
METHOD=""
 | 
					METHOD=""
 | 
				
			||||||
NSAPP="ubuntu-2410-vm"
 | 
					NSAPP="ubuntu-2410-vm"
 | 
				
			||||||
@@ -75,6 +74,23 @@ function error_handler() {
 | 
				
			|||||||
  cleanup_vmid
 | 
					  cleanup_vmid
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function get_valid_nextid() {
 | 
				
			||||||
 | 
					  local try_id
 | 
				
			||||||
 | 
					  try_id=$(pvesh get /cluster/nextid)
 | 
				
			||||||
 | 
					  while true; do
 | 
				
			||||||
 | 
					    if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
 | 
				
			||||||
 | 
					      try_id=$((try_id + 1))
 | 
				
			||||||
 | 
					      continue
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    break
 | 
				
			||||||
 | 
					  done
 | 
				
			||||||
 | 
					  echo "$try_id"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function cleanup_vmid() {
 | 
					function cleanup_vmid() {
 | 
				
			||||||
  if qm status $VMID &>/dev/null; then
 | 
					  if qm status $VMID &>/dev/null; then
 | 
				
			||||||
    qm stop $VMID &>/dev/null
 | 
					    qm stop $VMID &>/dev/null
 | 
				
			||||||
@@ -160,7 +176,7 @@ function exit-script() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function default_settings() {
 | 
					function default_settings() {
 | 
				
			||||||
  VMID="$NEXTID"
 | 
					  VMID=$(get_valid_nextid)
 | 
				
			||||||
  FORMAT=",efitype=4m"
 | 
					  FORMAT=",efitype=4m"
 | 
				
			||||||
  MACHINE=""
 | 
					  MACHINE=""
 | 
				
			||||||
  DISK_SIZE="8G"
 | 
					  DISK_SIZE="8G"
 | 
				
			||||||
@@ -193,10 +209,11 @@ function default_settings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function advanced_settings() {
 | 
					function advanced_settings() {
 | 
				
			||||||
  METHOD="advanced"
 | 
					  METHOD="advanced"
 | 
				
			||||||
 | 
					  [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
 | 
				
			||||||
  while true; do
 | 
					  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 VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
 | 
				
			||||||
      if [ -z "$VMID" ]; then
 | 
					      if [ -z "$VMID" ]; then
 | 
				
			||||||
        VMID="$NEXTID"
 | 
					        VMID=$(get_valid_nextid)
 | 
				
			||||||
      fi
 | 
					      fi
 | 
				
			||||||
      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
					      if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
 | 
				
			||||||
        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
					        echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user