Compare commits

...

7 Commits

Author SHA1 Message Date
CanbiZ (MickLesk) 4f68f18961 fix(mealie): fallback heredoc if start.sh missing before backup 2026-04-23 12:26:31 +02:00
CanbiZ (MickLesk) a6fb551ee5 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.
2026-04-23 12:25:07 +02:00
CanbiZ (MickLesk) bfe25ea8ee 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
2026-04-23 12:23:56 +02:00
community-scripts-pr-app[bot] aa54abcf50 Update CHANGELOG.md (#13953)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-23 07:34:09 +00:00
CanbiZ (MickLesk) a37b36520c Prefer silent mode on PHS env conflict (#13951)
When PHS_SILENT and PHS_VERBOSE are both set, stop falling back to interactive mode. Changes prefer silent mode to keep automation safe and avoid blocking unattended/non-TTY updates. Only show a whiptail warning when both stdin/stdout are TTYs and whiptail is present, and ignore any whiptail errors. Added a brief comment and adjusted the fallback message accordingly.
2026-04-23 09:33:40 +02:00
community-scripts-pr-app[bot] 22d9eece6f Update CHANGELOG.md (#13941)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-22 12:48:13 +00:00
John Gorman 518b6778e2 core: Add PHS_VERBOSE env var to skip verbose mode prompts (#13797) 2026-04-22 14:47:44 +02:00
4 changed files with 86 additions and 35 deletions
+14
View File
@@ -445,6 +445,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details> </details>
## 2026-04-23
### 💾 Core
- #### 🐞 Bug Fixes
- core: hotfix - prefer silent mode on PHS env conflict [@MickLesk](https://github.com/MickLesk) ([#13951](https://github.com/community-scripts/ProxmoxVE/pull/13951))
## 2026-04-22 ## 2026-04-22
### 🆕 New Scripts ### 🆕 New Scripts
@@ -460,6 +468,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- 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)) - 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 ## 2026-04-21
### 🆕 New Scripts ### 🆕 New Scripts
+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"
+41 -9
View File
@@ -2702,6 +2702,10 @@ advanced_settings() {
# STEP 28: Verbose Mode & Confirmation # STEP 28: Verbose Mode & Confirmation
# ═══════════════════════════════════════════════════════════════════════════ # ═══════════════════════════════════════════════════════════════════════════
28) 28)
# PHS_VERBOSE forces verbose mode and skips the prompt
if [[ "$PHS_MODE" == "verbose" ]]; then
_verbose="yes"
else
local verbose_default_flag="--defaultno" local verbose_default_flag="--defaultno"
[[ "$_verbose" == "yes" ]] && verbose_default_flag="" [[ "$_verbose" == "yes" ]] && verbose_default_flag=""
@@ -2713,6 +2717,7 @@ advanced_settings() {
else else
_verbose="no" _verbose="no"
fi fi
fi
# Build summary # Build summary
local ct_type_desc="Unprivileged" local ct_type_desc="Unprivileged"
[[ "$_ct_type" == "0" ]] && ct_type_desc="Privileged" [[ "$_ct_type" == "0" ]] && ct_type_desc="Privileged"
@@ -3444,7 +3449,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_SILENT=1): auto-selects the default option # - In silent mode (PHS_MODE=silent): 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
@@ -3468,7 +3473,7 @@ msg_menu() {
local count=${#tags[@]} local count=${#tags[@]}
# Silent mode: return default immediately # Silent mode: return default immediately
if [[ -n "${PHS_SILENT+x}" ]] && [[ "${PHS_SILENT}" == "1" ]]; then if [[ "$PHS_MODE" == "silent" ]]; then
echo "$default_tag" echo "$default_tag"
return 0 return 0
fi fi
@@ -3504,6 +3509,34 @@ 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()
# #
@@ -3514,17 +3547,16 @@ msg_menu() {
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
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 [ ! -z ${PHS_SILENT+x} ] && [[ "${PHS_SILENT}" == "1" ]]; then elif [[ "$PHS_MODE" == "silent" ]]; then
VERBOSE="no" VERBOSE="no"
set_std_mode set_std_mode
ensure_profile_loaded elif [[ "$PHS_MODE" == "verbose" ]]; then
get_lxc_ip VERBOSE="yes"
update_script set_std_mode
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:" \
@@ -3548,12 +3580,12 @@ start() {
exit 0 exit 0
;; ;;
esac esac
fi
ensure_profile_loaded ensure_profile_loaded
get_lxc_ip get_lxc_ip
update_script update_script
update_motd_ip update_motd_ip
cleanup_lxc cleanup_lxc
fi
} }
# ============================================================================== # ==============================================================================
+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_SILENT, var_unattended) # - Falls back to legacy flags (PHS_MODE, 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_SILENT:-0}" == "1" ]] && return 0 [[ "${PHS_MODE:-}" == "silent" ]] && 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