mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 02:12:49 +00:00 
			
		
		
		
	Compare commits
	
		
			78 Commits
		
	
	
		
			2025-05-09
			...
			2025-05-14
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					369265a6d5 | ||
| 
						 | 
					56f8306960 | ||
| 
						 | 
					3daf3c3325 | ||
| 
						 | 
					c36000a6aa | ||
| 
						 | 
					12265b92e7 | ||
| 
						 | 
					4e31445038 | ||
| 
						 | 
					c30f96912d | ||
| 
						 | 
					e3860c065e | ||
| 
						 | 
					110b64df85 | ||
| 
						 | 
					e17f7aa6f1 | ||
| 
						 | 
					b4d98b1dd2 | ||
| 
						 | 
					e24636133d | ||
| 
						 | 
					7d0a964918 | ||
| 
						 | 
					38c7e747bc | ||
| 
						 | 
					180e003978 | ||
| 
						 | 
					4762ea8fae | ||
| 
						 | 
					4ec3af8e45 | ||
| 
						 | 
					b816ca6788 | ||
| 
						 | 
					d703a8abb2 | ||
| 
						 | 
					4a1f87727b | ||
| 
						 | 
					16c0d09d6b | ||
| 
						 | 
					7740ab68f7 | ||
| 
						 | 
					cd61025295 | ||
| 
						 | 
					2695e2de1a | ||
| 
						 | 
					7aea03034a | ||
| 
						 | 
					e9960347bf | ||
| 
						 | 
					3808d4d0b8 | ||
| 
						 | 
					14c5bf5f75 | ||
| 
						 | 
					fcc16ae8e1 | ||
| 
						 | 
					aaf8bdb893 | ||
| 
						 | 
					db81851db4 | ||
| 
						 | 
					a2d92155a5 | ||
| 
						 | 
					0bd18cc91b | ||
| 
						 | 
					1e7981dbb7 | ||
| 
						 | 
					704073cd69 | ||
| 
						 | 
					22e1518951 | ||
| 
						 | 
					57bd730233 | ||
| 
						 | 
					cf1b13e5fb | ||
| 
						 | 
					9a3b2c076d | ||
| 
						 | 
					3981cc90c4 | ||
| 
						 | 
					592d9d03aa | ||
| 
						 | 
					59b00890f9 | ||
| 
						 | 
					7ee57e7416 | ||
| 
						 | 
					82a30df0c9 | ||
| 
						 | 
					10e1d7e741 | ||
| 
						 | 
					f85cddadcf | ||
| 
						 | 
					1700291af7 | ||
| 
						 | 
					e126e48439 | ||
| 
						 | 
					b3bda56498 | ||
| 
						 | 
					e59f868966 | ||
| 
						 | 
					a9b53afcc5 | ||
| 
						 | 
					38cf296a4c | ||
| 
						 | 
					35c0d269ac | ||
| 
						 | 
					d7211e856e | ||
| 
						 | 
					dfbb1a8035 | ||
| 
						 | 
					61b09e926a | ||
| 
						 | 
					9140fd52ac | ||
| 
						 | 
					4a3ee4db67 | ||
| 
						 | 
					b333d8c3f9 | ||
| 
						 | 
					245b35d01e | ||
| 
						 | 
					37d20ba0dd | ||
| 
						 | 
					b5062c51af | ||
| 
						 | 
					1ea830c955 | ||
| 
						 | 
					be31ecf432 | ||
| 
						 | 
					c586dfe87f | ||
| 
						 | 
					7f65be34ff | ||
| 
						 | 
					c158dbb3ea | ||
| 
						 | 
					95acf8c018 | ||
| 
						 | 
					6c5aa6677a | ||
| 
						 | 
					43ff379ed4 | ||
| 
						 | 
					2c2849179a | ||
| 
						 | 
					d116505ff2 | ||
| 
						 | 
					42535e14ab | ||
| 
						 | 
					990ce16a7d | ||
| 
						 | 
					af1cf0bc71 | ||
| 
						 | 
					e166115745 | ||
| 
						 | 
					bdef92cc71 | ||
| 
						 | 
					1e59c934ec | 
							
								
								
									
										21
									
								
								.github/workflows/auto-update-app-headers.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/auto-update-app-headers.yml
									
									
									
									
										vendored
									
									
								
							@@ -5,8 +5,8 @@ on:
 | 
			
		||||
    branches:
 | 
			
		||||
      - main
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'ct/**.sh'
 | 
			
		||||
  workflow_dispatch: 
 | 
			
		||||
      - "ct/**.sh"
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  update-app-files:
 | 
			
		||||
@@ -25,6 +25,13 @@ jobs:
 | 
			
		||||
          app-id: ${{ vars.APP_ID }}
 | 
			
		||||
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
      - name: Generate a token for PR approval and merge
 | 
			
		||||
        id: generate-token-merge
 | 
			
		||||
        uses: actions/create-github-app-token@v1
 | 
			
		||||
        with:
 | 
			
		||||
          app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
 | 
			
		||||
          private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
 | 
			
		||||
 | 
			
		||||
      # Step 1: Checkout repository
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v2
 | 
			
		||||
@@ -80,7 +87,7 @@ jobs:
 | 
			
		||||
                       --label "automated pr"
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
@@ -90,13 +97,15 @@ jobs:
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request and merge
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
 | 
			
		||||
        run: |
 | 
			
		||||
          PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number')
 | 
			
		||||
          git config --global user.name "github-actions-automege[bot]"
 | 
			
		||||
          git config --global user.email "github-actions-automege[bot]@users.noreply.github.com"
 | 
			
		||||
          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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								.github/workflows/changelog-pr.yml
									
									
									
									
										vendored
									
									
								
							@@ -24,6 +24,13 @@ jobs:
 | 
			
		||||
          app-id: ${{ vars.APP_ID }}
 | 
			
		||||
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
      - name: Generate a token for PR approval and merge
 | 
			
		||||
        id: generate-token-merge
 | 
			
		||||
        uses: actions/create-github-app-token@v1
 | 
			
		||||
        with:
 | 
			
		||||
          app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
 | 
			
		||||
          private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
 | 
			
		||||
 | 
			
		||||
      - name: Checkout code
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
@@ -177,7 +184,7 @@ jobs:
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return await main();
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
      - name: Update CHANGELOG.md
 | 
			
		||||
        uses: actions/github-script@v7
 | 
			
		||||
        with:
 | 
			
		||||
@@ -202,7 +209,7 @@ jobs:
 | 
			
		||||
              if (hasMainNotes || hasSubNotes) {
 | 
			
		||||
                newReleaseNotes += `### ${title}\n\n`;
 | 
			
		||||
              }
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
              if (hasMainNotes) {
 | 
			
		||||
                newReleaseNotes += `  ${notes.join("\n")}\n\n`;
 | 
			
		||||
              }
 | 
			
		||||
@@ -267,20 +274,12 @@ jobs:
 | 
			
		||||
      - name: Approve pull request and merge
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
 | 
			
		||||
        run: |
 | 
			
		||||
          git config --global user.name "github-actions-automege[bot]"
 | 
			
		||||
          git config --global user.email "github-actions-automege[bot]@users.noreply.github.com"
 | 
			
		||||
          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
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        run: |
 | 
			
		||||
          PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
 
 | 
			
		||||
@@ -72,8 +72,7 @@ network_check() {
 | 
			
		||||
 | 
			
		||||
update_os() {
 | 
			
		||||
  msg_info "Updating Container OS"
 | 
			
		||||
  apk update
 | 
			
		||||
  apk upgrade
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -83,4 +82,4 @@ motd_ssh() {
 | 
			
		||||
 | 
			
		||||
customize() {
 | 
			
		||||
  return
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								.github/workflows/update-json-date.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.github/workflows/update-json-date.yml
									
									
									
									
										vendored
									
									
								
							@@ -5,8 +5,8 @@ on:
 | 
			
		||||
    branches:
 | 
			
		||||
      - main
 | 
			
		||||
    paths:
 | 
			
		||||
      - 'frontend/public/json/**.json'
 | 
			
		||||
  workflow_dispatch: 
 | 
			
		||||
      - "frontend/public/json/**.json"
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  update-app-files:
 | 
			
		||||
@@ -25,10 +25,17 @@ jobs:
 | 
			
		||||
          app-id: ${{ vars.APP_ID }}
 | 
			
		||||
          private-key: ${{ secrets.APP_PRIVATE_KEY }}
 | 
			
		||||
 | 
			
		||||
      - name: Generate a token for PR approval and merge
 | 
			
		||||
        id: generate-token-merge
 | 
			
		||||
        uses: actions/create-github-app-token@v1
 | 
			
		||||
        with:
 | 
			
		||||
          app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
 | 
			
		||||
          private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
 | 
			
		||||
 | 
			
		||||
      - name: Generate dynamic branch name
 | 
			
		||||
        id: timestamp
 | 
			
		||||
        run: echo "BRANCH_NAME=pr-update-json-$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
      - name: Set up GH_TOKEN
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
@@ -38,7 +45,7 @@ jobs:
 | 
			
		||||
      - name: Checkout Repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 2  # Ensure we have the last two commits
 | 
			
		||||
          fetch-depth: 2 # Ensure we have the last two commits
 | 
			
		||||
 | 
			
		||||
      - name: Get Previous Commit
 | 
			
		||||
        id: prev_commit
 | 
			
		||||
@@ -103,8 +110,8 @@ jobs:
 | 
			
		||||
      - name: Commit and create PR if changes exist
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        run: |
 | 
			
		||||
         
 | 
			
		||||
          
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          git commit -m "Update date in json"
 | 
			
		||||
          git checkout -b ${{ env.BRANCH_NAME }}
 | 
			
		||||
          git push origin ${{ env.BRANCH_NAME }}
 | 
			
		||||
@@ -126,12 +133,15 @@ jobs:
 | 
			
		||||
          if [ -n "$PR_NUMBER" ]; then
 | 
			
		||||
            gh pr review $PR_NUMBER --approve
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Approve pull request and merge
 | 
			
		||||
        if: env.changed == 'true'
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
 | 
			
		||||
          GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
 | 
			
		||||
        run: |
 | 
			
		||||
          PR_NUMBER=$(gh pr list --head "${{ env.BRANCH_NAME }}" --json number --jq '.[].number')
 | 
			
		||||
          git config --global user.name "github-actions-automege[bot]"
 | 
			
		||||
          git config --global user.email "github-actions-automege[bot]@users.noreply.github.com"
 | 
			
		||||
          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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										108
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										108
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -14,8 +14,116 @@ 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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 2025-05-15
 | 
			
		||||
 | 
			
		||||
## 2025-05-14
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
  - odoo ([#4477](https://github.com/community-scripts/ProxmoxVE/pull/4477))
 | 
			
		||||
- asterisk ([#4468](https://github.com/community-scripts/ProxmoxVE/pull/4468))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - fix: fetch_release_and_deploy function [@CrazyWolf13](https://github.com/CrazyWolf13) ([#4478](https://github.com/community-scripts/ProxmoxVE/pull/4478))
 | 
			
		||||
- Website: re-add documenso & some little bugfixes [@MickLesk](https://github.com/MickLesk) ([#4456](https://github.com/community-scripts/ProxmoxVE/pull/4456))
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Add make installation dependency to Actual Budget script [@maciejmatczak](https://github.com/maciejmatczak) ([#4485](https://github.com/community-scripts/ProxmoxVE/pull/4485))
 | 
			
		||||
    - Bookstack: fix copy of themes/uploads/storage [@MickLesk](https://github.com/MickLesk) ([#4457](https://github.com/community-scripts/ProxmoxVE/pull/4457))
 | 
			
		||||
    - Alpine-Rclone: Fix location of passwords file [@tremor021](https://github.com/tremor021) ([#4465](https://github.com/community-scripts/ProxmoxVE/pull/4465))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - monitor-all: improvements - tag based filtering [@grizmin](https://github.com/grizmin) ([#4437](https://github.com/community-scripts/ProxmoxVE/pull/4437))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
  - #### 📂 Github
 | 
			
		||||
 | 
			
		||||
    - Add Github app for auto PR merge [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4461](https://github.com/community-scripts/ProxmoxVE/pull/4461))
 | 
			
		||||
 | 
			
		||||
## 2025-05-13
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
  - gatus ([#4443](https://github.com/community-scripts/ProxmoxVE/pull/4443))
 | 
			
		||||
- alpine-gatus ([#4442](https://github.com/community-scripts/ProxmoxVE/pull/4442))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - update some improvements from dev (tools.func) [@MickLesk](https://github.com/MickLesk) ([#4430](https://github.com/community-scripts/ProxmoxVE/pull/4430))
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - openhab: use zulu17-jdk [@moodyblue](https://github.com/moodyblue) ([#4438](https://github.com/community-scripts/ProxmoxVE/pull/4438))
 | 
			
		||||
 | 
			
		||||
  - #### 🔧 Refactor
 | 
			
		||||
 | 
			
		||||
    - openhab. correct some typos [@moodyblue](https://github.com/moodyblue) ([#4448](https://github.com/community-scripts/ProxmoxVE/pull/4448))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
  - #### 💾 Core
 | 
			
		||||
 | 
			
		||||
    - fix: improve bridge detection in all network interface configuration files [@filippolauria](https://github.com/filippolauria) ([#4413](https://github.com/community-scripts/ProxmoxVE/pull/4413))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
  - #### 📝 Script Information
 | 
			
		||||
 | 
			
		||||
    - Jellyfin Media Server: Update configuration path [@tremor021](https://github.com/tremor021) ([#4434](https://github.com/community-scripts/ProxmoxVE/pull/4434))
 | 
			
		||||
    - Pingvin Share: Added explanation on how to add/edit environment variables [@tremor021](https://github.com/tremor021) ([#4432](https://github.com/community-scripts/ProxmoxVE/pull/4432))
 | 
			
		||||
    - pingvin.json: fix typo [@warmbo](https://github.com/warmbo) ([#4426](https://github.com/community-scripts/ProxmoxVE/pull/4426))
 | 
			
		||||
 | 
			
		||||
## 2025-05-12
 | 
			
		||||
 | 
			
		||||
### 🆕 New Scripts
 | 
			
		||||
 | 
			
		||||
  - Alpine-Traefik [@MickLesk](https://github.com/MickLesk) ([#4412](https://github.com/community-scripts/ProxmoxVE/pull/4412))
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - Alpine: Use onliner for updates [@tremor021](https://github.com/tremor021) ([#4414](https://github.com/community-scripts/ProxmoxVE/pull/4414))
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - homarr: fetch versions dynamically from source repo [@CrazyWolf13](https://github.com/CrazyWolf13) ([#4409](https://github.com/community-scripts/ProxmoxVE/pull/4409))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - Feature: LXC-Delete (pve helper): add "all items" [@MickLesk](https://github.com/MickLesk) ([#4296](https://github.com/community-scripts/ProxmoxVE/pull/4296))
 | 
			
		||||
 | 
			
		||||
### 🧰 Maintenance
 | 
			
		||||
 | 
			
		||||
  - #### 💾 Core
 | 
			
		||||
 | 
			
		||||
    - Config file Function in build.func [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4411](https://github.com/community-scripts/ProxmoxVE/pull/4411))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
  - #### 📝 Script Information
 | 
			
		||||
 | 
			
		||||
    - Navidrome - Fix config path (use /etc/ instead of /var/lib) [@quake1508](https://github.com/quake1508) ([#4406](https://github.com/community-scripts/ProxmoxVE/pull/4406))
 | 
			
		||||
 | 
			
		||||
## 2025-05-11
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Zammad: Enable ElasticSearch service [@tremor021](https://github.com/tremor021) ([#4391](https://github.com/community-scripts/ProxmoxVE/pull/4391))
 | 
			
		||||
 | 
			
		||||
## 2025-05-10
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - (fix) Documenso: fix build failures [@vhsdream](https://github.com/vhsdream) ([#4382](https://github.com/community-scripts/ProxmoxVE/pull/4382))
 | 
			
		||||
    - Jellyseerr: better handling of node and pnpm [@MickLesk](https://github.com/MickLesk) ([#4365](https://github.com/community-scripts/ProxmoxVE/pull/4365))
 | 
			
		||||
 | 
			
		||||
## 2025-05-09
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 
 | 
			
		||||
@@ -20,21 +20,20 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    msg_info "Updating Alpine Packages"
 | 
			
		||||
    $STD apk update
 | 
			
		||||
    $STD apk upgrade
 | 
			
		||||
    msg_ok "Updated Alpine Packages"
 | 
			
		||||
  header_info
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating AdGuard Home"
 | 
			
		||||
    $STD /opt/AdGuardHome/AdGuardHome --update
 | 
			
		||||
    msg_ok "Updated AdGuard Home"
 | 
			
		||||
  msg_info "Updating AdGuard Home"
 | 
			
		||||
  $STD /opt/AdGuardHome/AdGuardHome --update
 | 
			
		||||
  msg_ok "Updated AdGuard Home"
 | 
			
		||||
 | 
			
		||||
    msg_info "Restarting AdGuard Home"
 | 
			
		||||
    $STD rc-service adguardhome restart
 | 
			
		||||
    msg_ok "Restarted AdGuard Home"
 | 
			
		||||
  msg_info "Restarting AdGuard Home"
 | 
			
		||||
  $STD rc-service adguardhome restart
 | 
			
		||||
  msg_ok "Restarted AdGuard Home"
 | 
			
		||||
 | 
			
		||||
    exit 0
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    case $CHOICE in
 | 
			
		||||
    1)
 | 
			
		||||
      apk update && apk upgrade
 | 
			
		||||
      $STD apk -U upgrade
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
@@ -47,4 +47,4 @@ start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										62
									
								
								ct/alpine-gatus.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								ct/alpine-gatus.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
#!/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/TwiN/gatus
 | 
			
		||||
 | 
			
		||||
APP="Alpine-gatus"
 | 
			
		||||
var_tags="${var_tags:-alpine;monitoring}"
 | 
			
		||||
var_cpu="${var_cpu:-1}"
 | 
			
		||||
var_ram="${var_ram:-256}"
 | 
			
		||||
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() {
 | 
			
		||||
  header_info
 | 
			
		||||
 | 
			
		||||
  if [[ ! -d /opt/gatus ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [ "${RELEASE}" != "$(cat /opt/gatus_version.txt)" ] || [ ! -f /opt/gatus_version.txt ]; then
 | 
			
		||||
    msg_info "Updating ${APP} LXC"
 | 
			
		||||
    $STD apk -U upgrade
 | 
			
		||||
    $STD service gatus stop
 | 
			
		||||
    mv /opt/gatus/config/config.yaml /opt
 | 
			
		||||
    rm -rf /opt/gatus/*
 | 
			
		||||
    temp_file=$(mktemp)
 | 
			
		||||
    curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
			
		||||
    tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
 | 
			
		||||
    cd /opt/gatus
 | 
			
		||||
    $STD go mod tidy
 | 
			
		||||
    CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
 | 
			
		||||
    setcap CAP_NET_RAW+ep gatus
 | 
			
		||||
    mv /opt/config.yaml config
 | 
			
		||||
    rm -f "$temp_file"
 | 
			
		||||
    echo "${RELEASE}" >/opt/gatus_version.txt
 | 
			
		||||
    $STD service gatus start
 | 
			
		||||
    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}:8080${CL}"
 | 
			
		||||
@@ -20,19 +20,18 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    msg_info "Updating Alpine Packages"
 | 
			
		||||
    apk update
 | 
			
		||||
    apk upgrade
 | 
			
		||||
    msg_ok "Updated Alpine Packages"
 | 
			
		||||
  header_info
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating Gitea"
 | 
			
		||||
    apk upgrade gitea
 | 
			
		||||
    msg_ok "Updated Gitea"
 | 
			
		||||
  msg_info "Updating Gitea"
 | 
			
		||||
  apk upgrade gitea
 | 
			
		||||
  msg_ok "Updated Gitea"
 | 
			
		||||
 | 
			
		||||
    msg_info "Restarting Gitea"
 | 
			
		||||
    rc-service gitea restart
 | 
			
		||||
    msg_ok "Restarted Gitea"
 | 
			
		||||
  msg_info "Restarting Gitea"
 | 
			
		||||
  rc-service gitea restart
 | 
			
		||||
  msg_ok "Restarted Gitea"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
@@ -42,4 +41,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,7 @@ function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    case $CHOICE in
 | 
			
		||||
    1)
 | 
			
		||||
      apk update && apk upgrade
 | 
			
		||||
      $STD apk -U upgrade
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    2)
 | 
			
		||||
@@ -62,4 +62,4 @@ description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${APP} should be reachable by going to the following URL.
 | 
			
		||||
         ${BL}http://${IP}:3000${CL} \n"
 | 
			
		||||
         ${BL}http://${IP}:3000${CL} \n"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,20 +20,19 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    msg_info "Updating Alpine Packages"
 | 
			
		||||
    $STD apk update
 | 
			
		||||
    $STD apk upgrade
 | 
			
		||||
    msg_ok "Updated Alpine Packages"
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating MariaDB"
 | 
			
		||||
    $STD apk upgrade mariadb mariadb-client
 | 
			
		||||
    msg_ok "Updated MariaDB"
 | 
			
		||||
  msg_info "Updating MariaDB"
 | 
			
		||||
  $STD apk upgrade mariadb mariadb-client
 | 
			
		||||
  msg_ok "Updated MariaDB"
 | 
			
		||||
 | 
			
		||||
    msg_info "Restarting MariaDB"
 | 
			
		||||
    $STD rc-service mariadb restart
 | 
			
		||||
    msg_ok "Restarted MariaDB"
 | 
			
		||||
  msg_info "Restarting MariaDB"
 | 
			
		||||
  $STD rc-service mariadb restart
 | 
			
		||||
  msg_ok "Restarted MariaDB"
 | 
			
		||||
 | 
			
		||||
    exit 0
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -20,24 +20,23 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    msg_info "Updating Alpine Packages"
 | 
			
		||||
    $STD apk update
 | 
			
		||||
    $STD apk upgrade
 | 
			
		||||
    msg_ok "Updated Alpine Packages"
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating Node.js and npm"
 | 
			
		||||
    $STD apk upgrade nodejs npm
 | 
			
		||||
    msg_ok "Updated Node.js and npm"
 | 
			
		||||
  msg_info "Updating Node.js and npm"
 | 
			
		||||
  $STD apk upgrade nodejs npm
 | 
			
		||||
  msg_ok "Updated Node.js and npm"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating Node-RED"
 | 
			
		||||
    $STD npm install -g --unsafe-perm node-red
 | 
			
		||||
    msg_ok "Updated Node-RED"
 | 
			
		||||
  msg_info "Updating Node-RED"
 | 
			
		||||
  $STD npm install -g --unsafe-perm node-red
 | 
			
		||||
  msg_ok "Updated Node-RED"
 | 
			
		||||
 | 
			
		||||
    msg_info "Restarting Node-RED"
 | 
			
		||||
    $STD rc-service nodered restart
 | 
			
		||||
    msg_ok "Restarted Node-RED"
 | 
			
		||||
  msg_info "Restarting Node-RED"
 | 
			
		||||
  $STD rc-service nodered restart
 | 
			
		||||
  msg_ok "Restarted Node-RED"
 | 
			
		||||
 | 
			
		||||
    exit 0
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -21,8 +21,7 @@ catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk update
 | 
			
		||||
  $STD apk upgrade
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating PostgreSQL"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,20 +20,19 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    msg_info "Updating Alpine Packages"
 | 
			
		||||
    $STD apk update
 | 
			
		||||
    $STD apk upgrade
 | 
			
		||||
    msg_ok "Updated Alpine Packages"
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating Prometheus"
 | 
			
		||||
    $STD apk upgrade prometheus
 | 
			
		||||
    msg_ok "Updated Prometheus"
 | 
			
		||||
  msg_info "Updating Prometheus"
 | 
			
		||||
  $STD apk upgrade prometheus
 | 
			
		||||
  msg_ok "Updated Prometheus"
 | 
			
		||||
 | 
			
		||||
    msg_info "Restarting Prometheus"
 | 
			
		||||
    $STD rc-service prometheus restart
 | 
			
		||||
    msg_ok "Restarted Prometheus"
 | 
			
		||||
  msg_info "Restarting Prometheus"
 | 
			
		||||
  $STD rc-service prometheus restart
 | 
			
		||||
  msg_ok "Restarted Prometheus"
 | 
			
		||||
 | 
			
		||||
    exit 0
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,6 @@ function update_script() {
 | 
			
		||||
    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"
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,7 @@ function update_script() {
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk update
 | 
			
		||||
  $STD apk upgrade
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
  msg_info "Updating tinyauth"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								ct/alpine-traefik.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								ct/alpine-traefik.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
#!/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://alpinelinux.org/
 | 
			
		||||
 | 
			
		||||
APP="Alpine-Traefik"
 | 
			
		||||
var_tags="${var_tags:-os;alpine}"
 | 
			
		||||
var_cpu="${var_cpu:-1}"
 | 
			
		||||
var_ram="${var_ram:-512}"
 | 
			
		||||
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
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
  msg_info "Upgrading traefik from edge"
 | 
			
		||||
  $STD apk add traefik --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
 | 
			
		||||
  msg_ok "Upgraded traefik"
 | 
			
		||||
  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} WebUI Access (if configured) - using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/dashboard${CL}"
 | 
			
		||||
@@ -37,14 +37,15 @@ function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    case $CHOICE in
 | 
			
		||||
    1)
 | 
			
		||||
      apk update && apk upgrade && rc-service vaultwarden restart -q
 | 
			
		||||
      $STD apk -U upgrade
 | 
			
		||||
      rc-service vaultwarden restart -q
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    2)
 | 
			
		||||
      if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Setup your ADMIN_TOKEN (make it strong)" 10 58 3>&1 1>&2 2>&3); then
 | 
			
		||||
        if [[ -z "$NEWTOKEN" ]]; then exit-script; fi
 | 
			
		||||
        if ! command -v argon2 >/dev/null 2>&1; then apk add argon2 &>/dev/null; fi
 | 
			
		||||
        TOKEN=$(echo -n ${NEWTOKEN} | argon2 "$(openssl rand -base64 32)" -e -id -k 19456 -t 2 -p 1)
 | 
			
		||||
        TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -e -id -k 19456 -t 2 -p 1)
 | 
			
		||||
        if [[ ! -f /var/lib/vaultwarden/config.json ]]; then
 | 
			
		||||
          sed -i "s|export ADMIN_TOKEN=.*|export ADMIN_TOKEN='${TOKEN}'|" /etc/conf.d/vaultwarden
 | 
			
		||||
        else
 | 
			
		||||
@@ -65,4 +66,4 @@ description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${APP} should be reachable by going to the following URL.
 | 
			
		||||
         ${BL}http://${IP}:8000${CL} \n"
 | 
			
		||||
         ${BL}http://${IP}:8000${CL} \n"
 | 
			
		||||
 
 | 
			
		||||
@@ -21,8 +21,7 @@ catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
  msg_info "Updating Alpine Packages"
 | 
			
		||||
  $STD apk update
 | 
			
		||||
  $STD apk upgrade
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Alpine Packages"
 | 
			
		||||
 | 
			
		||||
  msg_info "update wireguard-tools"
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    case $CHOICE in
 | 
			
		||||
    1)
 | 
			
		||||
      apk update && apk upgrade
 | 
			
		||||
      $STD apk -U upgrade
 | 
			
		||||
      exit
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
@@ -47,4 +47,4 @@ start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
  header_info
 | 
			
		||||
  if [ "$UPD" == "1" ]; then
 | 
			
		||||
    apk update && apk upgrade
 | 
			
		||||
    $STD apk -U upgrade
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								ct/asterisk.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								ct/asterisk.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
#!/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: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://asterisk.org/
 | 
			
		||||
 | 
			
		||||
APP="Asterisk"
 | 
			
		||||
var_tags="${var_tags:-telephone;pbx}"
 | 
			
		||||
var_cpu="${var_cpu:-2}"
 | 
			
		||||
var_ram="${var_ram:-2048}"
 | 
			
		||||
var_disk="${var_disk:-4}"
 | 
			
		||||
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
 | 
			
		||||
    msg_error "No Update function provided for ${APP} LXC"
 | 
			
		||||
    exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
build_container
 | 
			
		||||
description
 | 
			
		||||
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
@@ -39,9 +39,9 @@ function update_script() {
 | 
			
		||||
    unzip -q "/opt/BookStack-${RELEASE}.zip" -d /opt
 | 
			
		||||
    mv "/opt/BookStack-${RELEASE}" /opt/bookstack
 | 
			
		||||
    cp /opt/bookstack-backup/.env /opt/bookstack/.env
 | 
			
		||||
    cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ || true
 | 
			
		||||
    cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ || true
 | 
			
		||||
    cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ || true
 | 
			
		||||
    [[ -d /opt/bookstack-backup/public/uploads ]] && cp -a /opt/bookstack-backup/public/uploads/. /opt/bookstack/public/uploads/
 | 
			
		||||
    [[ -d /opt/bookstack-backup/storage/uploads ]] && cp -a /opt/bookstack-backup/storage/uploads/. /opt/bookstack/storage/uploads/
 | 
			
		||||
    [[ -d /opt/bookstack-backup/themes ]] && cp -a /opt/bookstack-backup/themes/. /opt/bookstack/themes/
 | 
			
		||||
    cd /opt/bookstack
 | 
			
		||||
    export COMPOSER_ALLOW_SUPERUSER=1
 | 
			
		||||
    $STD composer install --no-dev
 | 
			
		||||
 
 | 
			
		||||
@@ -20,46 +20,51 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    header_info
 | 
			
		||||
    check_container_storage
 | 
			
		||||
    check_container_resources
 | 
			
		||||
    if [[ ! -d /opt/documenso ]]; then
 | 
			
		||||
        msg_error "No ${APP} Installation Found!"
 | 
			
		||||
        exit
 | 
			
		||||
    fi
 | 
			
		||||
    RELEASE=$(curl -fsSL https://api.github.com/repos/documenso/documenso/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
    if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
        msg_info "Stopping ${APP}"
 | 
			
		||||
        systemctl stop documenso
 | 
			
		||||
        msg_ok "${APP} Stopped"
 | 
			
		||||
 | 
			
		||||
        msg_info "Updating ${APP} to ${RELEASE}"
 | 
			
		||||
        cp /opt/documenso/.env /opt/
 | 
			
		||||
        rm -rf /opt/documenso
 | 
			
		||||
        cd /opt
 | 
			
		||||
        curl -fsSL "https://github.com/documenso/documenso/archive/refs/tags/v${RELEASE}.zip" -o v${RELEASE}.zip
 | 
			
		||||
        unzip -q v${RELEASE}.zip
 | 
			
		||||
        mv documenso-${RELEASE} /opt/documenso
 | 
			
		||||
        cd /opt/documenso
 | 
			
		||||
        mv /opt/.env /opt/documenso/.env
 | 
			
		||||
        $STD npm install
 | 
			
		||||
        $STD npm run build:web
 | 
			
		||||
        $STD npm run prisma:migrate-deploy
 | 
			
		||||
        echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
        msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Starting ${APP}"
 | 
			
		||||
        systemctl start documenso
 | 
			
		||||
        msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
        msg_info "Cleaning Up"
 | 
			
		||||
        rm -rf /opt/v${RELEASE}.zip
 | 
			
		||||
        msg_ok "Cleaned"
 | 
			
		||||
        msg_ok "Updated Successfully"
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
    fi
 | 
			
		||||
  header_info
 | 
			
		||||
  check_container_storage
 | 
			
		||||
  check_container_resources
 | 
			
		||||
  if [[ ! -d /opt/documenso ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -fsSL https://api.github.com/repos/documenso/documenso/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ ! -f /opt/${APP}_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP}"
 | 
			
		||||
    systemctl stop documenso
 | 
			
		||||
    msg_ok "${APP} Stopped"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to ${RELEASE}"
 | 
			
		||||
    cp /opt/documenso/.env /opt/
 | 
			
		||||
    rm -rf /opt/documenso
 | 
			
		||||
    cd /opt
 | 
			
		||||
    curl -fsSL "https://github.com/documenso/documenso/archive/refs/tags/v${RELEASE}.zip" -o v${RELEASE}.zip
 | 
			
		||||
    unzip -q v${RELEASE}.zip
 | 
			
		||||
    mv documenso-${RELEASE} /opt/documenso
 | 
			
		||||
    cd /opt/documenso
 | 
			
		||||
    mv /opt/.env /opt/documenso/.env
 | 
			
		||||
    export TURBO_CACHE=1
 | 
			
		||||
    export NEXT_TELEMETRY_DISABLED=1
 | 
			
		||||
    export CYPRESS_INSTALL_BINARY=0
 | 
			
		||||
    export NODE_OPTIONS="--max-old-space-size=4096"
 | 
			
		||||
    $STD npm ci
 | 
			
		||||
    $STD turbo run build --filter=@documenso/remix
 | 
			
		||||
    $STD npm run prisma:migrate-deploy
 | 
			
		||||
    $STD turbo daemon stop
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP}"
 | 
			
		||||
    systemctl start documenso
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -rf /opt/v${RELEASE}.zip
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${RELEASE}"
 | 
			
		||||
  fi
 | 
			
		||||
  exit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										75
									
								
								ct/gatus.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								ct/gatus.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: Slaviša Arežina (tremor021)
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/TwiN/gatus
 | 
			
		||||
 | 
			
		||||
APP="gatus"
 | 
			
		||||
var_tags="${var_tags:-monitoring}"
 | 
			
		||||
var_cpu="${var_cpu:-1}"
 | 
			
		||||
var_ram="${var_ram:-1024}"
 | 
			
		||||
var_disk="${var_disk:-4}"
 | 
			
		||||
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/gatus ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
  if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
    msg_info "Updating $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Stopping $APP"
 | 
			
		||||
    systemctl stop gatus
 | 
			
		||||
    msg_ok "Stopped $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating $APP to v${RELEASE}"
 | 
			
		||||
    mv /opt/gatus/config/config.yaml /opt
 | 
			
		||||
    rm -rf /opt/gatus/*
 | 
			
		||||
    temp_file=$(mktemp)
 | 
			
		||||
    curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
			
		||||
    tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
 | 
			
		||||
    cd /opt/gatus
 | 
			
		||||
    $STD go mod tidy
 | 
			
		||||
    CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
 | 
			
		||||
    setcap CAP_NET_RAW+ep gatus
 | 
			
		||||
    mv /opt/config.yaml config
 | 
			
		||||
    echo "${RELEASE}" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated $APP to v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting $APP"
 | 
			
		||||
    systemctl start gatus
 | 
			
		||||
    msg_ok "Started $APP"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -f "$temp_file"
 | 
			
		||||
    msg_ok "Cleanup Completed"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Update Successful"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at 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}:8080${CL}"
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/alpine-gatus
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/alpine-gatus
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ___    __      _                              __            
 | 
			
		||||
   /   |  / /___  (_)___  ___        ____ _____ _/ /___  _______
 | 
			
		||||
  / /| | / / __ \/ / __ \/ _ \______/ __ `/ __ `/ __/ / / / ___/
 | 
			
		||||
 / ___ |/ / /_/ / / / / /  __/_____/ /_/ / /_/ / /_/ /_/ (__  ) 
 | 
			
		||||
/_/  |_/_/ .___/_/_/ /_/\___/      \__, /\__,_/\__/\__,_/____/  
 | 
			
		||||
        /_/                       /____/                        
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/alpine-traefik
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/alpine-traefik
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ___    __      _                ______                _____ __  
 | 
			
		||||
   /   |  / /___  (_)___  ___      /_  __/________ ____  / __(_) /__
 | 
			
		||||
  / /| | / / __ \/ / __ \/ _ \______/ / / ___/ __ `/ _ \/ /_/ / //_/
 | 
			
		||||
 / ___ |/ / /_/ / / / / /  __/_____/ / / /  / /_/ /  __/ __/ / ,<   
 | 
			
		||||
/_/  |_/_/ .___/_/_/ /_/\___/     /_/ /_/   \__,_/\___/_/ /_/_/|_|  
 | 
			
		||||
        /_/                                                         
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/asterisk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/asterisk
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
    ___         __            _      __  
 | 
			
		||||
   /   |  _____/ /____  _____(_)____/ /__
 | 
			
		||||
  / /| | / ___/ __/ _ \/ ___/ / ___/ //_/
 | 
			
		||||
 / ___ |(__  ) /_/  __/ /  / (__  ) ,<   
 | 
			
		||||
/_/  |_/____/\__/\___/_/  /_/____/_/|_|  
 | 
			
		||||
                                         
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/gatus
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/gatus
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
                __            
 | 
			
		||||
   ____ _____ _/ /___  _______
 | 
			
		||||
  / __ `/ __ `/ __/ / / / ___/
 | 
			
		||||
 / /_/ / /_/ / /_/ /_/ (__  ) 
 | 
			
		||||
 \__, /\__,_/\__/\__,_/____/  
 | 
			
		||||
/____/                        
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
    __  __                               
 | 
			
		||||
   / / / /___  ____ ___  ____ ___________
 | 
			
		||||
  / /_/ / __ \/ __ `__ \/ __ `/ ___/ ___/
 | 
			
		||||
 / __  / /_/ / / / / / / /_/ / /  / /    
 | 
			
		||||
    __                                   
 | 
			
		||||
   / /_  ____  ____ ___  ____ ___________
 | 
			
		||||
  / __ \/ __ \/ __ `__ \/ __ `/ ___/ ___/
 | 
			
		||||
 / / / / /_/ / / / / / / /_/ / /  / /    
 | 
			
		||||
/_/ /_/\____/_/ /_/ /_/\__,_/_/  /_/     
 | 
			
		||||
                                         
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								ct/headers/odoo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								ct/headers/odoo
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
   ____      __          
 | 
			
		||||
  / __ \____/ /___  ____ 
 | 
			
		||||
 / / / / __  / __ \/ __ \
 | 
			
		||||
/ /_/ / /_/ / /_/ / /_/ /
 | 
			
		||||
\____/\__,_/\____/\____/ 
 | 
			
		||||
                         
 | 
			
		||||
							
								
								
									
										17
									
								
								ct/homarr.sh
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								ct/homarr.sh
									
									
									
									
									
								
							@@ -1,11 +1,11 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
 | 
			
		||||
# Copyright (c) 2021-2025 tteck
 | 
			
		||||
# Author: tteck (tteckster) | Co-Author: MickLesk (Canbiz) | Co-Author: CrazyWolf13
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: CrazyWolf13
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://homarr.dev/
 | 
			
		||||
 | 
			
		||||
APP="Homarr"
 | 
			
		||||
APP="homarr"
 | 
			
		||||
var_tags="${var_tags:-arr;dashboard}"
 | 
			
		||||
var_cpu="${var_cpu:-2}"
 | 
			
		||||
var_ram="${var_ram:-4096}"
 | 
			
		||||
@@ -117,11 +117,12 @@ node apps/nextjs/server.js & PID=$!
 | 
			
		||||
wait $PID
 | 
			
		||||
EOF
 | 
			
		||||
    chmod +x /opt/run_homarr.sh
 | 
			
		||||
curl -fsSL "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip")
 | 
			
		||||
    unzip -q v${RELEASE}.zip
 | 
			
		||||
    rm -rf v${RELEASE}.zip
 | 
			
		||||
    $STD command -v jq || $STD apt-get update && $STD apt-get install -y jq
 | 
			
		||||
    NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
 | 
			
		||||
    NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.packageManager | split("@")[1]')"
 | 
			
		||||
    install_node_and_modules
 | 
			
		||||
    rm -rf /opt/homarr
 | 
			
		||||
    mv homarr-${RELEASE} /opt/homarr
 | 
			
		||||
    fetch_and_deploy_gh_release "homarr-labs/homarr"
 | 
			
		||||
    mv /opt/homarr-data-backup/.env /opt/homarr/.env
 | 
			
		||||
    cd /opt/homarr
 | 
			
		||||
    $STD pnpm install
 | 
			
		||||
@@ -167,4 +168,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7575${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7575${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ function update_script() {
 | 
			
		||||
    msg_info "Updating All Containers"
 | 
			
		||||
    CONTAINER_LIST="${1:-$(docker ps -q)}"
 | 
			
		||||
    for container in ${CONTAINER_LIST}; do
 | 
			
		||||
      CONTAINER_IMAGE="$(docker inspect --format "{{.Config.Image}}" --type container ${container})"
 | 
			
		||||
      CONTAINER_IMAGE="$(docker inspect --format "{{.Config.Image}}" --type container "${container}")"
 | 
			
		||||
      RUNNING_IMAGE="$(docker inspect --format "{{.Image}}" --type container "${container}")"
 | 
			
		||||
      docker pull "${CONTAINER_IMAGE}"
 | 
			
		||||
      LATEST_IMAGE="$(docker inspect --format "{{.Id}}" --type image "${CONTAINER_IMAGE}")"
 | 
			
		||||
@@ -47,7 +47,7 @@ function update_script() {
 | 
			
		||||
        echo "Updating ${container} image ${CONTAINER_IMAGE}"
 | 
			
		||||
        DOCKER_COMMAND="$(runlike --use-volume-id "${container}")"
 | 
			
		||||
        docker rm --force "${container}"
 | 
			
		||||
        eval ${DOCKER_COMMAND}
 | 
			
		||||
        eval "${DOCKER_COMMAND}"
 | 
			
		||||
      fi
 | 
			
		||||
    done
 | 
			
		||||
    msg_ok "Updated All Containers"
 | 
			
		||||
@@ -109,4 +109,4 @@ 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}HA: http://${IP}:8123${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}Portainer: http://${IP}:9443${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}Portainer: https://${IP}:9443${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -53,10 +53,10 @@ function update_script() {
 | 
			
		||||
 | 
			
		||||
    if [ -z "$pnpm_current" ]; then
 | 
			
		||||
        msg_error "pnpm not found. Installing version $pnpm_desired..."
 | 
			
		||||
        $STD npm install -g pnpm@"$pnpm_desired"
 | 
			
		||||
        NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" install_node_and_modules
 | 
			
		||||
    elif ! node -e "const semver = require('semver'); process.exit(semver.satisfies('$pnpm_current', '$pnpm_desired') ? 0 : 1)"; then
 | 
			
		||||
        msg_error "Updating pnpm from version $pnpm_current to $pnpm_desired..."
 | 
			
		||||
        $STD npm install -g pnpm@"$pnpm_desired"
 | 
			
		||||
        NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" install_node_and_modules
 | 
			
		||||
    else
 | 
			
		||||
        msg_ok "pnpm is already installed and satisfies version $pnpm_desired."
 | 
			
		||||
    fi
 | 
			
		||||
@@ -103,4 +103,4 @@ description
 | 
			
		||||
msg_ok "Completed Successfully!\n"
 | 
			
		||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
 | 
			
		||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}"
 | 
			
		||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,32 +20,32 @@ color
 | 
			
		||||
catch_errors
 | 
			
		||||
 | 
			
		||||
function update_script() {
 | 
			
		||||
    UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE MODE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 14 60 2 \
 | 
			
		||||
        "1" "Check for Alpine Updates" OFF \
 | 
			
		||||
        "2" "Update NPMplus Docker Container" ON \
 | 
			
		||||
        3>&1 1>&2 2>&3)
 | 
			
		||||
  UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE MODE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 14 60 2 \
 | 
			
		||||
    "1" "Check for Alpine Updates" OFF \
 | 
			
		||||
    "2" "Update NPMplus Docker Container" ON \
 | 
			
		||||
    3>&1 1>&2 2>&3)
 | 
			
		||||
 | 
			
		||||
    header_info "$APP"
 | 
			
		||||
  header_info "$APP"
 | 
			
		||||
 | 
			
		||||
    case "$UPD" in
 | 
			
		||||
    "1")
 | 
			
		||||
        msg_info "Updating Alpine OS"
 | 
			
		||||
        apk update && apk upgrade
 | 
			
		||||
        msg_ok "System updated"
 | 
			
		||||
        exit
 | 
			
		||||
        ;;
 | 
			
		||||
    "2")
 | 
			
		||||
        msg_info "Updating NPMplus Container"
 | 
			
		||||
        cd /opt
 | 
			
		||||
        msg_info "Pulling latest container image"
 | 
			
		||||
        $STD docker compose pull
 | 
			
		||||
        msg_info "Recreating container"
 | 
			
		||||
        $STD docker compose up -d
 | 
			
		||||
        msg_ok "NPMplus container updated"
 | 
			
		||||
        exit
 | 
			
		||||
        ;;
 | 
			
		||||
    esac
 | 
			
		||||
    exit 0
 | 
			
		||||
  case "$UPD" in
 | 
			
		||||
  "1")
 | 
			
		||||
    msg_info "Updating Alpine OS"
 | 
			
		||||
    $STD apk -U upgrade
 | 
			
		||||
    msg_ok "System updated"
 | 
			
		||||
    exit
 | 
			
		||||
    ;;
 | 
			
		||||
  "2")
 | 
			
		||||
    msg_info "Updating NPMplus Container"
 | 
			
		||||
    cd /opt
 | 
			
		||||
    msg_info "Pulling latest container image"
 | 
			
		||||
    $STD docker compose pull
 | 
			
		||||
    msg_info "Recreating container"
 | 
			
		||||
    $STD docker compose up -d
 | 
			
		||||
    msg_ok "NPMplus container updated"
 | 
			
		||||
    exit
 | 
			
		||||
    ;;
 | 
			
		||||
  esac
 | 
			
		||||
  exit 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										71
									
								
								ct/odoo.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								ct/odoo.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
#!/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/odoo/odoo
 | 
			
		||||
 | 
			
		||||
APP="Odoo"
 | 
			
		||||
var_tags="${var_tags:-erp}"
 | 
			
		||||
var_disk="${var_disk:-6}"
 | 
			
		||||
var_cpu="${var_cpu:-2}"
 | 
			
		||||
var_ram="${var_ram:-2048}"
 | 
			
		||||
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 [[ ! -f /etc/odoo/odoo.conf ]]; then
 | 
			
		||||
    msg_error "No ${APP} Installation Found!"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
 | 
			
		||||
  LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
 | 
			
		||||
    grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |
 | 
			
		||||
    sed -E "s/odoo_(${RELEASE}\.[0-9]+)_all\.deb/\1/" |
 | 
			
		||||
    sort -V |
 | 
			
		||||
    tail -n1)
 | 
			
		||||
 | 
			
		||||
  if [[ "${LATEST_VERSION}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
 | 
			
		||||
    msg_info "Stopping ${APP} service"
 | 
			
		||||
    systemctl stop odoo
 | 
			
		||||
    msg_ok "Stopped ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Updating ${APP} to ${LATEST_VERSION}"
 | 
			
		||||
    curl -fsSL https://nightly.odoo.com/${RELEASE}/nightly/deb/odoo_${RELEASE}.latest_all.deb -o /opt/odoo.deb
 | 
			
		||||
    $STD apt install -y /opt/odoo.deb
 | 
			
		||||
    echo "$LATEST_VERSION" >/opt/${APP}_version.txt
 | 
			
		||||
    msg_ok "Updated ${APP} to ${LATEST_VERSION}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Starting ${APP} service"
 | 
			
		||||
    systemctl start odoo
 | 
			
		||||
    msg_ok "Started ${APP}"
 | 
			
		||||
 | 
			
		||||
    msg_info "Cleaning Up"
 | 
			
		||||
    rm -f /opt/odoo.deb
 | 
			
		||||
    msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Updated Successfully"
 | 
			
		||||
  else
 | 
			
		||||
    msg_ok "No update required. ${APP} is already at ${LATEST_VERSION}"
 | 
			
		||||
  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}:8069${CL}"
 | 
			
		||||
@@ -49,7 +49,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type": "info",
 | 
			
		||||
      "text": "`htpasswd -b -B /opt/rclone/login.pwd newuser newuserpassword` to add more users."
 | 
			
		||||
      "text": "`htpasswd -b -B /opt/login.pwd newuser newuserpassword` to add more users."
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "To Update Alpine: `apk update && apk upgrade`",
 | 
			
		||||
      "text": "To Update Alpine: `apk -U upgrade`",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								frontend/public/json/asterisk.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								frontend/public/json/asterisk.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "Asterisk",
 | 
			
		||||
  "slug": "asterisk",
 | 
			
		||||
  "categories": [0],
 | 
			
		||||
  "date_created": "2025-05-14",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": false,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": null,
 | 
			
		||||
  "documentation": "https://docs.asterisk.org/",
 | 
			
		||||
  "config_path": "/etc/asterisk",
 | 
			
		||||
  "website": "https://asterisk.org/",
 | 
			
		||||
  "logo": "https://docs.asterisk.org/favicon.ico",
 | 
			
		||||
  "description": "Asterisk is an open-source framework for building communications applications, most commonly used as a phone system (PBX). Developed by Digium (now part of Sangoma), it turns a standard computer into a powerful telephony server.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/asterisk.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 4,
 | 
			
		||||
        "os": "Debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								frontend/public/json/documenso.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								frontend/public/json/documenso.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "Documenso",
 | 
			
		||||
  "slug": "documenso",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    12
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-05-14",
 | 
			
		||||
  "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": []
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										46
									
								
								frontend/public/json/gatus.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								frontend/public/json/gatus.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "gatus",
 | 
			
		||||
  "slug": "gatus",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    9
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-05-13",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 8080,
 | 
			
		||||
  "documentation": "https://gatus.io/docs",
 | 
			
		||||
  "website": "https://gatus.io/",
 | 
			
		||||
  "logo": "https://raw.githubusercontent.com/TwiN/gatus/refs/heads/master/web/static/img/logo.svg",
 | 
			
		||||
  "config_path": "/opt/gatus/config/config.yaml",
 | 
			
		||||
  "description": "Gatus is a developer-oriented health dashboard that gives you the ability to monitor your services using HTTP, ICMP, TCP, and even DNS queries as well as evaluate the result of said queries by using a list of conditions on values like the status code, the response time, the certificate expiration, the body and many others. The icing on top is that each of these health checks can be paired with alerting via Slack, Teams, PagerDuty, Discord, Twilio and many more.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/gatus.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 512,
 | 
			
		||||
        "hdd": 4,
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "type": "alpine",
 | 
			
		||||
      "script": "ct/alpine-gatus.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 1,
 | 
			
		||||
        "ram": 256,
 | 
			
		||||
        "hdd": 3,
 | 
			
		||||
        "os": "alpine",
 | 
			
		||||
        "version": "3.21"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
}
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
            "type": "warning"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "text": "Use Ubuntu 24.10 ONLY",
 | 
			
		||||
            "text": "Deprecation-Warning: This Core-based setup will be deprecated by August 2025. Use Home Assistant OS is strongly recommended to ensure long-term stability and updates.",
 | 
			
		||||
            "type": "warning"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
  "documentation": "https://jellyfin.org/docs/",
 | 
			
		||||
  "website": "https://jellyfin.org/",
 | 
			
		||||
  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/jellyfin.svg",
 | 
			
		||||
  "config_path": "/root/.config/jellyfin",
 | 
			
		||||
  "config_path": "/etc/jellyfin/",
 | 
			
		||||
  "description": "Jellyfin is a free and open-source media server and suite of multimedia applications designed to organize, manage, and share digital media files to networked devices.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
    "documentation": null,
 | 
			
		||||
    "website": "https://www.navidrome.org/",
 | 
			
		||||
    "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/navidrome.svg",
 | 
			
		||||
    "config_path": "/var/lib/navidrome/navidrome.toml",
 | 
			
		||||
    "config_path": "/etc/navidrome/navidrome.toml",
 | 
			
		||||
    "description": "Navidrome is a music server solution that makes your music collection accessible from anywhere. It provides a modern web-based user interface and compatibility with a range of third-party mobile apps for both iOS and Android devices. With Navidrome, users can access their music collection from anywhere, whether at home or on the go. The software supports a variety of music formats, making it easy for users to play their favorite songs and albums. Navidrome provides a simple and user-friendly interface for managing and organizing music collections, making it a valuable tool for music lovers who want to access their music from anywhere. The software is designed to be easy to set up and use, making it a popular choice for those who want to host their own music server and enjoy their music collection from anywhere.",
 | 
			
		||||
    "install_methods": [
 | 
			
		||||
        {
 | 
			
		||||
@@ -33,7 +33,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "notes": [
 | 
			
		||||
        {
 | 
			
		||||
            "text": "To change Navidrome music folder path, `nano /var/lib/navidrome/navidrome.toml`",
 | 
			
		||||
            "text": "To change Navidrome music folder path, `nano /etc/navidrome/navidrome.toml`",
 | 
			
		||||
            "type": "info"
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								frontend/public/json/odoo.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								frontend/public/json/odoo.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "Odoo",
 | 
			
		||||
  "slug": "odoo",
 | 
			
		||||
  "categories": [
 | 
			
		||||
    25
 | 
			
		||||
  ],
 | 
			
		||||
  "date_created": "2025-05-14",
 | 
			
		||||
  "type": "ct",
 | 
			
		||||
  "updateable": true,
 | 
			
		||||
  "privileged": false,
 | 
			
		||||
  "interface_port": 8069,
 | 
			
		||||
  "documentation": "https://www.odoo.com/en_EN/page/docs",
 | 
			
		||||
  "website": "https://www.odoo.com/",
 | 
			
		||||
  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/odoo.svg",
 | 
			
		||||
  "config_path": "/etc/odoo/odoo.conf",
 | 
			
		||||
  "description": "Odoo is a comprehensive open-source business platform made up of modular apps that cover key areas such as CRM, accounting, inventory, sales, project management, HR, helpdesk, and e-commerce. All modules are tightly integrated, allowing businesses to fully digitize and automate their workflows. Its modular design makes it suitable for both small companies and large enterprises, with flexibility to adapt to different industries. Odoo combines user-friendliness with powerful functionality, offering a unified solution for managing a wide range of business operations.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
      "type": "default",
 | 
			
		||||
      "script": "ct/odoo.sh",
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 6,
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "default_credentials": {
 | 
			
		||||
    "username": "admin",
 | 
			
		||||
    "password": "admin"
 | 
			
		||||
  },
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "Database Credentials: `cat ~/odoo.creds`",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
  "documentation": "https://stonith404.github.io/pingvin-share/introduction",
 | 
			
		||||
  "website": "https://github.com/stonith404/pingvin-share",
 | 
			
		||||
  "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pingvin-share.svg",
 | 
			
		||||
  "config_path": "/opt/pingin-share/config.yaml",
 | 
			
		||||
  "config_path": "/opt/pingvin-share/config.yaml",
 | 
			
		||||
  "description": "Pingvin Share is self-hosted file sharing platform and an alternative for WeTransfer.",
 | 
			
		||||
  "install_methods": [
 | 
			
		||||
    {
 | 
			
		||||
@@ -31,5 +31,10 @@
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "Run `DATA_DIRECTORY=path-to-your-data-directory pm2 restart all --update-env` to update path to your data directory or to update environment variables.",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,17 @@
 | 
			
		||||
                "os": "debian",
 | 
			
		||||
                "version": "12"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            "type": "alpine",
 | 
			
		||||
            "script": "ct/alpine-traefik.sh",
 | 
			
		||||
            "resources": {
 | 
			
		||||
                "cpu": 1,
 | 
			
		||||
                "ram": 512,
 | 
			
		||||
                "hdd": 1,
 | 
			
		||||
                "os": "alpine",
 | 
			
		||||
                "version": "3.21"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "default_credentials": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,284 @@
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "name": "advplyr/audiobookshelf",
 | 
			
		||||
    "version": "v2.22.0",
 | 
			
		||||
    "date": "2025-05-14T22:30:59Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "glanceapp/glance",
 | 
			
		||||
    "version": "v0.8.2",
 | 
			
		||||
    "date": "2025-05-14T21:34:41Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Ombi-app/Ombi",
 | 
			
		||||
    "version": "v4.47.1",
 | 
			
		||||
    "date": "2025-01-05T21:14:23Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Luligu/matterbridge",
 | 
			
		||||
    "version": "3.0.2",
 | 
			
		||||
    "date": "2025-05-14T20:38:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "NodeBB/NodeBB",
 | 
			
		||||
    "version": "v4.4.0",
 | 
			
		||||
    "date": "2025-05-14T20:36:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "esphome/esphome",
 | 
			
		||||
    "version": "2025.4.2",
 | 
			
		||||
    "date": "2025-05-11T22:18:43Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "coder/code-server",
 | 
			
		||||
    "version": "v4.100.1",
 | 
			
		||||
    "date": "2025-05-14T18:08:16Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "MediaBrowser/Emby.Releases",
 | 
			
		||||
    "version": "4.8.11.0",
 | 
			
		||||
    "date": "2025-03-10T06:39:11Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Checkmk/checkmk",
 | 
			
		||||
    "version": "v2.3.0p32+security",
 | 
			
		||||
    "date": "2025-05-14T15:37:55Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Athou/commafeed",
 | 
			
		||||
    "version": "5.9.0",
 | 
			
		||||
    "date": "2025-05-14T15:29:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "juanfont/headscale",
 | 
			
		||||
    "version": "v0.26.0",
 | 
			
		||||
    "date": "2025-05-14T15:12:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "mongodb/mongo",
 | 
			
		||||
    "version": "r6.0.24-alpha0",
 | 
			
		||||
    "date": "2025-05-14T14:52:41Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "motioneye-project/motioneye",
 | 
			
		||||
    "version": "0.42.1",
 | 
			
		||||
    "date": "2020-06-07T07:27:04Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zwave-js/zwave-js-ui",
 | 
			
		||||
    "version": "v10.5.0",
 | 
			
		||||
    "date": "2025-05-14T13:21:21Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "firefly-iii/firefly-iii",
 | 
			
		||||
    "version": "v6.2.12",
 | 
			
		||||
    "date": "2025-04-20T19:22:17Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "jenkinsci/jenkins",
 | 
			
		||||
    "version": "jenkins-2.510",
 | 
			
		||||
    "date": "2025-05-13T18:33:42Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "nzbgetcom/nzbget",
 | 
			
		||||
    "version": "v25.0",
 | 
			
		||||
    "date": "2025-05-12T09:12:04Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "wazuh/wazuh",
 | 
			
		||||
    "version": "coverity-w20-4.13.0",
 | 
			
		||||
    "date": "2025-05-14T12:06:20Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "blakeblackshear/frigate",
 | 
			
		||||
    "version": "v0.14.1",
 | 
			
		||||
    "date": "2024-08-29T22:32:51Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "morpheus65535/bazarr",
 | 
			
		||||
    "version": "v1.5.2",
 | 
			
		||||
    "date": "2025-05-11T16:40:55Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Jackett/Jackett",
 | 
			
		||||
    "version": "v0.22.1895",
 | 
			
		||||
    "date": "2025-05-14T05:59:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "TandoorRecipes/recipes",
 | 
			
		||||
    "version": "2.0.0-alpha-4",
 | 
			
		||||
    "date": "2025-05-14T05:01:45Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "ollama/ollama",
 | 
			
		||||
    "version": "v0.6.9-rc0",
 | 
			
		||||
    "date": "2025-05-10T18:57:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "cross-seed/cross-seed",
 | 
			
		||||
    "version": "v6.12.4",
 | 
			
		||||
    "date": "2025-05-11T11:41:32Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "netbox-community/netbox",
 | 
			
		||||
    "version": "v4.3.1",
 | 
			
		||||
    "date": "2025-05-13T19:45:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pocketbase/pocketbase",
 | 
			
		||||
    "version": "v0.28.1",
 | 
			
		||||
    "date": "2025-05-13T18:45:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "keycloak/keycloak",
 | 
			
		||||
    "version": "26.2.4",
 | 
			
		||||
    "date": "2025-05-08T09:10:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "OctoPrint/OctoPrint",
 | 
			
		||||
    "version": "1.11.1",
 | 
			
		||||
    "date": "2025-05-13T13:32:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "redis/redis",
 | 
			
		||||
    "version": "8.0.1",
 | 
			
		||||
    "date": "2025-05-13T13:31:53Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "theonedev/onedev",
 | 
			
		||||
    "version": "v11.9.6",
 | 
			
		||||
    "date": "2025-05-13T12:16:17Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "element-hq/synapse",
 | 
			
		||||
    "version": "v1.129.0",
 | 
			
		||||
    "date": "2025-05-06T12:28:54Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zabbix/zabbix",
 | 
			
		||||
    "version": "7.2.7rc1",
 | 
			
		||||
    "date": "2025-05-13T11:55:32Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Graylog2/graylog2-server",
 | 
			
		||||
    "version": "6.3.0-alpha.4",
 | 
			
		||||
    "date": "2025-05-13T11:18:29Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zitadel/zitadel",
 | 
			
		||||
    "version": "v2.65.9",
 | 
			
		||||
    "date": "2025-05-13T05:14:39Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "go-gitea/gitea",
 | 
			
		||||
    "version": "v1.23.8",
 | 
			
		||||
    "date": "2025-05-12T22:40:50Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "leiweibau/Pi.Alert",
 | 
			
		||||
    "version": "v2025-05-11",
 | 
			
		||||
    "date": "2025-05-12T19:14:57Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "duplicati/duplicati",
 | 
			
		||||
    "version": "v2.1.0.118-2.1.0.118_canary_2025-05-12",
 | 
			
		||||
    "date": "2025-05-12T18:50:44Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "runtipi/runtipi",
 | 
			
		||||
    "version": "nightly",
 | 
			
		||||
    "date": "2025-05-12T18:39:33Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "neo4j/neo4j",
 | 
			
		||||
    "version": "4.4.43",
 | 
			
		||||
    "date": "2025-05-12T15:33:17Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "usememos/memos",
 | 
			
		||||
    "version": "v0.24.3",
 | 
			
		||||
    "date": "2025-05-12T15:23:21Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "n8n-io/n8n",
 | 
			
		||||
    "version": "n8n@1.91.3",
 | 
			
		||||
    "date": "2025-05-08T12:25:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Paymenter/Paymenter",
 | 
			
		||||
    "version": "v1.1.0",
 | 
			
		||||
    "date": "2025-05-12T14:40:27Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "VictoriaMetrics/VictoriaMetrics",
 | 
			
		||||
    "version": "pmm-6401-v1.117.0",
 | 
			
		||||
    "date": "2025-05-12T13:24:20Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "apache/tika",
 | 
			
		||||
    "version": "3.2.0-rc1",
 | 
			
		||||
    "date": "2025-05-12T13:06:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "mattermost/mattermost",
 | 
			
		||||
    "version": "v10.7.2",
 | 
			
		||||
    "date": "2025-05-12T10:42:32Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "dgtlmoon/changedetection.io",
 | 
			
		||||
    "version": "0.49.17",
 | 
			
		||||
    "date": "2025-05-12T08:48:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "stackblitz-labs/bolt.diy",
 | 
			
		||||
    "version": "1.0.0",
 | 
			
		||||
    "date": "2025-05-12T07:39:23Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "umami-software/umami",
 | 
			
		||||
    "version": "v2.18.1",
 | 
			
		||||
    "date": "2025-05-12T07:16:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "outline/outline",
 | 
			
		||||
    "version": "v0.84.0",
 | 
			
		||||
    "date": "2025-05-11T15:50:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Kozea/Radicale",
 | 
			
		||||
    "version": "v3.5.3",
 | 
			
		||||
    "date": "2025-05-11T15:17:13Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Prowlarr/Prowlarr",
 | 
			
		||||
    "version": "v1.35.1.5034",
 | 
			
		||||
    "date": "2025-04-30T11:02:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "authelia/authelia",
 | 
			
		||||
    "version": "v4.39.3",
 | 
			
		||||
    "date": "2025-05-11T11:12:15Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Radarr/Radarr",
 | 
			
		||||
    "version": "v5.22.4.9896",
 | 
			
		||||
    "date": "2025-04-23T18:51:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "owncast/owncast",
 | 
			
		||||
    "version": "v0.2.3",
 | 
			
		||||
    "date": "2025-05-10T21:14:45Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "open-webui/open-webui",
 | 
			
		||||
    "version": "v0.6.9",
 | 
			
		||||
    "date": "2025-05-10T19:05:02Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Stirling-Tools/Stirling-PDF",
 | 
			
		||||
    "version": "v0.46.1",
 | 
			
		||||
    "date": "2025-05-10T15:39:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pelican-dev/wings",
 | 
			
		||||
    "version": "v1.0.0-beta13",
 | 
			
		||||
@@ -14,51 +294,16 @@
 | 
			
		||||
    "version": "v1.19.1",
 | 
			
		||||
    "date": "2025-05-09T19:15:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "MediaBrowser/Emby.Releases",
 | 
			
		||||
    "version": "4.8.11.0",
 | 
			
		||||
    "date": "2025-03-10T06:39:11Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "home-assistant/core",
 | 
			
		||||
    "version": "2025.5.1",
 | 
			
		||||
    "date": "2025-05-09T15:05:54Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "mattermost/mattermost",
 | 
			
		||||
    "version": "v9.11.15",
 | 
			
		||||
    "date": "2025-05-09T13:48:50Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "crowdsecurity/crowdsec",
 | 
			
		||||
    "version": "v1.6.8",
 | 
			
		||||
    "date": "2025-03-25T13:33:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zitadel/zitadel",
 | 
			
		||||
    "version": "v3.0.4",
 | 
			
		||||
    "date": "2025-05-09T11:38:33Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Jackett/Jackett",
 | 
			
		||||
    "version": "v0.22.1884",
 | 
			
		||||
    "date": "2025-05-09T05:58:40Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "theonedev/onedev",
 | 
			
		||||
    "version": "v11.9.4",
 | 
			
		||||
    "date": "2025-05-09T02:45:16Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "coder/code-server",
 | 
			
		||||
    "version": "v4.99.4",
 | 
			
		||||
    "date": "2025-05-02T18:33:09Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "VictoriaMetrics/VictoriaMetrics",
 | 
			
		||||
    "version": "v1.22.1-victorialogs",
 | 
			
		||||
    "date": "2025-05-08T23:40:19Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pocket-id/pocket-id",
 | 
			
		||||
    "version": "v0.53.0",
 | 
			
		||||
@@ -74,46 +319,11 @@
 | 
			
		||||
    "version": "v25.02.4",
 | 
			
		||||
    "date": "2025-05-08T15:03:17Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "wazuh/wazuh",
 | 
			
		||||
    "version": "v4.12.0",
 | 
			
		||||
    "date": "2025-05-08T13:27:46Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "apache/tomcat",
 | 
			
		||||
    "version": "10.1.41",
 | 
			
		||||
    "date": "2025-05-08T12:45:44Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "n8n-io/n8n",
 | 
			
		||||
    "version": "n8n@1.91.3",
 | 
			
		||||
    "date": "2025-05-08T12:25:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "keycloak/keycloak",
 | 
			
		||||
    "version": "26.2.4",
 | 
			
		||||
    "date": "2025-05-08T09:10:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zwave-js/zwave-js-ui",
 | 
			
		||||
    "version": "v10.4.2",
 | 
			
		||||
    "date": "2025-05-08T08:11:27Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "umami-software/umami",
 | 
			
		||||
    "version": "v2.18.0",
 | 
			
		||||
    "date": "2025-05-08T07:14:55Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "runtipi/runtipi",
 | 
			
		||||
    "version": "v4.0.2",
 | 
			
		||||
    "date": "2025-05-01T16:10:58Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "cross-seed/cross-seed",
 | 
			
		||||
    "version": "v6.12.3",
 | 
			
		||||
    "date": "2025-05-07T20:35:11Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "semaphoreui/semaphore",
 | 
			
		||||
    "version": "v2.14.10",
 | 
			
		||||
@@ -134,11 +344,6 @@
 | 
			
		||||
    "version": "v0.34.1",
 | 
			
		||||
    "date": "2025-03-25T18:11:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "NodeBB/NodeBB",
 | 
			
		||||
    "version": "v4.3.1",
 | 
			
		||||
    "date": "2025-05-07T15:38:20Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "donaldzou/WGDashboard",
 | 
			
		||||
    "version": "v4.2.3",
 | 
			
		||||
@@ -154,21 +359,11 @@
 | 
			
		||||
    "version": "v5.7.5",
 | 
			
		||||
    "date": "2025-05-07T14:01:45Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Graylog2/graylog2-server",
 | 
			
		||||
    "version": "6.3.0-alpha.3",
 | 
			
		||||
    "date": "2025-05-07T13:58:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "glpi-project/glpi",
 | 
			
		||||
    "version": "10.0.18",
 | 
			
		||||
    "date": "2025-02-12T11:07:02Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "nzbgetcom/nzbget",
 | 
			
		||||
    "version": "v24.8",
 | 
			
		||||
    "date": "2025-03-18T07:33:51Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "ZoeyVid/NPMplus",
 | 
			
		||||
    "version": "2025-05-07-r1",
 | 
			
		||||
@@ -179,11 +374,6 @@
 | 
			
		||||
    "version": "v2.36.0",
 | 
			
		||||
    "date": "2025-05-07T11:54:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Checkmk/checkmk",
 | 
			
		||||
    "version": "v2.2.0p42-rc1",
 | 
			
		||||
    "date": "2025-05-07T11:50:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "openobserve/openobserve",
 | 
			
		||||
    "version": "v0.14.7",
 | 
			
		||||
@@ -199,46 +389,21 @@
 | 
			
		||||
    "version": "338",
 | 
			
		||||
    "date": "2025-05-07T10:43:29Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zabbix/zabbix",
 | 
			
		||||
    "version": "7.4.0beta2",
 | 
			
		||||
    "date": "2025-05-07T10:39:21Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "jupyter/notebook",
 | 
			
		||||
    "version": "@jupyter-notebook/ui-components@7.5.0-alpha.0",
 | 
			
		||||
    "date": "2025-05-07T09:12:08Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "open-webui/open-webui",
 | 
			
		||||
    "version": "v0.6.7",
 | 
			
		||||
    "date": "2025-05-06T23:08:38Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "influxdata/influxdb",
 | 
			
		||||
    "version": "v1.12.1rc0",
 | 
			
		||||
    "date": "2025-05-06T20:56:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "redis/redis",
 | 
			
		||||
    "version": "8.0.1-int",
 | 
			
		||||
    "date": "2025-05-06T18:40:34Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Athou/commafeed",
 | 
			
		||||
    "version": "5.8.0",
 | 
			
		||||
    "date": "2025-05-06T18:33:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "sysadminsmedia/homebox",
 | 
			
		||||
    "version": "v0.19.0",
 | 
			
		||||
    "date": "2025-05-06T18:05:42Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "jenkinsci/jenkins",
 | 
			
		||||
    "version": "jenkins-2.509",
 | 
			
		||||
    "date": "2025-05-06T15:37:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "MariaDB/server",
 | 
			
		||||
    "version": "mariadb-11.4.6",
 | 
			
		||||
@@ -254,26 +419,11 @@
 | 
			
		||||
    "version": "v0.107.61",
 | 
			
		||||
    "date": "2025-04-22T12:42:26Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "element-hq/synapse",
 | 
			
		||||
    "version": "v1.129.0",
 | 
			
		||||
    "date": "2025-05-06T12:28:54Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Luligu/matterbridge",
 | 
			
		||||
    "version": "3.0.1",
 | 
			
		||||
    "date": "2025-05-06T10:24:43Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "syncthing/syncthing",
 | 
			
		||||
    "version": "v1.29.6",
 | 
			
		||||
    "date": "2025-05-06T07:57:02Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "morpheus65535/bazarr",
 | 
			
		||||
    "version": "v1.5.1",
 | 
			
		||||
    "date": "2025-01-01T16:15:52Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "linkwarden/linkwarden",
 | 
			
		||||
    "version": "v2.10.2",
 | 
			
		||||
@@ -314,16 +464,6 @@
 | 
			
		||||
    "version": "v0.18.0",
 | 
			
		||||
    "date": "2025-05-05T15:34:40Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "apache/tika",
 | 
			
		||||
    "version": "2.9.4",
 | 
			
		||||
    "date": "2025-05-05T15:17:27Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "neo4j/neo4j",
 | 
			
		||||
    "version": "5.26.6",
 | 
			
		||||
    "date": "2025-05-05T13:59:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "traefik/traefik",
 | 
			
		||||
    "version": "v3.4.0",
 | 
			
		||||
@@ -334,11 +474,6 @@
 | 
			
		||||
    "version": "0.203.5",
 | 
			
		||||
    "date": "2025-05-05T06:41:02Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "firefly-iii/firefly-iii",
 | 
			
		||||
    "version": "v6.2.12",
 | 
			
		||||
    "date": "2025-04-20T19:22:17Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "moghtech/komodo",
 | 
			
		||||
    "version": "v1.17.5",
 | 
			
		||||
@@ -349,11 +484,6 @@
 | 
			
		||||
    "version": "debian/12.0.16",
 | 
			
		||||
    "date": "2025-05-04T22:06:15Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "juanfont/headscale",
 | 
			
		||||
    "version": "v0.25.1",
 | 
			
		||||
    "date": "2025-02-25T17:30:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Lidarr/Lidarr",
 | 
			
		||||
    "version": "v2.11.2.4629",
 | 
			
		||||
@@ -364,26 +494,11 @@
 | 
			
		||||
    "version": "v2.0.0.4645",
 | 
			
		||||
    "date": "2017-03-07T18:56:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Prowlarr/Prowlarr",
 | 
			
		||||
    "version": "v1.35.1.5034",
 | 
			
		||||
    "date": "2025-04-30T11:02:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Radarr/Radarr",
 | 
			
		||||
    "version": "v5.22.4.9896",
 | 
			
		||||
    "date": "2025-04-23T18:51:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "bastienwirtz/homer",
 | 
			
		||||
    "version": "v25.05.1",
 | 
			
		||||
    "date": "2025-05-04T12:17:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "ollama/ollama",
 | 
			
		||||
    "version": "v0.6.8",
 | 
			
		||||
    "date": "2025-05-03T22:56:44Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "FreshRSS/FreshRSS",
 | 
			
		||||
    "version": "1.26.2",
 | 
			
		||||
@@ -394,26 +509,11 @@
 | 
			
		||||
    "version": "v25.5.0",
 | 
			
		||||
    "date": "2025-05-03T19:03:17Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "owncast/owncast",
 | 
			
		||||
    "version": "v0.2.2",
 | 
			
		||||
    "date": "2025-05-03T18:45:34Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "rogerfar/rdt-client",
 | 
			
		||||
    "version": "v2.0.111",
 | 
			
		||||
    "date": "2025-05-03T16:25:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "dgtlmoon/changedetection.io",
 | 
			
		||||
    "version": "0.49.16",
 | 
			
		||||
    "date": "2025-05-03T14:44:01Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "blakeblackshear/frigate",
 | 
			
		||||
    "version": "v0.14.1",
 | 
			
		||||
    "date": "2024-08-29T22:32:51Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "kimai/kimai",
 | 
			
		||||
    "version": "2.33.0",
 | 
			
		||||
@@ -444,31 +544,16 @@
 | 
			
		||||
    "version": "v3.5.4",
 | 
			
		||||
    "date": "2025-05-02T13:42:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "motioneye-project/motioneye",
 | 
			
		||||
    "version": "0.42.1",
 | 
			
		||||
    "date": "2020-06-07T07:27:04Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "emqx/emqx",
 | 
			
		||||
    "version": "e5.9.0",
 | 
			
		||||
    "date": "2025-05-02T11:07:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "stackblitz-labs/bolt.diy",
 | 
			
		||||
    "version": "v1.0.0-draft",
 | 
			
		||||
    "date": "2025-05-01T18:33:44Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Koenkk/zigbee2mqtt",
 | 
			
		||||
    "version": "2.3.0",
 | 
			
		||||
    "date": "2025-05-01T18:24:31Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "netbox-community/netbox",
 | 
			
		||||
    "version": "v4.3.0",
 | 
			
		||||
    "date": "2025-05-01T16:46:17Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "WordPress/WordPress",
 | 
			
		||||
    "version": "6.8.1",
 | 
			
		||||
@@ -494,16 +579,6 @@
 | 
			
		||||
    "version": "version/2025.4.0",
 | 
			
		||||
    "date": "2025-04-30T12:34:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Stirling-Tools/Stirling-PDF",
 | 
			
		||||
    "version": "v0.46.0",
 | 
			
		||||
    "date": "2025-04-30T07:05:42Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "go-gitea/gitea",
 | 
			
		||||
    "version": "v1.25.0-dev",
 | 
			
		||||
    "date": "2025-04-28T22:57:56Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "hivemq/hivemq-community-edition",
 | 
			
		||||
    "version": "2025.3",
 | 
			
		||||
@@ -519,11 +594,6 @@
 | 
			
		||||
    "version": "v1.4.7",
 | 
			
		||||
    "date": "2025-04-29T15:00:18Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "esphome/esphome",
 | 
			
		||||
    "version": "2025.4.1",
 | 
			
		||||
    "date": "2025-04-29T02:20:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "henrygd/beszel",
 | 
			
		||||
    "version": "v0.11.1",
 | 
			
		||||
@@ -544,11 +614,6 @@
 | 
			
		||||
    "version": "v1.132.3",
 | 
			
		||||
    "date": "2025-04-28T14:11:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "pocketbase/pocketbase",
 | 
			
		||||
    "version": "v0.27.2",
 | 
			
		||||
    "date": "2025-04-28T12:03:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "FlowiseAI/Flowise",
 | 
			
		||||
    "version": "flowise@2.2.8",
 | 
			
		||||
@@ -559,11 +624,6 @@
 | 
			
		||||
    "version": "v0.24.1",
 | 
			
		||||
    "date": "2025-04-28T08:21:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "advplyr/audiobookshelf",
 | 
			
		||||
    "version": "v2.21.0",
 | 
			
		||||
    "date": "2025-04-27T16:31:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "gotify/server",
 | 
			
		||||
    "version": "v2.6.3",
 | 
			
		||||
@@ -579,16 +639,6 @@
 | 
			
		||||
    "version": "v3.1.9",
 | 
			
		||||
    "date": "2025-03-01T02:24:33Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "TandoorRecipes/recipes",
 | 
			
		||||
    "version": "1.5.34",
 | 
			
		||||
    "date": "2025-03-27T16:17:38Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "leiweibau/Pi.Alert",
 | 
			
		||||
    "version": "v2025-04-26",
 | 
			
		||||
    "date": "2025-04-26T14:16:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "openhab/openhab-core",
 | 
			
		||||
    "version": "4.3.5",
 | 
			
		||||
@@ -604,16 +654,6 @@
 | 
			
		||||
    "version": "v13.6.0",
 | 
			
		||||
    "date": "2025-04-26T10:21:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "duplicati/duplicati",
 | 
			
		||||
    "version": "v2.1.0.117-2.1.0.117_canary_2025-04-25",
 | 
			
		||||
    "date": "2025-04-25T17:22:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "mongodb/mongo",
 | 
			
		||||
    "version": "r7.0.19",
 | 
			
		||||
    "date": "2025-04-24T20:59:43Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "dotnetfactory/fluid-calendar",
 | 
			
		||||
    "version": "v1.4.0",
 | 
			
		||||
@@ -629,31 +669,16 @@
 | 
			
		||||
    "version": "0.17.11",
 | 
			
		||||
    "date": "2025-04-24T05:25:55Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Kozea/Radicale",
 | 
			
		||||
    "version": "v3.5.2",
 | 
			
		||||
    "date": "2025-04-23T18:41:46Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "minio/minio",
 | 
			
		||||
    "version": "RELEASE.2025-04-22T22-12-26Z",
 | 
			
		||||
    "date": "2025-04-22T22:44:34Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "glanceapp/glance",
 | 
			
		||||
    "version": "v0.7.13",
 | 
			
		||||
    "date": "2025-04-22T22:19:16Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "OliveTin/OliveTin",
 | 
			
		||||
    "version": "2025.4.22",
 | 
			
		||||
    "date": "2025-04-22T14:18:11Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "OctoPrint/OctoPrint",
 | 
			
		||||
    "version": "1.11.0",
 | 
			
		||||
    "date": "2025-04-22T09:33:46Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "monicahq/monica",
 | 
			
		||||
    "version": "v4.1.2",
 | 
			
		||||
@@ -684,11 +709,6 @@
 | 
			
		||||
    "version": "v2.10.0",
 | 
			
		||||
    "date": "2025-04-18T20:46:28Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Paymenter/Paymenter",
 | 
			
		||||
    "version": "v1.0.4",
 | 
			
		||||
    "date": "2025-04-18T16:08:02Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "tailscale/tailscale",
 | 
			
		||||
    "version": "v1.82.5",
 | 
			
		||||
@@ -724,11 +744,6 @@
 | 
			
		||||
    "version": "15.2",
 | 
			
		||||
    "date": "2025-04-14T15:37:12Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Ombi-app/Ombi",
 | 
			
		||||
    "version": "v4.47.1",
 | 
			
		||||
    "date": "2025-01-05T21:14:23Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Tautulli/Tautulli",
 | 
			
		||||
    "version": "v2.15.2",
 | 
			
		||||
@@ -749,11 +764,6 @@
 | 
			
		||||
    "version": "4.5.1",
 | 
			
		||||
    "date": "2025-04-11T09:57:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "outline/outline",
 | 
			
		||||
    "version": "v0.83.0",
 | 
			
		||||
    "date": "2025-04-11T03:53:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "apache/cassandra",
 | 
			
		||||
    "version": "cassandra-5.0.4",
 | 
			
		||||
@@ -889,11 +899,6 @@
 | 
			
		||||
    "version": "v4.3.1",
 | 
			
		||||
    "date": "2025-03-23T09:02:54Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "usememos/memos",
 | 
			
		||||
    "version": "v0.24.2",
 | 
			
		||||
    "date": "2025-03-23T04:01:50Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "clusterzx/paperless-ai",
 | 
			
		||||
    "version": "v2.7.6",
 | 
			
		||||
@@ -909,11 +914,6 @@
 | 
			
		||||
    "version": "v0.22.1",
 | 
			
		||||
    "date": "2025-03-18T21:01:22Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "authelia/authelia",
 | 
			
		||||
    "version": "v4.39.1",
 | 
			
		||||
    "date": "2025-03-18T03:57:41Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Sonarr/Sonarr",
 | 
			
		||||
    "version": "v4.0.14.2939",
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,11 @@ setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  make
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
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) }')
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										70
									
								
								install/alpine-gatus-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								install/alpine-gatus-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
#!/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/TwiN/gatus
 | 
			
		||||
 | 
			
		||||
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 \
 | 
			
		||||
  libcap-setcap
 | 
			
		||||
$STD apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community go
 | 
			
		||||
msg_ok "Installed dependencies"
 | 
			
		||||
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
msg_info "Installing gatus v${RELEASE}"
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
mkdir -p /opt/gatus
 | 
			
		||||
curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
			
		||||
tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
 | 
			
		||||
cd /opt/gatus
 | 
			
		||||
$STD go mod tidy
 | 
			
		||||
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
 | 
			
		||||
setcap CAP_NET_RAW+ep gatus
 | 
			
		||||
mv config.yaml config
 | 
			
		||||
echo "${RELEASE}" >/opt/gatus_version.txt
 | 
			
		||||
msg_ok "Installed gatus v${RELEASE}"
 | 
			
		||||
 | 
			
		||||
msg_info "Enabling gatus Service"
 | 
			
		||||
cat <<EOF >/etc/init.d/gatus
 | 
			
		||||
#!/sbin/openrc-run
 | 
			
		||||
description="gatus Service"
 | 
			
		||||
directory="/opt/gatus"
 | 
			
		||||
command="/opt/gatus/gatus"
 | 
			
		||||
command_args=""
 | 
			
		||||
command_background="true"
 | 
			
		||||
command_user="root"
 | 
			
		||||
pidfile="/var/run/gatus.pid"
 | 
			
		||||
 | 
			
		||||
export GATUS_CONFIG_PATH=""
 | 
			
		||||
export GATUS_LOG_LEVEL="INFO"
 | 
			
		||||
export PORT="8080"
 | 
			
		||||
 | 
			
		||||
depend() {
 | 
			
		||||
    use net
 | 
			
		||||
}
 | 
			
		||||
EOF
 | 
			
		||||
chmod +x /etc/init.d/gatus
 | 
			
		||||
$STD rc-update add gatus default
 | 
			
		||||
msg_ok "Enabled gatus Service"
 | 
			
		||||
 | 
			
		||||
msg_info "Starting gatus"
 | 
			
		||||
$STD service gatus start
 | 
			
		||||
msg_ok "Started gatus"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
$STD apk cache clean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -27,7 +27,7 @@ curl -fsSL "https://github.com/rclone/rclone/releases/download/v${RELEASE}/rclon
 | 
			
		||||
$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"
 | 
			
		||||
$STD htpasswd -cb -B /opt/login.pwd admin "$RCLONE_PASSWORD"
 | 
			
		||||
{
 | 
			
		||||
  echo "rclone-Credentials"
 | 
			
		||||
  echo "rclone User Name: admin"
 | 
			
		||||
@@ -42,7 +42,7 @@ 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_args="rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-htpasswd /opt/login.pwd"
 | 
			
		||||
command_background="true"
 | 
			
		||||
command_user="root"
 | 
			
		||||
pidfile="/var/run/rclone.pid"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										56
									
								
								install/alpine-traefik-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								install/alpine-traefik-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
#!/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 apk add ca-certificates
 | 
			
		||||
$STD update-ca-certificates
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Traefik"
 | 
			
		||||
$STD apk add traefik --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community
 | 
			
		||||
msg_ok "Installed Traefik"
 | 
			
		||||
 | 
			
		||||
read -p "Enable Traefik WebUI (Port 8080)? [y/N]: " enable_webui
 | 
			
		||||
if [[ "$enable_webui" =~ ^[Yy]$ ]]; then
 | 
			
		||||
  msg_info "Configuring Traefik WebUI"
 | 
			
		||||
  mkdir -p /etc/traefik/config
 | 
			
		||||
  cat <<EOF >/etc/traefik/traefik.yml
 | 
			
		||||
entryPoints:
 | 
			
		||||
  web:
 | 
			
		||||
    address: ":80"
 | 
			
		||||
  traefik:
 | 
			
		||||
    address: ":8080"
 | 
			
		||||
 | 
			
		||||
api:
 | 
			
		||||
  dashboard: true
 | 
			
		||||
  insecure: true
 | 
			
		||||
 | 
			
		||||
log:
 | 
			
		||||
  level: INFO
 | 
			
		||||
 | 
			
		||||
providers:
 | 
			
		||||
  file:
 | 
			
		||||
    directory: /etc/traefik/config
 | 
			
		||||
    watch: true
 | 
			
		||||
EOF
 | 
			
		||||
  msg_ok "Configured Traefik WebUI"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
msg_info "Enabling and starting Traefik service"
 | 
			
		||||
$STD rc-update add traefik default
 | 
			
		||||
$STD rc-service traefik start
 | 
			
		||||
msg_ok "Traefik service started"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
							
								
								
									
										56
									
								
								install/asterisk-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								install/asterisk-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: michelroegl-brunner
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
# Source: https://asterisk.org
 | 
			
		||||
 | 
			
		||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
 | 
			
		||||
color
 | 
			
		||||
verb_ip6
 | 
			
		||||
catch_errors
 | 
			
		||||
setting_up_container
 | 
			
		||||
network_check
 | 
			
		||||
update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  libsrtp2-dev \
 | 
			
		||||
  build-essential \
 | 
			
		||||
  libedit-dev \
 | 
			
		||||
  uuid-dev \
 | 
			
		||||
  libjansson-dev \
 | 
			
		||||
  libxml2-dev \
 | 
			
		||||
  libsqlite3-dev
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Downloading Asterisk"
 | 
			
		||||
RELEASE=$(curl -fsSL https://downloads.asterisk.org/pub/telephony/asterisk/ | grep -o 'asterisk-[0-9]\+-current\.tar\.gz' | sort -V | tail -n1)
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
curl -fsSL "https://downloads.asterisk.org/pub/telephony/asterisk/${RELEASE}" -o "$temp_file"
 | 
			
		||||
mkdir -p /opt/asterisk
 | 
			
		||||
tar zxf "$temp_file" --strip-components=1 -C /opt/asterisk
 | 
			
		||||
cd /opt/asterisk
 | 
			
		||||
msg_ok "Downloaded Asterisk"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Asterisk"
 | 
			
		||||
$STD ./contrib/scripts/install_prereq install
 | 
			
		||||
$STD ./configure
 | 
			
		||||
$STD make -j$(nproc)
 | 
			
		||||
$STD make install
 | 
			
		||||
$STD make config
 | 
			
		||||
$STD make install-logrotate
 | 
			
		||||
$STD make samples
 | 
			
		||||
mkdir -p /etc/radiusclient-ng/
 | 
			
		||||
ln /etc/radcli/radiusclient.conf /etc/radiusclient-ng/radiusclient.conf
 | 
			
		||||
systemctl enable -q --now asterisk
 | 
			
		||||
msg_ok "Installed Asterisk"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -26,7 +26,7 @@ mkdir -p /var/lib/bazarr/
 | 
			
		||||
curl -fsSL "https://github.com/morpheus65535/bazarr/releases/latest/download/bazarr.zip" -o $(basename "https://github.com/morpheus65535/bazarr/releases/latest/download/bazarr.zip")
 | 
			
		||||
unzip -qq bazarr -d /opt/bazarr
 | 
			
		||||
chmod 775 /opt/bazarr /var/lib/bazarr/
 | 
			
		||||
python3 -m pip install -q -r /opt/bazarr/requirements.txt
 | 
			
		||||
$STD python3 -m pip install -q -r /opt/bazarr/requirements.txt
 | 
			
		||||
msg_ok "Installed Bazarr"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,27 +20,16 @@ msg_ok "Setup Functions"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
    gpg \
 | 
			
		||||
    libc6 \
 | 
			
		||||
    make \
 | 
			
		||||
    cmake \
 | 
			
		||||
    jq \
 | 
			
		||||
    postgresql \
 | 
			
		||||
    python3 \
 | 
			
		||||
    python3-bcrypt
 | 
			
		||||
  libc6 \
 | 
			
		||||
  make \
 | 
			
		||||
  cmake \
 | 
			
		||||
  jq \
 | 
			
		||||
  python3 \
 | 
			
		||||
  python3-bcrypt
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_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
 | 
			
		||||
$STD npm install -g turbo@1.9.3
 | 
			
		||||
msg_ok "Installed Node.js"
 | 
			
		||||
NODE_VERSION="22" NODE_MODULE="turbo@1.9.3" install_node_and_modules
 | 
			
		||||
PG_VERSION="16" install_postgresql
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up PostgreSQL"
 | 
			
		||||
DB_NAME="documenso_db"
 | 
			
		||||
@@ -52,10 +41,10 @@ $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET client_encoding TO 'utf8'
 | 
			
		||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET default_transaction_isolation TO 'read committed';"
 | 
			
		||||
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'"
 | 
			
		||||
{
 | 
			
		||||
    echo "Documenso-Credentials"
 | 
			
		||||
    echo "Database Name: $DB_NAME"
 | 
			
		||||
    echo "Database User: $DB_USER"
 | 
			
		||||
    echo "Database Password: $DB_PASS"
 | 
			
		||||
  echo "Documenso-Credentials"
 | 
			
		||||
  echo "Database Name: $DB_NAME"
 | 
			
		||||
  echo "Database User: $DB_USER"
 | 
			
		||||
  echo "Database Password: $DB_PASS"
 | 
			
		||||
} >>~/documenso.creds
 | 
			
		||||
msg_ok "Set up PostgreSQL"
 | 
			
		||||
 | 
			
		||||
@@ -68,31 +57,29 @@ mv documenso-${RELEASE} /opt/documenso
 | 
			
		||||
cd /opt/documenso
 | 
			
		||||
mv .env.example /opt/documenso/.env
 | 
			
		||||
sed -i \
 | 
			
		||||
    -e "s|^NEXTAUTH_SECRET=.*|NEXTAUTH_SECRET='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
    -e "s|^NEXT_PRIVATE_ENCRYPTION_KEY=.*|NEXT_PRIVATE_ENCRYPTION_KEY='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
    -e "s|^NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=.*|NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
    -e "s|^DOCUMENSO_ENCRYPTION_KEY=.*|DOCUMENSO_ENCRYPTION_KEY='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
    -e "s|^DOCUMENSO_ENCRYPTION_SECONDARY_KEY=.*|DOCUMENSO_ENCRYPTION_SECONDARY_KEY='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
    -e "s|^NEXTAUTH_URL=.*|NEXTAUTH_URL=\"http://${LOCAL_IP}:3000\"|" \
 | 
			
		||||
    -e "s|^NEXT_PUBLIC_WEBAPP_URL=.*|NEXT_PUBLIC_WEBAPP_URL='http://${LOCAL_IP}:9000'|" \
 | 
			
		||||
    -e "s|^NEXT_PUBLIC_MARKETING_URL=.*|NEXT_PUBLIC_MARKETING_URL=\"http://${LOCAL_IP}:3001\"|" \
 | 
			
		||||
    -e "s|^NEXT_PRIVATE_INTERNAL_WEBAPP_URL=.*|NEXT_PRIVATE_INTERNAL_WEBAPP_URL=\"http://${LOCAL_IP}:3000\"|" \
 | 
			
		||||
    -e "s|^NEXT_PRIVATE_DATABASE_URL=.*|NEXT_PRIVATE_DATABASE_URL=\"postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME\"|" \
 | 
			
		||||
    -e "s|^NEXT_PRIVATE_DIRECT_DATABASE_URL=.*|NEXT_PRIVATE_DIRECT_DATABASE_URL=\"postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME\"|" \
 | 
			
		||||
    /opt/documenso/.env
 | 
			
		||||
  -e "s|^NEXTAUTH_SECRET=.*|NEXTAUTH_SECRET='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
  -e "s|^NEXT_PRIVATE_ENCRYPTION_KEY=.*|NEXT_PRIVATE_ENCRYPTION_KEY='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
  -e "s|^NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY=.*|NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
  -e "s|^DOCUMENSO_ENCRYPTION_KEY=.*|DOCUMENSO_ENCRYPTION_KEY='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
  -e "s|^DOCUMENSO_ENCRYPTION_SECONDARY_KEY=.*|DOCUMENSO_ENCRYPTION_SECONDARY_KEY='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \
 | 
			
		||||
  -e "s|^NEXT_PUBLIC_WEBAPP_URL=.*|NEXT_PUBLIC_WEBAPP_URL='http://${LOCAL_IP}:3000'|" \
 | 
			
		||||
  -e "s|^NEXT_PRIVATE_INTERNAL_WEBAPP_URL=.*|NEXT_PRIVATE_INTERNAL_WEBAPP_URL=\"http://${LOCAL_IP}:3000\"|" \
 | 
			
		||||
  -e "s|^NEXT_PRIVATE_DATABASE_URL=.*|NEXT_PRIVATE_DATABASE_URL=\"postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME\"|" \
 | 
			
		||||
  -e "s|^NEXT_PRIVATE_DIRECT_DATABASE_URL=.*|NEXT_PRIVATE_DIRECT_DATABASE_URL=\"postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME\"|" \
 | 
			
		||||
  /opt/documenso/.env
 | 
			
		||||
export TURBO_CACHE=1
 | 
			
		||||
export NEXT_TELEMETRY_DISABLED=1
 | 
			
		||||
export CYPRESS_INSTALL_BINARY=0
 | 
			
		||||
export NODE_OPTIONS="--max-old-space-size=4096"
 | 
			
		||||
$STD npm ci
 | 
			
		||||
$STD npm run build:web
 | 
			
		||||
$STD turbo run build --filter=@documenso/remix
 | 
			
		||||
$STD npm run prisma:migrate-deploy
 | 
			
		||||
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
 | 
			
		||||
msg_ok "Installed Documenso"
 | 
			
		||||
 | 
			
		||||
msg_info "Create User"
 | 
			
		||||
PASSWORD_HASH=$(python3 -c "import bcrypt; print(bcrypt.hashpw(b'helper-scripts', bcrypt.gensalt(rounds=12)).decode())")
 | 
			
		||||
sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\", \"customerId\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25', NULL) RETURNING id;"
 | 
			
		||||
$STD sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\", \"customerId\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25', NULL) RETURNING id;"
 | 
			
		||||
$STD npm run prisma:migrate-deploy
 | 
			
		||||
msg_ok "User created"
 | 
			
		||||
 | 
			
		||||
@@ -103,8 +90,8 @@ Description=Documenso Service
 | 
			
		||||
After=network.target postgresql.service
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
WorkingDirectory=/opt/documenso/apps/web
 | 
			
		||||
ExecStart=/usr/bin/npm start
 | 
			
		||||
WorkingDirectory=/opt/documenso
 | 
			
		||||
ExecStart=/usr/bin/turbo run start --filter=@documenso/remix
 | 
			
		||||
Restart=always
 | 
			
		||||
EnvironmentFile=/opt/documenso/.env
 | 
			
		||||
 | 
			
		||||
@@ -118,6 +105,7 @@ motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
$STD turbo daemon stop
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										67
									
								
								install/gatus-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								install/gatus-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
#!/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/TwiN/gatus
 | 
			
		||||
 | 
			
		||||
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 \
 | 
			
		||||
  libcap2-bin
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
install_go
 | 
			
		||||
 | 
			
		||||
RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
msg_info "Setting up gatus v${RELEASE}"
 | 
			
		||||
temp_file=$(mktemp)
 | 
			
		||||
mkdir -p /opt/gatus
 | 
			
		||||
curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
 | 
			
		||||
tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
 | 
			
		||||
cd /opt/gatus
 | 
			
		||||
$STD go mod tidy
 | 
			
		||||
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
 | 
			
		||||
setcap CAP_NET_RAW+ep gatus
 | 
			
		||||
mv config.yaml config
 | 
			
		||||
echo "${RELEASE}" >/opt/gatus_version.txt
 | 
			
		||||
msg_ok "Done setting up gatus"
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Service"
 | 
			
		||||
cat <<EOF >/etc/systemd/system/gatus.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=gatus Service
 | 
			
		||||
After=network.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
User=root
 | 
			
		||||
WorkingDirectory=/opt/gatus
 | 
			
		||||
ExecStart=/opt/gatus/gatus
 | 
			
		||||
Restart=always
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
systemctl enable -q --now gatus
 | 
			
		||||
msg_ok "Created Service"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f "$temp_file"
 | 
			
		||||
$STD apt-get -y autoremove
 | 
			
		||||
$STD apt-get -y autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
@@ -23,27 +23,17 @@ $STD apt-get install -y \
 | 
			
		||||
  build-essential \
 | 
			
		||||
  nginx \
 | 
			
		||||
  gettext \
 | 
			
		||||
  jq \
 | 
			
		||||
  openssl
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
 | 
			
		||||
msg_ok "Set up Node.js Repository"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Node.js/pnpm"
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get install -y nodejs
 | 
			
		||||
$STD npm install -g pnpm@latest
 | 
			
		||||
msg_ok "Installed Node.js/pnpm"
 | 
			
		||||
NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
 | 
			
		||||
NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.packageManager | split("@")[1]')"
 | 
			
		||||
install_node_and_modules
 | 
			
		||||
fetch_and_deploy_gh_release "homarr-labs/homarr"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Homarr (Patience)"
 | 
			
		||||
cd /opt
 | 
			
		||||
RELEASE=$(curl -fsSL https://api.github.com/repos/homarr-labs/homarr/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
 | 
			
		||||
curl -fsSL "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip" -o $(basename "https://github.com/homarr-labs/homarr/archive/refs/tags/v${RELEASE}.zip")
 | 
			
		||||
unzip -q v${RELEASE}.zip
 | 
			
		||||
mv homarr-${RELEASE} /opt/homarr
 | 
			
		||||
mkdir -p /opt/homarr_db
 | 
			
		||||
touch /opt/homarr_db/db.sqlite
 | 
			
		||||
SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)"
 | 
			
		||||
 
 | 
			
		||||
@@ -15,30 +15,18 @@ update_os
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
    gnupg \
 | 
			
		||||
    git \
 | 
			
		||||
    build-essential
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Setting up Node.js Repository"
 | 
			
		||||
mkdir -p /etc/apt/keyrings
 | 
			
		||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
 | 
			
		||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_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"
 | 
			
		||||
 | 
			
		||||
git clone -q https://github.com/Fallenbagel/jellyseerr.git /opt/jellyseerr
 | 
			
		||||
cd /opt/jellyseerr
 | 
			
		||||
$STD git checkout main
 | 
			
		||||
 | 
			
		||||
pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json)
 | 
			
		||||
msg_info "Installing pnpm version $pnpm_desired..."
 | 
			
		||||
$STD npm install -g pnpm@$pnpm_desired
 | 
			
		||||
msg_ok "Installed pnpm"
 | 
			
		||||
NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" install_node_and_modules
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Jellyseerr (Patience)"
 | 
			
		||||
export CYPRESS_INSTALL_BINARY=0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										74
									
								
								install/odoo-install.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								install/odoo-install.sh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Copyright (c) 2021-2025 community-scripts ORG
 | 
			
		||||
# Author: MickLesk (CanbiZ)
 | 
			
		||||
# License: MIT |  https://github.com/tteck/Proxmox/raw/main/LICENSE
 | 
			
		||||
# Source: https://github.com/odoo/odoo
 | 
			
		||||
 | 
			
		||||
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 \
 | 
			
		||||
  build-essential \
 | 
			
		||||
  make
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
 | 
			
		||||
LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
 | 
			
		||||
  grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |
 | 
			
		||||
  sed -E "s/odoo_(${RELEASE}\.[0-9]+)_all\.deb/\1/" |
 | 
			
		||||
  sort -V |
 | 
			
		||||
  tail -n1)
 | 
			
		||||
 | 
			
		||||
msg_info "Setup Odoo $RELEASE"
 | 
			
		||||
curl -fsSL https://nightly.odoo.com/${RELEASE}/nightly/deb/odoo_${RELEASE}.latest_all.deb -o /opt/odoo.deb
 | 
			
		||||
$STD apt install -y /opt/odoo.deb
 | 
			
		||||
msg_ok "Setup Odoo $RELEASE"
 | 
			
		||||
 | 
			
		||||
msg_info "Setup PostgreSQL Database"
 | 
			
		||||
DB_NAME="odoo"
 | 
			
		||||
DB_USER="odoo_usr"
 | 
			
		||||
DB_PASS="$(openssl rand -base64 18 | cut -c1-13)"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;"
 | 
			
		||||
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';"
 | 
			
		||||
$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;"
 | 
			
		||||
$STD sudo -u postgres psql -c "ALTER DATABASE $DB_NAME OWNER TO $DB_USER;"
 | 
			
		||||
$STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;"
 | 
			
		||||
{
 | 
			
		||||
  echo "Odoo-Credentials"
 | 
			
		||||
  echo -e "Odoo Database User: $DB_USER"
 | 
			
		||||
  echo -e "Odoo Database Password: $DB_PASS"
 | 
			
		||||
  echo -e "Odoo Database Name: $DB_NAME"
 | 
			
		||||
} >>~/odoo.creds
 | 
			
		||||
msg_ok "Setup PostgreSQL"
 | 
			
		||||
 | 
			
		||||
msg_info "Configuring Odoo"
 | 
			
		||||
sed -i \
 | 
			
		||||
  -e "s|^;*db_host *=.*|db_host = localhost|" \
 | 
			
		||||
  -e "s|^;*db_port *=.*|db_port = 5432|" \
 | 
			
		||||
  -e "s|^;*db_user *=.*|db_user = $DB_USER|" \
 | 
			
		||||
  -e "s|^;*db_password *=.*|db_password = $DB_PASS|" \
 | 
			
		||||
  /etc/odoo/odoo.conf
 | 
			
		||||
$STD sudo -u odoo odoo -c /etc/odoo/odoo.conf -d odoo -i base --stop-after-init
 | 
			
		||||
systemctl restart odoo
 | 
			
		||||
echo "${LATEST_VERSION}" >/opt/${APPLICATION}_version.txt
 | 
			
		||||
msg_ok "Configured Odoo"
 | 
			
		||||
 | 
			
		||||
msg_info "Restarting Odoo"
 | 
			
		||||
 | 
			
		||||
msg_ok "Restarted Odoo"
 | 
			
		||||
 | 
			
		||||
motd_ssh
 | 
			
		||||
customize
 | 
			
		||||
 | 
			
		||||
msg_info "Cleaning up"
 | 
			
		||||
rm -f /opt/odoo.deb
 | 
			
		||||
$STD apt-get autoremove
 | 
			
		||||
$STD apt-get autoclean
 | 
			
		||||
msg_ok "Cleaned"
 | 
			
		||||
@@ -16,20 +16,19 @@ update_os
 | 
			
		||||
msg_info "Installing Dependencies"
 | 
			
		||||
$STD apt-get install -y \
 | 
			
		||||
  gnupg \
 | 
			
		||||
  ca-certificates \
 | 
			
		||||
  apt-transport-https
 | 
			
		||||
msg_ok "Installed Dependencies"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Azul Zulu21"
 | 
			
		||||
curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9" -o "/etc/apt/trusted.gpg.d/zulu-repo.asc"
 | 
			
		||||
curl -fsSL "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb" -o $(basename "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb")
 | 
			
		||||
$STD dpkg -i zulu-repo_1.0.0-3_all.deb
 | 
			
		||||
msg_info "Installing Azul Zulu17"
 | 
			
		||||
curl -fsSL https://repos.azul.com/azul-repo.key | gpg --dearmor -o /usr/share/keyrings/azul.gpg
 | 
			
		||||
echo "deb [signed-by=/usr/share/keyrings/azul.gpg] https://repos.azul.com/zulu/deb stable main" >/etc/apt/sources.list.d/zulu.list
 | 
			
		||||
$STD apt-get update
 | 
			
		||||
$STD apt-get -y install zulu21-jdk
 | 
			
		||||
msg_ok "Installed Azul Zulu21"
 | 
			
		||||
$STD apt-get -y install zulu17-jdk
 | 
			
		||||
msg_ok "Installed Azul Zulu17"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing openHAB"
 | 
			
		||||
curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor >openhab.gpg
 | 
			
		||||
mv openhab.gpg /usr/share/keyrings
 | 
			
		||||
curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor -o /usr/share/keyrings/openhab.gpg
 | 
			
		||||
chmod u=rw,g=r,o=r /usr/share/keyrings/openhab.gpg
 | 
			
		||||
echo "deb [signed-by=/usr/share/keyrings/openhab.gpg] https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main" >/etc/apt/sources.list.d/openhab.list
 | 
			
		||||
$STD apt update
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,8 @@ $STD apt-get -y install elasticsearch
 | 
			
		||||
echo "-Xms2g" >>/etc/elasticsearch/jvm.options
 | 
			
		||||
echo "-Xmx2g" >>/etc/elasticsearch/jvm.options
 | 
			
		||||
$STD /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment -b
 | 
			
		||||
systemctl -q restart elasticsearch
 | 
			
		||||
systemctl enable -q elasticsearch
 | 
			
		||||
systemctl restart -q elasticsearch
 | 
			
		||||
msg_ok "Setup Elasticsearch"
 | 
			
		||||
 | 
			
		||||
msg_info "Installing Zammad"
 | 
			
		||||
 
 | 
			
		||||
@@ -137,8 +137,7 @@ network_check() {
 | 
			
		||||
# This function updates the Container OS by running apt-get update and upgrade
 | 
			
		||||
update_os() {
 | 
			
		||||
  msg_info "Updating Container OS"
 | 
			
		||||
  $STD apk update
 | 
			
		||||
  $STD apk upgrade
 | 
			
		||||
  $STD apk -U upgrade
 | 
			
		||||
  msg_ok "Updated Container OS"
 | 
			
		||||
 | 
			
		||||
  msg_info "Installing core dependencies"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										129
									
								
								misc/build.func
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								misc/build.func
									
									
									
									
									
								
							@@ -528,7 +528,37 @@ advanced_settings() {
 | 
			
		||||
    exit_script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  BRIDGES=$( ip link show | grep -oP '(?<=: )vmbr\d+' | sort)
 | 
			
		||||
 | 
			
		||||
  BRIDGES=""
 | 
			
		||||
  IFACE_FILEPATH_LIST="/etc/network/interfaces"$'\n'$(find "/etc/network/interfaces.d/" -type f)
 | 
			
		||||
  OLD_IFS=$IFS; IFS=$'\n'
 | 
			
		||||
 | 
			
		||||
  for iface_filepath in ${IFACE_FILEPATH_LIST}; do
 | 
			
		||||
    iface_indexes_tmpfile=$(mktemp -q -u '.iface-XXXX')
 | 
			
		||||
 | 
			
		||||
    ( grep -Pn '^\s*iface' "${iface_filepath}" | cut -d':' -f1 && wc -l "${iface_filepath}" | cut -d' ' -f1 ) | \
 | 
			
		||||
    awk 'FNR==1 {line=$0; next} {print line":"$0-1; line=$0}' > "${iface_indexes_tmpfile}"
 | 
			
		||||
 | 
			
		||||
    if [ -f "${iface_indexes_tmpfile}" ]; then
 | 
			
		||||
        while read -r pair; do
 | 
			
		||||
            start=$(echo "${pair}" | cut -d':' -f1)
 | 
			
		||||
            end=$(echo "${pair}" | cut -d':' -f2)
 | 
			
		||||
 | 
			
		||||
            if awk "NR >= ${start} && NR <= ${end}" "${iface_filepath}" | grep -qP '^\s*bridge[-_](ports|stp|fd|vlan-aware|vids)\s+'; then
 | 
			
		||||
                iface_name=$(sed "${start}q;d" "${iface_filepath}" | awk '{print $2}')
 | 
			
		||||
                BRIDGES="${iface_name}"$'\n'"${BRIDGES}"
 | 
			
		||||
            fi
 | 
			
		||||
 | 
			
		||||
        done < "${iface_indexes_tmpfile}"
 | 
			
		||||
        rm -f "${iface_indexes_tmpfile}"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  IFS=$OLD_IFS
 | 
			
		||||
 | 
			
		||||
  BRIDGES=$(echo "$BRIDGES" | grep -v '^\s*$' | sort | uniq)
 | 
			
		||||
 | 
			
		||||
  if [[ -z "$BRIDGES" ]]; then
 | 
			
		||||
    BRG="vmbr0"
 | 
			
		||||
    echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
 | 
			
		||||
@@ -779,8 +809,6 @@ EOF
 | 
			
		||||
 | 
			
		||||
config_file() {
 | 
			
		||||
 | 
			
		||||
  whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Default distribution for $APP" "${var_os} ${var_version} \n \nIf the default Linux distribution is not adhered to, script support will be discontinued. \n" 10 58
 | 
			
		||||
 | 
			
		||||
  CONFIG_FILE="/opt/community-scripts/.settings"
 | 
			
		||||
 | 
			
		||||
  if [[ -f "/opt/community-scripts/${NSAPP}.conf" ]]; then
 | 
			
		||||
@@ -797,66 +825,38 @@ config_file() {
 | 
			
		||||
      source "$CONFIG_FILE"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [[ "$var_os" == "debian" ]]; then
 | 
			
		||||
    echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}"
 | 
			
		||||
    if [[ "$var_version" == "11" ]]; then
 | 
			
		||||
      echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
 | 
			
		||||
    elif [[ "$var_version" == "12" ]]; then
 | 
			
		||||
      echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Unknown setting for var_version, should be 11 or 12, was ${var_version}"
 | 
			
		||||
      exit
 | 
			
		||||
    fi
 | 
			
		||||
  elif [[ "$var_os" == "ubuntu" ]]; then
 | 
			
		||||
    echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}"
 | 
			
		||||
    if [[ "$var_version" == "20.04" ]]; then
 | 
			
		||||
      echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
 | 
			
		||||
    elif [[ "$var_version" == "22.04" ]]; then
 | 
			
		||||
      echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
 | 
			
		||||
    elif [[ "$var_version" == "24.04" ]]; then
 | 
			
		||||
      echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
 | 
			
		||||
    elif [[ "$var_version" == "24.10" ]]; then
 | 
			
		||||
      echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Unknown setting for var_version, should be 20.04, 22.04, 24.04 or 24.10, was ${var_version}"
 | 
			
		||||
      exit
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    msg_error "Unknown setting for var_os! should be debian or ubuntu, was ${var_os}"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [[ -n "$CT_ID" ]]; then
 | 
			
		||||
 | 
			
		||||
    if [[ "$CT_ID" =~ ^([0-9]{3,4})-([0-9]{3,4})$ ]]; then
 | 
			
		||||
      MIN_ID=${BASH_REMATCH[1]}
 | 
			
		||||
      MAX_ID=${BASH_REMATCH[2]}
 | 
			
		||||
 | 
			
		||||
      if ((MIN_ID >= MAX_ID)); then
 | 
			
		||||
        msg_error "Invalid Container ID range. The first number must be smaller than the second number, was ${CT_ID}"
 | 
			
		||||
        exit
 | 
			
		||||
      fi
 | 
			
		||||
 | 
			
		||||
      LIST_OF_IDS=$(pvesh get /cluster/resources --type vm --output-format json | grep -oP '"vmid":\s*\K\d+')
 | 
			
		||||
 | 
			
		||||
      for ((ID = MIN_ID; ID <= MAX_ID; ID++)); do
 | 
			
		||||
        if ! grep -q "^$ID$" <<<"$LIST_OF_IDS"; then
 | 
			
		||||
          CT_ID=$ID
 | 
			
		||||
          break
 | 
			
		||||
        fi
 | 
			
		||||
      done
 | 
			
		||||
 | 
			
		||||
      LIST_OF_IDS=$(pvesh get /cluster/resources --type vm --output-format json 2>/dev/null | grep -oP '"vmid":\s*\K\d+') || true
 | 
			
		||||
      if [[ -n "$LIST_OF_IDS" ]]; then
 | 
			
		||||
        for ((ID = MIN_ID; ID <= MAX_ID; ID++)); do
 | 
			
		||||
          if ! grep -q "^$ID$" <<<"$LIST_OF_IDS"; then
 | 
			
		||||
            CT_ID=$ID
 | 
			
		||||
            break
 | 
			
		||||
          fi
 | 
			
		||||
        done
 | 
			
		||||
      fi
 | 
			
		||||
      echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
 | 
			
		||||
 | 
			
		||||
    elif [[ "$CT_ID" =~ ^[0-9]+$ ]]; then
 | 
			
		||||
      LIST_OF_IDS=$(pvesh get /cluster/resources --type vm --output-format json 2>/dev/null | grep -oP '"vmid":\s*\K\d+') || true
 | 
			
		||||
      if [[ -n "$LIST_OF_IDS" ]]; then
 | 
			
		||||
 | 
			
		||||
      LIST_OF_IDS=$(pvesh get /cluster/resources --type vm --output-format json | grep -oP '"vmid":\s*\K\d+')
 | 
			
		||||
      if ! grep -q "^$CT_ID$" <<<"$LIST_OF_IDS"; then
 | 
			
		||||
        echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
 | 
			
		||||
        if ! grep -q "^$CT_ID$" <<<"$LIST_OF_IDS"; then
 | 
			
		||||
          echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
 | 
			
		||||
        else
 | 
			
		||||
          msg_error "Container ID $CT_ID already exists"
 | 
			
		||||
          exit
 | 
			
		||||
        fi
 | 
			
		||||
      else
 | 
			
		||||
        msg_error "Container ID $CT_ID already exists"
 | 
			
		||||
        exit
 | 
			
		||||
        echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
 | 
			
		||||
      fi
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Invalid Container ID format. Needs to be 0000-9999 or 0-9999, was ${CT_ID}"
 | 
			
		||||
@@ -954,27 +954,26 @@ config_file() {
 | 
			
		||||
    if [ "$NET" == "dhcp" ]; then
 | 
			
		||||
      echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}DHCP${CL}"
 | 
			
		||||
      echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}Default${CL}"
 | 
			
		||||
    elif
 | 
			
		||||
      [[ "$NET" =~ $ip_cidr_regex ]]
 | 
			
		||||
    then
 | 
			
		||||
    elif [[ "$NET" =~ $ip_cidr_regex ]]; then
 | 
			
		||||
      echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}$NET${CL}"
 | 
			
		||||
      if [ ! -z "$GATE" ]; then
 | 
			
		||||
        if [[ "$GATE" =~ $ip_regex ]]; then
 | 
			
		||||
          echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}$GATE${CL}"
 | 
			
		||||
          GATE=",gw=$GATE"
 | 
			
		||||
        else
 | 
			
		||||
          msg_error "Invalid IP Address format for Gateway. Needs to be 0.0.0.0, was ${GATE}"
 | 
			
		||||
          exit
 | 
			
		||||
      fi
 | 
			
		||||
  else
 | 
			
		||||
    msg_error "Gateway IP Address cannot be empty"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Invalid IP Address format. Needs to be 0.0.0.0/0, was ${NET}"
 | 
			
		||||
      exit
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  if [ ! -z "$GATE" ]; then
 | 
			
		||||
    if [[ "$GATE" =~ $ip_regex ]]; then
 | 
			
		||||
      echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}$GATE${CL}"
 | 
			
		||||
      GATE=",gw=$GATE"
 | 
			
		||||
    else
 | 
			
		||||
      msg_error "Invalid IP Address format for Gateway. Needs to be 0.0.0.0, was ${GATE}"
 | 
			
		||||
      exit
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    msg_error "Gateway IP Address cannot be empty"
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if [[ ! -z "$APT_CACHER_IP" ]]; then
 | 
			
		||||
    if [[ "$APT_CACHER_IP" =~ $ip_regex ]]; then
 | 
			
		||||
@@ -1399,7 +1398,7 @@ description() {
 | 
			
		||||
      <img src='https://img.shields.io/badge/☕-Buy us a coffee-blue' alt='spend Coffee' />
 | 
			
		||||
    </a>
 | 
			
		||||
  </p>
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  <span style='margin: 0 10px;'>
 | 
			
		||||
    <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i>
 | 
			
		||||
    <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a>
 | 
			
		||||
 
 | 
			
		||||
@@ -55,10 +55,16 @@ install_node_and_modules() {
 | 
			
		||||
    IFS=',' read -ra MODULES <<<"$NODE_MODULE"
 | 
			
		||||
    for mod in "${MODULES[@]}"; do
 | 
			
		||||
      local MODULE_NAME MODULE_REQ_VERSION MODULE_INSTALLED_VERSION
 | 
			
		||||
      if [[ "$mod" == *"@"* ]]; then
 | 
			
		||||
      if [[ "$mod" == @*/*@* ]]; then
 | 
			
		||||
        # Scoped package with version, e.g. @vue/cli-service@latest
 | 
			
		||||
        MODULE_NAME="${mod%@*}"
 | 
			
		||||
        MODULE_REQ_VERSION="${mod#*@}"
 | 
			
		||||
        MODULE_REQ_VERSION="${mod##*@}"
 | 
			
		||||
      elif [[ "$mod" == *"@"* ]]; then
 | 
			
		||||
        # Unscoped package with version, e.g. yarn@latest
 | 
			
		||||
        MODULE_NAME="${mod%@*}"
 | 
			
		||||
        MODULE_REQ_VERSION="${mod##*@}"
 | 
			
		||||
      else
 | 
			
		||||
        # No version specified
 | 
			
		||||
        MODULE_NAME="$mod"
 | 
			
		||||
        MODULE_REQ_VERSION="latest"
 | 
			
		||||
      fi
 | 
			
		||||
@@ -101,25 +107,31 @@ install_postgresql() {
 | 
			
		||||
  DISTRO="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
 | 
			
		||||
 | 
			
		||||
  if command -v psql >/dev/null; then
 | 
			
		||||
    CURRENT_PG_VERSION="$(psql -V | grep -oP '\s\K[0-9]+(?=\.)')"
 | 
			
		||||
    if [[ "$CURRENT_PG_VERSION" != "$PG_VERSION" ]]; then
 | 
			
		||||
      msg_info "PostgreSQL Version $CURRENT_PG_VERSION found, replacing with $PG_VERSION"
 | 
			
		||||
      NEED_PG_INSTALL=true
 | 
			
		||||
    CURRENT_PG_VERSION="$(psql -V | awk '{print $3}' | cut -d. -f1)"
 | 
			
		||||
    if [[ "$CURRENT_PG_VERSION" == "$PG_VERSION" ]]; then
 | 
			
		||||
      msg_ok "PostgreSQL $PG_VERSION is already installed"
 | 
			
		||||
      return
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Detected PostgreSQL $CURRENT_PG_VERSION, preparing upgrade to $PG_VERSION"
 | 
			
		||||
    NEED_PG_INSTALL=true
 | 
			
		||||
  else
 | 
			
		||||
    msg_info "PostgreSQL not found, installing version $PG_VERSION"
 | 
			
		||||
    msg_info "PostgreSQL not installed, proceeding with fresh install of $PG_VERSION"
 | 
			
		||||
    NEED_PG_INSTALL=true
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [[ "$NEED_PG_INSTALL" == true ]]; then
 | 
			
		||||
    msg_info "Stopping PostgreSQL if running"
 | 
			
		||||
    systemctl stop postgresql >/dev/null 2>&1 || true
 | 
			
		||||
    if [[ -n "$CURRENT_PG_VERSION" ]]; then
 | 
			
		||||
      msg_info "Dumping all PostgreSQL data from version $CURRENT_PG_VERSION"
 | 
			
		||||
      su - postgres -c "pg_dumpall > /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    msg_info "Removing conflicting PostgreSQL packages"
 | 
			
		||||
    $STD apt-get purge -y "postgresql*"
 | 
			
		||||
    msg_info "Stopping PostgreSQL service"
 | 
			
		||||
    systemctl stop postgresql || true
 | 
			
		||||
 | 
			
		||||
    msg_info "Removing pgdg repo and old GPG key"
 | 
			
		||||
    rm -f /etc/apt/sources.list.d/pgdg.list /etc/apt/trusted.gpg.d/postgresql.gpg
 | 
			
		||||
 | 
			
		||||
    msg_info "Setting up PostgreSQL Repository"
 | 
			
		||||
    msg_info "Adding PostgreSQL PGDG repository"
 | 
			
		||||
    curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc |
 | 
			
		||||
      gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
 | 
			
		||||
 | 
			
		||||
@@ -127,9 +139,24 @@ install_postgresql() {
 | 
			
		||||
      >/etc/apt/sources.list.d/pgdg.list
 | 
			
		||||
 | 
			
		||||
    $STD apt-get update
 | 
			
		||||
    $STD apt-get install -y "postgresql-${PG_VERSION}"
 | 
			
		||||
 | 
			
		||||
    msg_ok "Installed PostgreSQL ${PG_VERSION}"
 | 
			
		||||
    msg_info "Installing PostgreSQL $PG_VERSION"
 | 
			
		||||
    $STD apt-get install -y "postgresql-${PG_VERSION}" "postgresql-client-${PG_VERSION}"
 | 
			
		||||
 | 
			
		||||
    if [[ -n "$CURRENT_PG_VERSION" ]]; then
 | 
			
		||||
      $STD msg_info "Removing old PostgreSQL $CURRENT_PG_VERSION packages"
 | 
			
		||||
      $STD apt-get purge -y "postgresql-${CURRENT_PG_VERSION}" "postgresql-client-${CURRENT_PG_VERSION}" || true
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    $STD msg_info "Starting PostgreSQL $PG_VERSION"
 | 
			
		||||
    systemctl enable --now postgresql
 | 
			
		||||
 | 
			
		||||
    if [[ -n "$CURRENT_PG_VERSION" ]]; then
 | 
			
		||||
      $STD msg_info "Restoring dumped data"
 | 
			
		||||
      su - postgres -c "psql < /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    msg_ok "PostgreSQL $PG_VERSION installed"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -245,7 +272,11 @@ install_php() {
 | 
			
		||||
  COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -)
 | 
			
		||||
 | 
			
		||||
  local CURRENT_PHP
 | 
			
		||||
  CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
 | 
			
		||||
  if command -v php >/dev/null 2>&1; then
 | 
			
		||||
    CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
 | 
			
		||||
  else
 | 
			
		||||
    CURRENT_PHP=""
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [[ "$CURRENT_PHP" != "$PHP_VERSION" ]]; then
 | 
			
		||||
    $STD echo "PHP $CURRENT_PHP detected, migrating to PHP $PHP_VERSION"
 | 
			
		||||
@@ -352,7 +383,7 @@ install_go() {
 | 
			
		||||
      msg_error "Could not determine latest Go version"
 | 
			
		||||
      return 1
 | 
			
		||||
    fi
 | 
			
		||||
    msg_info "Detected latest Go version: $GO_VERSION"
 | 
			
		||||
    $STD msg_info "Detected latest Go version: $GO_VERSION"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  local GO_BIN="/usr/local/bin/go"
 | 
			
		||||
@@ -362,10 +393,10 @@ install_go() {
 | 
			
		||||
    local CURRENT_VERSION
 | 
			
		||||
    CURRENT_VERSION=$("$GO_BIN" version | awk '{print $3}' | sed 's/go//')
 | 
			
		||||
    if [[ "$CURRENT_VERSION" == "$GO_VERSION" ]]; then
 | 
			
		||||
      msg_ok "Go $GO_VERSION already installed"
 | 
			
		||||
      $STD msg_ok "Go $GO_VERSION already installed"
 | 
			
		||||
      return 0
 | 
			
		||||
    else
 | 
			
		||||
      msg_info "Go $CURRENT_VERSION found, upgrading to $GO_VERSION"
 | 
			
		||||
      $STD msg_info "Go $CURRENT_VERSION found, upgrading to $GO_VERSION"
 | 
			
		||||
      rm -rf "$GO_INSTALL_DIR"
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
@@ -538,6 +569,7 @@ fetch_and_deploy_gh_release() {
 | 
			
		||||
 | 
			
		||||
    tag=$(echo "$api_response" | jq -r '.tag_name // .name // empty')
 | 
			
		||||
    [[ "$tag" =~ ^v[0-9] ]] && tag="${tag:1}"
 | 
			
		||||
    version="${tag#v}"
 | 
			
		||||
 | 
			
		||||
    if [[ -z "$tag" ]]; then
 | 
			
		||||
      $STD msg_info "Empty tag received, retrying...\n"
 | 
			
		||||
@@ -560,7 +592,6 @@ fetch_and_deploy_gh_release() {
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  local version="$tag"
 | 
			
		||||
  local base_url="https://github.com/$repo/releases/download/v$tag"
 | 
			
		||||
  local tmpdir
 | 
			
		||||
  tmpdir=$(mktemp -d) || return 1
 | 
			
		||||
@@ -620,8 +651,15 @@ fetch_and_deploy_gh_release() {
 | 
			
		||||
 | 
			
		||||
  # Final fallback to GitHub source tarball
 | 
			
		||||
  if [[ -z "$url" ]]; then
 | 
			
		||||
    url="https://github.com/$repo/archive/refs/tags/$version.tar.gz"
 | 
			
		||||
    $STD msg_info "Trying GitHub source tarball fallback: $url"
 | 
			
		||||
    # Use tarball_url directly from API response instead of constructing our own URL
 | 
			
		||||
    url=$(echo "$api_response" | jq -r '.tarball_url // empty')
 | 
			
		||||
 | 
			
		||||
    # If tarball_url is empty for some reason, fall back to a constructed URL as before
 | 
			
		||||
    if [[ -z "$url" ]]; then
 | 
			
		||||
      url="https://github.com/$repo/archive/refs/tags/v$version.tar.gz"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    $STD msg_info "Using GitHub source tarball: $url"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  local filename="${url##*/}"
 | 
			
		||||
@@ -659,8 +697,8 @@ setup_local_ip_helper() {
 | 
			
		||||
 | 
			
		||||
  # Install networkd-dispatcher if not present
 | 
			
		||||
  if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then
 | 
			
		||||
    apt-get update -qq
 | 
			
		||||
    apt-get install -yq networkd-dispatcher
 | 
			
		||||
    $STD apt-get update -qq
 | 
			
		||||
    $STD apt-get install -yq networkd-dispatcher
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Write update_local_ip.sh
 | 
			
		||||
@@ -716,7 +754,7 @@ $SCRIPT_PATH
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
  chmod +x "$DISPATCHER_SCRIPT"
 | 
			
		||||
  systemctl enable --now networkd-dispatcher.service
 | 
			
		||||
  systemctl enable -q --now networkd-dispatcher.service
 | 
			
		||||
 | 
			
		||||
  $STD msg_ok "LOCAL_IP helper installed using networkd-dispatcher"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,28 +5,28 @@
 | 
			
		||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
    clear
 | 
			
		||||
    cat <<"EOF"
 | 
			
		||||
    ____                                          __   _  ________   ____       __     __     
 | 
			
		||||
   / __ \_________  _  ______ ___  ____  _  __   / /  | |/ / ____/  / __ \___  / /__  / /____ 
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
    ____                                          __   _  ________   ____       __     __
 | 
			
		||||
   / __ \_________  _  ______ ___  ____  _  __   / /  | |/ / ____/  / __ \___  / /__  / /____
 | 
			
		||||
  / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/  / /   |   / /      / / / / _ \/ / _ \/ __/ _ \
 | 
			
		||||
 / ____/ /  / /_/ />  </ / / / / / /_/ />  <   / /___/   / /___   / /_/ /  __/ /  __/ /_/  __/
 | 
			
		||||
/_/   /_/   \____/_/|_/_/ /_/ /_/\____/_/|_|  /_____/_/|_\____/  /_____/\___/_/\___/\__/\___/ 
 | 
			
		||||
                                                                                              
 | 
			
		||||
/_/   /_/   \____/_/|_/_/ /_/ /_/\____/_/|_|  /_____/_/|_\____/  /_____/\___/_/\___/\__/\___/
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
spinner() {
 | 
			
		||||
    local pid=$1
 | 
			
		||||
    local delay=0.1
 | 
			
		||||
    local spinstr='|/-\'
 | 
			
		||||
    while ps -p $pid >/dev/null; do
 | 
			
		||||
        printf " [%c]  " "$spinstr"
 | 
			
		||||
        spinstr=${spinstr#?}${spinstr%"${spinstr#?}"}
 | 
			
		||||
        sleep $delay
 | 
			
		||||
        printf "\r"
 | 
			
		||||
    done
 | 
			
		||||
    printf "    \r"
 | 
			
		||||
  local pid=$1
 | 
			
		||||
  local delay=0.1
 | 
			
		||||
  local spinstr='|/-\'
 | 
			
		||||
  while ps -p $pid >/dev/null; do
 | 
			
		||||
    printf " [%c]  " "$spinstr"
 | 
			
		||||
    spinstr=${spinstr#?}${spinstr%"${spinstr#?}"}
 | 
			
		||||
    sleep $delay
 | 
			
		||||
    printf "\r"
 | 
			
		||||
  done
 | 
			
		||||
  printf "    \r"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
set -eEuo pipefail
 | 
			
		||||
@@ -46,29 +46,29 @@ NODE=$(hostname)
 | 
			
		||||
containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}')
 | 
			
		||||
 | 
			
		||||
if [ -z "$containers" ]; then
 | 
			
		||||
    whiptail --title "LXC Container Delete" --msgbox "No LXC containers available!" 10 60
 | 
			
		||||
    exit 1
 | 
			
		||||
  whiptail --title "LXC Container Delete" --msgbox "No LXC containers available!" 10 60
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
menu_items=()
 | 
			
		||||
menu_items=("ALL" "Delete ALL containers" "OFF") # Add as first option
 | 
			
		||||
FORMAT="%-10s %-15s %-10s"
 | 
			
		||||
 | 
			
		||||
while read -r container; do
 | 
			
		||||
    container_id=$(echo $container | awk '{print $1}')
 | 
			
		||||
    container_name=$(echo $container | awk '{print $2}')
 | 
			
		||||
    container_status=$(echo $container | awk '{print $3}')
 | 
			
		||||
    formatted_line=$(printf "$FORMAT" "$container_name" "$container_status")
 | 
			
		||||
    menu_items+=("$container_id" "$formatted_line" "OFF")
 | 
			
		||||
  container_id=$(echo $container | awk '{print $1}')
 | 
			
		||||
  container_name=$(echo $container | awk '{print $2}')
 | 
			
		||||
  container_status=$(echo $container | awk '{print $3}')
 | 
			
		||||
  formatted_line=$(printf "$FORMAT" "$container_name" "$container_status")
 | 
			
		||||
  menu_items+=("$container_id" "$formatted_line" "OFF")
 | 
			
		||||
done <<<"$containers"
 | 
			
		||||
 | 
			
		||||
CHOICES=$(whiptail --title "LXC Container Delete" \
 | 
			
		||||
    --checklist "Select LXC containers to delete:" 25 60 13 \
 | 
			
		||||
    "${menu_items[@]}" 3>&2 2>&1 1>&3)
 | 
			
		||||
  --checklist "Select LXC containers to delete:" 25 60 13 \
 | 
			
		||||
  "${menu_items[@]}" 3>&2 2>&1 1>&3)
 | 
			
		||||
 | 
			
		||||
if [ -z "$CHOICES" ]; then
 | 
			
		||||
    whiptail --title "LXC Container Delete" \
 | 
			
		||||
        --msgbox "No containers selected!" 10 60
 | 
			
		||||
    exit 1
 | 
			
		||||
  whiptail --title "LXC Container Delete" \
 | 
			
		||||
    --msgbox "No containers selected!" 10 60
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
read -p "Delete containers manually or automatically? (Default: manual) m/a: " DELETE_MODE
 | 
			
		||||
@@ -76,34 +76,39 @@ DELETE_MODE=${DELETE_MODE:-m}
 | 
			
		||||
 | 
			
		||||
selected_ids=$(echo "$CHOICES" | tr -d '"' | tr -s ' ' '\n')
 | 
			
		||||
 | 
			
		||||
# If "ALL" is selected, override with all container IDs
 | 
			
		||||
if echo "$selected_ids" | grep -q "^ALL$"; then
 | 
			
		||||
  selected_ids=$(echo "$containers" | awk '{print $1}')
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
for container_id in $selected_ids; do
 | 
			
		||||
    status=$(pct status $container_id)
 | 
			
		||||
  status=$(pct status $container_id)
 | 
			
		||||
 | 
			
		||||
    if [ "$status" == "status: running" ]; then
 | 
			
		||||
        echo -e "${BL}[Info]${GN} Stopping container $container_id...${CL}"
 | 
			
		||||
        pct stop $container_id &
 | 
			
		||||
        sleep 5
 | 
			
		||||
        echo -e "${BL}[Info]${GN} Container $container_id stopped.${CL}"
 | 
			
		||||
    fi
 | 
			
		||||
  if [ "$status" == "status: running" ]; then
 | 
			
		||||
    echo -e "${BL}[Info]${GN} Stopping container $container_id...${CL}"
 | 
			
		||||
    pct stop $container_id &
 | 
			
		||||
    sleep 5
 | 
			
		||||
    echo -e "${BL}[Info]${GN} Container $container_id stopped.${CL}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
    if [[ "$DELETE_MODE" == "a" ]]; then
 | 
			
		||||
        echo -e "${BL}[Info]${GN} Automatically deleting container $container_id...${CL}"
 | 
			
		||||
        pct destroy "$container_id" -f &
 | 
			
		||||
        pid=$!
 | 
			
		||||
        spinner $pid
 | 
			
		||||
        [ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
 | 
			
		||||
  if [[ "$DELETE_MODE" == "a" ]]; then
 | 
			
		||||
    echo -e "${BL}[Info]${GN} Automatically deleting container $container_id...${CL}"
 | 
			
		||||
    pct destroy "$container_id" -f &
 | 
			
		||||
    pid=$!
 | 
			
		||||
    spinner $pid
 | 
			
		||||
    [ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
 | 
			
		||||
  else
 | 
			
		||||
    read -p "Delete container $container_id? (y/N): " CONFIRM
 | 
			
		||||
    if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
 | 
			
		||||
      echo -e "${BL}[Info]${GN} Deleting container $container_id...${CL}"
 | 
			
		||||
      pct destroy "$container_id" -f &
 | 
			
		||||
      pid=$!
 | 
			
		||||
      spinner $pid
 | 
			
		||||
      [ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
 | 
			
		||||
    else
 | 
			
		||||
        read -p "Delete container $container_id? (y/N): " CONFIRM
 | 
			
		||||
        if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
 | 
			
		||||
            echo -e "${BL}[Info]${GN} Deleting container $container_id...${CL}"
 | 
			
		||||
            pct destroy "$container_id" -f &
 | 
			
		||||
            pid=$!
 | 
			
		||||
            spinner $pid
 | 
			
		||||
            [ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
 | 
			
		||||
        else
 | 
			
		||||
            echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}"
 | 
			
		||||
        fi
 | 
			
		||||
      echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
header_info
 | 
			
		||||
 
 | 
			
		||||
@@ -16,43 +16,52 @@ cat <<"EOF"
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
add() {
 | 
			
		||||
  echo -e "\n IMPORTANT: Tag-Based Monitoring Enabled"
 | 
			
		||||
  echo "Only VMs and containers with the tag 'mon-restart' will be automatically restarted by this service."
 | 
			
		||||
  echo
 | 
			
		||||
  echo "🔧 How to add the tag:"
 | 
			
		||||
  echo "  → Proxmox Web UI: Go to VM/CT → Options → Tags → Add 'mon-restart'"
 | 
			
		||||
  echo "  → CLI: qm set <vmid> -tags mon-restart"
 | 
			
		||||
  echo "         pct set <ctid> -tags mon-restart"
 | 
			
		||||
  echo
 | 
			
		||||
 | 
			
		||||
  while true; do
 | 
			
		||||
    read -p "This script will add Monitor All to Proxmox VE. Proceed(y/n)?" yn
 | 
			
		||||
    read -p "This script will add Monitor All to Proxmox VE. Proceed (y/n)? " yn
 | 
			
		||||
    case $yn in
 | 
			
		||||
    [Yy]*) break ;;
 | 
			
		||||
    [Nn]*) exit ;;
 | 
			
		||||
    *) echo "Please answer yes or no." ;;
 | 
			
		||||
      [Yy]*) break ;;
 | 
			
		||||
      [Nn]*) exit ;;
 | 
			
		||||
      *) echo "Please answer yes or no." ;;
 | 
			
		||||
    esac
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  echo '#!/usr/bin/env bash
 | 
			
		||||
  cat <<'EOF' >/usr/local/bin/ping-instances.sh
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# Read excluded instances from command line arguments
 | 
			
		||||
excluded_instances=("$@")
 | 
			
		||||
echo "Excluded instances: ${excluded_instances[@]}"
 | 
			
		||||
 | 
			
		||||
while true; do
 | 
			
		||||
 | 
			
		||||
  for instance in $(pct list | awk '\''{if(NR>1) print $1}'\''; qm list | awk '\''{if(NR>1) print $1}'\''); do
 | 
			
		||||
  for instance in $(pct list | awk 'NR>1 {print $1}'; qm list | awk 'NR>1 {print $1}'); do
 | 
			
		||||
    # Skip excluded instances
 | 
			
		||||
    if [[ " ${excluded_instances[@]} " =~ " ${instance} " ]]; then
 | 
			
		||||
      echo "Skipping $instance because it is excluded"
 | 
			
		||||
      continue
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Determine the type of the instance (container or virtual machine)
 | 
			
		||||
    # Determine type and set config command
 | 
			
		||||
    if pct status $instance >/dev/null 2>&1; then
 | 
			
		||||
      # It is a container
 | 
			
		||||
      type="ct"
 | 
			
		||||
      config_cmd="pct config"
 | 
			
		||||
      IP=$(pct exec $instance ip a s dev eth0 | awk '\''/inet / {print $2}'\'' | cut -d/ -f1)
 | 
			
		||||
    else
 | 
			
		||||
      # It is a virtual machine
 | 
			
		||||
      type="vm"
 | 
			
		||||
      config_cmd="qm config"
 | 
			
		||||
      IP=$(qm guest cmd $instance network-get-interfaces | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -E "192\.|10\." | head -n 1)
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Skip instances based on onboot and templates
 | 
			
		||||
    # Skip templates and onboot-disabled
 | 
			
		||||
    onboot=$($config_cmd $instance | grep -q "onboot: 0" || ( ! $config_cmd $instance | grep -q "onboot" ) && echo "true" || echo "false")
 | 
			
		||||
    template=$($config_cmd $instance | grep template | grep -q "template:" && echo "true" || echo "false")
 | 
			
		||||
    template=$($config_cmd $instance | grep -q "^template:" && echo "true" || echo "false")
 | 
			
		||||
 | 
			
		||||
    if [ "$onboot" == "true" ]; then
 | 
			
		||||
      echo "Skipping $instance because it is set not to boot"
 | 
			
		||||
@@ -62,36 +71,49 @@ while true; do
 | 
			
		||||
      continue
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Ping the instance
 | 
			
		||||
    if ! ping -c 1 $IP >/dev/null 2>&1; then
 | 
			
		||||
      # If the instance can not be pinged, stop and start it
 | 
			
		||||
      if pct status $instance >/dev/null 2>&1; then
 | 
			
		||||
        # It is a container
 | 
			
		||||
    # Check for mon-restart tag
 | 
			
		||||
    has_tag=$($config_cmd $instance | grep -q "tags:.*mon-restart" && echo "true" || echo "false")
 | 
			
		||||
    if [ "$has_tag" != "true" ]; then
 | 
			
		||||
      echo "Skipping $instance because it does not have 'mon-restart' tag"
 | 
			
		||||
      continue
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Responsiveness check and restart if needed
 | 
			
		||||
    if [ "$type" == "vm" ]; then
 | 
			
		||||
      # Check if guest agent responds
 | 
			
		||||
      if qm guest cmd $instance ping >/dev/null 2>&1; then
 | 
			
		||||
        echo "VM $instance is responsive via guest agent"
 | 
			
		||||
      else
 | 
			
		||||
        echo "$(date): VM $instance is not responding to agent ping, restarting..."
 | 
			
		||||
        if qm status $instance | grep -q "status: running"; then
 | 
			
		||||
          qm stop $instance >/dev/null 2>&1
 | 
			
		||||
          sleep 5
 | 
			
		||||
        fi
 | 
			
		||||
        qm start $instance >/dev/null 2>&1
 | 
			
		||||
      fi
 | 
			
		||||
    else
 | 
			
		||||
      # Container: get IP and ping
 | 
			
		||||
      IP=$(pct exec $instance ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
 | 
			
		||||
      if ! ping -c 1 $IP >/dev/null 2>&1; then
 | 
			
		||||
        echo "$(date): CT $instance is not responding, restarting..."
 | 
			
		||||
        pct stop $instance >/dev/null 2>&1
 | 
			
		||||
        sleep 5
 | 
			
		||||
        pct start $instance >/dev/null 2>&1
 | 
			
		||||
      else
 | 
			
		||||
        # It is a virtual machine
 | 
			
		||||
        if qm status $instance | grep -q "status: running"; then
 | 
			
		||||
          echo "$(date): VM $instance is not responding, restarting..."
 | 
			
		||||
          qm stop $instance >/dev/null 2>&1
 | 
			
		||||
          sleep 5
 | 
			
		||||
        else
 | 
			
		||||
          echo "$(date): VM $instance is not running, starting..."
 | 
			
		||||
        fi
 | 
			
		||||
        qm start $instance >/dev/null 2>&1
 | 
			
		||||
        echo "CT $instance is responsive"
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  # Wait for 5 minutes. (Edit to your needs)
 | 
			
		||||
  echo "$(date): Pausing for 5 minutes..."
 | 
			
		||||
  sleep 300
 | 
			
		||||
done >/var/log/ping-instances.log 2>&1' >/usr/local/bin/ping-instances.sh
 | 
			
		||||
 | 
			
		||||
done >/var/log/ping-instances.log 2>&1
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
  touch /var/log/ping-instances.log
 | 
			
		||||
  # Change file permissions to executable
 | 
			
		||||
  chmod +x /usr/local/bin/ping-instances.sh
 | 
			
		||||
 | 
			
		||||
  cat <<EOF >/etc/systemd/system/ping-instances.timer
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Delay ping-instances.service by 5 minutes
 | 
			
		||||
@@ -104,17 +126,17 @@ OnUnitActiveSec=300
 | 
			
		||||
WantedBy=timers.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
  # Create ping-instances.service
 | 
			
		||||
  cat <<EOF >/etc/systemd/system/ping-instances.service
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Ping instances every 5 minutes and restarts if necessary
 | 
			
		||||
Description=Ping instances every 5 minutes and restart if necessary
 | 
			
		||||
After=ping-instances.timer
 | 
			
		||||
Requires=ping-instances.timer
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
# To specify which CT/VM should be excluded, add the CT/VM ID at the end of the line where ExecStart=/usr/local/bin/ping-instances.sh is specified.
 | 
			
		||||
# For example: ExecStart=/usr/local/bin/ping-instances.sh 100 102
 | 
			
		||||
# Virtual machines without the QEMU guest agent installed must be excluded.
 | 
			
		||||
# To exclude specific instances, pass IDs to ExecStart, e.g.:
 | 
			
		||||
# ExecStart=/usr/local/bin/ping-instances.sh 100 200
 | 
			
		||||
# Instances must also have the 'mon-restart' tag to be monitored
 | 
			
		||||
 | 
			
		||||
ExecStart=/usr/local/bin/ping-instances.sh
 | 
			
		||||
Restart=always
 | 
			
		||||
@@ -125,39 +147,33 @@ StandardError=file:/var/log/ping-instances.log
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
  # Reload daemon, enable and start ping-instances.service
 | 
			
		||||
  systemctl daemon-reload
 | 
			
		||||
  systemctl enable -q --now ping-instances.timer
 | 
			
		||||
  systemctl enable -q --now ping-instances.service
 | 
			
		||||
  clear
 | 
			
		||||
  echo -e "\n To view Monitor All logs: cat /var/log/ping-instances.log"
 | 
			
		||||
  echo -e "\n Monitor All installed."
 | 
			
		||||
  echo "📄 To view logs: cat /var/log/ping-instances.log"
 | 
			
		||||
  echo "⚙️  Make sure your VMs or containers have the 'mon-restart' tag to be monitored."
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
remove() {
 | 
			
		||||
  systemctl disable -q --now ping-instances.timer
 | 
			
		||||
  systemctl disable -q --now ping-instances.service
 | 
			
		||||
  rm /etc/systemd/system/ping-instances.service /etc/systemd/system/ping-instances.timer /usr/local/bin/ping-instances.sh /var/log/ping-instances.log
 | 
			
		||||
  echo "Removed Monitor All from Proxmox VE"
 | 
			
		||||
  rm -f /etc/systemd/system/ping-instances.service
 | 
			
		||||
  rm -f /etc/systemd/system/ping-instances.timer
 | 
			
		||||
  rm -f /usr/local/bin/ping-instances.sh
 | 
			
		||||
  rm -f /var/log/ping-instances.log
 | 
			
		||||
  echo "Monitor All removed from Proxmox VE"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Define options for the whiptail menu
 | 
			
		||||
OPTIONS=(Add "Add Monitor-All to Proxmox VE"
 | 
			
		||||
  Remove "Remove Monitor-All from Proxmox VE")
 | 
			
		||||
 | 
			
		||||
# Show the whiptail menu and save the user's choice
 | 
			
		||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Monitor-All for Proxmox VE" --menu "Select an option:" 10 58 2 \
 | 
			
		||||
  "${OPTIONS[@]}" 3>&1 1>&2 2>&3)
 | 
			
		||||
 | 
			
		||||
# Check the user's choice and perform the corresponding action
 | 
			
		||||
case $CHOICE in
 | 
			
		||||
"Add")
 | 
			
		||||
  add
 | 
			
		||||
  ;;
 | 
			
		||||
"Remove")
 | 
			
		||||
  remove
 | 
			
		||||
  ;;
 | 
			
		||||
*)
 | 
			
		||||
  echo "Exiting..."
 | 
			
		||||
  exit 0
 | 
			
		||||
  ;;
 | 
			
		||||
"Add") add ;;
 | 
			
		||||
"Remove") remove ;;
 | 
			
		||||
*) echo "Exiting..."; exit 0 ;;
 | 
			
		||||
esac
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ function update_container() {
 | 
			
		||||
  echo -e "\n [Info] Updating $container : $name \n"
 | 
			
		||||
  os=$(pct config "$container" | awk '/^ostype/ {print $2}')
 | 
			
		||||
  case "$os" in
 | 
			
		||||
  alpine) pct exec "$container" -- ash -c "apk update && apk upgrade" ;;
 | 
			
		||||
  alpine) pct exec "$container" -- ash -c "apk -U upgrade" ;;
 | 
			
		||||
  archlinux) pct exec "$container" -- bash -c "pacman -Syyu --noconfirm" ;;
 | 
			
		||||
  fedora | rocky | centos | alma) pct exec "$container" -- bash -c "dnf -y update && dnf -y upgrade" ;;
 | 
			
		||||
  ubuntu | debian | devuan) pct exec "$container" -- bash -c "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -o Dpkg::Options::="--force-confold" dist-upgrade -y; rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED" ;;
 | 
			
		||||
@@ -33,17 +33,17 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
 | 
			
		||||
    echo -e "[Info] Skipping $container"
 | 
			
		||||
    sleep 1
 | 
			
		||||
  else
 | 
			
		||||
    status=$(pct status $container)
 | 
			
		||||
    template=$(pct config $container | grep -q "template:" && echo "true" || echo "false")
 | 
			
		||||
    status=$(pct status "$container")
 | 
			
		||||
    template=$(pct config "$container" | grep -q "template:" && echo "true" || echo "false")
 | 
			
		||||
    if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then
 | 
			
		||||
      echo -e "[Info] Starting $container"
 | 
			
		||||
      pct start $container
 | 
			
		||||
      pct start "$container"
 | 
			
		||||
      sleep 5
 | 
			
		||||
      update_container $container
 | 
			
		||||
      update_container "$container"
 | 
			
		||||
      echo -e "[Info] Shutting down $container"
 | 
			
		||||
      pct shutdown $container &
 | 
			
		||||
      pct shutdown "$container" &
 | 
			
		||||
    elif [ "$status" == "status: running" ]; then
 | 
			
		||||
      update_container $container
 | 
			
		||||
      update_container "$container"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
# License: MIT
 | 
			
		||||
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
 | 
			
		||||
 | 
			
		||||
function header_info {
 | 
			
		||||
function header_info() {
 | 
			
		||||
  clear
 | 
			
		||||
  cat <<"EOF"
 | 
			
		||||
   __  __          __      __          __   _  ________
 | 
			
		||||
@@ -64,7 +64,7 @@ function update_container() {
 | 
			
		||||
    echo -e "${BL}[Info]${GN} Updating ${BL}$container${CL} : ${GN}$name${CL} - ${YW}[No disk info for ${os}]${CL}\n"
 | 
			
		||||
  fi
 | 
			
		||||
  case "$os" in
 | 
			
		||||
  alpine) pct exec "$container" -- ash -c "apk update && apk upgrade" ;;
 | 
			
		||||
  alpine) pct exec "$container" -- ash -c "apk -U upgrade" ;;
 | 
			
		||||
  archlinux) pct exec "$container" -- bash -c "pacman -Syyu --noconfirm" ;;
 | 
			
		||||
  fedora | rocky | centos | alma) pct exec "$container" -- bash -c "dnf -y update && dnf -y upgrade" ;;
 | 
			
		||||
  ubuntu | debian | devuan) pct exec "$container" -- bash -c "apt-get update 2>/dev/null | grep 'packages.*upgraded'; apt list --upgradable && apt-get -yq dist-upgrade 2>&1; rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED" ;;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user