Compare commits

...

64 Commits

Author SHA1 Message Date
community-scripts-pr-app[bot]
369265a6d5 Update versions.json (#4492)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-15 02:13:53 +02:00
community-scripts-pr-app[bot]
56f8306960 Update CHANGELOG.md (#4490)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-15 01:11:05 +01:00
CanbiZ
3daf3c3325 HomeAssistant-Core: add Deprecation-Warning for August 2025 (#4489) 2025-05-14 22:11:10 +02:00
community-scripts-pr-app[bot]
c36000a6aa Update CHANGELOG.md (#4488)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 18:38:06 +01:00
Maciej Matczak
12265b92e7 Add make installation dependency (#4485) 2025-05-14 19:37:38 +02:00
community-scripts-pr-app[bot]
4e31445038 Update .app files (#4482)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-05-14 16:56:33 +02:00
Tobias
c30f96912d quickfix: fix homarr folder (#4481) 2025-05-14 16:52:46 +02:00
community-scripts-pr-app[bot]
e3860c065e Update CHANGELOG.md (#4480)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 15:09:05 +01:00
community-scripts-pr-app[bot]
110b64df85 Update CHANGELOG.md (#4479)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 15:08:46 +01:00
Tobias
e17f7aa6f1 fix fetch_release_and_deploy (#4478) 2025-05-14 16:08:21 +02:00
push-app-to-main[bot]
b4d98b1dd2 odoo (#4477)
* 'Add new script'

* Update ct/odoo.sh

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>

* Update odoo.sh

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2025-05-14 16:07:57 +02:00
push-app-to-main[bot]
e24636133d asterisk (#4468)
* 'Add new script'

* Update asterisk.json

* Update asterisk.json

* Update asterisk-install.sh

* Update asterisk.sh

* Update asterisk-install.sh

* Update asterisk-install.sh

* Update asterisk.sh

* noob STD service call

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2025-05-14 14:28:37 +02:00
community-scripts-pr-app[bot]
7d0a964918 Update versions.json (#4470)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 14:07:30 +02:00
community-scripts-pr-app[bot]
38c7e747bc Update CHANGELOG.md (#4469)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 12:32:13 +01:00
Slaviša Arežina
180e003978 Alpine-Rclone: Fix location of passwords file (#4465)
* Fix install and update

* Update
2025-05-14 13:31:31 +02:00
community-scripts-pr-app[bot]
4762ea8fae Update CHANGELOG.md (#4464)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 10:03:39 +01:00
community-scripts-pr-app[bot]
4ec3af8e45 Update CHANGELOG.md (#4463)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 10:03:18 +01:00
CanbiZ
b816ca6788 Bookstack: fix copy of themes/uploads/storage (#4457) 2025-05-14 11:02:50 +02:00
Michel Roegl-Brunner
d703a8abb2 Add App to do the merging (#4461) 2025-05-14 11:02:41 +02:00
community-scripts-pr-app[bot]
4a1f87727b Update CHANGELOG.md (#4462)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 11:01:22 +02:00
Konstantin Krastev
16c0d09d6b Update monitor-all.sh (#4437)
 Summary of Changes from the Initial Version
🧩 1. Tag-Based Filtering (Core Feature)
New feature: Only restart instances (VMs or containers) that have the mon-restart tag.

This makes monitoring and auto-restart controllable directly from the Proxmox Web UI, without editing scripts or services.

Set via GUI: VM → Options → Tags → mon-restart

Set via CLI: qm set <vmid> -tags mon-restart or pct set <ctid> -tags mon-restart

This is the primary new control mechanism, making the script safer, more flexible, and user-friendly.

🧰 2. Backward-Compatible Exclusion Mechanism
The original feature that lets you exclude instances via CLI arguments is preserved:

bash
Copy
Edit
./ping-instances.sh 101 300
These IDs will always be skipped regardless of tag.

🧠 3. Intelligent Responsiveness Checks
For VMs:

Uses qm guest cmd <id> ping to check responsiveness via the QEMU guest agent.

No longer relies on network-level ping, which can be misleading or blocked.

For containers (CTs):

Uses traditional ping to IP addresses obtained from pct exec, since CTs don’t support QEMU agent.

 4. Instance Skipping Improvements
Instances are now skipped if:

They are explicitly excluded via CLI.

They are templates.

They are configured with onboot: 0 or missing.

They lack the mon-restart tag, regardless of other status.

🪵 5. Same Logging Behavior
All output continues to go to /var/log/ping-instances.log for persistent tracking.

Verbose messages were added for traceability (e.g., why a VM or CT was skipped).

🎯 Why This Matters
With tag-based control, admins can now manage restart behavior dynamically from the Proxmox Web UI, making the script:

More secure (no accidental restarts).

More maintainable (no script edits needed).

More user-friendly (integrated with the UI workflow).
2025-05-14 11:00:57 +02:00
community-scripts-pr-app[bot]
7740ab68f7 Update CHANGELOG.md (#4459)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 10:02:15 +02:00
community-scripts-pr-app[bot]
cd61025295 Update date in json (#4458)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-05-14 10:01:13 +02:00
CanbiZ
2695e2de1a Website: re-add documenso & some little bugfixes (#4456) 2025-05-14 10:00:41 +02:00
community-scripts-pr-app[bot]
7aea03034a Update CHANGELOG.md (#4455)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 02:15:13 +02:00
community-scripts-pr-app[bot]
e9960347bf Update versions.json (#4454)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-14 02:14:33 +02:00
Slaviša Arežina
3808d4d0b8 Fix json (#4453) 2025-05-13 23:23:44 +02:00
community-scripts-pr-app[bot]
14c5bf5f75 Update CHANGELOG.md (#4452)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 21:09:09 +02:00
Slaviša Arežina
fcc16ae8e1 Jellyfin Media Server: Update configuration path (#4434)
* Update configuration path

* typo
2025-05-13 21:06:37 +02:00
community-scripts-pr-app[bot]
aaf8bdb893 Update CHANGELOG.md (#4451)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 20:00:42 +02:00
moodyblue
db81851db4 openhab. correct some typos (#4448) 2025-05-13 20:00:09 +02:00
community-scripts-pr-app[bot]
a2d92155a5 Update CHANGELOG.md (#4449)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 18:44:30 +02:00
Filippo
0bd18cc91b fix: improve bridge detection in all network interface configuration files (#4413)
* fix: improve bridge detection in all network interface configuration files

* removed comments

* removed last comment line
2025-05-13 18:44:06 +02:00
community-scripts-pr-app[bot]
1e7981dbb7 Update CHANGELOG.md (#4446)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 15:26:16 +02:00
push-app-to-main[bot]
704073cd69 gatus (#4443)
* 'Add new script'

* Update ct/gatus.sh

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2025-05-13 15:25:38 +02:00
community-scripts-pr-app[bot]
22e1518951 Update CHANGELOG.md (#4445)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 15:20:38 +02:00
community-scripts-pr-app[bot]
57bd730233 Update date in json (#4444)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-05-13 15:19:04 +02:00
push-app-to-main[bot]
cf1b13e5fb alpine-gatus (#4442)
* 'Add new script'

* Update ct/alpine-gatus.sh

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2025-05-13 15:18:29 +02:00
community-scripts-pr-app[bot]
9a3b2c076d Update CHANGELOG.md (#4441)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 14:41:27 +02:00
moodyblue
3981cc90c4 Update openhab-install.sh (#4438)
1) Update zulu repo
2) Use zulu17-jdk (previously zulu21-jdk)
2025-05-13 14:40:49 +02:00
community-scripts-pr-app[bot]
592d9d03aa Update versions.json (#4439)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 14:07:30 +02:00
CanbiZ
59b00890f9 quickfix broken json 2025-05-13 13:33:50 +02:00
community-scripts-pr-app[bot]
7ee57e7416 Update CHANGELOG.md (#4433)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 10:56:23 +02:00
Slaviša Arežina
82a30df0c9 Update json (#4432) 2025-05-13 10:55:37 +02:00
community-scripts-pr-app[bot]
10e1d7e741 Update CHANGELOG.md (#4431)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 10:38:52 +02:00
CanbiZ
f85cddadcf update some improvements from dev (tools.func) (#4430)
* Harmonize tools.func from DEV-Repo

* Update tools.func
2025-05-13 10:38:19 +02:00
community-scripts-pr-app[bot]
1700291af7 Update CHANGELOG.md (#4429)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-05-13 07:53:01 +02:00
Cody Warmbo
e126e48439 Update pingvin.json (#4426)
Typo in config path
2025-05-13 07:52:28 +02:00
community-scripts-pr-app[bot]
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
community-scripts-pr-app[bot]
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
community-scripts-pr-app[bot]
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
Tobias
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
community-scripts-pr-app[bot]
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
community-scripts-pr-app[bot]
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
CanbiZ
dfbb1a8035 Alpine-Traefik (#4412) 2025-05-12 20:02:53 +02:00
community-scripts-pr-app[bot]
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
Slaviša Arežina
9140fd52ac Use onliner for updates (#4414) 2025-05-12 16:07:07 +02:00
community-scripts-pr-app[bot]
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
CanbiZ
b333d8c3f9 Feature: LXC-Delete (pve helper): add "all items" (#4296) 2025-05-12 15:58:14 +02:00
community-scripts-pr-app[bot]
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
Michel Roegl-Brunner
37d20ba0dd Config file Function in build.func (#4411)
* Refactor Config_File function

* Refactor Config_File function
2025-05-12 15:54:38 +02:00
community-scripts-pr-app[bot]
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
community-scripts-pr-app[bot]
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
quake1508
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
62 changed files with 1575 additions and 627 deletions

View File

@@ -5,8 +5,8 @@ on:
branches: branches:
- main - main
paths: paths:
- 'ct/**.sh' - "ct/**.sh"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
update-app-files: update-app-files:
@@ -25,6 +25,13 @@ jobs:
app-id: ${{ vars.APP_ID }} app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }} private-key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Generate a token for PR approval and merge
id: generate-token-merge
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
# Step 1: Checkout repository # Step 1: Checkout repository
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v2
@@ -80,7 +87,7 @@ jobs:
--label "automated pr" --label "automated pr"
env: env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }} GH_TOKEN: ${{ steps.generate-token.outputs.token }}
- name: Approve pull request - name: Approve pull request
if: env.changed == 'true' if: env.changed == 'true'
env: env:
@@ -90,13 +97,15 @@ 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 - name: Approve pull request and merge
if: env.changed == 'true' if: env.changed == 'true'
env: env:
GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }} GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
run: | run: |
PR_NUMBER=$(gh pr list --head "pr-update-app-files" --json number --jq '.[].number') git config --global user.name "github-actions-automege[bot]"
git config --global user.email "github-actions-automege[bot]@users.noreply.github.com"
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
if [ -n "$PR_NUMBER" ]; then if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve gh pr review $PR_NUMBER --approve
gh pr merge $PR_NUMBER --squash --admin gh pr merge $PR_NUMBER --squash --admin

View File

@@ -24,6 +24,13 @@ jobs:
app-id: ${{ vars.APP_ID }} app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }} private-key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Generate a token for PR approval and merge
id: generate-token-merge
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
@@ -177,7 +184,7 @@ jobs:
} }
return await main(); return await main();
- name: Update CHANGELOG.md - name: Update CHANGELOG.md
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
@@ -202,7 +209,7 @@ jobs:
if (hasMainNotes || hasSubNotes) { if (hasMainNotes || hasSubNotes) {
newReleaseNotes += `### ${title}\n\n`; newReleaseNotes += `### ${title}\n\n`;
} }
if (hasMainNotes) { if (hasMainNotes) {
newReleaseNotes += ` ${notes.join("\n")}\n\n`; newReleaseNotes += ` ${notes.join("\n")}\n\n`;
} }
@@ -267,20 +274,12 @@ jobs:
- name: Approve pull request and merge - name: Approve pull request and merge
if: env.changed == 'true' if: env.changed == 'true'
env: env:
GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }} GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
run: | run: |
git config --global user.name "github-actions-automege[bot]"
git config --global user.email "github-actions-automege[bot]@users.noreply.github.com"
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number') 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
gh pr merge $PR_NUMBER --squash --admin gh pr merge $PR_NUMBER --squash --admin
fi fi
- name: Re-approve pull request after update
if: env.changed == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve
fi

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

@@ -5,8 +5,8 @@ on:
branches: branches:
- main - main
paths: paths:
- 'frontend/public/json/**.json' - "frontend/public/json/**.json"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
update-app-files: update-app-files:
@@ -25,10 +25,17 @@ jobs:
app-id: ${{ vars.APP_ID }} app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }} private-key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Generate a token for PR approval and merge
id: generate-token-merge
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.APP_ID_APPROVE_AND_MERGE }}
private-key: ${{ secrets.APP_KEY_APPROVE_AND_MERGE }}
- name: Generate dynamic branch name - name: Generate dynamic branch name
id: timestamp id: timestamp
run: echo "BRANCH_NAME=pr-update-json-$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV run: echo "BRANCH_NAME=pr-update-json-$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
- name: Set up GH_TOKEN - name: Set up GH_TOKEN
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -38,7 +45,7 @@ jobs:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 2 # Ensure we have the last two commits fetch-depth: 2 # Ensure we have the last two commits
- name: Get Previous Commit - name: Get Previous Commit
id: prev_commit id: prev_commit
@@ -103,8 +110,8 @@ jobs:
- name: Commit and create PR if changes exist - name: Commit and create PR if changes exist
if: env.changed == 'true' if: env.changed == 'true'
run: | run: |
git commit -m "Update date in json" git commit -m "Update date in json"
git checkout -b ${{ env.BRANCH_NAME }} git checkout -b ${{ env.BRANCH_NAME }}
git push origin ${{ env.BRANCH_NAME }} git push origin ${{ env.BRANCH_NAME }}
@@ -126,12 +133,15 @@ 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 - name: Approve pull request and merge
if: env.changed == 'true' if: env.changed == 'true'
env: env:
GH_TOKEN: ${{ secrets.PAT_AUTOMERGE }} GH_TOKEN: ${{ steps.generate-token-merge.outputs.token }}
run: | run: |
PR_NUMBER=$(gh pr list --head "${{ env.BRANCH_NAME }}" --json number --jq '.[].number') git config --global user.name "github-actions-automege[bot]"
git config --global user.email "github-actions-automege[bot]@users.noreply.github.com"
PR_NUMBER=$(gh pr list --head "${BRANCH_NAME}" --json number --jq '.[].number')
if [ -n "$PR_NUMBER" ]; then if [ -n "$PR_NUMBER" ]; then
gh pr review $PR_NUMBER --approve gh pr review $PR_NUMBER --approve
gh pr merge $PR_NUMBER --squash --admin gh pr merge $PR_NUMBER --squash --admin

View File

@@ -14,8 +14,99 @@ 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-15
## 2025-05-14
### 🆕 New Scripts
- odoo ([#4477](https://github.com/community-scripts/ProxmoxVE/pull/4477))
- asterisk ([#4468](https://github.com/community-scripts/ProxmoxVE/pull/4468))
### 🚀 Updated Scripts
- fix: fetch_release_and_deploy function [@CrazyWolf13](https://github.com/CrazyWolf13) ([#4478](https://github.com/community-scripts/ProxmoxVE/pull/4478))
- Website: re-add documenso & some little bugfixes [@MickLesk](https://github.com/MickLesk) ([#4456](https://github.com/community-scripts/ProxmoxVE/pull/4456))
- #### 🐞 Bug Fixes
- Add make installation dependency to Actual Budget script [@maciejmatczak](https://github.com/maciejmatczak) ([#4485](https://github.com/community-scripts/ProxmoxVE/pull/4485))
- Bookstack: fix copy of themes/uploads/storage [@MickLesk](https://github.com/MickLesk) ([#4457](https://github.com/community-scripts/ProxmoxVE/pull/4457))
- Alpine-Rclone: Fix location of passwords file [@tremor021](https://github.com/tremor021) ([#4465](https://github.com/community-scripts/ProxmoxVE/pull/4465))
- #### ✨ New Features
- monitor-all: improvements - tag based filtering [@grizmin](https://github.com/grizmin) ([#4437](https://github.com/community-scripts/ProxmoxVE/pull/4437))
### 🧰 Maintenance
- #### 📂 Github
- Add Github app for auto PR merge [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#4461](https://github.com/community-scripts/ProxmoxVE/pull/4461))
## 2025-05-13
### 🆕 New Scripts
- gatus ([#4443](https://github.com/community-scripts/ProxmoxVE/pull/4443))
- alpine-gatus ([#4442](https://github.com/community-scripts/ProxmoxVE/pull/4442))
### 🚀 Updated Scripts
- update some improvements from dev (tools.func) [@MickLesk](https://github.com/MickLesk) ([#4430](https://github.com/community-scripts/ProxmoxVE/pull/4430))
- #### 🐞 Bug Fixes
- openhab: use zulu17-jdk [@moodyblue](https://github.com/moodyblue) ([#4438](https://github.com/community-scripts/ProxmoxVE/pull/4438))
- #### 🔧 Refactor
- openhab. correct some typos [@moodyblue](https://github.com/moodyblue) ([#4448](https://github.com/community-scripts/ProxmoxVE/pull/4448))
### 🧰 Maintenance
- #### 💾 Core
- fix: improve bridge detection in all network interface configuration files [@filippolauria](https://github.com/filippolauria) ([#4413](https://github.com/community-scripts/ProxmoxVE/pull/4413))
### 🌐 Website
- #### 📝 Script Information
- Jellyfin Media Server: Update configuration path [@tremor021](https://github.com/tremor021) ([#4434](https://github.com/community-scripts/ProxmoxVE/pull/4434))
- Pingvin Share: Added explanation on how to add/edit environment variables [@tremor021](https://github.com/tremor021) ([#4432](https://github.com/community-scripts/ProxmoxVE/pull/4432))
- pingvin.json: fix typo [@warmbo](https://github.com/warmbo) ([#4426](https://github.com/community-scripts/ProxmoxVE/pull/4426))
## 2025-05-12 ## 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 ## 2025-05-11
### 🚀 Updated Scripts ### 🚀 Updated 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"

62
ct/alpine-gatus.sh Normal file
View File

@@ -0,0 +1,62 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/TwiN/gatus
APP="Alpine-gatus"
var_tags="${var_tags:-alpine;monitoring}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-256}"
var_disk="${var_disk:-3}"
var_os="${var_os:-alpine}"
var_version="${var_version:-3.21}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
if [[ ! -d /opt/gatus ]]; then
msg_error "No ${APP} Installation Found!"
exit 1
fi
RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [ "${RELEASE}" != "$(cat /opt/gatus_version.txt)" ] || [ ! -f /opt/gatus_version.txt ]; then
msg_info "Updating ${APP} LXC"
$STD apk -U upgrade
$STD service gatus stop
mv /opt/gatus/config/config.yaml /opt
rm -rf /opt/gatus/*
temp_file=$(mktemp)
curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
cd /opt/gatus
$STD go mod tidy
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
setcap CAP_NET_RAW+ep gatus
mv /opt/config.yaml config
rm -f "$temp_file"
echo "${RELEASE}" >/opt/gatus_version.txt
$STD service gatus start
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit 0
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following IP:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"

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

@@ -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

@@ -28,7 +28,6 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit 1 exit 1
fi fi
RELEASE=$(curl -s https://api.github.com/repos/rclone/rclone/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -s https://api.github.com/repos/rclone/rclone/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [ "${RELEASE}" != "$(cat /opt/rclone_version.txt)" ] || [ ! -f /opt/rclone_version.txt ]; then if [ "${RELEASE}" != "$(cat /opt/rclone_version.txt)" ] || [ ! -f /opt/rclone_version.txt ]; then
msg_info "Updating ${APP} LXC" msg_info "Updating ${APP} LXC"

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

@@ -28,7 +28,7 @@ function update_script() {
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
ct/asterisk.sh Normal file
View File

@@ -0,0 +1,35 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: michelroegl-brunner
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://asterisk.org/
APP="Asterisk"
var_tags="${var_tags:-telephone;pbx}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
msg_error "No Update function provided for ${APP} LXC"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"

View File

@@ -39,9 +39,9 @@ function update_script() {
unzip -q "/opt/BookStack-${RELEASE}.zip" -d /opt unzip -q "/opt/BookStack-${RELEASE}.zip" -d /opt
mv "/opt/BookStack-${RELEASE}" /opt/bookstack mv "/opt/BookStack-${RELEASE}" /opt/bookstack
cp /opt/bookstack-backup/.env /opt/bookstack/.env cp /opt/bookstack-backup/.env /opt/bookstack/.env
cp -r /opt/bookstack-backup/public/uploads/* /opt/bookstack/public/uploads/ || true [[ -d /opt/bookstack-backup/public/uploads ]] && cp -a /opt/bookstack-backup/public/uploads/. /opt/bookstack/public/uploads/
cp -r /opt/bookstack-backup/storage/uploads/* /opt/bookstack/storage/uploads/ || true [[ -d /opt/bookstack-backup/storage/uploads ]] && cp -a /opt/bookstack-backup/storage/uploads/. /opt/bookstack/storage/uploads/
cp -r /opt/bookstack-backup/themes/* /opt/bookstack/themes/ || true [[ -d /opt/bookstack-backup/themes ]] && cp -a /opt/bookstack-backup/themes/. /opt/bookstack/themes/
cd /opt/bookstack cd /opt/bookstack
export COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev $STD composer install --no-dev

75
ct/gatus.sh Normal file
View File

@@ -0,0 +1,75 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/TwiN/gatus
APP="gatus"
var_tags="${var_tags:-monitoring}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/gatus ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Updating $APP"
msg_info "Stopping $APP"
systemctl stop gatus
msg_ok "Stopped $APP"
msg_info "Updating $APP to v${RELEASE}"
mv /opt/gatus/config/config.yaml /opt
rm -rf /opt/gatus/*
temp_file=$(mktemp)
curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
cd /opt/gatus
$STD go mod tidy
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
setcap CAP_NET_RAW+ep gatus
mv /opt/config.yaml config
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting $APP"
systemctl start gatus
msg_ok "Started $APP"
msg_info "Cleaning Up"
rm -f "$temp_file"
msg_ok "Cleanup Completed"
msg_ok "Update Successful"
else
msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"

6
ct/headers/alpine-gatus Normal file
View File

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

View File

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

6
ct/headers/asterisk Normal file
View File

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

6
ct/headers/gatus Normal file
View File

@@ -0,0 +1,6 @@
__
____ _____ _/ /___ _______
/ __ `/ __ `/ __/ / / / ___/
/ /_/ / /_/ / /_/ /_/ (__ )
\__, /\__,_/\__/\__,_/____/
/____/

View File

@@ -1,6 +1,6 @@
__ __ __
/ / / /___ ____ ___ ____ ___________ / /_ ____ ____ ___ ____ ___________
/ /_/ / __ \/ __ `__ \/ __ `/ ___/ ___/ / __ \/ __ \/ __ `__ \/ __ `/ ___/ ___/
/ __ / /_/ / / / / / / /_/ / / / / / / / / /_/ / / / / / / /_/ / / / /
/_/ /_/\____/_/ /_/ /_/\__,_/_/ /_/ /_/ /_/\____/_/ /_/ /_/\__,_/_/ /_/

6
ct/headers/odoo Normal file
View File

@@ -0,0 +1,6 @@
____ __
/ __ \____/ /___ ____
/ / / / __ / __ \/ __ \
/ /_/ / /_/ / /_/ / /_/ /
\____/\__,_/\____/\____/

View File

@@ -1,11 +1,11 @@
#!/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/
APP="Homarr" APP="homarr"
var_tags="${var_tags:-arr;dashboard}" var_tags="${var_tags:-arr;dashboard}"
var_cpu="${var_cpu:-2}" var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}" var_ram="${var_ram:-4096}"
@@ -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

@@ -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

71
ct/odoo.sh Normal file
View File

@@ -0,0 +1,71 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/odoo/odoo
APP="Odoo"
var_tags="${var_tags:-erp}"
var_disk="${var_disk:-6}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /etc/odoo/odoo.conf ]]; then
msg_error "No ${APP} Installation Found!"
exit 1
fi
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |
sed -E "s/odoo_(${RELEASE}\.[0-9]+)_all\.deb/\1/" |
sort -V |
tail -n1)
if [[ "${LATEST_VERSION}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then
msg_info "Stopping ${APP} service"
systemctl stop odoo
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP} to ${LATEST_VERSION}"
curl -fsSL https://nightly.odoo.com/${RELEASE}/nightly/deb/odoo_${RELEASE}.latest_all.deb -o /opt/odoo.deb
$STD apt install -y /opt/odoo.deb
echo "$LATEST_VERSION" >/opt/${APP}_version.txt
msg_ok "Updated ${APP} to ${LATEST_VERSION}"
msg_info "Starting ${APP} service"
systemctl start odoo
msg_ok "Started ${APP}"
msg_info "Cleaning Up"
rm -f /opt/odoo.deb
msg_ok "Cleaned"
msg_ok "Updated Successfully"
else
msg_ok "No update required. ${APP} is already at ${LATEST_VERSION}"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8069${CL}"

View File

@@ -49,7 +49,7 @@
}, },
{ {
"type": "info", "type": "info",
"text": "`htpasswd -b -B /opt/rclone/login.pwd newuser newuserpassword` to add more users." "text": "`htpasswd -b -B /opt/login.pwd newuser newuserpassword` to add more users."
} }
] ]
} }

View File

@@ -44,7 +44,7 @@
}, },
"notes": [ "notes": [
{ {
"text": "To Update Alpine: `apk update && apk upgrade`", "text": "To Update Alpine: `apk -U upgrade`",
"type": "info" "type": "info"
} }
] ]

View File

@@ -0,0 +1,33 @@
{
"name": "Asterisk",
"slug": "asterisk",
"categories": [0],
"date_created": "2025-05-14",
"type": "ct",
"updateable": false,
"privileged": false,
"interface_port": null,
"documentation": "https://docs.asterisk.org/",
"config_path": "/etc/asterisk",
"website": "https://asterisk.org/",
"logo": "https://docs.asterisk.org/favicon.ico",
"description": "Asterisk is an open-source framework for building communications applications, most commonly used as a phone system (PBX). Developed by Digium (now part of Sangoma), it turns a standard computer into a powerful telephony server.",
"install_methods": [
{
"type": "default",
"script": "ct/asterisk.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 4,
"os": "Debian",
"version": "12"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

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

View File

@@ -0,0 +1,46 @@
{
"name": "gatus",
"slug": "gatus",
"categories": [
9
],
"date_created": "2025-05-13",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8080,
"documentation": "https://gatus.io/docs",
"website": "https://gatus.io/",
"logo": "https://raw.githubusercontent.com/TwiN/gatus/refs/heads/master/web/static/img/logo.svg",
"config_path": "/opt/gatus/config/config.yaml",
"description": "Gatus is a developer-oriented health dashboard that gives you the ability to monitor your services using HTTP, ICMP, TCP, and even DNS queries as well as evaluate the result of said queries by using a list of conditions on values like the status code, the response time, the certificate expiration, the body and many others. The icing on top is that each of these health checks can be paired with alerting via Slack, Teams, PagerDuty, Discord, Twilio and many more.",
"install_methods": [
{
"type": "default",
"script": "ct/gatus.sh",
"resources": {
"cpu": 1,
"ram": 512,
"hdd": 4,
"os": "debian",
"version": "12"
}
},
{
"type": "alpine",
"script": "ct/alpine-gatus.sh",
"resources": {
"cpu": 1,
"ram": 256,
"hdd": 3,
"os": "alpine",
"version": "3.21"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@@ -41,7 +41,7 @@
"type": "warning" "type": "warning"
}, },
{ {
"text": "Use Ubuntu 24.10 ONLY", "text": "Deprecation-Warning: This Core-based setup will be deprecated by August 2025. Use Home Assistant OS is strongly recommended to ensure long-term stability and updates.",
"type": "warning" "type": "warning"
}, },
{ {

View File

@@ -12,7 +12,7 @@
"documentation": "https://jellyfin.org/docs/", "documentation": "https://jellyfin.org/docs/",
"website": "https://jellyfin.org/", "website": "https://jellyfin.org/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/jellyfin.svg", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/jellyfin.svg",
"config_path": "/root/.config/jellyfin", "config_path": "/etc/jellyfin/",
"description": "Jellyfin is a free and open-source media server and suite of multimedia applications designed to organize, manage, and share digital media files to networked devices.", "description": "Jellyfin is a free and open-source media server and suite of multimedia applications designed to organize, manage, and share digital media files to networked devices.",
"install_methods": [ "install_methods": [
{ {

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

@@ -0,0 +1,40 @@
{
"name": "Odoo",
"slug": "odoo",
"categories": [
25
],
"date_created": "2025-05-14",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8069,
"documentation": "https://www.odoo.com/en_EN/page/docs",
"website": "https://www.odoo.com/",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/odoo.svg",
"config_path": "/etc/odoo/odoo.conf",
"description": "Odoo is a comprehensive open-source business platform made up of modular apps that cover key areas such as CRM, accounting, inventory, sales, project management, HR, helpdesk, and e-commerce. All modules are tightly integrated, allowing businesses to fully digitize and automate their workflows. Its modular design makes it suitable for both small companies and large enterprises, with flexibility to adapt to different industries. Odoo combines user-friendliness with powerful functionality, offering a unified solution for managing a wide range of business operations.",
"install_methods": [
{
"type": "default",
"script": "ct/odoo.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 6,
"os": "debian",
"version": "12"
}
}
],
"default_credentials": {
"username": "admin",
"password": "admin"
},
"notes": [
{
"text": "Database Credentials: `cat ~/odoo.creds`",
"type": "info"
}
]
}

View File

@@ -12,7 +12,7 @@
"documentation": "https://stonith404.github.io/pingvin-share/introduction", "documentation": "https://stonith404.github.io/pingvin-share/introduction",
"website": "https://github.com/stonith404/pingvin-share", "website": "https://github.com/stonith404/pingvin-share",
"logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pingvin-share.svg", "logo": "https://raw.githubusercontent.com/selfhst/icons/refs/heads/main/svg/pingvin-share.svg",
"config_path": "/opt/pingin-share/config.yaml", "config_path": "/opt/pingvin-share/config.yaml",
"description": "Pingvin Share is self-hosted file sharing platform and an alternative for WeTransfer.", "description": "Pingvin Share is self-hosted file sharing platform and an alternative for WeTransfer.",
"install_methods": [ "install_methods": [
{ {
@@ -31,5 +31,10 @@
"username": null, "username": null,
"password": null "password": null
}, },
"notes": [] "notes": [
{
"text": "Run `DATA_DIRECTORY=path-to-your-data-directory pm2 restart all --update-env` to update path to your data directory or to update environment variables.",
"type": "info"
}
]
} }

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": {

View File

@@ -1,14 +1,244 @@
[ [
{
"name": "advplyr/audiobookshelf",
"version": "v2.22.0",
"date": "2025-05-14T22:30:59Z"
},
{
"name": "glanceapp/glance",
"version": "v0.8.2",
"date": "2025-05-14T21:34:41Z"
},
{
"name": "Ombi-app/Ombi",
"version": "v4.47.1",
"date": "2025-01-05T21:14:23Z"
},
{
"name": "Luligu/matterbridge",
"version": "3.0.2",
"date": "2025-05-14T20:38:06Z"
},
{
"name": "NodeBB/NodeBB",
"version": "v4.4.0",
"date": "2025-05-14T20:36:37Z"
},
{ {
"name": "esphome/esphome", "name": "esphome/esphome",
"version": "2025.4.2", "version": "2025.4.2",
"date": "2025-05-11T22:18:43Z" "date": "2025-05-11T22:18:43Z"
}, },
{
"name": "coder/code-server",
"version": "v4.100.1",
"date": "2025-05-14T18:08:16Z"
},
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.8.11.0",
"date": "2025-03-10T06:39:11Z"
},
{
"name": "Checkmk/checkmk",
"version": "v2.3.0p32+security",
"date": "2025-05-14T15:37:55Z"
},
{
"name": "Athou/commafeed",
"version": "5.9.0",
"date": "2025-05-14T15:29:48Z"
},
{
"name": "juanfont/headscale",
"version": "v0.26.0",
"date": "2025-05-14T15:12:14Z"
},
{
"name": "mongodb/mongo",
"version": "r6.0.24-alpha0",
"date": "2025-05-14T14:52:41Z"
},
{
"name": "motioneye-project/motioneye",
"version": "0.42.1",
"date": "2020-06-07T07:27:04Z"
},
{
"name": "zwave-js/zwave-js-ui",
"version": "v10.5.0",
"date": "2025-05-14T13:21:21Z"
},
{
"name": "firefly-iii/firefly-iii",
"version": "v6.2.12",
"date": "2025-04-20T19:22:17Z"
},
{
"name": "jenkinsci/jenkins",
"version": "jenkins-2.510",
"date": "2025-05-13T18:33:42Z"
},
{
"name": "nzbgetcom/nzbget",
"version": "v25.0",
"date": "2025-05-12T09:12:04Z"
},
{
"name": "wazuh/wazuh",
"version": "coverity-w20-4.13.0",
"date": "2025-05-14T12:06:20Z"
},
{
"name": "blakeblackshear/frigate",
"version": "v0.14.1",
"date": "2024-08-29T22:32:51Z"
},
{ {
"name": "morpheus65535/bazarr", "name": "morpheus65535/bazarr",
"version": "v1.5.2", "version": "v1.5.2",
"date": "2025-05-11T16:40:55Z" "date": "2025-05-11T16:40:55Z"
}, },
{
"name": "Jackett/Jackett",
"version": "v0.22.1895",
"date": "2025-05-14T05:59:00Z"
},
{
"name": "TandoorRecipes/recipes",
"version": "2.0.0-alpha-4",
"date": "2025-05-14T05:01:45Z"
},
{
"name": "ollama/ollama",
"version": "v0.6.9-rc0",
"date": "2025-05-10T18:57:30Z"
},
{
"name": "cross-seed/cross-seed",
"version": "v6.12.4",
"date": "2025-05-11T11:41:32Z"
},
{
"name": "netbox-community/netbox",
"version": "v4.3.1",
"date": "2025-05-13T19:45:00Z"
},
{
"name": "pocketbase/pocketbase",
"version": "v0.28.1",
"date": "2025-05-13T18:45:47Z"
},
{
"name": "keycloak/keycloak",
"version": "26.2.4",
"date": "2025-05-08T09:10:10Z"
},
{
"name": "OctoPrint/OctoPrint",
"version": "1.11.1",
"date": "2025-05-13T13:32:07Z"
},
{
"name": "redis/redis",
"version": "8.0.1",
"date": "2025-05-13T13:31:53Z"
},
{
"name": "theonedev/onedev",
"version": "v11.9.6",
"date": "2025-05-13T12:16:17Z"
},
{
"name": "element-hq/synapse",
"version": "v1.129.0",
"date": "2025-05-06T12:28:54Z"
},
{
"name": "zabbix/zabbix",
"version": "7.2.7rc1",
"date": "2025-05-13T11:55:32Z"
},
{
"name": "Graylog2/graylog2-server",
"version": "6.3.0-alpha.4",
"date": "2025-05-13T11:18:29Z"
},
{
"name": "zitadel/zitadel",
"version": "v2.65.9",
"date": "2025-05-13T05:14:39Z"
},
{
"name": "go-gitea/gitea",
"version": "v1.23.8",
"date": "2025-05-12T22:40:50Z"
},
{
"name": "leiweibau/Pi.Alert",
"version": "v2025-05-11",
"date": "2025-05-12T19:14:57Z"
},
{
"name": "duplicati/duplicati",
"version": "v2.1.0.118-2.1.0.118_canary_2025-05-12",
"date": "2025-05-12T18:50:44Z"
},
{
"name": "runtipi/runtipi",
"version": "nightly",
"date": "2025-05-12T18:39:33Z"
},
{
"name": "neo4j/neo4j",
"version": "4.4.43",
"date": "2025-05-12T15:33:17Z"
},
{
"name": "usememos/memos",
"version": "v0.24.3",
"date": "2025-05-12T15:23:21Z"
},
{
"name": "n8n-io/n8n",
"version": "n8n@1.91.3",
"date": "2025-05-08T12:25:10Z"
},
{
"name": "Paymenter/Paymenter",
"version": "v1.1.0",
"date": "2025-05-12T14:40:27Z"
},
{
"name": "VictoriaMetrics/VictoriaMetrics",
"version": "pmm-6401-v1.117.0",
"date": "2025-05-12T13:24:20Z"
},
{
"name": "apache/tika",
"version": "3.2.0-rc1",
"date": "2025-05-12T13:06:47Z"
},
{
"name": "mattermost/mattermost",
"version": "v10.7.2",
"date": "2025-05-12T10:42:32Z"
},
{
"name": "dgtlmoon/changedetection.io",
"version": "0.49.17",
"date": "2025-05-12T08:48:30Z"
},
{
"name": "stackblitz-labs/bolt.diy",
"version": "1.0.0",
"date": "2025-05-12T07:39:23Z"
},
{
"name": "umami-software/umami",
"version": "v2.18.1",
"date": "2025-05-12T07:16:12Z"
},
{ {
"name": "outline/outline", "name": "outline/outline",
"version": "v0.84.0", "version": "v0.84.0",
@@ -19,81 +249,36 @@
"version": "v3.5.3", "version": "v3.5.3",
"date": "2025-05-11T15:17:13Z" "date": "2025-05-11T15:17:13Z"
}, },
{
"name": "firefly-iii/firefly-iii",
"version": "v6.2.12",
"date": "2025-04-20T19:22:17Z"
},
{ {
"name": "Prowlarr/Prowlarr", "name": "Prowlarr/Prowlarr",
"version": "v1.35.1.5034", "version": "v1.35.1.5034",
"date": "2025-04-30T11:02:36Z" "date": "2025-04-30T11:02:36Z"
}, },
{
"name": "cross-seed/cross-seed",
"version": "v6.12.4",
"date": "2025-05-11T11:41:32Z"
},
{ {
"name": "authelia/authelia", "name": "authelia/authelia",
"version": "v4.39.3", "version": "v4.39.3",
"date": "2025-05-11T11:12:15Z" "date": "2025-05-11T11:12:15Z"
}, },
{
"name": "theonedev/onedev",
"version": "v11.9.5",
"date": "2025-05-11T10:50:37Z"
},
{ {
"name": "Radarr/Radarr", "name": "Radarr/Radarr",
"version": "v5.22.4.9896", "version": "v5.22.4.9896",
"date": "2025-04-23T18:51:12Z" "date": "2025-04-23T18:51:12Z"
}, },
{
"name": "pocketbase/pocketbase",
"version": "v0.28.0",
"date": "2025-05-11T06:25:22Z"
},
{
"name": "Jackett/Jackett",
"version": "v0.22.1888",
"date": "2025-05-11T06:00:48Z"
},
{ {
"name": "owncast/owncast", "name": "owncast/owncast",
"version": "v0.2.3", "version": "v0.2.3",
"date": "2025-05-10T21:14:45Z" "date": "2025-05-10T21:14:45Z"
}, },
{
"name": "runtipi/runtipi",
"version": "e2e",
"date": "2025-05-10T20:46:31Z"
},
{ {
"name": "open-webui/open-webui", "name": "open-webui/open-webui",
"version": "v0.6.9", "version": "v0.6.9",
"date": "2025-05-10T19:05:02Z" "date": "2025-05-10T19:05:02Z"
}, },
{
"name": "ollama/ollama",
"version": "v0.6.9-rc0",
"date": "2025-05-10T18:57:30Z"
},
{ {
"name": "Stirling-Tools/Stirling-PDF", "name": "Stirling-Tools/Stirling-PDF",
"version": "v0.46.1", "version": "v0.46.1",
"date": "2025-05-10T15:39:10Z" "date": "2025-05-10T15:39:10Z"
}, },
{
"name": "juanfont/headscale",
"version": "v0.25.1",
"date": "2025-02-25T17:30:48Z"
},
{
"name": "VictoriaMetrics/VictoriaMetrics",
"version": "v1.22.2-victorialogs",
"date": "2025-05-10T01:20:19Z"
},
{ {
"name": "pelican-dev/wings", "name": "pelican-dev/wings",
"version": "v1.0.0-beta13", "version": "v1.0.0-beta13",
@@ -109,41 +294,16 @@
"version": "v1.19.1", "version": "v1.19.1",
"date": "2025-05-09T19:15:10Z" "date": "2025-05-09T19:15:10Z"
}, },
{
"name": "MediaBrowser/Emby.Releases",
"version": "4.8.11.0",
"date": "2025-03-10T06:39:11Z"
},
{ {
"name": "home-assistant/core", "name": "home-assistant/core",
"version": "2025.5.1", "version": "2025.5.1",
"date": "2025-05-09T15:05:54Z" "date": "2025-05-09T15:05:54Z"
}, },
{
"name": "keycloak/keycloak",
"version": "26.2.4",
"date": "2025-05-08T09:10:10Z"
},
{
"name": "mattermost/mattermost",
"version": "v9.11.15",
"date": "2025-05-09T13:48:50Z"
},
{ {
"name": "crowdsecurity/crowdsec", "name": "crowdsecurity/crowdsec",
"version": "v1.6.8", "version": "v1.6.8",
"date": "2025-03-25T13:33:10Z" "date": "2025-03-25T13:33:10Z"
}, },
{
"name": "zitadel/zitadel",
"version": "v3.0.4",
"date": "2025-05-09T11:38:33Z"
},
{
"name": "coder/code-server",
"version": "v4.99.4",
"date": "2025-05-02T18:33:09Z"
},
{ {
"name": "pocket-id/pocket-id", "name": "pocket-id/pocket-id",
"version": "v0.53.0", "version": "v0.53.0",
@@ -159,31 +319,11 @@
"version": "v25.02.4", "version": "v25.02.4",
"date": "2025-05-08T15:03:17Z" "date": "2025-05-08T15:03:17Z"
}, },
{
"name": "wazuh/wazuh",
"version": "v4.12.0",
"date": "2025-05-08T13:27:46Z"
},
{ {
"name": "apache/tomcat", "name": "apache/tomcat",
"version": "10.1.41", "version": "10.1.41",
"date": "2025-05-08T12:45:44Z" "date": "2025-05-08T12:45:44Z"
}, },
{
"name": "n8n-io/n8n",
"version": "n8n@1.91.3",
"date": "2025-05-08T12:25:10Z"
},
{
"name": "zwave-js/zwave-js-ui",
"version": "v10.4.2",
"date": "2025-05-08T08:11:27Z"
},
{
"name": "umami-software/umami",
"version": "v2.18.0",
"date": "2025-05-08T07:14:55Z"
},
{ {
"name": "semaphoreui/semaphore", "name": "semaphoreui/semaphore",
"version": "v2.14.10", "version": "v2.14.10",
@@ -204,11 +344,6 @@
"version": "v0.34.1", "version": "v0.34.1",
"date": "2025-03-25T18:11:12Z" "date": "2025-03-25T18:11:12Z"
}, },
{
"name": "NodeBB/NodeBB",
"version": "v4.3.1",
"date": "2025-05-07T15:38:20Z"
},
{ {
"name": "donaldzou/WGDashboard", "name": "donaldzou/WGDashboard",
"version": "v4.2.3", "version": "v4.2.3",
@@ -224,21 +359,11 @@
"version": "v5.7.5", "version": "v5.7.5",
"date": "2025-05-07T14:01:45Z" "date": "2025-05-07T14:01:45Z"
}, },
{
"name": "Graylog2/graylog2-server",
"version": "6.3.0-alpha.3",
"date": "2025-05-07T13:58:36Z"
},
{ {
"name": "glpi-project/glpi", "name": "glpi-project/glpi",
"version": "10.0.18", "version": "10.0.18",
"date": "2025-02-12T11:07:02Z" "date": "2025-02-12T11:07:02Z"
}, },
{
"name": "nzbgetcom/nzbget",
"version": "v24.8",
"date": "2025-03-18T07:33:51Z"
},
{ {
"name": "ZoeyVid/NPMplus", "name": "ZoeyVid/NPMplus",
"version": "2025-05-07-r1", "version": "2025-05-07-r1",
@@ -249,11 +374,6 @@
"version": "v2.36.0", "version": "v2.36.0",
"date": "2025-05-07T11:54:14Z" "date": "2025-05-07T11:54:14Z"
}, },
{
"name": "Checkmk/checkmk",
"version": "v2.2.0p42-rc1",
"date": "2025-05-07T11:50:30Z"
},
{ {
"name": "openobserve/openobserve", "name": "openobserve/openobserve",
"version": "v0.14.7", "version": "v0.14.7",
@@ -269,11 +389,6 @@
"version": "338", "version": "338",
"date": "2025-05-07T10:43:29Z" "date": "2025-05-07T10:43:29Z"
}, },
{
"name": "zabbix/zabbix",
"version": "7.4.0beta2",
"date": "2025-05-07T10:39:21Z"
},
{ {
"name": "jupyter/notebook", "name": "jupyter/notebook",
"version": "@jupyter-notebook/ui-components@7.5.0-alpha.0", "version": "@jupyter-notebook/ui-components@7.5.0-alpha.0",
@@ -284,26 +399,11 @@
"version": "v1.12.1rc0", "version": "v1.12.1rc0",
"date": "2025-05-06T20:56:30Z" "date": "2025-05-06T20:56:30Z"
}, },
{
"name": "redis/redis",
"version": "8.0.1-int",
"date": "2025-05-06T18:40:34Z"
},
{
"name": "Athou/commafeed",
"version": "5.8.0",
"date": "2025-05-06T18:33:07Z"
},
{ {
"name": "sysadminsmedia/homebox", "name": "sysadminsmedia/homebox",
"version": "v0.19.0", "version": "v0.19.0",
"date": "2025-05-06T18:05:42Z" "date": "2025-05-06T18:05:42Z"
}, },
{
"name": "jenkinsci/jenkins",
"version": "jenkins-2.509",
"date": "2025-05-06T15:37:10Z"
},
{ {
"name": "MariaDB/server", "name": "MariaDB/server",
"version": "mariadb-11.4.6", "version": "mariadb-11.4.6",
@@ -319,16 +419,6 @@
"version": "v0.107.61", "version": "v0.107.61",
"date": "2025-04-22T12:42:26Z" "date": "2025-04-22T12:42:26Z"
}, },
{
"name": "element-hq/synapse",
"version": "v1.129.0",
"date": "2025-05-06T12:28:54Z"
},
{
"name": "Luligu/matterbridge",
"version": "3.0.1",
"date": "2025-05-06T10:24:43Z"
},
{ {
"name": "syncthing/syncthing", "name": "syncthing/syncthing",
"version": "v1.29.6", "version": "v1.29.6",
@@ -374,16 +464,6 @@
"version": "v0.18.0", "version": "v0.18.0",
"date": "2025-05-05T15:34:40Z" "date": "2025-05-05T15:34:40Z"
}, },
{
"name": "apache/tika",
"version": "2.9.4",
"date": "2025-05-05T15:17:27Z"
},
{
"name": "neo4j/neo4j",
"version": "5.26.6",
"date": "2025-05-05T13:59:36Z"
},
{ {
"name": "traefik/traefik", "name": "traefik/traefik",
"version": "v3.4.0", "version": "v3.4.0",
@@ -434,16 +514,6 @@
"version": "v2.0.111", "version": "v2.0.111",
"date": "2025-05-03T16:25:30Z" "date": "2025-05-03T16:25:30Z"
}, },
{
"name": "dgtlmoon/changedetection.io",
"version": "0.49.16",
"date": "2025-05-03T14:44:01Z"
},
{
"name": "blakeblackshear/frigate",
"version": "v0.14.1",
"date": "2024-08-29T22:32:51Z"
},
{ {
"name": "kimai/kimai", "name": "kimai/kimai",
"version": "2.33.0", "version": "2.33.0",
@@ -474,31 +544,16 @@
"version": "v3.5.4", "version": "v3.5.4",
"date": "2025-05-02T13:42:06Z" "date": "2025-05-02T13:42:06Z"
}, },
{
"name": "motioneye-project/motioneye",
"version": "0.42.1",
"date": "2020-06-07T07:27:04Z"
},
{ {
"name": "emqx/emqx", "name": "emqx/emqx",
"version": "e5.9.0", "version": "e5.9.0",
"date": "2025-05-02T11:07:10Z" "date": "2025-05-02T11:07:10Z"
}, },
{
"name": "stackblitz-labs/bolt.diy",
"version": "v1.0.0-draft",
"date": "2025-05-01T18:33:44Z"
},
{ {
"name": "Koenkk/zigbee2mqtt", "name": "Koenkk/zigbee2mqtt",
"version": "2.3.0", "version": "2.3.0",
"date": "2025-05-01T18:24:31Z" "date": "2025-05-01T18:24:31Z"
}, },
{
"name": "netbox-community/netbox",
"version": "v4.3.0",
"date": "2025-05-01T16:46:17Z"
},
{ {
"name": "WordPress/WordPress", "name": "WordPress/WordPress",
"version": "6.8.1", "version": "6.8.1",
@@ -524,11 +579,6 @@
"version": "version/2025.4.0", "version": "version/2025.4.0",
"date": "2025-04-30T12:34:14Z" "date": "2025-04-30T12:34:14Z"
}, },
{
"name": "go-gitea/gitea",
"version": "v1.25.0-dev",
"date": "2025-04-28T22:57:56Z"
},
{ {
"name": "hivemq/hivemq-community-edition", "name": "hivemq/hivemq-community-edition",
"version": "2025.3", "version": "2025.3",
@@ -574,11 +624,6 @@
"version": "v0.24.1", "version": "v0.24.1",
"date": "2025-04-28T08:21:37Z" "date": "2025-04-28T08:21:37Z"
}, },
{
"name": "advplyr/audiobookshelf",
"version": "v2.21.0",
"date": "2025-04-27T16:31:14Z"
},
{ {
"name": "gotify/server", "name": "gotify/server",
"version": "v2.6.3", "version": "v2.6.3",
@@ -594,16 +639,6 @@
"version": "v3.1.9", "version": "v3.1.9",
"date": "2025-03-01T02:24:33Z" "date": "2025-03-01T02:24:33Z"
}, },
{
"name": "TandoorRecipes/recipes",
"version": "1.5.34",
"date": "2025-03-27T16:17:38Z"
},
{
"name": "leiweibau/Pi.Alert",
"version": "v2025-04-26",
"date": "2025-04-26T14:16:12Z"
},
{ {
"name": "openhab/openhab-core", "name": "openhab/openhab-core",
"version": "4.3.5", "version": "4.3.5",
@@ -619,16 +654,6 @@
"version": "v13.6.0", "version": "v13.6.0",
"date": "2025-04-26T10:21:12Z" "date": "2025-04-26T10:21:12Z"
}, },
{
"name": "duplicati/duplicati",
"version": "v2.1.0.117-2.1.0.117_canary_2025-04-25",
"date": "2025-04-25T17:22:12Z"
},
{
"name": "mongodb/mongo",
"version": "r7.0.19",
"date": "2025-04-24T20:59:43Z"
},
{ {
"name": "dotnetfactory/fluid-calendar", "name": "dotnetfactory/fluid-calendar",
"version": "v1.4.0", "version": "v1.4.0",
@@ -649,21 +674,11 @@
"version": "RELEASE.2025-04-22T22-12-26Z", "version": "RELEASE.2025-04-22T22-12-26Z",
"date": "2025-04-22T22:44:34Z" "date": "2025-04-22T22:44:34Z"
}, },
{
"name": "glanceapp/glance",
"version": "v0.7.13",
"date": "2025-04-22T22:19:16Z"
},
{ {
"name": "OliveTin/OliveTin", "name": "OliveTin/OliveTin",
"version": "2025.4.22", "version": "2025.4.22",
"date": "2025-04-22T14:18:11Z" "date": "2025-04-22T14:18:11Z"
}, },
{
"name": "OctoPrint/OctoPrint",
"version": "1.11.0",
"date": "2025-04-22T09:33:46Z"
},
{ {
"name": "monicahq/monica", "name": "monicahq/monica",
"version": "v4.1.2", "version": "v4.1.2",
@@ -694,11 +709,6 @@
"version": "v2.10.0", "version": "v2.10.0",
"date": "2025-04-18T20:46:28Z" "date": "2025-04-18T20:46:28Z"
}, },
{
"name": "Paymenter/Paymenter",
"version": "v1.0.4",
"date": "2025-04-18T16:08:02Z"
},
{ {
"name": "tailscale/tailscale", "name": "tailscale/tailscale",
"version": "v1.82.5", "version": "v1.82.5",
@@ -734,11 +744,6 @@
"version": "15.2", "version": "15.2",
"date": "2025-04-14T15:37:12Z" "date": "2025-04-14T15:37:12Z"
}, },
{
"name": "Ombi-app/Ombi",
"version": "v4.47.1",
"date": "2025-01-05T21:14:23Z"
},
{ {
"name": "Tautulli/Tautulli", "name": "Tautulli/Tautulli",
"version": "v2.15.2", "version": "v2.15.2",
@@ -894,11 +899,6 @@
"version": "v4.3.1", "version": "v4.3.1",
"date": "2025-03-23T09:02:54Z" "date": "2025-03-23T09:02:54Z"
}, },
{
"name": "usememos/memos",
"version": "v0.24.2",
"date": "2025-03-23T04:01:50Z"
},
{ {
"name": "clusterzx/paperless-ai", "name": "clusterzx/paperless-ai",
"version": "v2.7.6", "version": "v2.7.6",

View File

@@ -13,6 +13,11 @@ setting_up_container
network_check network_check
update_os update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
make
msg_ok "Installed Dependencies"
msg_info "Installing Actual Budget" msg_info "Installing Actual Budget"
cd /opt cd /opt
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }') RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')

View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/TwiN/gatus
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing dependencies"
$STD apk add --no-cache \
ca-certificates \
libcap-setcap
$STD apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community go
msg_ok "Installed dependencies"
RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
msg_info "Installing gatus v${RELEASE}"
temp_file=$(mktemp)
mkdir -p /opt/gatus
curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
cd /opt/gatus
$STD go mod tidy
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
setcap CAP_NET_RAW+ep gatus
mv config.yaml config
echo "${RELEASE}" >/opt/gatus_version.txt
msg_ok "Installed gatus v${RELEASE}"
msg_info "Enabling gatus Service"
cat <<EOF >/etc/init.d/gatus
#!/sbin/openrc-run
description="gatus Service"
directory="/opt/gatus"
command="/opt/gatus/gatus"
command_args=""
command_background="true"
command_user="root"
pidfile="/var/run/gatus.pid"
export GATUS_CONFIG_PATH=""
export GATUS_LOG_LEVEL="INFO"
export PORT="8080"
depend() {
use net
}
EOF
chmod +x /etc/init.d/gatus
$STD rc-update add gatus default
msg_ok "Enabled gatus Service"
msg_info "Starting gatus"
$STD service gatus start
msg_ok "Started gatus"
motd_ssh
customize
msg_info "Cleaning up"
rm -f "$temp_file"
$STD apk cache clean
msg_ok "Cleaned"

View File

@@ -27,7 +27,7 @@ curl -fsSL "https://github.com/rclone/rclone/releases/download/v${RELEASE}/rclon
$STD unzip -j "$temp_file" '*/**' -d /opt/rclone $STD unzip -j "$temp_file" '*/**' -d /opt/rclone
cd /opt/rclone cd /opt/rclone
RCLONE_PASSWORD=$(head -c 16 /dev/urandom | xxd -p -c 16) RCLONE_PASSWORD=$(head -c 16 /dev/urandom | xxd -p -c 16)
$STD htpasswd -cb -B login.pwd admin "$RCLONE_PASSWORD" $STD htpasswd -cb -B /opt/login.pwd admin "$RCLONE_PASSWORD"
{ {
echo "rclone-Credentials" echo "rclone-Credentials"
echo "rclone User Name: admin" echo "rclone User Name: admin"
@@ -42,7 +42,7 @@ cat <<EOF >/etc/init.d/rclone
#!/sbin/openrc-run #!/sbin/openrc-run
description="rclone Service" description="rclone Service"
command="/opt/rclone/rclone" command="/opt/rclone/rclone"
command_args="rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-htpasswd /opt/rclone/login.pwd" command_args="rcd --rc-web-gui --rc-web-gui-no-open-browser --rc-addr :3000 --rc-htpasswd /opt/login.pwd"
command_background="true" command_background="true"
command_user="root" command_user="root"
pidfile="/var/run/rclone.pid" pidfile="/var/run/rclone.pid"

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

@@ -0,0 +1,56 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: michelroegl-brunner
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://asterisk.org
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
libsrtp2-dev \
build-essential \
libedit-dev \
uuid-dev \
libjansson-dev \
libxml2-dev \
libsqlite3-dev
msg_ok "Installed Dependencies"
msg_info "Downloading Asterisk"
RELEASE=$(curl -fsSL https://downloads.asterisk.org/pub/telephony/asterisk/ | grep -o 'asterisk-[0-9]\+-current\.tar\.gz' | sort -V | tail -n1)
temp_file=$(mktemp)
curl -fsSL "https://downloads.asterisk.org/pub/telephony/asterisk/${RELEASE}" -o "$temp_file"
mkdir -p /opt/asterisk
tar zxf "$temp_file" --strip-components=1 -C /opt/asterisk
cd /opt/asterisk
msg_ok "Downloaded Asterisk"
msg_info "Installing Asterisk"
$STD ./contrib/scripts/install_prereq install
$STD ./configure
$STD make -j$(nproc)
$STD make install
$STD make config
$STD make install-logrotate
$STD make samples
mkdir -p /etc/radiusclient-ng/
ln /etc/radcli/radiusclient.conf /etc/radiusclient-ng/radiusclient.conf
systemctl enable -q --now asterisk
msg_ok "Installed Asterisk"
motd_ssh
customize
msg_info "Cleaning up"
rm -f "$temp_file"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"

View File

@@ -20,27 +20,16 @@ msg_ok "Setup Functions"
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt-get install -y \
gpg \
libc6 \ libc6 \
make \ make \
cmake \ cmake \
jq \ jq \
postgresql \
python3 \ python3 \
python3-bcrypt python3-bcrypt
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Setting up Node.js Repository" NODE_VERSION="22" NODE_MODULE="turbo@1.9.3" install_node_and_modules
mkdir -p /etc/apt/keyrings PG_VERSION="16" install_postgresql
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
msg_ok "Set up Node.js Repository"
msg_info "Installing Node.js"
$STD apt-get update
$STD apt-get install -y nodejs
$STD npm install -g turbo@1.9.3
msg_ok "Installed Node.js"
msg_info "Setting up PostgreSQL" msg_info "Setting up PostgreSQL"
DB_NAME="documenso_db" DB_NAME="documenso_db"
@@ -90,7 +79,7 @@ msg_ok "Installed Documenso"
msg_info "Create User" msg_info "Create User"
PASSWORD_HASH=$(python3 -c "import bcrypt; print(bcrypt.hashpw(b'helper-scripts', bcrypt.gensalt(rounds=12)).decode())") PASSWORD_HASH=$(python3 -c "import bcrypt; print(bcrypt.hashpw(b'helper-scripts', bcrypt.gensalt(rounds=12)).decode())")
sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\", \"customerId\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25', NULL) RETURNING id;" $STD sudo -u postgres psql -d documenso_db -c "INSERT INTO \"User\" (name, email, \"emailVerified\", password, \"identityProvider\", roles, \"createdAt\", \"lastSignedIn\", \"updatedAt\", \"customerId\") VALUES ('helper-scripts', 'helper-scripts@local.com', '2025-01-20 17:14:45.058', '$PASSWORD_HASH', 'DOCUMENSO', ARRAY['USER', 'ADMIN']::\"Role\"[], '2025-01-20 16:04:05.543', '2025-01-20 16:14:55.249', '2025-01-20 16:14:55.25', NULL) RETURNING id;"
$STD npm run prisma:migrate-deploy $STD npm run prisma:migrate-deploy
msg_ok "User created" msg_ok "User created"

67
install/gatus-install.sh Normal file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/TwiN/gatus
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
ca-certificates \
libcap2-bin
msg_ok "Installed Dependencies"
install_go
RELEASE=$(curl -s https://api.github.com/repos/TwiN/gatus/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
msg_info "Setting up gatus v${RELEASE}"
temp_file=$(mktemp)
mkdir -p /opt/gatus
curl -fsSL "https://github.com/TwiN/gatus/archive/refs/tags/v${RELEASE}.tar.gz" -o "$temp_file"
tar zxf "$temp_file" --strip-components=1 -C /opt/gatus
cd /opt/gatus
$STD go mod tidy
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gatus .
setcap CAP_NET_RAW+ep gatus
mv config.yaml config
echo "${RELEASE}" >/opt/gatus_version.txt
msg_ok "Done setting up gatus"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/gatus.service
[Unit]
Description=gatus Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/gatus
ExecStart=/opt/gatus/gatus
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now gatus
msg_ok "Created Service"
motd_ssh
customize
msg_info "Cleaning up"
rm -f "$temp_file"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned"
motd_ssh
customize

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)"

74
install/odoo-install.sh Normal file
View File

@@ -0,0 +1,74 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/tteck/Proxmox/raw/main/LICENSE
# Source: https://github.com/odoo/odoo
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt-get install -y \
build-essential \
make
msg_ok "Installed Dependencies"
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |
sed -E "s/odoo_(${RELEASE}\.[0-9]+)_all\.deb/\1/" |
sort -V |
tail -n1)
msg_info "Setup Odoo $RELEASE"
curl -fsSL https://nightly.odoo.com/${RELEASE}/nightly/deb/odoo_${RELEASE}.latest_all.deb -o /opt/odoo.deb
$STD apt install -y /opt/odoo.deb
msg_ok "Setup Odoo $RELEASE"
msg_info "Setup PostgreSQL Database"
DB_NAME="odoo"
DB_USER="odoo_usr"
DB_PASS="$(openssl rand -base64 18 | cut -c1-13)"
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;"
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';"
$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;"
$STD sudo -u postgres psql -c "ALTER DATABASE $DB_NAME OWNER TO $DB_USER;"
$STD sudo -u postgres psql -c "ALTER USER $DB_USER WITH SUPERUSER;"
{
echo "Odoo-Credentials"
echo -e "Odoo Database User: $DB_USER"
echo -e "Odoo Database Password: $DB_PASS"
echo -e "Odoo Database Name: $DB_NAME"
} >>~/odoo.creds
msg_ok "Setup PostgreSQL"
msg_info "Configuring Odoo"
sed -i \
-e "s|^;*db_host *=.*|db_host = localhost|" \
-e "s|^;*db_port *=.*|db_port = 5432|" \
-e "s|^;*db_user *=.*|db_user = $DB_USER|" \
-e "s|^;*db_password *=.*|db_password = $DB_PASS|" \
/etc/odoo/odoo.conf
$STD sudo -u odoo odoo -c /etc/odoo/odoo.conf -d odoo -i base --stop-after-init
systemctl restart odoo
echo "${LATEST_VERSION}" >/opt/${APPLICATION}_version.txt
msg_ok "Configured Odoo"
msg_info "Restarting Odoo"
msg_ok "Restarted Odoo"
motd_ssh
customize
msg_info "Cleaning up"
rm -f /opt/odoo.deb
$STD apt-get autoremove
$STD apt-get autoclean
msg_ok "Cleaned"

View File

@@ -16,20 +16,19 @@ update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt-get install -y \ $STD apt-get install -y \
gnupg \ gnupg \
ca-certificates \
apt-transport-https apt-transport-https
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Installing Azul Zulu21" msg_info "Installing Azul Zulu17"
curl -fsSL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB1998361219BD9C9" -o "/etc/apt/trusted.gpg.d/zulu-repo.asc" curl -fsSL https://repos.azul.com/azul-repo.key | gpg --dearmor -o /usr/share/keyrings/azul.gpg
curl -fsSL "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb" -o $(basename "https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb") echo "deb [signed-by=/usr/share/keyrings/azul.gpg] https://repos.azul.com/zulu/deb stable main" >/etc/apt/sources.list.d/zulu.list
$STD dpkg -i zulu-repo_1.0.0-3_all.deb
$STD apt-get update $STD apt-get update
$STD apt-get -y install zulu21-jdk $STD apt-get -y install zulu17-jdk
msg_ok "Installed Azul Zulu21" msg_ok "Installed Azul Zulu17"
msg_info "Installing openHAB" msg_info "Installing openHAB"
curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor >openhab.gpg curl -fsSL "https://openhab.jfrog.io/artifactory/api/gpg/key/public" | gpg --dearmor -o /usr/share/keyrings/openhab.gpg
mv openhab.gpg /usr/share/keyrings
chmod u=rw,g=r,o=r /usr/share/keyrings/openhab.gpg chmod u=rw,g=r,o=r /usr/share/keyrings/openhab.gpg
echo "deb [signed-by=/usr/share/keyrings/openhab.gpg] https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main" >/etc/apt/sources.list.d/openhab.list echo "deb [signed-by=/usr/share/keyrings/openhab.gpg] https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main" >/etc/apt/sources.list.d/openhab.list
$STD apt update $STD apt update

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"

View File

@@ -528,7 +528,37 @@ advanced_settings() {
exit_script exit_script
fi fi
BRIDGES=$( ip link show | grep -oP '(?<=: )vmbr\d+' | sort)
BRIDGES=""
IFACE_FILEPATH_LIST="/etc/network/interfaces"$'\n'$(find "/etc/network/interfaces.d/" -type f)
OLD_IFS=$IFS; IFS=$'\n'
for iface_filepath in ${IFACE_FILEPATH_LIST}; do
iface_indexes_tmpfile=$(mktemp -q -u '.iface-XXXX')
( grep -Pn '^\s*iface' "${iface_filepath}" | cut -d':' -f1 && wc -l "${iface_filepath}" | cut -d' ' -f1 ) | \
awk 'FNR==1 {line=$0; next} {print line":"$0-1; line=$0}' > "${iface_indexes_tmpfile}"
if [ -f "${iface_indexes_tmpfile}" ]; then
while read -r pair; do
start=$(echo "${pair}" | cut -d':' -f1)
end=$(echo "${pair}" | cut -d':' -f2)
if awk "NR >= ${start} && NR <= ${end}" "${iface_filepath}" | grep -qP '^\s*bridge[-_](ports|stp|fd|vlan-aware|vids)\s+'; then
iface_name=$(sed "${start}q;d" "${iface_filepath}" | awk '{print $2}')
BRIDGES="${iface_name}"$'\n'"${BRIDGES}"
fi
done < "${iface_indexes_tmpfile}"
rm -f "${iface_indexes_tmpfile}"
fi
done
IFS=$OLD_IFS
BRIDGES=$(echo "$BRIDGES" | grep -v '^\s*$' | sort | uniq)
if [[ -z "$BRIDGES" ]]; then 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}"
@@ -779,8 +809,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
@@ -797,66 +825,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}"
@@ -954,27 +954,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
@@ -1399,7 +1398,7 @@ description() {
<img src='https://img.shields.io/badge/&#x2615;-Buy us a coffee-blue' alt='spend Coffee' /> <img src='https://img.shields.io/badge/&#x2615;-Buy us a coffee-blue' alt='spend Coffee' />
</a> </a>
</p> </p>
<span style='margin: 0 10px;'> <span style='margin: 0 10px;'>
<i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i> <i class="fa fa-github fa-fw" style="color: #f5f5f5;"></i>
<a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a> <a href='https://github.com/community-scripts/ProxmoxVE' target='_blank' rel='noopener noreferrer' style='text-decoration: none; color: #00617f;'>GitHub</a>

View File

@@ -55,10 +55,16 @@ install_node_and_modules() {
IFS=',' read -ra MODULES <<<"$NODE_MODULE" IFS=',' read -ra MODULES <<<"$NODE_MODULE"
for mod in "${MODULES[@]}"; do for mod in "${MODULES[@]}"; do
local MODULE_NAME MODULE_REQ_VERSION MODULE_INSTALLED_VERSION local MODULE_NAME MODULE_REQ_VERSION MODULE_INSTALLED_VERSION
if [[ "$mod" == *"@"* ]]; then if [[ "$mod" == @*/*@* ]]; then
# Scoped package with version, e.g. @vue/cli-service@latest
MODULE_NAME="${mod%@*}" MODULE_NAME="${mod%@*}"
MODULE_REQ_VERSION="${mod#*@}" MODULE_REQ_VERSION="${mod##*@}"
elif [[ "$mod" == *"@"* ]]; then
# Unscoped package with version, e.g. yarn@latest
MODULE_NAME="${mod%@*}"
MODULE_REQ_VERSION="${mod##*@}"
else else
# No version specified
MODULE_NAME="$mod" MODULE_NAME="$mod"
MODULE_REQ_VERSION="latest" MODULE_REQ_VERSION="latest"
fi fi
@@ -101,25 +107,31 @@ install_postgresql() {
DISTRO="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)" DISTRO="$(awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release)"
if command -v psql >/dev/null; then if command -v psql >/dev/null; then
CURRENT_PG_VERSION="$(psql -V | grep -oP '\s\K[0-9]+(?=\.)')" CURRENT_PG_VERSION="$(psql -V | awk '{print $3}' | cut -d. -f1)"
if [[ "$CURRENT_PG_VERSION" != "$PG_VERSION" ]]; then if [[ "$CURRENT_PG_VERSION" == "$PG_VERSION" ]]; then
msg_info "PostgreSQL Version $CURRENT_PG_VERSION found, replacing with $PG_VERSION" msg_ok "PostgreSQL $PG_VERSION is already installed"
NEED_PG_INSTALL=true return
fi fi
msg_info "Detected PostgreSQL $CURRENT_PG_VERSION, preparing upgrade to $PG_VERSION"
NEED_PG_INSTALL=true
else else
msg_info "PostgreSQL not found, installing version $PG_VERSION" msg_info "PostgreSQL not installed, proceeding with fresh install of $PG_VERSION"
NEED_PG_INSTALL=true NEED_PG_INSTALL=true
fi fi
if [[ "$NEED_PG_INSTALL" == true ]]; then if [[ "$NEED_PG_INSTALL" == true ]]; then
msg_info "Stopping PostgreSQL if running" if [[ -n "$CURRENT_PG_VERSION" ]]; then
systemctl stop postgresql >/dev/null 2>&1 || true msg_info "Dumping all PostgreSQL data from version $CURRENT_PG_VERSION"
su - postgres -c "pg_dumpall > /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
fi
msg_info "Removing conflicting PostgreSQL packages" msg_info "Stopping PostgreSQL service"
$STD apt-get purge -y "postgresql*" systemctl stop postgresql || true
msg_info "Removing pgdg repo and old GPG key"
rm -f /etc/apt/sources.list.d/pgdg.list /etc/apt/trusted.gpg.d/postgresql.gpg rm -f /etc/apt/sources.list.d/pgdg.list /etc/apt/trusted.gpg.d/postgresql.gpg
msg_info "Setting up PostgreSQL Repository" msg_info "Adding PostgreSQL PGDG repository"
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc |
gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
@@ -127,9 +139,24 @@ install_postgresql() {
>/etc/apt/sources.list.d/pgdg.list >/etc/apt/sources.list.d/pgdg.list
$STD apt-get update $STD apt-get update
$STD apt-get install -y "postgresql-${PG_VERSION}"
msg_ok "Installed PostgreSQL ${PG_VERSION}" msg_info "Installing PostgreSQL $PG_VERSION"
$STD apt-get install -y "postgresql-${PG_VERSION}" "postgresql-client-${PG_VERSION}"
if [[ -n "$CURRENT_PG_VERSION" ]]; then
$STD msg_info "Removing old PostgreSQL $CURRENT_PG_VERSION packages"
$STD apt-get purge -y "postgresql-${CURRENT_PG_VERSION}" "postgresql-client-${CURRENT_PG_VERSION}" || true
fi
$STD msg_info "Starting PostgreSQL $PG_VERSION"
systemctl enable --now postgresql
if [[ -n "$CURRENT_PG_VERSION" ]]; then
$STD msg_info "Restoring dumped data"
su - postgres -c "psql < /var/lib/postgresql/backup_$(date +%F)_v${CURRENT_PG_VERSION}.sql"
fi
msg_ok "PostgreSQL $PG_VERSION installed"
fi fi
} }
@@ -245,7 +272,11 @@ install_php() {
COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -) COMBINED_MODULES=$(echo "$COMBINED_MODULES" | tr ',' '\n' | awk '!seen[$0]++' | paste -sd, -)
local CURRENT_PHP local CURRENT_PHP
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2) if command -v php >/dev/null 2>&1; then
CURRENT_PHP=$(php -v 2>/dev/null | awk '/^PHP/{print $2}' | cut -d. -f1,2)
else
CURRENT_PHP=""
fi
if [[ "$CURRENT_PHP" != "$PHP_VERSION" ]]; then if [[ "$CURRENT_PHP" != "$PHP_VERSION" ]]; then
$STD echo "PHP $CURRENT_PHP detected, migrating to PHP $PHP_VERSION" $STD echo "PHP $CURRENT_PHP detected, migrating to PHP $PHP_VERSION"
@@ -352,7 +383,7 @@ install_go() {
msg_error "Could not determine latest Go version" msg_error "Could not determine latest Go version"
return 1 return 1
fi fi
msg_info "Detected latest Go version: $GO_VERSION" $STD msg_info "Detected latest Go version: $GO_VERSION"
fi fi
local GO_BIN="/usr/local/bin/go" local GO_BIN="/usr/local/bin/go"
@@ -362,10 +393,10 @@ install_go() {
local CURRENT_VERSION local CURRENT_VERSION
CURRENT_VERSION=$("$GO_BIN" version | awk '{print $3}' | sed 's/go//') CURRENT_VERSION=$("$GO_BIN" version | awk '{print $3}' | sed 's/go//')
if [[ "$CURRENT_VERSION" == "$GO_VERSION" ]]; then if [[ "$CURRENT_VERSION" == "$GO_VERSION" ]]; then
msg_ok "Go $GO_VERSION already installed" $STD msg_ok "Go $GO_VERSION already installed"
return 0 return 0
else else
msg_info "Go $CURRENT_VERSION found, upgrading to $GO_VERSION" $STD msg_info "Go $CURRENT_VERSION found, upgrading to $GO_VERSION"
rm -rf "$GO_INSTALL_DIR" rm -rf "$GO_INSTALL_DIR"
fi fi
else else
@@ -538,6 +569,7 @@ fetch_and_deploy_gh_release() {
tag=$(echo "$api_response" | jq -r '.tag_name // .name // empty') tag=$(echo "$api_response" | jq -r '.tag_name // .name // empty')
[[ "$tag" =~ ^v[0-9] ]] && tag="${tag:1}" [[ "$tag" =~ ^v[0-9] ]] && tag="${tag:1}"
version="${tag#v}"
if [[ -z "$tag" ]]; then if [[ -z "$tag" ]]; then
$STD msg_info "Empty tag received, retrying...\n" $STD msg_info "Empty tag received, retrying...\n"
@@ -560,7 +592,6 @@ fetch_and_deploy_gh_release() {
return 0 return 0
fi fi
local version="$tag"
local base_url="https://github.com/$repo/releases/download/v$tag" local base_url="https://github.com/$repo/releases/download/v$tag"
local tmpdir local tmpdir
tmpdir=$(mktemp -d) || return 1 tmpdir=$(mktemp -d) || return 1
@@ -620,8 +651,15 @@ fetch_and_deploy_gh_release() {
# Final fallback to GitHub source tarball # Final fallback to GitHub source tarball
if [[ -z "$url" ]]; then if [[ -z "$url" ]]; then
url="https://github.com/$repo/archive/refs/tags/$version.tar.gz" # Use tarball_url directly from API response instead of constructing our own URL
$STD msg_info "Trying GitHub source tarball fallback: $url" url=$(echo "$api_response" | jq -r '.tarball_url // empty')
# If tarball_url is empty for some reason, fall back to a constructed URL as before
if [[ -z "$url" ]]; then
url="https://github.com/$repo/archive/refs/tags/v$version.tar.gz"
fi
$STD msg_info "Using GitHub source tarball: $url"
fi fi
local filename="${url##*/}" local filename="${url##*/}"
@@ -659,8 +697,8 @@ setup_local_ip_helper() {
# Install networkd-dispatcher if not present # Install networkd-dispatcher if not present
if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then if ! dpkg -s networkd-dispatcher >/dev/null 2>&1; then
apt-get update -qq $STD apt-get update -qq
apt-get install -yq networkd-dispatcher $STD apt-get install -yq networkd-dispatcher
fi fi
# Write update_local_ip.sh # Write update_local_ip.sh
@@ -716,7 +754,7 @@ $SCRIPT_PATH
EOF EOF
chmod +x "$DISPATCHER_SCRIPT" chmod +x "$DISPATCHER_SCRIPT"
systemctl enable --now networkd-dispatcher.service systemctl enable -q --now networkd-dispatcher.service
$STD msg_ok "LOCAL_IP helper installed using networkd-dispatcher" $STD msg_ok "LOCAL_IP helper installed using networkd-dispatcher"
} }

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

@@ -16,43 +16,52 @@ cat <<"EOF"
EOF EOF
add() { add() {
echo -e "\n IMPORTANT: Tag-Based Monitoring Enabled"
echo "Only VMs and containers with the tag 'mon-restart' will be automatically restarted by this service."
echo
echo "🔧 How to add the tag:"
echo " → Proxmox Web UI: Go to VM/CT → Options → Tags → Add 'mon-restart'"
echo " → CLI: qm set <vmid> -tags mon-restart"
echo " pct set <ctid> -tags mon-restart"
echo
while true; do while true; do
read -p "This script will add Monitor All to Proxmox VE. Proceed(y/n)?" yn read -p "This script will add Monitor All to Proxmox VE. Proceed (y/n)? " yn
case $yn in case $yn in
[Yy]*) break ;; [Yy]*) break ;;
[Nn]*) exit ;; [Nn]*) exit ;;
*) echo "Please answer yes or no." ;; *) echo "Please answer yes or no." ;;
esac esac
done done
echo '#!/usr/bin/env bash cat <<'EOF' >/usr/local/bin/ping-instances.sh
#!/usr/bin/env bash
# Read excluded instances from command line arguments # Read excluded instances from command line arguments
excluded_instances=("$@") excluded_instances=("$@")
echo "Excluded instances: ${excluded_instances[@]}" echo "Excluded instances: ${excluded_instances[@]}"
while true; do while true; do
for instance in $(pct list | awk '\''{if(NR>1) print $1}'\''; qm list | awk '\''{if(NR>1) print $1}'\''); do for instance in $(pct list | awk 'NR>1 {print $1}'; qm list | awk 'NR>1 {print $1}'); do
# Skip excluded instances # Skip excluded instances
if [[ " ${excluded_instances[@]} " =~ " ${instance} " ]]; then if [[ " ${excluded_instances[@]} " =~ " ${instance} " ]]; then
echo "Skipping $instance because it is excluded" echo "Skipping $instance because it is excluded"
continue continue
fi fi
# Determine the type of the instance (container or virtual machine) # Determine type and set config command
if pct status $instance >/dev/null 2>&1; then if pct status $instance >/dev/null 2>&1; then
# It is a container type="ct"
config_cmd="pct config" config_cmd="pct config"
IP=$(pct exec $instance ip a s dev eth0 | awk '\''/inet / {print $2}'\'' | cut -d/ -f1)
else else
# It is a virtual machine type="vm"
config_cmd="qm config" config_cmd="qm config"
IP=$(qm guest cmd $instance network-get-interfaces | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -E "192\.|10\." | head -n 1)
fi fi
# Skip instances based on onboot and templates # Skip templates and onboot-disabled
onboot=$($config_cmd $instance | grep -q "onboot: 0" || ( ! $config_cmd $instance | grep -q "onboot" ) && echo "true" || echo "false") onboot=$($config_cmd $instance | grep -q "onboot: 0" || ( ! $config_cmd $instance | grep -q "onboot" ) && echo "true" || echo "false")
template=$($config_cmd $instance | grep template | grep -q "template:" && echo "true" || echo "false") template=$($config_cmd $instance | grep -q "^template:" && echo "true" || echo "false")
if [ "$onboot" == "true" ]; then if [ "$onboot" == "true" ]; then
echo "Skipping $instance because it is set not to boot" echo "Skipping $instance because it is set not to boot"
@@ -62,36 +71,49 @@ while true; do
continue continue
fi fi
# Ping the instance # Check for mon-restart tag
if ! ping -c 1 $IP >/dev/null 2>&1; then has_tag=$($config_cmd $instance | grep -q "tags:.*mon-restart" && echo "true" || echo "false")
# If the instance can not be pinged, stop and start it if [ "$has_tag" != "true" ]; then
if pct status $instance >/dev/null 2>&1; then echo "Skipping $instance because it does not have 'mon-restart' tag"
# It is a container continue
fi
# Responsiveness check and restart if needed
if [ "$type" == "vm" ]; then
# Check if guest agent responds
if qm guest cmd $instance ping >/dev/null 2>&1; then
echo "VM $instance is responsive via guest agent"
else
echo "$(date): VM $instance is not responding to agent ping, restarting..."
if qm status $instance | grep -q "status: running"; then
qm stop $instance >/dev/null 2>&1
sleep 5
fi
qm start $instance >/dev/null 2>&1
fi
else
# Container: get IP and ping
IP=$(pct exec $instance ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
if ! ping -c 1 $IP >/dev/null 2>&1; then
echo "$(date): CT $instance is not responding, restarting..." echo "$(date): CT $instance is not responding, restarting..."
pct stop $instance >/dev/null 2>&1 pct stop $instance >/dev/null 2>&1
sleep 5 sleep 5
pct start $instance >/dev/null 2>&1 pct start $instance >/dev/null 2>&1
else else
# It is a virtual machine echo "CT $instance is responsive"
if qm status $instance | grep -q "status: running"; then
echo "$(date): VM $instance is not responding, restarting..."
qm stop $instance >/dev/null 2>&1
sleep 5
else
echo "$(date): VM $instance is not running, starting..."
fi
qm start $instance >/dev/null 2>&1
fi fi
fi fi
done done
# Wait for 5 minutes. (Edit to your needs)
echo "$(date): Pausing for 5 minutes..." echo "$(date): Pausing for 5 minutes..."
sleep 300 sleep 300
done >/var/log/ping-instances.log 2>&1' >/usr/local/bin/ping-instances.sh
done >/var/log/ping-instances.log 2>&1
EOF
touch /var/log/ping-instances.log touch /var/log/ping-instances.log
# Change file permissions to executable
chmod +x /usr/local/bin/ping-instances.sh chmod +x /usr/local/bin/ping-instances.sh
cat <<EOF >/etc/systemd/system/ping-instances.timer cat <<EOF >/etc/systemd/system/ping-instances.timer
[Unit] [Unit]
Description=Delay ping-instances.service by 5 minutes Description=Delay ping-instances.service by 5 minutes
@@ -104,17 +126,17 @@ OnUnitActiveSec=300
WantedBy=timers.target WantedBy=timers.target
EOF EOF
# Create ping-instances.service
cat <<EOF >/etc/systemd/system/ping-instances.service cat <<EOF >/etc/systemd/system/ping-instances.service
[Unit] [Unit]
Description=Ping instances every 5 minutes and restarts if necessary Description=Ping instances every 5 minutes and restart if necessary
After=ping-instances.timer After=ping-instances.timer
Requires=ping-instances.timer Requires=ping-instances.timer
[Service] [Service]
Type=simple Type=simple
# To specify which CT/VM should be excluded, add the CT/VM ID at the end of the line where ExecStart=/usr/local/bin/ping-instances.sh is specified. # To exclude specific instances, pass IDs to ExecStart, e.g.:
# For example: ExecStart=/usr/local/bin/ping-instances.sh 100 102 # ExecStart=/usr/local/bin/ping-instances.sh 100 200
# Virtual machines without the QEMU guest agent installed must be excluded. # Instances must also have the 'mon-restart' tag to be monitored
ExecStart=/usr/local/bin/ping-instances.sh ExecStart=/usr/local/bin/ping-instances.sh
Restart=always Restart=always
@@ -125,39 +147,33 @@ StandardError=file:/var/log/ping-instances.log
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
# Reload daemon, enable and start ping-instances.service
systemctl daemon-reload systemctl daemon-reload
systemctl enable -q --now ping-instances.timer systemctl enable -q --now ping-instances.timer
systemctl enable -q --now ping-instances.service systemctl enable -q --now ping-instances.service
clear clear
echo -e "\n To view Monitor All logs: cat /var/log/ping-instances.log" echo -e "\n Monitor All installed."
echo "📄 To view logs: cat /var/log/ping-instances.log"
echo "⚙️ Make sure your VMs or containers have the 'mon-restart' tag to be monitored."
} }
remove() { remove() {
systemctl disable -q --now ping-instances.timer systemctl disable -q --now ping-instances.timer
systemctl disable -q --now ping-instances.service systemctl disable -q --now ping-instances.service
rm /etc/systemd/system/ping-instances.service /etc/systemd/system/ping-instances.timer /usr/local/bin/ping-instances.sh /var/log/ping-instances.log rm -f /etc/systemd/system/ping-instances.service
echo "Removed Monitor All from Proxmox VE" rm -f /etc/systemd/system/ping-instances.timer
rm -f /usr/local/bin/ping-instances.sh
rm -f /var/log/ping-instances.log
echo "Monitor All removed from Proxmox VE"
} }
# Define options for the whiptail menu
OPTIONS=(Add "Add Monitor-All to Proxmox VE" OPTIONS=(Add "Add Monitor-All to Proxmox VE"
Remove "Remove Monitor-All from Proxmox VE") Remove "Remove Monitor-All from Proxmox VE")
# Show the whiptail menu and save the user's choice
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Monitor-All for Proxmox VE" --menu "Select an option:" 10 58 2 \ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Monitor-All for Proxmox VE" --menu "Select an option:" 10 58 2 \
"${OPTIONS[@]}" 3>&1 1>&2 2>&3) "${OPTIONS[@]}" 3>&1 1>&2 2>&3)
# Check the user's choice and perform the corresponding action
case $CHOICE in case $CHOICE in
"Add") "Add") add ;;
add "Remove") remove ;;
;; *) echo "Exiting..."; exit 0 ;;
"Remove")
remove
;;
*)
echo "Exiting..."
exit 0
;;
esac esac

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" ;;