mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-04-25 19:02:20 -04:00
Compare commits
30 Commits
fix/setup-
...
add-script
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7088c30568 | ||
|
|
38d6cb33d7 | ||
|
|
fecad57187 | ||
|
|
bb7b612d5f | ||
|
|
2c22e03774 | ||
|
|
6ca9569dc3 | ||
|
|
562ae12972 | ||
|
|
47cb50e7cd | ||
|
|
a8c1155cac | ||
|
|
f4a141019e | ||
|
|
2b288ee617 | ||
|
|
a36d0cb20c | ||
|
|
d3efebce67 | ||
|
|
7a440679f5 | ||
|
|
db2780ff44 | ||
|
|
fdab25b098 | ||
|
|
c3c544d5a4 | ||
|
|
3c38647055 | ||
|
|
7e1b2b4f92 | ||
|
|
145602a8c3 | ||
|
|
687e778460 | ||
|
|
1476849f3c | ||
|
|
a2bf10d2f2 | ||
|
|
9c44055709 | ||
|
|
7141f89676 | ||
|
|
9f50496f8b | ||
|
|
01bbacec22 | ||
|
|
116253df1a | ||
|
|
8706cd3783 | ||
|
|
874d8f300c |
35
CHANGELOG.md
35
CHANGELOG.md
@@ -445,14 +445,49 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-04-24
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Transmute ([#13935](https://github.com/community-scripts/ProxmoxVE/pull/13935))
|
||||
- Jitsi-Meet ([#13897](https://github.com/community-scripts/ProxmoxVE/pull/13897))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- Update wger.sh [@Soppster1029](https://github.com/Soppster1029) ([#13977](https://github.com/community-scripts/ProxmoxVE/pull/13977))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Ghostfolio [@MickLesk](https://github.com/MickLesk) ([#13990](https://github.com/community-scripts/ProxmoxVE/pull/13990))
|
||||
|
||||
## 2026-04-23
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- mealie: start.sh missing after failed update [@MickLesk](https://github.com/MickLesk) ([#13958](https://github.com/community-scripts/ProxmoxVE/pull/13958))
|
||||
- twingate-connector: perform real apt upgrade during update flow [@MickLesk](https://github.com/MickLesk) ([#13959](https://github.com/community-scripts/ProxmoxVE/pull/13959))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- core: auto-size NODE_OPTIONS heap [@MickLesk](https://github.com/MickLesk) ([#13960](https://github.com/community-scripts/ProxmoxVE/pull/13960))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Update scripts to match standard [@tremor021](https://github.com/tremor021) ([#13956](https://github.com/community-scripts/ProxmoxVE/pull/13956))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- tools.func: upgrade Node.js minor/patch on same major version [@MickLesk](https://github.com/MickLesk) ([#13957](https://github.com/community-scripts/ProxmoxVE/pull/13957))
|
||||
- core: hotfix - prefer silent mode on PHS env conflict [@MickLesk](https://github.com/MickLesk) ([#13951](https://github.com/community-scripts/ProxmoxVE/pull/13951))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- core: improve system update information / lxc stack upgrade [@MickLesk](https://github.com/MickLesk) ([#13970](https://github.com/community-scripts/ProxmoxVE/pull/13970))
|
||||
|
||||
## 2026-04-22
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
@@ -39,7 +39,7 @@ function update_script() {
|
||||
[ -f /opt/checkmate/client/.env.local ] && cp /opt/checkmate/client/.env.local /opt/checkmate_client.env.local.bak
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate"
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate" "tarball"
|
||||
|
||||
msg_info "Updating Checkmate Server"
|
||||
cd /opt/checkmate/server
|
||||
|
||||
74
ct/fireshare.sh
Normal file
74
ct/fireshare.sh
Normal file
@@ -0,0 +1,74 @@
|
||||
#!/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/ShaneIsrael/fireshare
|
||||
|
||||
APP="Fireshare"
|
||||
var_tags="${var_tags:-sharing;video}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-2048}"
|
||||
var_disk="${var_disk:-10}"
|
||||
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/fireshare ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "fireshare" "ShaneIsrael/fireshare"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop fireshare
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
mv /opt/fireshare/fireshare.env /opt
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "fireshare" "ShaneIsrael/fireshare" "tarball"
|
||||
mv /opt/fireshare.env /opt/fireshare
|
||||
rm -f /usr/local/bin/fireshare
|
||||
|
||||
msg_info "Updating Fireshare"
|
||||
cd /opt/fireshare
|
||||
$STD uv venv --clear
|
||||
$STD .venv/bin/python -m ensurepip --upgrade
|
||||
$STD .venv/bin/python -m pip install --upgrade --break-system-packages pip
|
||||
$STD .venv/bin/python -m pip install --no-cache-dir --break-system-packages --ignore-installed app/server
|
||||
cp .venv/bin/fireshare /usr/local/bin/fireshare
|
||||
export FLASK_APP="/opt/fireshare/app/server/fireshare:create_app()"
|
||||
export DATA_DIRECTORY=/opt/fireshare-data
|
||||
export IMAGE_DIRECTORY=/opt/fireshare-images
|
||||
export VIDEO_DIRECTORY=/opt/fireshare-videos
|
||||
export PROCESSED_DIRECTORY=/opt/fireshare-processed
|
||||
$STD uv run flask db upgrade
|
||||
msg_ok "Updated Fireshare"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start fireshare
|
||||
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}${CL}"
|
||||
@@ -38,7 +38,7 @@ function update_script() {
|
||||
cp -r /opt/flatnotes/data /opt/flatnotes_data_backup
|
||||
msg_ok "Backed up Configuration and Data"
|
||||
|
||||
fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes"
|
||||
fetch_and_deploy_gh_release "flatnotes" "dullage/flatnotes" "tarball"
|
||||
|
||||
msg_info "Updating Flatnotes"
|
||||
cd /opt/flatnotes/client
|
||||
|
||||
@@ -47,6 +47,7 @@ function update_script() {
|
||||
|
||||
msg_info "Updating Ghostfolio"
|
||||
mv /opt/env.backup /opt/ghostfolio/.env
|
||||
sed -i -E '/^DATABASE_URL=/ s/[?&]sslmode=prefer//g' /opt/ghostfolio/.env
|
||||
cd /opt/ghostfolio
|
||||
$STD npm ci
|
||||
$STD npm run build:production
|
||||
|
||||
6
ct/headers/fireshare
Normal file
6
ct/headers/fireshare
Normal file
@@ -0,0 +1,6 @@
|
||||
_______ __
|
||||
/ ____(_)_______ _____/ /_ ____ _________
|
||||
/ /_ / / ___/ _ \/ ___/ __ \/ __ `/ ___/ _ \
|
||||
/ __/ / / / / __(__ ) / / / /_/ / / / __/
|
||||
/_/ /_/_/ \___/____/_/ /_/\__,_/_/ \___/
|
||||
|
||||
6
ct/headers/jitsi-meet
Normal file
6
ct/headers/jitsi-meet
Normal file
@@ -0,0 +1,6 @@
|
||||
___ __ _ __ ___ __
|
||||
/ (_) /______(_) / |/ /__ ___ / /_
|
||||
__ / / / __/ ___/ /_____/ /|_/ / _ \/ _ \/ __/
|
||||
/ /_/ / / /_(__ ) /_____/ / / / __/ __/ /_
|
||||
\____/_/\__/____/_/ /_/ /_/\___/\___/\__/
|
||||
|
||||
6
ct/headers/transmute
Normal file
6
ct/headers/transmute
Normal file
@@ -0,0 +1,6 @@
|
||||
______ __
|
||||
/_ __/________ _____ _________ ___ __ __/ /____
|
||||
/ / / ___/ __ `/ __ \/ ___/ __ `__ \/ / / / __/ _ \
|
||||
/ / / / / /_/ / / / (__ ) / / / / / /_/ / /_/ __/
|
||||
/_/ /_/ \__,_/_/ /_/____/_/ /_/ /_/\__,_/\__/\___/
|
||||
|
||||
50
ct/jitsi-meet.sh
Normal file
50
ct/jitsi-meet.sh
Normal file
@@ -0,0 +1,50 @@
|
||||
#!/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://jitsi.org/
|
||||
|
||||
APP="Jitsi-Meet"
|
||||
var_tags="${var_tags:-video;conference;communication}"
|
||||
var_cpu="${var_cpu:-4}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-12}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-12}"
|
||||
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 /etc/jitsi ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating Jitsi Meet"
|
||||
$STD apt update
|
||||
$STD apt install -y --only-upgrade \
|
||||
jitsi-meet \
|
||||
jicofo \
|
||||
jitsi-videobridge2 \
|
||||
prosody
|
||||
msg_ok "Updated Jitsi Meet"
|
||||
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}https://${IP}${CL}"
|
||||
@@ -39,7 +39,7 @@ function update_script() {
|
||||
cp /opt/linkding/.env /opt/linkding_env_backup
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding"
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding" "tarball"
|
||||
|
||||
msg_info "Restoring Data"
|
||||
cp -r /opt/linkding_data_backup/. /opt/linkding/data
|
||||
|
||||
29
ct/mealie.sh
29
ct/mealie.sh
@@ -38,10 +38,27 @@ function update_script() {
|
||||
|
||||
msg_info "Backing up Configuration"
|
||||
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"
|
||||
|
||||
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"
|
||||
cd /opt/mealie
|
||||
$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
|
||||
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"
|
||||
systemctl start mealie
|
||||
msg_ok "Started Service"
|
||||
|
||||
@@ -34,7 +34,7 @@ function update_script() {
|
||||
systemctl stop nodecast-tv
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv"
|
||||
fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv" "tarball"
|
||||
|
||||
msg_info "Updating Modules"
|
||||
cd /opt/nodecast-tv
|
||||
|
||||
@@ -145,7 +145,7 @@ EOF
|
||||
cp -r /opt/termix/uploads /opt/termix_uploads_backup
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
|
||||
|
||||
msg_info "Recreating Directories"
|
||||
mkdir -p /opt/termix/html \
|
||||
@@ -155,6 +155,8 @@ EOF
|
||||
/opt/termix/nginx/client_body
|
||||
msg_ok "Recreated Directories"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
msg_info "Building Frontend"
|
||||
cd /opt/termix
|
||||
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
|
||||
|
||||
83
ct/transmute.sh
Normal file
83
ct/transmute.sh
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/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://github.com/transmute-app/transmute
|
||||
|
||||
APP="Transmute"
|
||||
var_tags="${var_tags:-files;converter}"
|
||||
var_cpu="${var_cpu:-4}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-16}"
|
||||
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/transmute ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-x86_64.txz"
|
||||
ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert
|
||||
fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-amd64-*.deb"
|
||||
fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-amd64.deb"
|
||||
|
||||
if check_for_gh_release "transmute" "transmute-app/transmute"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop transmute
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Backing up Data"
|
||||
cp /opt/transmute/backend/.env /opt/transmute.env.bak
|
||||
cp -r /opt/transmute/data /opt/transmute_data_bak
|
||||
msg_ok "Backed up Data"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "transmute" "transmute-app/transmute" "tarball"
|
||||
|
||||
msg_info "Updating Python Dependencies"
|
||||
cd /opt/transmute
|
||||
$STD uv venv --clear /opt/transmute/.venv
|
||||
$STD uv pip install --python /opt/transmute/.venv/bin/python -r requirements.txt
|
||||
msg_ok "Updated Python Dependencies"
|
||||
|
||||
msg_info "Rebuilding Frontend"
|
||||
cd /opt/transmute/frontend
|
||||
$STD npm ci
|
||||
$STD npm run build
|
||||
msg_ok "Rebuilt Frontend"
|
||||
|
||||
msg_info "Restoring Data"
|
||||
cp /opt/transmute.env.bak /opt/transmute/backend/.env
|
||||
cp -r /opt/transmute_data_bak/. /opt/transmute/data/
|
||||
rm -f /opt/transmute.env.bak
|
||||
rm -rf /opt/transmute_data_bak
|
||||
msg_ok "Restored Data"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start transmute
|
||||
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}:3313${CL}"
|
||||
@@ -29,8 +29,9 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Updating ${APP}"
|
||||
ensure_dependencies twingate-connector
|
||||
msg_info "Updating Twingate Connector"
|
||||
$STD apt update
|
||||
$STD apt install -y --only-upgrade twingate-connector
|
||||
$STD systemctl restart twingate-connector
|
||||
msg_ok "Updated successfully!"
|
||||
exit
|
||||
|
||||
@@ -53,6 +53,8 @@ function update_script() {
|
||||
set -a && source /opt/wger/.env && set +a
|
||||
export DJANGO_SETTINGS_MODULE=settings.main
|
||||
$STD uv pip install .
|
||||
$STD npm install
|
||||
$STD npm run build:css:sass
|
||||
$STD uv run python manage.py migrate
|
||||
$STD uv run python manage.py collectstatic --no-input
|
||||
msg_ok "Updated wger"
|
||||
|
||||
@@ -22,7 +22,7 @@ msg_ok "Installed Dependencies"
|
||||
|
||||
MONGO_VERSION="8.0" setup_mongodb
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate"
|
||||
fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate" "tarball"
|
||||
|
||||
msg_info "Configuring Checkmate"
|
||||
JWT_SECRET="$(openssl rand -hex 32)"
|
||||
|
||||
174
install/fireshare-install.sh
Normal file
174
install/fireshare-install.sh
Normal file
@@ -0,0 +1,174 @@
|
||||
#!/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/ShaneIsrael/fireshare
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
setup_hwaccel
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
git \
|
||||
build-essential \
|
||||
cmake \
|
||||
pkg-config \
|
||||
yasm \
|
||||
nasm \
|
||||
libx264-dev \
|
||||
libx265-dev \
|
||||
libvpx-dev \
|
||||
libaom-dev \
|
||||
libopus-dev \
|
||||
libvorbis-dev \
|
||||
libass-dev \
|
||||
libfreetype6-dev \
|
||||
libmp3lame-dev \
|
||||
nginx-extras \
|
||||
supervisor \
|
||||
libldap2-dev \
|
||||
libsasl2-dev \
|
||||
libssl-dev \
|
||||
libffi-dev \
|
||||
libc-dev
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION=24 setup_nodejs
|
||||
PYTHON_VERSION=3.14 setup_uv
|
||||
|
||||
fetch_and_deploy_gh_release "fireshare" "ShaneIsrael/fireshare" "tarball"
|
||||
|
||||
msg_info "Compiling SVT-AV1 (Patience)"
|
||||
cd /tmp
|
||||
$STD git clone --depth 1 --branch v1.8.0 https://gitlab.com/AOMediaCodec/SVT-AV1.git
|
||||
cd SVT-AV1/Build
|
||||
$STD cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
|
||||
$STD make -j$(nproc)
|
||||
$STD make install
|
||||
msg_ok "Compiled SVT-AV1"
|
||||
|
||||
msg_info "Installing NVDEC headers"
|
||||
cd /tmp
|
||||
$STD git clone --depth 1 --branch n12.1.14.0 https://github.com/FFmpeg/nv-codec-headers.git
|
||||
cd nv-codec-headers
|
||||
$STD make install
|
||||
$STD ldconfig
|
||||
msg_ok "Installed NVDEC headers"
|
||||
|
||||
msg_info "Compiling ffmpeg (Patience)"
|
||||
cd /tmp
|
||||
curl -fsSL https://ffmpeg.org/releases/ffmpeg-6.1.tar.xz -o "ffmpeg-6.1.tar.xz"
|
||||
$STD tar -xf ffmpeg-6.1.tar.xz
|
||||
cd ffmpeg-6.1
|
||||
$STD ./configure \
|
||||
--prefix=/usr/local \
|
||||
--enable-gpl \
|
||||
--enable-version3 \
|
||||
--enable-nonfree \
|
||||
--enable-ffnvcodec \
|
||||
--enable-libx264 \
|
||||
--enable-libx265 \
|
||||
--enable-libvpx \
|
||||
--enable-libaom \
|
||||
--enable-libopus \
|
||||
--enable-libvorbis \
|
||||
--enable-libmp3lame \
|
||||
--enable-libass \
|
||||
--enable-libfreetype \
|
||||
--enable-libsvtav1 \
|
||||
--disable-debug \
|
||||
--disable-doc
|
||||
$STD make -j$(nproc)
|
||||
$STD make install
|
||||
$STD ldconfig
|
||||
msg_ok "Compiled ffmpeg"
|
||||
|
||||
msg_info "Configuring Fireshare (Patience)"
|
||||
ADMIN_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
SECRET=$(openssl rand -base64 48)
|
||||
mkdir -p /opt/fireshare-{data,videos,images,processed}
|
||||
cd /opt/fireshare
|
||||
$STD uv venv
|
||||
$STD .venv/bin/python -m ensurepip --upgrade
|
||||
$STD .venv/bin/python -m pip install --upgrade --break-system-packages pip
|
||||
ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg
|
||||
ln -sf /usr/local/bin/ffprobe /usr/bin/ffprobe
|
||||
echo "/usr/local/lib" >/etc/ld.so.conf.d/usr-local.conf
|
||||
echo "/usr/local/cuda/lib64" >>/etc/ld.so.conf.d/usr-local.conf
|
||||
echo "/usr/local/nvidia/lib" >>/etc/ld.so.conf.d/nvidia.conf
|
||||
echo "/usr/local/nvidia/lib64" >>/etc/ld.so.conf.d/nvidia.conf
|
||||
ldconfig
|
||||
$STD .venv/bin/python -m pip install --no-cache-dir --break-system-packages --ignore-installed app/server
|
||||
cp .venv/bin/fireshare /usr/local/bin/fireshare
|
||||
export FLASK_APP="/opt/fireshare/app/server/fireshare:create_app()"
|
||||
export DATA_DIRECTORY=/opt/fireshare-data
|
||||
export IMAGE_DIRECTORY=/opt/fireshare-images
|
||||
export VIDEO_DIRECTORY=/opt/fireshare-videos
|
||||
export PROCESSED_DIRECTORY=/opt/fireshare-processed
|
||||
$STD uv run flask db upgrade
|
||||
|
||||
cat <<EOF >/opt/fireshare/fireshare.env
|
||||
FLASK_APP="/opt/fireshare/app/server/fireshare:create_app()"
|
||||
DOMAIN=
|
||||
ENVIRONMENT=production
|
||||
DATA_DIRECTORY=/opt/fireshare-data
|
||||
IMAGE_DIRECTORY=/opt/fireshare-images
|
||||
VIDEO_DIRECTORY=/opt/fireshare-videos
|
||||
PROCESSED_DIRECTORY=/opt/fireshare-processed
|
||||
TEMPLATE_PATH=/opt/fireshare/app/server/fireshare/templates
|
||||
SECRET_KEY=${SECRET}
|
||||
ADMIN_PASSWORD=${ADMIN_PASSWORD}
|
||||
TZ=UTC
|
||||
LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/usr/local/lib:/usr/local/cuda/lib64:\$LD_LIBRARY_PATH
|
||||
PATH=/usr/local/bin:$PATH
|
||||
ENABLE_TRANSCODING=
|
||||
TRANSCODE_GPU=
|
||||
NVIDIA_DRIVER_CAPABILITIES=
|
||||
EOF
|
||||
|
||||
cd /opt/fireshare/app/client
|
||||
$STD npm install
|
||||
$STD npm run build
|
||||
systemctl stop nginx
|
||||
cp /opt/fireshare/app/nginx/prod.conf /etc/nginx/nginx.conf
|
||||
sed -i 's|root /processed/|root /opt/fireshare-processed/|g' /etc/nginx/nginx.conf
|
||||
sed -i 's/^user[[:space:]]\+nginx;/user root;/' /etc/nginx/nginx.conf
|
||||
sed -i 's|root[[:space:]]\+/app/build;|root /opt/fireshare/app/client/build;|' /etc/nginx/nginx.conf
|
||||
systemctl start nginx
|
||||
|
||||
cat <<EOF >~/fireshare.creds
|
||||
Fireshare Admin Credentials
|
||||
========================
|
||||
Username: admin
|
||||
Password: ${ADMIN_PASSWORD}
|
||||
EOF
|
||||
msg_ok "Configured Fireshare"
|
||||
|
||||
msg_info "Creating services"
|
||||
cat <<EOF >/etc/systemd/system/fireshare.service
|
||||
[Unit]
|
||||
Description=Fireshare Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
WorkingDirectory=/opt/fireshare/app/server
|
||||
ExecStart=/opt/fireshare/.venv/bin/gunicorn --bind=127.0.0.1:5000 "fireshare:create_app(init_schedule=True)" --workers 3 --threads 3 --preload
|
||||
Restart=always
|
||||
EnvironmentFile=/opt/fireshare/fireshare.env
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now fireshare
|
||||
msg_ok "Created services"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -25,25 +25,12 @@ PG_VERSION="17" setup_postgresql
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
msg_info "Setting up Database"
|
||||
DB_NAME=ghostfolio
|
||||
DB_USER=ghostfolio
|
||||
DB_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
PG_DB_NAME="ghostfolio" PG_DB_USER="ghostfolio" PG_DB_SCHEMA_PERMS="true" setup_postgresql_db
|
||||
REDIS_PASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
ACCESS_TOKEN_SALT=$(openssl rand -base64 32)
|
||||
JWT_SECRET_KEY=$(openssl rand -base64 32)
|
||||
$STD sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;"
|
||||
$STD sudo -u postgres psql -c "CREATE USER $DB_USER WITH ENCRYPTED PASSWORD '$DB_PASS';"
|
||||
$STD sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;"
|
||||
$STD sudo -u postgres psql -c "ALTER USER $DB_USER CREATEDB;"
|
||||
$STD sudo -u postgres psql -d $DB_NAME -c "GRANT ALL ON SCHEMA public TO $DB_USER;"
|
||||
$STD sudo -u postgres psql -d $DB_NAME -c "GRANT CREATE ON SCHEMA public TO $DB_USER;"
|
||||
$STD sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO $DB_USER;"
|
||||
$STD sudo -u postgres psql -d $DB_NAME -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO $DB_USER;"
|
||||
{
|
||||
echo "Ghostfolio Credentials"
|
||||
echo "Database User: $DB_USER"
|
||||
echo "Database Password: $DB_PASS"
|
||||
echo "Database Name: $DB_NAME"
|
||||
echo "Redis Password: $REDIS_PASS"
|
||||
echo "Access Token Salt: $ACCESS_TOKEN_SALT"
|
||||
echo "JWT Secret Key: $JWT_SECRET_KEY"
|
||||
@@ -69,7 +56,7 @@ read -rp "${TAB3}CoinGecko Pro API key (press Enter to skip): " COINGECKO_PRO_KE
|
||||
|
||||
msg_info "Setting up Environment"
|
||||
cat <<EOF >/opt/ghostfolio/.env
|
||||
DATABASE_URL=postgresql://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME?connect_timeout=300&sslmode=prefer
|
||||
DATABASE_URL=postgresql://$PG_DB_USER:$PG_DB_PASS@localhost:5432/$PG_DB_NAME?connect_timeout=300
|
||||
REDIS_HOST=localhost
|
||||
REDIS_PORT=6379
|
||||
REDIS_PASSWORD=$REDIS_PASS
|
||||
|
||||
35
install/jitsi-meet-install.sh
Normal file
35
install/jitsi-meet-install.sh
Normal file
@@ -0,0 +1,35 @@
|
||||
#!/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://jitsi.org/
|
||||
|
||||
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 nginx
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
source /etc/os-release
|
||||
setup_deb822_repo "jitsi" \
|
||||
"https://download.jitsi.org/jitsi-key.gpg.key" \
|
||||
"https://download.jitsi.org" \
|
||||
"stable/" \
|
||||
""
|
||||
|
||||
msg_info "Installing Jitsi Meet"
|
||||
echo "jitsi-videobridge2 jitsi-videobridge/jvb-hostname string ${LOCAL_IP}" | debconf-set-selections
|
||||
echo "jitsi-meet-web-config jitsi-meet/cert-choice select Generate a new self-signed certificate" | debconf-set-selections
|
||||
DEBIAN_FRONTEND=noninteractive $STD apt install -y jitsi-meet
|
||||
msg_ok "Installed Jitsi Meet"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -27,7 +27,7 @@ msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
setup_uv
|
||||
fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding"
|
||||
fetch_and_deploy_gh_release "linkding" "sissbruecker/linkding" "tarball"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
cd /opt/linkding
|
||||
|
||||
@@ -13,7 +13,7 @@ setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv"
|
||||
fetch_and_deploy_gh_release "nodecast-tv" "technomancer702/nodecast-tv" "tarball"
|
||||
NODE_VERSION="20" setup_nodejs
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
|
||||
@@ -120,7 +120,7 @@ fetch_and_deploy_gh_release "RAHasher" "RetroAchievements/RALibretro" "prebuild"
|
||||
cp /opt/RALibretro/RAHasher /usr/bin/RAHasher
|
||||
chmod +x /usr/bin/RAHasher
|
||||
|
||||
fetch_and_deploy_gh_release "romm" "rommapp/romm"
|
||||
fetch_and_deploy_gh_release "romm" "rommapp/romm" "tarball"
|
||||
|
||||
msg_info "Creating environment file"
|
||||
sed -i 's/^supervised no/supervised systemd/' /etc/redis/redis.conf
|
||||
|
||||
@@ -55,7 +55,7 @@ rm -rf /opt/guacamole-server
|
||||
msg_ok "Built Guacamole Server (guacd)"
|
||||
|
||||
NODE_VERSION="22" setup_nodejs
|
||||
fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix"
|
||||
fetch_and_deploy_gh_release "termix" "Termix-SSH/Termix" "tarball"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
cd /opt/termix
|
||||
|
||||
99
install/transmute-install.sh
Normal file
99
install/transmute-install.sh
Normal file
@@ -0,0 +1,99 @@
|
||||
#!/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://github.com/transmute-app/transmute
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
UV_PYTHON="3.13" setup_uv
|
||||
NODE_VERSION="25" setup_nodejs
|
||||
setup_ffmpeg
|
||||
setup_gs
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
inkscape \
|
||||
tesseract-ocr \
|
||||
libreoffice-impress \
|
||||
libreoffice-common \
|
||||
libmagic1 \
|
||||
xvfb \
|
||||
libsm6 \
|
||||
libxext6 \
|
||||
libpango-1.0-0 \
|
||||
libopengl0 \
|
||||
libpangocairo-1.0-0 \
|
||||
libgdk-pixbuf-2.0-0 \
|
||||
libffi-dev \
|
||||
libcairo2 \
|
||||
librsvg2-bin \
|
||||
unrar-free \
|
||||
python3-numpy \
|
||||
python3-lxml \
|
||||
python3-tinycss2 \
|
||||
python3-cssselect
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "pandoc" "jgm/pandoc" "binary" "latest" "" "pandoc-*-amd64.deb"
|
||||
fetch_and_deploy_gh_release "calibre" "kovidgoyal/calibre" "prebuild" "latest" "/opt/calibre" "calibre-*-x86_64.txz"
|
||||
ln -sf /opt/calibre/ebook-convert /usr/bin/ebook-convert
|
||||
fetch_and_deploy_gh_release "drawio" "jgraph/drawio-desktop" "binary" "latest" "" "drawio-amd64-*.deb"
|
||||
fetch_and_deploy_gh_release "transmute" "transmute-app/transmute" "tarball"
|
||||
|
||||
msg_info "Setting up Python Backend"
|
||||
cd /opt/transmute
|
||||
$STD uv venv --clear /opt/transmute/.venv
|
||||
$STD uv pip install --python /opt/transmute/.venv/bin/python -r requirements.txt
|
||||
ln -sf /opt/transmute/.venv/bin/weasyprint /usr/bin/weasyprint
|
||||
msg_ok "Set up Python Backend"
|
||||
|
||||
msg_info "Configuring Transmute"
|
||||
SECRET_KEY=$(openssl rand -hex 64)
|
||||
cat <<EOF >/opt/transmute/backend/.env
|
||||
AUTH_SECRET_KEY=${SECRET_KEY}
|
||||
HOST=0.0.0.0
|
||||
PORT=3313
|
||||
DATA_DIR=/opt/transmute/data
|
||||
WEB_DIR=/opt/transmute/frontend/dist
|
||||
QT_QPA_PLATFORM=offscreen
|
||||
EOF
|
||||
mkdir -p /opt/transmute/data
|
||||
msg_ok "Configured Transmute"
|
||||
|
||||
msg_info "Building Frontend"
|
||||
cd /opt/transmute/frontend
|
||||
$STD npm ci
|
||||
$STD npm run build
|
||||
msg_ok "Built Frontend"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/transmute.service
|
||||
[Unit]
|
||||
Description=Transmute File Converter
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=/opt/transmute
|
||||
EnvironmentFile=/opt/transmute/backend/.env
|
||||
ExecStart=/usr/bin/xvfb-run -a -s "-screen 0 1024x768x24 -nolisten tcp" /opt/transmute/.venv/bin/python backend/main.py
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now transmute
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
223
misc/build.func
223
misc/build.func
@@ -2702,21 +2702,16 @@ advanced_settings() {
|
||||
# STEP 28: Verbose Mode & Confirmation
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
28)
|
||||
# PHS_VERBOSE forces verbose mode and skips the prompt
|
||||
if [[ "$PHS_MODE" == "verbose" ]]; then
|
||||
local verbose_default_flag="--defaultno"
|
||||
[[ "$_verbose" == "yes" ]] && verbose_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "VERBOSE MODE" \
|
||||
$verbose_default_flag \
|
||||
--yesno "\nEnable Verbose Mode?\n\nShows detailed output during installation." 12 58; then
|
||||
_verbose="yes"
|
||||
else
|
||||
local verbose_default_flag="--defaultno"
|
||||
[[ "$_verbose" == "yes" ]] && verbose_default_flag=""
|
||||
|
||||
if whiptail --backtitle "Proxmox VE Helper Scripts [Step $STEP/$MAX_STEP]" \
|
||||
--title "VERBOSE MODE" \
|
||||
$verbose_default_flag \
|
||||
--yesno "\nEnable Verbose Mode?\n\nShows detailed output during installation." 12 58; then
|
||||
_verbose="yes"
|
||||
else
|
||||
_verbose="no"
|
||||
fi
|
||||
_verbose="no"
|
||||
fi
|
||||
# Build summary
|
||||
local ct_type_desc="Unprivileged"
|
||||
@@ -3449,7 +3444,7 @@ configure_ssh_settings() {
|
||||
# msg_menu()
|
||||
#
|
||||
# - Displays a numbered menu for update_script() functions
|
||||
# - In silent mode (PHS_MODE=silent): auto-selects the default option
|
||||
# - 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
|
||||
@@ -3473,7 +3468,7 @@ msg_menu() {
|
||||
local count=${#tags[@]}
|
||||
|
||||
# Silent mode: return default immediately
|
||||
if [[ "$PHS_MODE" == "silent" ]]; then
|
||||
if [[ -n "${PHS_SILENT+x}" ]] && [[ "${PHS_SILENT}" == "1" ]]; then
|
||||
echo "$default_tag"
|
||||
return 0
|
||||
fi
|
||||
@@ -3509,34 +3504,6 @@ msg_menu() {
|
||||
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()
|
||||
#
|
||||
@@ -3547,16 +3514,17 @@ resolve_phs_mode() {
|
||||
# ------------------------------------------------------------------------------
|
||||
start() {
|
||||
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
|
||||
install_script || return 0
|
||||
return 0
|
||||
elif [[ "$PHS_MODE" == "silent" ]]; then
|
||||
elif [ ! -z ${PHS_SILENT+x} ] && [[ "${PHS_SILENT}" == "1" ]]; then
|
||||
VERBOSE="no"
|
||||
set_std_mode
|
||||
elif [[ "$PHS_MODE" == "verbose" ]]; then
|
||||
VERBOSE="yes"
|
||||
set_std_mode
|
||||
ensure_profile_loaded
|
||||
get_lxc_ip
|
||||
update_script
|
||||
update_motd_ip
|
||||
cleanup_lxc
|
||||
else
|
||||
CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} LXC Update/Setting" --menu \
|
||||
"Support/Update functions for ${APP} LXC. Choose an option:" \
|
||||
@@ -3580,12 +3548,12 @@ start() {
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
ensure_profile_loaded
|
||||
get_lxc_ip
|
||||
update_script
|
||||
update_motd_ip
|
||||
cleanup_lxc
|
||||
fi
|
||||
ensure_profile_loaded
|
||||
get_lxc_ip
|
||||
update_script
|
||||
update_motd_ip
|
||||
cleanup_lxc
|
||||
}
|
||||
|
||||
# ==============================================================================
|
||||
@@ -5408,13 +5376,59 @@ create_lxc_container() {
|
||||
|
||||
# Offer upgrade for pve-container/lxc-pve if candidate > installed; optional auto-retry pct create
|
||||
# Returns:
|
||||
# 0 = no upgrade needed / container created after upgrade or fallback
|
||||
# 0 = no upgrade needed / container created after upgrade or explicit fallback
|
||||
# 1 = upgraded (and if do_retry=yes and retry succeeded, creation done)
|
||||
# 2 = user declined
|
||||
# 2 = user chose ignore
|
||||
# 3 = upgrade attempted but failed OR retry failed
|
||||
# 4 = user cancelled
|
||||
offer_lxc_stack_upgrade_and_maybe_retry() {
|
||||
local do_retry="${1:-no}" # yes|no
|
||||
local _pvec_i _pvec_c _lxcp_i _lxcp_c need=0
|
||||
local _ans
|
||||
|
||||
has_previous_os_version_template() {
|
||||
local os_type="${PCT_OSTYPE:-}"
|
||||
local current_ver="${PCT_OSVERSION:-}"
|
||||
local tpl_pattern="${TEMPLATE_PATTERN:-${TEMPLATE:-}}"
|
||||
local -a all_versions=()
|
||||
|
||||
[[ -n "$os_type" && -n "$current_ver" ]] || return 1
|
||||
|
||||
mapfile -t _local_vers < <(
|
||||
pveam list "$TEMPLATE_STORAGE" 2>/dev/null |
|
||||
awk '{print $1}' |
|
||||
sed 's|.*/||' |
|
||||
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
|
||||
)
|
||||
all_versions+=("${_local_vers[@]}")
|
||||
|
||||
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[@]}")
|
||||
|
||||
printf '%s\n' "${all_versions[@]}" | sort -u -V | awk -v cur="$current_ver" '
|
||||
{
|
||||
split($0, a, ".")
|
||||
split(cur, b, ".")
|
||||
if (a[1]+0 < b[1]+0) found=1
|
||||
}
|
||||
END { exit found ? 0 : 1 }
|
||||
'
|
||||
}
|
||||
|
||||
_pvec_i="$(pkg_ver pve-container)"
|
||||
_lxcp_i="$(pkg_ver lxc-pve)"
|
||||
@@ -5435,19 +5449,25 @@ create_lxc_container() {
|
||||
msg_warn "An update for the Proxmox LXC stack is available"
|
||||
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 " note : option 1 runs host apt update + apt upgrade"
|
||||
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
|
||||
if [[ "$do_retry" == "yes" ]] && has_previous_os_version_template; then
|
||||
_has_fallback_option=true
|
||||
echo " [1] Upgrade LXC stack now (recommended)"
|
||||
echo " [1] Run host upgrade now (recommended). WARNING: this runs apt upgrade and updates all Packeages on your host!"
|
||||
echo " [2] Use an older ${PCT_OSTYPE} template instead (may not work with all scripts)"
|
||||
echo " [3] Ignore"
|
||||
echo " [4] Cancel"
|
||||
echo
|
||||
read -rp "Select option [1/2/3/4]: " _ans </dev/tty
|
||||
else
|
||||
echo " [1] Run host upgrade now (recommended). WARNING: this runs apt upgrade and updates all Packeages on your host!"
|
||||
echo " [2] Ignore"
|
||||
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
|
||||
fi
|
||||
|
||||
if [[ "$_has_fallback_option" == true ]]; then
|
||||
@@ -5456,35 +5476,48 @@ create_lxc_container() {
|
||||
_ans="y"
|
||||
;;
|
||||
2)
|
||||
if [[ "$do_retry" == "yes" ]]; then
|
||||
if fallback_to_previous_os_version; then
|
||||
return 0
|
||||
else
|
||||
return 3
|
||||
fi
|
||||
if fallback_to_previous_os_version; then
|
||||
return 0
|
||||
else
|
||||
msg_custom "ℹ️" "${YW}" "OS version fallback is only available during container creation."
|
||||
return 2
|
||||
return 3
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
3)
|
||||
return 2
|
||||
;;
|
||||
4)
|
||||
return 4
|
||||
;;
|
||||
*)
|
||||
return 4
|
||||
;;
|
||||
esac
|
||||
else
|
||||
case "$_ans" in
|
||||
1)
|
||||
_ans="y"
|
||||
;;
|
||||
2)
|
||||
return 2
|
||||
;;
|
||||
*)
|
||||
return 4
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
case "${_ans,,}" in
|
||||
y | yes)
|
||||
msg_info "Upgrading Proxmox LXC stack (pve-container, lxc-pve)"
|
||||
msg_info "Running host upgrade for LXC stack compatibility"
|
||||
apt_update_safe
|
||||
if $STD apt-get install -y --only-upgrade pve-container lxc-pve; then
|
||||
if $STD apt-get upgrade -y; then
|
||||
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} apt update && apt upgrade -y"
|
||||
echo -e "${TAB} reboot"
|
||||
return 3
|
||||
fi
|
||||
@@ -6093,16 +6126,20 @@ create_lxc_container() {
|
||||
rc=$?
|
||||
case $rc in
|
||||
0) : ;; # success - container created, continue
|
||||
2 | 3)
|
||||
# Upgrade declined or failed — try older OS version as last resort
|
||||
msg_warn "Attempting older ${PCT_OSTYPE:-} version as last resort"
|
||||
if fallback_to_previous_os_version; then
|
||||
: # success
|
||||
else
|
||||
msg_error "All recovery options exhausted. Please inspect: $LOGFILE"
|
||||
_flush_pct_log
|
||||
exit 231
|
||||
fi
|
||||
2)
|
||||
msg_error "LXC stack upgrade ignored. Please inspect: $LOGFILE"
|
||||
_flush_pct_log
|
||||
exit 231
|
||||
;;
|
||||
3)
|
||||
msg_error "LXC stack upgrade failed. Please inspect: $LOGFILE"
|
||||
_flush_pct_log
|
||||
exit 231
|
||||
;;
|
||||
4)
|
||||
msg_error "Cancelled by user."
|
||||
_flush_pct_log
|
||||
exit 231
|
||||
;;
|
||||
esac
|
||||
else
|
||||
@@ -6126,16 +6163,20 @@ create_lxc_container() {
|
||||
rc=$?
|
||||
case $rc in
|
||||
0) : ;; # success - container created, continue
|
||||
2 | 3)
|
||||
# Upgrade declined or failed — try older OS version as last resort
|
||||
msg_warn "Attempting older ${PCT_OSTYPE:-} version as last resort"
|
||||
if fallback_to_previous_os_version; then
|
||||
: # success
|
||||
else
|
||||
msg_error "All recovery options exhausted. Please inspect: $LOGFILE"
|
||||
_flush_pct_log
|
||||
exit 231
|
||||
fi
|
||||
2)
|
||||
msg_error "LXC stack upgrade ignored. Please inspect: $LOGFILE"
|
||||
_flush_pct_log
|
||||
exit 231
|
||||
;;
|
||||
3)
|
||||
msg_error "LXC stack upgrade failed. Please inspect: $LOGFILE"
|
||||
_flush_pct_log
|
||||
exit 231
|
||||
;;
|
||||
4)
|
||||
msg_error "Cancelled by user."
|
||||
_flush_pct_log
|
||||
exit 231
|
||||
;;
|
||||
esac
|
||||
else
|
||||
|
||||
@@ -940,7 +940,7 @@ is_verbose_mode() {
|
||||
#
|
||||
# - Detects if script is running in unattended/non-interactive mode
|
||||
# - Checks MODE variable first (primary method)
|
||||
# - Falls back to legacy flags (PHS_MODE, var_unattended)
|
||||
# - Falls back to legacy flags (PHS_SILENT, var_unattended)
|
||||
# - Returns 0 (true) if unattended, 1 (false) otherwise
|
||||
# - Used by prompt functions to auto-apply defaults
|
||||
#
|
||||
@@ -984,7 +984,7 @@ is_unattended() {
|
||||
esac
|
||||
|
||||
# Legacy fallbacks for compatibility
|
||||
[[ "${PHS_MODE:-}" == "silent" ]] && return 0
|
||||
[[ "${PHS_SILENT:-0}" == "1" ]] && return 0
|
||||
[[ "${var_unattended:-}" =~ ^(yes|true|1)$ ]] && return 0
|
||||
[[ "${UNATTENDED:-}" =~ ^(yes|true|1)$ ]] && return 0
|
||||
|
||||
|
||||
@@ -313,6 +313,51 @@ error_handler() {
|
||||
echo -e "${TAB}-----------------------------------\n"
|
||||
fi
|
||||
|
||||
# Detect probable Node.js heap OOM and print actionable guidance.
|
||||
# This avoids generic SIGABRT/SIGKILL confusion for frontend build failures.
|
||||
local node_oom_detected="false"
|
||||
local node_build_context="false"
|
||||
if [[ "$command" =~ (npm|pnpm|yarn|node|vite|turbo) ]]; then
|
||||
node_build_context="true"
|
||||
fi
|
||||
if [[ "$exit_code" == "243" ]]; then
|
||||
node_oom_detected="true"
|
||||
elif [[ -n "$active_log" && -s "$active_log" ]]; then
|
||||
if tail -n 200 "$active_log" 2>/dev/null | grep -Eqi 'Reached heap limit|JavaScript heap out of memory|Allocation failed - JavaScript heap out of memory|FATAL ERROR: Reached heap limit'; then
|
||||
node_oom_detected="true"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$node_oom_detected" == "true" ]] || { [[ "$node_build_context" == "true" ]] && [[ "$exit_code" =~ ^(134|137)$ ]]; }; then
|
||||
local heap_hint_mb=""
|
||||
|
||||
# If explicitly configured, prefer the current value for troubleshooting output.
|
||||
if [[ -n "${NODE_OPTIONS:-}" ]] && [[ "${NODE_OPTIONS}" =~ max-old-space-size=([0-9]+) ]]; then
|
||||
heap_hint_mb="${BASH_REMATCH[1]}"
|
||||
elif [[ -n "${var_ram:-}" ]] && [[ "${var_ram}" =~ ^[0-9]+$ ]]; then
|
||||
heap_hint_mb=$((var_ram * 75 / 100))
|
||||
else
|
||||
local mem_kb=""
|
||||
mem_kb=$(awk '/^MemTotal:/ {print $2; exit}' /proc/meminfo 2>/dev/null || echo "")
|
||||
if [[ "$mem_kb" =~ ^[0-9]+$ ]]; then
|
||||
local mem_mb=$((mem_kb / 1024))
|
||||
heap_hint_mb=$((mem_mb * 75 / 100))
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z "$heap_hint_mb" ]] || ((heap_hint_mb < 1024)); then
|
||||
heap_hint_mb=1024
|
||||
elif ((heap_hint_mb > 12288)); then
|
||||
heap_hint_mb=12288
|
||||
fi
|
||||
|
||||
if declare -f msg_warn >/dev/null 2>&1; then
|
||||
msg_warn "Possible Node.js heap OOM. Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" and rerun the build."
|
||||
else
|
||||
echo -e "${YW}Possible Node.js heap OOM. Try: export NODE_OPTIONS=\"--max-old-space-size=${heap_hint_mb}\" and rerun the build.${CL}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Detect context: Container (INSTALL_LOG set + inside container /root) vs Host
|
||||
if [[ -n "${INSTALL_LOG:-}" && -f "${INSTALL_LOG:-}" && -d /root ]]; then
|
||||
# CONTAINER CONTEXT: Copy log and create flag file for host
|
||||
|
||||
@@ -4011,9 +4011,14 @@ function setup_ffmpeg() {
|
||||
DEPS+=(
|
||||
libx264-dev libx265-dev libvpx-dev libmp3lame-dev
|
||||
libfreetype6-dev libass-dev libopus-dev libvorbis-dev
|
||||
libdav1d-dev libsvtav1-dev zlib1g-dev libnuma-dev
|
||||
libdav1d-dev zlib1g-dev libnuma-dev
|
||||
libva-dev libdrm-dev
|
||||
)
|
||||
if apt-cache show libsvtav1enc-dev &>/dev/null; then
|
||||
DEPS+=(libsvtav1enc-dev)
|
||||
elif apt-cache show libsvtav1-dev &>/dev/null; then
|
||||
DEPS+=(libsvtav1-dev)
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
msg_error "Invalid FFMPEG_TYPE: $TYPE"
|
||||
@@ -6336,12 +6341,15 @@ function setup_nodejs() {
|
||||
}
|
||||
fi
|
||||
|
||||
# Scenario 1: Already installed at target version - just update packages/modules
|
||||
# Scenario 1: Already installed at target version - upgrade to latest minor/patch + update packages/modules
|
||||
if [[ -n "$CURRENT_NODE_VERSION" && "$CURRENT_NODE_VERSION" == "$NODE_VERSION" ]]; then
|
||||
msg_info "Update Node.js $NODE_VERSION"
|
||||
|
||||
ensure_apt_working || return 100
|
||||
|
||||
# Upgrade to the latest minor/patch release from NodeSource
|
||||
$STD apt-get install -y --only-upgrade nodejs 2>/dev/null || true
|
||||
|
||||
# Pin npm to 11.11.0 to work around Node.js 22.22.2 regression (nodejs/node#62425)
|
||||
$STD npm install -g npm@11.11.0 2>/dev/null || true
|
||||
|
||||
@@ -6420,7 +6428,37 @@ function setup_nodejs() {
|
||||
msg_ok "Setup Node.js $NODE_VERSION"
|
||||
fi
|
||||
|
||||
export NODE_OPTIONS="--max-old-space-size=4096"
|
||||
# Set a safe default heap limit for Node.js builds if not explicitly provided.
|
||||
# Priority:
|
||||
# 1) NODE_OPTIONS (caller/user override)
|
||||
# 2) NODE_MAX_OLD_SPACE_SIZE (explicit MB override)
|
||||
# 3) var_ram (LXC memory setting, MB)
|
||||
# 4) /proc/meminfo (runtime memory detection)
|
||||
# Auto value is clamped to 1024..12288 MB.
|
||||
if [[ -z "${NODE_OPTIONS:-}" ]]; then
|
||||
local node_heap_mb=""
|
||||
|
||||
if [[ -n "${NODE_MAX_OLD_SPACE_SIZE:-}" ]] && [[ "${NODE_MAX_OLD_SPACE_SIZE}" =~ ^[0-9]+$ ]]; then
|
||||
node_heap_mb="${NODE_MAX_OLD_SPACE_SIZE}"
|
||||
elif [[ -n "${var_ram:-}" ]] && [[ "${var_ram}" =~ ^[0-9]+$ ]]; then
|
||||
node_heap_mb=$((var_ram * 75 / 100))
|
||||
else
|
||||
local total_mem_kb=""
|
||||
total_mem_kb=$(awk '/^MemTotal:/ {print $2; exit}' /proc/meminfo 2>/dev/null || echo "")
|
||||
if [[ "$total_mem_kb" =~ ^[0-9]+$ ]]; then
|
||||
local total_mem_mb=$((total_mem_kb / 1024))
|
||||
node_heap_mb=$((total_mem_mb * 75 / 100))
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -z "$node_heap_mb" ]] || ((node_heap_mb < 1024)); then
|
||||
node_heap_mb=1024
|
||||
elif ((node_heap_mb > 12288)); then
|
||||
node_heap_mb=12288
|
||||
fi
|
||||
|
||||
export NODE_OPTIONS="--max-old-space-size=${node_heap_mb}"
|
||||
fi
|
||||
|
||||
# Ensure valid working directory for npm (avoids uv_cwd error)
|
||||
if [[ ! -d /opt ]]; then
|
||||
|
||||
@@ -65,6 +65,14 @@ component_exists_in_sources() {
|
||||
grep -h -E "^[^#]*Components:[^#]*\b${component}\b" /etc/apt/sources.list.d/*.sources 2>/dev/null | grep -q .
|
||||
}
|
||||
|
||||
require_whiptail() {
|
||||
if ! command -v whiptail >/dev/null 2>&1; then
|
||||
msg_error "Missing dependency: whiptail"
|
||||
echo -e "Install it first (e.g. apt update && apt install -y whiptail), then re-run this script."
|
||||
exit 127
|
||||
fi
|
||||
}
|
||||
|
||||
# ---- main ----
|
||||
main() {
|
||||
header_info
|
||||
@@ -90,8 +98,14 @@ main() {
|
||||
CODENAME="$(get_pbs_codename)"
|
||||
|
||||
case "$CODENAME" in
|
||||
bookworm) start_routines_3 ;;
|
||||
trixie) start_routines_4 ;;
|
||||
bookworm)
|
||||
require_whiptail
|
||||
start_routines_3
|
||||
;;
|
||||
trixie)
|
||||
require_whiptail
|
||||
start_routines_4
|
||||
;;
|
||||
*)
|
||||
msg_error "Unsupported Debian codename: $CODENAME"
|
||||
echo -e "Supported: bookworm (PBS 3.x) and trixie (PBS 4.x)"
|
||||
|
||||
Reference in New Issue
Block a user