Compare commits

...

72 Commits

Author SHA1 Message Date
b3bda56498 Update CHANGELOG.md (#4425)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 02:15:26 +02:00
e59f868966 Update versions.json (#4424)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 02:14:43 +02:00
a9b53afcc5 Update CHANGELOG.md (#4422)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 20:23:27 +02:00
38cf296a4c homarr: fetch versions dynamically from source repo (#4409)
* pull homarr version dynamically from source repo

* fix homarr install to directly fetch pnpm and node version
2025-05-12 20:22:48 +02:00
35c0d269ac Update .app files (#4421)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-05-12 20:03:45 +02:00
d7211e856e Update CHANGELOG.md (#4420)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 20:03:37 +02:00
dfbb1a8035 Alpine-Traefik (#4412) 2025-05-12 20:02:53 +02:00
61b09e926a Update CHANGELOG.md (#4417)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 16:07:32 +02:00
9140fd52ac Use onliner for updates (#4414) 2025-05-12 16:07:07 +02:00
4a3ee4db67 Update CHANGELOG.md (#4416)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 15:58:40 +02:00
b333d8c3f9 Feature: LXC-Delete (pve helper): add "all items" (#4296) 2025-05-12 15:58:14 +02:00
245b35d01e Update CHANGELOG.md (#4415)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 15:55:06 +02:00
37d20ba0dd Config file Function in build.func (#4411)
* Refactor Config_File function

* Refactor Config_File function
2025-05-12 15:54:38 +02:00
b5062c51af Update versions.json (#4410)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 14:07:38 +02:00
1ea830c955 Update CHANGELOG.md (#4407)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 11:55:04 +02:00
be31ecf432 Navidrome - Fix config path (use /etc/ instead of /var/lib) (#4406)
* Fix config path for Navidrome (use /etc/ instead of /var/lib)

The default systemd service loads /etc/navidrome/navidrome.toml via -c. Therefore, changes to /var/lib/navidrome/navidrome.toml have no effect unless manually specified.

Thanks for the great scripts!

* Update navidrome.json - forgot "config_path"
2025-05-12 11:54:27 +02:00
c586dfe87f Update CHANGELOG.md (#4400)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 02:15:53 +02:00
7f65be34ff Update versions.json (#4399)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-12 02:15:23 +02:00
c158dbb3ea Update CHANGELOG.md (#4393)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-11 17:13:12 +02:00
95acf8c018 Enable ElasticSearch service (#4391) 2025-05-11 17:12:46 +02:00
6c5aa6677a Update versions.json (#4392)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-11 14:06:43 +02:00
43ff379ed4 Update CHANGELOG.md (#4388)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-11 02:15:59 +02:00
2c2849179a Update versions.json (#4387)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-11 02:15:20 +02:00
d116505ff2 Update CHANGELOG.md (#4384)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-10 23:24:23 +02:00
42535e14ab (fix) Documenso: fix build failures (#4382)
- change build command
- change port in ENV file; remove unneeded sed cmds
- change systemd service file
- ensure turbo daemon is stopped to prevent hang on exit
2025-05-10 23:23:51 +02:00
990ce16a7d Portainer is on https port (#4371) 2025-05-10 15:23:43 +02:00
af1cf0bc71 Fix verbose (#4373) 2025-05-10 15:23:13 +02:00
e166115745 Update versions.json (#4379)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-10 14:06:45 +02:00
bdef92cc71 Update CHANGELOG.md (#4378)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-10 08:43:49 +02:00
1e59c934ec Jellyseerr: better handling of node and pnpm (#4365)
* Jellyseerr: better handling of node and pnpm

* Update jellyseerr.sh
2025-05-10 08:42:45 +02:00
456b00882d Update CHANGELOG.md (#4377)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-10 02:14:47 +02:00
9b8a30c84f Update versions.json (#4376)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-10 02:14:03 +02:00
3b90e3fe15 Update CHANGELOG.md (#4374)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-10 01:55:40 +02:00
5e3a5bb24c HomeAssistant-Core: update script for 2025.5+ (#4363)
* HomeAssistant-Core: update script for 2025.5+

* Update homeassistant-core-install.sh
2025-05-10 01:55:09 +02:00
7413a03009 Update CHANGELOG.md (#4367)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-09 23:24:43 +02:00
bb1c9d73c4 Authentik: change install to UV & increase resources to 10GB RAM (#4364) 2025-05-09 23:24:06 +02:00
3b5a901832 Revert "fix: detect all bridge types, not just vmbr prefix (#4351)" (#4362)
This reverts commit 9d21ceacc3.
2025-05-09 21:55:07 +02:00
a62a4876ec Update CHANGELOG.md (#4358)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-09 20:53:25 +02:00
9d21ceacc3 fix: detect all bridge types, not just vmbr prefix (#4351) 2025-05-09 20:53:01 +02:00
c604aeb064 fix app/application var mapping (#4357) 2025-05-09 20:30:29 +02:00
9b9ed2f6e1 Update CHANGELOG.md (#4348)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-09 15:33:19 +02:00
1ddc74d2b5 Update versions.json (#4347)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-09 15:32:39 +02:00
ee9f6dd818 Update CHANGELOG.md (#4346)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-09 15:28:43 +02:00
a1754dff4e Feature: Autologin for Alpine (#4344) 2025-05-09 15:28:12 +02:00
4827a17ba3 Update CHANGELOG.md (#4336)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-09 15:24:04 +02:00
b5ed7b9f4e Auto-Merge Automatic PR (#4343)
* Make Automatic issues auto-close

* Change PAT
2025-05-09 15:20:43 +02:00
ab9760194d Add a Repo check to all Workflows (#4339) 2025-05-09 13:15:59 +02:00
abb5b6d5ac Update versions.json (#4332)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-09 12:08:58 +02:00
4656fe21f9 remove documenso/suwayomi from website 2025-05-09 11:19:23 +02:00
93e503eb87 Upscale resources (#4329) 2025-05-08 21:41:59 +02:00
6ab80dc5e3 Update streamlink-webui.sh (#4328) 2025-05-08 19:50:53 +02:00
ceaff9006a Update CHANGELOG.md (#4325)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-08 16:18:12 +02:00
c749fe6fb0 Update build.func (#4327) 2025-05-08 16:17:48 +02:00
402586756f build.func Change the menu for Bridge Selection (#4326)
* Change the menu for Bridge Selection

* Change the menu for Bridge Selection

* Change the menu for Bridge Selection
2025-05-08 15:50:34 +02:00
19800da808 Update CHANGELOG.md (#4323)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-08 15:21:13 +02:00
d62da0c982 Update versions.json (#4324)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-08 15:20:58 +02:00
41df1d5a76 Update searxng-install.sh (#4322)
The build script in the repository needs to use the same Python virtualenv as the running one. This change is suggested from their docs: https://docs.searxng.org/admin/installation-searxng.html#install-searxng-dependencies
2025-05-08 14:04:19 +02:00
bcdf8f15e7 Update openwrt.sh 2025-05-08 13:23:22 +02:00
326cbc3bec Update CHANGELOG.md (#4315)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-08 13:03:54 +02:00
607d966322 Bugfix: Mikrotik & Pimox HAOS VM (NEXTID) (#4313) 2025-05-08 12:57:27 +02:00
69298090ce FAQ: Explanation "updatable" (#4300)
* Update FAQ

* Update frontend/src/config/faqConfig.tsx
2025-05-08 11:01:42 +02:00
9c7d50fdff Update versions.json (#4307) 2025-05-08 10:51:27 +02:00
fabbe8fe59 Update streamlink-webui.sh (#4314) 2025-05-08 10:50:45 +02:00
6abb55ba86 Update CHANGELOG.md (#4293)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-08 06:38:00 +02:00
9cddbbd986 Update docs (#4298) 2025-05-07 15:21:03 +02:00
31c7c9301c Update versions.json (#4297)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-07 14:32:30 +02:00
c9aad3a54d Feature: get correct next VMID (#4292)
fix(vm-creation): ensure whiptail VMID inputbox is pre-filled with a valid and available ID

- Replaced hardcoded NEXTID usage with a new get_valid_nextid() function
- Ensures no collision with existing VMs, LXCs or orphaned LVM volumes
- Improves user experience by properly pre-filling whiptail inputbox
- Automatically skips invalid IDs instead of failing on alloc
2025-05-07 12:37:46 +02:00
ebc17e120e Update CHANGELOG.md (#4290)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-07 10:45:52 +02:00
1ebb1782fa Give more disk space to LXC (#4288) 2025-05-07 10:40:49 +02:00
cce3ca1996 Update CHANGELOG.md (#4287)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-07 10:04:46 +02:00
eb6018ac01 SuwayomiServer: Bump Java to v21, code formating (#3987)
* Bump java to v21, code formating

* Refactoring

* Update

* Update

* Update suwayomiserver.sh

---------

Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
2025-05-07 09:52:39 +02:00
3b54371d5c Update versions.json (#4285) 2025-05-07 08:20:00 +02:00
82 changed files with 1610 additions and 1158 deletions

View File

@ -10,6 +10,7 @@ on:
jobs: jobs:
update-app-files: update-app-files:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
permissions: permissions:
@ -89,15 +90,16 @@ jobs:
if [ -n "$PR_NUMBER" ]; then if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve gh pr review $PR_NUMBER --approve
fi fi
- name: Re-approve pull request after update - name: Approve pull request and merge
if: env.changed == 'true' if: env.changed == 'true'
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
run: | run: |
PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number') PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number')
if [ -n "$PR_NUMBER" ]; then if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve gh pr review $PR_NUMBER --approve
gh pr merge $PR_NUMBER --squash --admin
fi fi
# Step 8: Output success message when no changes # Step 8: Output success message when no changes

View File

@ -7,6 +7,7 @@ on:
jobs: jobs:
autolabeler: autolabeler:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
permissions: permissions:
pull-requests: write pull-requests: write

View File

@ -7,6 +7,7 @@ on:
jobs: jobs:
update-changelog-pull-request: update-changelog-pull-request:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
env: env:
CONFIG_PATH: .github/changelog-pr-config.json CONFIG_PATH: .github/changelog-pr-config.json
@ -263,6 +264,17 @@ jobs:
gh pr review $PR_NUMBER --approve gh pr review $PR_NUMBER --approve
fi fi
- name: Approve pull request and merge
if: env.changed == 'true'
env:
GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
run: |
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve
gh pr merge $PR_NUMBER --squash --admin
fi
- name: Re-approve pull request after update - name: Re-approve pull request after update
if: env.changed == 'true' if: env.changed == 'true'
env: env:
@ -271,4 +283,4 @@ jobs:
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number') PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
if [ -n "$PR_NUMBER" ]; then if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve gh pr review $PR_NUMBER --approve
fi fi

View File

@ -11,6 +11,7 @@ permissions:
jobs: jobs:
close-discussion: close-discussion:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
steps: steps:

View File

@ -5,6 +5,7 @@ on:
jobs: jobs:
close_tteck_issues: close_tteck_issues:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Auto-close if tteck script detected - name: Auto-close if tteck script detected

View File

@ -5,7 +5,7 @@ on:
- closed - closed
jobs: jobs:
close_issue: close_issue:
if: github.event.pull_request.merged == true if: github.event.pull_request.merged == true && github.repository == 'community-scripts/ProxmoxVE'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:

View File

@ -12,6 +12,7 @@ permissions:
jobs: jobs:
crawl-versions: crawl-versions:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
steps: steps:
@ -103,6 +104,17 @@ jobs:
gh pr review $PR_NUMBER --approve gh pr review $PR_NUMBER --approve
fi fi
- name: Approve pull request and merge
if: env.changed == 'true'
env:
GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
run: |
PR_NUMBER=$(gh pr list --head "update_versions" --json number --jq '.[].number')
if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve
gh pr merge $PR_NUMBER --squash --admin
fi
- name: Re-approve pull request after update - name: Re-approve pull request after update
if: env.changed == 'true' if: env.changed == 'true'
env: env:

View File

@ -11,6 +11,7 @@ on:
jobs: jobs:
build: build:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: ubuntu-latest #To ensure it always builds we use the github runner with all the right tooling runs-on: ubuntu-latest #To ensure it always builds we use the github runner with all the right tooling
steps: steps:

View File

@ -9,6 +9,7 @@ on:
jobs: jobs:
delete_branch: delete_branch:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
steps: steps:
- name: Checkout the code - name: Checkout the code
@ -25,4 +26,4 @@ jobs:
git push origin --delete "$PR_BRANCH" git push origin --delete "$PR_BRANCH"
else else
echo "Skipping deletion of the main branch" echo "Skipping deletion of the main branch"
fi fi

View File

@ -25,6 +25,7 @@ concurrency:
jobs: jobs:
build: build:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
defaults: defaults:
run: run:
@ -63,7 +64,7 @@ jobs:
deploy: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: build needs: build
if: github.ref == 'refs/heads/main' if: github.ref == 'refs/heads/main' && github.repository == 'community-scripts/ProxmoxVE'
permissions: permissions:
pages: write pages: write
id-token: write id-token: write

View File

@ -7,6 +7,7 @@ on:
jobs: jobs:
create-daily-release: create-daily-release:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
permissions: permissions:
contents: write contents: write

View File

@ -11,6 +11,7 @@ on:
jobs: jobs:
run-install-script: run-install-script:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: pvenode runs-on: pvenode
steps: steps:
- name: Checkout PR branch - name: Checkout PR branch

View File

@ -11,6 +11,7 @@ on:
jobs: jobs:
run-install-script: run-install-script:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: pvenode runs-on: pvenode
steps: steps:
- name: Checkout PR branch (supports forks) - name: Checkout PR branch (supports forks)

View File

@ -72,8 +72,7 @@ network_check() {
update_os() { update_os() {
msg_info "Updating Container OS" msg_info "Updating Container OS"
apk update $STD apk -U upgrade
apk upgrade
msg_ok "Updated Container OS" msg_ok "Updated Container OS"
} }
@ -83,4 +82,4 @@ motd_ssh() {
customize() { customize() {
return return
} }

View File

@ -10,6 +10,7 @@ on:
jobs: jobs:
update-app-files: update-app-files:
if: github.repository == 'community-scripts/ProxmoxVE'
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
permissions: permissions:
@ -125,6 +126,16 @@ jobs:
if [ -n "$PR_NUMBER" ]; then if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve gh pr review $PR_NUMBER --approve
fi fi
- name: Approve pull request and merge
if: env.changed == 'true'
env:
GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }}
run: |
PR_NUMBER=$(gh pr list --head "${{ env.BRANCH_NAME }}" --json number --jq '.[].number')
if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve
gh pr merge $PR_NUMBER --squash --admin
fi
- name: No changes detected - name: No changes detected
if: env.changed == 'false' if: env.changed == 'false'

View File

@ -9,6 +9,7 @@ on:
jobs: jobs:
check-files: check-files:
if: github.repository == 'community-scripts/ProxmoxVE'
name: Check changed files name: Check changed files
runs-on: runner-cluster-htl-set runs-on: runner-cluster-htl-set
permissions: permissions:

View File

@ -14,6 +14,118 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment. All LXC instances created using this repository come pre-installed with Midnight Commander, which is a command-line tool (`mc`) that offers a user-friendly file and directory management interface for the terminal environment.
## 2025-05-13
## 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
- #### 🐞 Bug Fixes
- Authentik: change install to UV & increase resources to 10GB RAM [@MickLesk](https://github.com/MickLesk) ([#4364](https://github.com/community-scripts/ProxmoxVE/pull/4364))
- #### ✨ New Features
- HomeAssistant-Core: update script for 2025.5+ [@MickLesk](https://github.com/MickLesk) ([#4363](https://github.com/community-scripts/ProxmoxVE/pull/4363))
- Feature: autologin for Alpine [@MickLesk](https://github.com/MickLesk) ([#4344](https://github.com/community-scripts/ProxmoxVE/pull/4344))
### 🧰 Maintenance
- #### 💾 Core
- fix: detect all bridge types, not just vmbr prefix [@filippolauria](https://github.com/filippolauria) ([#4351](https://github.com/community-scripts/ProxmoxVE/pull/4351))
- #### 📂 Github
- Add a Repo check to all Workflows [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4339](https://github.com/community-scripts/ProxmoxVE/pull/4339))
- Auto-Merge Automatic PR [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4343](https://github.com/community-scripts/ProxmoxVE/pull/4343))
## 2025-05-08
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- SearXNG: fix to resolve yaml dependency error [@Biendeo](https://github.com/Biendeo) ([#4322](https://github.com/community-scripts/ProxmoxVE/pull/4322))
- Bugfix: Mikrotik & Pimox HAOS VM (NEXTID) [@MickLesk](https://github.com/MickLesk) ([#4313](https://github.com/community-scripts/ProxmoxVE/pull/4313))
### 🧰 Maintenance
- #### 💾 Core
- build.func Change the menu for Bridge Selection [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4326](https://github.com/community-scripts/ProxmoxVE/pull/4326))
### 🌐 Website
- FAQ: Explanation "updatable" [@tremor021](https://github.com/tremor021) ([#4300](https://github.com/community-scripts/ProxmoxVE/pull/4300))
## 2025-05-07
### 🚀 Updated Scripts
- Alpine scripts: Set minimum disk space to 0.5GB [@tremor021](https://github.com/tremor021) ([#4288](https://github.com/community-scripts/ProxmoxVE/pull/4288))
- #### 🐞 Bug Fixes
- SuwayomiServer: Bump Java to v21, code formating [@tremor021](https://github.com/tremor021) ([#3987](https://github.com/community-scripts/ProxmoxVE/pull/3987))
- #### ✨ New Features
- Feature: get correct next VMID [@MickLesk](https://github.com/MickLesk) ([#4292](https://github.com/community-scripts/ProxmoxVE/pull/4292))
### 🌐 Website
- #### 📝 Script Information
- OpenWebUI: Update docs link [@tremor021](https://github.com/tremor021) ([#4298](https://github.com/community-scripts/ProxmoxVE/pull/4298))
## 2025-05-06 ## 2025-05-06
### 🆕 New Scripts ### 🆕 New Scripts

View File

@ -20,21 +20,20 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
msg_info "Updating Alpine Packages" msg_info "Updating Alpine Packages"
$STD apk update $STD apk -U upgrade
$STD apk upgrade msg_ok "Updated Alpine Packages"
msg_ok "Updated Alpine Packages"
msg_info "Updating AdGuard Home" msg_info "Updating AdGuard Home"
$STD /opt/AdGuardHome/AdGuardHome --update $STD /opt/AdGuardHome/AdGuardHome --update
msg_ok "Updated AdGuard Home" msg_ok "Updated AdGuard Home"
msg_info "Restarting AdGuard Home" msg_info "Restarting AdGuard Home"
$STD rc-service adguardhome restart $STD rc-service adguardhome restart
msg_ok "Restarted AdGuard Home" msg_ok "Restarted AdGuard Home"
exit 0 exit 0
} }
start start

View File

@ -36,7 +36,7 @@ function update_script() {
header_info header_info
case $CHOICE in case $CHOICE in
1) 1)
apk update && apk upgrade $STD apk -U upgrade
exit exit
;; ;;
esac esac
@ -47,4 +47,4 @@ start
build_container build_container
description description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"

View File

@ -20,19 +20,18 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
msg_info "Updating Alpine Packages" msg_info "Updating Alpine Packages"
apk update $STD apk -U upgrade
apk upgrade msg_ok "Updated Alpine Packages"
msg_ok "Updated Alpine Packages"
msg_info "Updating Gitea" msg_info "Updating Gitea"
apk upgrade gitea apk upgrade gitea
msg_ok "Updated Gitea" msg_ok "Updated Gitea"
msg_info "Restarting Gitea" msg_info "Restarting Gitea"
rc-service gitea restart rc-service gitea restart
msg_ok "Restarted Gitea" msg_ok "Restarted Gitea"
} }
start start
@ -42,4 +41,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"

View File

@ -39,7 +39,7 @@ function update_script() {
header_info header_info
case $CHOICE in case $CHOICE in
1) 1)
apk update && apk upgrade $STD apk -U upgrade
exit exit
;; ;;
2) 2)
@ -62,4 +62,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL. echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:3000${CL} \n" ${BL}http://${IP}:3000${CL} \n"

View File

@ -9,7 +9,7 @@ APP="Alpine-IT-Tools"
var_tags="${var_tags:-alpine;development}" var_tags="${var_tags:-alpine;development}"
var_cpu="${var_cpu:-1}" var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-256}" var_ram="${var_ram:-256}"
var_disk="${var_disk:-0.2}" var_disk="${var_disk:-0.5}"
var_os="${var_os:-alpine}" var_os="${var_os:-alpine}"
var_version="${var_version:-3.21}" var_version="${var_version:-3.21}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
@ -20,32 +20,32 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [ ! -d /usr/share/nginx/html ]; then if [ ! -d /usr/share/nginx/html ]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit 1 exit 1
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/CorentinTh/it-tools/releases/latest | grep '"tag_name":' | cut -d '"' -f4) RELEASE=$(curl -fsSL https://api.github.com/repos/CorentinTh/it-tools/releases/latest | grep '"tag_name":' | cut -d '"' -f4)
if [ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ] || [ ! -f /opt/${APP}_version.txt ]; then if [ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ] || [ ! -f /opt/${APP}_version.txt ]; then
DOWNLOAD_URL="https://github.com/CorentinTh/it-tools/releases/download/${RELEASE}/it-tools-${RELEASE#v}.zip" DOWNLOAD_URL="https://github.com/CorentinTh/it-tools/releases/download/${RELEASE}/it-tools-${RELEASE#v}.zip"
msg_info "Updating ${APP} LXC" msg_info "Updating ${APP} LXC"
curl -fsSL -o it-tools.zip "$DOWNLOAD_URL" curl -fsSL -o it-tools.zip "$DOWNLOAD_URL"
mkdir -p /usr/share/nginx/html mkdir -p /usr/share/nginx/html
rm -rf /usr/share/nginx/html/* rm -rf /usr/share/nginx/html/*
unzip -q it-tools.zip -d /tmp/it-tools unzip -q it-tools.zip -d /tmp/it-tools
cp -r /tmp/it-tools/dist/* /usr/share/nginx/html cp -r /tmp/it-tools/dist/* /usr/share/nginx/html
rm -rf /tmp/it-tools rm -rf /tmp/it-tools
rm -f it-tools.zip rm -f it-tools.zip
msg_ok "Updated Successfully" msg_ok "Updated Successfully"
else else
msg_ok "No update required. ${APP} is already at ${RELEASE}" msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi fi
exit 0 exit 0
} }
start start
@ -55,4 +55,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following IP:${CL}" echo -e "${INFO}${YW} Access it using the following IP:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"

View File

@ -20,20 +20,19 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
msg_info "Updating Alpine Packages" msg_info "Updating Alpine Packages"
$STD apk update $STD apk -U upgrade
$STD apk upgrade msg_ok "Updated Alpine Packages"
msg_ok "Updated Alpine Packages"
msg_info "Updating MariaDB" msg_info "Updating MariaDB"
$STD apk upgrade mariadb mariadb-client $STD apk upgrade mariadb mariadb-client
msg_ok "Updated MariaDB" msg_ok "Updated MariaDB"
msg_info "Restarting MariaDB" msg_info "Restarting MariaDB"
$STD rc-service mariadb restart $STD rc-service mariadb restart
msg_ok "Restarted MariaDB" msg_ok "Restarted MariaDB"
exit 0 exit 0
} }
start start

View File

@ -20,24 +20,23 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
msg_info "Updating Alpine Packages" msg_info "Updating Alpine Packages"
$STD apk update $STD apk -U upgrade
$STD apk upgrade msg_ok "Updated Alpine Packages"
msg_ok "Updated Alpine Packages"
msg_info "Updating Node.js and npm" msg_info "Updating Node.js and npm"
$STD apk upgrade nodejs npm $STD apk upgrade nodejs npm
msg_ok "Updated Node.js and npm" msg_ok "Updated Node.js and npm"
msg_info "Updating Node-RED" msg_info "Updating Node-RED"
$STD npm install -g --unsafe-perm node-red $STD npm install -g --unsafe-perm node-red
msg_ok "Updated Node-RED" msg_ok "Updated Node-RED"
msg_info "Restarting Node-RED" msg_info "Restarting Node-RED"
$STD rc-service nodered restart $STD rc-service nodered restart
msg_ok "Restarted Node-RED" msg_ok "Restarted Node-RED"
exit 0 exit 0
} }
start start

View File

@ -21,8 +21,7 @@ catch_errors
function update_script() { function update_script() {
msg_info "Updating Alpine Packages" msg_info "Updating Alpine Packages"
$STD apk update $STD apk -U upgrade
$STD apk upgrade
msg_ok "Updated Alpine Packages" msg_ok "Updated Alpine Packages"
msg_info "Updating PostgreSQL" msg_info "Updating PostgreSQL"

View File

@ -20,20 +20,19 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
msg_info "Updating Alpine Packages" msg_info "Updating Alpine Packages"
$STD apk update $STD apk -U upgrade
$STD apk upgrade msg_ok "Updated Alpine Packages"
msg_ok "Updated Alpine Packages"
msg_info "Updating Prometheus" msg_info "Updating Prometheus"
$STD apk upgrade prometheus $STD apk upgrade prometheus
msg_ok "Updated Prometheus" msg_ok "Updated Prometheus"
msg_info "Restarting Prometheus" msg_info "Restarting Prometheus"
$STD rc-service prometheus restart $STD rc-service prometheus restart
msg_ok "Restarted Prometheus" msg_ok "Restarted Prometheus"
exit 0 exit 0
} }
start start

View File

@ -26,8 +26,7 @@ function update_script() {
fi fi
msg_info "Updating Alpine Packages" msg_info "Updating Alpine Packages"
$STD apk update $STD apk -U upgrade
$STD apk upgrade
msg_ok "Updated Alpine Packages" msg_ok "Updated Alpine Packages"
msg_info "Updating tinyauth" msg_info "Updating tinyauth"

41
ct/alpine-traefik.sh Normal file
View 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}"

View File

@ -37,14 +37,15 @@ function update_script() {
header_info header_info
case $CHOICE in case $CHOICE in
1) 1)
apk update && apk upgrade && rc-service vaultwarden restart -q $STD apk -U upgrade
rc-service vaultwarden restart -q
exit exit
;; ;;
2) 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 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 [[ -z "$NEWTOKEN" ]]; then exit-script; fi
if ! command -v argon2 >/dev/null 2>&1; then apk add argon2 &>/dev/null; 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 if [[ ! -f /var/lib/vaultwarden/config.json ]]; then
sed -i "s|export ADMIN_TOKEN=.*|export ADMIN_TOKEN='${TOKEN}'|" /etc/conf.d/vaultwarden sed -i "s|export ADMIN_TOKEN=.*|export ADMIN_TOKEN='${TOKEN}'|" /etc/conf.d/vaultwarden
else else
@ -65,4 +66,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${APP} should be reachable by going to the following URL. echo -e "${APP} should be reachable by going to the following URL.
${BL}http://${IP}:8000${CL} \n" ${BL}http://${IP}:8000${CL} \n"

View File

@ -21,8 +21,7 @@ catch_errors
function update_script() { function update_script() {
msg_info "Updating Alpine Packages" msg_info "Updating Alpine Packages"
$STD apk update $STD apk -U upgrade
$STD apk upgrade
msg_ok "Updated Alpine Packages" msg_ok "Updated Alpine Packages"
msg_info "update wireguard-tools" msg_info "update wireguard-tools"

View File

@ -36,7 +36,7 @@ function update_script() {
header_info header_info
case $CHOICE in case $CHOICE in
1) 1)
apk update && apk upgrade $STD apk -U upgrade
exit exit
;; ;;
esac esac
@ -47,4 +47,4 @@ start
build_container build_container
description description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"

View File

@ -9,7 +9,7 @@ APP="Alpine"
var_tags="${var_tags:-os;alpine}" var_tags="${var_tags:-os;alpine}"
var_cpu="${var_cpu:-1}" var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}" var_ram="${var_ram:-512}"
var_disk="${var_disk:-0.1}" var_disk="${var_disk:-0.5}"
var_os="${var_os:-alpine}" var_os="${var_os:-alpine}"
var_version="${var_version:-3.21}" var_version="${var_version:-3.21}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
@ -20,13 +20,15 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \ UPD=$(
"1" "Check for Alpine Updates" ON \ whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
3>&1 1>&2 2>&3) "1" "Check for Alpine Updates" ON \
3>&1 1>&2 2>&3
)
header_info header_info
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
apk update && apk upgrade $STD apk -U upgrade
exit exit
fi fi
} }
@ -35,4 +37,4 @@ start
build_container build_container
description description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"

View File

@ -9,7 +9,7 @@ APP="Authentik"
var_tags="${var_tags:-identity-provider}" var_tags="${var_tags:-identity-provider}"
var_disk="${var_disk:-12}" var_disk="${var_disk:-12}"
var_cpu="${var_cpu:-6}" var_cpu="${var_cpu:-6}"
var_ram="${var_ram:-8192}" var_ram="${var_ram:-10240}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
@ -29,6 +29,13 @@ function update_script() {
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/goauthentik/authentik/releases/latest | grep "tarball_url" | awk '{print substr($2, 2, length($2)-3)}') RELEASE=$(curl -fsSL https://api.github.com/repos/goauthentik/authentik/releases/latest | grep "tarball_url" | awk '{print substr($2, 2, length($2)-3)}')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
NODE_VERSION="22"
PG_VERSION="16"
setup_uv
install_postgresql
install_node_and_modules
install_go
msg_info "Stopping ${APP}" msg_info "Stopping ${APP}"
systemctl stop authentik-server systemctl stop authentik-server
systemctl stop authentik-worker systemctl stop authentik-worker
@ -54,17 +61,14 @@ function update_script() {
go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/ go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/
msg_ok "Built ${APP} server" msg_ok "Built ${APP} server"
msg_info "Installing Python Dependencies" msg_info "Building Authentik"
cd /opt/authentik cd /opt/authentik
$STD poetry install --only=main --no-ansi --no-interaction --no-root $STD uv sync --frozen --no-install-project --no-dev
$STD poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt uv run python -m lifecycle.migrate
$STD pip install --no-cache-dir -r requirements.txt ln -s /opt/authentik/.venv/bin/gunicorn /usr/local/bin/gunicorn
$STD pip install . ln -s /opt/authentik/.venv/bin/celery /usr/local/bin/celery
msg_ok "Installed Python Dependencies" msg_ok "Authentik built"
msg_info "Updating ${APP} to v${RELEASE} (Patience)"
cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints
$STD bash /opt/authentik/lifecycle/ak migrate
echo "${RELEASE}" >/opt/${APP}_version.txt echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to v${RELEASE}" msg_ok "Updated ${APP} to v${RELEASE}"

View File

@ -20,46 +20,51 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /opt/documenso ]]; then if [[ ! -d /opt/documenso ]]; then
msg_error "No ${APP} Installation Found!" 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
exit 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 start

View File

@ -0,0 +1,6 @@
___ __ _ ______ _____ __
/ | / /___ (_)___ ___ /_ __/________ ____ / __(_) /__
/ /| | / / __ \/ / __ \/ _ \______/ / / ___/ __ `/ _ \/ /_/ / //_/
/ ___ |/ / /_/ / / / / / __/_____/ / / / / /_/ / __/ __/ / ,<
/_/ |_/_/ .___/_/_/ /_/\___/ /_/ /_/ \__,_/\___/_/ /_/_/|_|
/_/

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 tteck # Copyright (c) 2021-2025 community-scripts ORG
# Author: tteck (tteckster) | Co-Author: MickLesk (Canbiz) | Co-Author: CrazyWolf13 # Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://homarr.dev/ # Source: https://homarr.dev/
@ -117,11 +117,12 @@ node apps/nextjs/server.js & PID=$!
wait $PID wait $PID
EOF EOF
chmod +x /opt/run_homarr.sh 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") $STD command -v jq || $STD apt-get update && $STD apt-get install -y jq
unzip -q v${RELEASE}.zip NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
rm -rf v${RELEASE}.zip 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 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 mv /opt/homarr-data-backup/.env /opt/homarr/.env
cd /opt/homarr cd /opt/homarr
$STD pnpm install $STD pnpm install
@ -167,4 +168,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7575${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7575${CL}"

View File

@ -21,8 +21,6 @@ catch_errors
function update_script() { function update_script() {
header_info header_info
# OS Check
if ! lsb_release -d | grep -q "Ubuntu 24.10"; then if ! lsb_release -d | grep -q "Ubuntu 24.10"; then
msg_error "Wrong OS detected. This script only supports Ubuntu 24.10." msg_error "Wrong OS detected. This script only supports Ubuntu 24.10."
msg_error "Read Guide: https://github.com/community-scripts/ProxmoxVE/discussions/1549" msg_error "Read Guide: https://github.com/community-scripts/ProxmoxVE/discussions/1549"
@ -32,54 +30,88 @@ function update_script() {
check_container_resources check_container_resources
if [[ ! -d /srv/homeassistant ]]; then if [[ ! -d /srv/homeassistant ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit 1
fi fi
PY=$(ls /srv/homeassistant/lib/) setup_uv
IP=$(hostname -I | awk '{print $1}') IP=$(hostname -I | awk '{print $1}')
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \ UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \
"1" "Update Core" ON \ "1" "Update Core" ON \
"2" "Install HACS" OFF \ "2" "Install HACS" OFF \
"3" "Install FileBrowser" OFF \ "3" "Install FileBrowser" OFF \
3>&1 1>&2 2>&3) 3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SELECT BRANCH" --yesno "Use Beta Branch?" 10 58); then if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SELECT BRANCH" --yesno "Use Beta Branch?" 10 58); then
clear clear
header_info header_info
echo -e "${GN}Updating to Beta Version${CL}" echo -e "${GN}Updating to Beta Version${CL}"
BR="--pre " BR="--pre"
else else
clear clear
header_info header_info
echo -e "${GN}Updating to Stable Version${CL}" echo -e "${GN}Updating to Stable Version${CL}"
BR="" BR=""
fi fi
msg_info "Stopping Home Assistant" msg_info "Stopping Home Assistant"
systemctl stop homeassistant systemctl stop homeassistant
msg_ok "Stopped Home Assistant" msg_ok "Stopped Home Assistant"
if [[ -d /srv/homeassistant/bin ]]; then
msg_info "Migrating to .venv-based structure"
$STD source /srv/homeassistant/bin/activate
PY_VER=$(python3 -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
$STD deactivate
mv /srv/homeassistant "/srv/homeassistant_backup_$PY_VER"
mkdir -p /srv/homeassistant
cd /srv/homeassistant
$STD uv python install 3.13
UV_PYTHON=$(uv python list | awk '/3\.13\.[0-9]+.*\/root\/.local/ {print $2; exit}')
if [[ -z "$UV_PYTHON" ]]; then
msg_error "No local Python 3.13 found via uv"
exit 1
fi
$STD uv venv .venv --python "$UV_PYTHON"
$STD source .venv/bin/activate
$STD uv pip install homeassistant mysqlclient psycopg2-binary isal webrtcvad wheel
mkdir -p /root/.homeassistant
msg_ok "Migration complete"
else
source /srv/homeassistant/.venv/bin/activate
fi
msg_info "Updating Home Assistant" msg_info "Updating Home Assistant"
source /srv/homeassistant/bin/activate $STD uv pip install $BR --upgrade homeassistant
$STD pip install ${BR}--upgrade homeassistant
msg_ok "Updated Home Assistant" msg_ok "Updated Home Assistant"
msg_info "Starting Home Assistant" msg_info "Starting Home Assistant"
if [[ -f /etc/systemd/system/homeassistant.service ]] && grep -q "/srv/homeassistant/bin/python3" /etc/systemd/system/homeassistant.service; then
sed -i 's|ExecStart=/srv/homeassistant/bin/python3|ExecStart=/srv/homeassistant/.venv/bin/python3|' /etc/systemd/system/homeassistant.service
sed -i 's|PATH=/srv/homeassistant/bin|PATH=/srv/homeassistant/.venv/bin|' /etc/systemd/system/homeassistant.service
$STD systemctl daemon-reload
fi
systemctl start homeassistant systemctl start homeassistant
sleep 2 sleep 5
msg_ok "Started Home Assistant" msg_ok "Started Home Assistant"
msg_ok "Update Successful" msg_ok "Update Successful"
echo -e "\n Go to http://${IP}:8123 \n" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8123${CL}"
exit exit
fi fi
if [ "$UPD" == "2" ]; then if [ "$UPD" == "2" ]; then
msg_info "Installing Home Assistant Community Store (HACS)" msg_info "Installing Home Assistant Community Store (HACS)"
$STD apt update $STD apt update
$STD apt install -y unzip $STD apt install -y unzip
cd .homeassistant cd /root/.homeassistant
$STD bash <(curl -fsSL https://get.hacs.xyz) $STD bash <(curl -fsSL https://get.hacs.xyz)
msg_ok "Installed Home Assistant Community Store (HACS)" msg_ok "Installed Home Assistant Community Store (HACS)"
echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n" echo -e "\n Reboot Home Assistant and clear browser cache then Add HACS integration.\n"
exit exit
fi fi
if [ "$UPD" == "3" ]; then if [ "$UPD" == "3" ]; then
set +Eeuo pipefail set +Eeuo pipefail
read -r -p "Would you like to use No Authentication? <y/N> " prompt read -r -p "Would you like to use No Authentication? <y/N> " prompt
@ -131,4 +163,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8123${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8123${CL}"

View File

@ -38,7 +38,7 @@ function update_script() {
msg_info "Updating All Containers" msg_info "Updating All Containers"
CONTAINER_LIST="${1:-$(docker ps -q)}" CONTAINER_LIST="${1:-$(docker ps -q)}"
for container in ${CONTAINER_LIST}; do 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}")" RUNNING_IMAGE="$(docker inspect --format "{{.Image}}" --type container "${container}")"
docker pull "${CONTAINER_IMAGE}" docker pull "${CONTAINER_IMAGE}"
LATEST_IMAGE="$(docker inspect --format "{{.Id}}" --type image "${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}" echo "Updating ${container} image ${CONTAINER_IMAGE}"
DOCKER_COMMAND="$(runlike --use-volume-id "${container}")" DOCKER_COMMAND="$(runlike --use-volume-id "${container}")"
docker rm --force "${container}" docker rm --force "${container}"
eval ${DOCKER_COMMAND} eval "${DOCKER_COMMAND}"
fi fi
done done
msg_ok "Updated All Containers" 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 "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}HA: http://${IP}:8123${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}"

View File

@ -53,10 +53,10 @@ function update_script() {
if [ -z "$pnpm_current" ]; then if [ -z "$pnpm_current" ]; then
msg_error "pnpm not found. Installing version $pnpm_desired..." 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 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..." 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 else
msg_ok "pnpm is already installed and satisfies version $pnpm_desired." msg_ok "pnpm is already installed and satisfies version $pnpm_desired."
fi fi
@ -103,4 +103,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:5055${CL}"

View File

@ -20,32 +20,32 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE MODE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 14 60 2 \ 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 \ "1" "Check for Alpine Updates" OFF \
"2" "Update NPMplus Docker Container" ON \ "2" "Update NPMplus Docker Container" ON \
3>&1 1>&2 2>&3) 3>&1 1>&2 2>&3)
header_info "$APP" header_info "$APP"
case "$UPD" in case "$UPD" in
"1") "1")
msg_info "Updating Alpine OS" msg_info "Updating Alpine OS"
apk update && apk upgrade $STD apk -U upgrade
msg_ok "System updated" msg_ok "System updated"
exit exit
;; ;;
"2") "2")
msg_info "Updating NPMplus Container" msg_info "Updating NPMplus Container"
cd /opt cd /opt
msg_info "Pulling latest container image" msg_info "Pulling latest container image"
$STD docker compose pull $STD docker compose pull
msg_info "Recreating container" msg_info "Recreating container"
$STD docker compose up -d $STD docker compose up -d
msg_ok "NPMplus container updated" msg_ok "NPMplus container updated"
exit exit
;; ;;
esac esac
exit 0 exit 0
} }
start start

View File

@ -8,8 +8,8 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="Open WebUI" APP="Open WebUI"
var_tags="${var_tags:-ai;interface}" var_tags="${var_tags:-ai;interface}"
var_cpu="${var_cpu:-4}" var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-4096}" var_ram="${var_ram:-8192}"
var_disk="${var_disk:-16}" var_disk="${var_disk:-25}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-12}" var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
@ -76,4 +76,4 @@ description
msg_ok "Completed Successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"

View File

@ -24,32 +24,34 @@ function update_script() {
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -f /opt/streamlink-webui ]]; then if [[ ! -d /opt/streamlink-webui ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/CrazyWolf13/streamlink-webui/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') RELEASE=$(curl -fsSL https://api.github.com/repos/CrazyWolf13/streamlink-webui/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Starting Update"
msg_info "Stopping $APP" msg_info "Stopping $APP"
systemctl stop ${APP} systemctl stop ${APP}
msg_ok "Stopped $APP" msg_ok "Stopped $APP"
rm -rf /opt/${APP} rm -rf /opt/${APP}
NODE_VERSION="22" NODE_VERSION="22"
NODE_MODULE="npm@latest,yarn@latest" NODE_MODULE="npm,yarn"
install_node_and_modules install_node_and_modules
setup_uv setup_uv
fetch_and_deploy_gh_release "CrazyWolf13/streamlink-webui" fetch_and_deploy_gh_release "CrazyWolf13/streamlink-webui"
msg_info "Updating $APP to v${RELEASE}" msg_info "Updating $APP to v${RELEASE}"
$STD uv venv /opt/"${APPLICATION}"/backend/src/.venv $STD uv venv /opt/"${APP}"/backend/src/.venv
source /opt/"${APPLICATION}"/backend/src/.venv/bin/activate source /opt/"${APP}"/backend/src/.venv/bin/activate
$STD uv pip install -r /opt/streamlink-webui/backend/src/requirements.txt --python=/opt/"${APPLICATION}"/backend/src/.venv $STD uv pip install -r /opt/"${APP}"/backend/src/requirements.txt --python=/opt/"${APP}"/backend/src/.venv
cd /opt/"${APPLICATION}"/frontend/src cd /opt/"${APP}"/frontend/src
$STD yarn install $STD yarn install
$STD yarn build $STD yarn build
chmod +x /opt/"${APPLICATION}"/start.sh chmod +x /opt/"${APP}"/start.sh
msg_ok "Updated $APP to v${RELEASE}" msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting $APP" msg_info "Starting $APP"

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG # Copyright (c) 2021-2025 community-scripts ORG
# Author: tremor021 # Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Suwayomi/Suwayomi-Server # Source: https://github.com/Suwayomi/Suwayomi-Server
@ -20,38 +20,47 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -f /usr/bin/suwayomi-server ]]; then if [[ ! -f /usr/bin/suwayomi-server ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ "${RELEASE}" != "$(cat /opt/suwayomi-server_version.txt)" ]] || [[ ! -f /opt/suwayomi-server_version.txt ]]; then
msg_info "Updating $APP"
msg_info "Stopping $APP"
systemctl stop suwayomi-server
msg_ok "Stopped $APP"
msg_info "Updating $APP to v${RELEASE}"
cd /tmp
URL=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' | tail -n+2 | head -n 1)
curl -fsSL "$URL" -o $(basename "$URL")
$STD dpkg -i /tmp/*.deb
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting $APP"
systemctl start suwayomi-server
msg_ok "Started $APP"
msg_info "Cleaning Up"
rm -f *.deb
msg_ok "Cleanup Completed"
echo "${RELEASE}" >/opt/suwayomi-server_version.txt.txt
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit exit
fi
if dpkg -l | grep -q "openjdk-17-jre"; then
$STD apt-get remove -y openjdk-17-jre
fi
JAVA_VERSION=21 install_java
RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
if [[ "${RELEASE}" != "$(cat /opt/suwayomi-server_version.txt)" ]] || [[ ! -f /opt/suwayomi-server_version.txt ]]; then
msg_info "Updating $APP"
msg_info "Stopping $APP"
systemctl stop suwayomi-server
msg_ok "Stopped $APP"
msg_info "Updating $APP to v${RELEASE}"
temp_file=$(mktemp)
RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
curl -fsSL "https://github.com/Suwayomi/Suwayomi-Server/releases/download/${RELEASE}/Suwayomi-Server-${RELEASE}-debian-all.deb" -o "$temp_file"
$STD dpkg -i "$temp_file"
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting $APP"
systemctl start suwayomi-server
msg_ok "Started $APP"
msg_info "Cleaning Up"
rm -f "$temp_file"
msg_ok "Cleanup Completed"
echo "${RELEASE}" >/opt/suwayomi-server_version.txt.txt
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
} }
start start

View File

@ -2,7 +2,7 @@
"name": "Alpine-IT-Tools", "name": "Alpine-IT-Tools",
"slug": "alpine-it-tools", "slug": "alpine-it-tools",
"categories": [ "categories": [
20 20
], ],
"date_created": "2025-01-30", "date_created": "2025-01-30",
"type": "ct", "type": "ct",
@ -15,33 +15,32 @@
"config_path": "", "config_path": "",
"description": "IT-Tools is a web-based suite of utilities designed to streamline and simplify various IT tasks, providing tools for developers and system administrators to manage their workflows efficiently.", "description": "IT-Tools is a web-based suite of utilities designed to streamline and simplify various IT tasks, providing tools for developers and system administrators to manage their workflows efficiently.",
"install_methods": [ "install_methods": [
{ {
"type": "default", "type": "default",
"script": "ct/alpine-it-tools.sh", "script": "ct/alpine-it-tools.sh",
"resources": { "resources": {
"cpu": 1, "cpu": 1,
"ram": 256, "ram": 256,
"hdd": 0.2, "hdd": 0.5,
"os": "alpine", "os": "alpine",
"version": "3.21" "version": "3.21"
}
},
{
"type": "alpine",
"script": "ct/alpine-it-tools.sh",
"resources": {
"cpu": 1,
"ram": 256,
"hdd": 0.2,
"os": "alpine",
"version": "3.21"
}
} }
},
{
"type": "alpine",
"script": "ct/alpine-it-tools.sh",
"resources": {
"cpu": 1,
"ram": 256,
"hdd": 0.5,
"os": "alpine",
"version": "3.21"
}
}
], ],
"default_credentials": { "default_credentials": {
"username": null, "username": null,
"password": null "password": null
}, },
"notes": [] "notes": []
} }

View File

@ -1,52 +1,51 @@
{ {
"name": "Alpine", "name": "Alpine",
"slug": "alpine", "slug": "alpine",
"categories": [ "categories": [
2 2
], ],
"date_created": "2024-05-02", "date_created": "2024-05-02",
"type": "ct", "type": "ct",
"updateable": false, "updateable": false,
"privileged": false, "privileged": false,
"interface_port": null, "interface_port": null,
"documentation": null, "documentation": null,
"website": "https://www.alpinelinux.org/", "website": "https://www.alpinelinux.org/",
"logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/alpinelinux.svg", "logo": "https://raw.githubusercontent.com/loganmarchione/homelab-svg-assets/main/assets/alpinelinux.svg",
"config_path": "", "config_path": "",
"description": "A security-oriented, lightweight Linux distribution based on musl and BusyBox.\r\nBy default, the root password is set to alpine. If you choose to use advanced settings, you will need to define a password, autologin is currently unavailable.", "description": "A security-oriented, lightweight Linux distribution based on musl and BusyBox.\r\nBy default, the root password is set to alpine. If you choose to use advanced settings, you will need to define a password, autologin is currently unavailable.",
"install_methods": [ "install_methods": [
{ {
"type": "default", "type": "default",
"script": "ct/alpine.sh", "script": "ct/alpine.sh",
"resources": { "resources": {
"cpu": 1, "cpu": 1,
"ram": 512, "ram": 512,
"hdd": 0.1, "hdd": 0.5,
"os": "alpine", "os": "alpine",
"version": "3.21" "version": "3.21"
} }
},
{
"type": "alpine",
"script": "ct/alpine.sh",
"resources": {
"cpu": 1,
"ram": 512,
"hdd": 0.1,
"os": "alpine",
"version": "3.21"
}
}
],
"default_credentials": {
"username": null,
"password": "alpine"
}, },
"notes": [ {
{ "type": "alpine",
"text": "To Update Alpine: `apk update && apk upgrade`", "script": "ct/alpine.sh",
"type": "info" "resources": {
} "cpu": 1,
] "ram": 512,
"hdd": 0.5,
"os": "alpine",
"version": "3.21"
}
}
],
"default_credentials": {
"username": null,
"password": "alpine"
},
"notes": [
{
"text": "To Update Alpine: `apk -U upgrade`",
"type": "info"
}
]
} }

View File

@ -20,7 +20,7 @@
"script": "ct/authentik.sh", "script": "ct/authentik.sh",
"resources": { "resources": {
"cpu": 6, "cpu": 6,
"ram": 8192, "ram": 10240,
"hdd": 12, "hdd": 12,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
@ -33,7 +33,11 @@
}, },
"notes": [ "notes": [
{ {
"text": "Authentik is very resource-heavy, it is recommended to use at least 8GB RAM anytime!", "text": "Authentik is very resource-heavy, it is recommended to use at least 10GB RAM anytime!",
"type": "warning"
},
{
"text": "Some updates don't work due to massive dependency errors, it's recommended to do a backup before updating or a pg_dump and a new LXC.",
"type": "warning" "type": "warning"
} }
] ]

View File

@ -1,35 +0,0 @@
{
"name": "Documenso",
"slug": "documenso",
"categories": [
12
],
"date_created": "2025-04-28",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 3000,
"documentation": "https://documenso.com/",
"website": "https://documenso.com/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/documenso.svg",
"config_path": "/opt/documenso/.env",
"description": "Signing documents digitally should be fast and easy and should be the best practice for every document signed worldwide. This is technically quite easy today, but it also introduces a new party to every signature: The signing tool providers. While this is not a problem in itself, it should make us think about how we want these providers of trust to work. Documenso aims to be the world's most trusted document-signing tool. This trust is built by empowering you to self-host Documenso and review how it works under the hood.",
"install_methods": [
{
"type": "default",
"script": "ct/documenso.sh",
"resources": {
"cpu": 4,
"ram": 6144,
"hdd": 10,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": "helper-scripts@local.com",
"password": "helper-scripts"
},
"notes": []
}

View File

@ -12,7 +12,7 @@
"documentation": null, "documentation": null,
"website": "https://www.navidrome.org/", "website": "https://www.navidrome.org/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/navidrome.svg", "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.", "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": [ "install_methods": [
{ {
@ -33,7 +33,7 @@
}, },
"notes": [ "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" "type": "info"
} }
] ]

View File

@ -1,35 +1,35 @@
{ {
"name": "Open WebUI", "name": "Open WebUI",
"slug": "openwebui", "slug": "openwebui",
"categories": [ "categories": [
20 20
], ],
"date_created": "2024-10-24", "date_created": "2024-10-24",
"type": "ct", "type": "ct",
"updateable": true, "updateable": true,
"privileged": false, "privileged": false,
"interface_port": 8080, "interface_port": 8080,
"documentation": null, "documentation": "https://docs.openwebui.com/",
"website": "https://openwebui.com/", "website": "https://openwebui.com/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/open-webui.svg", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/open-webui.svg",
"config_path": "/opt/open-webui/.env", "config_path": "/opt/open-webui/.env",
"description": "OpenWebUI is a self-hosted, web-based interface that allows you to run AI models entirely offline. It integrates with various LLM runners, such as OpenAI and Ollama, and supports features like markdown and LaTeX rendering, model management, and voice/video calls. It also offers multilingual support and the ability to generate images using APIs like DALL-E or ComfyUI", "description": "OpenWebUI is a self-hosted, web-based interface that allows you to run AI models entirely offline. It integrates with various LLM runners, such as OpenAI and Ollama, and supports features like markdown and LaTeX rendering, model management, and voice/video calls. It also offers multilingual support and the ability to generate images using APIs like DALL-E or ComfyUI",
"install_methods": [ "install_methods": [
{ {
"type": "default", "type": "default",
"script": "ct/openwebui.sh", "script": "ct/openwebui.sh",
"resources": { "resources": {
"cpu": 4, "cpu": 4,
"ram": 4096, "ram": 8192,
"hdd": 16, "hdd": 25,
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }
} }
], ],
"default_credentials": { "default_credentials": {
"username": null, "username": null,
"password": null "password": null
}, },
"notes": [] "notes": []
} }

View File

@ -1,40 +0,0 @@
{
"name": "Suwayomi-Server",
"slug": "suwayomi-server",
"categories": [
13
],
"date_created": "2025-02-07",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 4567,
"documentation": "https://github.com/Suwayomi/Suwayomi-Server/wiki",
"website": "https://github.com/Suwayomi/Suwayomi-Server",
"logo": "https://github.com/Suwayomi/Suwayomi-Server/raw/master/server/src/main/resources/icon/faviconlogo.png",
"config_path": "",
"description": "A free and open source manga reader server that runs extensions built for Mihon (Tachiyomi).",
"install_methods": [
{
"type": "default",
"script": "ct/suwayomiserver.sh",
"resources": {
"cpu": 1,
"ram": 1024,
"hdd": 4,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "This application is conflicting with Kaspersky products. You need to disable Kaspersky in order to use this application.",
"type": "info"
}
]
}

View File

@ -25,6 +25,17 @@
"os": "debian", "os": "debian",
"version": "12" "version": "12"
} }
},
{
"type": "alpine",
"script": "ct/alpine-traefik.sh",
"resources": {
"cpu": 1,
"ram": 512,
"hdd": 1,
"os": "alpine",
"version": "3.21"
}
} }
], ],
"default_credentials": { "default_credentials": {

File diff suppressed because it is too large Load Diff

View File

@ -34,4 +34,9 @@ export const FAQ_Items = [
content: content:
"If an LXC script fails, run it again using Verbose mode. Standard mode hides detailed output for neatness, showing only progress. Verbose mode displays all messages, which helps you (and us) diagnose the error. Include this verbose output if you report the issue.", "If an LXC script fails, run it again using Verbose mode. Standard mode hides detailed output for neatness, showing only progress. Verbose mode displays all messages, which helps you (and us) diagnose the error. Include this verbose output if you report the issue.",
}, },
{
title: "What does \"Updatable\" and \"Not updatable\" mean?",
content:
"Updatable means that script has a function that is used to update the installed application to the latest version available. Not updatable means that script doesn't have a function that can safely update the application to the latest version available, so only the LXC OS is updated.",
},
]; ];

View 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

View File

@ -15,7 +15,6 @@ update_os
msg_info "Installing Dependencies (Patience)" msg_info "Installing Dependencies (Patience)"
$STD apt-get install -y \ $STD apt-get install -y \
gpg \
pkg-config \ pkg-config \
libffi-dev \ libffi-dev \
build-essential \ build-essential \
@ -33,9 +32,15 @@ $STD apt-get install -y \
libxmlsec1-openssl \ libxmlsec1-openssl \
libmaxminddb0 \ libmaxminddb0 \
python3-pip \ python3-pip \
redis-server \
git git
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
setup_uv
PG_VERSION="16" install_postgresql
NODE_VERSION="22" install_node_and_modules
install_go
msg_info "Installing yq" msg_info "Installing yq"
cd /tmp cd /tmp
YQ_LATEST="$(curl -fsSL https://api.github.com/repos/mikefarah/yq/releases/latest | grep -Po '"tag_name": "\K.*?(?=")')" YQ_LATEST="$(curl -fsSL https://api.github.com/repos/mikefarah/yq/releases/latest | grep -Po '"tag_name": "\K.*?(?=")')"
@ -56,46 +61,8 @@ cat <<EOF >/etc/GeoIP.conf
EOF EOF
msg_ok "Installed GeoIP" msg_ok "Installed GeoIP"
msg_info "Setting up Python 3"
cd /tmp
curl -fsSL "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz" -o "Python.tgz"
tar -zxf Python.tgz
cd Python-3.12.1
$STD ./configure --enable-optimizations
$STD make altinstall
cd ~
$STD update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 1
msg_ok "Setup Python 3"
msg_info "Setting up Node.js Repository"
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
msg_ok "Set up Node.js Repository"
msg_info "Installing Node.js"
$STD apt-get update
$STD apt-get install -y nodejs
msg_ok "Installed Node.js"
msg_info "Installing Golang"
set +o pipefail
temp_file=$(mktemp)
golang_tarball=$(curl -fsSL https://go.dev/dl/ | grep -oP 'go[\d\.]+\.linux-amd64\.tar\.gz' | head -n 1)
curl -fsSL "https://golang.org/dl/${golang_tarball}" -o "$temp_file"
tar -C /usr/local -xzf "$temp_file"
ln -sf /usr/local/go/bin/go /usr/local/bin/go
rm -f "$temp_file"
set -o pipefail
msg_ok "Installed Golang"
msg_info "Installing Redis"
$STD apt-get install -y redis-server
systemctl enable -q --now redis-server
msg_ok "Installed Redis"
msg_info "Installing PostgreSQL" msg_info "Installing PostgreSQL"
$STD apt-get install -y postgresql postgresql-contrib $STD apt-get install -y postgresql-16 postgresql-contrib-16
DB_NAME="authentik" DB_NAME="authentik"
DB_USER="authentik" DB_USER="authentik"
DB_PASS="$(openssl rand -base64 18 | cut -c1-13)" DB_PASS="$(openssl rand -base64 18 | cut -c1-13)"
@ -111,25 +78,29 @@ RELEASE=$(curl -fsSL https://api.github.com/repos/goauthentik/authentik/releases
mkdir -p /opt/authentik mkdir -p /opt/authentik
curl -fsSL "${RELEASE}" -o "authentik.tar.gz" curl -fsSL "${RELEASE}" -o "authentik.tar.gz"
tar -xzf authentik.tar.gz -C /opt/authentik --strip-components 1 --overwrite tar -xzf authentik.tar.gz -C /opt/authentik --strip-components 1 --overwrite
export NODE_OPTIONS="--max-old-space-size=4096"
cd /opt/authentik/website cd /opt/authentik/website
$STD npm install $STD npm install
$STD npm run build-bundled $STD npm run build-bundled
cd /opt/authentik/web cd /opt/authentik/web
$STD npm install $STD npm install
$STD npm run build $STD npm run build
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
cd /opt/authentik cd /opt/authentik
$STD go mod download $STD go mod download
$STD go build -o /go/authentik ./cmd/server $STD go build -o /go/authentik ./cmd/server
$STD go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/ $STD go build -o /opt/authentik/authentik-server /opt/authentik/cmd/server/
cd /opt/authentik $STD uv sync --frozen --no-install-project --no-dev
$STD pip3 install --upgrade pip #$STD pip3 install --no-cache-dir --upgrade pip
$STD pip3 install poetry poetry-plugin-export #$STD pip3 install --upgrade pip
ln -s /usr/local/bin/poetry /usr/bin/poetry #$STD pip3 install poetry poetry-plugin-export
$STD poetry install --only=main --no-ansi --no-interaction --no-root
$STD poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt #ln -s /usr/local/bin/poetry /usr/bin/poetry
$STD pip install --no-cache-dir -r requirements.txt #$STD poetry install --only=main --no-ansi --no-interaction --no-root
$STD pip install . #$STD poetry export --without-hashes --without-urls -f requirements.txt --output requirements.txt
#$STD pip install --no-cache-dir -r requirements.txt
#$STD pip install .
mkdir -p /etc/authentik mkdir -p /etc/authentik
mv /opt/authentik/authentik/lib/default.yml /etc/authentik/config.yml mv /opt/authentik/authentik/lib/default.yml /etc/authentik/config.yml
$STD yq -i ".secret_key = \"$(openssl rand -hex 32)\"" /etc/authentik/config.yml $STD yq -i ".secret_key = \"$(openssl rand -hex 32)\"" /etc/authentik/config.yml
@ -137,23 +108,30 @@ $STD yq -i ".postgresql.password = \"${DB_PASS}\"" /etc/authentik/config.yml
$STD yq -i ".geoip = \"/opt/authentik/tests/GeoLite2-City-Test.mmdb\"" /etc/authentik/config.yml $STD yq -i ".geoip = \"/opt/authentik/tests/GeoLite2-City-Test.mmdb\"" /etc/authentik/config.yml
cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints cp -r /opt/authentik/authentik/blueprints /opt/authentik/blueprints
$STD yq -i ".blueprints_dir = \"/opt/authentik/blueprints\"" /etc/authentik/config.yml $STD yq -i ".blueprints_dir = \"/opt/authentik/blueprints\"" /etc/authentik/config.yml
ln -s /usr/bin/python3 /usr/bin/python #ln -s /usr/bin/python3 /usr/bin/python
ln -s /usr/local/bin/gunicorn /usr/bin/gunicorn #ln -s /usr/local/bin/gunicorn /usr/bin/gunicorn
ln -s /usr/local/bin/celery /usr/bin/celery #ln -s /usr/local/bin/celery /usr/bin/celery
$STD bash /opt/authentik/lifecycle/ak migrate #$STD bash /opt/authentik/lifecycle/ak migrate
cd ~ cd /opt/authentik
uv run python -m lifecycle.migrate
ln -s /opt/authentik/.venv/bin/gunicorn /usr/local/bin/gunicorn
ln -s /opt/authentik/.venv/bin/celery /usr/local/bin/celery
echo "${RELEASE}" >/opt/${APPLICATION}_version.txt
msg_ok "Installed authentik" msg_ok "Installed authentik"
msg_info "Creating Services" msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/authentik-server.service cat <<EOF >/etc/systemd/system/authentik-server.service
[Unit] [Unit]
Description = authentik Server Description=authentik Go Server (API Gateway)
After=network.target
Wants=redis.service postgresql.service
[Service] [Service]
ExecStart=/opt/authentik/authentik-server
WorkingDirectory=/opt/authentik/ WorkingDirectory=/opt/authentik/
ExecStart=/opt/authentik/authentik-server
Restart=always Restart=always
RestartSec=5 RestartSec=5
Environment=DJANGO_SETTINGS_MODULE=authentik.root.settings
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
@ -161,21 +139,49 @@ EOF
cat <<EOF >/etc/systemd/system/authentik-worker.service cat <<EOF >/etc/systemd/system/authentik-worker.service
[Unit] [Unit]
Description = authentik Worker Description=authentik Celery Worker
After=network.target redis.service postgresql.service
Requires=redis.service
[Service] [Service]
Environment=DJANGO_SETTINGS_MODULE="authentik.root.settings" Type=simple
ExecStart=celery -A authentik.root.celery worker -Ofair --max-tasks-per-child=1 --autoscale 3,1 -E -B -s /tmp/celerybeat-schedule -Q authentik,authentik_scheduled,authentik_events WorkingDirectory=/opt/authentik
WorkingDirectory=/opt/authentik/authentik ExecStart=/opt/authentik/.venv/bin/celery \
-A authentik.root.celery worker \
-Ofair \
--max-tasks-per-child=1 \
--autoscale 3,1 \
-Q authentik,authentik_scheduled,authentik_events \
-E
Restart=always Restart=always
RestartSec=5 RestartSec=5
Environment=DJANGO_SETTINGS_MODULE=authentik.root.settings
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl enable -q --now authentik-server
sleep 2 cat <<EOF >/etc/systemd/system/authentik-celery-beat.service
systemctl enable -q --now authentik-worker [Unit]
Description=authentik Celery Beat Scheduler
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/authentik
ExecStart=/opt/authentik/.venv/bin/celery \
-A authentik.root.celery beat \
-s /tmp/celerybeat-schedule
Restart=always
RestartSec=5
#User=authentik
Environment=DJANGO_SETTINGS_MODULE=authentik.root.settings
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now authentik-server authentik-worker authentik-celery-beat
msg_ok "Created Services" msg_ok "Created Services"
motd_ssh motd_ssh

View File

@ -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") 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 unzip -qq bazarr -d /opt/bazarr
chmod 775 /opt/bazarr /var/lib/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_ok "Installed Bazarr"
msg_info "Creating Service" msg_info "Creating Service"

View File

@ -20,14 +20,14 @@ msg_ok "Setup Functions"
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt-get install -y \
gpg \ gpg \
libc6 \ libc6 \
make \ make \
cmake \ cmake \
jq \ jq \
postgresql \ postgresql \
python3 \ python3 \
python3-bcrypt python3-bcrypt
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository" msg_info "Setting up Node.js Repository"
@ -52,10 +52,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 default_transaction_isolation TO 'read committed';"
$STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'" $STD sudo -u postgres psql -c "ALTER ROLE $DB_USER SET timezone TO 'UTC'"
{ {
echo "Documenso-Credentials" echo "Documenso-Credentials"
echo "Database Name: $DB_NAME" echo "Database Name: $DB_NAME"
echo "Database User: $DB_USER" echo "Database User: $DB_USER"
echo "Database Password: $DB_PASS" echo "Database Password: $DB_PASS"
} >>~/documenso.creds } >>~/documenso.creds
msg_ok "Set up PostgreSQL" msg_ok "Set up PostgreSQL"
@ -68,24 +68,22 @@ mv documenso-${RELEASE} /opt/documenso
cd /opt/documenso cd /opt/documenso
mv .env.example /opt/documenso/.env mv .env.example /opt/documenso/.env
sed -i \ sed -i \
-e "s|^NEXTAUTH_SECRET=.*|NEXTAUTH_SECRET='$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)'|" \ -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_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|^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_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|^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}:3000'|" \
-e "s|^NEXT_PUBLIC_WEBAPP_URL=.*|NEXT_PUBLIC_WEBAPP_URL='http://${LOCAL_IP}:9000'|" \ -e "s|^NEXT_PRIVATE_INTERNAL_WEBAPP_URL=.*|NEXT_PRIVATE_INTERNAL_WEBAPP_URL=\"http://${LOCAL_IP}:3000\"|" \
-e "s|^NEXT_PUBLIC_MARKETING_URL=.*|NEXT_PUBLIC_MARKETING_URL=\"http://${LOCAL_IP}:3001\"|" \ -e "s|^NEXT_PRIVATE_DATABASE_URL=.*|NEXT_PRIVATE_DATABASE_URL=\"postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME\"|" \
-e "s|^NEXT_PRIVATE_INTERNAL_WEBAPP_URL=.*|NEXT_PRIVATE_INTERNAL_WEBAPP_URL=\"http://${LOCAL_IP}:3000\"|" \ -e "s|^NEXT_PRIVATE_DIRECT_DATABASE_URL=.*|NEXT_PRIVATE_DIRECT_DATABASE_URL=\"postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME\"|" \
-e "s|^NEXT_PRIVATE_DATABASE_URL=.*|NEXT_PRIVATE_DATABASE_URL=\"postgres://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME\"|" \ /opt/documenso/.env
-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 TURBO_CACHE=1
export NEXT_TELEMETRY_DISABLED=1 export NEXT_TELEMETRY_DISABLED=1
export CYPRESS_INSTALL_BINARY=0 export CYPRESS_INSTALL_BINARY=0
export NODE_OPTIONS="--max-old-space-size=4096" export NODE_OPTIONS="--max-old-space-size=4096"
$STD npm ci $STD npm ci
$STD npm run build:web $STD turbo run build --filter=@documenso/remix
$STD npm run prisma:migrate-deploy $STD npm run prisma:migrate-deploy
echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt" echo "${RELEASE}" >"/opt/${APPLICATION}_version.txt"
msg_ok "Installed Documenso" msg_ok "Installed Documenso"
@ -103,8 +101,8 @@ Description=Documenso Service
After=network.target postgresql.service After=network.target postgresql.service
[Service] [Service]
WorkingDirectory=/opt/documenso/apps/web WorkingDirectory=/opt/documenso
ExecStart=/usr/bin/npm start ExecStart=/usr/bin/turbo run start --filter=@documenso/remix
Restart=always Restart=always
EnvironmentFile=/opt/documenso/.env EnvironmentFile=/opt/documenso/.env
@ -118,6 +116,7 @@ motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
$STD turbo daemon stop
$STD apt-get -y autoremove $STD apt-get -y autoremove
$STD apt-get -y autoclean $STD apt-get -y autoclean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@ -23,27 +23,17 @@ $STD apt-get install -y \
build-essential \ build-essential \
nginx \ nginx \
gettext \ gettext \
jq \
openssl openssl
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository" NODE_VERSION=$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.engines.node | split(">=")[1] | split(".")[0]')
mkdir -p /etc/apt/keyrings NODE_MODULE="pnpm@$(curl -s https://raw.githubusercontent.com/homarr-labs/homarr/dev/package.json | jq -r '.packageManager | split("@")[1]')"
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg install_node_and_modules
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list fetch_and_deploy_gh_release "homarr-labs/homarr"
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"
msg_info "Installing Homarr (Patience)" msg_info "Installing Homarr (Patience)"
cd /opt 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 mkdir -p /opt/homarr_db
touch /opt/homarr_db/db.sqlite touch /opt/homarr_db/db.sqlite
SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)" SECRET_ENCRYPTION_KEY="$(openssl rand -hex 32)"

View File

@ -46,29 +46,33 @@ $STD apt-get install -y \
pkg-config pkg-config
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
setup_uv
msg_info "Setup Python3" msg_info "Setup Python3"
$STD apt-get update
$STD rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
$STD apt-get remove --purge -y python3.12 python3.12-dev python3.12-venv
$STD apt-get install -y \ $STD apt-get install -y \
python3.13 \ python3.13 \
python3-pip \
python3.13-dev \ python3.13-dev \
python3.13-venv python3.13-venv
ln -sf /usr/bin/python3.13 /usr/bin/python3
msg_ok "Setup Python3" msg_ok "Setup Python3"
msg_info "Preparing Python 3.13 for uv"
$STD uv python install 3.13
UV_PYTHON=$(uv python list | awk '/3\.13\.[0-9]+.*\/root\/.local/ {print $2; exit}')
if [[ -z "$UV_PYTHON" ]]; then
msg_error "No local Python 3.13 found via uv"
exit 1
fi
msg_ok "Prepared Python 3.13"
msg_info "Setting up Home Assistant-Core environment" msg_info "Setting up Home Assistant-Core environment"
mkdir /srv/homeassistant rm -rf /srv/homeassistant
mkdir -p /srv/homeassistant
cd /srv/homeassistant cd /srv/homeassistant
python3 -m venv . $STD uv venv .venv --python "$UV_PYTHON"
source bin/activate source .venv/bin/activate
msg_ok "Created virtual environment" msg_ok "Created virtual environment"
msg_info "Installing Home Assistant-Core" msg_info "Installing Home Assistant-Core"
$STD python3 -m pip install webrtcvad wheel homeassistant mysqlclient psycopg2-binary isal $STD uv pip install homeassistant mysqlclient psycopg2-binary isal webrtcvad wheel
mkdir -p /root/.homeassistant mkdir -p /root/.homeassistant
msg_ok "Installed Home Assistant-Core" msg_ok "Installed Home Assistant-Core"
@ -77,16 +81,19 @@ cat <<EOF >/etc/systemd/system/homeassistant.service
[Unit] [Unit]
Description=Home Assistant Description=Home Assistant
After=network-online.target After=network-online.target
[Service] [Service]
Type=simple Type=simple
WorkingDirectory=/root/.homeassistant WorkingDirectory=/root/.homeassistant
Environment="PATH=/srv/homeassistant/bin:/usr/local/bin:/usr/bin:/usr/local/bin/uv" Environment="PATH=/srv/homeassistant/.venv/bin:/usr/local/bin:/usr/bin"
ExecStart=/srv/homeassistant/bin/python3 -m homeassistant --config /root/.homeassistant ExecStart=/srv/homeassistant/.venv/bin/python3 -m homeassistant --config /root/.homeassistant
Restart=always Restart=always
RestartForceExitStatus=100 RestartForceExitStatus=100
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl enable -q --now homeassistant systemctl enable -q --now homeassistant
msg_ok "Created Service" msg_ok "Created Service"

View File

@ -15,30 +15,18 @@ update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt-get install -y \
gnupg \
git \ git \
build-essential build-essential
msg_ok "Installed Dependencies" 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 git clone -q https://github.com/Fallenbagel/jellyseerr.git /opt/jellyseerr
cd /opt/jellyseerr cd /opt/jellyseerr
$STD git checkout main $STD git checkout main
pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json) pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json)
msg_info "Installing pnpm version $pnpm_desired..." NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" install_node_and_modules
$STD npm install -g pnpm@$pnpm_desired
msg_ok "Installed pnpm"
msg_info "Installing Jellyseerr (Patience)" msg_info "Installing Jellyseerr (Patience)"
export CYPRESS_INSTALL_BINARY=0 export CYPRESS_INSTALL_BINARY=0

View File

@ -40,7 +40,7 @@ sudo -u searxng python3 -m venv /usr/local/searxng/searx-pyenv
source /usr/local/searxng/searx-pyenv/bin/activate source /usr/local/searxng/searx-pyenv/bin/activate
$STD pip install --upgrade pip setuptools wheel $STD pip install --upgrade pip setuptools wheel
$STD pip install pyyaml $STD pip install pyyaml
$STD pip install -e /usr/local/searxng/searxng-src $STD pip install --use-pep517 --no-build-isolation -e /usr/local/searxng/searxng-src
SECRET_KEY=$(openssl rand -hex 32) SECRET_KEY=$(openssl rand -hex 32)
cat <<EOF >/etc/searxng/settings.yml cat <<EOF >/etc/searxng/settings.yml
# SearXNG settings # SearXNG settings

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG # Copyright (c) 2021-2025 community-scripts ORG
# Author: tremor021 # Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/Suwayomi/Suwayomi-Server # Source: https://github.com/Suwayomi/Suwayomi-Server
@ -14,18 +14,19 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt-get install -y libc++-dev
openjdk-17-jre \
libc++-dev
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
JAVA_VERSION=21 install_java
msg_info "Settting up Suwayomi-Server" msg_info "Settting up Suwayomi-Server"
URL=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "browser_download_url" | awk '{print substr($2, 2, length($2)-2) }' | tail -n+2 | head -n 1) temp_file=$(mktemp)
RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') RELEASE=$(curl -fsSL https://api.github.com/repos/Suwayomi/Suwayomi-Server/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }')
curl -fsSL "$URL" -o $(basename "$URL") curl -fsSL "https://github.com/Suwayomi/Suwayomi-Server/releases/download/${RELEASE}/Suwayomi-Server-${RELEASE}-debian-all.deb" -o "$temp_file"
$STD dpkg -i *.deb $STD dpkg -i "$temp_file"
echo ${RELEASE} >/opt/suwayomi-server_version.txt echo "${RELEASE}" >/opt/suwayomi-server_version.txt
msg_ok "Done setting up Suwayomi-Server" msg_ok "Done setting up Suwayomi-Server"
msg_info "Creating Service" msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/suwayomi-server.service cat <<EOF >/etc/systemd/system/suwayomi-server.service
[Unit] [Unit]
@ -41,10 +42,12 @@ WantedBy=multi-user.target
EOF EOF
systemctl enable -q --now suwayomi-server systemctl enable -q --now suwayomi-server
msg_ok "Created Service" msg_ok "Created Service"
motd_ssh motd_ssh
customize customize
msg_info "Cleaning up" msg_info "Cleaning up"
rm -f *.deb rm -f "$temp_file"
$STD apt-get -y autoremove $STD apt-get -y autoremove
$STD apt-get -y autoclean $STD apt-get -y autoclean
msg_ok "Cleaned" msg_ok "Cleaned"

View File

@ -30,7 +30,8 @@ $STD apt-get -y install elasticsearch
echo "-Xms2g" >>/etc/elasticsearch/jvm.options echo "-Xms2g" >>/etc/elasticsearch/jvm.options
echo "-Xmx2g" >>/etc/elasticsearch/jvm.options echo "-Xmx2g" >>/etc/elasticsearch/jvm.options
$STD /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment -b $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_ok "Setup Elasticsearch"
msg_info "Installing Zammad" msg_info "Installing Zammad"

View File

@ -137,8 +137,7 @@ network_check() {
# This function updates the Container OS by running apt-get update and upgrade # This function updates the Container OS by running apt-get update and upgrade
update_os() { update_os() {
msg_info "Updating Container OS" msg_info "Updating Container OS"
$STD apk update $STD apk -U upgrade
$STD apk upgrade
msg_ok "Updated Container OS" msg_ok "Updated Container OS"
msg_info "Installing core dependencies" msg_info "Installing core dependencies"
@ -190,10 +189,29 @@ validate_tz() {
customize() { customize() {
if [[ "$PASSWORD" == "" ]]; then if [[ "$PASSWORD" == "" ]]; then
msg_info "Customizing Container" msg_info "Customizing Container"
bash -c "passwd -d root" >/dev/null 2>&1 passwd -d root >/dev/null 2>&1
# Ensure agetty is available
apk add --no-cache --force-broken-world util-linux >/dev/null 2>&1
# Create persistent autologin boot script
mkdir -p /etc/local.d
cat <<'EOF' >/etc/local.d/autologin.start
#!/bin/sh
sed -i 's|^tty1::respawn:.*|tty1::respawn:/sbin/agetty --autologin root --noclear tty1 38400 linux|' /etc/inittab
kill -HUP 1
EOF
touch /root/.hushlogin
chmod +x /etc/local.d/autologin.start
rc-update add local >/dev/null 2>&1
# Apply autologin immediately for current session
/etc/local.d/autologin.start
msg_ok "Customized Container" msg_ok "Customized Container"
fi fi
echo "bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/${app}.sh)\"" >/usr/bin/update echo "bash -c \"\$(curl -fsSL https://github.com/community-scripts/ProxmoxVE/raw/main/ct/${app}.sh)\"" >/usr/bin/update
chmod +x /usr/bin/update chmod +x /usr/bin/update
} }

View File

@ -528,15 +528,17 @@ advanced_settings() {
exit_script exit_script
fi fi
if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then BRIDGES=$( ip link show | grep -oP '(?<=: )vmbr\d+' | sort)
if [ -z "$BRG" ]; then if [[ -z "$BRIDGES" ]]; then
BRG="vmbr0" BRG="vmbr0"
echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
else
echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
fi
else else
exit_script BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --menu "Select network bridge:" 15 40 6 $(echo "$BRIDGES" | awk '{print $0, "Bridge"}') 3>&1 1>&2 2>&3)
if [ -z "$BRG" ]; then
exit_script
else
echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}"
fi
fi fi
while true; do while true; do
@ -777,8 +779,6 @@ EOF
config_file() { 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" CONFIG_FILE="/opt/community-scripts/.settings"
if [[ -f "/opt/community-scripts/${NSAPP}.conf" ]]; then if [[ -f "/opt/community-scripts/${NSAPP}.conf" ]]; then
@ -795,66 +795,38 @@ config_file() {
source "$CONFIG_FILE" source "$CONFIG_FILE"
fi fi
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 [[ -n "$CT_ID" ]]; then
if [[ "$CT_ID" =~ ^([0-9]{3,4})-([0-9]{3,4})$ ]]; then if [[ "$CT_ID" =~ ^([0-9]{3,4})-([0-9]{3,4})$ ]]; then
MIN_ID=${BASH_REMATCH[1]} MIN_ID=${BASH_REMATCH[1]}
MAX_ID=${BASH_REMATCH[2]} MAX_ID=${BASH_REMATCH[2]}
if ((MIN_ID >= MAX_ID)); then 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}" msg_error "Invalid Container ID range. The first number must be smaller than the second number, was ${CT_ID}"
exit exit
fi fi
LIST_OF_IDS=$(pvesh get /cluster/resources --type vm --output-format json | grep -oP '"vmid":\s*\K\d+') 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 for ((ID = MIN_ID; ID <= MAX_ID; ID++)); do
if ! grep -q "^$ID$" <<<"$LIST_OF_IDS"; then if ! grep -q "^$ID$" <<<"$LIST_OF_IDS"; then
CT_ID=$ID CT_ID=$ID
break break
fi fi
done done
fi
echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}" echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
elif [[ "$CT_ID" =~ ^[0-9]+$ ]]; then 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
if ! grep -q "^$CT_ID$" <<<"$LIST_OF_IDS"; then echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}" else
msg_error "Container ID $CT_ID already exists"
exit
fi
else else
msg_error "Container ID $CT_ID already exists" echo -e "${CONTAINERID}${BOLD}${DGN}Container ID: ${BGN}$CT_ID${CL}"
exit
fi fi
else else
msg_error "Invalid Container ID format. Needs to be 0000-9999 or 0-9999, was ${CT_ID}" msg_error "Invalid Container ID format. Needs to be 0000-9999 or 0-9999, was ${CT_ID}"
@ -952,27 +924,26 @@ config_file() {
if [ "$NET" == "dhcp" ]; then if [ "$NET" == "dhcp" ]; then
echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}DHCP${CL}" echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}DHCP${CL}"
echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}Default${CL}" echo -e "${GATEWAY}${BOLD}${DGN}Gateway IP Address: ${BGN}Default${CL}"
elif elif [[ "$NET" =~ $ip_cidr_regex ]]; then
[[ "$NET" =~ $ip_cidr_regex ]]
then
echo -e "${NETWORK}${BOLD}${DGN}IP Address: ${BGN}$NET${CL}" 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 else
msg_error "Invalid IP Address format. Needs to be 0.0.0.0/0, was ${NET}" msg_error "Invalid IP Address format. Needs to be 0.0.0.0/0, was ${NET}"
exit exit
fi fi
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 [[ ! -z "$APT_CACHER_IP" ]]; then
if [[ "$APT_CACHER_IP" =~ $ip_regex ]]; then if [[ "$APT_CACHER_IP" =~ $ip_regex ]]; then

View File

@ -479,7 +479,7 @@ install_mongodb() {
fetch_and_deploy_gh_release() { fetch_and_deploy_gh_release() {
local repo="$1" local repo="$1"
local app=$(echo ${APPLICATION,,} | tr -d ' ') local app=${APP:-$(echo "${APPLICATION,,}" | tr -d ' ')}
local api_url="https://api.github.com/repos/$repo/releases/latest" local api_url="https://api.github.com/repos/$repo/releases/latest"
local header=() local header=()
local attempt=0 local attempt=0

View File

@ -5,28 +5,28 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
function header_info { function header_info {
clear clear
cat <<"EOF" cat <<"EOF"
____ __ _ ________ ____ __ __ ____ __ _ ________ ____ __ __
/ __ \_________ _ ______ ___ ____ _ __ / / | |/ / ____/ / __ \___ / /__ / /____ / __ \_________ _ ______ ___ ____ _ __ / / | |/ / ____/ / __ \___ / /__ / /____
/ /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / / | / / / / / / _ \/ / _ \/ __/ _ \ / /_/ / ___/ __ \| |/_/ __ `__ \/ __ \| |/_/ / / | / / / / / / _ \/ / _ \/ __/ _ \
/ ____/ / / /_/ /> </ / / / / / /_/ /> < / /___/ / /___ / /_/ / __/ / __/ /_/ __/ / ____/ / / /_/ /> </ / / / / / /_/ /> < / /___/ / /___ / /_/ / __/ / __/ /_/ __/
/_/ /_/ \____/_/|_/_/ /_/ /_/\____/_/|_| /_____/_/|_\____/ /_____/\___/_/\___/\__/\___/ /_/ /_/ \____/_/|_/_/ /_/ /_/\____/_/|_| /_____/_/|_\____/ /_____/\___/_/\___/\__/\___/
EOF EOF
} }
spinner() { spinner() {
local pid=$1 local pid=$1
local delay=0.1 local delay=0.1
local spinstr='|/-\' local spinstr='|/-\'
while ps -p $pid >/dev/null; do while ps -p $pid >/dev/null; do
printf " [%c] " "$spinstr" printf " [%c] " "$spinstr"
spinstr=${spinstr#?}${spinstr%"${spinstr#?}"} spinstr=${spinstr#?}${spinstr%"${spinstr#?}"}
sleep $delay sleep $delay
printf "\r" printf "\r"
done done
printf " \r" printf " \r"
} }
set -eEuo pipefail set -eEuo pipefail
@ -46,29 +46,29 @@ NODE=$(hostname)
containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}') containers=$(pct list | tail -n +2 | awk '{print $0 " " $4}')
if [ -z "$containers" ]; then if [ -z "$containers" ]; then
whiptail --title "LXC Container Delete" --msgbox "No LXC containers available!" 10 60 whiptail --title "LXC Container Delete" --msgbox "No LXC containers available!" 10 60
exit 1 exit 1
fi fi
menu_items=() menu_items=("ALL" "Delete ALL containers" "OFF") # Add as first option
FORMAT="%-10s %-15s %-10s" FORMAT="%-10s %-15s %-10s"
while read -r container; do while read -r container; do
container_id=$(echo $container | awk '{print $1}') container_id=$(echo $container | awk '{print $1}')
container_name=$(echo $container | awk '{print $2}') container_name=$(echo $container | awk '{print $2}')
container_status=$(echo $container | awk '{print $3}') container_status=$(echo $container | awk '{print $3}')
formatted_line=$(printf "$FORMAT" "$container_name" "$container_status") formatted_line=$(printf "$FORMAT" "$container_name" "$container_status")
menu_items+=("$container_id" "$formatted_line" "OFF") menu_items+=("$container_id" "$formatted_line" "OFF")
done <<<"$containers" done <<<"$containers"
CHOICES=$(whiptail --title "LXC Container Delete" \ CHOICES=$(whiptail --title "LXC Container Delete" \
--checklist "Select LXC containers to delete:" 25 60 13 \ --checklist "Select LXC containers to delete:" 25 60 13 \
"${menu_items[@]}" 3>&2 2>&1 1>&3) "${menu_items[@]}" 3>&2 2>&1 1>&3)
if [ -z "$CHOICES" ]; then if [ -z "$CHOICES" ]; then
whiptail --title "LXC Container Delete" \ whiptail --title "LXC Container Delete" \
--msgbox "No containers selected!" 10 60 --msgbox "No containers selected!" 10 60
exit 1 exit 1
fi fi
read -p "Delete containers manually or automatically? (Default: manual) m/a: " DELETE_MODE 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') 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 for container_id in $selected_ids; do
status=$(pct status $container_id) status=$(pct status $container_id)
if [ "$status" == "status: running" ]; then if [ "$status" == "status: running" ]; then
echo -e "${BL}[Info]${GN} Stopping container $container_id...${CL}" echo -e "${BL}[Info]${GN} Stopping container $container_id...${CL}"
pct stop $container_id & pct stop $container_id &
sleep 5 sleep 5
echo -e "${BL}[Info]${GN} Container $container_id stopped.${CL}" echo -e "${BL}[Info]${GN} Container $container_id stopped.${CL}"
fi fi
if [[ "$DELETE_MODE" == "a" ]]; then if [[ "$DELETE_MODE" == "a" ]]; then
echo -e "${BL}[Info]${GN} Automatically deleting container $container_id...${CL}" echo -e "${BL}[Info]${GN} Automatically deleting container $container_id...${CL}"
pct destroy "$container_id" -f & pct destroy "$container_id" -f &
pid=$! pid=$!
spinner $pid spinner $pid
[ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60 [ $? -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 else
read -p "Delete container $container_id? (y/N): " CONFIRM echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}"
if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
echo -e "${BL}[Info]${GN} Deleting container $container_id...${CL}"
pct destroy "$container_id" -f &
pid=$!
spinner $pid
[ $? -eq 0 ] && echo "Container $container_id deleted." || whiptail --title "Error" --msgbox "Failed to delete container $container_id." 10 60
else
echo -e "${BL}[Info]${RD} Skipping container $container_id...${CL}"
fi
fi fi
fi
done done
header_info header_info

View File

@ -13,7 +13,7 @@ function update_container() {
echo -e "\n [Info] Updating $container : $name \n" echo -e "\n [Info] Updating $container : $name \n"
os=$(pct config "$container" | awk '/^ostype/ {print $2}') os=$(pct config "$container" | awk '/^ostype/ {print $2}')
case "$os" in 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" ;; archlinux) pct exec "$container" -- bash -c "pacman -Syyu --noconfirm" ;;
fedora | rocky | centos | alma) pct exec "$container" -- bash -c "dnf -y update && dnf -y upgrade" ;; 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" ;; 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" echo -e "[Info] Skipping $container"
sleep 1 sleep 1
else else
status=$(pct status $container) status=$(pct status "$container")
template=$(pct config $container | grep -q "template:" && echo "true" || echo "false") template=$(pct config "$container" | grep -q "template:" && echo "true" || echo "false")
if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then
echo -e "[Info] Starting $container" echo -e "[Info] Starting $container"
pct start $container pct start "$container"
sleep 5 sleep 5
update_container $container update_container "$container"
echo -e "[Info] Shutting down $container" echo -e "[Info] Shutting down $container"
pct shutdown $container & pct shutdown "$container" &
elif [ "$status" == "status: running" ]; then elif [ "$status" == "status: running" ]; then
update_container $container update_container "$container"
fi fi
fi fi
done done

View File

@ -5,7 +5,7 @@
# License: MIT # License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
function header_info { function header_info() {
clear clear
cat <<"EOF" 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" echo -e "${BL}[Info]${GN} Updating ${BL}$container${CL} : ${GN}$name${CL} - ${YW}[No disk info for ${os}]${CL}\n"
fi fi
case "$os" in 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" ;; archlinux) pct exec "$container" -- bash -c "pacman -Syyu --noconfirm" ;;
fedora | rocky | centos | alma) pct exec "$container" -- bash -c "dnf -y update && dnf -y upgrade" ;; 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" ;; 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" ;;

View File

@ -26,7 +26,6 @@ NSAPP="arch-linux-vm"
var_os="arch-linux" var_os="arch-linux"
var_version=" " var_version=" "
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
@ -76,6 +75,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -161,7 +177,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_SIZE="4G" DISK_SIZE="4G"
@ -194,10 +210,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -20,7 +20,6 @@ EOF
header_info header_info
echo -e "\n Loading..." echo -e "\n Loading..."
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="debian12vm" NSAPP="debian12vm"
@ -75,6 +74,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -161,7 +177,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_SIZE="8G" DISK_SIZE="8G"
@ -194,10 +210,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -20,7 +20,6 @@ EOF
header_info header_info
echo -e "\n Loading..." echo -e "\n Loading..."
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="debian12vm" NSAPP="debian12vm"
@ -76,6 +75,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -162,7 +178,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_CACHE="" DISK_CACHE=""
@ -195,10 +211,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"
@ -244,7 +261,6 @@ function advanced_settings() {
exit-script exit-script
fi fi
if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
"0" "None (Default)" ON \ "0" "None (Default)" ON \
"1" "Write Through" OFF \ "1" "Write Through" OFF \

View File

@ -21,15 +21,13 @@ EOF
header_info header_info
echo -e "\n Loading..." echo -e "\n Loading..."
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
VERSIONS=(stable beta dev) VERSIONS=(stable beta dev)
#API VARIABLES
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="homeassistant-os" NSAPP="homeassistant-os"
var_os="homeassistant" var_os="homeassistant"
DISK_SIZE="32G" DISK_SIZE="32G"
#
for version in "${VERSIONS[@]}"; do for version in "${VERSIONS[@]}"; do
eval "$version=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep '"ova"' | cut -d '"' -f 4)" eval "$version=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep '"ova"' | cut -d '"' -f 4)"
done done
@ -65,6 +63,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -166,7 +181,7 @@ function exit-script() {
function default_settings() { function default_settings() {
BRANCH="$stable" BRANCH="$stable"
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_CACHE="cache=writethrough," DISK_CACHE="cache=writethrough,"
@ -210,10 +225,11 @@ function advanced_settings() {
exit-script exit-script
fi fi
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID="$VMID"
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -21,15 +21,12 @@ clear
header_info header_info
echo -e "Loading..." echo -e "Loading..."
GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]') GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]')
NEXTID=$(pvesh get /cluster/nextid)
#API VARIABLES
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="mikrotik-router-os" NSAPP="mikrotik-router-os"
var_os="mikrotik" var_os="mikrotik"
var_version=" " var_version=" "
DISK_SIZE="1G" DISK_SIZE="1G"
#
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
HA=$(echo "\033[1;34m") HA=$(echo "\033[1;34m")
@ -60,6 +57,24 @@ function error_exit() {
[ ! -z ${VMID-} ] && cleanup_vmid [ ! -z ${VMID-} ] && cleanup_vmid
exit $EXIT exit $EXIT
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if $(qm status $VMID &>/dev/null); then if $(qm status $VMID &>/dev/null); then
if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then
@ -99,8 +114,8 @@ function msg_ok() {
} }
function default_settings() { function default_settings() {
METHOD="default" METHOD="default"
echo -e "${DGN}Using Virtual Machine ID: ${BGN}$NEXTID${CL}" VMID=$(get_valid_nextid)
VMID=$NEXTID echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}"
echo -e "${DGN}Using Hostname: ${BGN}mikrotik-routeros-chr${CL}" echo -e "${DGN}Using Hostname: ${BGN}mikrotik-routeros-chr${CL}"
HN=mikrotik-routeros-chr HN=mikrotik-routeros-chr
echo -e "${DGN}Allocated Cores: ${BGN}1${CL}" echo -e "${DGN}Allocated Cores: ${BGN}1${CL}"
@ -121,7 +136,8 @@ function default_settings() {
} }
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" 3>&1 1>&2 2>&3) [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" 3>&1 1>&2 2>&3)
exitstatus=$? exitstatus=$?
if [ $exitstatus = 0 ]; then if [ $exitstatus = 0 ]; then
echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}" echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}"

View File

@ -19,16 +19,13 @@ EOF
} }
header_info header_info
echo -e "\n Loading..." echo -e "\n Loading..."
#API VARIABLES
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="turnkey-nextcloud" NSAPP="turnkey-nextcloud"
var_os="turnkey-nextcloud" var_os="turnkey-nextcloud"
var_version=" " var_version=" "
DISK_SIZE="12G" DISK_SIZE="12G"
#
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
NAME="TurnKey Nexcloud VM" NAME="TurnKey Nexcloud VM"
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
@ -58,6 +55,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -142,7 +156,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_CACHE="" DISK_CACHE=""
@ -173,10 +187,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -23,17 +23,15 @@ EOF
} }
header_info header_info
echo -e "Loading..." echo -e "Loading..."
#API VARIABLES
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="openwrt-vm" NSAPP="openwrt-vm"
var_os="openwrt" var_os="openwrt"
var_version=" " var_version=" "
DISK_SIZE="0.5G" DISK_SIZE="0.5G"
#
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
HA=$(echo "\033[1;34m") HA=$(echo "\033[1;34m")
@ -61,6 +59,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -208,7 +223,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID=$NEXTID VMID=$(get_valid_nextid)
HN=openwrt HN=openwrt
CORE_COUNT="1" CORE_COUNT="1"
RAM_SIZE="256" RAM_SIZE="256"
@ -242,10 +257,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -28,7 +28,7 @@ var_version="25.1"
# #
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC_LAN=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
HA=$(echo "\033[1;34m") HA=$(echo "\033[1;34m")
@ -54,6 +54,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -202,7 +219,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_CACHE="" DISK_CACHE=""
@ -252,10 +269,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
local ip_regex='^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$' local ip_regex='^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$'
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -19,17 +19,15 @@ EOF
} }
header_info header_info
echo -e "\n Loading..." echo -e "\n Loading..."
#API VARIABLES
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="turnkey-owncloud-vm" NSAPP="turnkey-owncloud-vm"
var_os="owncloud" var_os="owncloud"
var_version="12" var_version="12"
DISK_SIZE="12G" DISK_SIZE="12G"
#
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
NAME="TurnKey ownCloud VM" NAME="TurnKey ownCloud VM"
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
HA=$(echo "\033[1;34m") HA=$(echo "\033[1;34m")
@ -58,6 +56,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -142,7 +157,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_CACHE="" DISK_CACHE=""
@ -173,10 +188,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -24,17 +24,14 @@ EOF
clear clear
header_info header_info
echo -e "Loading..." echo -e "Loading..."
#API VARIABLES
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="pimox-haos-vm" NSAPP="pimox-haos-vm"
var_os="pimox-haos" var_os="pimox-haos"
var_version=" " var_version=" "
DISK_SIZE="32G" DISK_SIZE="32G"
#
GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]') GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]')
USEDID=$(pvesh get /cluster/resources --type vm --output-format yaml | egrep -i 'vmid' | awk '{print substr($2, 1, length($2)-0) }') USEDID=$(pvesh get /cluster/resources --type vm --output-format yaml | egrep -i 'vmid' | awk '{print substr($2, 1, length($2)-0) }')
NEXTID=$(pvesh get /cluster/nextid)
STABLE=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }') STABLE=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
BETA=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/beta.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }') BETA=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/beta.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
DEV=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/dev.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }') DEV=$(curl -fsSL https://raw.githubusercontent.com/home-assistant/version/master/dev.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }')
@ -70,6 +67,24 @@ function error_exit() {
[ ! -z ${VMID-} ] && cleanup_vmid [ ! -z ${VMID-} ] && cleanup_vmid
exit $EXIT exit $EXIT
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if $(qm status $VMID &>/dev/null); then if $(qm status $VMID &>/dev/null); then
if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then
@ -122,8 +137,8 @@ function default_settings() {
METHOD="default" METHOD="default"
echo -e "${DGN}Using HAOS Version: ${BGN}${STABLE}${CL}" echo -e "${DGN}Using HAOS Version: ${BGN}${STABLE}${CL}"
BRANCH=${STABLE} BRANCH=${STABLE}
echo -e "${DGN}Using Virtual Machine ID: ${BGN}$NEXTID${CL}" VMID=$(get_valid_nextid)
VMID=$NEXTID echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}"
echo -e "${DGN}Using Hostname: ${BGN}haos${STABLE}${CL}" echo -e "${DGN}Using Hostname: ${BGN}haos${STABLE}${CL}"
HN=haos${STABLE} HN=haos${STABLE}
echo -e "${DGN}Allocated Cores: ${BGN}2${CL}" echo -e "${DGN}Allocated Cores: ${BGN}2${CL}"
@ -151,10 +166,11 @@ function advanced_settings() {
3>&1 1>&2 2>&3) 3>&1 1>&2 2>&3)
exitstatus=$? exitstatus=$?
if [ $exitstatus = 0 ]; then echo -e "${DGN}Using HAOS Version: ${BGN}$BRANCH${CL}"; fi if [ $exitstatus = 0 ]; then echo -e "${DGN}Using HAOS Version: ${BGN}$BRANCH${CL}"; fi
VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3) [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3)
exitstatus=$? exitstatus=$?
if [ -z $VMID ]; then if [ -z $VMID ]; then
VMID="$NEXTID" VMID="$VMID"
echo -e "${DGN}Virtual Machine: ${BGN}$VMID${CL}" echo -e "${DGN}Virtual Machine: ${BGN}$VMID${CL}"
else else
if echo "$USEDID" | egrep -q "$VMID"; then if echo "$USEDID" | egrep -q "$VMID"; then

View File

@ -20,7 +20,6 @@ EOF
header_info header_info
echo -e "\n Loading..." echo -e "\n Loading..."
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="ubuntu-2204-vm" NSAPP="ubuntu-2204-vm"
@ -33,8 +32,6 @@ RD=$(echo "\033[01;31m")
BGN=$(echo "\033[4;92m") BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m") GN=$(echo "\033[1;92m")
DGN=$(echo "\033[32m") DGN=$(echo "\033[32m")
CL=$(echo "\033[m")
CL=$(echo "\033[m") CL=$(echo "\033[m")
BOLD=$(echo "\033[1m") BOLD=$(echo "\033[1m")
BFR="\\r\\033[K" BFR="\\r\\033[K"
@ -75,6 +72,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -160,7 +174,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_SIZE="5G" DISK_SIZE="5G"
@ -193,10 +207,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -21,7 +21,6 @@ EOF
header_info header_info
echo -e "\n Loading..." echo -e "\n Loading..."
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="ubuntu-2404-vm" NSAPP="ubuntu-2404-vm"
@ -76,6 +75,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -161,7 +177,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_SIZE="7G" DISK_SIZE="7G"
@ -194,10 +210,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"

View File

@ -20,7 +20,6 @@ EOF
header_info header_info
echo -e "\n Loading..." echo -e "\n Loading..."
GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//')
NEXTID=$(pvesh get /cluster/nextid)
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)"
METHOD="" METHOD=""
NSAPP="ubuntu-2410-vm" NSAPP="ubuntu-2410-vm"
@ -75,6 +74,23 @@ function error_handler() {
cleanup_vmid cleanup_vmid
} }
function get_valid_nextid() {
local try_id
try_id=$(pvesh get /cluster/nextid)
while true; do
if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then
try_id=$((try_id + 1))
continue
fi
if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then
try_id=$((try_id + 1))
continue
fi
break
done
echo "$try_id"
}
function cleanup_vmid() { function cleanup_vmid() {
if qm status $VMID &>/dev/null; then if qm status $VMID &>/dev/null; then
qm stop $VMID &>/dev/null qm stop $VMID &>/dev/null
@ -160,7 +176,7 @@ function exit-script() {
} }
function default_settings() { function default_settings() {
VMID="$NEXTID" VMID=$(get_valid_nextid)
FORMAT=",efitype=4m" FORMAT=",efitype=4m"
MACHINE="" MACHINE=""
DISK_SIZE="8G" DISK_SIZE="8G"
@ -193,10 +209,11 @@ function default_settings() {
function advanced_settings() { function advanced_settings() {
METHOD="advanced" METHOD="advanced"
[ -z "${VMID:-}" ] && VMID=$(get_valid_nextid)
while true; do while true; do
if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then
if [ -z "$VMID" ]; then if [ -z "$VMID" ]; then
VMID="$NEXTID" VMID=$(get_valid_nextid)
fi fi
if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then if pct status "$VMID" &>/dev/null || qm status "$VMID" &>/dev/null; then
echo -e "${CROSS}${RD} ID $VMID is already in use${CL}" echo -e "${CROSS}${RD} ID $VMID is already in use${CL}"