Compare commits

...

75 Commits

Author SHA1 Message Date
Michel Roegl-Brunner 513e58b5d1 enhance pocketbase bot 2026-04-28 10:10:05 +02:00
community-scripts-pr-app[bot] 8da59d6133 Update CHANGELOG.md (#14086)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-28 07:19:06 +00:00
push-app-to-main[bot] 1f6303c918 StoryBook (#14081)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2026-04-28 09:18:27 +02:00
community-scripts-pr-app[bot] d05305d4c4 Update CHANGELOG.md (#14083)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-28 06:42:01 +00:00
push-app-to-main[bot] ed7156b89c Add coredns (ct) (#14082)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
2026-04-28 08:41:36 +02:00
community-scripts-pr-app[bot] 4dc7418b3d Update CHANGELOG.md (#14080)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-28 04:29:34 +00:00
Jerry1098 608b77a662 Fix Dawarich Install/Update (#14078)
* [feat] adding envs

Add required envs to .env

https://github.com/Freika/dawarich/issues/2543

* Dawarich: add required envs to install script
2026-04-28 06:29:10 +02:00
community-scripts-pr-app[bot] a7b8259022 Update CHANGELOG.md (#14077)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-27 21:14:53 +00:00
rellek b226c87a00 Add pamUsername column to userOrgs table (#14075) 2026-04-27 23:14:24 +02:00
community-scripts-pr-app[bot] ea296b59f4 Update CHANGELOG.md (#14066)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-27 11:31:28 +00:00
community-scripts-pr-app[bot] 6ab9737137 Update CHANGELOG.md (#14065)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-27 11:31:18 +00:00
CanbiZ (MickLesk) 6044637f12 Dawarich: run db:migrate before assets:precompile (#14051)
* fix(dawarich): run db:migrate before assets:precompile

In Rails production, eager loading during assets:precompile can execute
DB queries. Dawarich 1.7.0 adds new tables (monthly digest email
preferences, S3 storage settings). Running precompile before migrate
causes 'Operation not permitted' / exit code 1 when those tables do
not exist yet.

Reordered to: db:migrate -> assets:precompile -> data:migrate,
which is the correct Rails deployment sequence.

Fixes #14048

* add otp key
2026-04-27 13:31:02 +02:00
community-scripts-pr-app[bot] 93a53fe16e Update CHANGELOG.md (#14064)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-27 11:30:48 +00:00
community-scripts-pr-app[bot] 5cab784bcb Update CHANGELOG.md (#14063)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-27 11:30:22 +00:00
CanbiZ (MickLesk) 585de1ba0c fix(update-lxcs/apps): avoid pct exec on containers mid-shutdown (#14050)
Both update-lxcs.sh and update-apps.sh backgrounded pct shutdown and then
immediately called pct exec on the same container, causing 'Error: unexpected
status' which terminated the loop after the first container.

update-lxcs.sh: wrapped reboot-required and patchmon-agent checks in a
guard that only runs them when the container was already running (not
one that was started and is now being shut down).

update-apps.sh: moved pct set (resource reset) and the pct exec
reboot-required check to run before pct shutdown is issued.

Fixes #14027
2026-04-27 13:30:20 +02:00
CanbiZ (MickLesk) c32ca537f1 fix(technitiumdns): always install .NET 10 if not already present (#14049)
Previously the update script only upgraded .NET when aspnetcore-runtime-8.0
or 9.0 was detected via is_package_installed. Containers where detection
failed would silently skip the upgrade block, leaving Technitium v15
(requires .NET 10) starting against .NET 8/9 and immediately failing.

Changed condition to: install .NET 10 unless it is already installed.
Old 8.0/9.0 packages are removed with || true to avoid errors on clean
installs.

Fixes #14045
2026-04-27 13:29:57 +02:00
community-scripts-pr-app[bot] 424575d8c1 Update CHANGELOG.md (#14060)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-27 10:06:41 +00:00
Chris 782420b4e4 PatchMon: v2.0.0 migration (#14015)
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-04-27 12:06:16 +02:00
community-scripts-pr-app[bot] 9b8129abd3 Update CHANGELOG.md (#14055)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-27 08:17:35 +00:00
Joerg Heinemann 1c169fc7e2 Add patchmon-agent report execution in update script (#14054) 2026-04-27 10:17:05 +02:00
community-scripts-pr-app[bot] f985d84952 Update CHANGELOG.md (#14052)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-27 07:00:57 +00:00
Mike 88397b48dc Update build.func - fixed spelling mistake (#14047) 2026-04-27 09:00:29 +02:00
community-scripts-pr-app[bot] 91b03574e4 Update CHANGELOG.md (#14044)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-26 20:12:47 +00:00
CanbiZ (MickLesk) ca915da8c1 Fix: Correct deb822 repository flat path detection (#14037)
The setup_deb822_repo function was only checking for the literal './'
suite value, but should reject any suite ending with '/', which
indicates a flat repository that must not include Components in the
DEB822 format.

This fix aligns ProxmoxVE with the correct behavior already present
in ProxmoxVED.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-26 22:12:20 +02:00
community-scripts-pr-app[bot] 95f2d24f53 Update CHANGELOG.md (#14042)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-26 19:22:27 +00:00
CanbiZ (MickLesk) df9fa394b8 Increase Frigate default CPU cores from 4 to 8 (#14039)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-26 21:22:00 +02:00
community-scripts-pr-app[bot] 1e1e96b68e Update CHANGELOG.md (#14040)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-26 19:04:56 +00:00
Slaviša Arežina 13bd09532a Set up directories and enable Technitium DNS service (#14030)
Create necessary directories for Technitium DNS service and update systemd service file.
2026-04-26 21:04:28 +02:00
community-scripts-pr-app[bot] b78cdb4008 Update CHANGELOG.md (#14029)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-26 06:52:00 +00:00
Ömer Taha Öztop 4963385bf9 fix(2fauth): make update_script idempotent and preserve ownership (#14018)
The update was failing with 'mv: cannot stat /opt/2fauth-backup/.env:
No such file or directory' on a system where a previous run had left
/opt/2fauth-backup behind. mv would then nest /opt/2fauth inside the
existing backup directory (as /opt/2fauth-backup/2fauth/), so the
restore step looked at the wrong path.

After fixing that, the app returned a 500 ('Key path
file:///opt/2fauth/storage/oauth-public.key does not exist or is not
readable') because chown/chmod ran before composer install and
php artisan 2fauth:install, leaving vendor/, bootstrap/cache/* and
the regenerated oauth keys owned by root and unreadable by www-data.

- Remove any stale /opt/2fauth-backup before creating the backup, and
  remove it again at the end so the next run starts clean
- Use cp instead of mv when restoring .env/storage so the backup is
  preserved until the update completes
- Move chown/chmod to AFTER composer + artisan, matching the order in
  install/2fauth-install.sh
- Restart php8.4-fpm in addition to nginx so opcache picks up the new
  cached config
- Drop redundant quotes around literal paths to match the rest of the
  codebase
2026-04-26 08:51:33 +02:00
community-scripts-pr-app[bot] 799f3bf0fb Update CHANGELOG.md (#14028)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-26 06:49:13 +00:00
push-app-to-main[bot] 2f6f0880ac TREK (#14017)
* Add trek (ct)

* Update success message in trek.sh

* Simplify TREK installation script

Removed initialization wait and health check for TREK.

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-04-26 08:48:46 +02:00
community-scripts-pr-app[bot] b56e6f9e52 Update CHANGELOG.md (#14026)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-26 00:12:39 +00:00
community-scripts-pr-app[bot] 1c49bab0bc Archive old changelog entries (#14025)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-26 00:12:14 +00:00
community-scripts-pr-app[bot] 9a2e6551f1 Update CHANGELOG.md (#14023)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-25 22:37:45 +00:00
Slaviša Arežina 0cfc6c89b2 Refactor: Technitium DNS (#14013)
* Refactor

* Ensure root user for systemd service
2026-04-26 00:37:19 +02:00
community-scripts-pr-app[bot] 19bae6935c Update CHANGELOG.md (#14022)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-25 22:35:03 +00:00
Kevin O'Brien 347e0af359 VictoriaMetrics: Stop vmagent/vmalert before update (#14016)
Stop vmagent and vmalert services (if present) before deploying the
vmutils tarball during updates, and restart them afterward. Running
vmutils daemons (vmagent-prod, vmalert-prod) cause cp to fail with
ETXTBSY when their binaries are overwritten in /opt/victoriametrics.

Fixes #14014
2026-04-26 00:34:39 +02:00
community-scripts-pr-app[bot] 615fc7d6ce Update CHANGELOG.md (#14021)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-25 21:34:46 +00:00
Ömer Taha Öztop 186a03ccb2 Domain-Monitor: start apache2 after stop instead of reload (#14019) 2026-04-25 23:34:26 +02:00
community-scripts-pr-app[bot] ddf05a1c2d Update CHANGELOG.md (#14011)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-25 11:14:39 +00:00
Slaviša Arežina a43ac644da Transmute: Fix ffmpeg detection (#14008)
* Fix dependencies

* better symlink
2026-04-25 13:14:16 +02:00
community-scripts-pr-app[bot] 5d59291bb1 Update .app files (#14000)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2026-04-24 16:13:15 +02:00
community-scripts-pr-app[bot] f553329754 Update CHANGELOG.md (#14001)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-24 14:10:10 +00:00
push-app-to-main[bot] 6ece8c4de9 Apprise-API (#13934)
* Add apprise-api (ct)

* Install nginx and git dependencies

Added installation of nginx and git dependencies.

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-04-24 16:09:40 +02:00
community-scripts-pr-app[bot] 581b332c66 Update CHANGELOG.md (#13999)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-24 14:09:18 +00:00
push-app-to-main[bot] 0632f99343 fireshare (#13995)
* Add fireshare (ct)

* Update fireshare.sh

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2026-04-24 16:08:49 +02:00
CanbiZ (MickLesk) fecad57187 fix dep 2026-04-24 14:29:55 +02:00
CanbiZ (MickLesk) bb7b612d5f fix ffmpeg path 2026-04-24 14:21:16 +02:00
community-scripts-pr-app[bot] 2c22e03774 Update CHANGELOG.md (#13991)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-24 10:04:45 +00:00
CanbiZ (MickLesk) 6ca9569dc3 Refactor: Ghostfolio (#13990) 2026-04-24 12:04:17 +02:00
community-scripts-pr-app[bot] 562ae12972 Update .app files (#13988)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2026-04-24 10:17:59 +02:00
community-scripts-pr-app[bot] 47cb50e7cd Update CHANGELOG.md (#13987)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-24 08:13:12 +00:00
push-app-to-main[bot] a8c1155cac Transmute (#13935)
* Add transmute (ct)

* Update install/transmute-install.sh

Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>

* Update author name in transmute.sh

* Update ct/transmute.sh

Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>

* Update author name in transmute-install.sh

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2026-04-24 10:12:49 +02:00
community-scripts-pr-app[bot] f4a141019e Update .app files (#13986)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2026-04-24 10:11:40 +02:00
community-scripts-pr-app[bot] 2b288ee617 Update CHANGELOG.md (#13985)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-24 08:10:42 +00:00
push-app-to-main[bot] a36d0cb20c Jitsi-Meet (#13897)
* Add jitsi-meet (ct)

* Update author in jitsi-meet.sh script

* Remove unnecessary newline in jitsi-meet.sh

* Refactor setup_deb822_repo command for readability

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com>
2026-04-24 10:10:17 +02:00
community-scripts-pr-app[bot] d3efebce67 Update CHANGELOG.md (#13980)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-24 00:08:48 +00:00
Soppster1029 7a440679f5 Update wger.sh (#13977) 2026-04-24 02:08:21 +02:00
community-scripts-pr-app[bot] db2780ff44 Update CHANGELOG.md (#13975)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 20:17:58 +00:00
CanbiZ (MickLesk) fdab25b098 core: auto-size NODE_OPTIONS heap (#13960)
* feat(nodejs): auto-size NODE_OPTIONS heap and apply in Termix updates

- setup_nodejs now sets NODE_OPTIONS only when not already set
- Heap size is auto-derived from NODE_MAX_OLD_SPACE_SIZE, var_ram, or MemTotal
- Auto heap is clamped to 1024..4096 MB to avoid too-small or too-large defaults
- Termix update path now calls setup_nodejs before frontend/backend builds so
  Node heap defaults are applied consistently during updates

* feat(error-handler): add actionable Node.js heap OOM guidance

Detect probable Node.js heap out-of-memory failures from log patterns and
common build exit codes, then print targeted remediation hints instead of
only a generic SIGABRT/SIGKILL message.

- Detect OOM patterns in last log lines (Reached heap limit, JS heap OOM)
- Treat node build contexts with exit 134/137/243 as likely heap issues
- Suggest computed --max-old-space-size based on NODE_OPTIONS, var_ram,
  or MemTotal (clamped to 1024..4096 MB)
- Recommend calling setup_nodejs before build steps so defaults apply

* refactor(node-heap): raise auto cap to 12GB and simplify OOM hint

- Increase setup_nodejs auto heap clamp from 4GB to 12GB for heavy frontend builds
- Keep lower bound at 1GB and preserve user override precedence
- Simplify error_handler Node OOM output to a single concise hint
- Align error_handler heap suggestion clamp to 12GB
2026-04-23 22:17:25 +02:00
community-scripts-pr-app[bot] c3c544d5a4 Update CHANGELOG.md (#13972)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 18:53:24 +00:00
CanbiZ (MickLesk) 3c38647055 core: improve system update information / lxc stack upgrade (#13970)
* fix(lxc-stack): use dist-upgrade and improve recovery prompt

When the host LXC stack is too old for a template, upgrading only
pve-container/lxc-pve can leave the Proxmox stack in an inconsistent state.
Use a full dist-upgrade instead.

Also refine the recovery prompt:
- [1] Upgrade LXC stack now
- [2] Older template fallback only when actually available
- [3] Ignore
- [4] Cancel

Do not auto-fallback to an older template after ignore/failure; honor the
user's explicit choice and stop with a clear error instead.

* chore(lxc-stack-prompt): clarify host dist-upgrade action in option 1

* Update build.func

* fix(lxc-stack): use host upgrade instead of dist-upgrade in recovery flow

* Enhance upgrade prompt with warning message

Added a warning message to inform users about the implications of running the host upgrade.

---------

Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2026-04-23 20:52:59 +02:00
community-scripts-pr-app[bot] 7e1b2b4f92 Update CHANGELOG.md (#13969)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 13:52:42 +00:00
CanbiZ (MickLesk) 145602a8c3 mealie: start.sh missing after failed update (#13958)
* fix(mealie): restore start.sh before build steps to prevent broken container

When CLEAN_INSTALL=1 wipes /opt/mealie/* and a subsequent build step fails
(uv sync, yarn install, yarn generate - e.g. due to OOM or network error),
start.sh was never written because it was created at the very end of the
update function. On the next reboot systemd could not find the ExecStart
binary and the container was left in a permanently broken state.

Fix: move mealie.env restore and start.sh creation to immediately after
fetch_and_deploy_gh_release, before any build steps that can fail. This
ensures the service entry point is always present even if the build is
interrupted, allowing uv to self-heal on next startup.

Fixes: #13945

* fix(mealie): backup and restore start.sh alongside mealie.env

Instead of recreating start.sh from a heredoc after CLEAN_INSTALL wipes
/opt/mealie/*, simply back it up before the wipe and restore it together
with mealie.env. Simpler and avoids any drift between the hardcoded
heredoc and what was actually installed.

* fix(mealie): fallback heredoc if start.sh missing before backup
2026-04-23 15:52:12 +02:00
community-scripts-pr-app[bot] 687e778460 Update CHANGELOG.md (#13968)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 13:51:25 +00:00
CanbiZ (MickLesk) 1476849f3c twingate-connector: perform real apt upgrade during update flow (#13959)
* fix(twingate-connector): perform real apt upgrade during update flow

The update path used ensure_dependencies, which only installs missing
packages and does not upgrade already installed ones. As a result, users
could see 'Updated successfully' even when a newer twingate-connector
version was available.

Switch update_script to a real package update flow:
- ensure apt is healthy
- refresh apt metadata
- install/upgrade twingate-connector via retry helper
- restart service

This aligns behavior with Twingate's documented upgrade process.

* Update twingate-connector.sh
2026-04-23 15:51:01 +02:00
community-scripts-pr-app[bot] a2bf10d2f2 Update CHANGELOG.md (#13967)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 13:50:52 +00:00
Slaviša Arežina 9c44055709 Updated to match our starndard (#13956) 2026-04-23 15:50:26 +02:00
community-scripts-pr-app[bot] 7141f89676 Update CHANGELOG.md (#13966)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 13:50:24 +00:00
CanbiZ (MickLesk) 9f50496f8b fix(tools.func): upgrade Node.js minor/patch on same major version (#13957)
In setup_nodejs() Scenario 1 (major version already matches), only npm
was refreshed - apt never upgraded the nodejs package itself. This left
existing LXCs stuck on older minor releases (e.g. 22.13.1) even though
NodeSource ships newer ones (e.g. 22.19+).

Fix: add pt-get install -y --only-upgrade nodejs before the npm pin
so the latest minor/patch from the already-configured NodeSource repo is
always installed.

Fixes: seerr update failing with ERR_PNPM_UNSUPPORTED_ENGINE because
seerr 3.2.0 requires Node >=22.19.0 but installed was v22.13.1 (#13955)
2026-04-23 15:49:54 +02:00
community-scripts-pr-app[bot] 01bbacec22 Update CHANGELOG.md (#13965)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 13:31:16 +00:00
community-scripts-pr-app[bot] 116253df1a Update CHANGELOG.md (#13964)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 13:30:51 +00:00
CanbiZ (MickLesk) 8706cd3783 Revert "core: Add PHS_VERBOSE env var to skip verbose mode prompts (#13797)" (#13963)
This reverts commit 518b6778e2.
2026-04-23 15:30:38 +02:00
CanbiZ (MickLesk) 874d8f300c Revert "Prefer silent mode on PHS env conflict (#13951)" (#13962)
This reverts commit a37b36520c.
2026-04-23 15:30:19 +02:00
58 changed files with 1996 additions and 435 deletions
+140
View File
@@ -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 ## 2026-04-18
### 🆕 New Scripts ### 🆕 New Scripts
+182 -2
View File
@@ -7,7 +7,7 @@ on:
permissions: permissions:
issues: write issues: write
pull-requests: write pull-requests: write
contents: read contents: write
jobs: jobs:
pocketbase-bot: pocketbase-bot:
@@ -95,6 +95,149 @@ jobs:
return request('https://api.github.com' + path, { method: method || 'GET', headers, body: bodyStr }); return request('https://api.github.com' + path, { method: method || 'GET', headers, body: bodyStr });
} }
function encodeContentPath(filePath) {
return filePath.split('/').map(encodeURIComponent).join('/');
}
function decodeGitHubContent(content) {
return Buffer.from((content || '').replace(/\n/g, ''), 'base64').toString('utf8');
}
function sanitizeBranchPart(value) {
return (value || '')
.toLowerCase()
.replace(/[^a-z0-9._/-]+/g, '-')
.replace(/\/+/g, '/')
.replace(/^-+|-+$/g, '');
}
function applyCtDefaultChanges(scriptText, varChanges) {
let nextText = scriptText;
const updatedVars = [];
const unchangedVars = [];
for (const [varName, rawValue] of Object.entries(varChanges)) {
const newValue = String(rawValue);
const pattern = new RegExp('(^\\s*' + varName + '="\\$\\{' + varName + ':-)([^"}]*)(\\}"\\s*$)', 'm');
const match = nextText.match(pattern);
if (!match) continue;
if (match[2] === newValue) {
unchangedVars.push(varName);
continue;
}
nextText = nextText.replace(pattern, '$1' + newValue + '$3');
updatedVars.push(varName);
}
return { nextText, updatedVars, unchangedVars };
}
async function ensureBranch(defaultBranch, branchName) {
const branchRefRes = await ghRequest('/repos/' + owner + '/' + repo + '/git/ref/heads/' + encodeURIComponent(branchName));
if (branchRefRes.ok) return;
const defaultRefRes = await ghRequest('/repos/' + owner + '/' + repo + '/git/ref/heads/' + encodeURIComponent(defaultBranch));
if (!defaultRefRes.ok) {
throw new Error('Could not read default branch ref: ' + defaultRefRes.body);
}
const defaultRef = JSON.parse(defaultRefRes.body);
const createBranchRes = await ghRequest('/repos/' + owner + '/' + repo + '/git/refs', 'POST', {
ref: 'refs/heads/' + branchName,
sha: defaultRef.object.sha
});
if (!createBranchRes.ok) {
throw new Error('Could not create branch: ' + createBranchRes.body);
}
}
async function upsertCtDefaultsPr(slugValue, varChanges) {
const wantedEntries = Object.entries(varChanges || {}).filter(function ([, v]) {
return v !== undefined && v !== null && String(v) !== '';
});
if (wantedEntries.length === 0) {
return { status: 'skipped', reason: 'No mapped CT defaults changed.' };
}
const repoRes = await ghRequest('/repos/' + owner + '/' + repo);
if (!repoRes.ok) {
throw new Error('Could not read repository metadata: ' + repoRes.body);
}
const repoInfo = JSON.parse(repoRes.body);
const defaultBranch = repoInfo.default_branch;
const ctPath = 'ct/' + slugValue + '.sh';
const encodedCtPath = encodeContentPath(ctPath);
const defaultFileRes = await ghRequest('/repos/' + owner + '/' + repo + '/contents/' + encodedCtPath + '?ref=' + encodeURIComponent(defaultBranch));
if (defaultFileRes.statusCode === 404) {
return { status: 'skipped', reason: 'No matching CT file found at `' + ctPath + '`.' };
}
if (!defaultFileRes.ok) {
throw new Error('Could not read CT file from default branch: ' + defaultFileRes.body);
}
const branchName = 'pocketbase-sync/' + sanitizeBranchPart(slugValue || 'unknown');
await ensureBranch(defaultBranch, branchName);
const branchFileRes = await ghRequest('/repos/' + owner + '/' + repo + '/contents/' + encodedCtPath + '?ref=' + encodeURIComponent(branchName));
if (!branchFileRes.ok) {
throw new Error('Could not read CT file from sync branch: ' + branchFileRes.body);
}
const branchFile = JSON.parse(branchFileRes.body);
const currentBranchText = decodeGitHubContent(branchFile.content);
const updateResult = applyCtDefaultChanges(currentBranchText, Object.fromEntries(wantedEntries));
if (updateResult.updatedVars.length === 0) {
return { status: 'skipped', reason: 'CT defaults already up to date.', unchangedVars: updateResult.unchangedVars };
}
const commitMessage = 'chore(ct): sync ' + slugValue + ' defaults from PocketBase';
const putRes = await ghRequest('/repos/' + owner + '/' + repo + '/contents/' + encodedCtPath, 'PUT', {
message: commitMessage,
content: Buffer.from(updateResult.nextText, 'utf8').toString('base64'),
sha: branchFile.sha,
branch: branchName
});
if (!putRes.ok) {
throw new Error('Could not update CT file: ' + putRes.body);
}
const openPrRes = await ghRequest(
'/repos/' + owner + '/' + repo + '/pulls?state=open&head=' + encodeURIComponent(owner + ':' + branchName) + '&base=' + encodeURIComponent(defaultBranch)
);
if (!openPrRes.ok) {
throw new Error('Could not query existing PRs: ' + openPrRes.body);
}
const openPrs = JSON.parse(openPrRes.body);
if (openPrs.length > 0) {
return { status: 'updated', prUrl: openPrs[0].html_url, updatedVars: updateResult.updatedVars };
}
const prTitle = 'chore(ct): sync ' + slugValue + ' defaults with PocketBase';
const prBody =
'## Summary\n' +
'- Sync default CT variables for `' + slugValue + '` after `/pocketbase` update.\n' +
'- Updated vars: `' + updateResult.updatedVars.join('`, `') + '`.\n\n' +
'## Source\n' +
'- Triggered by @' + actor + ' via PocketBase bot.\n';
const createPrRes = await ghRequest('/repos/' + owner + '/' + repo + '/pulls', 'POST', {
title: prTitle,
body: prBody,
head: branchName,
base: defaultBranch
});
if (!createPrRes.ok) {
throw new Error('Could not create PR: ' + createPrRes.body);
}
const pr = JSON.parse(createPrRes.body);
return { status: 'created', prUrl: pr.html_url, updatedVars: updateResult.updatedVars };
}
function formatCtSyncResult(syncResult) {
if (!syncResult) return '';
if (syncResult.status === 'created') return '\n\n**CT sync PR:** ' + syncResult.prUrl;
if (syncResult.status === 'updated') return '\n\n**CT sync PR updated:** ' + syncResult.prUrl;
if (syncResult.status === 'skipped') return '\n\n**CT sync skipped:** ' + syncResult.reason;
return '';
}
async function addReaction(content) { async function addReaction(content) {
try { try {
await ghRequest( await ghRequest(
@@ -510,6 +653,7 @@ jobs:
const RESOURCE_KEYS = { cpu: 'number', ram: 'number', hdd: 'number', os: 'string', version: 'string' }; const RESOURCE_KEYS = { cpu: 'number', ram: 'number', hdd: 'number', os: 'string', version: 'string' };
const METHOD_KEYS = { config_path: 'string', script: 'string' }; const METHOD_KEYS = { config_path: 'string', script: 'string' };
const ALL_METHOD_KEYS = Object.assign({}, RESOURCE_KEYS, METHOD_KEYS); const ALL_METHOD_KEYS = Object.assign({}, RESOURCE_KEYS, METHOD_KEYS);
const RESOURCE_TO_CT_VAR = { cpu: 'var_cpu', ram: 'var_ram', hdd: 'var_disk', os: 'var_os', version: 'var_version' };
function applyMethodChanges(method, parsed) { function applyMethodChanges(method, parsed) {
if (!method.resources) method.resources = {}; if (!method.resources) method.resources = {};
@@ -550,6 +694,7 @@ jobs:
if (addMatch) { if (addMatch) {
// ── METHOD ADD ─────────────────────────────────────────────── // ── METHOD ADD ───────────────────────────────────────────────
const newType = addMatch[1]; const newType = addMatch[1];
const parsed = addMatch[2] ? parseKVPairs(addMatch[2]) : {};
if (methodsArr.some(function (im) { return (im.type || '').toLowerCase() === newType.toLowerCase(); })) { if (methodsArr.some(function (im) { return (im.type || '').toLowerCase() === newType.toLowerCase(); })) {
await addReaction('-1'); await addReaction('-1');
await postComment('❌ **PocketBase Bot**: Install method `' + newType + '` already exists for `' + slug + '`.\n\nUse `/pocketbase ' + slug + ' method list` to see all methods.'); await postComment('❌ **PocketBase Bot**: Install method `' + newType + '` already exists for `' + slug + '`.\n\nUse `/pocketbase ' + slug + ' method list` to see all methods.');
@@ -557,7 +702,6 @@ jobs:
} }
const newMethod = { type: newType, resources: { cpu: 1, ram: 512, hdd: 4, os: 'debian', version: '13' } }; const newMethod = { type: newType, resources: { cpu: 1, ram: 512, hdd: 4, os: 'debian', version: '13' } };
if (addMatch[2]) { if (addMatch[2]) {
const parsed = parseKVPairs(addMatch[2]);
const unknown = Object.keys(parsed).filter(function (k) { return !ALL_METHOD_KEYS[k]; }); const unknown = Object.keys(parsed).filter(function (k) { return !ALL_METHOD_KEYS[k]; });
if (unknown.length > 0) { if (unknown.length > 0) {
await addReaction('-1'); await addReaction('-1');
@@ -569,10 +713,21 @@ jobs:
methodsArr.push(newMethod); methodsArr.push(newMethod);
await patchMethods(methodsArr); await patchMethods(methodsArr);
await revalidate(slug); await revalidate(slug);
const addCtChanges = {};
for (const [k, v] of Object.entries(parsed)) {
if (RESOURCE_TO_CT_VAR[k]) addCtChanges[RESOURCE_TO_CT_VAR[k]] = v;
}
let addCtSync = null;
try {
addCtSync = await upsertCtDefaultsPr(slug, addCtChanges);
} catch (e) {
addCtSync = { status: 'skipped', reason: 'CT sync failed: ' + e.message };
}
await addReaction('+1'); await addReaction('+1');
await postComment( await postComment(
'✅ **PocketBase Bot**: Added install method **`' + newType + '`** to **`' + slug + '`**\n\n' + '✅ **PocketBase Bot**: Added install method **`' + newType + '`** to **`' + slug + '`**\n\n' +
formatMethodsList([newMethod]) + '\n\n' + formatMethodsList([newMethod]) + '\n\n' +
formatCtSyncResult(addCtSync) + '\n\n' +
'*Executed by @' + actor + '*' '*Executed by @' + actor + '*'
); );
@@ -640,6 +795,16 @@ jobs:
applyMethodChanges(methodsArr[idx], parsed); applyMethodChanges(methodsArr[idx], parsed);
await patchMethods(methodsArr); await patchMethods(methodsArr);
await revalidate(slug); await revalidate(slug);
const editCtChanges = {};
for (const [k, v] of Object.entries(parsed)) {
if (RESOURCE_TO_CT_VAR[k]) editCtChanges[RESOURCE_TO_CT_VAR[k]] = v;
}
let editCtSync = null;
try {
editCtSync = await upsertCtDefaultsPr(slug, editCtChanges);
} catch (e) {
editCtSync = { status: 'skipped', reason: 'CT sync failed: ' + e.message };
}
const changesLines = Object.entries(parsed) const changesLines = Object.entries(parsed)
.map(function ([k, v]) { .map(function ([k, v]) {
@@ -650,6 +815,7 @@ jobs:
await postComment( await postComment(
'✅ **PocketBase Bot**: Updated install method **`' + methodsArr[idx].type + '`** for **`' + slug + '`**\n\n' + '✅ **PocketBase Bot**: Updated install method **`' + methodsArr[idx].type + '`** for **`' + slug + '`**\n\n' +
'**Changes applied:**\n' + changesLines + '\n\n' + '**Changes applied:**\n' + changesLines + '\n\n' +
formatCtSyncResult(editCtSync) + '\n\n' +
'*Executed by @' + actor + '*' '*Executed by @' + actor + '*'
); );
} }
@@ -712,9 +878,11 @@ jobs:
project_url: 'string', project_url: 'string',
github: 'string', github: 'string',
config_path: 'string', config_path: 'string',
tags: 'string',
port: 'number', port: 'number',
default_user: 'nullable_string', default_user: 'nullable_string',
default_passwd: 'nullable_string', default_passwd: 'nullable_string',
unprivileged: 'number',
updateable: 'boolean', updateable: 'boolean',
privileged: 'boolean', privileged: 'boolean',
has_arm: 'boolean', has_arm: 'boolean',
@@ -781,6 +949,17 @@ jobs:
process.exit(1); process.exit(1);
} }
await revalidate(slug); await revalidate(slug);
const FIELD_TO_CT_VAR = { tags: 'var_tags', unprivileged: 'var_unprivileged' };
const fieldCtChanges = {};
for (const [k, v] of Object.entries(payload)) {
if (FIELD_TO_CT_VAR[k]) fieldCtChanges[FIELD_TO_CT_VAR[k]] = v;
}
let fieldCtSync = null;
try {
fieldCtSync = await upsertCtDefaultsPr(slug, fieldCtChanges);
} catch (e) {
fieldCtSync = { status: 'skipped', reason: 'CT sync failed: ' + e.message };
}
await addReaction('+1'); await addReaction('+1');
const changesLines = Object.entries(payload) const changesLines = Object.entries(payload)
.map(function ([k, v]) { return '- `' + k + '` → `' + JSON.stringify(v) + '`'; }) .map(function ([k, v]) { return '- `' + k + '` → `' + JSON.stringify(v) + '`'; })
@@ -788,6 +967,7 @@ jobs:
await postComment( await postComment(
'✅ **PocketBase Bot**: Updated **`' + slug + '`** successfully!\n\n' + '✅ **PocketBase Bot**: Updated **`' + slug + '`** successfully!\n\n' +
'**Changes applied:**\n' + changesLines + '\n\n' + '**Changes applied:**\n' + changesLines + '\n\n' +
formatCtSyncResult(fieldCtSync) + '\n\n' +
'*Executed by @' + actor + '*' '*Executed by @' + actor + '*'
); );
} }
+119 -156
View File
@@ -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
<details> <details>
<summary><h4>April (18 entries)</h4></summary> <summary><h4>April (25 entries)</h4></summary>
[View April 2026 Changelog](.github/changelogs/2026/04.md) [View April 2026 Changelog](.github/changelogs/2026/04.md)
@@ -445,14 +448,128 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-04-23 ## 2026-04-28
### 🆕 New Scripts
- StoryBook ([#14081](https://github.com/community-scripts/ProxmoxVE/pull/14081))
- CoreDNS ([#14082](https://github.com/community-scripts/ProxmoxVE/pull/14082))
### 🚀 Updated Scripts
- Fix Dawarich Install/Update [@Jerry1098](https://github.com/Jerry1098) ([#14078](https://github.com/community-scripts/ProxmoxVE/pull/14078))
## 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 ### 💾 Core
- #### 🐞 Bug Fixes - #### 🐞 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)) - 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 ## 2026-04-22
### 🆕 New Scripts ### 🆕 New Scripts
@@ -957,157 +1074,3 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### ✨ New Features - #### ✨ 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)) - 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))
+10 -7
View File
@@ -24,7 +24,7 @@ function update_script() {
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d "/opt/2fauth" ]]; then if [[ ! -d /opt/2fauth ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
@@ -34,7 +34,8 @@ function update_script() {
$STD apt -y upgrade $STD apt -y upgrade
msg_info "Creating Backup" 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 if ! dpkg -l | grep -q 'php8.4'; then
cp /etc/nginx/conf.d/2fauth.conf /etc/nginx/conf.d/2fauth.conf.bak cp /etc/nginx/conf.d/2fauth.conf /etc/nginx/conf.d/2fauth.conf.bak
fi fi
@@ -46,15 +47,17 @@ function update_script() {
fi fi
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth" "tarball" fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth" "tarball"
setup_composer setup_composer
mv "/opt/2fauth-backup/.env" "/opt/2fauth/.env" cp /opt/2fauth-backup/.env /opt/2fauth/.env
mv "/opt/2fauth-backup/storage" "/opt/2fauth/storage" cp -r /opt/2fauth-backup/storage /opt/2fauth/storage
cd "/opt/2fauth" || return cd /opt/2fauth || return
chown -R www-data: "/opt/2fauth"
chmod -R 755 "/opt/2fauth"
export COMPOSER_ALLOW_SUPERUSER=1 export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev --prefer-dist $STD composer install --no-dev --prefer-dist
php artisan 2fauth:install 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 $STD systemctl restart nginx
rm -rf /opt/2fauth-backup
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
fi fi
exit exit
+75
View File
@@ -0,0 +1,75 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-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}"
+1 -1
View File
@@ -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 [ -f /opt/checkmate/client/.env.local ] && cp /opt/checkmate/client/.env.local /opt/checkmate_client.env.local.bak
msg_ok "Backed up Data" 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" msg_info "Updating Checkmate Server"
cd /opt/checkmate/server cd /opt/checkmate/server
+56
View File
@@ -0,0 +1,56 @@
#!/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/coredns/coredns
APP="CoreDNS"
var_tags="${var_tags:-dns;network}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-256}"
var_disk="${var_disk:-1}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /usr/local/bin/coredns ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "coredns" "coredns/coredns"; then
msg_info "Stopping Service"
systemctl stop coredns
msg_ok "Stopped Service"
fetch_and_deploy_gh_release "coredns" "coredns/coredns" "prebuild" "latest" "/usr/local/bin" \
"coredns_*_linux_$(dpkg --print-architecture).tgz"
chmod +x /usr/local/bin/coredns
msg_info "Starting Service"
systemctl start coredns
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} CoreDNS is listening on port 53 (DNS)${CL}"
echo -e "${TAB}${GATEWAY}${BGN}dns://${IP}${CL}"
+13 -1
View File
@@ -53,6 +53,18 @@ function update_script() {
export PATH="/root/.rbenv/shims:/root/.rbenv/bin:$PATH" export PATH="/root/.rbenv/shims:/root/.rbenv/bin:$PATH"
eval "$(/root/.rbenv/bin/rbenv init - bash)" 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 64)" >>/opt/dawarich/.env
fi
if ! grep -q "OTP_ENCRYPTION_DETERMINISTIC_KEY" /opt/dawarich/.env; then
echo "OTP_ENCRYPTION_DETERMINISTIC_KEY=$(openssl rand -hex 64)" >>/opt/dawarich/.env
fi
if ! grep -q "OTP_ENCRYPTION_KEY_DERIVATION_SALT" /opt/dawarich/.env; then
echo "OTP_ENCRYPTION_KEY_DERIVATION_SALT=$(openssl rand -hex 64)" >>/opt/dawarich/.env
fi
set -a && source /opt/dawarich/.env && set +a set -a && source /opt/dawarich/.env && set +a
$STD bundle config set --local deployment 'true' $STD bundle config set --local deployment 'true'
@@ -67,8 +79,8 @@ function update_script() {
$STD npm install $STD npm install
fi fi
$STD bundle exec rake assets:precompile
$STD bundle exec rails db:migrate $STD bundle exec rails db:migrate
$STD bundle exec rake assets:precompile
$STD bundle exec rake data:migrate $STD bundle exec rake data:migrate
msg_ok "Ran Migrations" msg_ok "Ran Migrations"
+1 -1
View File
@@ -60,7 +60,7 @@ function update_script() {
msg_ok "Restored backup" msg_ok "Restored backup"
msg_info "Restarting Services" msg_info "Restarting Services"
systemctl reload apache2 systemctl start apache2
msg_ok "Restarted Services" msg_ok "Restarted Services"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
fi fi
+74
View File
@@ -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}"
+1 -1
View File
@@ -38,7 +38,7 @@ function update_script() {
cp -r /opt/flatnotes/data /opt/flatnotes_data_backup cp -r /opt/flatnotes/data /opt/flatnotes_data_backup
msg_ok "Backed up Configuration and Data" 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" msg_info "Updating Flatnotes"
cd /opt/flatnotes/client cd /opt/flatnotes/client
+1 -1
View File
@@ -7,7 +7,7 @@ source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxV
APP="Frigate" APP="Frigate"
var_tags="${var_tags:-nvr}" var_tags="${var_tags:-nvr}"
var_cpu="${var_cpu:-4}" var_cpu="${var_cpu:-8}"
var_ram="${var_ram:-4096}" var_ram="${var_ram:-4096}"
var_disk="${var_disk:-20}" var_disk="${var_disk:-20}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
+1
View File
@@ -47,6 +47,7 @@ function update_script() {
msg_info "Updating Ghostfolio" msg_info "Updating Ghostfolio"
mv /opt/env.backup /opt/ghostfolio/.env mv /opt/env.backup /opt/ghostfolio/.env
sed -i -E '/^DATABASE_URL=/ s/[?&]sslmode=prefer//g' /opt/ghostfolio/.env
cd /opt/ghostfolio cd /opt/ghostfolio
$STD npm ci $STD npm ci
$STD npm run build:production $STD npm run build:production
+6
View File
@@ -0,0 +1,6 @@
___ _ ___ ____ ____
/ | ____ ____ _____(_)_______ / | / __ \/ _/
/ /| | / __ \/ __ \/ ___/ / ___/ _ \______/ /| | / /_/ // /
/ ___ |/ /_/ / /_/ / / / (__ ) __/_____/ ___ |/ ____// /
/_/ |_/ .___/ .___/_/ /_/____/\___/ /_/ |_/_/ /___/
/_/ /_/
+6
View File
@@ -0,0 +1,6 @@
______ ____ _ _______
/ ____/___ ________ / __ \/ | / / ___/
/ / / __ \/ ___/ _ \/ / / / |/ /\__ \
/ /___/ /_/ / / / __/ /_/ / /| /___/ /
\____/\____/_/ \___/_____/_/ |_//____/
+6
View File
@@ -0,0 +1,6 @@
_______ __
/ ____(_)_______ _____/ /_ ____ _________
/ /_ / / ___/ _ \/ ___/ __ \/ __ `/ ___/ _ \
/ __/ / / / / __(__ ) / / / /_/ / / / __/
/_/ /_/_/ \___/____/_/ /_/\__,_/_/ \___/
+6
View File
@@ -0,0 +1,6 @@
___ __ _ __ ___ __
/ (_) /______(_) / |/ /__ ___ / /_
__ / / / __/ ___/ /_____/ /|_/ / _ \/ _ \/ __/
/ /_/ / / /_(__ ) /_____/ / / / __/ __/ /_
\____/_/\__/____/_/ /_/ /_/\___/\___/\__/
+6
View File
@@ -0,0 +1,6 @@
_____ __ __ __
/ ___// /_____ _______ __/ /_ ____ ____ / /__
\__ \/ __/ __ \/ ___/ / / / __ \/ __ \/ __ \/ //_/
___/ / /_/ /_/ / / / /_/ / /_/ / /_/ / /_/ / ,<
/____/\__/\____/_/ \__, /_.___/\____/\____/_/|_|
/____/
+6
View File
@@ -0,0 +1,6 @@
______ __
/_ __/________ _____ _________ ___ __ __/ /____
/ / / ___/ __ `/ __ \/ ___/ __ `__ \/ / / / __/ _ \
/ / / / / /_/ / / / (__ ) / / / / / /_/ / /_/ __/
/_/ /_/ \__,_/_/ /_/____/_/ /_/ /_/\__,_/\__/\___/
+6
View File
@@ -0,0 +1,6 @@
__________ ________ __
/_ __/ __ \/ ____/ //_/
/ / / /_/ / __/ / ,<
/ / / _, _/ /___/ /| |
/_/ /_/ |_/_____/_/ |_|
+50
View File
@@ -0,0 +1,50 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://jitsi.org/
APP="Jitsi-Meet"
var_tags="${var_tags:-video;conference;communication}"
var_cpu="${var_cpu:-4}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-12}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /etc/jitsi ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Updating Jitsi Meet"
$STD apt update
$STD apt install -y --only-upgrade \
jitsi-meet \
jicofo \
jitsi-videobridge2 \
prosody
msg_ok "Updated Jitsi Meet"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}https://${IP}${CL}"
+1 -1
View File
@@ -39,7 +39,7 @@ function update_script() {
cp /opt/linkding/.env /opt/linkding_env_backup cp /opt/linkding/.env /opt/linkding_env_backup
msg_ok "Backed up Data" msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding" "tarball"
msg_info "Restoring Data" msg_info "Restoring Data"
cp -r /opt/linkding_data_backup/. /opt/linkding/data cp -r /opt/linkding_data_backup/. /opt/linkding/data
+17 -12
View File
@@ -38,10 +38,27 @@ function update_script() {
msg_info "Backing up Configuration" msg_info "Backing up Configuration"
cp -f /opt/mealie/mealie.env /opt/mealie.env cp -f /opt/mealie/mealie.env /opt/mealie.env
[[ -f /opt/mealie/start.sh ]] && cp -f /opt/mealie/start.sh /opt/mealie.start.sh
msg_ok "Backup completed" msg_ok "Backup completed"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "mealie" "mealie-recipes/mealie" "tarball"
msg_info "Restoring Configuration"
mv -f /opt/mealie.env /opt/mealie/mealie.env
if [[ -f /opt/mealie.start.sh ]]; then
mv -f /opt/mealie.start.sh /opt/mealie/start.sh
else
cat <<'STARTEOF' >/opt/mealie/start.sh
#!/bin/bash
set -a
source /opt/mealie/mealie.env
set +a
exec uv run mealie
STARTEOF
fi
chmod +x /opt/mealie/start.sh
msg_ok "Configuration restored"
msg_info "Installing Python Dependencies with uv" msg_info "Installing Python Dependencies with uv"
cd /opt/mealie cd /opt/mealie
$STD uv sync --frozen --extra pgsql $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 $STD uv run python -m nltk.downloader -d /nltk_data averaged_perceptron_tagger_eng
msg_ok "Updated NLTK Data" 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" msg_info "Starting Service"
systemctl start mealie systemctl start mealie
msg_ok "Started Service" msg_ok "Started Service"
+1 -1
View File
@@ -34,7 +34,7 @@ function update_script() {
systemctl stop nodecast-tv systemctl stop nodecast-tv
msg_ok "Stopped Service" 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" msg_info "Updating Modules"
cd /opt/nodecast-tv cd /opt/nodecast-tv
+1
View File
@@ -76,6 +76,7 @@ function update_script() {
if [[ -f "$DB" ]]; then 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 '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 '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 # Create new role-mapping tables and migrate data before drizzle-kit
# drops the roleId columns from userOrgs and userInvites. # drops the roleId columns from userOrgs and userInvites.
+61 -49
View File
@@ -29,63 +29,75 @@ function update_script() {
exit exit
fi fi
if ! grep -q "PORT=3001" /opt/patchmon/backend/.env; then RELEASE="v2.0.1"
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
if check_for_gh_release "PatchMon" "PatchMon/PatchMon" "${RELEASE}"; then if check_for_gh_release "PatchMon" "PatchMon/PatchMon" "${RELEASE}"; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop patchmon-server systemctl stop patchmon-server
msg_ok "Stopped Service" msg_ok "Stopped Service"
msg_info "Creating Backup" if [[ -d /opt/patchmon/backend ]]; then
cp /opt/patchmon/backend/.env /opt/backend.env msg_info "Legacy install detected - creating full backup, please wait..."
cp /opt/patchmon/frontend/.env /opt/frontend.env $STD tar czf ~/patchmon_legacy.tar.gz /opt/patchmon
msg_ok "Backup Created" cp /opt/patchmon/backend/.env /opt/legacy.env
msg_ok "Full backup saved in /root"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "tarball" "${RELEASE}" "/opt/patchmon" msg_info "Starting migration to PatchMon v2.x.x"
systemctl disable -q --now nginx
msg_info "Updating PatchMon" $STD npm cache clean --force
VERSION=$(get_latest_github_release "PatchMon/PatchMon") $STD apt autoremove --purge -y {nginx,nodejs}
SERVER_PORT="$(sed -n '/SERVER_PORT/s/[^=]*=//p' /opt/backend.env)" if [[ -f /etc/apt/sources.list.d/nodesource.sources ]]; then
sed -i 's/PORT=3399/PORT=3001/' /opt/backend.env cp /etc/apt/sources.list.d/nodesource.sources /etc/apt/sources.list.d/nodesource.sources.bak
sed -i -e "s/VERSION=.*/VERSION=$VERSION/" \ rm -f /etc/apt/sources.list.d/nodesource.sources
-e '/^VITE_API_URL/d' /opt/frontend.env elif [[ -f /etc/apt/sources.list.d/nodesource.list ]]; then
export NODE_ENV=production cp /etc/apt/sources.list.d/nodesource.list /etc/apt/sources.list.d/nodesource.list.bak
cd /opt/patchmon rm -f /etc/apt/sources.list.d/nodesource.list
$STD npm install --no-audit --no-fund --no-save --ignore-scripts fi
cd /opt/patchmon/frontend rm -rf /opt/patchmon
mv /opt/frontend.env /opt/patchmon/frontend/.env mkdir -p /opt/patchmon/agents
$STD npm install --no-audit --no-fund --no-save --ignore-scripts --include=dev cp /opt/legacy.env /opt/patchmon/.env
$STD npm run build sed -i -e 's/^PORT=.*/PORT=3000/' \
cd /opt/patchmon/backend -e 's/^NODE_/APP_/' \
mv /opt/backend.env /opt/patchmon/backend/.env -e '/^SERVER_*/d' \
$STD npm run db:generate -e '/^# API*/,+2d' /opt/patchmon/.env
$STD npx prisma migrate deploy {
cp /opt/patchmon/docker/nginx.conf.template /etc/nginx/sites-available/patchmon.conf echo ""
sed -i -e 's|proxy_pass .*|proxy_pass http://127.0.0.1:3001;|' \ echo "SESSION_SECRET=$(openssl rand -hex 64)"
-e '\|try_files |i\ root /opt/patchmon/frontend/dist;' \ echo "AI_ENCRYPTION_KEY=$(openssl rand -hex 64)"
-e 's|alias.*|alias /opt/patchmon/frontend/dist/assets;|' \ echo "AGENT_BINARIES_DIR=/opt/patchmon/agents"
-e '\|expires 1y|i\ root /opt/patchmon/frontend/dist;' /etc/nginx/sites-available/patchmon.conf } >>/opt/patchmon/.env
if [[ -n "$SERVER_PORT" ]] && [[ "$SERVER_PORT" != "443" ]]; then sed -i -e '\|Directory|s|/backend||' \
sed -i "s/listen [[:digit:]].*/listen ${SERVER_PORT};/" /etc/nginx/sites-available/patchmon.conf -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 fi
ln -sf /etc/nginx/sites-available/patchmon.conf /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default CLEAN_INSTALL=1 fetch_and_deploy_gh_release "PatchMon" "PatchMon/PatchMon" "singlefile" "${RELEASE}" "/opt/patchmon" "patchmon-server-linux-amd64"
$STD nginx -t mv /opt/patchmon/PatchMon /opt/patchmon/patchmon-server
systemctl restart nginx
msg_ok "Updated PatchMon" 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" 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 systemctl start patchmon-server
msg_ok "Started Service" msg_ok "Started Service"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
+54
View File
@@ -0,0 +1,54 @@
#!/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/storybookjs/storybook
APP="Storybook"
var_tags="${var_tags:-dev-tools;frontend;ui}"
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 [[ ! -f /opt/storybook/.projectpath ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
PROJECT_PATH=$(cat /opt/storybook/.projectpath)
if [[ ! -d "$PROJECT_PATH" ]]; then
msg_error "Project directory not found: $PROJECT_PATH"
exit
fi
msg_info "Updating Storybook"
cd "$PROJECT_PATH"
$STD npx storybook@latest upgrade --yes
msg_ok "Updated Storybook"
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}:6006${CL}"
+7 -10
View File
@@ -32,8 +32,8 @@ function update_script() {
systemctl daemon-reload systemctl daemon-reload
systemctl enable -q --now technitium systemctl enable -q --now technitium
fi fi
if is_package_installed "aspnetcore-runtime-8.0"; then if ! is_package_installed "aspnetcore-runtime-10.0"; then
$STD apt remove -y aspnetcore-runtime-8.0 $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 /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 [ -f /usr/share/keyrings/microsoft-prod.gpg ] && rm -f /usr/share/keyrings/microsoft-prod.gpg
setup_deb822_repo \ setup_deb822_repo \
@@ -42,18 +42,15 @@ function update_script() {
"https://packages.microsoft.com/debian/13/prod/" \ "https://packages.microsoft.com/debian/13/prod/" \
"trixie" \ "trixie" \
"main" "main"
$STD apt install -y aspnetcore-runtime-9.0 $STD apt install -y aspnetcore-runtime-10.0
fi fi
RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+') RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+')
if [[ ! -f ~/.technitium || ${RELEASE} != "$(cat ~/.technitium)" ]]; then if [[ ! -f ~/.technitium || ${RELEASE} != "$(cat ~/.technitium 2>/dev/null)" ]]; then
msg_info "Updating Technitium DNS" systemctl stop technitium
curl -fsSL "https://download.technitium.com/dns/DnsServerPortable.tar.gz" -o /opt/DnsServerPortable.tar.gz fetch_and_deploy_from_url "https://download.technitium.com/dns/DnsServerPortable.tar.gz" /opt/technitium/dns
$STD tar zxvf /opt/DnsServerPortable.tar.gz -C /opt/technitium/dns/
rm -f /opt/DnsServerPortable.tar.gz
echo "${RELEASE}" >~/.technitium echo "${RELEASE}" >~/.technitium
systemctl restart technitium systemctl start technitium
msg_ok "Updated Technitium DNS"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
else else
msg_ok "No update required. Technitium DNS is already at v${RELEASE}." msg_ok "No update required. Technitium DNS is already at v${RELEASE}."
+3 -1
View File
@@ -145,7 +145,7 @@ EOF
cp -r /opt/termix/uploads /opt/termix_uploads_backup cp -r /opt/termix/uploads /opt/termix_uploads_backup
msg_ok "Backed up Data" 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" msg_info "Recreating Directories"
mkdir -p /opt/termix/html \ mkdir -p /opt/termix/html \
@@ -155,6 +155,8 @@ EOF
/opt/termix/nginx/client_body /opt/termix/nginx/client_body
msg_ok "Recreated Directories" msg_ok "Recreated Directories"
NODE_VERSION="24" setup_nodejs
msg_info "Building Frontend" msg_info "Building Frontend"
cd /opt/termix cd /opt/termix
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0 export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
+83
View File
@@ -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}"
+84
View File
@@ -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}"
+3 -2
View File
@@ -29,8 +29,9 @@ function update_script() {
exit exit
fi fi
msg_info "Updating ${APP}" msg_info "Updating Twingate Connector"
ensure_dependencies twingate-connector $STD apt update
$STD apt install -y --only-upgrade twingate-connector
$STD systemctl restart twingate-connector $STD systemctl restart twingate-connector
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
exit exit
+4
View File
@@ -32,6 +32,8 @@ function update_script() {
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop victoriametrics systemctl stop victoriametrics
[[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl stop victoriametrics-logs [[ -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" msg_ok "Stopped Service"
victoriametrics_release=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases" | victoriametrics_release=$(curl -fsSL "https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases" |
@@ -62,6 +64,8 @@ function update_script() {
msg_info "Starting Service" msg_info "Starting Service"
systemctl start victoriametrics systemctl start victoriametrics
[[ -f /etc/systemd/system/victoriametrics-logs.service ]] && systemctl start victoriametrics-logs [[ -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 "Started Service"
msg_ok "Updated successfully!" msg_ok "Updated successfully!"
fi fi
+2
View File
@@ -53,6 +53,8 @@ function update_script() {
set -a && source /opt/wger/.env && set +a set -a && source /opt/wger/.env && set +a
export DJANGO_SETTINGS_MODULE=settings.main export DJANGO_SETTINGS_MODULE=settings.main
$STD uv pip install . $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 migrate
$STD uv run python manage.py collectstatic --no-input $STD uv run python manage.py collectstatic --no-input
msg_ok "Updated wger" msg_ok "Updated wger"
+66
View File
@@ -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 <<EOF >/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
+1 -1
View File
@@ -22,7 +22,7 @@ msg_ok "Installed Dependencies"
MONGO_VERSION="8.0" setup_mongodb MONGO_VERSION="8.0" setup_mongodb
NODE_VERSION="22" setup_nodejs 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" msg_info "Configuring Checkmate"
JWT_SECRET="$(openssl rand -hex 32)" JWT_SECRET="$(openssl rand -hex 32)"
+55
View File
@@ -0,0 +1,55 @@
#!/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/coredns/coredns
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
fetch_and_deploy_gh_release "coredns" "coredns/coredns" "prebuild" "latest" "/usr/local/bin" \
"coredns_*_linux_$(dpkg --print-architecture).tgz"
chmod +x /usr/local/bin/coredns
msg_info "Configuring CoreDNS"
mkdir -p /etc/coredns
cat <<EOF >/etc/coredns/Corefile
. {
forward . 1.1.1.1 1.0.0.1
cache 30
log
errors
health :8080
ready :8181
}
EOF
msg_ok "Configured CoreDNS"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/coredns.service
[Unit]
Description=CoreDNS DNS Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/coredns -conf /etc/coredns/Corefile
Restart=on-failure
RestartSec=5
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now coredns
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
+6
View File
@@ -46,10 +46,16 @@ msg_ok "Set up Directories"
msg_info "Configuring Environment" msg_info "Configuring Environment"
SECRET_KEY_BASE=$(openssl rand -hex 64) SECRET_KEY_BASE=$(openssl rand -hex 64)
OTP_ENCRYPTION_PRIMARY_KEY=$(openssl rand -hex 64)
OTP_ENCRYPTION_DETERMINISTIC_KEY=$(openssl rand -hex 64)
OTP_ENCRYPTION_KEY_DERIVATION_SALT=$(openssl rand -hex 64)
RELEASE=$(get_latest_github_release "Freika/dawarich") RELEASE=$(get_latest_github_release "Freika/dawarich")
cat <<EOF >/opt/dawarich/.env cat <<EOF >/opt/dawarich/.env
RAILS_ENV=production RAILS_ENV=production
SECRET_KEY_BASE=${SECRET_KEY_BASE} SECRET_KEY_BASE=${SECRET_KEY_BASE}
OTP_ENCRYPTION_PRIMARY_KEY=${OTP_ENCRYPTION_PRIMARY_KEY}
OTP_ENCRYPTION_DETERMINISTIC_KEY=${OTP_ENCRYPTION_DETERMINISTIC_KEY}
OTP_ENCRYPTION_KEY_DERIVATION_SALT=${OTP_ENCRYPTION_KEY_DERIVATION_SALT}
DATABASE_HOST=localhost DATABASE_HOST=localhost
DATABASE_USERNAME=${PG_DB_USER} DATABASE_USERNAME=${PG_DB_USER}
DATABASE_PASSWORD=${PG_DB_PASS} DATABASE_PASSWORD=${PG_DB_PASS}
+174
View File
@@ -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 <<EOF >/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 <<EOF >~/fireshare.creds
Fireshare Admin Credentials
========================
Username: admin
Password: ${ADMIN_PASSWORD}
EOF
msg_ok "Configured Fireshare"
msg_info "Creating services"
cat <<EOF >/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
+2 -15
View File
@@ -25,25 +25,12 @@ PG_VERSION="17" setup_postgresql
NODE_VERSION="24" setup_nodejs NODE_VERSION="24" setup_nodejs
msg_info "Setting up Database" msg_info "Setting up Database"
DB_NAME=ghostfolio PG_DB_NAME="ghostfolio" PG_DB_USER="ghostfolio" PG_DB_SCHEMA_PERMS="true" setup_postgresql_db
DB_USER=ghostfolio
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
REDIS_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13) REDIS_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
ACCESS_TOKEN_SALT=$(openssl rand -base64 32) ACCESS_TOKEN_SALT=$(openssl rand -base64 32)
JWT_SECRET_KEY=$(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 "Ghostfolio Credentials"
echo "Database User: $DB_USER"
echo "Database Password: $DB_PASS"
echo "Database Name: $DB_NAME"
echo "Redis Password: $REDIS_PASS" echo "Redis Password: $REDIS_PASS"
echo "Access Token Salt: $ACCESS_TOKEN_SALT" echo "Access Token Salt: $ACCESS_TOKEN_SALT"
echo "JWT Secret Key: $JWT_SECRET_KEY" 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" msg_info "Setting up Environment"
cat <<EOF >/opt/ghostfolio/.env cat <<EOF >/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_HOST=localhost
REDIS_PORT=6379 REDIS_PORT=6379
REDIS_PASSWORD=$REDIS_PASS REDIS_PASSWORD=$REDIS_PASS
+35
View File
@@ -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
+1 -1
View File
@@ -27,7 +27,7 @@ msg_ok "Installed Dependencies"
NODE_VERSION="22" setup_nodejs NODE_VERSION="22" setup_nodejs
setup_uv setup_uv
fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding" fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding" "tarball"
msg_info "Building Frontend" msg_info "Building Frontend"
cd /opt/linkding cd /opt/linkding
+1 -1
View File
@@ -13,7 +13,7 @@ setting_up_container
network_check network_check
update_os 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 NODE_VERSION="20" setup_nodejs
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
+62 -46
View File
@@ -14,74 +14,90 @@ network_check
update_os update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt install -y \ $STD apt install -y redis-server
build-essential \
nginx \
redis-server
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
NODE_VERSION="24" setup_nodejs
PG_VERSION="17" setup_postgresql PG_VERSION="17" setup_postgresql
PG_DB_NAME="patchmon_db" PG_DB_USER="patchmon_usr" setup_postgresql_db 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" msg_info "Configuring PatchMon"
VERSION=$(get_latest_github_release "PatchMon/PatchMon") cat <<EOF >/opt/patchmon/.env
export NODE_ENV=production DATABASE_URL="postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME"
cd /opt/patchmon
$STD npm install --no-audit --no-fund --no-save --ignore-scripts
cd /opt/patchmon/frontend
cat <<EOF >./.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
JWT_SECRET="$(openssl rand -hex 64)" JWT_SECRET="$(openssl rand -hex 64)"
mv /opt/patchmon/backend/env.example /opt/patchmon/backend/.env SESSION_SECRET="$(openssl rand -hex 64)"
sed -i -e "s|DATABASE_URL=.*|DATABASE_URL=\"postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME\"|" \ AI_ENCRYPTION_KEY="$(openssl rand -hex 64)"
-e "/JWT_SECRET/s/[=$].*/=$JWT_SECRET/" \ CORS_ORIGIN=http://${LOCAL_IP}:3000
-e "\|CORS_ORIGIN|s|localhost|$LOCAL_IP|" \ PORT=3000
-e "/PORT=3001/aSERVER_PROTOCOL=http \\ APP_ENV=production
SERVER_HOST=$LOCAL_IP \\
SERVER_PORT=3000" \
-e '/_ENV=production/aTRUST_PROXY=1' \
-e '/REDIS_USER=.*/,+1d' /opt/patchmon/backend/.env
cd /opt/patchmon/backend # Redis
$STD npm run db:generate REDIS_HOST=localhost
$STD npx prisma migrate deploy 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_ok "Configured PatchMon"
msg_info "Configuring Nginx" msg_info "Fetching PatchMon agent binaries"
cp /opt/patchmon/docker/nginx.conf.template /etc/nginx/sites-available/patchmon.conf mkdir -p /opt/patchmon/agents
sed -i -e 's|proxy_pass .*|proxy_pass http://127.0.0.1:3001;|' \ FILE_URL="https://github.com/PatchMon/PatchMon/releases/download/${RELEASE}/patchmon-agent-"
-e '\|try_files |i\ root /opt/patchmon/frontend/dist;' \ AGENT_NAME=(
-e 's|alias.*|alias /opt/patchmon/frontend/dist/assets;|' \ "linux-amd64"
-e '\|expires 1y|i\ root /opt/patchmon/frontend/dist;' /etc/nginx/sites-available/patchmon.conf "linux-arm64"
ln -sf /etc/nginx/sites-available/patchmon.conf /etc/nginx/sites-enabled/ "linux-arm"
rm -f /etc/nginx/sites-enabled/default "linux-386"
$STD nginx -t "freebsd-amd64"
systemctl restart nginx "freebsd-arm64"
msg_ok "Configured Nginx" "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" msg_info "Creating service"
cat <<EOF >/etc/systemd/system/patchmon-server.service cat <<EOF >/etc/systemd/system/patchmon-server.service
[Unit] [Unit]
Description=PatchMon Service Description=PatchMon Server
After=network.target postgresql.service After=network.target postgresql.service
[Service] [Service]
Type=simple Type=simple
WorkingDirectory=/opt/patchmon/backend WorkingDirectory=/opt/patchmon
ExecStart=/usr/bin/npm run start ExecStart=/opt/patchmon/patchmon-server
Restart=always Restart=always
RestartSec=10 RestartSec=10
Environment=NODE_ENV=production
Environment=PATH=/usr/bin:/usr/local/bin Environment=PATH=/usr/bin:/usr/local/bin
EnvironmentFile=/opt/patchmon/.env
NoNewPrivileges=true NoNewPrivileges=true
PrivateTmp=true PrivateTmp=true
ProtectSystem=strict ProtectSystem=strict
+1 -1
View File
@@ -120,7 +120,7 @@ fetch_and_deploy_gh_release "RAHasher" "RetroAchievements/RALibretro" "prebuild"
cp /opt/RALibretro/RAHasher /usr/bin/RAHasher cp /opt/RALibretro/RAHasher /usr/bin/RAHasher
chmod +x /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" msg_info "Creating environment file"
sed -i 's/^supervised no/supervised systemd/' /etc/redis/redis.conf sed -i 's/^supervised no/supervised systemd/' /etc/redis/redis.conf
+55
View File
@@ -0,0 +1,55 @@
#!/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/storybookjs/storybook
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
msg_info "Preparing Storybook"
mkdir -p /opt/storybook
cd /opt/storybook
msg_ok "Important: Interactive configuration will start now."
npx -y storybook@latest init --yes --no-dev
PROJECT_PATH=$(find /opt/storybook -maxdepth 2 -name ".storybook" -type d 2>/dev/null | head -n1 | xargs dirname)
if [[ -z "$PROJECT_PATH" ]]; then
PROJECT_PATH="/opt/storybook"
fi
cd "$PROJECT_PATH"
echo "$PROJECT_PATH" >/opt/storybook/.projectpath
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/storybook.service
[Unit]
Description=Storybook Dev Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=${PROJECT_PATH}
ExecStart=/usr/bin/npx storybook dev --host 0.0.0.0 --port 6006 --no-open
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now storybook
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
+4 -7
View File
@@ -20,19 +20,16 @@ setup_deb822_repo \
"https://packages.microsoft.com/debian/13/prod/" \ "https://packages.microsoft.com/debian/13/prod/" \
"trixie" \ "trixie" \
"main" "main"
$STD apt install -y aspnetcore-runtime-9.0 $STD apt install -y aspnetcore-runtime-10.0
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+') RELEASE=$(curl -fsSL https://technitium.com/dns/ | grep -oP 'Version \K[\d.]+')
msg_info "Installing Technitium DNS" fetch_and_deploy_from_url "https://download.technitium.com/dns/DnsServerPortable.tar.gz" /opt/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
echo "${RELEASE}" >~/.technitium echo "${RELEASE}" >~/.technitium
msg_ok "Installed Technitium DNS"
msg_info "Creating service" 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 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" msg_ok "Service created"
+1 -1
View File
@@ -55,7 +55,7 @@ rm -rf /opt/guacamole-server
msg_ok "Built Guacamole Server (guacd)" msg_ok "Built Guacamole Server (guacd)"
NODE_VERSION="22" setup_nodejs 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" msg_info "Building Frontend"
cd /opt/termix cd /opt/termix
+100
View File
@@ -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 <<EOF >/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 <<EOF >/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
+79
View File
@@ -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 <<EOF >/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 <<EOF >/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
+132 -91
View File
@@ -2702,21 +2702,16 @@ advanced_settings() {
# STEP 28: Verbose Mode & Confirmation # STEP 28: Verbose Mode & Confirmation
# ═══════════════════════════════════════════════════════════════════════════ # ═══════════════════════════════════════════════════════════════════════════
28) 28)
# PHS_VERBOSE forces verbose mode and skips the prompt local verbose_default_flag="--defaultno"
if [[ "$PHS_MODE" == "verbose" ]]; then [[ "$_verbose" == "yes" ]] && verbose_default_flag=""
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
--title "VERBOSE MODE" \
$verbose_default_flag \
--yesno "\nEnable Verbose Mode?\n\nShows detailed output during installation." 12 58; then
_verbose="yes" _verbose="yes"
else else
local verbose_default_flag="--defaultno" _verbose="no"
[[ "$_verbose" == "yes" ]] && verbose_default_flag=""
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
--title "VERBOSE MODE" \
$verbose_default_flag \
--yesno "\nEnable Verbose Mode?\n\nShows detailed output during installation." 12 58; then
_verbose="yes"
else
_verbose="no"
fi
fi fi
# Build summary # Build summary
local ct_type_desc="Unprivileged" local ct_type_desc="Unprivileged"
@@ -3449,7 +3444,7 @@ configure_ssh_settings() {
# msg_menu() # msg_menu()
# #
# - Displays a numbered menu for update_script() functions # - Displays a numbered menu for update_script() functions
# - In silent mode (PHS_MODE=silent): auto-selects the default option # - In silent mode (PHS_SILENT=1): auto-selects the default option
# - In interactive mode: shows menu via read with 10s timeout + default fallback # - In interactive mode: shows menu via read with 10s timeout + default fallback
# - Usage: CHOICE=$(msg_menu "Title" "tag1" "Description 1" "tag2" "Desc 2" ...) # - Usage: CHOICE=$(msg_menu "Title" "tag1" "Description 1" "tag2" "Desc 2" ...)
# - The first item is always the default # - The first item is always the default
@@ -3473,7 +3468,7 @@ msg_menu() {
local count=${#tags[@]} local count=${#tags[@]}
# Silent mode: return default immediately # Silent mode: return default immediately
if [[ "$PHS_MODE" == "silent" ]]; then if [[ -n "${PHS_SILENT+x}" ]] && [[ "${PHS_SILENT}" == "1" ]]; then
echo "$default_tag" echo "$default_tag"
return 0 return 0
fi fi
@@ -3509,34 +3504,6 @@ msg_menu() {
return 0 return 0
} }
# ------------------------------------------------------------------------------
# resolve_phs_mode()
#
# - Resolves PHS_SILENT/PHS_VERBOSE env vars into a single PHS_MODE enum
# - Values: "silent", "verbose", "interactive"
# - If both PHS_SILENT=1 and PHS_VERBOSE=1, shows a conflict warning
# and defaults to "interactive"
# - Should be called once early, before any mode-dependent logic
# ------------------------------------------------------------------------------
resolve_phs_mode() {
if [[ -n "${PHS_SILENT+x}" ]] && [[ "${PHS_SILENT}" == "1" ]] && [[ -n "${PHS_VERBOSE+x}" ]] && [[ "${PHS_VERBOSE}" == "1" ]]; then
# Conflict handling must never block unattended/non-TTY updates.
# Prefer silent mode to keep automation safe.
if [[ -t 0 ]] && [[ -t 1 ]] && command -v whiptail >/dev/null 2>&1; then
whiptail --backtitle "Proxmox VE Helper Scripts" \
--title "Configuration Conflict Warning" \
--msgbox "PHS_SILENT and PHS_VERBOSE are both set.\n\nFalling back to silent mode." 10 58 || true
fi
PHS_MODE="silent"
elif [[ -n "${PHS_SILENT+x}" ]] && [[ "${PHS_SILENT}" == "1" ]]; then
PHS_MODE="silent"
elif [[ -n "${PHS_VERBOSE+x}" ]] && [[ "${PHS_VERBOSE}" == "1" ]]; then
PHS_MODE="verbose"
else
PHS_MODE="interactive"
fi
}
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# start() # start()
# #
@@ -3547,16 +3514,17 @@ resolve_phs_mode() {
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
start() { start() {
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
resolve_phs_mode
if command -v pveversion >/dev/null 2>&1; then if command -v pveversion >/dev/null 2>&1; then
install_script || return 0 install_script || return 0
return 0 return 0
elif [[ "$PHS_MODE" == "silent" ]]; then elif [ ! -z ${PHS_SILENT+x} ] && [[ "${PHS_SILENT}" == "1" ]]; then
VERBOSE="no" VERBOSE="no"
set_std_mode set_std_mode
elif [[ "$PHS_MODE" == "verbose" ]]; then ensure_profile_loaded
VERBOSE="yes" get_lxc_ip
set_std_mode update_script
update_motd_ip
cleanup_lxc
else else
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} LXC Update/Setting" --menu \ CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} LXC Update/Setting" --menu \
"Support/Update functions for ${APP} LXC. Choose an option:" \ "Support/Update functions for ${APP} LXC. Choose an option:" \
@@ -3580,12 +3548,12 @@ start() {
exit 0 exit 0
;; ;;
esac esac
ensure_profile_loaded
get_lxc_ip
update_script
update_motd_ip
cleanup_lxc
fi fi
ensure_profile_loaded
get_lxc_ip
update_script
update_motd_ip
cleanup_lxc
} }
# ============================================================================== # ==============================================================================
@@ -5408,13 +5376,59 @@ create_lxc_container() {
# Offer upgrade for pve-container/lxc-pve if candidate > installed; optional auto-retry pct create # Offer upgrade for pve-container/lxc-pve if candidate > installed; optional auto-retry pct create
# Returns: # 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) # 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 # 3 = upgrade attempted but failed OR retry failed
# 4 = user cancelled
offer_lxc_stack_upgrade_and_maybe_retry() { offer_lxc_stack_upgrade_and_maybe_retry() {
local do_retry="${1:-no}" # yes|no local do_retry="${1:-no}" # yes|no
local _pvec_i _pvec_c _lxcp_i _lxcp_c need=0 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)" _pvec_i="$(pkg_ver pve-container)"
_lxcp_i="$(pkg_ver lxc-pve)" _lxcp_i="$(pkg_ver lxc-pve)"
@@ -5435,19 +5449,25 @@ create_lxc_container() {
msg_warn "An update for the Proxmox LXC stack is available" 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 " 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 " lxc-pve : installed=${_lxcp_i:-n/a} candidate=${_lxcp_c:-n/a}"
echo " note : option 1 runs host apt update + apt upgrade"
echo echo
# Offer older OS version fallback when template version might be too new for LXC stack # Offer older OS version fallback when template version might be too new for LXC stack
local _has_fallback_option=false 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 _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 " [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/tty
else
echo " [1] Run host upgrade now (recommended). WARNING: this runs apt upgrade and updates all Packages on your host!"
echo " [2] Ignore"
echo " [3] Cancel" echo " [3] Cancel"
echo echo
read -rp "Select option [1/2/3]: " _ans </dev/tty read -rp "Select option [1/2/3]: " _ans </dev/tty
else
read -rp "Do you want to upgrade now? [y/N] " _ans </dev/tty
fi fi
if [[ "$_has_fallback_option" == true ]]; then if [[ "$_has_fallback_option" == true ]]; then
@@ -5456,35 +5476,48 @@ create_lxc_container() {
_ans="y" _ans="y"
;; ;;
2) 2)
if [[ "$do_retry" == "yes" ]]; then if fallback_to_previous_os_version; then
if fallback_to_previous_os_version; then return 0
return 0
else
return 3
fi
else else
msg_custom "️" "${YW}" "OS version fallback is only available during container creation." return 3
return 2
fi fi
;; ;;
*) 3)
return 2 return 2
;; ;;
4)
return 4
;;
*)
return 4
;;
esac
else
case "$_ans" in
1)
_ans="y"
;;
2)
return 2
;;
*)
return 4
;;
esac esac
fi fi
case "${_ans,,}" in case "${_ans,,}" in
y | yes) y | yes)
msg_info "Upgrading Proxmox LXC stack (pve-container, lxc-pve)" msg_info "Running host upgrade for LXC stack compatibility"
apt_update_safe apt_update_safe
if $STD apt-get install -y --only-upgrade pve-container lxc-pve; then if $STD apt-get upgrade -y; then
msg_ok "LXC stack upgraded." msg_ok "LXC stack upgraded."
# Verify pct binary still works after upgrade (partial upgrades can break Perl modules) # Verify pct binary still works after upgrade (partial upgrades can break Perl modules)
if ! pct list &>/dev/null; then if ! pct list &>/dev/null; then
msg_error "LXC stack upgrade caused PVE tool breakage (likely Perl module incompatibility)." 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}" "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:" 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" echo -e "${TAB} reboot"
return 3 return 3
fi fi
@@ -6093,16 +6126,20 @@ create_lxc_container() {
rc=$? rc=$?
case $rc in case $rc in
0) : ;; # success - container created, continue 0) : ;; # success - container created, continue
2 | 3) 2)
# Upgrade declined or failed — try older OS version as last resort msg_error "LXC stack upgrade ignored. Please inspect: $LOGFILE"
msg_warn "Attempting older ${PCT_OSTYPE:-} version as last resort" _flush_pct_log
if fallback_to_previous_os_version; then exit 231
: # success ;;
else 3)
msg_error "All recovery options exhausted. Please inspect: $LOGFILE" msg_error "LXC stack upgrade failed. Please inspect: $LOGFILE"
_flush_pct_log _flush_pct_log
exit 231 exit 231
fi ;;
4)
msg_error "Cancelled by user."
_flush_pct_log
exit 231
;; ;;
esac esac
else else
@@ -6126,16 +6163,20 @@ create_lxc_container() {
rc=$? rc=$?
case $rc in case $rc in
0) : ;; # success - container created, continue 0) : ;; # success - container created, continue
2 | 3) 2)
# Upgrade declined or failed — try older OS version as last resort msg_error "LXC stack upgrade ignored. Please inspect: $LOGFILE"
msg_warn "Attempting older ${PCT_OSTYPE:-} version as last resort" _flush_pct_log
if fallback_to_previous_os_version; then exit 231
: # success ;;
else 3)
msg_error "All recovery options exhausted. Please inspect: $LOGFILE" msg_error "LXC stack upgrade failed. Please inspect: $LOGFILE"
_flush_pct_log _flush_pct_log
exit 231 exit 231
fi ;;
4)
msg_error "Cancelled by user."
_flush_pct_log
exit 231
;; ;;
esac esac
else else
+2 -2
View File
@@ -940,7 +940,7 @@ is_verbose_mode() {
# #
# - Detects if script is running in unattended/non-interactive mode # - Detects if script is running in unattended/non-interactive mode
# - Checks MODE variable first (primary method) # - Checks MODE variable first (primary method)
# - Falls back to legacy flags (PHS_MODE, var_unattended) # - Falls back to legacy flags (PHS_SILENT, var_unattended)
# - Returns 0 (true) if unattended, 1 (false) otherwise # - Returns 0 (true) if unattended, 1 (false) otherwise
# - Used by prompt functions to auto-apply defaults # - Used by prompt functions to auto-apply defaults
# #
@@ -984,7 +984,7 @@ is_unattended() {
esac esac
# Legacy fallbacks for compatibility # Legacy fallbacks for compatibility
[[ "${PHS_MODE:-}" == "silent" ]] && return 0 [[ "${PHS_SILENT:-0}" == "1" ]] && return 0
[[ "${var_unattended:-}" =~ ^(yes|true|1)$ ]] && return 0 [[ "${var_unattended:-}" =~ ^(yes|true|1)$ ]] && return 0
[[ "${UNATTENDED:-}" =~ ^(yes|true|1)$ ]] && return 0 [[ "${UNATTENDED:-}" =~ ^(yes|true|1)$ ]] && return 0
+45
View File
@@ -313,6 +313,51 @@ error_handler() {
echo -e "${TAB}-----------------------------------\n" echo -e "${TAB}-----------------------------------\n"
fi 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 # Detect context: Container (INSTALL_LOG set + inside container /root) vs Host
if [[ -n "${INSTALL_LOG:-}" && -f "${INSTALL_LOG:-}" && -d /root ]]; then if [[ -n "${INSTALL_LOG:-}" && -f "${INSTALL_LOG:-}" && -d /root ]]; then
# CONTAINER CONTEXT: Copy log and create flag file for host # CONTAINER CONTEXT: Copy log and create flag file for host
+43 -5
View File
@@ -1924,8 +1924,8 @@ setup_deb822_repo() {
echo "Types: deb" echo "Types: deb"
echo "URIs: $repo_url" echo "URIs: $repo_url"
echo "Suites: $suite" echo "Suites: $suite"
# Flat repositories (suite="./" or absolute path) must not have Components # Flat repositories (suite ending with "/" or "./") must not have Components
if [[ "$suite" != "./" && -n "$component" ]]; then if [[ "$suite" != *"/" && -n "$component" ]]; then
echo "Components: $component" echo "Components: $component"
fi fi
[[ -n "$architectures" ]] && echo "Architectures: $architectures" [[ -n "$architectures" ]] && echo "Architectures: $architectures"
@@ -4011,9 +4011,14 @@ function setup_ffmpeg() {
DEPS+=( DEPS+=(
libx264-dev libx265-dev libvpx-dev libmp3lame-dev libx264-dev libx265-dev libvpx-dev libmp3lame-dev
libfreetype6-dev libass-dev libopus-dev libvorbis-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 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" msg_error "Invalid FFMPEG_TYPE: $TYPE"
@@ -6336,12 +6341,15 @@ function setup_nodejs() {
} }
fi 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 if [[ -n "$CURRENT_NODE_VERSION" && "$CURRENT_NODE_VERSION" == "$NODE_VERSION" ]]; then
msg_info "Update Node.js $NODE_VERSION" msg_info "Update Node.js $NODE_VERSION"
ensure_apt_working || return 100 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) # 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 $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" msg_ok "Setup Node.js $NODE_VERSION"
fi 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) # Ensure valid working directory for npm (avoids uv_cwd error)
if [[ ! -d /opt ]]; then if [[ ! -d /opt ]]; then
+16 -2
View File
@@ -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 . 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 ----
main() { main() {
header_info header_info
@@ -90,8 +98,14 @@ main() {
CODENAME="$(get_pbs_codename)" CODENAME="$(get_pbs_codename)"
case "$CODENAME" in case "$CODENAME" in
bookworm) start_routines_3 ;; bookworm)
trixie) start_routines_4 ;; require_whiptail
start_routines_3
;;
trixie)
require_whiptail
start_routines_4
;;
*) *)
msg_error "Unsupported Debian codename: $CODENAME" msg_error "Unsupported Debian codename: $CODENAME"
echo -e "Supported: bookworm (PBS 3.x) and trixie (PBS 4.x)" echo -e "Supported: bookworm (PBS 3.x) and trixie (PBS 4.x)"
+5 -5
View File
@@ -405,11 +405,6 @@ for container in $CHOICE; do
esac esac
exit_code=$? 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: #5) if build resources are different than run resources, then:
if [ "$UPDATE_BUILD_RESOURCES" -eq "1" ]; then if [ "$UPDATE_BUILD_RESOURCES" -eq "1" ]; then
pct set "$container" --cores "$run_cpu" --memory "$run_ram" pct set "$container" --cores "$run_cpu" --memory "$run_ram"
@@ -421,6 +416,11 @@ for container in $CHOICE; do
containers_needing_reboot+=("$container ($container_hostname)") containers_needing_reboot+=("$container ($container_hostname)")
fi 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 if [ $exit_code -eq 0 ]; then
msg_ok "Updated container $container" msg_ok "Updated container $container"
elif [ $exit_code -eq 75 ]; then elif [ $exit_code -eq 75 ]; then
+10
View File
@@ -66,10 +66,20 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
pct start "$container" pct start "$container"
sleep 5 sleep 5
update_container "$container" || echo " [Error] Update failed for $container" 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" echo -e "[Info] Shutting down $container"
pct shutdown "$container" --timeout 60 & pct shutdown "$container" --timeout 60 &
elif [ "$status" == "status: running" ]; then elif [ "$status" == "status: running" ]; then
update_container "$container" || echo " [Error] Update failed for $container" 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
fi fi
done done
+11 -9
View File
@@ -110,15 +110,17 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
elif [ "$status" == "status: running" ]; then elif [ "$status" == "status: running" ]; then
update_container $container update_container $container
fi fi
if pct exec "$container" -- [ -e "/var/run/reboot-required" ]; then if [ "$status" == "status: running" ]; then
# Get the container's hostname and add it to the list if pct exec "$container" -- [ -e "/var/run/reboot-required" ]; then
container_hostname=$(pct exec "$container" hostname) # Get the container's hostname and add it to the list
containers_needing_reboot+=("$container ($container_hostname)") container_hostname=$(pct exec "$container" hostname)
fi containers_needing_reboot+=("$container ($container_hostname)")
# check if patchmon agent is present in container and run a report if found fi
if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then # check if patchmon agent is present in container and run a report if found
echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n" if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then
pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report" 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
fi fi
done done