Compare commits

...

12 Commits

Author SHA1 Message Date
push-app-to-main[bot] 23627ab7bc Add foldergram (ct) 2026-04-21 07:12:33 +00:00
community-scripts-pr-app[bot] 43b0347446 Update CHANGELOG.md (#13899)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-21 07:11:52 +00:00
Chris 55bad2aa40 OpenCloud: Pin version to 6.1.0 (#13890) 2026-04-21 09:11:26 +02:00
community-scripts-pr-app[bot] 4d2d6edefe Update CHANGELOG.md (#13898)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-21 07:04:24 +00:00
Copilot e2e7f0722f homelable: fix install failure by correcting password-reset chmod target (#13894)
* Initial plan

* fix(homelable): correct password reset script chmod path

Agent-Logs-Url: https://github.com/community-scripts/ProxmoxVE/sessions/6227f182-739b-4c0b-9b1f-be73074924d2

Co-authored-by: MickLesk <47820557+MickLesk@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: MickLesk <47820557+MickLesk@users.noreply.github.com>
2026-04-21 09:04:01 +02:00
community-scripts-pr-app[bot] b3c9f6e625 Update .app files (#13886)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2026-04-20 21:58:56 +02:00
community-scripts-pr-app[bot] ade3bde249 Update CHANGELOG.md (#13885)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 19:57:32 +00:00
push-app-to-main[bot] 7cb40af4e6 WhoDB (#13880)
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-20 21:57:03 +02:00
community-scripts-pr-app[bot] ce2b51a1a6 Update CHANGELOG.md (#13883)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 18:22:33 +00:00
CanbiZ (MickLesk) 0986f485ee core: detect Perl breakage after LXC stack upgrade and improve storage validation (#13879) 2026-04-20 20:22:10 +02:00
community-scripts-pr-app[bot] cd1e584696 Update CHANGELOG.md (#13882)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-20 18:21:52 +00:00
Davidson Santos cb156b6f85 feat(homelable): add password reset utility script (#13798) 2026-04-20 20:21:24 +02:00
10 changed files with 503 additions and 25 deletions
+21
View File
@@ -445,8 +445,22 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-04-21
### 🚀 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
- homelable: fix install failure by correcting password-reset chmod target [@Copilot](https://github.com/Copilot) ([#13894](https://github.com/community-scripts/ProxmoxVE/pull/13894))
## 2026-04-20 ## 2026-04-20
### 🆕 New Scripts
- WhoDB ([#13880](https://github.com/community-scripts/ProxmoxVE/pull/13880))
### 🚀 Updated Scripts ### 🚀 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)) - 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))
@@ -460,12 +474,19 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### ✨ New Features - #### ✨ New Features
- Wanderer: add pocketbase CLI wrapper with env [@MickLesk](https://github.com/MickLesk) ([#13863](https://github.com/community-scripts/ProxmoxVE/pull/13863)) - 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 - #### 🔧 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)) - 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)) - 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 ## 2026-04-19
### 🆕 New Scripts ### 🆕 New Scripts
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/foldergram/foldergram
APP="Foldergram"
var_tags="${var_tags:-photos}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/foldergram ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "foldergram" "foldergram/foldergram"; then
msg_info "Stopping Service"
systemctl stop foldergram
msg_ok "Stopped Service"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "foldergram" "foldergram/foldergram" "tarball"
msg_info "Installing Foldergram"
cd /opt/foldergram
$STD pnpm install --frozen-lockfile
$STD pnpm run build
msg_ok "Installed Foldergram"
msg_info "Starting Service"
systemctl start foldergram
msg_ok "Started Service"
msg_ok "Updated successfully!"
fi
cleanup_lxc
exit
}
start
build_container
description
msg_ok "Completed successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4141${CL}"
+6
View File
@@ -0,0 +1,6 @@
_ ____ ____ ____
| | / / /_ ____ / __ \/ __ )
| | /| / / __ \/ __ \/ / / / __ |
| |/ |/ / / / / /_/ / /_/ / /_/ /
|__/|__/_/ /_/\____/_____/_____/
+1 -1
View File
@@ -29,7 +29,7 @@ function update_script() {
exit exit
fi fi
RELEASE="v6.0.0" RELEASE="v6.1.0"
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}" "each release is tested individually before the version is updated. Please do not open issues for this"; then
msg_info "Stopping services" msg_info "Stopping services"
systemctl stop opencloud opencloud-wopi systemctl stop opencloud opencloud-wopi
+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://whodb.com/
APP="WhoDB"
var_tags="${var_tags:-database;management;gui}"
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 [[ ! -f /opt/whodb/whodb ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "whodb" "clidey/whodb"; then
msg_info "Stopping Service"
systemctl stop whodb
msg_ok "Stopped Service"
fetch_and_deploy_gh_release "whodb" "clidey/whodb" "singlefile" "latest" "/opt/whodb" "whodb-*-linux-amd64"
msg_info "Starting Service"
systemctl start whodb
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}:8080${CL}"
+65
View File
@@ -0,0 +1,65 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/foldergram/foldergram
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
$STD apt install -y --no-install-recommends ffmpeg
msg_ok "Installed Dependencies"
NODE_VERSION=25 NODE_MODULE="corepack" setup_nodejs
fetch_and_deploy_gh_release "foldergram" "foldergram/foldergram" "tarball"
msg_info "Configuring Foldergram"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
$STD corepack enable
cd /opt/foldergram
$STD pnpm install
$STD pnpm run build
mkdir -p /opt/foldergram_media
cat <<EOF >/opt/foldergram_media/foldergram.env
NODE_ENV=production
SERVER_PORT=4141
DATA_ROOT=/opt/foldergram_media
GALLERY_ROOT=/opt/foldergram_media/gallery
DB_DIR=/opt/foldergram_media/db
THUMBNAILS_DIR=/opt/foldergram_media/thumbnails
PREVIEWS_DIR=/opt/foldergram_media/previews
IMAGE_DETAIL_SOURCE=preview
DERIVATIVE_MODE=eager
GALLERY_EXCLUDED_FOLDERS=
EOF
msg_ok "Configured Foldergram"
msg_info "Creating services"
cat <<EOF >/etc/systemd/system/foldergram.service
[Unit]
Description=Foldergram Service
After=network.target
[Service]
WorkingDirectory=/opt/foldergram
ExecStart=/usr/bin/pnpm start
Restart=always
EnvironmentFile=/opt/foldergram_media/foldergram.env
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now foldergram
msg_ok "Created services"
motd_ssh
customize
cleanup_lxc
+24
View File
@@ -45,6 +45,30 @@ STATUS_CHECKER_INTERVAL=60
EOF EOF
msg_ok "Configured Homelable" msg_ok "Configured Homelable"
msg_info "Creating Password Reset Utility"
cat <<'EOF' >/root/change_password.sh
#!/usr/bin/env bash
NEW_PASS=""
while [[ -z "$NEW_PASS" ]]; do
read -s -p "Enter new password: " NEW_PASS
echo ""
if [[ -z "$NEW_PASS" ]]; then
echo "Error: Password cannot be blank. Try again."
fi
done
HASH=$(/opt/homelable/backend/.venv/bin/python -c "from passlib.context import CryptContext; print(CryptContext(schemes=['bcrypt']).hash('${NEW_PASS}'))")
sed -i "s|^AUTH_PASSWORD_HASH=.*|AUTH_PASSWORD_HASH='${HASH}'|" /opt/homelable/backend/.env
systemctl restart homelable
echo "Password updated and service restarted successfully!"
EOF
chmod +x /root/change_password.sh
msg_ok "Created Password Reset Utility"
msg_info "Building Frontend" msg_info "Building Frontend"
cd /opt/homelable/frontend cd /opt/homelable/frontend
$STD npm ci $STD npm ci
+1 -1
View File
@@ -64,7 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA
echo "$COOLPASS" >~/.coolpass echo "$COOLPASS" >~/.coolpass
msg_ok "Installed Collabora Online" msg_ok "Installed Collabora Online"
fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v6.0.0" "/usr/bin" "opencloud-*-linux-amd64" fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v6.1.0" "/usr/bin" "opencloud-*-linux-amd64"
mv /usr/bin/OpenCloud /usr/bin/opencloud mv /usr/bin/OpenCloud /usr/bin/opencloud
msg_info "Configuring OpenCloud" msg_info "Configuring OpenCloud"
+40
View File
@@ -0,0 +1,40 @@
#!/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://whodb.com/
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
fetch_and_deploy_gh_release "whodb" "clidey/whodb" "singlefile" "latest" "/opt/whodb" "whodb-*-linux-amd64"
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/whodb.service
[Unit]
Description=WhoDB Database Management
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/whodb
ExecStart=/opt/whodb/whodb
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now whodb
msg_ok "Created Service"
motd_ssh
customize
cleanup_lxc
+223 -16
View File
@@ -5250,9 +5250,133 @@ create_lxc_container() {
# Extract Debian OS minor from template name: debian-13-standard_13.1-1_amd64.tar.zst => "13.1" # Extract Debian OS minor from template name: debian-13-standard_13.1-1_amd64.tar.zst => "13.1"
parse_template_osver() { sed -n 's/.*_\([0-9][0-9]*\(\.[0-9]\+\)\?\)-.*/\1/p' <<<"$1"; } parse_template_osver() { sed -n 's/.*_\([0-9][0-9]*\(\.[0-9]\+\)\?\)-.*/\1/p' <<<"$1"; }
# Switch to the previous OS major version template and retry pct create
# Determines the fallback version automatically based on available templates.
# Returns: 0 = success, 1 = failed
fallback_to_previous_os_version() {
local old_template="$TEMPLATE"
local os_type="${PCT_OSTYPE:-}"
local current_ver="${PCT_OSVERSION:-}"
# Determine template search pattern based on OS type
local tpl_pattern=""
case "$os_type" in
debian | ubuntu) tpl_pattern="-standard_" ;;
alpine | fedora | rocky | centos) tpl_pattern="-default_" ;;
*) tpl_pattern="" ;;
esac
msg_info "Searching for an older $os_type template (current: $os_type $current_ver)"
# Collect all available versions for this OS type (local + online)
local -a all_versions=()
# Local templates
mapfile -t _local_vers < <(
pveam list "$TEMPLATE_STORAGE" 2>/dev/null |
awk -v os="$os_type" -v pat="$tpl_pattern" '$1 ~ ("^"os"|/"os) && $1 ~ pat {print $1}' |
sed 's|.*/||' |
sed -E "s/^${os_type}-([0-9]+(\.[0-9]+)?).*/\1/" |
sort -u -V
)
all_versions+=("${_local_vers[@]}")
# Online templates (only if needed)
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[@]}")
# Deduplicate and sort, find the highest version below current
local fallback_ver=""
fallback_ver=$(printf '%s\n' "${all_versions[@]}" | sort -u -V | awk -v cur="$current_ver" '{
# Compare major versions: extract major part
split($0, a, ".")
split(cur, b, ".")
if (a[1]+0 < b[1]+0) ver=$0
} END { if (ver) print ver }')
if [[ -z "$fallback_ver" ]]; then
msg_error "No older $os_type template version found."
return 1
fi
msg_ok "Fallback version: $os_type $fallback_ver"
# Find the actual template file for this version
local fallback_search="${os_type}-${fallback_ver}"
local fallback_template=""
# Check local first
mapfile -t _fb_local < <(
pveam list "$TEMPLATE_STORAGE" 2>/dev/null |
awk -v search="$fallback_search" -v pat="$tpl_pattern" '$1 ~ search && $1 ~ pat {print $1}' |
sed 's|.*/||' | sort -t - -k 2 -V
)
if [[ ${#_fb_local[@]} -gt 0 ]]; then
fallback_template="${_fb_local[-1]}"
else
# Check online
mapfile -t _fb_online < <(
pveam available -section system 2>/dev/null |
awk '{print $2}' |
grep -E "^${fallback_search}.*${tpl_pattern}" |
sort -t - -k 2 -V 2>/dev/null || true
)
[[ ${#_fb_online[@]} -gt 0 ]] && fallback_template="${_fb_online[-1]}"
fi
if [[ -z "$fallback_template" ]]; then
msg_error "No template found for $os_type $fallback_ver."
return 1
fi
msg_ok "Found template: $fallback_template"
# Download if needed
local fallback_path
fallback_path="$(pvesm path "$TEMPLATE_STORAGE:vztmpl/$fallback_template" 2>/dev/null || true)"
[[ -z "$fallback_path" ]] && fallback_path="/var/lib/vz/template/cache/$fallback_template"
if [[ ! -f "$fallback_path" ]]; then
msg_info "Downloading $os_type $fallback_ver template"
if ! pveam download "$TEMPLATE_STORAGE" "$fallback_template" >>"${BUILD_LOG:-/dev/null}" 2>&1; then
msg_error "Failed to download $os_type $fallback_ver template."
return 1
fi
msg_ok "Template downloaded"
fi
# Update variables
TEMPLATE="$fallback_template"
TEMPLATE_PATH="$fallback_path"
PCT_OSVERSION="$fallback_ver"
export PCT_OSVERSION
# Retry pct create
msg_info "Retrying container creation with $os_type $fallback_ver"
if pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" $PCT_OPTIONS >>"$LOGFILE" 2>&1; then
msg_ok "Container created successfully with $os_type $fallback_ver (fallback from $old_template)."
return 0
else
msg_error "Container creation with $os_type $fallback_ver also failed. See $LOGFILE"
return 1
fi
}
# 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 # 0 = no upgrade needed / container created after upgrade or 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 declined
# 3 = upgrade attempted but failed OR retry failed # 3 = upgrade attempted but failed OR retry failed
@@ -5280,13 +5404,58 @@ create_lxc_container() {
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 echo
# Offer older OS version fallback when template version might be too new for LXC stack
local _has_fallback_option=false
if [[ -n "${PCT_OSTYPE:-}" && -n "${PCT_OSVERSION:-}" ]]; then
_has_fallback_option=true
echo " [1] Upgrade LXC stack now (recommended)"
echo " [2] Use an older ${PCT_OSTYPE} template instead (may not work with all scripts)"
echo " [3] Cancel"
echo
read -rp "Select option [1/2/3]: " _ans </dev/tty
else
read -rp "Do you want to upgrade now? [y/N] " _ans </dev/tty read -rp "Do you want to upgrade now? [y/N] " _ans </dev/tty
fi
if [[ "$_has_fallback_option" == true ]]; then
case "$_ans" in
1)
_ans="y"
;;
2)
if [[ "$do_retry" == "yes" ]]; then
if fallback_to_previous_os_version; then
return 0
else
return 3
fi
else
msg_custom "️" "${YW}" "OS version fallback is only available during container creation."
return 2
fi
;;
*)
return 2
;;
esac
fi
case "${_ans,,}" in case "${_ans,,}" in
y | yes) y | yes)
msg_info "Upgrading Proxmox LXC stack (pve-container, lxc-pve)" msg_info "Upgrading Proxmox LXC stack (pve-container, lxc-pve)"
apt_update_safe apt_update_safe
if $STD apt-get install -y --only-upgrade pve-container lxc-pve; then if $STD apt-get install -y --only-upgrade pve-container lxc-pve; then
msg_ok "LXC stack upgraded." msg_ok "LXC stack upgraded."
# Verify pct binary still works after upgrade (partial upgrades can break Perl modules)
if ! pct list &>/dev/null; then
msg_error "LXC stack upgrade caused PVE tool breakage (likely Perl module incompatibility)."
msg_custom "⚠️" "${YW}" "A partial package upgrade has left the PVE stack in an inconsistent state."
msg_custom "🔧" "${YW}" "Please run the following on the Proxmox host, then retry:"
echo -e "${TAB} apt update && apt dist-upgrade -y"
echo -e "${TAB} reboot"
return 3
fi
if [[ "$do_retry" == "yes" ]]; then if [[ "$do_retry" == "yes" ]]; then
msg_info "Retrying container creation after upgrade" msg_info "Retrying container creation after upgrade"
if pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" $PCT_OPTIONS >>"$LOGFILE" 2>&1; then if pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" $PCT_OPTIONS >>"$LOGFILE" 2>&1; then
@@ -5385,10 +5554,35 @@ create_lxc_container() {
fi fi
msg_info "Validating storage '$CONTAINER_STORAGE'" msg_info "Validating storage '$CONTAINER_STORAGE'"
STORAGE_TYPE=$(grep -E "^[^:]+: $CONTAINER_STORAGE$" /etc/pve/storage.cfg | cut -d: -f1 | head -1 || true) # Check if storage.cfg is accessible (pmxcfs must be mounted)
if [[ ! -f /etc/pve/storage.cfg ]]; then
if ! mountpoint -q /etc/pve 2>/dev/null; then
msg_error "Proxmox cluster filesystem (pmxcfs) is not mounted at /etc/pve."
msg_custom "🔧" "${YW}" "Try: systemctl restart pve-cluster"
else
msg_error "/etc/pve/storage.cfg does not exist."
msg_custom "🔧" "${YW}" "Check Proxmox cluster filesystem integrity: pvecm status"
fi
exit 213
fi
STORAGE_TYPE=$(grep -E "^[^:]+:[[:space:]]*$CONTAINER_STORAGE[[:space:]]*$" /etc/pve/storage.cfg | cut -d: -f1 | head -1 || true)
# Fallback: use pvesm status to determine storage type
if [[ -z "$STORAGE_TYPE" ]]; then
STORAGE_TYPE=$(pvesm status -storage "$CONTAINER_STORAGE" 2>/dev/null | awk 'NR>1{print $2}')
fi
if [[ -z "$STORAGE_TYPE" ]]; then if [[ -z "$STORAGE_TYPE" ]]; then
msg_error "Storage '$CONTAINER_STORAGE' not found in /etc/pve/storage.cfg" msg_error "Storage '$CONTAINER_STORAGE' not found in /etc/pve/storage.cfg"
msg_custom "📋" "${YW}" "Available storages: $(pvesm status 2>/dev/null | awk 'NR>1{printf "%s (%s) ", $1, $2}' || echo 'n/a')"
if [[ -r /etc/pve/storage.cfg ]]; then
msg_custom "📋" "${YW}" "Storage definitions found in config:"
grep -E '^[a-z]+:' /etc/pve/storage.cfg 2>/dev/null | while IFS= read -r _line; do
echo "${TAB} $_line"
done
fi
msg_custom "📖" "${YW}" "See https://pve.proxmox.com/wiki/Storage for storage configuration details."
exit 213 exit 213
fi fi
@@ -5811,6 +6005,17 @@ create_lxc_container() {
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" $PCT_OPTIONS >"$LOGFILE" 2>&1; then if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" $PCT_OPTIONS >"$LOGFILE" 2>&1; then
msg_debug "Container creation failed on ${TEMPLATE_STORAGE}. Checking error..." msg_debug "Container creation failed on ${TEMPLATE_STORAGE}. Checking error..."
# Check for Perl module breakage (partial PVE upgrade)
if grep -qiE 'Compilation failed|Bareword.*not allowed' "$LOGFILE"; then
msg_error "Container creation failed due to broken Perl modules on the PVE host."
msg_custom "⚠️" "${YW}" "This usually happens after a partial PVE package upgrade."
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} reboot"
_flush_pct_log
exit 232
fi
# Check if CTID collision (race condition: ID claimed between validation and creation) # Check if CTID collision (race condition: ID claimed between validation and creation)
if grep -qiE 'already exists|already in use' "$LOGFILE"; then if grep -qiE 'already exists|already in use' "$LOGFILE"; then
local old_ctid="$CTID" local old_ctid="$CTID"
@@ -5856,15 +6061,16 @@ create_lxc_container() {
rc=$? rc=$?
case $rc in case $rc in
0) : ;; # success - container created, continue 0) : ;; # success - container created, continue
2) 2 | 3)
msg_error "Upgrade declined. Please update and re-run: apt update && apt install --only-upgrade pve-container lxc-pve" # Upgrade declined or failed — try older OS version as last resort
_flush_pct_log msg_warn "Attempting older ${PCT_OSTYPE:-} version as last resort"
exit 231 if fallback_to_previous_os_version; then
;; : # success
3) else
msg_error "Upgrade and/or retry failed. Please inspect: $LOGFILE" msg_error "All recovery options exhausted. Please inspect: $LOGFILE"
_flush_pct_log _flush_pct_log
exit 231 exit 231
fi
;; ;;
esac esac
else else
@@ -5888,15 +6094,16 @@ create_lxc_container() {
rc=$? rc=$?
case $rc in case $rc in
0) : ;; # success - container created, continue 0) : ;; # success - container created, continue
2) 2 | 3)
msg_error "Upgrade declined. Please update and re-run: apt update && apt install --only-upgrade pve-container lxc-pve" # Upgrade declined or failed — try older OS version as last resort
_flush_pct_log msg_warn "Attempting older ${PCT_OSTYPE:-} version as last resort"
exit 231 if fallback_to_previous_os_version; then
;; : # success
3) else
msg_error "Upgrade and/or retry failed. Please inspect: $LOGFILE" msg_error "All recovery options exhausted. Please inspect: $LOGFILE"
_flush_pct_log _flush_pct_log
exit 231 exit 231
fi
;; ;;
esac esac
else else