mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-25 19:07:40 +03:00
Compare commits
24 Commits
add_source
...
fix/node-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a3b8312dee | ||
|
|
daaf1e09f6 | ||
|
|
e7e78ae35d | ||
|
|
6df91f54af | ||
|
|
8c0016c0a7 | ||
|
|
a94bf79869 | ||
|
|
191539b28b | ||
|
|
31f410c3e5 | ||
|
|
efdfe127a7 | ||
|
|
007ecc3c14 | ||
|
|
db95b776b7 | ||
|
|
1560a7fb97 | ||
|
|
8fc5b83b57 | ||
|
|
33fd68b97f | ||
|
|
7e37d23c5e | ||
|
|
cc034b57ff | ||
|
|
98792e9394 | ||
|
|
87b7918779 | ||
|
|
aa6e2b57fb | ||
|
|
b3eb937d55 | ||
|
|
af24e42919 | ||
|
|
dbdd891a99 | ||
|
|
1a066e88a9 | ||
|
|
0e364adb54 |
149
.github/workflows/check-node-versions.yml
generated
vendored
149
.github/workflows/check-node-versions.yml
generated
vendored
@@ -13,7 +13,7 @@ permissions:
|
||||
jobs:
|
||||
check-node-versions:
|
||||
if: github.repository == 'community-scripts/ProxmoxVE'
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: coolify-runner
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
@@ -110,22 +110,94 @@ jobs:
|
||||
}
|
||||
|
||||
# Extract Node major from engines.node in package.json
|
||||
# Sets: ENGINES_NODE_RAW (raw string), ENGINES_MIN_MAJOR
|
||||
# Sets: ENGINES_NODE_RAW (raw string), ENGINES_MIN_MAJOR, ENGINES_IS_MINIMUM
|
||||
extract_engines_node() {
|
||||
local content="$1"
|
||||
ENGINES_NODE_RAW=""
|
||||
ENGINES_MIN_MAJOR=""
|
||||
ENGINES_IS_MINIMUM="false"
|
||||
|
||||
ENGINES_NODE_RAW=$(echo "$content" | jq -r '.engines.node // empty' 2>/dev/null || echo "")
|
||||
if [[ -z "$ENGINES_NODE_RAW" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# Detect if constraint is a minimum (>=, ^) vs exact pinning
|
||||
if [[ "$ENGINES_NODE_RAW" =~ ^(\>=|\^|\~) ]]; then
|
||||
ENGINES_IS_MINIMUM="true"
|
||||
fi
|
||||
|
||||
# Extract the first number (major) from the constraint
|
||||
# Handles: ">=24.13.1", "^22", ">=18.0.0", ">=18.15.0 <19 || ^20", etc.
|
||||
ENGINES_MIN_MAJOR=$(echo "$ENGINES_NODE_RAW" | grep -oP '\d+' | head -1 || echo "")
|
||||
}
|
||||
|
||||
# Check if our_version satisfies an engines.node constraint
|
||||
# Returns 0 if satisfied, 1 if not
|
||||
# Usage: version_satisfies_engines "22" ">=18.0.0" "true"
|
||||
version_satisfies_engines() {
|
||||
local our="$1"
|
||||
local min_major="$2"
|
||||
local is_minimum="$3"
|
||||
|
||||
if [[ -z "$min_major" || -z "$our" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ "$is_minimum" == "true" ]]; then
|
||||
# >= or ^ constraint: our version must be >= min_major
|
||||
if [[ "$our" -ge "$min_major" ]]; then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Search for files in subdirectories via GitHub API tree
|
||||
# Usage: find_repo_file "owner/repo" "branch" "filename" => sets REPLY to raw URL or empty
|
||||
find_repo_file() {
|
||||
local repo="$1"
|
||||
local branch="$2"
|
||||
local filename="$3"
|
||||
REPLY=""
|
||||
|
||||
# Try root first (fast)
|
||||
local root_url="https://raw.githubusercontent.com/${repo}/${branch}/${filename}"
|
||||
if curl -sfI "$root_url" >/dev/null 2>&1; then
|
||||
REPLY="$root_url"
|
||||
return
|
||||
fi
|
||||
|
||||
# Search via GitHub API tree (recursive)
|
||||
local tree_url="https://api.github.com/repos/${repo}/git/trees/${branch}?recursive=1"
|
||||
local tree_json
|
||||
tree_json=$(curl -sf -H "Authorization: token $GH_TOKEN" "$tree_url" 2>/dev/null || echo "")
|
||||
if [[ -z "$tree_json" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# Find first matching path (prefer shorter/root-level paths)
|
||||
local match_path
|
||||
match_path=$(echo "$tree_json" | jq -r --arg fn "$filename" \
|
||||
'.tree[]? | select(.path | endswith("/" + $fn) or . == $fn) | .path' 2>/dev/null \
|
||||
| sort | head -1 || echo "")
|
||||
|
||||
if [[ -n "$match_path" ]]; then
|
||||
REPLY="https://raw.githubusercontent.com/${repo}/${branch}/${match_path}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Extract Node major from .nvmrc or .node-version
|
||||
# Sets: NVMRC_NODE_MAJOR
|
||||
extract_nvmrc_node() {
|
||||
local content="$1"
|
||||
NVMRC_NODE_MAJOR=""
|
||||
# .nvmrc/.node-version typically has: "v22.9.0", "22", "lts/iron", etc.
|
||||
local ver
|
||||
ver=$(echo "$content" | tr -d '[:space:]' | grep -oP '^v?\K[0-9]+' | head -1 || echo "")
|
||||
NVMRC_NODE_MAJOR="$ver"
|
||||
}
|
||||
|
||||
# Collect results
|
||||
declare -a issue_scripts=()
|
||||
declare -a report_lines=()
|
||||
@@ -143,7 +215,10 @@ jobs:
|
||||
slug=$(basename "$script" | sed 's/-install\.sh$//')
|
||||
|
||||
# Extract Source URL (GitHub only)
|
||||
source_url=$(head -20 "$script" | grep -oP '(?<=# Source: )https://github\.com/[^\s]+' | head -1 || echo "")
|
||||
# Supports both:
|
||||
# # Source: https://github.com/owner/repo
|
||||
# # Source: https://example.com | Github: https://github.com/owner/repo
|
||||
source_url=$(head -20 "$script" | grep -oP 'https://github\.com/[^\s|]+' | head -1 || echo "")
|
||||
if [[ -z "$source_url" ]]; then
|
||||
report_lines+=("| \`$slug\` | — | — | — | — | ⏭️ No GitHub source |")
|
||||
continue
|
||||
@@ -167,12 +242,23 @@ jobs:
|
||||
fi
|
||||
fi
|
||||
|
||||
# Fetch upstream Dockerfile
|
||||
# Determine default branch via GitHub API (fast, single call)
|
||||
detected_branch=""
|
||||
api_default=$(curl -sf -H "Authorization: token $GH_TOKEN" \
|
||||
"https://api.github.com/repos/${repo}" 2>/dev/null \
|
||||
| jq -r '.default_branch // empty' 2>/dev/null || echo "")
|
||||
if [[ -n "$api_default" ]]; then
|
||||
detected_branch="$api_default"
|
||||
else
|
||||
detected_branch="main"
|
||||
fi
|
||||
|
||||
# Fetch upstream Dockerfile (root + subdirectories)
|
||||
df_content=""
|
||||
for branch in main master dev; do
|
||||
df_content=$(curl -sf "https://raw.githubusercontent.com/${repo}/${branch}/Dockerfile" 2>/dev/null || echo "")
|
||||
[[ -n "$df_content" ]] && break
|
||||
done
|
||||
find_repo_file "$repo" "$detected_branch" "Dockerfile"
|
||||
if [[ -n "$REPLY" ]]; then
|
||||
df_content=$(curl -sf "$REPLY" 2>/dev/null || echo "")
|
||||
fi
|
||||
|
||||
DF_NODE_MAJOR=""
|
||||
DF_SOURCE=""
|
||||
@@ -180,19 +266,35 @@ jobs:
|
||||
extract_dockerfile_node "$df_content"
|
||||
fi
|
||||
|
||||
# Fetch upstream package.json
|
||||
# Fetch upstream package.json (root + subdirectories)
|
||||
pkg_content=""
|
||||
for branch in main master dev; do
|
||||
pkg_content=$(curl -sf "https://raw.githubusercontent.com/${repo}/${branch}/package.json" 2>/dev/null || echo "")
|
||||
[[ -n "$pkg_content" ]] && break
|
||||
done
|
||||
find_repo_file "$repo" "$detected_branch" "package.json"
|
||||
if [[ -n "$REPLY" ]]; then
|
||||
pkg_content=$(curl -sf "$REPLY" 2>/dev/null || echo "")
|
||||
fi
|
||||
|
||||
ENGINES_NODE_RAW=""
|
||||
ENGINES_MIN_MAJOR=""
|
||||
ENGINES_IS_MINIMUM="false"
|
||||
if [[ -n "$pkg_content" ]]; then
|
||||
extract_engines_node "$pkg_content"
|
||||
fi
|
||||
|
||||
# Fallback: check .nvmrc or .node-version
|
||||
NVMRC_NODE_MAJOR=""
|
||||
if [[ -z "$DF_NODE_MAJOR" && -z "$ENGINES_MIN_MAJOR" ]]; then
|
||||
for nvmfile in .nvmrc .node-version; do
|
||||
find_repo_file "$repo" "$detected_branch" "$nvmfile"
|
||||
if [[ -n "$REPLY" ]]; then
|
||||
nvmrc_content=$(curl -sf "$REPLY" 2>/dev/null || echo "")
|
||||
if [[ -n "$nvmrc_content" ]]; then
|
||||
extract_nvmrc_node "$nvmrc_content"
|
||||
[[ -n "$NVMRC_NODE_MAJOR" ]] && break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Determine upstream recommended major version
|
||||
upstream_major=""
|
||||
upstream_hint=""
|
||||
@@ -203,6 +305,9 @@ jobs:
|
||||
elif [[ -n "$ENGINES_MIN_MAJOR" ]]; then
|
||||
upstream_major="$ENGINES_MIN_MAJOR"
|
||||
upstream_hint="engines: $ENGINES_NODE_RAW"
|
||||
elif [[ -n "$NVMRC_NODE_MAJOR" ]]; then
|
||||
upstream_major="$NVMRC_NODE_MAJOR"
|
||||
upstream_hint=".nvmrc/.node-version"
|
||||
fi
|
||||
|
||||
# Build display values
|
||||
@@ -214,13 +319,23 @@ jobs:
|
||||
if [[ "$our_version" == "dynamic" ]]; then
|
||||
status="🔄 Dynamic"
|
||||
elif [[ "$our_version" == "unset" ]]; then
|
||||
status="⚠️ NODE_VERSION not set"
|
||||
if [[ -n "$upstream_major" ]]; then
|
||||
status="⚠️ NODE_VERSION not set (upstream=$upstream_major via $upstream_hint)"
|
||||
else
|
||||
status="⚠️ NODE_VERSION not set (no upstream info found)"
|
||||
fi
|
||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
||||
drift_count=$((drift_count + 1))
|
||||
elif [[ -n "$upstream_major" && "$our_version" != "$upstream_major" ]]; then
|
||||
status="🔸 Drift → upstream=$upstream_major ($upstream_hint)"
|
||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
||||
drift_count=$((drift_count + 1))
|
||||
# Check if engines.node is a minimum constraint that our version satisfies
|
||||
if [[ -z "$DF_NODE_MAJOR" && "$ENGINES_IS_MINIMUM" == "true" ]] && \
|
||||
version_satisfies_engines "$our_version" "$ENGINES_MIN_MAJOR" "$ENGINES_IS_MINIMUM"; then
|
||||
status="✅ (engines: $ENGINES_NODE_RAW — ours: $our_version satisfies)"
|
||||
else
|
||||
status="🔸 Drift → upstream=$upstream_major ($upstream_hint)"
|
||||
issue_scripts+=("$slug|$our_version|$upstream_major|$upstream_hint|$repo")
|
||||
drift_count=$((drift_count + 1))
|
||||
fi
|
||||
fi
|
||||
|
||||
report_lines+=("| \`$slug\` | $our_version | $engines_display | $dockerfile_display | [$repo](https://github.com/$repo) | $status |")
|
||||
|
||||
28
CHANGELOG.md
28
CHANGELOG.md
@@ -407,27 +407,53 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-02-25
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- OpenProject: Various fixes [@tremor021](https://github.com/tremor021) ([#12246](https://github.com/community-scripts/ProxmoxVE/pull/12246))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Fix detection of ssh keys [@1-tempest](https://github.com/1-tempest) ([#12230](https://github.com/community-scripts/ProxmoxVE/pull/12230))
|
||||
|
||||
## 2026-02-24
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- adds further documentation during the installation script. [@d12rio](https://github.com/d12rio) ([#12248](https://github.com/community-scripts/ProxmoxVE/pull/12248))
|
||||
- several scripts: add additional github link in source [@MickLesk](https://github.com/MickLesk) ([#12282](https://github.com/community-scripts/ProxmoxVE/pull/12282))
|
||||
- adds further documentation during the installation script. [@d12rio](https://github.com/d12rio) ([#12248](https://github.com/community-scripts/ProxmoxVE/pull/12248))
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- [Fix] PatchMon: remove VITE_API_URL from frontend env [@vhsdream](https://github.com/vhsdream) ([#12294](https://github.com/community-scripts/ProxmoxVE/pull/12294))
|
||||
- fix(searxng): remove orphaned fi causing syntax error [@mark-jeffrey](https://github.com/mark-jeffrey) ([#12283](https://github.com/community-scripts/ProxmoxVE/pull/12283))
|
||||
- Refactor n8n [@MickLesk](https://github.com/MickLesk) ([#12264](https://github.com/community-scripts/ProxmoxVE/pull/12264))
|
||||
- Firefly: PHP bump [@tremor021](https://github.com/tremor021) ([#12247](https://github.com/community-scripts/ProxmoxVE/pull/12247))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- Databasus: add mariadb path for mysql/mariadb backups | add mongodb database tools [@MickLesk](https://github.com/MickLesk) ([#12259](https://github.com/community-scripts/ProxmoxVE/pull/12259))
|
||||
- make searxng updateable [@shtefko](https://github.com/shtefko) ([#12207](https://github.com/community-scripts/ProxmoxVE/pull/12207))
|
||||
|
||||
- #### 💥 Breaking Changes
|
||||
|
||||
- fix: wealthfolio for v3 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11765](https://github.com/community-scripts/ProxmoxVE/pull/11765))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- bump various scripts from Node 22 to 24 [@MickLesk](https://github.com/MickLesk) ([#12265](https://github.com/community-scripts/ProxmoxVE/pull/12265))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- core: fix broken "command not found" after err_trap [@MickLesk](https://github.com/MickLesk) ([#12280](https://github.com/community-scripts/ProxmoxVE/pull/12280))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- tools.func: add get_latest_gh_tag helper function [@MickLesk](https://github.com/MickLesk) ([#12261](https://github.com/community-scripts/ProxmoxVE/pull/12261))
|
||||
|
||||
@@ -38,6 +38,31 @@ function update_script() {
|
||||
cp /opt/databasus/.env /opt/databasus.env.bak
|
||||
msg_ok "Backed up Configuration"
|
||||
|
||||
msg_info "Ensuring Database Clients"
|
||||
# Create PostgreSQL version symlinks for compatibility
|
||||
for v in 12 13 14 15 16 18; do
|
||||
ln -sf /usr/lib/postgresql/17 /usr/lib/postgresql/$v
|
||||
done
|
||||
# Install MongoDB Database Tools via direct .deb (no APT repo for Debian 13)
|
||||
if ! command -v mongodump &>/dev/null; then
|
||||
[[ "$(get_os_info id)" == "ubuntu" ]] && MONGO_DIST="ubuntu2204" || MONGO_DIST="debian12"
|
||||
fetch_and_deploy_from_url "https://fastdl.mongodb.org/tools/db/mongodb-database-tools-${MONGO_DIST}-x86_64-100.14.1.deb"
|
||||
fi
|
||||
[[ -f /usr/bin/mongodump ]] && ln -sf /usr/bin/mongodump /usr/local/mongodb-database-tools/bin/mongodump
|
||||
[[ -f /usr/bin/mongorestore ]] && ln -sf /usr/bin/mongorestore /usr/local/mongodb-database-tools/bin/mongorestore
|
||||
# Create MariaDB and MySQL client symlinks for compatibility
|
||||
ensure_dependencies mariadb-client
|
||||
mkdir -p /usr/local/mariadb-{10.6,12.1}/bin /usr/local/mysql-{5.7,8.0,8.4,9}/bin /usr/local/mongodb-database-tools/bin
|
||||
for dir in /usr/local/mariadb-{10.6,12.1}/bin; do
|
||||
ln -sf /usr/bin/mariadb-dump "$dir/mariadb-dump"
|
||||
ln -sf /usr/bin/mariadb "$dir/mariadb"
|
||||
done
|
||||
for dir in /usr/local/mysql-{5.7,8.0,8.4,9}/bin; do
|
||||
ln -sf /usr/bin/mariadb-dump "$dir/mysqldump"
|
||||
ln -sf /usr/bin/mariadb "$dir/mysql"
|
||||
done
|
||||
msg_ok "Ensured Database Clients"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "databasus" "databasus/databasus" "tarball" "latest" "/opt/databasus"
|
||||
|
||||
msg_info "Updating Databasus"
|
||||
@@ -49,6 +74,7 @@ function update_script() {
|
||||
$STD /root/go/bin/swag init -g cmd/main.go -o swagger
|
||||
$STD env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o databasus ./cmd/main.go
|
||||
mv /opt/databasus/backend/databasus /opt/databasus/databasus
|
||||
mkdir -p /opt/databasus/ui/build
|
||||
cp -r /opt/databasus/frontend/dist/* /opt/databasus/ui/build/
|
||||
cp -r /opt/databasus/backend/migrations /opt/databasus/
|
||||
chown -R postgres:postgres /opt/databasus
|
||||
|
||||
@@ -28,7 +28,7 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
NODE_VERSION=24 NODE_MODULE="yarn,npm,pm2" setup_nodejs
|
||||
NODE_VERSION="24" NODE_MODULE="yarn,npm,pm2" setup_nodejs
|
||||
|
||||
if check_for_gh_release "joplin-server" "laurent22/joplin"; then
|
||||
msg_info "Stopping Services"
|
||||
|
||||
@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
var_version="${var_version:-13}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
@@ -27,10 +27,11 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
msg_info "Updating ${APP}"
|
||||
|
||||
msg_info "Updating OpenProject"
|
||||
$STD apt update
|
||||
$STD apt install --only-upgrade -y openproject
|
||||
msg_ok "Updated ${APP}"
|
||||
msg_ok "Updated OpenProject"
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
}
|
||||
|
||||
@@ -51,13 +51,10 @@ function update_script() {
|
||||
|
||||
msg_info "Updating PatchMon"
|
||||
VERSION=$(get_latest_github_release "PatchMon/PatchMon")
|
||||
PROTO="$(sed -n '/SERVER_PROTOCOL/s/[^=]*=//p' /opt/backend.env)"
|
||||
HOST="$(sed -n '/SERVER_HOST/s/[^=]*=//p' /opt/backend.env)"
|
||||
SERVER_PORT="$(sed -n '/SERVER_PORT/s/[^=]*=//p' /opt/backend.env)"
|
||||
[[ "$PROTO" == "http" ]] && PORT=":3001"
|
||||
sed -i 's/PORT=3399/PORT=3001/' /opt/backend.env
|
||||
sed -i -e "s/VERSION=.*/VERSION=$VERSION/" \
|
||||
-e "\|VITE_API_URL=|s|http.*|${PROTO:-http}://${HOST:-$LOCAL_IP}${PORT:-}/api/v1|" /opt/frontend.env
|
||||
-e '/^VITE_API_URL/d' /opt/frontend.env
|
||||
export NODE_ENV=production
|
||||
cd /opt/patchmon
|
||||
$STD npm install --no-audit --no-fund --no-save --ignore-scripts
|
||||
|
||||
@@ -52,7 +52,6 @@ function update_script() {
|
||||
systemctl start searxng
|
||||
msg_ok "Started Services"
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
start
|
||||
|
||||
@@ -43,16 +43,15 @@ function update_script() {
|
||||
|
||||
msg_info "Building Frontend (patience)"
|
||||
cd /opt/wealthfolio
|
||||
export BUILD_TARGET=web
|
||||
$STD pnpm install --frozen-lockfile
|
||||
$STD pnpm tsc
|
||||
$STD pnpm vite build
|
||||
$STD pnpm --filter frontend... build
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Building Backend (patience)"
|
||||
cd /opt/wealthfolio/src-server
|
||||
source ~/.cargo/env
|
||||
$STD cargo build --release --manifest-path Cargo.toml
|
||||
cp /opt/wealthfolio/src-server/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server
|
||||
$STD cargo build --release --manifest-path apps/server/Cargo.toml
|
||||
cp /opt/wealthfolio/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server
|
||||
chmod +x /usr/local/bin/wealthfolio-server
|
||||
msg_ok "Built Backend"
|
||||
|
||||
@@ -63,7 +62,7 @@ function update_script() {
|
||||
msg_ok "Restored Data"
|
||||
|
||||
msg_info "Cleaning Up"
|
||||
rm -rf /opt/wealthfolio/src-server/target
|
||||
rm -rf /opt/wealthfolio/target
|
||||
rm -rf /root/.cargo/registry
|
||||
rm -rf /opt/wealthfolio/node_modules
|
||||
msg_ok "Cleaned Up"
|
||||
|
||||
@@ -29,7 +29,7 @@ function update_script() {
|
||||
fi
|
||||
|
||||
if check_for_gh_release "Zigbee2MQTT" "Koenkk/zigbee2mqtt"; then
|
||||
NODE_VERSION=24 NODE_MODULE="pnpm@$(curl -fsSL https://raw.githubusercontent.com/Koenkk/zigbee2mqtt/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs
|
||||
NODE_VERSION="24" NODE_MODULE="pnpm@$(curl -fsSL https://raw.githubusercontent.com/Koenkk/zigbee2mqtt/master/package.json | jq -r '.packageManager | split("@")[1]')" setup_nodejs
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop zigbee2mqtt
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-02-24T12:15:44Z",
|
||||
"generated": "2026-02-25T06:25:10Z",
|
||||
"versions": [
|
||||
{
|
||||
"slug": "2fauth",
|
||||
@@ -200,9 +200,9 @@
|
||||
{
|
||||
"slug": "cleanuparr",
|
||||
"repo": "Cleanuparr/Cleanuparr",
|
||||
"version": "v2.7.4",
|
||||
"version": "v2.7.5",
|
||||
"pinned": false,
|
||||
"date": "2026-02-23T18:41:16Z"
|
||||
"date": "2026-02-24T17:11:50Z"
|
||||
},
|
||||
{
|
||||
"slug": "cloudreve",
|
||||
@@ -214,9 +214,9 @@
|
||||
{
|
||||
"slug": "comfyui",
|
||||
"repo": "comfyanonymous/ComfyUI",
|
||||
"version": "v0.14.2",
|
||||
"version": "v0.15.0",
|
||||
"pinned": false,
|
||||
"date": "2026-02-18T06:12:02Z"
|
||||
"date": "2026-02-24T20:56:09Z"
|
||||
},
|
||||
{
|
||||
"slug": "commafeed",
|
||||
@@ -361,16 +361,16 @@
|
||||
{
|
||||
"slug": "endurain",
|
||||
"repo": "endurain-project/endurain",
|
||||
"version": "v0.17.4",
|
||||
"version": "v0.17.5",
|
||||
"pinned": false,
|
||||
"date": "2026-02-11T04:54:22Z"
|
||||
"date": "2026-02-24T14:51:03Z"
|
||||
},
|
||||
{
|
||||
"slug": "ersatztv",
|
||||
"repo": "ErsatzTV/ErsatzTV",
|
||||
"version": "v26.2.0",
|
||||
"version": "v26.3.0",
|
||||
"pinned": false,
|
||||
"date": "2026-02-02T20:54:26Z"
|
||||
"date": "2026-02-24T21:36:34Z"
|
||||
},
|
||||
{
|
||||
"slug": "excalidraw",
|
||||
@@ -613,9 +613,9 @@
|
||||
{
|
||||
"slug": "jackett",
|
||||
"repo": "Jackett/Jackett",
|
||||
"version": "v0.24.1193",
|
||||
"version": "v0.24.1205",
|
||||
"pinned": false,
|
||||
"date": "2026-02-24T05:58:04Z"
|
||||
"date": "2026-02-25T05:49:14Z"
|
||||
},
|
||||
{
|
||||
"slug": "jellystat",
|
||||
@@ -746,9 +746,9 @@
|
||||
{
|
||||
"slug": "libretranslate",
|
||||
"repo": "LibreTranslate/LibreTranslate",
|
||||
"version": "v1.9.3",
|
||||
"version": "v1.9.4",
|
||||
"pinned": false,
|
||||
"date": "2026-02-21T19:08:33Z"
|
||||
"date": "2026-02-24T17:06:05Z"
|
||||
},
|
||||
{
|
||||
"slug": "lidarr",
|
||||
@@ -977,9 +977,9 @@
|
||||
{
|
||||
"slug": "open-archiver",
|
||||
"repo": "LogicLabs-OU/OpenArchiver",
|
||||
"version": "v0.4.1",
|
||||
"version": "v0.4.2",
|
||||
"pinned": false,
|
||||
"date": "2026-01-17T12:24:31Z"
|
||||
"date": "2026-02-24T20:47:40Z"
|
||||
},
|
||||
{
|
||||
"slug": "opencloud",
|
||||
@@ -1208,9 +1208,9 @@
|
||||
{
|
||||
"slug": "pulse",
|
||||
"repo": "rcourtman/Pulse",
|
||||
"version": "v5.1.13",
|
||||
"version": "v5.1.14",
|
||||
"pinned": false,
|
||||
"date": "2026-02-22T12:40:41Z"
|
||||
"date": "2026-02-25T00:11:58Z"
|
||||
},
|
||||
{
|
||||
"slug": "pve-scripts-local",
|
||||
@@ -1285,9 +1285,9 @@
|
||||
{
|
||||
"slug": "recyclarr",
|
||||
"repo": "recyclarr/recyclarr",
|
||||
"version": "v8.2.1",
|
||||
"version": "v8.3.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-22T19:19:49Z"
|
||||
"date": "2026-02-25T01:01:31Z"
|
||||
},
|
||||
{
|
||||
"slug": "reitti",
|
||||
@@ -1334,9 +1334,9 @@
|
||||
{
|
||||
"slug": "scanopy",
|
||||
"repo": "scanopy/scanopy",
|
||||
"version": "v0.14.7",
|
||||
"version": "v0.14.8",
|
||||
"pinned": false,
|
||||
"date": "2026-02-23T01:36:44Z"
|
||||
"date": "2026-02-24T16:45:30Z"
|
||||
},
|
||||
{
|
||||
"slug": "scraparr",
|
||||
@@ -1369,9 +1369,9 @@
|
||||
{
|
||||
"slug": "semaphore",
|
||||
"repo": "semaphoreui/semaphore",
|
||||
"version": "v2.17.12",
|
||||
"version": "v2.17.14",
|
||||
"pinned": false,
|
||||
"date": "2026-02-20T09:16:50Z"
|
||||
"date": "2026-02-24T14:27:03Z"
|
||||
},
|
||||
{
|
||||
"slug": "shelfmark",
|
||||
@@ -1383,9 +1383,9 @@
|
||||
{
|
||||
"slug": "signoz",
|
||||
"repo": "SigNoz/signoz-otel-collector",
|
||||
"version": "v0.142.1",
|
||||
"version": "v0.144.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-21T18:04:07Z"
|
||||
"date": "2026-02-25T05:57:17Z"
|
||||
},
|
||||
{
|
||||
"slug": "silverbullet",
|
||||
@@ -1621,9 +1621,9 @@
|
||||
{
|
||||
"slug": "upgopher",
|
||||
"repo": "wanetty/upgopher",
|
||||
"version": "v1.13.0",
|
||||
"version": "v1.14.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-16T20:26:34Z"
|
||||
"date": "2026-02-24T22:43:34Z"
|
||||
},
|
||||
{
|
||||
"slug": "upsnap",
|
||||
@@ -1679,7 +1679,7 @@
|
||||
"repo": "meilisearch/meilisearch",
|
||||
"version": "v1.36.0",
|
||||
"pinned": false,
|
||||
"date": ""
|
||||
"date": "2026-02-23T08:13:32Z"
|
||||
},
|
||||
{
|
||||
"slug": "warracker",
|
||||
@@ -1712,9 +1712,9 @@
|
||||
{
|
||||
"slug": "wealthfolio",
|
||||
"repo": "afadil/wealthfolio",
|
||||
"version": "v2.1.0",
|
||||
"version": "v3.0.0",
|
||||
"pinned": false,
|
||||
"date": "2025-12-01T21:57:36Z"
|
||||
"date": "2026-02-24T22:37:05Z"
|
||||
},
|
||||
{
|
||||
"slug": "web-check",
|
||||
@@ -1747,9 +1747,9 @@
|
||||
{
|
||||
"slug": "wizarr",
|
||||
"repo": "wizarrrr/wizarr",
|
||||
"version": "v2026.2.0",
|
||||
"version": "v2026.2.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-23T19:25:28Z"
|
||||
"date": "2026-02-25T01:07:56Z"
|
||||
},
|
||||
{
|
||||
"slug": "writefreely",
|
||||
@@ -1768,9 +1768,9 @@
|
||||
{
|
||||
"slug": "yubal",
|
||||
"repo": "guillevc/yubal",
|
||||
"version": "v0.6.1",
|
||||
"version": "v0.6.2",
|
||||
"pinned": false,
|
||||
"date": "2026-02-18T23:24:16Z"
|
||||
"date": "2026-02-24T15:15:46Z"
|
||||
},
|
||||
{
|
||||
"slug": "zigbee2mqtt",
|
||||
@@ -1789,9 +1789,9 @@
|
||||
{
|
||||
"slug": "zitadel",
|
||||
"repo": "zitadel/zitadel",
|
||||
"version": "v4.11.0",
|
||||
"version": "v4.11.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-16T09:48:38Z"
|
||||
"date": "2026-02-25T06:13:13Z"
|
||||
},
|
||||
{
|
||||
"slug": "zoraxy",
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"ram": 4096,
|
||||
"hdd": 8,
|
||||
"os": "Debian",
|
||||
"version": "12"
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -31,5 +31,10 @@
|
||||
"username": "admin",
|
||||
"password": "admin"
|
||||
},
|
||||
"notes": []
|
||||
"notes": [
|
||||
{
|
||||
"text": "If you want to update from v15.x to v17.x, please read `https://www.openproject.org/docs/installation-and-operations/operation/upgrading/#major-upgrades` before doing so.",
|
||||
"type": "warning"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ $STD apt install -y \
|
||||
texlive-xetex
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION=22 NODE_MODULE="bun" setup_nodejs
|
||||
NODE_VERSION="22" NODE_MODULE="bun" setup_nodejs
|
||||
fetch_and_deploy_gh_release "ConvertX" "C4illin/ConvertX" "tarball" "latest" "/opt/convertx"
|
||||
|
||||
msg_info "Installing ConvertX"
|
||||
|
||||
@@ -15,14 +15,40 @@ update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
nginx \
|
||||
valkey
|
||||
nginx \
|
||||
valkey \
|
||||
mariadb-client \
|
||||
rclone
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
PG_VERSION="17" setup_postgresql
|
||||
setup_go
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
msg_info "Installing Database Clients"
|
||||
# Create PostgreSQL version symlinks for compatibility
|
||||
for v in 12 13 14 15 16 18; do
|
||||
ln -sf /usr/lib/postgresql/17 /usr/lib/postgresql/$v
|
||||
done
|
||||
# Install MongoDB Database Tools via direct .deb (no APT repo for Debian 13)
|
||||
[[ "$(get_os_info id)" == "ubuntu" ]] && MONGO_DIST="ubuntu2204" || MONGO_DIST="debian12"
|
||||
MONGO_VERSION=$(get_latest_gh_tag "mongodb/mongo-tools" "100." || echo "100.14.1")
|
||||
fetch_and_deploy_from_url "https://fastdl.mongodb.org/tools/db/mongodb-database-tools-${MONGO_DIST}-x86_64-${MONGO_VERSION}.deb"
|
||||
mkdir -p /usr/local/mongodb-database-tools/bin
|
||||
[[ -f /usr/bin/mongodump ]] && ln -sf /usr/bin/mongodump /usr/local/mongodb-database-tools/bin/mongodump
|
||||
[[ -f /usr/bin/mongorestore ]] && ln -sf /usr/bin/mongorestore /usr/local/mongodb-database-tools/bin/mongorestore
|
||||
# Create MariaDB and MySQL client symlinks for compatibility
|
||||
mkdir -p /usr/local/mariadb-{10.6,12.1}/bin /usr/local/mysql-{5.7,8.0,8.4,9}/bin
|
||||
for dir in /usr/local/mariadb-{10.6,12.1}/bin; do
|
||||
ln -sf /usr/bin/mariadb-dump "$dir/mariadb-dump"
|
||||
ln -sf /usr/bin/mariadb "$dir/mariadb"
|
||||
done
|
||||
for dir in /usr/local/mysql-{5.7,8.0,8.4,9}/bin; do
|
||||
ln -sf /usr/bin/mariadb-dump "$dir/mysqldump"
|
||||
ln -sf /usr/bin/mariadb "$dir/mysql"
|
||||
done
|
||||
msg_ok "Installed Database Clients"
|
||||
|
||||
fetch_and_deploy_gh_release "databasus" "databasus/databasus" "tarball" "latest" "/opt/databasus"
|
||||
|
||||
msg_info "Building Databasus (Patience)"
|
||||
@@ -47,10 +73,6 @@ msg_ok "Built Databasus"
|
||||
msg_info "Configuring Databasus"
|
||||
JWT_SECRET=$(openssl rand -hex 32)
|
||||
ENCRYPTION_KEY=$(openssl rand -hex 32)
|
||||
# Create PostgreSQL version symlinks for compatibility
|
||||
for v in 12 13 14 15 16 18; do
|
||||
ln -sf /usr/lib/postgresql/17 /usr/lib/postgresql/$v
|
||||
done
|
||||
# Install goose for migrations
|
||||
$STD go install github.com/pressly/goose/v3/cmd/goose@latest
|
||||
ln -sf /root/go/bin/goose /usr/local/bin/goose
|
||||
|
||||
@@ -72,7 +72,7 @@ cat <<EOF >/etc/apache2/sites-available/firefly.conf
|
||||
</VirtualHost>
|
||||
EOF
|
||||
chown www-data:www-data /opt/firefly/storage/oauth-*.key
|
||||
$STD a2enmod php8.4
|
||||
$STD a2enmod php8.5
|
||||
$STD a2enmod rewrite
|
||||
$STD a2ensite firefly.conf
|
||||
$STD a2dissite 000-default.conf
|
||||
|
||||
@@ -21,7 +21,7 @@ msg_ok "Installed Dependencies"
|
||||
|
||||
PG_VERSION="17" setup_postgresql
|
||||
PG_DB_NAME="joplin" PG_DB_USER="joplin" setup_postgresql_db
|
||||
NODE_VERSION=24 NODE_MODULE="yarn,npm,pm2" setup_nodejs
|
||||
NODE_VERSION="24" NODE_MODULE="yarn,npm,pm2" setup_nodejs
|
||||
mkdir -p /opt/pm2
|
||||
export PM2_HOME=/opt/pm2
|
||||
$STD pm2 install pm2-logrotate
|
||||
|
||||
@@ -14,19 +14,30 @@ network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y apt-transport-https
|
||||
$STD apt install -y \
|
||||
apt-transport-https \
|
||||
build-essential \
|
||||
autoconf
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
PG_VERSION="17" setup_postgresql
|
||||
PG_DB_NAME="openproject" PG_DB_USER="openproject" setup_postgresql_db
|
||||
API_KEY=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)
|
||||
echo "OpenProject API Key: $API_KEY" >>~/openproject.creds
|
||||
fetch_and_deploy_gh_release "jemalloc" "jemalloc/jemalloc" "tarball"
|
||||
|
||||
msg_info "Setting up OpenProject Repository"
|
||||
curl -fsSL "https://dl.packager.io/srv/opf/openproject/key" | gpg --dearmor >/etc/apt/trusted.gpg.d/packager-io.gpg
|
||||
curl -fsSL "https://dl.packager.io/srv/opf/openproject/stable/15/installer/debian/12.repo" -o "/etc/apt/sources.list.d/openproject.list"
|
||||
$STD apt update
|
||||
msg_ok "Setup OpenProject Repository"
|
||||
msg_info "Compiling jemalloc (Patience)"
|
||||
cd /opt/jemalloc
|
||||
$STD ./autogen.sh
|
||||
$STD make
|
||||
$STD make install
|
||||
msg_ok "Compiled jemalloc"
|
||||
|
||||
setup_deb822_repo \
|
||||
"openproject" \
|
||||
"https://packages.openproject.com/srv/deb/opf/openproject/gpg-key.gpg" \
|
||||
"https://packages.openproject.com/srv/deb/opf/openproject/stable/17/debian/" \
|
||||
"12"
|
||||
|
||||
msg_info "Installing OpenProject"
|
||||
$STD apt install -y openproject
|
||||
@@ -60,6 +71,11 @@ openproject/admin_email admin@example.net
|
||||
openproject/default_language en
|
||||
EOF
|
||||
$STD sudo openproject configure
|
||||
systemctl stop openproject-web-1
|
||||
if ! grep -qF 'Environment=LD_PRELOAD=/usr/local/lib/libjemalloc.so.2' /etc/systemd/system/openproject-web-1.service; then
|
||||
sed -i '/^\[Service\]/a Environment=LD_PRELOAD=/usr/local/lib/libjemalloc.so.2' /etc/systemd/system/openproject-web-1.service
|
||||
fi
|
||||
systemctl start openproject-web-1
|
||||
msg_ok "Configured OpenProject"
|
||||
|
||||
motd_ssh
|
||||
|
||||
@@ -34,7 +34,6 @@ $STD npm install --no-audit --no-fund --no-save --ignore-scripts
|
||||
|
||||
cd /opt/patchmon/frontend
|
||||
cat <<EOF >./.env
|
||||
VITE_API_URL=http://${LOCAL_IP}:3001/api/v1
|
||||
VITE_APP_NAME=PatchMon
|
||||
VITE_APP_VERSION=${VERSION}
|
||||
EOF
|
||||
|
||||
@@ -21,7 +21,7 @@ $STD apt install -y \
|
||||
expect
|
||||
msg_ok "Dependencies installed."
|
||||
|
||||
NODE_VERSION=24 setup_nodejs
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
fetch_and_deploy_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local" "tarball"
|
||||
|
||||
msg_info "Installing PVE Scripts local"
|
||||
|
||||
@@ -28,15 +28,15 @@ fetch_and_deploy_gh_release "wealthfolio" "afadil/wealthfolio" "tarball"
|
||||
|
||||
msg_info "Building Frontend (patience)"
|
||||
cd /opt/wealthfolio
|
||||
export BUILD_TARGET=web
|
||||
$STD pnpm install --frozen-lockfile
|
||||
$STD pnpm tsc
|
||||
$STD pnpm vite build
|
||||
$STD pnpm --filter frontend... build
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Building Backend (patience)"
|
||||
cd /opt/wealthfolio/src-server
|
||||
$STD cargo build --release --manifest-path Cargo.toml
|
||||
cp /opt/wealthfolio/src-server/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server
|
||||
source ~/.cargo/env
|
||||
$STD cargo build --release --manifest-path apps/server/Cargo.toml
|
||||
cp /opt/wealthfolio/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server
|
||||
chmod +x /usr/local/bin/wealthfolio-server
|
||||
msg_ok "Built Backend"
|
||||
|
||||
@@ -58,7 +58,7 @@ echo "WF_PASSWORD=${WF_PASSWORD}" >~/wealthfolio.creds
|
||||
msg_ok "Configured Wealthfolio"
|
||||
|
||||
msg_info "Cleaning Up"
|
||||
rm -rf /opt/wealthfolio/src-server/target
|
||||
rm -rf /opt/wealthfolio/target
|
||||
rm -rf /root/.cargo/registry
|
||||
rm -rf /opt/wealthfolio/node_modules
|
||||
msg_ok "Cleaned Up"
|
||||
|
||||
@@ -38,17 +38,18 @@
|
||||
# - Captures app-declared resource defaults (CPU, RAM, Disk)
|
||||
# ------------------------------------------------------------------------------
|
||||
variables() {
|
||||
NSAPP=$(echo "${APP,,}" | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces.
|
||||
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
|
||||
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
|
||||
PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
|
||||
DIAGNOSTICS="no" # Safe default: no telemetry until user consents via diagnostics_check()
|
||||
METHOD="default" # sets the METHOD variable to "default", used for the API call.
|
||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
|
||||
EXECUTION_ID="${RANDOM_UUID}" # Unique execution ID for telemetry record identification (unique-indexed in PocketBase)
|
||||
SESSION_ID="${RANDOM_UUID:0:8}" # Short session ID (first 8 chars of UUID) for log files
|
||||
BUILD_LOG="/tmp/create-lxc-${SESSION_ID}.log" # Host-side container creation log
|
||||
combined_log="/tmp/install-${SESSION_ID}-combined.log" # Combined log (build + install) for failed installations
|
||||
NSAPP=$(echo "${APP,,}" | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces.
|
||||
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
|
||||
INTEGER='^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
|
||||
PVEHOST_NAME=$(hostname) # gets the Proxmox Hostname and sets it to Uppercase
|
||||
DIAGNOSTICS="no" # Safe default: no telemetry until user consents via diagnostics_check()
|
||||
METHOD="default" # sets the METHOD variable to "default", used for the API call.
|
||||
RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" # generates a random UUID and sets it to the RANDOM_UUID variable.
|
||||
EXECUTION_ID="${RANDOM_UUID}" # Unique execution ID for telemetry record identification (unique-indexed in PocketBase)
|
||||
SESSION_ID="${RANDOM_UUID:0:8}" # Short session ID (first 8 chars of UUID) for log files
|
||||
BUILD_LOG="/tmp/create-lxc-${SESSION_ID}.log" # Host-side container creation log
|
||||
# NOTE: combined_log is constructed locally in build_container() and ensure_log_on_host()
|
||||
# as "/tmp/${NSAPP}-${CTID}-${SESSION_ID}.log" (requires CTID, not available here)
|
||||
CTTYPE="${CTTYPE:-${CT_TYPE:-1}}"
|
||||
|
||||
# Parse dev_mode early
|
||||
@@ -692,7 +693,7 @@ find_host_ssh_keys() {
|
||||
/^[[:space:]]*#/ {next}
|
||||
/^[[:space:]]*$/ {next}
|
||||
{print}
|
||||
' | grep -E -c '"$re"' || true)
|
||||
' | grep -E -c "$re" || true)
|
||||
|
||||
if ((c > 0)); then
|
||||
files+=("$f")
|
||||
@@ -1850,7 +1851,7 @@ advanced_settings() {
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# STEP 2: Root Password
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# ════════════════════════════════════════════════════════════════════════<EFBFBD><EFBFBD><EFBFBD>══
|
||||
2)
|
||||
if PW1=$(whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "ROOT PASSWORD" \
|
||||
@@ -4174,6 +4175,13 @@ EOF'
|
||||
# Report failure to telemetry API (now with log available on host)
|
||||
post_update_to_api "failed" "$install_exit_code"
|
||||
|
||||
# Defense-in-depth: Ensure error handling stays disabled during recovery.
|
||||
# Some functions (e.g. silent/$STD) unconditionally re-enable set -Eeuo pipefail
|
||||
# and trap 'error_handler' ERR. If any code path above called such a function,
|
||||
# the grep/sed pipelines below would trigger error_handler on non-match (exit 1).
|
||||
set +Eeuo pipefail
|
||||
trap - ERR
|
||||
|
||||
# Show combined log location
|
||||
if [[ -n "$CTID" && -n "${SESSION_ID:-}" ]]; then
|
||||
msg_custom "📋" "${YW}" "Installation log: ${combined_log}"
|
||||
@@ -4287,7 +4295,7 @@ EOF'
|
||||
if [[ "$is_cmd_not_found" == true ]]; then
|
||||
local missing_cmd=""
|
||||
if [[ -f "$combined_log" ]]; then
|
||||
missing_cmd=$(grep -oiE '[a-zA-Z0-9_.-]+: command not found' "$combined_log" | tail -1 | sed 's/: command not found//')
|
||||
missing_cmd=$(grep -oiE '[a-zA-Z0-9_.-]+: command not found' "$combined_log" 2>/dev/null | tail -1 | sed 's/: command not found//') || true
|
||||
fi
|
||||
if [[ -n "$missing_cmd" ]]; then
|
||||
echo -e "${TAB}${INFO} Missing command: ${GN}${missing_cmd}${CL}"
|
||||
|
||||
@@ -490,6 +490,8 @@ log_section() {
|
||||
# - Executes command with output redirected to active log file
|
||||
# - On error: displays last 20 lines of log and exits with original exit code
|
||||
# - Temporarily disables error trap to capture exit code correctly
|
||||
# - Saves and restores previous error handling state (so callers that
|
||||
# intentionally disabled error handling aren't silently re-enabled)
|
||||
# - Sources explain_exit_code() for detailed error messages
|
||||
# ------------------------------------------------------------------------------
|
||||
silent() {
|
||||
@@ -507,14 +509,23 @@ silent() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Save current error handling state before disabling
|
||||
# This prevents re-enabling error handling when the caller intentionally
|
||||
# disabled it (e.g. build_container recovery section)
|
||||
local _restore_errexit=false
|
||||
[[ "$-" == *e* ]] && _restore_errexit=true
|
||||
|
||||
set +Eeuo pipefail
|
||||
trap - ERR
|
||||
|
||||
"$@" >>"$logfile" 2>&1
|
||||
local rc=$?
|
||||
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
# Restore error handling ONLY if it was active before this call
|
||||
if $_restore_errexit; then
|
||||
set -Eeuo pipefail
|
||||
trap 'error_handler' ERR
|
||||
fi
|
||||
|
||||
if [[ $rc -ne 0 ]]; then
|
||||
# Source explain_exit_code if needed
|
||||
|
||||
Reference in New Issue
Block a user