diff --git a/.github/changelogs/2026/04.md b/.github/changelogs/2026/04.md
index 1a83055f0..b51afd73a 100644
--- a/.github/changelogs/2026/04.md
+++ b/.github/changelogs/2026/04.md
@@ -1,3 +1,143 @@
+## 2026-04-25
+
+### π Updated Scripts
+
+ - #### π Bug Fixes
+
+ - VictoriaMetrics: Stop vmagent/vmalert before update [@irishpadres](https://github.com/irishpadres) ([#14016](https://github.com/community-scripts/ProxmoxVE/pull/14016))
+ - Domain-Monitor: start apache2 after stop instead of reload [@omertahaoztop](https://github.com/omertahaoztop) ([#14019](https://github.com/community-scripts/ProxmoxVE/pull/14019))
+ - Transmute: Fix ffmpeg detection [@tremor021](https://github.com/tremor021) ([#14008](https://github.com/community-scripts/ProxmoxVE/pull/14008))
+
+ - #### π§ Refactor
+
+ - Refactor: Technitium DNS [@tremor021](https://github.com/tremor021) ([#14013](https://github.com/community-scripts/ProxmoxVE/pull/14013))
+
+## 2026-04-24
+
+### π New Scripts
+
+ - Apprise-API ([#13934](https://github.com/community-scripts/ProxmoxVE/pull/13934))
+- fireshare ([#13995](https://github.com/community-scripts/ProxmoxVE/pull/13995))
+- Transmute ([#13935](https://github.com/community-scripts/ProxmoxVE/pull/13935))
+- Jitsi-Meet ([#13897](https://github.com/community-scripts/ProxmoxVE/pull/13897))
+
+### π Updated Scripts
+
+ - Update wger.sh [@Soppster1029](https://github.com/Soppster1029) ([#13977](https://github.com/community-scripts/ProxmoxVE/pull/13977))
+
+ - #### π§ Refactor
+
+ - Refactor: Ghostfolio [@MickLesk](https://github.com/MickLesk) ([#13990](https://github.com/community-scripts/ProxmoxVE/pull/13990))
+
+## 2026-04-23
+
+### π Updated Scripts
+
+ - #### π Bug Fixes
+
+ - mealie: start.sh missing after failed update [@MickLesk](https://github.com/MickLesk) ([#13958](https://github.com/community-scripts/ProxmoxVE/pull/13958))
+ - twingate-connector: perform real apt upgrade during update flow [@MickLesk](https://github.com/MickLesk) ([#13959](https://github.com/community-scripts/ProxmoxVE/pull/13959))
+
+ - #### β¨ New Features
+
+ - core: auto-size NODE_OPTIONS heap [@MickLesk](https://github.com/MickLesk) ([#13960](https://github.com/community-scripts/ProxmoxVE/pull/13960))
+
+ - #### π§ Refactor
+
+ - Update scripts to match standard [@tremor021](https://github.com/tremor021) ([#13956](https://github.com/community-scripts/ProxmoxVE/pull/13956))
+
+### πΎ Core
+
+ - #### π Bug Fixes
+
+ - tools.func: upgrade Node.js minor/patch on same major version [@MickLesk](https://github.com/MickLesk) ([#13957](https://github.com/community-scripts/ProxmoxVE/pull/13957))
+ - core: hotfix - prefer silent mode on PHS env conflict [@MickLesk](https://github.com/MickLesk) ([#13951](https://github.com/community-scripts/ProxmoxVE/pull/13951))
+
+ - #### π§ Refactor
+
+ - core: improve system update information / lxc stack upgrade [@MickLesk](https://github.com/MickLesk) ([#13970](https://github.com/community-scripts/ProxmoxVE/pull/13970))
+
+## 2026-04-22
+
+### π New Scripts
+
+ - Dashy ([#13817](https://github.com/community-scripts/ProxmoxVE/pull/13817))
+- Mini-QR ([#13902](https://github.com/community-scripts/ProxmoxVE/pull/13902))
+- ownfoil ([#13904](https://github.com/community-scripts/ProxmoxVE/pull/13904))
+- ERPNext ([#13921](https://github.com/community-scripts/ProxmoxVE/pull/13921))
+
+### π Updated Scripts
+
+ - #### π Bug Fixes
+
+ - add --clear to uv venv in update_script() to prevent interactive prompt [@MickLesk](https://github.com/MickLesk) ([#13926](https://github.com/community-scripts/ProxmoxVE/pull/13926))
+
+### πΎ Core
+
+ - #### β¨ New Features
+
+ - core: Add PHS_VERBOSE env var to skip verbose mode prompts [@gormanity](https://github.com/gormanity) ([#13797](https://github.com/community-scripts/ProxmoxVE/pull/13797))
+
+## 2026-04-21
+
+### π New Scripts
+
+ - gogs ([#13896](https://github.com/community-scripts/ProxmoxVE/pull/13896))
+- anchor ([#13895](https://github.com/community-scripts/ProxmoxVE/pull/13895))
+- minthcm ([#13903](https://github.com/community-scripts/ProxmoxVE/pull/13903))
+- foldergram ([#13900](https://github.com/community-scripts/ProxmoxVE/pull/13900))
+
+### π Updated Scripts
+
+ - OpenCloud: Pin version to 6.1.0 [@vhsdream](https://github.com/vhsdream) ([#13890](https://github.com/community-scripts/ProxmoxVE/pull/13890))
+
+ - #### π Bug Fixes
+
+ - Domain-Locker: Update dependencies [@tremor021](https://github.com/tremor021) ([#13901](https://github.com/community-scripts/ProxmoxVE/pull/13901))
+ - homelable: fix install failure by correcting password-reset chmod target [@Copilot](https://github.com/Copilot) ([#13894](https://github.com/community-scripts/ProxmoxVE/pull/13894))
+
+ - #### β¨ New Features
+
+ - FileFlows: Update dependencies [@tremor021](https://github.com/tremor021) ([#13917](https://github.com/community-scripts/ProxmoxVE/pull/13917))
+
+## 2026-04-20
+
+### π New Scripts
+
+ - WhoDB ([#13880](https://github.com/community-scripts/ProxmoxVE/pull/13880))
+
+### π Updated Scripts
+
+ - pangolin: create migration tables before data transfer to prevent role loss [@MickLesk](https://github.com/MickLesk) ([#13874](https://github.com/community-scripts/ProxmoxVE/pull/13874))
+
+ - #### π Bug Fixes
+
+ - Pangolin: pre-apply schema migrations to prevent data loss [@MickLesk](https://github.com/MickLesk) ([#13861](https://github.com/community-scripts/ProxmoxVE/pull/13861))
+ - ActualBudget: change migration messages to warnings [@MickLesk](https://github.com/MickLesk) ([#13860](https://github.com/community-scripts/ProxmoxVE/pull/13860))
+ - slskd: migrate config keys for 0.25.0 breaking change [@MickLesk](https://github.com/MickLesk) ([#13862](https://github.com/community-scripts/ProxmoxVE/pull/13862))
+
+ - #### β¨ New Features
+
+ - Wanderer: add pocketbase CLI wrapper with env [@MickLesk](https://github.com/MickLesk) ([#13863](https://github.com/community-scripts/ProxmoxVE/pull/13863))
+ - feat(homelable): add password reset utility script [@davidsoncabista](https://github.com/davidsoncabista) ([#13798](https://github.com/community-scripts/ProxmoxVE/pull/13798))
+
+ - #### π§ Refactor
+
+ - Several Scripts: Bump NodeJS to align Node.js versions with upstream for 5 scripts [@MickLesk](https://github.com/MickLesk) ([#13875](https://github.com/community-scripts/ProxmoxVE/pull/13875))
+ - Refactor: PMG Post Install [@MickLesk](https://github.com/MickLesk) ([#13693](https://github.com/community-scripts/ProxmoxVE/pull/13693))
+
+### πΎ Core
+
+ - #### π Bug Fixes
+
+ - core: detect Perl breakage after LXC stack upgrade and improve storage validation [@MickLesk](https://github.com/MickLesk) ([#13879](https://github.com/community-scripts/ProxmoxVE/pull/13879))
+
+## 2026-04-19
+
+### π New Scripts
+
+ - nametag ([#13849](https://github.com/community-scripts/ProxmoxVE/pull/13849))
+
## 2026-04-18
### π New Scripts
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2563d6531..d9bef7e12 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -41,6 +41,9 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+
+
+
@@ -54,7 +57,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
-April (18 entries)
+April (25 entries)
[View April 2026 Changelog](.github/changelogs/2026/04.md)
@@ -445,6 +448,160 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+## 2026-04-27
+
+### π Updated Scripts
+
+ - Add pamUsername column to userOrgs table [@JVKeller](https://github.com/JVKeller) ([#14075](https://github.com/community-scripts/ProxmoxVE/pull/14075))
+
+ - #### π Bug Fixes
+
+ - Dawarich: run db:migrate before assets:precompile [@MickLesk](https://github.com/MickLesk) ([#14051](https://github.com/community-scripts/ProxmoxVE/pull/14051))
+ - TechnitiumDNS: always install .NET 10 if not already present [@MickLesk](https://github.com/MickLesk) ([#14049](https://github.com/community-scripts/ProxmoxVE/pull/14049))
+
+ - #### π₯ Breaking Changes
+
+ - PatchMon: v2.0.0 migration [@vhsdream](https://github.com/vhsdream) ([#14015](https://github.com/community-scripts/ProxmoxVE/pull/14015))
+
+### πΎ Core
+
+ - #### π§ Refactor
+
+ - Update build.func - fixed spelling mistake [@m1ckywill](https://github.com/m1ckywill) ([#14047](https://github.com/community-scripts/ProxmoxVE/pull/14047))
+
+### π§° Tools
+
+ - #### π Bug Fixes
+
+ - update-lxcs/apps: avoid pct exec on containers mid-shutdown [@MickLesk](https://github.com/MickLesk) ([#14050](https://github.com/community-scripts/ProxmoxVE/pull/14050))
+
+ - #### β¨ New Features
+
+ - Add patchmon-agent report execution in update script [@heinemannj](https://github.com/heinemannj) ([#14054](https://github.com/community-scripts/ProxmoxVE/pull/14054))
+
+## 2026-04-26
+
+### π New Scripts
+
+ - TREK ([#14017](https://github.com/community-scripts/ProxmoxVE/pull/14017))
+
+### π Updated Scripts
+
+ - fix(2fauth): handle stale backup directory on update [@omertahaoztop](https://github.com/omertahaoztop) ([#14018](https://github.com/community-scripts/ProxmoxVE/pull/14018))
+
+ - #### π Bug Fixes
+
+ - Increase Frigate default CPU cores from 4 to 8 [@MickLesk](https://github.com/MickLesk) ([#14039](https://github.com/community-scripts/ProxmoxVE/pull/14039))
+ - Technitium DNS: Ensure directories exist before running service [@tremor021](https://github.com/tremor021) ([#14030](https://github.com/community-scripts/ProxmoxVE/pull/14030))
+
+### πΎ Core
+
+ - #### π Bug Fixes
+
+ - core: Correct deb822 repository flat path detection [@MickLesk](https://github.com/MickLesk) ([#14037](https://github.com/community-scripts/ProxmoxVE/pull/14037))
+
+## 2026-04-25
+
+### π Updated Scripts
+
+ - #### π Bug Fixes
+
+ - VictoriaMetrics: Stop vmagent/vmalert before update [@irishpadres](https://github.com/irishpadres) ([#14016](https://github.com/community-scripts/ProxmoxVE/pull/14016))
+ - Domain-Monitor: start apache2 after stop instead of reload [@omertahaoztop](https://github.com/omertahaoztop) ([#14019](https://github.com/community-scripts/ProxmoxVE/pull/14019))
+ - Transmute: Fix ffmpeg detection [@tremor021](https://github.com/tremor021) ([#14008](https://github.com/community-scripts/ProxmoxVE/pull/14008))
+
+ - #### π§ Refactor
+
+ - Refactor: Technitium DNS [@tremor021](https://github.com/tremor021) ([#14013](https://github.com/community-scripts/ProxmoxVE/pull/14013))
+
+## 2026-04-24
+
+### π New Scripts
+
+ - Apprise-API ([#13934](https://github.com/community-scripts/ProxmoxVE/pull/13934))
+- fireshare ([#13995](https://github.com/community-scripts/ProxmoxVE/pull/13995))
+- Transmute ([#13935](https://github.com/community-scripts/ProxmoxVE/pull/13935))
+- Jitsi-Meet ([#13897](https://github.com/community-scripts/ProxmoxVE/pull/13897))
+
+### π Updated Scripts
+
+ - Update wger.sh [@Soppster1029](https://github.com/Soppster1029) ([#13977](https://github.com/community-scripts/ProxmoxVE/pull/13977))
+
+ - #### π§ Refactor
+
+ - Refactor: Ghostfolio [@MickLesk](https://github.com/MickLesk) ([#13990](https://github.com/community-scripts/ProxmoxVE/pull/13990))
+
+## 2026-04-23
+
+### π Updated Scripts
+
+ - #### π Bug Fixes
+
+ - mealie: start.sh missing after failed update [@MickLesk](https://github.com/MickLesk) ([#13958](https://github.com/community-scripts/ProxmoxVE/pull/13958))
+ - twingate-connector: perform real apt upgrade during update flow [@MickLesk](https://github.com/MickLesk) ([#13959](https://github.com/community-scripts/ProxmoxVE/pull/13959))
+
+ - #### β¨ New Features
+
+ - core: auto-size NODE_OPTIONS heap [@MickLesk](https://github.com/MickLesk) ([#13960](https://github.com/community-scripts/ProxmoxVE/pull/13960))
+
+ - #### π§ Refactor
+
+ - Update scripts to match standard [@tremor021](https://github.com/tremor021) ([#13956](https://github.com/community-scripts/ProxmoxVE/pull/13956))
+
+### πΎ Core
+
+ - #### π Bug Fixes
+
+ - tools.func: upgrade Node.js minor/patch on same major version [@MickLesk](https://github.com/MickLesk) ([#13957](https://github.com/community-scripts/ProxmoxVE/pull/13957))
+ - core: hotfix - prefer silent mode on PHS env conflict [@MickLesk](https://github.com/MickLesk) ([#13951](https://github.com/community-scripts/ProxmoxVE/pull/13951))
+
+ - #### π§ Refactor
+
+ - core: improve system update information / lxc stack upgrade [@MickLesk](https://github.com/MickLesk) ([#13970](https://github.com/community-scripts/ProxmoxVE/pull/13970))
+
+## 2026-04-22
+
+### π New Scripts
+
+ - Dashy ([#13817](https://github.com/community-scripts/ProxmoxVE/pull/13817))
+- Mini-QR ([#13902](https://github.com/community-scripts/ProxmoxVE/pull/13902))
+- ownfoil ([#13904](https://github.com/community-scripts/ProxmoxVE/pull/13904))
+- ERPNext ([#13921](https://github.com/community-scripts/ProxmoxVE/pull/13921))
+
+### π Updated Scripts
+
+ - #### π Bug Fixes
+
+ - add --clear to uv venv in update_script() to prevent interactive prompt [@MickLesk](https://github.com/MickLesk) ([#13926](https://github.com/community-scripts/ProxmoxVE/pull/13926))
+
+### πΎ Core
+
+ - #### β¨ New Features
+
+ - core: Add PHS_VERBOSE env var to skip verbose mode prompts [@gormanity](https://github.com/gormanity) ([#13797](https://github.com/community-scripts/ProxmoxVE/pull/13797))
+
+## 2026-04-21
+
+### π New Scripts
+
+ - gogs ([#13896](https://github.com/community-scripts/ProxmoxVE/pull/13896))
+- anchor ([#13895](https://github.com/community-scripts/ProxmoxVE/pull/13895))
+- minthcm ([#13903](https://github.com/community-scripts/ProxmoxVE/pull/13903))
+- foldergram ([#13900](https://github.com/community-scripts/ProxmoxVE/pull/13900))
+
+### π Updated Scripts
+
+ - OpenCloud: Pin version to 6.1.0 [@vhsdream](https://github.com/vhsdream) ([#13890](https://github.com/community-scripts/ProxmoxVE/pull/13890))
+
+ - #### π Bug Fixes
+
+ - Domain-Locker: Update dependencies [@tremor021](https://github.com/tremor021) ([#13901](https://github.com/community-scripts/ProxmoxVE/pull/13901))
+ - homelable: fix install failure by correcting password-reset chmod target [@Copilot](https://github.com/Copilot) ([#13894](https://github.com/community-scripts/ProxmoxVE/pull/13894))
+
+ - #### β¨ New Features
+
+ - FileFlows: Update dependencies [@tremor021](https://github.com/tremor021) ([#13917](https://github.com/community-scripts/ProxmoxVE/pull/13917))
+
## 2026-04-20
### π New Scripts
@@ -905,158 +1062,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### β¨ New Features
- - Refactor/Feature-Bump/Security: Update-Cron-LXCs (Now Local Mode!) [@MickLesk](https://github.com/MickLesk) ([#13339](https://github.com/community-scripts/ProxmoxVE/pull/13339))
-
-## 2026-03-26
-
-### π New Scripts
-
- - BirdNET ([#13313](https://github.com/community-scripts/ProxmoxVE/pull/13313))
-
-### π Updated Scripts
-
- - #### π Bug Fixes
-
- - Immich: Bump to 2.6.2 | use start.sh in service, ensure DB_HOSTNAME in .env | Fix Rights Issue with ZFS Shares [@MickLesk](https://github.com/MickLesk) ([#13199](https://github.com/community-scripts/ProxmoxVE/pull/13199))
-
- - #### β¨ New Features
-
- - SparkyFitness: add garmin microservice as addon [@tomfrenzel](https://github.com/tomfrenzel) ([#12642](https://github.com/community-scripts/ProxmoxVE/pull/12642))
- - Frigate: bump to v0.17.1 & change build order [@MickLesk](https://github.com/MickLesk) ([#13304](https://github.com/community-scripts/ProxmoxVE/pull/13304))
-
-### πΎ Core
-
- - #### π Bug Fixes
-
- - tools.func: pin npm to 11.11.0 to work around Node.js 22.22.2 regression [@MickLesk](https://github.com/MickLesk) ([#13296](https://github.com/community-scripts/ProxmoxVE/pull/13296))
-
- - #### β¨ New Features
-
- - core: APT/APK Mirror Fallback for CDN Failures [@MickLesk](https://github.com/MickLesk) ([#13316](https://github.com/community-scripts/ProxmoxVE/pull/13316))
- - core/tools: replace generic return 1 exit_codes with more specific exit_codes [@MickLesk](https://github.com/MickLesk) ([#13311](https://github.com/community-scripts/ProxmoxVE/pull/13311))
-
- - #### π§ Refactor
-
- - core: use /usr/bin/install to prevent function shadowing [@MickLesk](https://github.com/MickLesk) ([#13299](https://github.com/community-scripts/ProxmoxVE/pull/13299))
-
-### π§° Tools
-
- - #### π Bug Fixes
-
- - SparkyFitness-Garmin: fix app name [@tomfrenzel](https://github.com/tomfrenzel) ([#13325](https://github.com/community-scripts/ProxmoxVE/pull/13325))
-
-## 2026-03-25
-
-### π Updated Scripts
-
- - #### β¨ New Features
-
- - Komodo v2: migrate env vars to v2 and update source [@MickLesk](https://github.com/MickLesk) ([#13262](https://github.com/community-scripts/ProxmoxVE/pull/13262))
-
-### πΎ Core
-
- - #### π§ Refactor
-
- - core: make shell command substitutions safe with || true [@MickLesk](https://github.com/MickLesk) ([#13279](https://github.com/community-scripts/ProxmoxVE/pull/13279))
-
-## 2026-03-24
-
-### π New Scripts
-
- - Homebrew (Addon) ([#13249](https://github.com/community-scripts/ProxmoxVE/pull/13249))
-- NextExplorer ([#13252](https://github.com/community-scripts/ProxmoxVE/pull/13252))
-
-### π Updated Scripts
-
- - #### β¨ New Features
-
- - Turnkey: modernize turnkey.sh with shared libraries [@MickLesk](https://github.com/MickLesk) ([#13242](https://github.com/community-scripts/ProxmoxVE/pull/13242))
-
- - #### π§ Refactor
-
- - chore: replace helper-scripts.com with community-scripts.com [@MickLesk](https://github.com/MickLesk) ([#13244](https://github.com/community-scripts/ProxmoxVE/pull/13244))
-
-### ποΈ Deleted Scripts
-
- - Remove: Booklore [@MickLesk](https://github.com/MickLesk) ([#13265](https://github.com/community-scripts/ProxmoxVE/pull/13265))
-
-## 2026-03-23
-
-### π Updated Scripts
-
- - #### π§ Refactor
-
- - core: harden shell scripts against injection and insecure permissions [@MickLesk](https://github.com/MickLesk) ([#13239](https://github.com/community-scripts/ProxmoxVE/pull/13239))
-
-## 2026-03-22
-
-### π New Scripts
-
- - versitygw ([#13180](https://github.com/community-scripts/ProxmoxVE/pull/13180))
-
-### π Updated Scripts
-
- - #### π Bug Fixes
-
- - Adventurelog: pin DRF <3.15 to fix coreapi module removal [@MickLesk](https://github.com/MickLesk) ([#13194](https://github.com/community-scripts/ProxmoxVE/pull/13194))
-
- - #### β¨ New Features
-
- - ConvertX: add libreoffice-writer for ODT/document conversions [@MickLesk](https://github.com/MickLesk) ([#13196](https://github.com/community-scripts/ProxmoxVE/pull/13196))
-
- - #### π§ Refactor
-
- - iSponsorblockTV: add AVX CPU check before installation [@MickLesk](https://github.com/MickLesk) ([#13197](https://github.com/community-scripts/ProxmoxVE/pull/13197))
-
-### πΎ Core
-
- - #### π Bug Fixes
-
- - core: guard against empty IPv6 address in static mode [@MickLesk](https://github.com/MickLesk) ([#13195](https://github.com/community-scripts/ProxmoxVE/pull/13195))
-
-## 2026-03-21
-
-### π Updated Scripts
-
- - #### π Bug Fixes
-
- - Anytype-server: wait for MongoDB readiness before rs.initiate() [@MickLesk](https://github.com/MickLesk) ([#13165](https://github.com/community-scripts/ProxmoxVE/pull/13165))
- - Frigate: use correct CPU model fallback path [@MickLesk](https://github.com/MickLesk) ([#13164](https://github.com/community-scripts/ProxmoxVE/pull/13164))
- - iSponsorBlockTV: Fix release fetching [@tremor021](https://github.com/tremor021) ([#13157](https://github.com/community-scripts/ProxmoxVE/pull/13157))
- - Isponsorblocktv: use quoted heredoc to prevent unbound variable error during CLI wrapper creation [@Copilot](https://github.com/Copilot) ([#13146](https://github.com/community-scripts/ProxmoxVE/pull/13146))
-
- - #### β¨ New Features
-
- - Headscale: Enable TUN [@tremor021](https://github.com/tremor021) ([#13158](https://github.com/community-scripts/ProxmoxVE/pull/13158))
-
-### πΎ Core
-
- - #### π Bug Fixes
-
- - core: add missing -searchdomain/-nameserver prefix in base_settings [@MickLesk](https://github.com/MickLesk) ([#13166](https://github.com/community-scripts/ProxmoxVE/pull/13166))
-
-## 2026-03-20
-
-### π New Scripts
-
- - iSponsorBlockTV ([#13123](https://github.com/community-scripts/ProxmoxVE/pull/13123))
-- Alpine-Wakapi ([#13119](https://github.com/community-scripts/ProxmoxVE/pull/13119))
-- teleport ([#13086](https://github.com/community-scripts/ProxmoxVE/pull/13086))
-
-### π Updated Scripts
-
- - #### π Bug Fixes
-
- - Reactive-Resume: add git dependency for v5.0.13+ [@MickLesk](https://github.com/MickLesk) ([#13133](https://github.com/community-scripts/ProxmoxVE/pull/13133))
- - Scanopy: increase default CPU, RAM, and HDD to prevent OOM during Rust build [@Copilot](https://github.com/Copilot) ([#13130](https://github.com/community-scripts/ProxmoxVE/pull/13130))
-
- - #### β¨ New Features
-
- - Immich: v2.6.1 [@vhsdream](https://github.com/vhsdream) ([#13111](https://github.com/community-scripts/ProxmoxVE/pull/13111))
- - VM's: add input validation and hostname sanitization to all VM scripts [@MickLesk](https://github.com/MickLesk) ([#12973](https://github.com/community-scripts/ProxmoxVE/pull/12973))
-
-### π§° Tools
-
- - #### π§ Refactor
-
- - Harden code-server addon install script [@MickLesk](https://github.com/MickLesk) ([#13116](https://github.com/community-scripts/ProxmoxVE/pull/13116))
\ No newline at end of file
+ - Refactor/Feature-Bump/Security: Update-Cron-LXCs (Now Local Mode!) [@MickLesk](https://github.com/MickLesk) ([#13339](https://github.com/community-scripts/ProxmoxVE/pull/13339))
\ No newline at end of file
diff --git a/ct/2fauth.sh b/ct/2fauth.sh
index deee15371..2d984da37 100644
--- a/ct/2fauth.sh
+++ b/ct/2fauth.sh
@@ -24,7 +24,7 @@ function update_script() {
check_container_storage
check_container_resources
- if [[ ! -d "/opt/2fauth" ]]; then
+ if [[ ! -d /opt/2fauth ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
@@ -34,7 +34,8 @@ function update_script() {
$STD apt -y upgrade
msg_info "Creating Backup"
- mv "/opt/2fauth" "/opt/2fauth-backup"
+ rm -rf /opt/2fauth-backup
+ mv /opt/2fauth /opt/2fauth-backup
if ! dpkg -l | grep -q 'php8.4'; then
cp /etc/nginx/conf.d/2fauth.conf /etc/nginx/conf.d/2fauth.conf.bak
fi
@@ -46,15 +47,17 @@ function update_script() {
fi
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth" "tarball"
setup_composer
- mv "/opt/2fauth-backup/.env" "/opt/2fauth/.env"
- mv "/opt/2fauth-backup/storage" "/opt/2fauth/storage"
- cd "/opt/2fauth" || return
- chown -R www-data: "/opt/2fauth"
- chmod -R 755 "/opt/2fauth"
+ cp /opt/2fauth-backup/.env /opt/2fauth/.env
+ cp -r /opt/2fauth-backup/storage /opt/2fauth/storage
+ cd /opt/2fauth || return
export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev --prefer-dist
php artisan 2fauth:install
+ chown -R www-data: /opt/2fauth
+ chmod -R 755 /opt/2fauth
+ $STD systemctl restart php8.4-fpm
$STD systemctl restart nginx
+ rm -rf /opt/2fauth-backup
msg_ok "Updated successfully!"
fi
exit
diff --git a/ct/anchor.sh b/ct/anchor.sh
new file mode 100644
index 000000000..6d8ea36cb
--- /dev/null
+++ b/ct/anchor.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/ZhFahim/anchor
+
+APP="Anchor"
+var_tags="${var_tags:-notes;productivity;sync}"
+var_cpu="${var_cpu:-2}"
+var_ram="${var_ram:-2048}"
+var_disk="${var_disk:-10}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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 ~/.anchor ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "anchor" "ZhFahim/anchor"; then
+ msg_info "Stopping Services"
+ systemctl stop anchor-web anchor-server
+ msg_ok "Stopped Services"
+
+ msg_info "Backing up Configuration"
+ cp /opt/anchor/.env /opt/anchor.env.bak
+ msg_ok "Backed up Configuration"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "anchor" "ZhFahim/anchor" "tarball"
+
+ msg_info "Building Server"
+ cd /opt/anchor/server
+ $STD pnpm install --frozen-lockfile
+ $STD pnpm prisma generate
+ $STD pnpm build
+ [[ -d src/generated ]] && mkdir -p dist/src && cp -R src/generated dist/src/
+ msg_ok "Built Server"
+
+ msg_info "Building Web Interface"
+ cd /opt/anchor/web
+ $STD pnpm install --frozen-lockfile
+ SERVER_URL=http://127.0.0.1:3001 $STD pnpm build
+ cp -r .next/static .next/standalone/.next/static
+ cp -r public .next/standalone/public
+ msg_ok "Built Web Interface"
+
+ cp /opt/anchor.env.bak /opt/anchor/.env
+ rm -f /opt/anchor.env.bak
+
+ msg_info "Running Database Migrations"
+ cd /opt/anchor/server
+ set -a && source /opt/anchor/.env && set +a
+ $STD pnpm prisma migrate deploy
+ msg_ok "Ran Database Migrations"
+
+ msg_info "Starting Services"
+ systemctl start anchor-server anchor-web
+ msg_ok "Started Services"
+ msg_ok "Updated ${APP}"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
diff --git a/ct/apprise-api.sh b/ct/apprise-api.sh
new file mode 100644
index 000000000..f3e6f7f0b
--- /dev/null
+++ b/ct/apprise-api.sh
@@ -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-2026 community-scripts ORG
+# Author: SystemIdleProcess
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/caronc/apprise-api
+
+APP="Apprise-API"
+var_tags="${var_tags:-notification}"
+var_cpu="${var_cpu:-1}"
+var_ram="${var_ram:-512}"
+var_disk="${var_disk:-2}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/apprise" ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ if check_for_gh_release "apprise" "caronc/apprise-api"; then
+ msg_info "Stopping Service"
+ systemctl stop apprise-api
+ msg_ok "Stopped Service"
+
+ PYTHON_VERSION="3.12" setup_uv
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "apprise" "caronc/apprise-api" "tarball"
+
+ msg_info "Updating Apprise-API"
+ cd /opt/apprise
+ cp ./requirements.txt /etc/requirements.txt
+ $STD apt install -y nginx git
+ $STD uv pip install -r requirements.txt gunicorn supervisor --system
+ cp -fr apprise_api/static /usr/share/nginx/html/s/
+ mv apprise_api/ webapp
+ touch /etc/nginx/server-override.conf
+ touch /etc/nginx/location-override.conf
+ mkdir -p /config/store /attach /plugin /tmp/apprise /opt/apprise/logs
+ chmod 1777 /tmp/apprise && chmod 777 /config /config/store /attach /plugin /opt/apprise/logs
+ sed -i \
+ -e '/[[]program:nginx]/,/^[[]/ s|stdout_logfile=/dev/stdout|stdout_logfile=/opt/apprise/logs/nginx.log|' \
+ -e '/[[]program:nginx]/,/^[[]/ s|stderr_logfile=/dev/stderr|stderr_logfile=/opt/apprise/logs/nginx_error.log|' \
+ -e '/[[]program:gunicorn]/,/^[[]/ s|stdout_logfile=/dev/stdout|stdout_logfile=/opt/apprise/logs/gunicorn.log|' \
+ -e '/[[]program:gunicorn]/,/^[[]/ s|stderr_logfile=/dev/stderr|stderr_logfile=/opt/apprise/logs/gunicorn_error.log|' \
+ -e '/[[]supervisord]/,/^[[]/ s|logfile=/dev/null|logfile=/opt/apprise/logs/supervisor.log|' \
+ -e 's|_maxbytes=0|_maxbytes=10485760|g' \
+ /opt/apprise/webapp/etc/supervisord.conf
+ msg_ok "Updated Apprise-API"
+
+ msg_info "Starting Service"
+ systemctl start apprise-api
+ msg_ok "Started Service"
+ msg_ok "Updated successfully!"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8000${CL}"
diff --git a/ct/calibre-web.sh b/ct/calibre-web.sh
index ffea110b5..0d168002a 100644
--- a/ct/calibre-web.sh
+++ b/ct/calibre-web.sh
@@ -44,7 +44,7 @@ function update_script() {
msg_info "Installing Dependencies"
cd /opt/calibre-web
- $STD uv venv
+ $STD uv venv --clear /opt/calibre-web/.venv
$STD uv pip install --python /opt/calibre-web/.venv/bin/python --no-cache-dir --upgrade pip setuptools wheel
$STD uv pip install --python /opt/calibre-web/.venv/bin/python --no-cache-dir -r requirements.txt
msg_ok "Installed Dependencies"
diff --git a/ct/checkmate.sh b/ct/checkmate.sh
index a8c14445b..cd8e23ae0 100644
--- a/ct/checkmate.sh
+++ b/ct/checkmate.sh
@@ -39,7 +39,7 @@ function update_script() {
[ -f /opt/checkmate/client/.env.local ] && cp /opt/checkmate/client/.env.local /opt/checkmate_client.env.local.bak
msg_ok "Backed up Data"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate" "tarball"
msg_info "Updating Checkmate Server"
cd /opt/checkmate/server
diff --git a/ct/dashy.sh b/ct/dashy.sh
new file mode 100644
index 000000000..cd885200f
--- /dev/null
+++ b/ct/dashy.sh
@@ -0,0 +1,73 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: tteck (tteckster) | Co-Author: CrazyWolf13
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://dashy.to/
+
+APP="Dashy"
+var_tags="${var_tags:-dashboard}"
+var_cpu="${var_cpu:-2}"
+var_ram="${var_ram:-2048}"
+var_disk="${var_disk:-6}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/dashy/public/ ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ if check_for_gh_release "dashy" "Lissy93/dashy"; then
+ msg_info "Stopping Service"
+ systemctl stop dashy
+ msg_ok "Stopped Service"
+
+ msg_info "Backing up conf.yml"
+ if [[ -f /opt/dashy/public/conf.yml ]]; then
+ cp -R /opt/dashy/public/conf.yml /opt/dashy_conf_backup.yml
+ else
+ cp -R /opt/dashy/user-data/conf.yml /opt/dashy_conf_backup.yml
+ fi
+ msg_ok "Backed up conf.yml"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dashy" "Lissy93/dashy" "prebuild" "latest" "/opt/dashy" "dashy-*.tar.gz"
+
+ msg_info "Updating Dashy"
+ cd /opt/dashy
+ $STD yarn install --ignore-engines --network-timeout 300000
+ msg_ok "Updated Dashy"
+
+ msg_info "Restoring conf.yml"
+ cp -R /opt/dashy_conf_backup.yml /opt/dashy/user-data
+ msg_ok "Restored conf.yml"
+
+ msg_info "Cleaning"
+ rm -rf /opt/dashy_conf_backup.yml /opt/dashy/public/conf.yml
+ msg_ok "Cleaned"
+
+ msg_info "Starting Dashy"
+ systemctl start dashy
+ msg_ok "Started Dashy"
+ msg_ok "Updated successfully!"
+ 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}:4000${CL}"
diff --git a/ct/dawarich.sh b/ct/dawarich.sh
index d2d260998..3d1ca7e02 100644
--- a/ct/dawarich.sh
+++ b/ct/dawarich.sh
@@ -53,6 +53,10 @@ function update_script() {
export PATH="/root/.rbenv/shims:/root/.rbenv/bin:$PATH"
eval "$(/root/.rbenv/bin/rbenv init - bash)"
+ if ! grep -q "OTP_ENCRYPTION_PRIMARY_KEY" /opt/dawarich/.env; then
+ echo "OTP_ENCRYPTION_PRIMARY_KEY=$(openssl rand -hex 32)" >>/opt/dawarich/.env
+ fi
+
set -a && source /opt/dawarich/.env && set +a
$STD bundle config set --local deployment 'true'
@@ -67,8 +71,8 @@ function update_script() {
$STD npm install
fi
- $STD bundle exec rake assets:precompile
$STD bundle exec rails db:migrate
+ $STD bundle exec rake assets:precompile
$STD bundle exec rake data:migrate
msg_ok "Ran Migrations"
diff --git a/ct/domain-locker.sh b/ct/domain-locker.sh
index 6eb67c5e6..8f08a02fa 100644
--- a/ct/domain-locker.sh
+++ b/ct/domain-locker.sh
@@ -20,41 +20,43 @@ color
catch_errors
function update_script() {
- header_info
- check_container_storage
- check_container_resources
- if [[ ! -d /opt/domain-locker ]]; then
- msg_error "No ${APP} Installation Found!"
- exit
- fi
-
- if check_for_gh_release "domain-locker" "Lissy93/domain-locker"; then
- msg_info "Stopping Service"
- systemctl stop domain-locker
- msg_info "Service stopped"
-
- PG_VERSION="17" setup_postgresql
- NODE_VERSION="22" setup_nodejs
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "domain-locker" "Lissy93/domain-locker" "tarball"
-
- msg_info "Installing Modules (patience)"
- cd /opt/domain-locker
- $STD npm install
- msg_ok "Installed Modules"
-
- msg_info "Building Domain-Locker (a lot of patience)"
- set -a
- source /opt/domain-locker.env
- set +a
- $STD npm run build
- msg_info "Built Domain-Locker"
-
- msg_info "Restarting Services"
- systemctl start domain-locker
- msg_ok "Restarted Services"
- msg_ok "Updated successfully!"
- fi
+ header_info
+ check_container_storage
+ check_container_resources
+ if [[ ! -d /opt/domain-locker ]]; then
+ msg_error "No ${APP} Installation Found!"
exit
+ fi
+
+ ensure_dependencies whois
+
+ if check_for_gh_release "domain-locker" "Lissy93/domain-locker"; then
+ msg_info "Stopping Service"
+ systemctl stop domain-locker
+ msg_info "Service stopped"
+
+ PG_VERSION="17" setup_postgresql
+ NODE_VERSION="22" setup_nodejs
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "domain-locker" "Lissy93/domain-locker" "tarball"
+
+ msg_info "Installing Modules (patience)"
+ cd /opt/domain-locker
+ $STD npm install
+ msg_ok "Installed Modules"
+
+ msg_info "Building Domain-Locker (a lot of patience)"
+ set -a
+ source /opt/domain-locker.env
+ set +a
+ $STD npm run build
+ msg_info "Built Domain-Locker"
+
+ msg_info "Restarting Services"
+ systemctl start domain-locker
+ msg_ok "Restarted Services"
+ msg_ok "Updated successfully!"
+ fi
+ exit
}
start
diff --git a/ct/domain-monitor.sh b/ct/domain-monitor.sh
index 346643d35..86462510f 100644
--- a/ct/domain-monitor.sh
+++ b/ct/domain-monitor.sh
@@ -60,7 +60,7 @@ function update_script() {
msg_ok "Restored backup"
msg_info "Restarting Services"
- systemctl reload apache2
+ systemctl start apache2
msg_ok "Restarted Services"
msg_ok "Updated successfully!"
fi
diff --git a/ct/erpnext.sh b/ct/erpnext.sh
new file mode 100644
index 000000000..94fb7b764
--- /dev/null
+++ b/ct/erpnext.sh
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/frappe/erpnext
+
+APP="ERPNext"
+var_tags="${var_tags:-erp;business;accounting}"
+var_cpu="${var_cpu:-4}"
+var_ram="${var_ram:-4096}"
+var_disk="${var_disk:-20}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/frappe-bench ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+ msg_info "Updating ERPNext"
+ $STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; cd /opt/frappe-bench && bench update --reset'
+ msg_ok "Updated ERPNext"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
+echo -e "${INFO}${YW} Credentials:${CL}"
+echo -e "${TAB}${BGN}Username: Administrator${CL}"
+echo -e "${TAB}${BGN}Password: see ~/erpnext.creds${CL}"
diff --git a/ct/fireshare.sh b/ct/fireshare.sh
new file mode 100644
index 000000000..c43f9b91e
--- /dev/null
+++ b/ct/fireshare.sh
@@ -0,0 +1,74 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: SlaviΕ‘a AreΕΎina (tremor021)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/ShaneIsrael/fireshare
+
+APP="Fireshare"
+var_tags="${var_tags:-sharing;video}"
+var_cpu="${var_cpu:-2}"
+var_ram="${var_ram:-2048}"
+var_disk="${var_disk:-10}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/fireshare ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "fireshare" "ShaneIsrael/fireshare"; then
+ msg_info "Stopping Service"
+ systemctl stop fireshare
+ msg_ok "Stopped Service"
+
+ mv /opt/fireshare/fireshare.env /opt
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "fireshare" "ShaneIsrael/fireshare" "tarball"
+ mv /opt/fireshare.env /opt/fireshare
+ rm -f /usr/local/bin/fireshare
+
+ msg_info "Updating Fireshare"
+ cd /opt/fireshare
+ $STD uv venv --clear
+ $STD .venv/bin/python -m ensurepip --upgrade
+ $STD .venv/bin/python -m pip install --upgrade --break-system-packages pip
+ $STD .venv/bin/python -m pip install --no-cache-dir --break-system-packages --ignore-installed app/server
+ cp .venv/bin/fireshare /usr/local/bin/fireshare
+ export FLASK_APP="/opt/fireshare/app/server/fireshare:create_app()"
+ export DATA_DIRECTORY=/opt/fireshare-data
+ export IMAGE_DIRECTORY=/opt/fireshare-images
+ export VIDEO_DIRECTORY=/opt/fireshare-videos
+ export PROCESSED_DIRECTORY=/opt/fireshare-processed
+ $STD uv run flask db upgrade
+ msg_ok "Updated Fireshare"
+
+ msg_info "Starting Service"
+ systemctl start fireshare
+ msg_ok "Started Service"
+ msg_ok "Updated successfully!"
+ fi
+ cleanup_lxc
+
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/flatnotes.sh b/ct/flatnotes.sh
index 06e188e23..b88065247 100644
--- a/ct/flatnotes.sh
+++ b/ct/flatnotes.sh
@@ -38,7 +38,7 @@ function update_script() {
cp -r /opt/flatnotes/data /opt/flatnotes_data_backup
msg_ok "Backed up Configuration and Data"
- fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes"
+ fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes" "tarball"
msg_info "Updating Flatnotes"
cd /opt/flatnotes/client
diff --git a/ct/foldergram.sh b/ct/foldergram.sh
new file mode 100644
index 000000000..47c4605d9
--- /dev/null
+++ b/ct/foldergram.sh
@@ -0,0 +1,61 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: SlaviΕ‘a AreΕΎina (tremor021)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/foldergram/foldergram
+
+APP="Foldergram"
+var_tags="${var_tags:-photos}"
+var_cpu="${var_cpu:-1}"
+var_ram="${var_ram:-2048}"
+var_disk="${var_disk:-4}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/foldergram ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "foldergram" "foldergram/foldergram"; then
+ msg_info "Stopping Service"
+ systemctl stop foldergram
+ msg_ok "Stopped Service"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "foldergram" "foldergram/foldergram" "tarball"
+
+ msg_info "Installing Foldergram"
+ cd /opt/foldergram
+ $STD pnpm install --frozen-lockfile
+ $STD pnpm run build
+ msg_ok "Installed Foldergram"
+
+ msg_info "Starting Service"
+ systemctl start foldergram
+ msg_ok "Started Service"
+ msg_ok "Updated successfully!"
+ fi
+ cleanup_lxc
+ 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}:4141${CL}"
diff --git a/ct/frigate.sh b/ct/frigate.sh
index 99a3c9184..229722e79 100644
--- a/ct/frigate.sh
+++ b/ct/frigate.sh
@@ -7,7 +7,7 @@ source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxV
APP="Frigate"
var_tags="${var_tags:-nvr}"
-var_cpu="${var_cpu:-4}"
+var_cpu="${var_cpu:-8}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}"
var_os="${var_os:-debian}"
diff --git a/ct/ghostfolio.sh b/ct/ghostfolio.sh
index a039d760d..3c20e0f2d 100644
--- a/ct/ghostfolio.sh
+++ b/ct/ghostfolio.sh
@@ -47,6 +47,7 @@ function update_script() {
msg_info "Updating Ghostfolio"
mv /opt/env.backup /opt/ghostfolio/.env
+ sed -i -E '/^DATABASE_URL=/ s/[?&]sslmode=prefer//g' /opt/ghostfolio/.env
cd /opt/ghostfolio
$STD npm ci
$STD npm run build:production
diff --git a/ct/gogs.sh b/ct/gogs.sh
new file mode 100644
index 000000000..09d557682
--- /dev/null
+++ b/ct/gogs.sh
@@ -0,0 +1,65 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://gogs.io/
+
+APP="Gogs"
+var_tags="${var_tags:-git;code;devops}"
+var_cpu="${var_cpu:-2}"
+var_ram="${var_ram:-1024}"
+var_disk="${var_disk:-8}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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 /opt/gogs/gogs ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "gogs" "gogs/gogs"; then
+ msg_info "Stopping Service"
+ systemctl stop gogs
+ msg_ok "Stopped Service"
+
+ msg_info "Backing up Data"
+ cp -r /opt/gogs/custom /opt/gogs_custom_backup
+ cp -r /opt/gogs/data /opt/gogs_data_backup
+ msg_ok "Backed up Data"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "gogs" "gogs/gogs" "prebuild" "latest" "/opt/gogs" "gogs_*_linux_amd64.tar.gz"
+
+ msg_info "Restoring Data"
+ cp -r /opt/gogs_custom_backup/. /opt/gogs/custom
+ cp -r /opt/gogs_data_backup/. /opt/gogs/data
+ rm -rf /opt/gogs_custom_backup /opt/gogs_data_backup
+ msg_ok "Restored Data"
+
+ msg_info "Starting Service"
+ systemctl start gogs
+ msg_ok "Started Service"
+ msg_ok "Updated successfully!"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
diff --git a/ct/headers/anchor b/ct/headers/anchor
new file mode 100644
index 000000000..896f407c0
--- /dev/null
+++ b/ct/headers/anchor
@@ -0,0 +1,6 @@
+ ___ __
+ / | ____ _____/ /_ ____ _____
+ / /| | / __ \/ ___/ __ \/ __ \/ ___/
+ / ___ |/ / / / /__/ / / / /_/ / /
+/_/ |_/_/ /_/\___/_/ /_/\____/_/
+
diff --git a/ct/headers/apprise-api b/ct/headers/apprise-api
new file mode 100644
index 000000000..a1f56c348
--- /dev/null
+++ b/ct/headers/apprise-api
@@ -0,0 +1,6 @@
+ ___ _ ___ ____ ____
+ / | ____ ____ _____(_)_______ / | / __ \/ _/
+ / /| | / __ \/ __ \/ ___/ / ___/ _ \______/ /| | / /_/ // /
+ / ___ |/ /_/ / /_/ / / / (__ ) __/_____/ ___ |/ ____// /
+/_/ |_/ .___/ .___/_/ /_/____/\___/ /_/ |_/_/ /___/
+ /_/ /_/
diff --git a/ct/headers/dashy b/ct/headers/dashy
new file mode 100644
index 000000000..330f9e3d0
--- /dev/null
+++ b/ct/headers/dashy
@@ -0,0 +1,6 @@
+ ____ __
+ / __ \____ ______/ /_ __ __
+ / / / / __ `/ ___/ __ \/ / / /
+ / /_/ / /_/ (__ ) / / / /_/ /
+/_____/\__,_/____/_/ /_/\__, /
+ /____/
diff --git a/ct/headers/erpnext b/ct/headers/erpnext
new file mode 100644
index 000000000..0fbb49f27
--- /dev/null
+++ b/ct/headers/erpnext
@@ -0,0 +1,6 @@
+ __________ ____ _ __ __
+ / ____/ __ \/ __ \/ | / /__ _ __/ /_
+ / __/ / /_/ / /_/ / |/ / _ \| |/_/ __/
+ / /___/ _, _/ ____/ /| / __/> /_
+/_____/_/ |_/_/ /_/ |_/\___/_/|_|\__/
+
diff --git a/ct/headers/fireshare b/ct/headers/fireshare
new file mode 100644
index 000000000..9a0ccb263
--- /dev/null
+++ b/ct/headers/fireshare
@@ -0,0 +1,6 @@
+ _______ __
+ / ____(_)_______ _____/ /_ ____ _________
+ / /_ / / ___/ _ \/ ___/ __ \/ __ `/ ___/ _ \
+ / __/ / / / / __(__ ) / / / /_/ / / / __/
+/_/ /_/_/ \___/____/_/ /_/\__,_/_/ \___/
+
diff --git a/ct/headers/foldergram b/ct/headers/foldergram
new file mode 100644
index 000000000..b9afddd96
--- /dev/null
+++ b/ct/headers/foldergram
@@ -0,0 +1,6 @@
+ ______ __ __
+ / ____/___ / /___/ /__ _________ __________ _____ ___
+ / /_ / __ \/ / __ / _ \/ ___/ __ `/ ___/ __ `/ __ `__ \
+ / __/ / /_/ / / /_/ / __/ / / /_/ / / / /_/ / / / / / /
+/_/ \____/_/\__,_/\___/_/ \__, /_/ \__,_/_/ /_/ /_/
+ /____/
diff --git a/ct/headers/gogs b/ct/headers/gogs
new file mode 100644
index 000000000..3d659556d
--- /dev/null
+++ b/ct/headers/gogs
@@ -0,0 +1,6 @@
+ ______
+ / ____/___ ____ ______
+ / / __/ __ \/ __ `/ ___/
+/ /_/ / /_/ / /_/ (__ )
+\____/\____/\__, /____/
+ /____/
diff --git a/ct/headers/jitsi-meet b/ct/headers/jitsi-meet
new file mode 100644
index 000000000..eefeea882
--- /dev/null
+++ b/ct/headers/jitsi-meet
@@ -0,0 +1,6 @@
+ ___ __ _ __ ___ __
+ / (_) /______(_) / |/ /__ ___ / /_
+ __ / / / __/ ___/ /_____/ /|_/ / _ \/ _ \/ __/
+/ /_/ / / /_(__ ) /_____/ / / / __/ __/ /_
+\____/_/\__/____/_/ /_/ /_/\___/\___/\__/
+
diff --git a/ct/headers/mini-qr b/ct/headers/mini-qr
new file mode 100644
index 000000000..ee9f425ce
--- /dev/null
+++ b/ct/headers/mini-qr
@@ -0,0 +1,6 @@
+ __ ____ _ ____ ____
+ / |/ (_)___ (_) / __ \ / __ \
+ / /|_/ / / __ \/ /_____/ / / / / /_/ /
+ / / / / / / / / /_____/ /_/ / / _, _/
+/_/ /_/_/_/ /_/_/ \___\_\/_/ |_|
+
diff --git a/ct/headers/minthcm b/ct/headers/minthcm
new file mode 100644
index 000000000..4a18a165c
--- /dev/null
+++ b/ct/headers/minthcm
@@ -0,0 +1,6 @@
+ __ ____ __ __ __________ ___
+ / |/ (_)___ / /_/ / / / ____/ |/ /
+ / /|_/ / / __ \/ __/ /_/ / / / /|_/ /
+ / / / / / / / / /_/ __ / /___/ / / /
+/_/ /_/_/_/ /_/\__/_/ /_/\____/_/ /_/
+
diff --git a/ct/headers/ownfoil b/ct/headers/ownfoil
new file mode 100644
index 000000000..06ef7c6d3
--- /dev/null
+++ b/ct/headers/ownfoil
@@ -0,0 +1,6 @@
+ ____ _ __
+ ____ _ ______ / __/___ (_) /
+ / __ \ | /| / / __ \/ /_/ __ \/ / /
+/ /_/ / |/ |/ / / / / __/ /_/ / / /
+\____/|__/|__/_/ /_/_/ \____/_/_/
+
diff --git a/ct/headers/transmute b/ct/headers/transmute
new file mode 100644
index 000000000..1d94eb412
--- /dev/null
+++ b/ct/headers/transmute
@@ -0,0 +1,6 @@
+ ______ __
+ /_ __/________ _____ _________ ___ __ __/ /____
+ / / / ___/ __ `/ __ \/ ___/ __ `__ \/ / / / __/ _ \
+ / / / / / /_/ / / / (__ ) / / / / / /_/ / /_/ __/
+/_/ /_/ \__,_/_/ /_/____/_/ /_/ /_/\__,_/\__/\___/
+
diff --git a/ct/headers/trek b/ct/headers/trek
new file mode 100644
index 000000000..f02f11b4e
--- /dev/null
+++ b/ct/headers/trek
@@ -0,0 +1,6 @@
+ __________ ________ __
+ /_ __/ __ \/ ____/ //_/
+ / / / /_/ / __/ / ,<
+ / / / _, _/ /___/ /| |
+/_/ /_/ |_/_____/_/ |_|
+
diff --git a/ct/homelable.sh b/ct/homelable.sh
index e12104e9a..eb5a67888 100644
--- a/ct/homelable.sh
+++ b/ct/homelable.sh
@@ -43,7 +43,7 @@ function update_script() {
msg_info "Updating Python Dependencies"
cd /opt/homelable/backend
- $STD uv venv /opt/homelable/backend/.venv
+ $STD uv venv --clear /opt/homelable/backend/.venv
$STD uv pip install --python /opt/homelable/backend/.venv/bin/python -r requirements.txt
msg_ok "Updated Python Dependencies"
diff --git a/ct/jitsi-meet.sh b/ct/jitsi-meet.sh
new file mode 100644
index 000000000..1b57f485e
--- /dev/null
+++ b/ct/jitsi-meet.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://jitsi.org/
+
+APP="Jitsi-Meet"
+var_tags="${var_tags:-video;conference;communication}"
+var_cpu="${var_cpu:-4}"
+var_ram="${var_ram:-4096}"
+var_disk="${var_disk:-12}"
+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 /etc/jitsi ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ msg_info "Updating Jitsi Meet"
+ $STD apt update
+ $STD apt install -y --only-upgrade \
+ jitsi-meet \
+ jicofo \
+ jitsi-videobridge2 \
+ prosody
+ msg_ok "Updated Jitsi Meet"
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}https://${IP}${CL}"
diff --git a/ct/linkding.sh b/ct/linkding.sh
index d770b8be2..b0604291f 100644
--- a/ct/linkding.sh
+++ b/ct/linkding.sh
@@ -39,7 +39,7 @@ function update_script() {
cp /opt/linkding/.env /opt/linkding_env_backup
msg_ok "Backed up Data"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding" "tarball"
msg_info "Restoring Data"
cp -r /opt/linkding_data_backup/. /opt/linkding/data
diff --git a/ct/mealie.sh b/ct/mealie.sh
index fb51f0471..89312ddc1 100644
--- a/ct/mealie.sh
+++ b/ct/mealie.sh
@@ -38,10 +38,27 @@ function update_script() {
msg_info "Backing up Configuration"
cp -f /opt/mealie/mealie.env /opt/mealie.env
+ [[ -f /opt/mealie/start.sh ]] && cp -f /opt/mealie/start.sh /opt/mealie.start.sh
msg_ok "Backup completed"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball"
+ msg_info "Restoring Configuration"
+ mv -f /opt/mealie.env /opt/mealie/mealie.env
+ if [[ -f /opt/mealie.start.sh ]]; then
+ mv -f /opt/mealie.start.sh /opt/mealie/start.sh
+ else
+ cat <<'STARTEOF' >/opt/mealie/start.sh
+#!/bin/bash
+set -a
+source /opt/mealie/mealie.env
+set +a
+exec uv run mealie
+STARTEOF
+ fi
+ chmod +x /opt/mealie/start.sh
+ msg_ok "Configuration restored"
+
msg_info "Installing Python Dependencies with uv"
cd /opt/mealie
$STD uv sync --frozen --extra pgsql
@@ -70,18 +87,6 @@ function update_script() {
$STD uv run python -m nltk.downloader -d /nltk_data averaged_perceptron_tagger_eng
msg_ok "Updated NLTK Data"
- msg_info "Restoring Configuration"
- mv -f /opt/mealie.env /opt/mealie/mealie.env
- cat <<'STARTEOF' >/opt/mealie/start.sh
-#!/bin/bash
-set -a
-source /opt/mealie/mealie.env
-set +a
-exec uv run mealie
-STARTEOF
- chmod +x /opt/mealie/start.sh
- msg_ok "Configuration restored"
-
msg_info "Starting Service"
systemctl start mealie
msg_ok "Started Service"
diff --git a/ct/mini-qr.sh b/ct/mini-qr.sh
new file mode 100644
index 000000000..5376b691a
--- /dev/null
+++ b/ct/mini-qr.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: doge0420
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/lyqht/mini-qr
+
+APP="Mini-QR"
+var_tags="${var_tags:-QRcode;}"
+var_cpu="${var_cpu:-2}"
+var_ram="${var_ram:-2048}"
+var_disk="${var_disk:-6}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/mini-qr ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "mini-qr" "lyqht/mini-qr"; then
+ msg_info "Stopping Service"
+ systemctl stop caddy
+ msg_ok "Stopped Service"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mini-qr" "lyqht/mini-qr" "tarball"
+
+ msg_info "Installing Dependencies"
+ cd /opt/mini-qr
+ $STD npm install
+ msg_ok "Installed Dependencies"
+
+ msg_info "Building MiniQR"
+ $STD npm run build
+ msg_ok "Built MiniQR"
+
+ msg_info "Starting Service"
+ systemctl start caddy
+ msg_ok "Started Service"
+ msg_ok "Updated successfully!"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/minthcm.sh b/ct/minthcm.sh
new file mode 100644
index 000000000..90211bd7c
--- /dev/null
+++ b/ct/minthcm.sh
@@ -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-2026 community-scripts ORG
+# Author: MintHCM
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/minthcm/minthcm
+
+APP="MintHCM"
+var_tags="${var_tags:-hcm}"
+var_disk="${var_disk:-20}"
+var_cpu="${var_cpu:-4}"
+var_ram="${var_ram:-4096}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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 /var/www/MintHCM ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ msg_custom "π" "${GN}" "The app offers a built-in updater. Please use it."
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
diff --git a/ct/nodecast-tv.sh b/ct/nodecast-tv.sh
index 730b70136..63ec5bc8e 100644
--- a/ct/nodecast-tv.sh
+++ b/ct/nodecast-tv.sh
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop nodecast-tv
msg_ok "Stopped Service"
- fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv"
+ fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv" "tarball"
msg_info "Updating Modules"
cd /opt/nodecast-tv
diff --git a/ct/opencloud.sh b/ct/opencloud.sh
index 449941145..6fb676546 100644
--- a/ct/opencloud.sh
+++ b/ct/opencloud.sh
@@ -29,7 +29,7 @@ function update_script() {
exit
fi
- RELEASE="v6.0.0"
+ RELEASE="v6.1.0"
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
msg_info "Stopping services"
systemctl stop opencloud opencloud-wopi
diff --git a/ct/ownfoil.sh b/ct/ownfoil.sh
new file mode 100644
index 000000000..3a770f614
--- /dev/null
+++ b/ct/ownfoil.sh
@@ -0,0 +1,69 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: pajjski
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/a1ex4/ownfoil
+
+APP="ownfoil"
+var_tags="${var_tags:-gaming}"
+var_cpu="${var_cpu:-1}"
+var_ram="${var_ram:-1024}"
+var_disk="${var_disk:-4}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/ownfoil ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "ownfoil" "a1ex4/ownfoil"; then
+ msg_info "Stopping Service"
+ systemctl stop ownfoil
+ msg_ok "Stopped Service"
+
+ msg_info "Backing up Data"
+ cp -r /opt/ownfoil/app/config /opt/ownfoil_data_backup
+ msg_ok "Backed up Data"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ownfoil" "a1ex4/ownfoil" "tarball"
+
+ msg_info "Installing Dependencies"
+ cd /opt/ownfoil
+ $STD source .venv/bin/activate
+ $STD uv pip install -r requirements.txt
+ msg_ok "Installed Dependencies"
+
+ msg_info "Restoring Data"
+ cp -r /opt/ownfoil_data_backup /opt/ownfoil/app/config
+ rm -rf /opt/ownfoil_data_backup
+ msg_ok "Restored Data"
+
+ msg_info "Starting Service"
+ systemctl start ownfoil
+ msg_ok "Started Service"
+ msg_ok "Updated successfully!"
+ 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}:8465${CL}"
diff --git a/ct/pangolin.sh b/ct/pangolin.sh
index 765649083..c135645dd 100644
--- a/ct/pangolin.sh
+++ b/ct/pangolin.sh
@@ -76,6 +76,7 @@ function update_script() {
if [[ -f "$DB" ]]; then
sqlite3 "$DB" "ALTER TABLE 'orgs' ADD COLUMN 'settingsLogRetentionDaysConnection' integer DEFAULT 0 NOT NULL;" 2>/dev/null || true
sqlite3 "$DB" "ALTER TABLE 'clientSitesAssociationsCache' ADD COLUMN 'isJitMode' integer DEFAULT 0 NOT NULL;" 2>/dev/null || true
+ sqlite3 "$DB" "ALTER TABLE 'userOrgs' ADD COLUMN 'pamUsername' text;" 2>/dev/null || true
# Create new role-mapping tables and migrate data before drizzle-kit
# drops the roleId columns from userOrgs and userInvites.
diff --git a/ct/patchmon.sh b/ct/patchmon.sh
index e49324495..99511aaa9 100644
--- a/ct/patchmon.sh
+++ b/ct/patchmon.sh
@@ -29,63 +29,75 @@ function update_script() {
exit
fi
- if ! grep -q "PORT=3001" /opt/patchmon/backend/.env; then
- msg_warn "β οΈ The next PatchMon update will include breaking changes (port changes)."
- msg_warn "See details here: https://github.com/community-scripts/ProxmoxVE/pull/11888"
- msg_warn "Press Enter to continue with the update, or Ctrl+C to abort..."
- read -r
- fi
-
- RELEASE="v1.4.2"
- NODE_VERSION="24" setup_nodejs
+ RELEASE="v2.0.1"
if check_for_gh_release "PatchMon" "PatchMon/PatchMon" "${RELEASE}"; then
msg_info "Stopping Service"
systemctl stop patchmon-server
msg_ok "Stopped Service"
- msg_info "Creating Backup"
- cp /opt/patchmon/backend/.env /opt/backend.env
- cp /opt/patchmon/frontend/.env /opt/frontend.env
- msg_ok "Backup Created"
-
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "tarball" "${RELEASE}" "/opt/patchmon"
-
- msg_info "Updating PatchMon"
- VERSION=$(get_latest_github_release "PatchMon/PatchMon")
- SERVER_PORT="$(sed -n '/SERVER_PORT/s/[^=]*=//p' /opt/backend.env)"
- sed -i 's/PORT=3399/PORT=3001/' /opt/backend.env
- sed -i -e "s/VERSION=.*/VERSION=$VERSION/" \
- -e '/^VITE_API_URL/d' /opt/frontend.env
- export NODE_ENV=production
- cd /opt/patchmon
- $STD npm install --no-audit --no-fund --no-save --ignore-scripts
- cd /opt/patchmon/frontend
- mv /opt/frontend.env /opt/patchmon/frontend/.env
- $STD npm install --no-audit --no-fund --no-save --ignore-scripts --include=dev
- $STD npm run build
- cd /opt/patchmon/backend
- mv /opt/backend.env /opt/patchmon/backend/.env
- $STD npm run db:generate
- $STD npx prisma migrate deploy
- cp /opt/patchmon/docker/nginx.conf.template /etc/nginx/sites-available/patchmon.conf
- sed -i -e 's|proxy_pass .*|proxy_pass http://127.0.0.1:3001;|' \
- -e '\|try_files |i\ root /opt/patchmon/frontend/dist;' \
- -e 's|alias.*|alias /opt/patchmon/frontend/dist/assets;|' \
- -e '\|expires 1y|i\ root /opt/patchmon/frontend/dist;' /etc/nginx/sites-available/patchmon.conf
- if [[ -n "$SERVER_PORT" ]] && [[ "$SERVER_PORT" != "443" ]]; then
- sed -i "s/listen [[:digit:]].*/listen ${SERVER_PORT};/" /etc/nginx/sites-available/patchmon.conf
+ if [[ -d /opt/patchmon/backend ]]; then
+ msg_info "Legacy install detected - creating full backup, please wait..."
+ $STD tar czf ~/patchmon_legacy.tar.gz /opt/patchmon
+ cp /opt/patchmon/backend/.env /opt/legacy.env
+ msg_ok "Full backup saved in /root"
+ msg_info "Starting migration to PatchMon v2.x.x"
+ systemctl disable -q --now nginx
+ $STD npm cache clean --force
+ $STD apt autoremove --purge -y {nginx,nodejs}
+ if [[ -f /etc/apt/sources.list.d/nodesource.sources ]]; then
+ cp /etc/apt/sources.list.d/nodesource.sources /etc/apt/sources.list.d/nodesource.sources.bak
+ rm -f /etc/apt/sources.list.d/nodesource.sources
+ elif [[ -f /etc/apt/sources.list.d/nodesource.list ]]; then
+ cp /etc/apt/sources.list.d/nodesource.list /etc/apt/sources.list.d/nodesource.list.bak
+ rm -f /etc/apt/sources.list.d/nodesource.list
+ fi
+ rm -rf /opt/patchmon
+ mkdir -p /opt/patchmon/agents
+ cp /opt/legacy.env /opt/patchmon/.env
+ sed -i -e 's/^PORT=.*/PORT=3000/' \
+ -e 's/^NODE_/APP_/' \
+ -e '/^SERVER_*/d' \
+ -e '/^# API*/,+2d' /opt/patchmon/.env
+ {
+ echo ""
+ echo "SESSION_SECRET=$(openssl rand -hex 64)"
+ echo "AI_ENCRYPTION_KEY=$(openssl rand -hex 64)"
+ echo "AGENT_BINARIES_DIR=/opt/patchmon/agents"
+ } >>/opt/patchmon/.env
+ sed -i -e '\|Directory|s|/backend||' \
+ -e 's|^ExecStart=.*|ExecStart=/opt/patchmon/patchmon-server|' \
+ -e 's|^Environment=NODE_.*|EnvironmentFile=/opt/patchmon/.env|' \
+ /etc/systemd/system/patchmon-server.service
+ systemctl daemon-reload
+ rm /opt/legacy.env
+ msg_ok "Migration complete!"
fi
- ln -sf /etc/nginx/sites-available/patchmon.conf /etc/nginx/sites-enabled/
- rm -f /etc/nginx/sites-enabled/default
- $STD nginx -t
- systemctl restart nginx
- msg_ok "Updated PatchMon"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "singlefile" "${RELEASE}" "/opt/patchmon" "patchmon-server-linux-amd64"
+ mv /opt/patchmon/PatchMon /opt/patchmon/patchmon-server
+
+ msg_info "Fetching PatchMon agent binaries"
+ [[ ! -d /opt/patchmon/agents ]] && mkdir -p /opt/patchmon/agents
+ FILE_URL="https://github.com/PatchMon/PatchMon/releases/download/${RELEASE}/patchmon-agent-"
+ AGENT_NAME=(
+ "linux-amd64"
+ "linux-arm64"
+ "linux-arm"
+ "linux-386"
+ "freebsd-amd64"
+ "freebsd-arm64"
+ "freebsd-arm"
+ "freebsd-386"
+ "windows-amd64.exe"
+ "windows-arm64.exe"
+ )
+ for arch in "${AGENT_NAME[@]}"; do
+ curl_with_retry "${FILE_URL}${arch}" "/opt/patchmon/agents/patchmon-agent-${arch}"
+ [[ "${arch}" != *.exe ]] && chmod 755 "/opt/patchmon/agents/patchmon-agent-${arch}"
+ done
+ msg_ok "Fetched PatchMon agent binaries"
msg_info "Starting Service"
- if grep -q '/usr/bin/node' /etc/systemd/system/patchmon-server.service; then
- sed -i 's|ExecStart=.*|ExecStart=/usr/bin/npm run start|' /etc/systemd/system/patchmon-server.service
- systemctl daemon-reload
- fi
systemctl start patchmon-server
msg_ok "Started Service"
msg_ok "Updated successfully!"
diff --git a/ct/profilarr.sh b/ct/profilarr.sh
index 8d1ce0a96..7bf0582b2 100644
--- a/ct/profilarr.sh
+++ b/ct/profilarr.sh
@@ -44,7 +44,7 @@ function update_script() {
msg_info "Installing Python Dependencies"
cd /opt/profilarr/backend
- $STD uv venv /opt/profilarr/backend/.venv
+ $STD uv venv --clear /opt/profilarr/backend/.venv
sed 's/==/>=/g' requirements.txt >requirements-relaxed.txt
$STD uv pip install --python /opt/profilarr/backend/.venv/bin/python -r requirements-relaxed.txt
rm -f requirements-relaxed.txt
diff --git a/ct/technitiumdns.sh b/ct/technitiumdns.sh
index 21a13d306..6375c8462 100644
--- a/ct/technitiumdns.sh
+++ b/ct/technitiumdns.sh
@@ -32,8 +32,8 @@ function update_script() {
systemctl daemon-reload
systemctl enable -q --now technitium
fi
- if is_package_installed "aspnetcore-runtime-8.0"; then
- $STD apt remove -y aspnetcore-runtime-8.0
+ if ! is_package_installed "aspnetcore-runtime-10.0"; then
+ $STD apt remove -y aspnetcore-runtime-8.0 aspnetcore-runtime-9.0 2>/dev/null || true
[ -f /etc/apt/sources.list.d/microsoft-prod.list ] && rm -f /etc/apt/sources.list.d/microsoft-prod.list
[ -f /usr/share/keyrings/microsoft-prod.gpg ] && rm -f /usr/share/keyrings/microsoft-prod.gpg
setup_deb822_repo \
@@ -42,18 +42,15 @@ function update_script() {
"https://packages.microsoft.com/debian/13/prod/" \
"trixie" \
"main"
- $STD apt install -y aspnetcore-runtime-9.0
+ $STD apt install -y aspnetcore-runtime-10.0
fi
RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+')
- if [[ ! -f ~/.technitium || ${RELEASE} != "$(cat ~/.technitium)" ]]; then
- msg_info "Updating Technitium DNS"
- curl -fsSL "https://download.technitium.com/dns/DnsServerPortable.tar.gz" -o /opt/DnsServerPortable.tar.gz
- $STD tar zxvf /opt/DnsServerPortable.tar.gz -C /opt/technitium/dns/
- rm -f /opt/DnsServerPortable.tar.gz
+ if [[ ! -f ~/.technitium || ${RELEASE} != "$(cat ~/.technitium 2>/dev/null)" ]]; then
+ systemctl stop technitium
+ fetch_and_deploy_from_url "https://download.technitium.com/dns/DnsServerPortable.tar.gz" /opt/technitium/dns
echo "${RELEASE}" >~/.technitium
- systemctl restart technitium
- msg_ok "Updated Technitium DNS"
+ systemctl start technitium
msg_ok "Updated successfully!"
else
msg_ok "No update required. Technitium DNS is already at v${RELEASE}."
diff --git a/ct/termix.sh b/ct/termix.sh
index c89d09e31..fac375992 100644
--- a/ct/termix.sh
+++ b/ct/termix.sh
@@ -145,7 +145,7 @@ EOF
cp -r /opt/termix/uploads /opt/termix_uploads_backup
msg_ok "Backed up Data"
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
msg_info "Recreating Directories"
mkdir -p /opt/termix/html \
@@ -155,6 +155,8 @@ EOF
/opt/termix/nginx/client_body
msg_ok "Recreated Directories"
+ NODE_VERSION="24" setup_nodejs
+
msg_info "Building Frontend"
cd /opt/termix
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
diff --git a/ct/transmute.sh b/ct/transmute.sh
new file mode 100644
index 000000000..9d80279a7
--- /dev/null
+++ b/ct/transmute.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/transmute-app/transmute
+
+APP="Transmute"
+var_tags="${var_tags:-files;converter}"
+var_cpu="${var_cpu:-4}"
+var_ram="${var_ram:-4096}"
+var_disk="${var_disk:-16}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/transmute ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-x86_64.txz"
+ ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert
+ fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-amd64-*.deb"
+ fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-amd64.deb"
+
+ if check_for_gh_release "transmute" "transmute-app/transmute"; then
+ msg_info "Stopping Service"
+ systemctl stop transmute
+ msg_ok "Stopped Service"
+
+ msg_info "Backing up Data"
+ cp /opt/transmute/backend/.env /opt/transmute.env.bak
+ cp -r /opt/transmute/data /opt/transmute_data_bak
+ msg_ok "Backed up Data"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "transmute" "transmute-app/transmute" "tarball"
+
+ msg_info "Updating Python Dependencies"
+ cd /opt/transmute
+ $STD uv venv --clear /opt/transmute/.venv
+ $STD uv pip install --python /opt/transmute/.venv/bin/python -r requirements.txt
+ msg_ok "Updated Python Dependencies"
+
+ msg_info "Rebuilding Frontend"
+ cd /opt/transmute/frontend
+ $STD npm ci
+ $STD npm run build
+ msg_ok "Rebuilt Frontend"
+
+ msg_info "Restoring Data"
+ cp /opt/transmute.env.bak /opt/transmute/backend/.env
+ cp -r /opt/transmute_data_bak/. /opt/transmute/data/
+ rm -f /opt/transmute.env.bak
+ rm -rf /opt/transmute_data_bak
+ msg_ok "Restored Data"
+
+ msg_info "Starting Service"
+ systemctl start transmute
+ msg_ok "Started Service"
+ msg_ok "Updated successfully!"
+ 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}:3313${CL}"
diff --git a/ct/trek.sh b/ct/trek.sh
new file mode 100644
index 000000000..0e3f679a9
--- /dev/null
+++ b/ct/trek.sh
@@ -0,0 +1,84 @@
+#!/usr/bin/env bash
+source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/mauriceboe/TREK
+
+APP="TREK"
+var_tags="${var_tags:-travel;planning;collaboration}"
+var_cpu="${var_cpu:-2}"
+var_ram="${var_ram:-2048}"
+var_disk="${var_disk:-8}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+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/trek ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "trek" "mauriceboe/TREK"; then
+ msg_info "Stopping Service"
+ systemctl stop trek
+ msg_ok "Stopped Service"
+
+ msg_info "Backing up Data"
+ cp /opt/trek/server/.env /opt/trek.env.bak
+ mv /opt/trek/data /opt/trek-data.bak
+ mv /opt/trek/uploads /opt/trek-uploads.bak
+ msg_ok "Backed up Data"
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "trek" "mauriceboe/TREK" "tarball"
+
+ msg_info "Building Client"
+ cd /opt/trek/client
+ $STD npm ci
+ $STD npm run build
+ mkdir -p /opt/trek/server/public
+ cp -r /opt/trek/client/dist/* /opt/trek/server/public/
+ cp -r /opt/trek/client/public/fonts /opt/trek/server/public/fonts 2>/dev/null || true
+ msg_ok "Built Client"
+
+ msg_info "Installing Server Dependencies"
+ cd /opt/trek/server
+ $STD npm ci
+ msg_ok "Installed Server Dependencies"
+
+ msg_info "Restoring Data"
+ mv /opt/trek-data.bak /opt/trek/data
+ mv /opt/trek-uploads.bak /opt/trek/uploads
+ rm -rf /opt/trek/server/data /opt/trek/server/uploads
+ ln -s /opt/trek/data /opt/trek/server/data
+ ln -s /opt/trek/uploads /opt/trek/server/uploads
+ cp /opt/trek.env.bak /opt/trek/server/.env
+ rm -f /opt/trek.env.bak
+ msg_ok "Restored Data"
+
+ msg_info "Starting Service"
+ systemctl start trek
+ msg_ok "Started Service"
+ msg_ok "Updated Successfully!"
+ fi
+ exit
+}
+
+start
+build_container
+description
+
+msg_ok "Completed Successfully!\n"
+echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
+echo -e "${INFO}${YW} Access it using the following URL:${CL}"
+echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"
diff --git a/ct/twingate-connector.sh b/ct/twingate-connector.sh
index 1c662686b..0f97f1877 100644
--- a/ct/twingate-connector.sh
+++ b/ct/twingate-connector.sh
@@ -29,8 +29,9 @@ function update_script() {
exit
fi
- msg_info "Updating ${APP}"
- ensure_dependencies twingate-connector
+ msg_info "Updating Twingate Connector"
+ $STD apt update
+ $STD apt install -y --only-upgrade twingate-connector
$STD systemctl restart twingate-connector
msg_ok "Updated successfully!"
exit
diff --git a/ct/victoriametrics.sh b/ct/victoriametrics.sh
index ca7030714..e3790fc21 100644
--- a/ct/victoriametrics.sh
+++ b/ct/victoriametrics.sh
@@ -32,6 +32,8 @@ function update_script() {
msg_info "Stopping Service"
systemctl stop victoriametrics
[[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl stop victoriametrics-logs
+ [[ -f /etc/systemd/system/vmagent.service ]] && systemctl stop vmagent
+ [[ -f /etc/systemd/system/vmalert.service ]] && systemctl stop vmalert
msg_ok "Stopped Service"
victoriametrics_release=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases" |
@@ -62,6 +64,8 @@ function update_script() {
msg_info "Starting Service"
systemctl start victoriametrics
[[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl start victoriametrics-logs
+ [[ -f /etc/systemd/system/vmagent.service ]] && systemctl start vmagent
+ [[ -f /etc/systemd/system/vmalert.service ]] && systemctl start vmalert
msg_ok "Started Service"
msg_ok "Updated successfully!"
fi
diff --git a/ct/wger.sh b/ct/wger.sh
index 7417e941e..85637beb8 100644
--- a/ct/wger.sh
+++ b/ct/wger.sh
@@ -53,6 +53,8 @@ function update_script() {
set -a && source /opt/wger/.env && set +a
export DJANGO_SETTINGS_MODULE=settings.main
$STD uv pip install .
+ $STD npm install
+ $STD npm run build:css:sass
$STD uv run python manage.py migrate
$STD uv run python manage.py collectstatic --no-input
msg_ok "Updated wger"
diff --git a/ct/yamtrack.sh b/ct/yamtrack.sh
index 21e9fe34f..714125fea 100644
--- a/ct/yamtrack.sh
+++ b/ct/yamtrack.sh
@@ -43,7 +43,7 @@ function update_script() {
msg_info "Installing Python Dependencies"
cd /opt/yamtrack
- $STD uv venv .venv
+ $STD uv venv --clear .venv
$STD uv pip install --no-cache-dir -r requirements.txt
msg_ok "Installed Python Dependencies"
diff --git a/install/anchor-install.sh b/install/anchor-install.sh
new file mode 100644
index 000000000..e1407cfa4
--- /dev/null
+++ b/install/anchor-install.sh
@@ -0,0 +1,99 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/ZhFahim/anchor
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
+PG_VERSION="17" setup_postgresql
+PG_DB_NAME="anchor" PG_DB_USER="anchor" setup_postgresql_db
+
+fetch_and_deploy_gh_release "anchor" "ZhFahim/anchor" "tarball"
+
+msg_info "Building Server"
+cd /opt/anchor/server
+$STD pnpm install --frozen-lockfile
+$STD pnpm prisma generate
+$STD pnpm build
+[[ -d src/generated ]] && mkdir -p dist/src && cp -R src/generated dist/src/
+msg_ok "Built Server"
+
+msg_info "Building Web Interface"
+cd /opt/anchor/web
+$STD pnpm install --frozen-lockfile
+SERVER_URL=http://127.0.0.1:3001 $STD pnpm build
+cp -r .next/static .next/standalone/.next/static
+cp -r public .next/standalone/public
+msg_ok "Built Web Interface"
+
+msg_info "Configuring Application"
+JWT_SECRET=$(openssl rand -base64 32)
+cat </opt/anchor/.env
+APP_URL=http://${LOCAL_IP}:3000
+JWT_SECRET=${JWT_SECRET}
+DATABASE_URL=postgresql://anchor:${PG_DB_PASS}@localhost:5432/anchor
+PG_HOST=localhost
+PG_USER=anchor
+PG_PASSWORD=${PG_DB_PASS}
+PG_DATABASE=anchor
+PG_PORT=5432
+EOF
+msg_ok "Configured Application"
+
+msg_info "Running Database Migrations"
+cd /opt/anchor/server
+set -a && source /opt/anchor/.env && set +a
+$STD pnpm prisma migrate deploy
+msg_ok "Ran Database Migrations"
+
+msg_info "Creating Services"
+cat </etc/systemd/system/anchor-server.service
+[Unit]
+Description=Anchor API Server
+After=network.target postgresql.service
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/anchor/server
+EnvironmentFile=/opt/anchor/.env
+ExecStart=/usr/bin/node dist/src/main.js
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+cat </etc/systemd/system/anchor-web.service
+[Unit]
+Description=Anchor Web Interface
+After=network.target anchor-server.service
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/anchor/web/.next/standalone
+EnvironmentFile=/opt/anchor/.env
+Environment=PORT=3000 HOSTNAME=0.0.0.0 NODE_ENV=production
+ExecStart=/usr/bin/node server.js
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now anchor-server anchor-web
+msg_ok "Created Services"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/apprise-api-install.sh b/install/apprise-api-install.sh
new file mode 100644
index 000000000..9ba3b29d6
--- /dev/null
+++ b/install/apprise-api-install.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: SystemIdleProcess
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/caronc/apprise-api
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+msg_info "Installing Dependencies"
+$STD apt install -y \
+ nginx \
+ git
+msg_ok "Installed Dependencies"
+
+PYTHON_VERSION="3.12" setup_uv
+fetch_and_deploy_gh_release "apprise" "caronc/apprise-api" "tarball"
+
+msg_info "Setup Apprise-API"
+cd /opt/apprise
+cp ./requirements.txt /etc/requirements.txt
+$STD uv pip install -r requirements.txt gunicorn supervisor --system
+cp -fr apprise_api/static /usr/share/nginx/html/s/
+mv apprise_api/ webapp
+touch /etc/nginx/server-override.conf
+touch /etc/nginx/location-override.conf
+mkdir -p /config/store /attach /plugin /tmp/apprise /opt/apprise/logs
+chmod 1777 /tmp/apprise && chmod 777 /config /config/store /attach /plugin /opt/apprise/logs
+sed -i \
+ -e '/[[]program:nginx]/,/^[[]/ s|stdout_logfile=/dev/stdout|stdout_logfile=/opt/apprise/logs/nginx.log|' \
+ -e '/[[]program:nginx]/,/^[[]/ s|stderr_logfile=/dev/stderr|stderr_logfile=/opt/apprise/logs/nginx_error.log|' \
+ -e '/[[]program:gunicorn]/,/^[[]/ s|stdout_logfile=/dev/stdout|stdout_logfile=/opt/apprise/logs/gunicorn.log|' \
+ -e '/[[]program:gunicorn]/,/^[[]/ s|stderr_logfile=/dev/stderr|stderr_logfile=/opt/apprise/logs/gunicorn_error.log|' \
+ -e '/[[]supervisord]/,/^[[]/ s|logfile=/dev/null|logfile=/opt/apprise/logs/supervisor.log|' \
+ -e 's|_maxbytes=0|_maxbytes=10485760|g' \
+ /opt/apprise/webapp/etc/supervisord.conf
+msg_ok "Setup Apprise-API"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/apprise-api.service
+[Unit]
+Description=Apprise-API Service
+After=network-online.target
+
+[Service]
+Type=simple
+WorkingDirectory=/opt/apprise
+ExecStart=/opt/apprise/webapp/supervisord-startup
+Restart=always
+RestartSec=30
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now apprise-api
+msg_ok "Created Service"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/checkmate-install.sh b/install/checkmate-install.sh
index ef6ad02cc..9aaef3ec8 100644
--- a/install/checkmate-install.sh
+++ b/install/checkmate-install.sh
@@ -22,7 +22,7 @@ msg_ok "Installed Dependencies"
MONGO_VERSION="8.0" setup_mongodb
NODE_VERSION="22" setup_nodejs
-fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate"
+fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate" "tarball"
msg_info "Configuring Checkmate"
JWT_SECRET="$(openssl rand -hex 32)"
diff --git a/install/dashy-install.sh b/install/dashy-install.sh
new file mode 100644
index 000000000..76331b182
--- /dev/null
+++ b/install/dashy-install.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: tteck (tteckster) | Co-Author: CrazyWolf13
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://dashy.to/
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
+fetch_and_deploy_gh_release "dashy" "Lissy93/dashy" "prebuild" "latest" "/opt/dashy" "dashy-*.tar.gz"
+
+msg_info "Installing Dashy"
+cd /opt/dashy
+$STD yarn install --ignore-engines --network-timeout 300000
+msg_ok "Installed Dashy"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/dashy.service
+[Unit]
+Description=dashy
+
+[Service]
+Type=simple
+WorkingDirectory=/opt/dashy
+Environment=NODE_OPTIONS=--openssl-legacy-provider
+ExecStart=/usr/bin/node server.js
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now dashy
+msg_ok "Created Service"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/dawarich-install.sh b/install/dawarich-install.sh
index 9edf3a296..34e58ded7 100644
--- a/install/dawarich-install.sh
+++ b/install/dawarich-install.sh
@@ -46,10 +46,12 @@ msg_ok "Set up Directories"
msg_info "Configuring Environment"
SECRET_KEY_BASE=$(openssl rand -hex 64)
+OTP_ENCRYPTION_PRIMARY_KEY=$(openssl rand -hex 32)
RELEASE=$(get_latest_github_release "Freika/dawarich")
cat </opt/dawarich/.env
RAILS_ENV=production
SECRET_KEY_BASE=${SECRET_KEY_BASE}
+OTP_ENCRYPTION_PRIMARY_KEY=${OTP_ENCRYPTION_PRIMARY_KEY}
DATABASE_HOST=localhost
DATABASE_USERNAME=${PG_DB_USER}
DATABASE_PASSWORD=${PG_DB_PASS}
diff --git a/install/domain-locker-install.sh b/install/domain-locker-install.sh
index 3f00864fe..093c61144 100644
--- a/install/domain-locker-install.sh
+++ b/install/domain-locker-install.sh
@@ -13,6 +13,10 @@ setting_up_container
network_check
update_os
+msg_info "Installing dependencies"
+$STD apt install -y whois
+msg_ok "Installed dependencies"
+
PG_VERSION="17" setup_postgresql
PG_DB_NAME="domainlocker_db" PG_DB_USER="domainlocker" setup_postgresql_db
NODE_VERSION="22" setup_nodejs
diff --git a/install/erpnext-install.sh b/install/erpnext-install.sh
new file mode 100644
index 000000000..970b84ae1
--- /dev/null
+++ b/install/erpnext-install.sh
@@ -0,0 +1,106 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/frappe/erpnext
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+msg_info "Installing Dependencies"
+$STD apt install -y \
+ git \
+ build-essential \
+ python3-dev \
+ libffi-dev \
+ libssl-dev \
+ redis-server \
+ nginx \
+ supervisor \
+ fail2ban \
+ xvfb \
+ libfontconfig1 \
+ libxrender1 \
+ fontconfig \
+ libjpeg-dev \
+ libmariadb-dev \
+ python3-pip
+msg_ok "Installed Dependencies"
+
+NODE_VERSION="24" NODE_MODULE="yarn" setup_nodejs
+UV_PYTHON="3.13" setup_uv
+setup_mariadb
+
+msg_info "Configuring MariaDB for ERPNext"
+cat </etc/mysql/mariadb.conf.d/50-erpnext.cnf
+[mysqld]
+character-set-server=utf8mb4
+collation-server=utf8mb4_unicode_ci
+
+[client]
+default-character-set=utf8mb4
+EOF
+$STD systemctl restart mariadb
+msg_ok "Configured MariaDB for ERPNext"
+
+msg_info "Installing wkhtmltopdf"
+WKHTMLTOPDF_URL="https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bookworm_amd64.deb"
+$STD curl -fsSL -o /tmp/wkhtmltox.deb "$WKHTMLTOPDF_URL"
+$STD apt install -y /tmp/wkhtmltox.deb
+rm -f /tmp/wkhtmltox.deb
+msg_ok "Installed wkhtmltopdf"
+
+msg_info "Installing Frappe Bench"
+useradd -m -s /bin/bash frappe
+chown frappe:frappe /opt
+echo "frappe ALL=(ALL) NOPASSWD:ALL" >/etc/sudoers.d/frappe
+$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; uv tool install frappe-bench'
+msg_ok "Installed Frappe Bench"
+
+msg_info "Initializing Frappe Bench"
+ADMIN_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+DB_ROOT_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASS}'; FLUSH PRIVILEGES;"
+$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; cd /opt && bench init --frappe-branch version-15 frappe-bench'
+$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; cd /opt/frappe-bench && bench get-app erpnext --branch version-15'
+$STD sudo -u frappe bash -c "export PATH=\"\$HOME/.local/bin:\$PATH\"; cd /opt/frappe-bench && bench new-site site1.local --db-root-username root --db-root-password \"$DB_ROOT_PASS\" --admin-password \"$ADMIN_PASS\" --install-app erpnext --set-default"
+msg_ok "Initialized Frappe Bench"
+
+msg_info "Configuring ERPNext"
+cat </opt/frappe-bench/.env
+ADMIN_PASSWORD=${ADMIN_PASS}
+DB_ROOT_PASSWORD=${DB_ROOT_PASS}
+SITE_NAME=site1.local
+EOF
+{
+ echo "ERPNext Credentials"
+ echo "=================="
+ echo "Admin Username: Administrator"
+ echo "Admin Password: ${ADMIN_PASS}"
+ echo "DB Root Password: ${DB_ROOT_PASS}"
+ echo "Site Name: site1.local"
+} >~/erpnext.creds
+$STD systemctl enable --now redis-server
+msg_ok "Configured ERPNext"
+
+msg_info "Setting up Production"
+BENCH_PY="/home/frappe/.local/share/uv/tools/frappe-bench/bin/python"
+$STD sudo -u frappe bash -c "curl -fsSL https://bootstrap.pypa.io/get-pip.py | \"${BENCH_PY}\""
+$STD sudo -u frappe bash -c 'export PATH="$HOME/.local/bin:$PATH"; uv tool install ansible'
+ln -sf /home/frappe/.local/bin/ansible* /usr/local/bin/
+$STD bash -c 'export PATH="/home/frappe/.local/bin:$PATH"; cd /opt/frappe-bench && bench setup production frappe --yes'
+ln -sf /opt/frappe-bench/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.conf
+$STD supervisorctl reread
+$STD supervisorctl update
+$STD systemctl enable --now supervisor
+msg_ok "Set up Production"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/fileflows-install.sh b/install/fileflows-install.sh
index bc6f6f797..b7b2aceef 100644
--- a/install/fileflows-install.sh
+++ b/install/fileflows-install.sh
@@ -5,7 +5,6 @@
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://fileflows.com/
-# Import Functions und Setup
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
@@ -17,6 +16,7 @@ update_os
msg_info "Installing Dependencies"
$STD apt install -y \
ffmpeg \
+ pciutils \
imagemagick
msg_ok "Installed Dependencies"
@@ -35,6 +35,7 @@ fetch_and_deploy_from_url "https://fileflows.com/downloads/zip" "/opt/fileflows"
$STD ln -svf /usr/bin/ffmpeg /usr/local/bin/ffmpeg
$STD ln -svf /usr/bin/ffprobe /usr/local/bin/ffprobe
+$STD rm -rf /opt/fileflows/Server/runtimes/win-*
read -r -p "${TAB3}Do you want to install FileFlows Server or Node? (S/N): " install_server
diff --git a/install/fireshare-install.sh b/install/fireshare-install.sh
new file mode 100644
index 000000000..982679c6e
--- /dev/null
+++ b/install/fireshare-install.sh
@@ -0,0 +1,174 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: SlaviΕ‘a AreΕΎina (tremor021)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/ShaneIsrael/fireshare
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+setup_hwaccel
+
+msg_info "Installing Dependencies"
+$STD apt install -y \
+ git \
+ build-essential \
+ cmake \
+ pkg-config \
+ yasm \
+ nasm \
+ libx264-dev \
+ libx265-dev \
+ libvpx-dev \
+ libaom-dev \
+ libopus-dev \
+ libvorbis-dev \
+ libass-dev \
+ libfreetype6-dev \
+ libmp3lame-dev \
+ nginx-extras \
+ supervisor \
+ libldap2-dev \
+ libsasl2-dev \
+ libssl-dev \
+ libffi-dev \
+ libc-dev
+msg_ok "Installed Dependencies"
+
+NODE_VERSION=24 setup_nodejs
+PYTHON_VERSION=3.14 setup_uv
+
+fetch_and_deploy_gh_release "fireshare" "ShaneIsrael/fireshare" "tarball"
+
+msg_info "Compiling SVT-AV1 (Patience)"
+cd /tmp
+$STD git clone --depth 1 --branch v1.8.0 https://gitlab.com/AOMediaCodec/SVT-AV1.git
+cd SVT-AV1/Build
+$STD cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
+$STD make -j$(nproc)
+$STD make install
+msg_ok "Compiled SVT-AV1"
+
+msg_info "Installing NVDEC headers"
+cd /tmp
+$STD git clone --depth 1 --branch n12.1.14.0 https://github.com/FFmpeg/nv-codec-headers.git
+cd nv-codec-headers
+$STD make install
+$STD ldconfig
+msg_ok "Installed NVDEC headers"
+
+msg_info "Compiling ffmpeg (Patience)"
+cd /tmp
+curl -fsSL https://ffmpeg.org/releases/ffmpeg-6.1.tar.xz -o "ffmpeg-6.1.tar.xz"
+$STD tar -xf ffmpeg-6.1.tar.xz
+cd ffmpeg-6.1
+$STD ./configure \
+ --prefix=/usr/local \
+ --enable-gpl \
+ --enable-version3 \
+ --enable-nonfree \
+ --enable-ffnvcodec \
+ --enable-libx264 \
+ --enable-libx265 \
+ --enable-libvpx \
+ --enable-libaom \
+ --enable-libopus \
+ --enable-libvorbis \
+ --enable-libmp3lame \
+ --enable-libass \
+ --enable-libfreetype \
+ --enable-libsvtav1 \
+ --disable-debug \
+ --disable-doc
+$STD make -j$(nproc)
+$STD make install
+$STD ldconfig
+msg_ok "Compiled ffmpeg"
+
+msg_info "Configuring Fireshare (Patience)"
+ADMIN_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+SECRET=$(openssl rand -base64 48)
+mkdir -p /opt/fireshare-{data,videos,images,processed}
+cd /opt/fireshare
+$STD uv venv
+$STD .venv/bin/python -m ensurepip --upgrade
+$STD .venv/bin/python -m pip install --upgrade --break-system-packages pip
+ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg
+ln -sf /usr/local/bin/ffprobe /usr/bin/ffprobe
+echo "/usr/local/lib" >/etc/ld.so.conf.d/usr-local.conf
+echo "/usr/local/cuda/lib64" >>/etc/ld.so.conf.d/usr-local.conf
+echo "/usr/local/nvidia/lib" >>/etc/ld.so.conf.d/nvidia.conf
+echo "/usr/local/nvidia/lib64" >>/etc/ld.so.conf.d/nvidia.conf
+ldconfig
+$STD .venv/bin/python -m pip install --no-cache-dir --break-system-packages --ignore-installed app/server
+cp .venv/bin/fireshare /usr/local/bin/fireshare
+export FLASK_APP="/opt/fireshare/app/server/fireshare:create_app()"
+export DATA_DIRECTORY=/opt/fireshare-data
+export IMAGE_DIRECTORY=/opt/fireshare-images
+export VIDEO_DIRECTORY=/opt/fireshare-videos
+export PROCESSED_DIRECTORY=/opt/fireshare-processed
+$STD uv run flask db upgrade
+
+cat </opt/fireshare/fireshare.env
+FLASK_APP="/opt/fireshare/app/server/fireshare:create_app()"
+DOMAIN=
+ENVIRONMENT=production
+DATA_DIRECTORY=/opt/fireshare-data
+IMAGE_DIRECTORY=/opt/fireshare-images
+VIDEO_DIRECTORY=/opt/fireshare-videos
+PROCESSED_DIRECTORY=/opt/fireshare-processed
+TEMPLATE_PATH=/opt/fireshare/app/server/fireshare/templates
+SECRET_KEY=${SECRET}
+ADMIN_PASSWORD=${ADMIN_PASSWORD}
+TZ=UTC
+LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/usr/local/lib:/usr/local/cuda/lib64:\$LD_LIBRARY_PATH
+PATH=/usr/local/bin:$PATH
+ENABLE_TRANSCODING=
+TRANSCODE_GPU=
+NVIDIA_DRIVER_CAPABILITIES=
+EOF
+
+cd /opt/fireshare/app/client
+$STD npm install
+$STD npm run build
+systemctl stop nginx
+cp /opt/fireshare/app/nginx/prod.conf /etc/nginx/nginx.conf
+sed -i 's|root /processed/|root /opt/fireshare-processed/|g' /etc/nginx/nginx.conf
+sed -i 's/^user[[:space:]]\+nginx;/user root;/' /etc/nginx/nginx.conf
+sed -i 's|root[[:space:]]\+/app/build;|root /opt/fireshare/app/client/build;|' /etc/nginx/nginx.conf
+systemctl start nginx
+
+cat <~/fireshare.creds
+Fireshare Admin Credentials
+========================
+Username: admin
+Password: ${ADMIN_PASSWORD}
+EOF
+msg_ok "Configured Fireshare"
+
+msg_info "Creating services"
+cat </etc/systemd/system/fireshare.service
+[Unit]
+Description=Fireshare Service
+After=network.target
+
+[Service]
+WorkingDirectory=/opt/fireshare/app/server
+ExecStart=/opt/fireshare/.venv/bin/gunicorn --bind=127.0.0.1:5000 "fireshare:create_app(init_schedule=True)" --workers 3 --threads 3 --preload
+Restart=always
+EnvironmentFile=/opt/fireshare/fireshare.env
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now fireshare
+msg_ok "Created services"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/foldergram-install.sh b/install/foldergram-install.sh
new file mode 100644
index 000000000..895a619a8
--- /dev/null
+++ b/install/foldergram-install.sh
@@ -0,0 +1,65 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: SlaviΕ‘a AreΕΎina (tremor021)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/foldergram/foldergram
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+msg_info "Installing Dependencies"
+$STD apt install -y --no-install-recommends ffmpeg
+msg_ok "Installed Dependencies"
+
+NODE_VERSION=25 NODE_MODULE="corepack" setup_nodejs
+
+fetch_and_deploy_gh_release "foldergram" "foldergram/foldergram" "tarball"
+
+msg_info "Configuring Foldergram"
+export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
+$STD corepack enable
+cd /opt/foldergram
+$STD pnpm install
+$STD pnpm run build
+mkdir -p /opt/foldergram_media
+cat </opt/foldergram_media/foldergram.env
+NODE_ENV=production
+SERVER_PORT=4141
+DATA_ROOT=/opt/foldergram_media
+GALLERY_ROOT=/opt/foldergram_media/gallery
+DB_DIR=/opt/foldergram_media/db
+THUMBNAILS_DIR=/opt/foldergram_media/thumbnails
+PREVIEWS_DIR=/opt/foldergram_media/previews
+IMAGE_DETAIL_SOURCE=preview
+DERIVATIVE_MODE=eager
+GALLERY_EXCLUDED_FOLDERS=
+EOF
+msg_ok "Configured Foldergram"
+
+msg_info "Creating services"
+cat </etc/systemd/system/foldergram.service
+[Unit]
+Description=Foldergram Service
+After=network.target
+
+[Service]
+WorkingDirectory=/opt/foldergram
+ExecStart=/usr/bin/pnpm start
+Restart=always
+EnvironmentFile=/opt/foldergram_media/foldergram.env
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now foldergram
+msg_ok "Created services"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/ghostfolio-install.sh b/install/ghostfolio-install.sh
index 2461ca3d4..d520e0021 100644
--- a/install/ghostfolio-install.sh
+++ b/install/ghostfolio-install.sh
@@ -25,25 +25,12 @@ PG_VERSION="17" setup_postgresql
NODE_VERSION="24" setup_nodejs
msg_info "Setting up Database"
-DB_NAME=ghostfolio
-DB_USER=ghostfolio
-DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+PG_DB_NAME="ghostfolio" PG_DB_USER="ghostfolio" PG_DB_SCHEMA_PERMS="true" setup_postgresql_db
REDIS_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
ACCESS_TOKEN_SALT=$(openssl rand -base64 32)
JWT_SECRET_KEY=$(openssl rand -base64 32)
-$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;"
-$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH ENCRYPTED 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 USER $DB_USER CREATEDB;"
-$STD sudo -u postgres psql -d $DB_NAME -c "GRANT ALL ON SCHEMA public TO $DB_USER;"
-$STD sudo -u postgres psql -d $DB_NAME -c "GRANT CREATE ON SCHEMA public TO $DB_USER;"
-$STD sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO $DB_USER;"
-$STD sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO $DB_USER;"
{
echo "Ghostfolio Credentials"
- echo "Database User: $DB_USER"
- echo "Database Password: $DB_PASS"
- echo "Database Name: $DB_NAME"
echo "Redis Password: $REDIS_PASS"
echo "Access Token Salt: $ACCESS_TOKEN_SALT"
echo "JWT Secret Key: $JWT_SECRET_KEY"
@@ -69,7 +56,7 @@ read -rp "${TAB3}CoinGecko Pro API key (press Enter to skip): " COINGECKO_PRO_KE
msg_info "Setting up Environment"
cat </opt/ghostfolio/.env
-DATABASE_URL=postgresql://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME?connect_timeout=300&sslmode=prefer
+DATABASE_URL=postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME?connect_timeout=300
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=$REDIS_PASS
diff --git a/install/gogs-install.sh b/install/gogs-install.sh
new file mode 100644
index 000000000..e58e1d36c
--- /dev/null
+++ b/install/gogs-install.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://gogs.io/
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+msg_info "Installing Dependencies"
+$STD apt install -y git
+msg_ok "Installed Dependencies"
+
+fetch_and_deploy_gh_release "gogs" "gogs/gogs" "prebuild" "latest" "/opt/gogs" "gogs_*_linux_amd64.tar.gz"
+
+msg_info "Setting up Gogs"
+mkdir -p /opt/gogs/{custom/conf,data,log}
+msg_ok "Set up Gogs"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/gogs.service
+[Unit]
+Description=Gogs Git Service
+After=network.target
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/gogs
+ExecStart=/opt/gogs/gogs web
+Restart=on-failure
+RestartSec=5
+Environment=USER=root
+Environment=HOME=/root
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now gogs
+msg_ok "Created Service"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/homelable-install.sh b/install/homelable-install.sh
index 7146cd24e..e356ab5c8 100644
--- a/install/homelable-install.sh
+++ b/install/homelable-install.sh
@@ -66,7 +66,7 @@ sed -i "s|^AUTH_PASSWORD_HASH=.*|AUTH_PASSWORD_HASH='${HASH}'|" /opt/homelable/b
systemctl restart homelable
echo "Password updated and service restarted successfully!"
EOF
-chmod +x /opt/homelable/change_password.sh
+chmod +x /root/change_password.sh
msg_ok "Created Password Reset Utility"
msg_info "Building Frontend"
diff --git a/install/jitsi-meet-install.sh b/install/jitsi-meet-install.sh
new file mode 100644
index 000000000..4d24339d6
--- /dev/null
+++ b/install/jitsi-meet-install.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://jitsi.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 install -y nginx
+msg_ok "Installed Dependencies"
+
+source /etc/os-release
+setup_deb822_repo "jitsi" \
+ "https://download.jitsi.org/jitsi-key.gpg.key" \
+ "https://download.jitsi.org" \
+ "stable/" \
+ ""
+
+msg_info "Installing Jitsi Meet"
+echo "jitsi-videobridge2 jitsi-videobridge/jvb-hostname string ${LOCAL_IP}" | debconf-set-selections
+echo "jitsi-meet-web-config jitsi-meet/cert-choice select Generate a new self-signed certificate" | debconf-set-selections
+DEBIAN_FRONTEND=noninteractive $STD apt install -y jitsi-meet
+msg_ok "Installed Jitsi Meet"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/linkding-install.sh b/install/linkding-install.sh
index a77509d83..88ed1d433 100644
--- a/install/linkding-install.sh
+++ b/install/linkding-install.sh
@@ -27,7 +27,7 @@ msg_ok "Installed Dependencies"
NODE_VERSION="22" setup_nodejs
setup_uv
-fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding"
+fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding" "tarball"
msg_info "Building Frontend"
cd /opt/linkding
diff --git a/install/mini-qr-install.sh b/install/mini-qr-install.sh
new file mode 100644
index 000000000..1bfa0728b
--- /dev/null
+++ b/install/mini-qr-install.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: doge0420
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/lyqht/mini-qr
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+msg_info "Installing Dependencies"
+$STD apt install -y \
+ libharfbuzz0b \
+ caddy \
+ fontconfig
+msg_ok "Installed Dependencies"
+
+NODE_VERSION="20" setup_nodejs
+fetch_and_deploy_gh_release "mini-qr" "lyqht/mini-qr" "tarball"
+
+msg_info "Building MiniQR"
+cd /opt/mini-qr
+$STD npm install
+$STD npm run build
+msg_ok "Built MiniQR"
+
+msg_info "Configuring Caddy"
+cat </etc/caddy/Caddyfile
+:80 {
+ root * /opt/mini-qr/dist
+ file_server
+
+ # Handle client-side routing
+ try_files {path} /index.html
+
+ # Cache static assets
+ @assets {
+ path /assets/*
+ }
+ header @assets Cache-Control "public, immutable, max-age=31536000"
+
+ # Correct MIME types for JS modules
+ @jsmodules {
+ path *.js *.mjs
+ }
+ header @jsmodules Content-Type "application/javascript"
+}
+EOF
+systemctl enable -q --now caddy
+systemctl reload caddy
+msg_ok "Configured Caddy"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/minthcm-install.sh b/install/minthcm-install.sh
new file mode 100644
index 000000000..d9d5071bd
--- /dev/null
+++ b/install/minthcm-install.sh
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MintHCM
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/minthcm/minthcm
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+PHP_VERSION="8.2"
+PHP_APACHE="YES" PHP_MODULE="mysql,redis" PHP_FPM="YES" setup_php
+setup_composer
+setup_mariadb
+$STD mariadb -u root -e "SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'"
+
+fetch_and_deploy_gh_release "MintHCM" "minthcm/minthcm" "tarball" "latest" "/var/www/MintHCM"
+
+msg_info "Configuring MintHCM"
+mkdir -p /etc/php/${PHP_VERSION}/mods-available
+cp /var/www/MintHCM/docker/config/000-default.conf /etc/apache2/sites-available/000-default.conf
+cp /var/www/MintHCM/docker/config/php-minthcm.ini /etc/php/${PHP_VERSION}/mods-available/php-minthcm.ini
+mkdir -p "/etc/php/${PHP_VERSION}/cli/conf.d" "/etc/php/${PHP_VERSION}/apache2/conf.d"
+ln -s "/etc/php/${PHP_VERSION}/mods-available/php-minthcm.ini" "/etc/php/${PHP_VERSION}/cli/conf.d/20-minthcm.ini"
+ln -s "/etc/php/${PHP_VERSION}/mods-available/php-minthcm.ini" "/etc/php/${PHP_VERSION}/apache2/conf.d/20-minthcm.ini"
+chown -R www-data:www-data /var/www/MintHCM
+find /var/www/MintHCM -type d -exec chmod 755 {} \;
+find /var/www/MintHCM -type f -exec chmod 644 {} \;
+mkdir -p /var/www/script
+cp /var/www/MintHCM/docker/script/generate_config.php /var/www/script/generate_config.php
+cp /var/www/MintHCM/docker/.env /var/www/script/.env
+chown -R www-data:www-data /var/www/script
+$STD a2enmod rewrite
+$STD a2enmod headers
+$STD systemctl restart apache2
+msg_ok "Configured MintHCM"
+
+msg_info "Setting up Elasticsearch"
+setup_deb822_repo \
+ "elasticsearch" \
+ "https://artifacts.elastic.co/GPG-KEY-elasticsearch" \
+ "https://artifacts.elastic.co/packages/7.x/apt" \
+ "stable"
+$STD apt install -y elasticsearch
+echo "-Xms2g" >>/etc/elasticsearch/jvm.options
+echo "-Xmx2g" >>/etc/elasticsearch/jvm.options
+$STD /usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-attachment -b
+systemctl enable -q --now elasticsearch
+msg_ok "Set up Elasticsearch"
+
+msg_info "Configuring Database"
+DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
+$STD mariadb -u root -e "CREATE USER 'minthcm'@'localhost' IDENTIFIED BY '${DB_PASS}';"
+$STD mariadb -u root -e "GRANT ALL ON *.* TO 'minthcm'@'localhost'; FLUSH PRIVILEGES;"
+sed -i "s/^DB_HOST=.*/DB_HOST=localhost/" /var/www/script/.env
+sed -i "s/^DB_USER=.*/DB_USER=minthcm/" /var/www/script/.env
+sed -i "s/^DB_PASS=.*/DB_PASS=$DB_PASS/" /var/www/script/.env
+sed -i "s/^ELASTICSEARCH_HOST=.*/ELASTICSEARCH_HOST=localhost/" /var/www/script/.env
+msg_ok "Configured Database"
+
+msg_info "Generating configuration file"
+set -a
+source /var/www/script/.env
+set +a
+$STD php /var/www/script/generate_config.php
+msg_ok "Generated configuration file"
+
+msg_info "Installing MintHCM"
+cd /var/www/MintHCM
+$STD sudo -u www-data php MintCLI install /dev/null 2>&1\n" >/var/spool/cron/crontabs/www-data
+service cron start
+rm -f /var/www/MintHCM/configMint4
+msg_ok "Installed MintHCM"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/nodecast-tv-install.sh b/install/nodecast-tv-install.sh
index d4b3652bd..ecbb2e4c3 100644
--- a/install/nodecast-tv-install.sh
+++ b/install/nodecast-tv-install.sh
@@ -13,7 +13,7 @@ setting_up_container
network_check
update_os
-fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv"
+fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv" "tarball"
NODE_VERSION="20" setup_nodejs
msg_info "Installing Dependencies"
diff --git a/install/opencloud-install.sh b/install/opencloud-install.sh
index f98394514..8181eb060 100644
--- a/install/opencloud-install.sh
+++ b/install/opencloud-install.sh
@@ -64,7 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA
echo "$COOLPASS" >~/.coolpass
msg_ok "Installed Collabora Online"
-fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v6.0.0" "/usr/bin" "opencloud-*-linux-amd64"
+fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v6.1.0" "/usr/bin" "opencloud-*-linux-amd64"
mv /usr/bin/OpenCloud /usr/bin/opencloud
msg_info "Configuring OpenCloud"
diff --git a/install/ownfoil-install.sh b/install/ownfoil-install.sh
new file mode 100644
index 000000000..6717cfbe4
--- /dev/null
+++ b/install/ownfoil-install.sh
@@ -0,0 +1,52 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: pajjski
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/a1ex4/ownfoil
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+msg_info "Installing Dependencies"
+$STD apt install -y git
+msg_ok "Installed Dependencies"
+
+setup_uv
+fetch_and_deploy_gh_release "ownfoil" "a1ex4/ownfoil" "tarball"
+
+msg_info "Setting up Ownfoil"
+cd /opt/ownfoil
+$STD uv venv .venv
+$STD source .venv/bin/activate
+$STD uv pip install -r requirements.txt
+msg_ok "Setup ownfoil"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/ownfoil.service
+[Unit]
+Description=ownfoil Service
+After=network.target
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/ownfoil
+ExecStart=/opt/ownfoil/.venv/bin/python /opt/ownfoil/app/app.py
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now ownfoil
+msg_ok "Created Service"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/patchmon-install.sh b/install/patchmon-install.sh
index eb9911591..914591719 100644
--- a/install/patchmon-install.sh
+++ b/install/patchmon-install.sh
@@ -14,74 +14,90 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y \
- build-essential \
- nginx \
- redis-server
+$STD apt install -y redis-server
msg_ok "Installed Dependencies"
-NODE_VERSION="24" setup_nodejs
PG_VERSION="17" setup_postgresql
PG_DB_NAME="patchmon_db" PG_DB_USER="patchmon_usr" setup_postgresql_db
-fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "tarball" "v1.4.2" "/opt/patchmon"
+RELEASE="v2.0.1"
+fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "singlefile" "$RELEASE" "/opt/patchmon" "patchmon-server-linux-amd64"
+mv /opt/patchmon/PatchMon /opt/patchmon/patchmon-server
msg_info "Configuring PatchMon"
-VERSION=$(get_latest_github_release "PatchMon/PatchMon")
-export NODE_ENV=production
-cd /opt/patchmon
-$STD npm install --no-audit --no-fund --no-save --ignore-scripts
-
-cd /opt/patchmon/frontend
-cat <./.env
-VITE_APP_NAME=PatchMon
-VITE_APP_VERSION=${VERSION}
-EOF
-$STD npm install --no-audit --no-fund --no-save --ignore-scripts --include=dev
-$STD npm run build
-
+cat </opt/patchmon/.env
+DATABASE_URL="postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME"
JWT_SECRET="$(openssl rand -hex 64)"
-mv /opt/patchmon/backend/env.example /opt/patchmon/backend/.env
-sed -i -e "s|DATABASE_URL=.*|DATABASE_URL=\"postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME\"|" \
- -e "/JWT_SECRET/s/[=$].*/=$JWT_SECRET/" \
- -e "\|CORS_ORIGIN|s|localhost|$LOCAL_IP|" \
- -e "/PORT=3001/aSERVER_PROTOCOL=http \\
- SERVER_HOST=$LOCAL_IP \\
- SERVER_PORT=3000" \
- -e '/_ENV=production/aTRUST_PROXY=1' \
- -e '/REDIS_USER=.*/,+1d' /opt/patchmon/backend/.env
+SESSION_SECRET="$(openssl rand -hex 64)"
+AI_ENCRYPTION_KEY="$(openssl rand -hex 64)"
+CORS_ORIGIN=http://${LOCAL_IP}:3000
+PORT=3000
+APP_ENV=production
-cd /opt/patchmon/backend
-$STD npm run db:generate
-$STD npx prisma migrate deploy
+# Redis
+REDIS_HOST=localhost
+REDIS_PORT=6379
+
+## OIDC / SSO (when OIDC_ENABLED=true, issuer/client/secret/redirect required)
+# OIDC_ENABLED=false
+# OIDC_ISSUER_URL=
+# OIDC_CLIENT_ID=
+# OIDC_CLIENT_SECRET=
+# OIDC_REDIRECT_URI=
+# OIDC_SCOPES=openid email profile groups
+# OIDC_AUTO_CREATE_USERS=false
+# OIDC_DEFAULT_ROLE=user
+# OIDC_DISABLE_LOCAL_AUTH=false
+# OIDC_BUTTON_TEXT=Login with SSO
+# OIDC_SESSION_TTL=600
+# OIDC_POST_LOGOUT_URI=
+# OIDC_SYNC_ROLES=false
+# OIDC_ADMIN_GROUP=
+# OIDC_SUPERADMIN_GROUP=
+# OIDC_HOST_MANAGER_GROUP=
+# OIDC_READONLY_GROUP=
+# OIDC_USER_GROUP=
+# OIDC_ENFORCE_HTTPS=true
+
+AGENT_BINARIES_DIR=/opt/patchmon/agents
+EOF
msg_ok "Configured PatchMon"
-msg_info "Configuring Nginx"
-cp /opt/patchmon/docker/nginx.conf.template /etc/nginx/sites-available/patchmon.conf
-sed -i -e 's|proxy_pass .*|proxy_pass http://127.0.0.1:3001;|' \
- -e '\|try_files |i\ root /opt/patchmon/frontend/dist;' \
- -e 's|alias.*|alias /opt/patchmon/frontend/dist/assets;|' \
- -e '\|expires 1y|i\ root /opt/patchmon/frontend/dist;' /etc/nginx/sites-available/patchmon.conf
-ln -sf /etc/nginx/sites-available/patchmon.conf /etc/nginx/sites-enabled/
-rm -f /etc/nginx/sites-enabled/default
-$STD nginx -t
-systemctl restart nginx
-msg_ok "Configured Nginx"
+msg_info "Fetching PatchMon agent binaries"
+mkdir -p /opt/patchmon/agents
+FILE_URL="https://github.com/PatchMon/PatchMon/releases/download/${RELEASE}/patchmon-agent-"
+AGENT_NAME=(
+ "linux-amd64"
+ "linux-arm64"
+ "linux-arm"
+ "linux-386"
+ "freebsd-amd64"
+ "freebsd-arm64"
+ "freebsd-arm"
+ "freebsd-386"
+ "windows-amd64.exe"
+ "windows-arm64.exe"
+)
+for arch in "${AGENT_NAME[@]}"; do
+ curl_with_retry "${FILE_URL}${arch}" "/opt/patchmon/agents/patchmon-agent-${arch}"
+ [[ "${arch}" != *.exe ]] && chmod 755 "/opt/patchmon/agents/patchmon-agent-${arch}"
+done
+msg_ok "Fetched PatchMon agent binaries"
msg_info "Creating service"
cat </etc/systemd/system/patchmon-server.service
[Unit]
-Description=PatchMon Service
+Description=PatchMon Server
After=network.target postgresql.service
[Service]
Type=simple
-WorkingDirectory=/opt/patchmon/backend
-ExecStart=/usr/bin/npm run start
+WorkingDirectory=/opt/patchmon
+ExecStart=/opt/patchmon/patchmon-server
Restart=always
RestartSec=10
-Environment=NODE_ENV=production
Environment=PATH=/usr/bin:/usr/local/bin
+EnvironmentFile=/opt/patchmon/.env
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
diff --git a/install/romm-install.sh b/install/romm-install.sh
index eab5ce485..515355110 100644
--- a/install/romm-install.sh
+++ b/install/romm-install.sh
@@ -120,7 +120,7 @@ fetch_and_deploy_gh_release "RAHasher" "RetroAchievements/RALibretro" "prebuild"
cp /opt/RALibretro/RAHasher /usr/bin/RAHasher
chmod +x /usr/bin/RAHasher
-fetch_and_deploy_gh_release "romm" "rommapp/romm"
+fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball"
msg_info "Creating environment file"
sed -i 's/^supervised no/supervised systemd/' /etc/redis/redis.conf
diff --git a/install/technitiumdns-install.sh b/install/technitiumdns-install.sh
index b26e06071..f38de6cae 100644
--- a/install/technitiumdns-install.sh
+++ b/install/technitiumdns-install.sh
@@ -20,21 +20,18 @@ setup_deb822_repo \
"https://packages.microsoft.com/debian/13/prod/" \
"trixie" \
"main"
-$STD apt install -y aspnetcore-runtime-9.0
+$STD apt install -y aspnetcore-runtime-10.0
msg_ok "Installed Dependencies"
RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+')
-msg_info "Installing Technitium DNS"
-mkdir -p /opt/technitium/dns
-curl -fsSL "https://download.technitium.com/dns/DnsServerPortable.tar.gz" -o /opt/DnsServerPortable.tar.gz
-$STD tar zxvf /opt/DnsServerPortable.tar.gz -C /opt/technitium/dns/
-rm -f /opt/DnsServerPortable.tar.gz
+fetch_and_deploy_from_url "https://download.technitium.com/dns/DnsServerPortable.tar.gz" /opt/technitium/dns
echo "${RELEASE}" >~/.technitium
-msg_ok "Installed Technitium DNS"
msg_info "Creating service"
+mkdir -p /etc/dns /var/log/technitium/dns
+sed -i '/^User=/d;/^Group=/d' /opt/technitium/dns/systemd.service
cp /opt/technitium/dns/systemd.service /etc/systemd/system/technitium.service
-systemctl enable -q --now technitium
+systemctl enable -q --now technitium
msg_ok "Service created"
motd_ssh
diff --git a/install/termix-install.sh b/install/termix-install.sh
index 557e71e8c..f152ebb3d 100644
--- a/install/termix-install.sh
+++ b/install/termix-install.sh
@@ -55,7 +55,7 @@ rm -rf /opt/guacamole-server
msg_ok "Built Guacamole Server (guacd)"
NODE_VERSION="22" setup_nodejs
-fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
+fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
msg_info "Building Frontend"
cd /opt/termix
diff --git a/install/transmute-install.sh b/install/transmute-install.sh
new file mode 100644
index 000000000..a3b83d72d
--- /dev/null
+++ b/install/transmute-install.sh
@@ -0,0 +1,100 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/transmute-app/transmute
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+UV_PYTHON="3.13" setup_uv
+NODE_VERSION="25" setup_nodejs
+setup_ffmpeg
+setup_gs
+
+msg_info "Installing Dependencies"
+$STD apt install -y \
+ inkscape \
+ tesseract-ocr \
+ libreoffice-impress \
+ libreoffice-common \
+ libmagic1 \
+ xvfb \
+ libsm6 \
+ libxext6 \
+ libpango-1.0-0 \
+ libopengl0 \
+ libpangocairo-1.0-0 \
+ libgdk-pixbuf-2.0-0 \
+ libffi-dev \
+ libcairo2 \
+ librsvg2-bin \
+ unrar-free \
+ python3-numpy \
+ python3-lxml \
+ python3-tinycss2 \
+ python3-cssselect
+msg_ok "Installed Dependencies"
+
+fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-amd64.deb"
+fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-x86_64.txz"
+ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert
+ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg
+fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-amd64-*.deb"
+fetch_and_deploy_gh_release "transmute" "transmute-app/transmute" "tarball"
+
+msg_info "Setting up Python Backend"
+cd /opt/transmute
+$STD uv venv --clear /opt/transmute/.venv
+$STD uv pip install --python /opt/transmute/.venv/bin/python -r requirements.txt
+ln -sf /opt/transmute/.venv/bin/weasyprint /usr/bin/weasyprint
+msg_ok "Set up Python Backend"
+
+msg_info "Configuring Transmute"
+SECRET_KEY=$(openssl rand -hex 64)
+cat </opt/transmute/backend/.env
+AUTH_SECRET_KEY=${SECRET_KEY}
+HOST=0.0.0.0
+PORT=3313
+DATA_DIR=/opt/transmute/data
+WEB_DIR=/opt/transmute/frontend/dist
+QT_QPA_PLATFORM=offscreen
+EOF
+mkdir -p /opt/transmute/data
+msg_ok "Configured Transmute"
+
+msg_info "Building Frontend"
+cd /opt/transmute/frontend
+$STD npm ci
+$STD npm run build
+msg_ok "Built Frontend"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/transmute.service
+[Unit]
+Description=Transmute File Converter
+After=network.target
+
+[Service]
+Type=simple
+WorkingDirectory=/opt/transmute
+EnvironmentFile=/opt/transmute/backend/.env
+ExecStart=/usr/bin/xvfb-run -a -s "-screen 0 1024x768x24 -nolisten tcp" /opt/transmute/.venv/bin/python backend/main.py
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now transmute
+msg_ok "Created Service"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/trek-install.sh b/install/trek-install.sh
new file mode 100644
index 000000000..535597f8a
--- /dev/null
+++ b/install/trek-install.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ)
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/mauriceboe/TREK
+
+source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
+color
+verb_ip6
+catch_errors
+setting_up_container
+network_check
+update_os
+
+msg_info "Installing Dependencies"
+$STD apt install -y build-essential
+msg_ok "Installed Dependencies"
+
+NODE_VERSION="22" setup_nodejs
+fetch_and_deploy_gh_release "trek" "mauriceboe/TREK" "tarball"
+
+msg_info "Building Client"
+cd /opt/trek/client
+$STD npm ci
+$STD npm run build
+msg_ok "Built Client"
+
+msg_info "Setting up Server"
+cd /opt/trek/server
+$STD npm ci
+mkdir -p /opt/trek/server/public
+cp -r /opt/trek/client/dist/* /opt/trek/server/public/
+cp -r /opt/trek/client/public/fonts /opt/trek/server/public/fonts 2>/dev/null || true
+mkdir -p /opt/trek/{data/logs,uploads/{files,covers,avatars,photos}}
+rm -rf /opt/trek/server/data /opt/trek/server/uploads
+ln -s /opt/trek/data /opt/trek/server/data
+ln -s /opt/trek/uploads /opt/trek/server/uploads
+ENCRYPTION_KEY=$(openssl rand -hex 32)
+ADMIN_EMAIL="admin@trek.local"
+ADMIN_PASSWORD=$(openssl rand -base64 18 | tr -dc 'A-Za-z0-9' | head -c 16)
+cat </opt/trek/server/.env
+NODE_ENV=production
+PORT=3000
+ENCRYPTION_KEY=${ENCRYPTION_KEY}
+ADMIN_EMAIL=${ADMIN_EMAIL}
+ADMIN_PASSWORD=${ADMIN_PASSWORD}
+COOKIE_SECURE=false
+FORCE_HTTPS=false
+LOG_LEVEL=info
+TZ=UTC
+EOF
+chmod 600 /opt/trek/server/.env
+msg_ok "Set up Server"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/trek.service
+[Unit]
+Description=TREK Travel Planner
+After=network.target
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/trek/server
+EnvironmentFile=/opt/trek/server/.env
+ExecStart=/usr/bin/node --import tsx src/index.ts
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now trek
+msg_ok "Created Service"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/misc/build.func b/misc/build.func
index 56c247e82..20cd33489 100644
--- a/misc/build.func
+++ b/misc/build.func
@@ -5376,13 +5376,59 @@ create_lxc_container() {
# Offer upgrade for pve-container/lxc-pve if candidate > installed; optional auto-retry pct create
# Returns:
- # 0 = no upgrade needed / container created after upgrade or fallback
+ # 0 = no upgrade needed / container created after upgrade or explicit fallback
# 1 = upgraded (and if do_retry=yes and retry succeeded, creation done)
- # 2 = user declined
+ # 2 = user chose ignore
# 3 = upgrade attempted but failed OR retry failed
+ # 4 = user cancelled
offer_lxc_stack_upgrade_and_maybe_retry() {
local do_retry="${1:-no}" # yes|no
local _pvec_i _pvec_c _lxcp_i _lxcp_c need=0
+ local _ans
+
+ has_previous_os_version_template() {
+ local os_type="${PCT_OSTYPE:-}"
+ local current_ver="${PCT_OSVERSION:-}"
+ local tpl_pattern="${TEMPLATE_PATTERN:-${TEMPLATE:-}}"
+ local -a all_versions=()
+
+ [[ -n "$os_type" && -n "$current_ver" ]] || return 1
+
+ mapfile -t _local_vers < <(
+ pveam list "$TEMPLATE_STORAGE" 2>/dev/null |
+ awk '{print $1}' |
+ sed 's|.*/||' |
+ grep -E "^${os_type}-[0-9]" |
+ { [[ -n "$tpl_pattern" ]] && grep "$tpl_pattern" || cat; } |
+ sed -E "s/^${os_type}-([0-9]+(\.[0-9]+)?).*/\1/" |
+ sort -u -V
+ )
+ all_versions+=("${_local_vers[@]}")
+
+ if command -v timeout &>/dev/null; then
+ timeout 30 pveam update >/dev/null 2>&1 || true
+ else
+ pveam update >/dev/null 2>&1 || true
+ fi
+ mapfile -t _online_vers < <(
+ pveam available -section system 2>/dev/null |
+ awk '{print $2}' |
+ grep -E "^${os_type}-[0-9]" |
+ { [[ -n "$tpl_pattern" ]] && grep "$tpl_pattern" || cat; } |
+ sed -E "s/^${os_type}-([0-9]+(\.[0-9]+)?).*/\1/" |
+ sort -u -V 2>/dev/null || true
+ )
+ all_versions+=("${_online_vers[@]}")
+
+ printf '%s\n' "${all_versions[@]}" | sort -u -V | awk -v cur="$current_ver" '
+ {
+ split($0, a, ".")
+ split(cur, b, ".")
+ if (a[1]+0 < b[1]+0) found=1
+ }
+ END { exit found ? 0 : 1 }
+ '
+ }
_pvec_i="$(pkg_ver pve-container)"
_lxcp_i="$(pkg_ver lxc-pve)"
@@ -5403,19 +5449,25 @@ create_lxc_container() {
msg_warn "An update for the Proxmox LXC stack is available"
echo " pve-container: installed=${_pvec_i:-n/a} candidate=${_pvec_c:-n/a}"
echo " lxc-pve : installed=${_lxcp_i:-n/a} candidate=${_lxcp_c:-n/a}"
+ echo " note : option 1 runs host apt update + apt upgrade"
echo
# Offer older OS version fallback when template version might be too new for LXC stack
local _has_fallback_option=false
- if [[ -n "${PCT_OSTYPE:-}" && -n "${PCT_OSVERSION:-}" ]]; then
+ if [[ "$do_retry" == "yes" ]] && has_previous_os_version_template; then
_has_fallback_option=true
- echo " [1] Upgrade LXC stack now (recommended)"
+ echo " [1] Run host upgrade now (recommended). WARNING: this runs apt upgrade and updates all Packages on your host!"
echo " [2] Use an older ${PCT_OSTYPE} template instead (may not work with all scripts)"
+ echo " [3] Ignore"
+ echo " [4] Cancel"
+ echo
+ read -rp "Select option [1/2/3/4]: " _ans /dev/null; then
msg_error "LXC stack upgrade caused PVE tool breakage (likely Perl module incompatibility)."
msg_custom "β οΈ" "${YW}" "A partial package upgrade has left the PVE stack in an inconsistent state."
msg_custom "π§" "${YW}" "Please run the following on the Proxmox host, then retry:"
- echo -e "${TAB} apt update && apt dist-upgrade -y"
+ echo -e "${TAB} apt update && apt upgrade -y"
echo -e "${TAB} reboot"
return 3
fi
@@ -6061,16 +6126,20 @@ create_lxc_container() {
rc=$?
case $rc in
0) : ;; # success - container created, continue
- 2 | 3)
- # Upgrade declined or failed β try older OS version as last resort
- msg_warn "Attempting older ${PCT_OSTYPE:-} version as last resort"
- if fallback_to_previous_os_version; then
- : # success
- else
- msg_error "All recovery options exhausted. Please inspect: $LOGFILE"
- _flush_pct_log
- exit 231
- fi
+ 2)
+ msg_error "LXC stack upgrade ignored. Please inspect: $LOGFILE"
+ _flush_pct_log
+ exit 231
+ ;;
+ 3)
+ msg_error "LXC stack upgrade failed. Please inspect: $LOGFILE"
+ _flush_pct_log
+ exit 231
+ ;;
+ 4)
+ msg_error "Cancelled by user."
+ _flush_pct_log
+ exit 231
;;
esac
else
@@ -6094,16 +6163,20 @@ create_lxc_container() {
rc=$?
case $rc in
0) : ;; # success - container created, continue
- 2 | 3)
- # Upgrade declined or failed β try older OS version as last resort
- msg_warn "Attempting older ${PCT_OSTYPE:-} version as last resort"
- if fallback_to_previous_os_version; then
- : # success
- else
- msg_error "All recovery options exhausted. Please inspect: $LOGFILE"
- _flush_pct_log
- exit 231
- fi
+ 2)
+ msg_error "LXC stack upgrade ignored. Please inspect: $LOGFILE"
+ _flush_pct_log
+ exit 231
+ ;;
+ 3)
+ msg_error "LXC stack upgrade failed. Please inspect: $LOGFILE"
+ _flush_pct_log
+ exit 231
+ ;;
+ 4)
+ msg_error "Cancelled by user."
+ _flush_pct_log
+ exit 231
;;
esac
else
diff --git a/misc/error_handler.func b/misc/error_handler.func
index dd816dc22..50e8dac42 100644
--- a/misc/error_handler.func
+++ b/misc/error_handler.func
@@ -313,6 +313,51 @@ error_handler() {
echo -e "${TAB}-----------------------------------\n"
fi
+ # Detect probable Node.js heap OOM and print actionable guidance.
+ # This avoids generic SIGABRT/SIGKILL confusion for frontend build failures.
+ local node_oom_detected="false"
+ local node_build_context="false"
+ if [[ "$command" =~ (npm|pnpm|yarn|node|vite|turbo) ]]; then
+ node_build_context="true"
+ fi
+ if [[ "$exit_code" == "243" ]]; then
+ node_oom_detected="true"
+ elif [[ -n "$active_log" && -s "$active_log" ]]; then
+ if tail -n 200 "$active_log" 2>/dev/null | grep -Eqi 'Reached heap limit|JavaScript heap out of memory|Allocation failed - JavaScript heap out of memory|FATAL ERROR: Reached heap limit'; then
+ node_oom_detected="true"
+ fi
+ fi
+
+ if [[ "$node_oom_detected" == "true" ]] || { [[ "$node_build_context" == "true" ]] && [[ "$exit_code" =~ ^(134|137)$ ]]; }; then
+ local heap_hint_mb=""
+
+ # If explicitly configured, prefer the current value for troubleshooting output.
+ if [[ -n "${NODE_OPTIONS:-}" ]] && [[ "${NODE_OPTIONS}" =~ max-old-space-size=([0-9]+) ]]; then
+ heap_hint_mb="${BASH_REMATCH[1]}"
+ elif [[ -n "${var_ram:-}" ]] && [[ "${var_ram}" =~ ^[0-9]+$ ]]; then
+ heap_hint_mb=$((var_ram * 75 / 100))
+ else
+ local mem_kb=""
+ mem_kb=$(awk '/^MemTotal:/ {print $2; exit}' /proc/meminfo 2>/dev/null || echo "")
+ if [[ "$mem_kb" =~ ^[0-9]+$ ]]; then
+ local mem_mb=$((mem_kb / 1024))
+ heap_hint_mb=$((mem_mb * 75 / 100))
+ fi
+ fi
+
+ if [[ -z "$heap_hint_mb" ]] || ((heap_hint_mb < 1024)); then
+ heap_hint_mb=1024
+ elif ((heap_hint_mb > 12288)); then
+ heap_hint_mb=12288
+ fi
+
+ if declare -f msg_warn >/dev/null 2>&1; then
+ msg_warn "Possible Node.js heap OOM. Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" and rerun the build."
+ else
+ echo -e "${YW}Possible Node.js heap OOM. Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" and rerun the build.${CL}"
+ fi
+ fi
+
# Detect context: Container (INSTALL_LOG set + inside container /root) vs Host
if [[ -n "${INSTALL_LOG:-}" && -f "${INSTALL_LOG:-}" && -d /root ]]; then
# CONTAINER CONTEXT: Copy log and create flag file for host
diff --git a/misc/tools.func b/misc/tools.func
index aa9bf4fed..8c2139c4c 100644
--- a/misc/tools.func
+++ b/misc/tools.func
@@ -1924,8 +1924,8 @@ setup_deb822_repo() {
echo "Types: deb"
echo "URIs: $repo_url"
echo "Suites: $suite"
- # Flat repositories (suite="./" or absolute path) must not have Components
- if [[ "$suite" != "./" && -n "$component" ]]; then
+ # Flat repositories (suite ending with "/" or "./") must not have Components
+ if [[ "$suite" != *"/" && -n "$component" ]]; then
echo "Components: $component"
fi
[[ -n "$architectures" ]] && echo "Architectures: $architectures"
@@ -4011,9 +4011,14 @@ function setup_ffmpeg() {
DEPS+=(
libx264-dev libx265-dev libvpx-dev libmp3lame-dev
libfreetype6-dev libass-dev libopus-dev libvorbis-dev
- libdav1d-dev libsvtav1-dev zlib1g-dev libnuma-dev
+ libdav1d-dev zlib1g-dev libnuma-dev
libva-dev libdrm-dev
)
+ if apt-cache show libsvtav1enc-dev &>/dev/null; then
+ DEPS+=(libsvtav1enc-dev)
+ elif apt-cache show libsvtav1-dev &>/dev/null; then
+ DEPS+=(libsvtav1-dev)
+ fi
;;
*)
msg_error "Invalid FFMPEG_TYPE: $TYPE"
@@ -6336,12 +6341,15 @@ function setup_nodejs() {
}
fi
- # Scenario 1: Already installed at target version - just update packages/modules
+ # Scenario 1: Already installed at target version - upgrade to latest minor/patch + update packages/modules
if [[ -n "$CURRENT_NODE_VERSION" && "$CURRENT_NODE_VERSION" == "$NODE_VERSION" ]]; then
msg_info "Update Node.js $NODE_VERSION"
ensure_apt_working || return 100
+ # Upgrade to the latest minor/patch release from NodeSource
+ $STD apt-get install -y --only-upgrade nodejs 2>/dev/null || true
+
# Pin npm to 11.11.0 to work around Node.js 22.22.2 regression (nodejs/node#62425)
$STD npm install -g npm@11.11.0 2>/dev/null || true
@@ -6420,7 +6428,37 @@ function setup_nodejs() {
msg_ok "Setup Node.js $NODE_VERSION"
fi
- export NODE_OPTIONS="--max-old-space-size=4096"
+ # Set a safe default heap limit for Node.js builds if not explicitly provided.
+ # Priority:
+ # 1) NODE_OPTIONS (caller/user override)
+ # 2) NODE_MAX_OLD_SPACE_SIZE (explicit MB override)
+ # 3) var_ram (LXC memory setting, MB)
+ # 4) /proc/meminfo (runtime memory detection)
+ # Auto value is clamped to 1024..12288 MB.
+ if [[ -z "${NODE_OPTIONS:-}" ]]; then
+ local node_heap_mb=""
+
+ if [[ -n "${NODE_MAX_OLD_SPACE_SIZE:-}" ]] && [[ "${NODE_MAX_OLD_SPACE_SIZE}" =~ ^[0-9]+$ ]]; then
+ node_heap_mb="${NODE_MAX_OLD_SPACE_SIZE}"
+ elif [[ -n "${var_ram:-}" ]] && [[ "${var_ram}" =~ ^[0-9]+$ ]]; then
+ node_heap_mb=$((var_ram * 75 / 100))
+ else
+ local total_mem_kb=""
+ total_mem_kb=$(awk '/^MemTotal:/ {print $2; exit}' /proc/meminfo 2>/dev/null || echo "")
+ if [[ "$total_mem_kb" =~ ^[0-9]+$ ]]; then
+ local total_mem_mb=$((total_mem_kb / 1024))
+ node_heap_mb=$((total_mem_mb * 75 / 100))
+ fi
+ fi
+
+ if [[ -z "$node_heap_mb" ]] || ((node_heap_mb < 1024)); then
+ node_heap_mb=1024
+ elif ((node_heap_mb > 12288)); then
+ node_heap_mb=12288
+ fi
+
+ export NODE_OPTIONS="--max-old-space-size=${node_heap_mb}"
+ fi
# Ensure valid working directory for npm (avoids uv_cwd error)
if [[ ! -d /opt ]]; then
diff --git a/tools/pve/post-pbs-install.sh b/tools/pve/post-pbs-install.sh
index 47100948e..80b3cc838 100644
--- a/tools/pve/post-pbs-install.sh
+++ b/tools/pve/post-pbs-install.sh
@@ -65,6 +65,14 @@ component_exists_in_sources() {
grep -h -E "^[^#]*Components:[^#]*\b${component}\b" /etc/apt/sources.list.d/*.sources 2>/dev/null | grep -q .
}
+require_whiptail() {
+ if ! command -v whiptail >/dev/null 2>&1; then
+ msg_error "Missing dependency: whiptail"
+ echo -e "Install it first (e.g. apt update && apt install -y whiptail), then re-run this script."
+ exit 127
+ fi
+}
+
# ---- main ----
main() {
header_info
@@ -90,8 +98,14 @@ main() {
CODENAME="$(get_pbs_codename)"
case "$CODENAME" in
- bookworm) start_routines_3 ;;
- trixie) start_routines_4 ;;
+ bookworm)
+ require_whiptail
+ start_routines_3
+ ;;
+ trixie)
+ require_whiptail
+ start_routines_4
+ ;;
*)
msg_error "Unsupported Debian codename: $CODENAME"
echo -e "Supported: bookworm (PBS 3.x) and trixie (PBS 4.x)"
diff --git a/tools/pve/update-apps.sh b/tools/pve/update-apps.sh
index 4bb668be3..129420f9e 100644
--- a/tools/pve/update-apps.sh
+++ b/tools/pve/update-apps.sh
@@ -405,11 +405,6 @@ for container in $CHOICE; do
esac
exit_code=$?
- if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then
- echo -e "${BL}[Info]${GN} Shutting down${BL} $container ${CL} \n"
- pct shutdown $container &
- fi
-
#5) if build resources are different than run resources, then:
if [ "$UPDATE_BUILD_RESOURCES" -eq "1" ]; then
pct set "$container" --cores "$run_cpu" --memory "$run_ram"
@@ -421,6 +416,11 @@ for container in $CHOICE; do
containers_needing_reboot+=("$container ($container_hostname)")
fi
+ if [ "$template" == "false" ] && [ "$status" == "status: stopped" ]; then
+ echo -e "${BL}[Info]${GN} Shutting down${BL} $container ${CL} \n"
+ pct shutdown $container &>/dev/null &
+ fi
+
if [ $exit_code -eq 0 ]; then
msg_ok "Updated container $container"
elif [ $exit_code -eq 75 ]; then
diff --git a/tools/pve/update-lxcs-cron.sh b/tools/pve/update-lxcs-cron.sh
index 15ca40540..d7abc4cae 100644
--- a/tools/pve/update-lxcs-cron.sh
+++ b/tools/pve/update-lxcs-cron.sh
@@ -66,10 +66,20 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
pct start "$container"
sleep 5
update_container "$container" || echo " [Error] Update failed for $container"
+ # check if patchmon agent is present in container and run a report if found
+ if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then
+ echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n"
+ pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report"
+ fi
echo -e "[Info] Shutting down $container"
pct shutdown "$container" --timeout 60 &
elif [ "$status" == "status: running" ]; then
update_container "$container" || echo " [Error] Update failed for $container"
+ # check if patchmon agent is present in container and run a report if found
+ if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then
+ echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n"
+ pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report"
+ fi
fi
fi
done
diff --git a/tools/pve/update-lxcs.sh b/tools/pve/update-lxcs.sh
index 66edcd0e9..52e9d2528 100644
--- a/tools/pve/update-lxcs.sh
+++ b/tools/pve/update-lxcs.sh
@@ -110,15 +110,17 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
elif [ "$status" == "status: running" ]; then
update_container $container
fi
- if pct exec "$container" -- [ -e "/var/run/reboot-required" ]; then
- # Get the container's hostname and add it to the list
- container_hostname=$(pct exec "$container" hostname)
- containers_needing_reboot+=("$container ($container_hostname)")
- fi
- # check if patchmon agent is present in container and run a report if found
- if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then
- echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n"
- pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report"
+ if [ "$status" == "status: running" ]; then
+ if pct exec "$container" -- [ -e "/var/run/reboot-required" ]; then
+ # Get the container's hostname and add it to the list
+ container_hostname=$(pct exec "$container" hostname)
+ containers_needing_reboot+=("$container ($container_hostname)")
+ fi
+ # check if patchmon agent is present in container and run a report if found
+ if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then
+ echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n"
+ pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report"
+ fi
fi
fi
done