Changes:
- Replace 6x echo|sed with bash parameter expansion in
_build_current_app_vars_tmp() — eliminates 12 subprocess forks
(6 echo + 6 sed) per advanced settings save cycle.
- Replace 4x echo|tr with bash builtins for lowercase + space
removal in variables(), base_settings(), advanced_settings()
hostname and tags handling — eliminates 8 subprocess forks.
- Consolidate 4 grep|awk|grep pipelines in template discovery to
single awk passes — each template search now uses 1 awk process
instead of 3 (grep + awk + grep). Applied to all online template
and version discovery paths in create_lxc_container().
- Consolidate 2 grep|cut reads in ensure_storage_selection_for_vars_file()
to single while-read loop — 1 file read instead of 2.
Changes:
- Add pveam_cached() function with associative array cache for
pveam available/list calls. Eliminates 5 redundant 'pveam available
-section system' calls (each involves network I/O + catalog parsing)
and 2 redundant 'pveam list' calls during template discovery.
Cache is invalidated after pveam download for fresh post-check.
- Consolidate get_current_ip(): single 'hostname -I' call with bash
array parsing instead of 2 calls piped through tr/grep/head.
Pure bash regex matching replaces external grep for IPv4 detection.
- Batch update_motd_ip(): single sed pass with 3 expressions replaces
3 separate grep + sed pairs (6 file reads → 1 read + 1 write).
Read /etc/os-release once with sed instead of 2 grep|cut|tr pipes.
- Pre-warm pvesm cache at create_lxc_container() start: fetches
pvesm status (unfiltered, rootdir, vztmpl) in 3 calls upfront so
all subsequent pvesm_status_cached calls are instant cache hits.
Changes:
- Extract 7 functions from build_container() to module level:
is_gpu_app(), detect_gpu_devices(), configure_usb_passthrough(),
configure_gpu_passthrough(), configure_additional_devices(),
get_container_gid(), pvesm_status_cached()
Prevents function re-declaration on recursive retry attempts.
- Add recursion guard (_BUILD_DEPTH max 3) to build_container()
to prevent infinite OOM→retry→OOM→retry loops (exit code 250).
- Add 30s timeout to multi-GPU selection prompt with auto-select
fallback for the first available GPU type.
- Add pvesm_status_cached() with associative array cache keyed by
arguments. Eliminates ~10 redundant pvesm subprocess calls during
a single container creation flow. Applied to: check_storage_support(),
select_storage(), resolve_storage_preselect(), create_lxc_container()
rootdir/vztmpl validation, validate_storage_space(),
choose_and_set_storage_for_file(), and settings validation.
- Simplify check_storage_support() from while-read loop to single
pipeline with grep.
Performance:
- resolve_ip_from_range(): parallel ping in batches of 10 (up to 10x faster)
+ Added bounds validation (start > end check)
+ Added range cap at 254 IPs to prevent excessive scanning
- _detect_bridges(): replaced 30-line config file parser with sysfs lookup
(instant /sys/class/net/*/bridge detection + OVS bridge support)
+ Bridge descriptions now searched across interfaces.d/ too
- fix_gpu_gids(): read GIDs from mounted rootfs before first container start
→ eliminates 3+ second stop/edit/restart cycle for GPU passthrough
Bugfix:
- VAR_WHITELIST: consolidated 3 separate declarations into single global
+ Global copy was missing var_keyctl, var_mknod, var_mount_fs, var_nesting,
var_protection, var_timezone, var_searchdomain — these were silently
dropped from app defaults when default_var_settings() wasn't in scope
Edge case:
- description(): added IPv6 fallback for IPv6-only containers
Compute today's date once and use a consolidated patchBody for PATCH requests (including last_update_commit from PR_URL/COMMIT_URL). Add logic to promote dev scripts on merge: if record.is_dev === true, set is_dev to false and script_created to today, and log the promotion. Replace the previous duplicated date construction with the new patchBody.
* fix(nginxproxymanager): build OpenResty from source via GitHub releases
Replace the unreliable openresty.org apt repository with building
OpenResty from source. Uses fetch_and_deploy_gh_release to download
from github.com/openresty/openresty/releases, then compiles locally.
The apt mirror frequently has sync issues (mismatched file sizes/hashes)
causing 'apt update' to fail with exit code 100.
Changes:
- Use fetch_and_deploy_gh_release for OpenResty source download
- Compile with configure/make/make install
- Add build dependencies (libpcre3-dev, libssl-dev, zlib1g-dev)
- Create systemd service unit for source-built OpenResty
- Update script: remove old apt repo, migrate to source build
* Fix installation command syntax for dependencies
* bump from ved testing
* fix(kometa): fix config.yml sed patterns, add Quickstart integration
- Fix sed commands for plex token and tmdb apikey (empty values in template, not hash placeholders)
- Use section-aware sed to avoid replacing wrong token/apikey fields
- Add Kometa Quickstart web UI on port 7171
* Enhance kometa-install.sh for virtualenv and services
Updated the installation script to include a virtual environment setup and modified service enabling commands.
* Update install/kometa-install.sh
Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
---------
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
* fix(reactive-resume): add git dependency for v5.0.13+
Reactive Resume v5.0.13 uses vite-plus (vp config) in its prepare
script which requires git. Without it, pnpm install fails with
'git command not found' (ELIFECYCLE exit code 1).
Closes#13110
* Add dependency check for git before stopping services