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 432bc8229..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,138 @@ 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 @@ -927,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/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-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/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/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 @@ + __________ ____ _ __ __ + / ____/ __ \/ __ \/ | / /__ _ __/ /_ + / __/ / /_/ / /_/ / |/ / _ \| |/_/ __/ + / /___/ _, _/ ____/ /| / __/> /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/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/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/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/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/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/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/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/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/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