Compare commits

...

17 Commits

Author SHA1 Message Date
CanbiZ (MickLesk)
34e897def2 Update install/wger-install.sh
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2026-02-09 11:47:04 +01:00
CanbiZ (MickLesk)
ec3d7a3c31 Update wger.sh 2026-02-09 11:45:34 +01:00
CanbiZ (MickLesk)
24013fe87c Update ct/wger.sh
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2026-02-09 11:45:09 +01:00
CanbiZ (MickLesk)
7e2ede1508 add json 2026-02-09 11:40:49 +01:00
CanbiZ (MickLesk)
b590fb41fa Fix resource defaults and enhance update process
Updated default resource values and improved backup and restore process for wger installation.
2026-02-09 11:11:15 +01:00
CanbiZ (MickLesk)
c65d41e26d Fix license URL in wger-install.sh 2026-02-09 11:10:53 +01:00
CanbiZ (MickLesk)
fc2c191ced Refactor wger installation script for new services
Updated installation script for wger, changing dependencies and configuration for PostgreSQL, Gunicorn, and Celery. Adjusted paths and service configurations for better compatibility.
2026-02-09 11:10:15 +01:00
community-scripts-pr-app[bot]
43d76b6ea7 Update CHANGELOG.md (#11721)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-09 10:05:55 +00:00
CanbiZ (MickLesk)
7715a02f05 remove whiptail from update scripts for unattended update support (#11712)
* Simplify Alpine update scripts to run upgrade

Remove interactive whiptail menus, loops and newt dependency checks from ct/alpine-docker.sh, ct/alpine-zigbee2mqtt.sh, and ct/alpine.sh. Each update_script now simply calls header_info, runs $STD apk -U upgrade, displays a success message and exits, simplifying and automating the update flow.

* feat(update-scripts): replace whiptail with msg_menu for unattended updates

Remove all whiptail dialogs from ct update_script() functions and replace
with msg_menu() - a lightweight read-based menu that supports:
- PHS_SILENT=1: auto-selects first (default) option for unattended mode
- Interactive: numbered menu with 10s timeout and default fallback

Converted scripts (whiptail menu → msg_menu):
- plex.sh, npmplus.sh, cronicle.sh, meilisearch.sh, node-red.sh
- homeassistant.sh, podman-homeassistant.sh
- vaultwarden.sh, alpine-vaultwarden.sh
- loki.sh, alpine-loki.sh
- alpine-grafana.sh, alpine-redis.sh, alpine-valkey.sh
- alpine-nextcloud.sh

Simplified scripts (removed unnecessary whiptail for single-action updates):
- alpine.sh, alpine-docker.sh, alpine-zigbee2mqtt.sh

Special handling:
- gitea-mirror.sh: replaced yesno/msgbox with read -rp confirmations,
  exit 75 in silent mode for major version upgrades requiring interaction
- vaultwarden.sh/alpine-vaultwarden.sh: passwordbox replaced with
  read -r -s -p, skipped in silent mode with warning
- nginxproxymanager.sh: exit 1 → exit 75 for disabled script

Infrastructure:
- Added msg_menu() helper to misc/build.func
- Added exit code 75 handling in update-apps.sh (skip, not fail)

Closes #11620

* refactor(update-scripts): remove menus where sequential updates suffice

- alpine-nextcloud: add apk upgrade as the update action (was missing)
- meilisearch: run meilisearch + UI updates sequentially (like bar-assistant)
- npmplus: run alpine upgrade + docker pull sequentially, no menu
- vaultwarden: update VaultWarden + Web-Vault sequentially, remove admin
  token option (interactive-only, not suitable for unattended updates)
- alpine-vaultwarden: just run apk upgrade, remove admin token menu
2026-02-09 11:05:31 +01:00
community-scripts-pr-app[bot]
c29dfa7a29 Update CHANGELOG.md (#11720)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-09 10:04:52 +00:00
CanbiZ (MickLesk)
1439d98ec4 fix(hwaccel): add libmfx-gen1.2 to Intel Arc setup for QSV support (#11707)
Add missing libmfx-gen1.2 package to _setup_intel_arc() for both
Ubuntu and Debian. Without this package, QSV hardware acceleration
fails with 'Error creating a MFX session: -9'.

The package was already present in _setup_intel_modern() (Gen9+)
but missing from the Arc GPU path.

Closes #11701
2026-02-09 11:04:22 +01:00
community-scripts-pr-app[bot]
44ad9370b6 Update CHANGELOG.md (#11719)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-09 09:53:04 +00:00
CanbiZ (MickLesk)
4e96bb664f Nginx-UI: better User Handling | ACME (#11715)
* fix(nginx-ui): remove admin user hack, use setup wizard instead

The previous install script started nginx-ui for 3 seconds, stopped it,
and ran reset-password to create an admin user. This caused:
- Race condition: the internal setup wizard could trigger during the brief
  start window, conflicting with the reset-password approach
- Admin users unable to login after the setup wizard fired
- Settings lockup due to overloaded app.ini with hardcoded nginx paths
  that conflict with UI-managed settings

Changes:
- Remove start/stop/reset-password hack from install script
- Simplify app.ini to match upstream defaults (minimal config)
- Let users complete the natural setup wizard on first visit
- Update JSON: remove default credentials, add setup wizard note
- Add setup wizard hint to CT script output

The setup wizard properly handles admin account creation and ACME email
configuration, which are both needed for full functionality.

Ref: ProxmoxVED#1408

* Update nginx-ui.sh
2026-02-09 10:52:33 +01:00
community-scripts-pr-app[bot]
57c9308326 Update CHANGELOG.md (#11717)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-09 09:34:08 +00:00
CanbiZ (MickLesk)
f07c221ca4 NginxProxymanager: use better-sqlite3 (#11708)
* fix(nginxproxymanager): update for better-sqlite3 and setup wizard

NPM switched to better-sqlite3 as the knex database client.
The old sqlite3 client causes 'Internal Error' on user creation.

- Update production.json in install/update to use better-sqlite3
- Add sed patch in update script to fix existing production.json
- Add useNullAsDefault: true to match upstream knex config
- Remove default credentials from JSON (NPM now uses setup wizard)
- Add note about setup wizard for first-time users

Ref: NginxProxyManager/nginx-proxy-manager@0b2fa82
Closes #11681

* Update nginxproxymanager.json

* Remove disabled script error messages

Removed error messages related to OpenResty APT repository issues.
2026-02-09 10:33:44 +01:00
community-scripts-pr-app[bot]
63097e3b64 Update CHANGELOG.md (#11714)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-09 09:03:51 +00:00
Slaviša Arežina
632a39f56e Add warning to website (#11711) 2026-02-09 10:03:25 +01:00
32 changed files with 569 additions and 544 deletions

View File

@@ -410,6 +410,25 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- tracearr: prepare for next stable release [@durzo](https://github.com/durzo) ([#11673](https://github.com/community-scripts/ProxmoxVE/pull/11673)) - tracearr: prepare for next stable release [@durzo](https://github.com/durzo) ([#11673](https://github.com/community-scripts/ProxmoxVE/pull/11673))
- PeaNUT: symlink server.js after update [@vhsdream](https://github.com/vhsdream) ([#11696](https://github.com/community-scripts/ProxmoxVE/pull/11696)) - PeaNUT: symlink server.js after update [@vhsdream](https://github.com/vhsdream) ([#11696](https://github.com/community-scripts/ProxmoxVE/pull/11696))
- #### ✨ New Features
- remove whiptail from update scripts for unattended update support [@MickLesk](https://github.com/MickLesk) ([#11712](https://github.com/community-scripts/ProxmoxVE/pull/11712))
- #### 🔧 Refactor
- Nginx-UI: better User Handling | ACME [@MickLesk](https://github.com/MickLesk) ([#11715](https://github.com/community-scripts/ProxmoxVE/pull/11715))
- NginxProxymanager: use better-sqlite3 [@MickLesk](https://github.com/MickLesk) ([#11708](https://github.com/community-scripts/ProxmoxVE/pull/11708))
### 💾 Core
- #### 🔧 Refactor
- hwaccel: add libmfx-gen1.2 to Intel Arc setup for QSV support [@MickLesk](https://github.com/MickLesk) ([#11707](https://github.com/community-scripts/ProxmoxVE/pull/11707))
### ❔ Uncategorized
- Bichon: Update website [@tremor021](https://github.com/tremor021) ([#11711](https://github.com/community-scripts/ProxmoxVE/pull/11711))
## 2026-02-08 ## 2026-02-08
### 🚀 Updated Scripts ### 🚀 Updated Scripts

View File

@@ -20,28 +20,9 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then header_info
apk add -q newt $STD apk -U upgrade
fi msg_ok "Updated successfully!"
while true; do
CHOICE=$(
whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 1 \
"1" "Check for Docker Updates" 3>&2 2>&1 1>&3
)
exit_status=$?
if [ $exit_status == 1 ]; then
clear
exit-script
fi
header_info
case $CHOICE in
1)
$STD apk -U upgrade
msg_ok "Updated successfully!"
exit
;;
esac
done
exit 0 exit 0
} }

View File

@@ -20,43 +20,32 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt
fi
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
while true; do
CHOICE=$( CHOICE=$(msg_menu "Grafana Update Options" \
whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 3 \ "1" "Check for Grafana Updates" \
"1" "Check for Grafana Updates" \ "2" "Allow 0.0.0.0 for listening" \
"2" "Allow 0.0.0.0 for listening" \ "3" "Allow only ${LXCIP} for listening")
"3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3
) case $CHOICE in
exit_status=$? 1)
if [ $exit_status == 1 ]; then $STD apk -U upgrade
clear msg_ok "Updated successfully!"
exit-script exit
fi ;;
header_info 2)
case $CHOICE in sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/grafana
1) service grafana restart
$STD apk -U upgrade msg_ok "Allowed listening on all interfaces!"
msg_ok "Updated successfully!" exit
exit ;;
;; 3)
2) sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/grafana
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/grafana service grafana restart
service grafana restart msg_ok "Allowed listening only on ${LXCIP}!"
msg_ok "Allowed listening on all interfaces!" exit
exit ;;
;; esac
3)
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/grafana
service grafana restart
msg_ok "Allowed listening only on ${LXCIP}!"
exit
;;
esac
done
exit 0 exit 0
} }

View File

@@ -20,43 +20,32 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt
fi
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
while true; do
CHOICE=$( CHOICE=$(msg_menu "Loki Update Options" \
whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 3 \ "1" "Check for Loki Updates" \
"1" "Check for Loki Updates" \ "2" "Allow 0.0.0.0 for listening" \
"2" "Allow 0.0.0.0 for listening" \ "3" "Allow only ${LXCIP} for listening")
"3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3
) case $CHOICE in
exit_status=$? 1)
if [ $exit_status == 1 ]; then $STD apk -U upgrade
clear msg_ok "Updated successfully!"
exit-script exit
fi ;;
header_info 2)
case $CHOICE in sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/loki
1) service loki restart
$STD apk -U upgrade msg_ok "Allowed listening on all interfaces!"
msg_ok "Updated successfully!" exit
exit ;;
;; 3)
2) sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/loki
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/loki service loki restart
service loki restart msg_ok "Allowed listening only on ${LXCIP}!"
msg_ok "Allowed listening on all interfaces!" exit
exit ;;
;; esac
3)
sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/loki
service loki restart
msg_ok "Allowed listening only on ${LXCIP}!"
exit
;;
esac
done
exit 0 exit 0
} }

View File

@@ -24,33 +24,31 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt CHOICE=$(msg_menu "Nextcloud Options" \
fi "1" "Update Alpine Packages" \
while true; do "2" "Nextcloud Login Credentials" \
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \ "3" "Renew Self-signed Certificate")
"1" "Nextcloud Login Credentials" ON \
"2" "Renew Self-signed Certificate" OFF \ case $CHOICE in
3>&1 1>&2 2>&3) 1)
exit_status=$? msg_info "Updating Alpine Packages"
if [ $exit_status == 1 ]; then $STD apk -U upgrade
clear msg_ok "Updated Alpine Packages"
exit-script msg_ok "Updated successfully!"
fi exit
header_info ;;
case $CHOICE in 2)
1) cat nextcloud.creds
cat nextcloud.creds exit
exit ;;
;; 3)
2) openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/nextcloud-selfsigned.key -out /etc/ssl/certs/nextcloud-selfsigned.crt -subj "/C=US/O=Nextcloud/OU=Domain Control Validated/CN=nextcloud.local" >/dev/null 2>&1
openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/nextcloud-selfsigned.key -out /etc/ssl/certs/nextcloud-selfsigned.crt -subj "/C=US/O=Nextcloud/OU=Domain Control Validated/CN=nextcloud.local" >/dev/null 2>&1 rc-service nginx restart
rc-service nginx restart msg_ok "Renewed self-signed certificate"
exit exit
;; ;;
esac esac
done
exit 0
} }
start start

View File

@@ -20,47 +20,36 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt
fi
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
while true; do
CHOICE=$( CHOICE=$(msg_menu "Redis Management" \
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Redis Management" --menu "Select option" 11 58 3 \ "1" "Update Redis" \
"1" "Update Redis" \ "2" "Allow 0.0.0.0 for listening" \
"2" "Allow 0.0.0.0 for listening" \ "3" "Allow only ${LXCIP} for listening")
"3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3
) case $CHOICE in
exit_status=$? 1)
if [ $exit_status == 1 ]; then msg_info "Updating Redis"
clear apk update && apk upgrade redis
exit-script rc-service redis restart
fi msg_ok "Updated successfully!"
header_info exit
case $CHOICE in ;;
1) 2)
msg_info "Updating Redis" msg_info "Setting Redis to listen on all interfaces"
apk update && apk upgrade redis sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf
rc-service redis restart rc-service redis restart
msg_ok "Updated successfully!" msg_ok "Redis now listens on all interfaces!"
exit exit
;; ;;
2) 3)
msg_info "Setting Redis to listen on all interfaces" msg_info "Setting Redis to listen only on ${LXCIP}"
sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf sed -i "s/^bind .*/bind ${LXCIP}/" /etc/redis.conf
rc-service redis restart rc-service redis restart
msg_ok "Redis now listens on all interfaces!" msg_ok "Redis now listens only on ${LXCIP}!"
exit exit
;; ;;
3) esac
msg_info "Setting Redis to listen only on ${LXCIP}"
sed -i "s/^bind .*/bind ${LXCIP}/" /etc/redis.conf
rc-service redis restart
msg_ok "Redis now listens only on ${LXCIP}!"
exit
;;
esac
done
} }
start start

View File

@@ -20,48 +20,37 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then
apk add -q newt
fi
LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
while true; do
CHOICE=$( CHOICE=$(msg_menu "Valkey Management" \
whiptail --backtitle "Proxmox VE Helper Scripts" --title "Valkey Management" --menu "Select option" 11 58 3 \ "1" "Update Valkey" \
"1" "Update Valkey" \ "2" "Allow 0.0.0.0 for listening" \
"2" "Allow 0.0.0.0 for listening" \ "3" "Allow only ${LXCIP} for listening")
"3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3
) case $CHOICE in
exit_status=$? 1)
if [ $exit_status == 1 ]; then msg_info "Updating Valkey"
clear apk update && apk upgrade valkey
exit-script rc-service valkey restart
fi msg_ok "Updated Valkey"
header_info msg_ok "Updated successfully!"
case $CHOICE in exit
1) ;;
msg_info "Updating Valkey" 2)
apk update && apk upgrade valkey msg_info "Setting Valkey to listen on all interfaces"
rc-service valkey restart sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf
msg_ok "Updated Valkey" rc-service valkey restart
msg_ok "Updated successfully!" msg_ok "Valkey now listens on all interfaces!"
exit exit
;; ;;
2) 3)
msg_info "Setting Valkey to listen on all interfaces" msg_info "Setting Valkey to listen only on ${LXCIP}"
sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf sed -i "s/^bind .*/bind ${LXCIP}/" /etc/valkey/valkey.conf
rc-service valkey restart rc-service valkey restart
msg_ok "Valkey now listens on all interfaces!" msg_ok "Valkey now listens only on ${LXCIP}!"
exit exit
;; ;;
3) esac
msg_info "Setting Valkey to listen only on ${LXCIP}"
sed -i "s/^bind .*/bind ${LXCIP}/" /etc/valkey/valkey.conf
rc-service valkey restart
msg_ok "Valkey now listens only on ${LXCIP}!"
exit
;;
esac
done
} }
start start

View File

@@ -20,45 +20,38 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then CHOICE=$(msg_menu "Vaultwarden Update Options" \
apk add -q newt "1" "Update Vaultwarden" \
fi "2" "Reset ADMIN_TOKEN")
while true; do
CHOICE=$( case $CHOICE in
whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 2 \ 1)
"1" "Update Vaultwarden" \ $STD apk -U upgrade
"2" "Reset ADMIN_TOKEN" 3>&2 2>&1 1>&3 rc-service vaultwarden restart -q
) msg_ok "Updated successfully!"
exit_status=$? exit
if [ $exit_status == 1 ]; then ;;
clear 2)
exit-script if [[ "${PHS_SILENT:-0}" == "1" ]]; then
msg_warn "Reset ADMIN_TOKEN requires interactive mode, skipping."
exit
fi fi
header_info read -r -s -p "Setup your ADMIN_TOKEN (make it strong): " NEWTOKEN
case $CHOICE in echo ""
1) if [[ -n "$NEWTOKEN" ]]; then
$STD apk -U upgrade if ! command -v argon2 >/dev/null 2>&1; then apk add argon2 &>/dev/null; fi
rc-service vaultwarden restart -q TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -e -id -k 19456 -t 2 -p 1)
msg_ok "Updated successfully!" if [[ ! -f /var/lib/vaultwarden/config.json ]]; then
exit sed -i "s|export ADMIN_TOKEN=.*|export ADMIN_TOKEN='${TOKEN}'|" /etc/conf.d/vaultwarden
;; else
2) sed -i "s|\"admin_token\": .*|\"admin_token\": \"${TOKEN}\",|" /var/lib/vaultwarden/config.json
if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Setup your ADMIN_TOKEN (make it strong)" 10 58 3>&1 1>&2 2>&3); then
if [[ -z "$NEWTOKEN" ]]; then exit-script; fi
if ! command -v argon2 >/dev/null 2>&1; then apk add argon2 &>/dev/null; fi
TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -e -id -k 19456 -t 2 -p 1)
if [[ ! -f /var/lib/vaultwarden/config.json ]]; then
sed -i "s|export ADMIN_TOKEN=.*|export ADMIN_TOKEN='${TOKEN}'|" /etc/conf.d/vaultwarden
else
sed -i "s|\"admin_token\": .*|\"admin_token\": \"${TOKEN}\",|" /var/lib/vaultwarden/config.json
fi
rc-service vaultwarden restart -q
fi fi
clear rc-service vaultwarden restart -q
exit msg_ok "Admin token updated"
;; fi
esac exit
done ;;
esac
} }
start start

View File

@@ -20,28 +20,10 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
if ! apk -e info newt >/dev/null 2>&1; then header_info
apk add -q newt $STD apk -U upgrade
fi msg_ok "Updated successfully!"
while true; do exit 0
CHOICE=$(
whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 1 \
"1" "Check for Zigbee2MQTT Updates" 3>&2 2>&1 1>&3
)
exit_status=$?
if [ $exit_status == 1 ]; then
clear
exit-script
fi
header_info
case $CHOICE in
1)
$STD apk -U upgrade
msg_ok "Updated successfully!"
exit
;;
esac
done
} }
start start

View File

@@ -20,18 +20,10 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
UPD=$(
whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 1 \
"1" "Check for Alpine Updates" ON \
3>&1 1>&2 2>&3
)
header_info header_info
if [ "$UPD" == "1" ]; then $STD apk -U upgrade
$STD apk -U upgrade msg_ok "Updated successfully!"
msg_ok "Updated successfully!" exit 0
exit 0
fi
} }
start start

View File

@@ -23,10 +23,9 @@ function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \ UPD=$(msg_menu "Cronicle Update Options" \
"1" "Update ${APP}" ON \ "1" "Update ${APP}" \
"2" "Install ${APP} Worker" OFF \ "2" "Install ${APP} Worker")
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
if [[ ! -d /opt/cronicle ]]; then if [[ ! -d /opt/cronicle ]]; then

View File

@@ -31,18 +31,27 @@ function update_script() {
APP_VERSION=$(grep -o '"version": *"[^"]*"' /opt/gitea-mirror/package.json | cut -d'"' -f4) APP_VERSION=$(grep -o '"version": *"[^"]*"' /opt/gitea-mirror/package.json | cut -d'"' -f4)
if [[ $APP_VERSION =~ ^2\. ]]; then if [[ $APP_VERSION =~ ^2\. ]]; then
if ! whiptail --backtitle "Gitea Mirror Update" --title "⚠️ VERSION 2.x DETECTED" --yesno \ if [[ "${PHS_SILENT:-0}" == "1" ]]; then
"WARNING: Version $APP_VERSION detected!\n\nUpdating from version 2.x will CLEAR ALL CONFIGURATION.\n\nThis includes:\n• API tokens\n• User settings\n• Repository configurations\n• All custom settings\n\nDo you want to continue with the update process?" 15 70 --defaultno; then msg_warn "Version $APP_VERSION detected. Major version upgrade requires interactive confirmation, skipping."
exit 75
fi
msg_warn "WARNING: Version $APP_VERSION detected!"
msg_warn "Updating from version 2.x will CLEAR ALL CONFIGURATION."
msg_warn "This includes: API tokens, User settings, Repository configurations, All custom settings"
echo ""
read -r -p "Do you want to continue? (y/N): " CONFIRM
if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
exit 0 exit 0
fi fi
msg_warn "FINAL WARNING: This update WILL clear all configuration!"
if ! whiptail --backtitle "Gitea Mirror Update" --title "⚠️ FINAL CONFIRMATION" --yesno \ msg_warn "Please ensure you have backed up API tokens, custom configurations, and repository settings."
"FINAL WARNING: This update WILL clear all configuration!\n\nBEFORE PROCEEDING, please:\n\n• Copy API tokens to a safe location\n• Backup any custom configurations\n• Note down repository settings\n\nThis action CANNOT be undone!" 18 70 --defaultno; then echo ""
whiptail --backtitle "Gitea Mirror Update" --title "Update Cancelled" --msgbox "Update process cancelled. Please backup your configuration before proceeding." 8 60 read -r -p "Final confirmation - proceed? (y/N): " CONFIRM2
if [[ ! "$CONFIRM2" =~ ^[Yy]$ ]]; then
msg_info "Update cancelled. Please backup your configuration before proceeding."
exit 0 exit 0
fi fi
whiptail --backtitle "Gitea Mirror Update" --title "Proceeding with Update" --msgbox \ msg_info "Proceeding with version $APP_VERSION update. All configuration will be cleared as warned."
"Proceeding with version $APP_VERSION update.\n\nAll configuration will be cleared as warned." 8 50
rm -rf /opt/gitea-mirror rm -rf /opt/gitea-mirror
fi fi

View File

@@ -27,12 +27,11 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \ UPD=$(msg_menu "Home Assistant Update Options" \
"1" "Update ALL Containers" ON \ "1" "Update ALL Containers" \
"2" "Remove ALL Unused Images" OFF \ "2" "Remove ALL Unused Images" \
"3" "Install HACS" OFF \ "3" "Install HACS" \
"4" "Install FileBrowser" OFF \ "4" "Install FileBrowser")
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
msg_info "Updating All Containers" msg_info "Updating All Containers"

View File

@@ -29,21 +29,13 @@ function update_script() {
exit 1 exit 1
fi fi
while true; do CHOICE=$(msg_menu "Loki Update Options" \
CHOICE=$( "1" "Update Loki & Promtail" \
whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 3 \ "2" "Allow 0.0.0.0 for listening" \
"1" "Update Loki & Promtail" \ "3" "Allow only ${LOCAL_IP} for listening")
"2" "Allow 0.0.0.0 for listening" \
"3" "Allow only ${LOCAL_IP} for listening" 3>&2 2>&1 1>&3 case $CHOICE in
) 1)
exit_status=$?
if [ $exit_status == 1 ]; then
clear
exit-script
fi
header_info
case $CHOICE in
1)
msg_info "Stopping Loki" msg_info "Stopping Loki"
systemctl stop loki systemctl stop loki
if systemctl is-active --quiet promtail 2>/dev/null || dpkg -s promtail >/dev/null 2>&1; then if systemctl is-active --quiet promtail 2>/dev/null || dpkg -s promtail >/dev/null 2>&1; then
@@ -85,7 +77,6 @@ function update_script() {
exit exit
;; ;;
esac esac
done
exit 0 exit 0
} }

View File

@@ -24,21 +24,9 @@ function update_script() {
check_container_storage check_container_storage
check_container_resources check_container_resources
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Meilisearch Update" --radiolist --cancel-button Exit-Script "Spacebar = Select" 10 58 2 \ setup_meilisearch
"1" "Update Meilisearch" ON \
"2" "Update Meilisearch-UI" OFF \
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [[ -d /opt/meilisearch-ui ]]; then
setup_meilisearch
exit
fi
if [ "$UPD" == "2" ]; then
if [[ ! -d /opt/meilisearch-ui ]]; then
msg_error "No Meilisearch-UI Installation Found!"
exit
fi
if check_for_gh_release "meilisearch-ui" "riccox/meilisearch-ui"; then if check_for_gh_release "meilisearch-ui" "riccox/meilisearch-ui"; then
msg_info "Stopping Meilisearch-UI" msg_info "Stopping Meilisearch-UI"
systemctl stop meilisearch-ui systemctl stop meilisearch-ui
@@ -58,10 +46,11 @@ function update_script() {
msg_info "Starting Meilisearch-UI" msg_info "Starting Meilisearch-UI"
systemctl start meilisearch-ui systemctl start meilisearch-ui
msg_ok "Started Meilisearch-UI" msg_ok "Started Meilisearch-UI"
msg_ok "Updated successfully!"
fi fi
exit
fi fi
msg_ok "Updated successfully!"
exit
} }
start start

View File

@@ -28,12 +28,6 @@ function update_script() {
exit exit
fi fi
msg_error "This script is currently disabled due to an external issue with the OpenResty APT repository."
msg_error "The repository's GPG key uses SHA-1 signatures, which are no longer accepted by Debian as of February 1, 2026."
msg_error "The issue is tracked in openresty/openresty#1097"
msg_error "For more details, see: https://github.com/community-scripts/ProxmoxVE/issues/11406"
exit 1
if [[ $(grep -E '^VERSION_ID=' /etc/os-release) == *"12"* ]]; then if [[ $(grep -E '^VERSION_ID=' /etc/os-release) == *"12"* ]]; then
msg_error "Wrong Debian version detected!" msg_error "Wrong Debian version detected!"
msg_error "Please create a snapshot first. You must upgrade your LXC to Debian Trixie before updating. Visit: https://github.com/community-scripts/ProxmoxVE/discussions/7489" msg_error "Please create a snapshot first. You must upgrade your LXC to Debian Trixie before updating. Visit: https://github.com/community-scripts/ProxmoxVE/discussions/7489"
@@ -145,15 +139,17 @@ function update_script() {
"database": { "database": {
"engine": "knex-native", "engine": "knex-native",
"knex": { "knex": {
"client": "sqlite3", "client": "better-sqlite3",
"connection": { "connection": {
"filename": "/data/database.sqlite" "filename": "/data/database.sqlite"
} },
"useNullAsDefault": true
} }
} }
} }
EOF EOF
fi fi
sed -i 's/"client": "sqlite3"/"client": "better-sqlite3"/' /app/config/production.json
cd /app cd /app
$STD yarn install --network-timeout 600000 $STD yarn install --network-timeout 600000
msg_ok "Initialized Backend" msg_ok "Initialized Backend"

View File

@@ -27,10 +27,9 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \ UPD=$(msg_menu "Node-Red Update Options" \
"1" "Update ${APP}" ON \ "1" "Update ${APP}" \
"2" "Install Themes" OFF \ "2" "Install Themes")
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
NODE_VERSION="22" setup_nodejs NODE_VERSION="22" setup_nodejs
@@ -49,32 +48,31 @@ function update_script() {
exit exit
fi fi
if [ "$UPD" == "2" ]; then if [ "$UPD" == "2" ]; then
THEME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NODE-RED THEMES" --radiolist --cancel-button Exit-Script "Choose Theme" 15 58 6 \ THEME=$(msg_menu "Node-Red Themes" \
"aurora" "" OFF \ "midnight-red" "Midnight Red (default)" \
"cobalt2" "" OFF \ "aurora" "Aurora" \
"dark" "" OFF \ "cobalt2" "Cobalt2" \
"dracula" "" OFF \ "dark" "Dark" \
"espresso-libre" "" OFF \ "dracula" "Dracula" \
"github-dark" "" OFF \ "espresso-libre" "Espresso Libre" \
"github-dark-default" "" OFF \ "github-dark" "GitHub Dark" \
"github-dark-dimmed" "" OFF \ "github-dark-default" "GitHub Dark Default" \
"midnight-red" "" ON \ "github-dark-dimmed" "GitHub Dark Dimmed" \
"monoindustrial" "" OFF \ "monoindustrial" "Monoindustrial" \
"monokai" "" OFF \ "monokai" "Monokai" \
"monokai-dimmed" "" OFF \ "monokai-dimmed" "Monokai Dimmed" \
"noctis" "" OFF \ "noctis" "Noctis" \
"oceanic-next" "" OFF \ "oceanic-next" "Oceanic Next" \
"oled" "" OFF \ "oled" "OLED" \
"one-dark-pro" "" OFF \ "one-dark-pro" "One Dark Pro" \
"one-dark-pro-darker" "" OFF \ "one-dark-pro-darker" "One Dark Pro Darker" \
"solarized-dark" "" OFF \ "solarized-dark" "Solarized Dark" \
"solarized-light" "" OFF \ "solarized-light" "Solarized Light" \
"tokyo-night" "" OFF \ "tokyo-night" "Tokyo Night" \
"tokyo-night-light" "" OFF \ "tokyo-night-light" "Tokyo Night Light" \
"tokyo-night-storm" "" OFF \ "tokyo-night-storm" "Tokyo Night Storm" \
"totallyinformation" "" OFF \ "totallyinformation" "TotallyInformation" \
"zenburn" "" OFF \ "zenburn" "Zenburn")
3>&1 1>&2 2>&3)
header_info header_info
msg_info "Installing ${THEME} Theme" msg_info "Installing ${THEME} Theme"
cd /root/.node-red cd /root/.node-red

View File

@@ -20,32 +20,21 @@ color
catch_errors catch_errors
function update_script() { function update_script() {
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE MODE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 14 60 2 \
"1" "Check for Alpine Updates" OFF \
"2" "Update NPMplus Docker Container" ON \
3>&1 1>&2 2>&3)
header_info "$APP" header_info "$APP"
case "$UPD" in msg_info "Updating Alpine OS"
"1") $STD apk -U upgrade
msg_info "Updating Alpine OS" msg_ok "System updated"
$STD apk -U upgrade
msg_ok "System updated" msg_info "Pulling latest NPMplus container image"
exit cd /opt
;; $STD docker compose pull
"2") msg_info "Recreating container"
msg_info "Updating NPMplus Container" $STD docker compose up -d
cd /opt msg_ok "Updated NPMplus container"
msg_info "Pulling latest container image"
$STD docker compose pull msg_ok "Updated successfully!"
msg_info "Recreating container" exit
$STD docker compose up -d
msg_ok "Updated successfully!"
exit
;;
esac
exit 0
} }
start start

View File

@@ -29,10 +29,9 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select \nplexupdate info >> https://github.com/mrworf/plexupdate" 10 59 2 \ UPD=$(msg_menu "Plex Update Options" \
"1" "Update LXC" ON \ "1" "Update LXC" \
"2" "Install plexupdate" OFF \ "2" "Install plexupdate")
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
msg_info "Updating ${APP} LXC" msg_info "Updating ${APP} LXC"
$STD apt update $STD apt update

View File

@@ -27,12 +27,11 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \ UPD=$(msg_menu "Home Assistant Update Options" \
"1" "Update system and containers" ON \ "1" "Update system and containers" \
"2" "Install HACS" OFF \ "2" "Install HACS" \
"3" "Install FileBrowser" OFF \ "3" "Install FileBrowser" \
"4" "Remove ALL Unused Images" OFF \ "4" "Remove ALL Unused Images")
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
msg_info "Updating ${APP} LXC" msg_info "Updating ${APP} LXC"

View File

@@ -31,11 +31,9 @@ function update_script() {
VAULT=$(get_latest_github_release "dani-garcia/vaultwarden") VAULT=$(get_latest_github_release "dani-garcia/vaultwarden")
WVRELEASE=$(get_latest_github_release "dani-garcia/bw_web_builds") WVRELEASE=$(get_latest_github_release "dani-garcia/bw_web_builds")
UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \ UPD=$(msg_menu "Vaultwarden Update Options" \
"1" "VaultWarden $VAULT" ON \ "1" "Update VaultWarden + Web-Vault" \
"2" "Web-Vault $WVRELEASE" OFF \ "2" "Set Admin Token")
"3" "Set Admin Token" OFF \
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then if [ "$UPD" == "1" ]; then
if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then
@@ -59,14 +57,10 @@ function update_script() {
msg_info "Starting Service" msg_info "Starting Service"
systemctl start vaultwarden systemctl start vaultwarden
msg_ok "Started Service" msg_ok "Started Service"
msg_ok "Updated successfully!"
else else
msg_ok "VaultWarden is already up-to-date" msg_ok "VaultWarden is already up-to-date"
fi fi
exit
fi
if [ "$UPD" == "2" ]; then
if check_for_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds"; then if check_for_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds"; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop vaultwarden systemctl stop vaultwarden
@@ -84,16 +78,22 @@ function update_script() {
msg_info "Starting Service" msg_info "Starting Service"
systemctl start vaultwarden systemctl start vaultwarden
msg_ok "Started Service" msg_ok "Started Service"
msg_ok "Updated successfully!"
else else
msg_ok "Web-Vault is already up-to-date" msg_ok "Web-Vault is already up-to-date"
fi fi
msg_ok "Updated successfully!"
exit exit
fi fi
if [ "$UPD" == "3" ]; then if [ "$UPD" == "2" ]; then
if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Set the ADMIN_TOKEN" 10 58 3>&1 1>&2 2>&3); then if [[ "${PHS_SILENT:-0}" == "1" ]]; then
if [[ -z "$NEWTOKEN" ]]; then exit; fi msg_warn "Set Admin Token requires interactive mode, skipping."
exit
fi
read -r -s -p "Set the ADMIN_TOKEN: " NEWTOKEN
echo ""
if [[ -n "$NEWTOKEN" ]]; then
ensure_dependencies argon2 ensure_dependencies argon2
TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e) TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e)
sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env

View File

@@ -7,9 +7,9 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="wger" APP="wger"
var_tags="${var_tags:-management;fitness}" var_tags="${var_tags:-management;fitness}"
var_cpu="${var_cpu:-1}" var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}" var_ram="${var_ram:-2048}"
var_disk="${var_disk:-6}" var_disk="${var_disk:-8}"
var_os="${var_os:-debian}" var_os="${var_os:-debian}"
var_version="${var_version:-13}" var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}" var_unprivileged="${var_unprivileged:-1}"
@@ -23,38 +23,44 @@ function update_script() {
header_info header_info
check_container_storage check_container_storage
check_container_resources check_container_resources
if [[ ! -d /home/wger ]]; then
if [[ ! -d /opt/wger ]]; then
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi fi
RELEASE=$(curl -fsSL https://api.github.com/repos/wger-project/wger/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}')
if [[ "${RELEASE}" != "$(cat /opt/${APP}_version.txt)" ]] || [[ ! -f /opt/${APP}_version.txt ]]; then if check_for_gh_release "wger" "wger-project/wger"; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop wger systemctl stop redis-server nginx celery celery-beat wger
msg_ok "Stopped Service" msg_ok "Stopped Service"
msg_info "Updating $APP to v${RELEASE}" msg_info "Backing up Data"
temp_file=$(mktemp) cp -r /opt/wger/media /opt/wger_media_backup
curl -fsSL "https://github.com/wger-project/wger/archive/refs/tags/$RELEASE.tar.gz" -o "$temp_file" cp /opt/wger/.env /opt/wger_env_backup
tar xzf "$temp_file" msg_ok "Backed up Data"
cp -rf wger-"$RELEASE"/* /home/wger/src
cd /home/wger/src
$STD pip install -r requirements_prod.txt --ignore-installed
$STD pip install -e .
$STD python3 manage.py migrate
$STD python3 manage.py collectstatic --no-input
$STD yarn install
$STD yarn build:css:sass
rm -rf "$temp_file"
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated $APP to v${RELEASE}"
msg_info "Starting Service" CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wger" "wger-project/wger" "tarball"
systemctl start wger
msg_ok "Started Service" msg_info "Restoring Data"
msg_ok "Updated successfully!" cp -r /opt/wger_media_backup/. /opt/wger/media
else cp /opt/wger_env_backup /opt/wger/.env
msg_ok "No update required. ${APP} is already at v${RELEASE}" rm -rf /opt/wger_media_backup /opt/wger_env_backup
msg_ok "Restored Data"
msg_info "Updating wger"
cd /opt/wger
set -a && source /opt/wger/.env && set +a
export DJANGO_SETTINGS_MODULE=settings.main
$STD uv pip install .
$STD uv run python manage.py migrate
$STD uv run python manage.py collectstatic --no-input
msg_ok "Updated wger"
msg_info "Starting Services"
systemctl start redis-server nginx celery celery-beat wger
msg_ok "Started Services"
msg_ok "Updated Successfully"
fi fi
exit exit
} }
@@ -63,7 +69,7 @@ start
build_container build_container
description description
msg_ok "Completed successfully!\n" msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}" echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}" echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}" echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"

View File

@@ -35,6 +35,10 @@
{ {
"text": "The Disk space initially allocated by the script is only a placeholder, as we can't know how much space you will ever need. You should increase it to match your workload.", "text": "The Disk space initially allocated by the script is only a placeholder, as we can't know how much space you will ever need. You should increase it to match your workload.",
"type": "info" "type": "info"
},
{
"text": "Please copy your `BICHON_ENCRYPT_PASSWORD` from `/opt/bichon/bichon.env` to a safe place.",
"type": "warning"
} }
] ]
} }

View File

@@ -28,10 +28,14 @@
} }
], ],
"default_credentials": { "default_credentials": {
"username": "admin", "username": null,
"password": null "password": null
}, },
"notes": [ "notes": [
{
"text": "On first visit, the setup wizard will guide you to create an admin account and configure ACME email.",
"type": "warning"
},
{ {
"text": "Nginx runs on ports 80/443, Nginx UI management interface on port 9000.", "text": "Nginx runs on ports 80/443, Nginx UI management interface on port 9000.",
"type": "info" "type": "info"
@@ -39,10 +43,6 @@
{ {
"text": "SSL certificates can be managed automatically with Let's Encrypt integration.", "text": "SSL certificates can be managed automatically with Let's Encrypt integration.",
"type": "info" "type": "info"
},
{
"text": "Initial Login data: `cat ~/nginx-ui.creds`",
"type": "info"
} }
] ]
} }

View File

@@ -30,10 +30,14 @@
} }
], ],
"default_credentials": { "default_credentials": {
"username": "admin@example.com", "username": null,
"password": "changeme" "password": null
}, },
"notes": [ "notes": [
{
"text": "On first launch, a setup wizard will guide you through creating an admin account. There are no default credentials.",
"type": "info"
},
{ {
"text": "You can install the specific one certbot you prefer, or you can Running /app/scripts/install-certbot-plugins within the Nginx Proxy Manager (NPM) LXC shell will install many common plugins. Important: This script does not install all Certbot plugins, as some require additional, external system dependencies (like specific packages for certain DNS providers). These external dependencies must be manually installed within the LXC container before you can successfully install and use the corresponding Certbot plugin. Consult the plugin's documentation for required packages.", "text": "You can install the specific one certbot you prefer, or you can Running /app/scripts/install-certbot-plugins within the Nginx Proxy Manager (NPM) LXC shell will install many common plugins. Important: This script does not install all Certbot plugins, as some require additional, external system dependencies (like specific packages for certain DNS providers). These external dependencies must be manually installed within the LXC container before you can successfully install and use the corresponding Certbot plugin. Consult the plugin's documentation for required packages.",
"type": "info" "type": "info"

View File

@@ -19,9 +19,9 @@
"type": "default", "type": "default",
"script": "ct/wger.sh", "script": "ct/wger.sh",
"resources": { "resources": {
"cpu": 1, "cpu": 2,
"ram": 1024, "ram": 2048,
"hdd": 6, "hdd": 8,
"os": "debian", "os": "debian",
"version": "13" "version": "13"
} }
@@ -33,7 +33,7 @@
}, },
"notes": [ "notes": [
{ {
"text": "Enable proxy support by uncommenting this line in `/home/wger/src/settings.py` and pointing it to your URL: `# CSRF_TRUSTED_ORIGINS = ['http://127.0.0.1', 'https://my.domain.example.com']`, then restart the service `systemctl restart wger`.", "text": "This LXC also runs Celery and Redis to synchronize workouts and ingredients",
"type": "info" "type": "info"
} }
] ]

View File

@@ -30,29 +30,20 @@ msg_ok "Installed Nginx UI"
msg_info "Configuring Nginx UI" msg_info "Configuring Nginx UI"
mkdir -p /usr/local/etc/nginx-ui mkdir -p /usr/local/etc/nginx-ui
cat <<EOF >/usr/local/etc/nginx-ui/app.ini cat <<EOF >/usr/local/etc/nginx-ui/app.ini
[server]
HttpHost = 0.0.0.0
HttpPort = 9000
RunMode = release
JwtSecret = $(openssl rand -hex 32)
[nginx]
AccessLogPath = /var/log/nginx/access.log
ErrorLogPath = /var/log/nginx/error.log
ConfigDir = /etc/nginx
PIDPath = /run/nginx.pid
TestConfigCmd = nginx -t
ReloadCmd = nginx -s reload
RestartCmd = systemctl restart nginx
[app] [app]
PageSize = 10 PageSize = 10
[server]
Host = 0.0.0.0
Port = 9000
RunMode = release
JwtSecret = $(openssl rand -hex 32)
[cert] [cert]
Email = HTTPChallengePort = 9180
CADir =
RenewalInterval = 7 [terminal]
RecursiveNameservers = StartCmd = login
EOF EOF
msg_ok "Configured Nginx UI" msg_ok "Configured Nginx UI"
@@ -78,17 +69,6 @@ EOF
systemctl daemon-reload systemctl daemon-reload
msg_ok "Created Service" msg_ok "Created Service"
msg_info "Creating Initial Admin User"
systemctl start nginx-ui
sleep 3
systemctl stop nginx-ui
sleep 1
/usr/local/bin/nginx-ui reset-password --config /usr/local/etc/nginx-ui/app.ini &>/tmp/nginx-ui-reset.log || true
ADMIN_PASS=$(grep -oP 'Password: \K\S+' /tmp/nginx-ui-reset.log || echo "admin")
echo -e "Nginx-UI Credentials\nUsername: admin\nPassword: $ADMIN_PASS" >~/nginx-ui.creds
rm -f /tmp/nginx-ui-reset.log
msg_ok "Created Initial Admin User"
msg_info "Starting Service" msg_info "Starting Service"
systemctl enable -q --now nginx-ui systemctl enable -q --now nginx-ui
rm -rf /etc/nginx/sites-enabled/default rm -rf /etc/nginx/sites-enabled/default

View File

@@ -130,10 +130,11 @@ if [ ! -f /app/config/production.json ]; then
"database": { "database": {
"engine": "knex-native", "engine": "knex-native",
"knex": { "knex": {
"client": "sqlite3", "client": "better-sqlite3",
"connection": { "connection": {
"filename": "/data/database.sqlite" "filename": "/data/database.sqlite"
} },
"useNullAsDefault": true
} }
} }
} }

View File

@@ -15,92 +15,167 @@ update_os
msg_info "Installing Dependencies" msg_info "Installing Dependencies"
$STD apt install -y \ $STD apt install -y \
git \ build-essential \
apache2 \ nginx \
libapache2-mod-wsgi-py3 redis-server \
libpq-dev
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
msg_info "Installing Python" NODE_VERSION="22" NODE_MODULE="sass" setup_nodejs
$STD apt install -y python3-pip setup_uv
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED PG_VERSION="16" setup_postgresql
msg_ok "Installed Python" PG_DB_NAME="wger" PG_DB_USER="wger" setup_postgresql_db
fetch_and_deploy_gh_release "wger" "wger-project/wger" "tarball"
NODE_VERSION="22" NODE_MODULE="yarn,sass" setup_nodejs
msg_info "Setting up wger" msg_info "Setting up wger"
$STD adduser wger --disabled-password --gecos "" mkdir -p /opt/wger/{static,media}
mkdir /home/wger/db chmod o+w /opt/wger/media
touch /home/wger/db/database.sqlite cd /opt/wger
chown :www-data -R /home/wger/db $STD corepack enable
chmod g+w /home/wger/db /home/wger/db/database.sqlite $STD npm install
mkdir /home/wger/{static,media} $STD npm run build:css:sass
chmod o+w /home/wger/media $STD uv venv
temp_dir=$(mktemp -d) $STD uv pip install . --group docker
cd "$temp_dir" SECRET_KEY=$(openssl rand -base64 40)
RELEASE=$(curl -fsSL https://api.github.com/repos/wger-project/wger/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3)}') cat <<EOF >/opt/wger/.env
curl -fsSL "https://github.com/wger-project/wger/archive/refs/tags/$RELEASE.tar.gz" -o "$RELEASE.tar.gz" DJANGO_SETTINGS_MODULE=settings.main
tar xzf "$RELEASE".tar.gz PYTHONPATH=/opt/wger
mv wger-"$RELEASE" /home/wger/src
cd /home/wger/src
$STD pip install -r requirements_prod.txt --ignore-installed
$STD pip install -e .
$STD wger create-settings --database-path /home/wger/db/database.sqlite
sed -i "s#home/wger/src/media#home/wger/media#g" /home/wger/src/settings.py
sed -i "/MEDIA_ROOT = '\/home\/wger\/media'/a STATIC_ROOT = '/home/wger/static'" /home/wger/src/settings.py
$STD wger bootstrap
$STD python3 manage.py collectstatic
rm -rf "$temp_dir"
echo "${RELEASE}" >/opt/wger_version.txt
msg_ok "Finished setting up wger"
msg_info "Creating Service" DJANGO_DB_ENGINE=django.db.backends.postgresql
cat <<EOF >/etc/apache2/sites-available/wger.conf DJANGO_DB_DATABASE=${PG_DB_NAME}
<Directory /home/wger/src> DJANGO_DB_USER=${PG_DB_USER}
<Files wsgi.py> DJANGO_DB_PASSWORD=${PG_DB_PASS}
Require all granted DJANGO_DB_HOST=localhost
</Files> DJANGO_DB_PORT=5432
</Directory> DATABASE_URL=postgresql://${PG_DB_USER}:${PG_DB_PASS}@localhost:5432/${PG_DB_NAME}
<VirtualHost *:80> DJANGO_MEDIA_ROOT=/opt/wger/media
WSGIApplicationGroup %{GLOBAL} DJANGO_STATIC_ROOT=/opt/wger/static
WSGIDaemonProcess wger python-path=/home/wger/src python-home=/home/wger DJANGO_STATIC_URL=/static/
WSGIProcessGroup wger
WSGIScriptAlias / /home/wger/src/wger/wsgi.py
WSGIPassAuthorization On
Alias /static/ /home/wger/static/ ALLOWED_HOSTS=${LOCAL_IP},localhost,127.0.0.1
<Directory /home/wger/static> CSRF_TRUSTED_ORIGINS=http://${LOCAL_IP}:3000
Require all granted
</Directory>
Alias /media/ /home/wger/media/ USE_X_FORWARDED_HOST=True
<Directory /home/wger/media> SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,http
Require all granted
</Directory>
ErrorLog /var/log/apache2/wger-error.log DJANGO_CACHE_BACKEND=django_redis.cache.RedisCache
CustomLog /var/log/apache2/wger-access.log combined DJANGO_CACHE_LOCATION=redis://127.0.0.1:6379/1
</VirtualHost> DJANGO_CACHE_TIMEOUT=300
DJANGO_CACHE_CLIENT_CLASS=django_redis.client.DefaultClient
AXES_CACHE_ALIAS=default
USE_CELERY=True
CELERY_BROKER=redis://127.0.0.1:6379/2
CELERY_BACKEND=redis://127.0.0.1:6379/2
SITE_URL=http://${LOCAL_IP}:3000
SECRET_KEY=${SECRET_KEY}
EOF EOF
$STD a2dissite 000-default.conf set -a && source /opt/wger/.env && set +a
$STD a2ensite wger $STD uv run wger bootstrap
systemctl restart apache2 $STD uv run python manage.py collectstatic --no-input
cat <<EOF | uv run python manage.py shell
from django.contrib.auth import get_user_model
User = get_user_model()
user, created = User.objects.get_or_create(
username="admin",
defaults={"email": "admin@localhost"},
)
if created:
user.set_password("${PG_DB_PASS}")
user.is_superuser = True
user.is_staff = True
user.save()
EOF
msg_ok "Set up wger"
msg_info "Creating Config and Services"
cat <<EOF >/etc/systemd/system/wger.service cat <<EOF >/etc/systemd/system/wger.service
[Unit] [Unit]
Description=wger Service Description=wger Gunicorn
After=network.target After=network.target
[Service] [Service]
Type=simple
User=root User=root
ExecStart=/usr/local/bin/wger start -a 0.0.0.0 -p 3000 WorkingDirectory=/opt/wger
EnvironmentFile=/opt/wger/.env
ExecStart=/opt/wger/.venv/bin/gunicorn \
--bind 127.0.0.1:8000 \
--workers 3 \
--threads 2 \
--timeout 120 \
wger.wsgi:application
Restart=always Restart=always
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl enable -q --now wger cat <<EOF >/etc/systemd/system/celery.service
msg_ok "Created Service" [Unit]
Description=wger Celery Worker
After=network.target redis-server.service
Requires=redis-server.service
[Service]
WorkingDirectory=/opt/wger
EnvironmentFile=/opt/wger/.env
ExecStart=/opt/wger/.venv/bin/celery -A wger worker -l info
Restart=always
[Install]
WantedBy=multi-user.target
EOF
mkdir -p /var/lib/wger/celery
chmod 700 /var/lib/wger/celery
cat <<EOF >/etc/systemd/system/celery-beat.service
[Unit]
Description=wger Celery Beat
After=network.target redis-server.service
Requires=redis-server.service
[Service]
WorkingDirectory=/opt/wger
EnvironmentFile=/opt/wger/.env
ExecStart=/opt/wger/.venv/bin/celery -A wger beat -l info \
--schedule /var/lib/wger/celery/celerybeat-schedule
Restart=always
[Install]
WantedBy=multi-user.target
EOF
cat <<'EOF' >/etc/nginx/sites-available/wger
server {
listen 3000;
server_name _;
client_max_body_size 20M;
location /static/ {
alias /opt/wger/static/;
expires 30d;
}
location /media/ {
alias /opt/wger/media/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}
EOF
$STD rm -f /etc/nginx/sites-enabled/default
$STD ln -sf /etc/nginx/sites-available/wger /etc/nginx/sites-enabled/wger
systemctl enable -q --now redis-server nginx wger celery celery-beat
systemctl restart nginx
msg_ok "Created Config and Services"
motd_ssh motd_ssh
customize customize

View File

@@ -3318,6 +3318,68 @@ configure_ssh_settings() {
fi fi
} }
# ------------------------------------------------------------------------------
# msg_menu()
#
# - Displays a numbered menu for update_script() functions
# - In silent mode (PHS_SILENT=1): auto-selects the default option
# - In interactive mode: shows menu via read with 10s timeout + default fallback
# - Usage: CHOICE=$(msg_menu "Title" "tag1" "Description 1" "tag2" "Desc 2" ...)
# - The first item is always the default
# - Returns the selected tag to stdout
# - If no valid selection or timeout, returns the default (first) tag
# ------------------------------------------------------------------------------
msg_menu() {
local title="$1"
shift
# Parse items into parallel arrays: tags[] and descriptions[]
local -a tags=()
local -a descs=()
while [[ $# -ge 2 ]]; do
tags+=("$1")
descs+=("$2")
shift 2
done
local default_tag="${tags[0]}"
local count=${#tags[@]}
# Silent mode: return default immediately
if [[ -n "${PHS_SILENT+x}" ]] && [[ "${PHS_SILENT}" == "1" ]]; then
echo "$default_tag"
return 0
fi
# Display menu
echo ""
msg_custom "📋" "${BL}" "${title}"
echo ""
for i in "${!tags[@]}"; do
local marker=" "
[[ $i -eq 0 ]] && marker="* "
printf "${TAB3}${marker}%s) %s\n" "${tags[$i]}" "${descs[$i]}"
done
echo ""
local selection=""
read -r -t 10 -p "${TAB3}Select [default=${default_tag}, timeout 10s]: " selection || true
# Validate selection
if [[ -n "$selection" ]]; then
for tag in "${tags[@]}"; do
if [[ "$selection" == "$tag" ]]; then
echo "$selection"
return 0
fi
done
msg_warn "Invalid selection '${selection}' - using default: ${default_tag}"
fi
echo "$default_tag"
return 0
}
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# start() # start()
# #

View File

@@ -3595,6 +3595,7 @@ _setup_intel_arc() {
$STD apt -y install \ $STD apt -y install \
intel-media-va-driver-non-free \ intel-media-va-driver-non-free \
intel-opencl-icd \ intel-opencl-icd \
libmfx-gen1.2 \
vainfo \ vainfo \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel Arc packages failed" intel-gpu-tools 2>/dev/null || msg_warn "Some Intel Arc packages failed"
@@ -3621,6 +3622,7 @@ _setup_intel_arc() {
intel-media-va-driver-non-free \ intel-media-va-driver-non-free \
ocl-icd-libopencl1 \ ocl-icd-libopencl1 \
libvpl2 \ libvpl2 \
libmfx-gen1.2 \
vainfo \ vainfo \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel Arc packages failed" intel-gpu-tools 2>/dev/null || msg_warn "Some Intel Arc packages failed"
fi fi

View File

@@ -421,6 +421,8 @@ for container in $CHOICE; do
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
echo -e "${YW}[WARN]${CL} Container $container skipped (requires interactive mode)"
elif [ "$BACKUP_CHOICE" == "yes" ]; then elif [ "$BACKUP_CHOICE" == "yes" ]; then
msg_info "Restoring LXC from backup" msg_info "Restoring LXC from backup"
pct stop $container pct stop $container