Compare commits

..

1 Commits

Author SHA1 Message Date
MickLesk
089555dd9e Setup Node v22 and build SoulSync WebUI
Install and use Node.js v22 during both install and update flows, and build the WebUI. Adds NODE_VERSION="22" setup_nodejs to install/soulsync-install.sh and ct/soulsync.sh, and runs npm ci and npm run build in /opt/soulsync/webui during install/update so the front-end assets are compiled. Existing Python venv and service restart logic remain unchanged.
2026-05-22 08:09:41 +02:00
15 changed files with 25 additions and 231 deletions

View File

@@ -466,32 +466,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
## 2026-05-22 ## 2026-05-22
### 🆕 New Scripts
- bitfocus-companion ([#14603](https://github.com/community-scripts/ProxmoxVE/pull/14603))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Docmost: Fix duplicate STORAGE_DRIVER [@MickLesk](https://github.com/MickLesk) ([#14645](https://github.com/community-scripts/ProxmoxVE/pull/14645))
- Profilarr: pin Deno version to v2.7.5 [@MickLesk](https://github.com/MickLesk) ([#14632](https://github.com/community-scripts/ProxmoxVE/pull/14632))
- #### 🔧 Refactor
- SoulSync: setup Node v22 and build WebUI [@MickLesk](https://github.com/MickLesk) ([#14639](https://github.com/community-scripts/ProxmoxVE/pull/14639))
- Refactor: Dispatcharr [@MickLesk](https://github.com/MickLesk) ([#14313](https://github.com/community-scripts/ProxmoxVE/pull/14313))
### 💾 Core ### 💾 Core
- #### 🐞 Bug Fixes - #### 🐞 Bug Fixes
- fix: make LXC banner OS detection dynamic via /etc/os-release [@atahan99](https://github.com/atahan99) ([#14269](https://github.com/community-scripts/ProxmoxVE/pull/14269)) - fix: make LXC banner OS detection dynamic via /etc/os-release [@atahan99](https://github.com/atahan99) ([#14269](https://github.com/community-scripts/ProxmoxVE/pull/14269))
- #### 🔧 Refactor
- core: suppress MOTD for non-interactive shells [@MickLesk](https://github.com/MickLesk) ([#14638](https://github.com/community-scripts/ProxmoxVE/pull/14638))
## 2026-05-21 ## 2026-05-21
### 🚀 Updated Scripts ### 🚀 Updated Scripts

View File

@@ -1,70 +0,0 @@
#!/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: glabutis
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/bitfocus/companion
APP="Bitfocus-Companion"
var_tags="${var_tags:-automation;media}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-512}"
var_disk="${var_disk:-8}"
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 [[ ! -f /opt/bitfocus-companion/companion_headless.sh ]]; then
msg_error "No ${APP} Installation Found!"
exit 1
fi
RELEASE_JSON=$(curl -fsSL "https://api.bitfocus.io/v1/product/companion/packages?limit=20")
PACKAGE_JSON=$(echo "$RELEASE_JSON" | jq -c '(if type == "array" then . else .packages end) | [.[] | select(.target=="linux-tgz" and (.uri | contains("linux-x64")))] | first')
RELEASE=$(echo "$PACKAGE_JSON" | jq -r '.version // empty')
ASSET_URL=$(echo "$PACKAGE_JSON" | jq -r '.uri // empty')
if [[ -z "$RELEASE" || -z "$ASSET_URL" ]]; then
msg_error "Could not resolve a matching Linux x64 Companion package from the Bitfocus API."
exit 1
fi
if [[ "${RELEASE}" == "$(cat ~/.bitfocus-companion 2>/dev/null)" ]]; then
msg_ok "No update required. ${APP} is already at v${RELEASE}"
exit
fi
msg_info "Stopping ${APP}"
systemctl stop bitfocus-companion
msg_ok "Stopped ${APP}"
msg_info "Updating ${APP} to v${RELEASE}"
CLEAN_INSTALL=1 fetch_and_deploy_from_url "$ASSET_URL" "/opt/bitfocus-companion"
echo "${RELEASE}" >~/.bitfocus-companion
msg_ok "Updated ${APP} to v${RELEASE}"
msg_info "Starting ${APP}"
systemctl start bitfocus-companion
msg_ok "Started ${APP}"
msg_ok "Update Successful"
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}:8000${CL}"

View File

@@ -54,7 +54,7 @@ function update_script() {
cp /opt/dispatcharr/.env /tmp/dispatcharr.env.backup cp /opt/dispatcharr/.env /tmp/dispatcharr.env.backup
fi fi
if [[ -f /opt/dispatcharr/start-gunicorn.sh ]]; then if [[ -f /opt/dispatcharr/start-gunicorn.sh ]]; then
rm -f /opt/dispatcharr/start-gunicorn.sh cp /opt/dispatcharr/start-gunicorn.sh /tmp/start-gunicorn.sh.backup
fi fi
if [[ -f /opt/dispatcharr/start-celery.sh ]]; then if [[ -f /opt/dispatcharr/start-celery.sh ]]; then
cp /opt/dispatcharr/start-celery.sh /tmp/start-celery.sh.backup cp /opt/dispatcharr/start-celery.sh /tmp/start-celery.sh.backup
@@ -83,6 +83,9 @@ function update_script() {
if [[ -f /tmp/dispatcharr.env.backup ]]; then if [[ -f /tmp/dispatcharr.env.backup ]]; then
mv /tmp/dispatcharr.env.backup /opt/dispatcharr/.env mv /tmp/dispatcharr.env.backup /opt/dispatcharr/.env
fi fi
if [[ -f /tmp/start-gunicorn.sh.backup ]]; then
mv /tmp/start-gunicorn.sh.backup /opt/dispatcharr/start-gunicorn.sh
fi
if [[ -f /tmp/start-celery.sh.backup ]]; then if [[ -f /tmp/start-celery.sh.backup ]]; then
mv /tmp/start-celery.sh.backup /opt/dispatcharr/start-celery.sh mv /tmp/start-celery.sh.backup /opt/dispatcharr/start-celery.sh
fi fi
@@ -102,35 +105,7 @@ function update_script() {
rm -rf .venv rm -rf .venv
$STD uv venv --clear $STD uv venv --clear
$STD uv sync $STD uv sync
$STD uv pip install uwsgi gevent celery redis daphne $STD uv pip install gunicorn gevent celery redis daphne
cat <<'EOF' >/opt/dispatcharr/start-uwsgi.sh
#!/usr/bin/env bash
cd /opt/dispatcharr
set -a
source .env
set +a
exec .venv/bin/uwsgi \
--chdir=/opt/dispatcharr \
--module=dispatcharr.wsgi:application \
--master \
--workers=4 \
--gevent=400 \
--http=0.0.0.0:5656 \
--http-keepalive=1 \
--http-timeout=600 \
--socket-timeout=600 \
--buffer-size=65536 \
--post-buffering=4096 \
--lazy-apps \
--thunder-lock \
--die-on-term \
--vacuum
EOF
chmod +x /opt/dispatcharr/start-uwsgi.sh
if grep -q 'start-gunicorn.sh' /etc/systemd/system/dispatcharr.service; then
sed -i 's|start-gunicorn.sh|start-uwsgi.sh|g' /etc/systemd/system/dispatcharr.service
systemctl daemon-reload
fi
msg_ok "Updated Dispatcharr Backend" msg_ok "Updated Dispatcharr Backend"
msg_info "Building Frontend" msg_info "Building Frontend"

View File

@@ -1,6 +0,0 @@
____ _ __ ____ ______ _
/ __ )(_) /_/ __/___ _______ _______ / ____/___ ____ ___ ____ ____ _____ (_)___ ____
/ __ / / __/ /_/ __ \/ ___/ / / / ___/_____/ / / __ \/ __ `__ \/ __ \/ __ `/ __ \/ / __ \/ __ \
/ /_/ / / /_/ __/ /_/ / /__/ /_/ (__ )_____/ /___/ /_/ / / / / / / /_/ / /_/ / / / / / /_/ / / / /
/_____/_/\__/_/ \____/\___/\__,_/____/ \____/\____/_/ /_/ /_/ .___/\__,_/_/ /_/_/\____/_/ /_/
/_/

View File

@@ -36,9 +36,9 @@ function update_script() {
exit exit
fi fi
if check_for_gh_release "deno" "denoland/deno" "v2.7.5" "Deno is pinned to 2.7.5 because the known WouldBlock: Resource temporarily unavailable (os error 11) Issue"; then if check_for_gh_release "deno" "denoland/deno"; then
ARCH=$(uname -m) ARCH=$(uname -m)
fetch_and_deploy_gh_release "deno" "denoland/deno" "v2.7.5" "latest" "/usr/local/bin" "deno-${ARCH}-unknown-linux-gnu.zip" fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-${ARCH}-unknown-linux-gnu.zip"
fi fi
if check_for_gh_release "profilarr" "Dictionarry-Hub/profilarr"; then if check_for_gh_release "profilarr" "Dictionarry-Hub/profilarr"; then

View File

@@ -33,7 +33,6 @@ function update_script() {
systemctl stop thelounge systemctl stop thelounge
msg_ok "Stopped Service" msg_ok "Stopped Service"
NODE_VERSION="22" setup_nodejs
fetch_and_deploy_gh_release "thelounge" "thelounge/thelounge-deb" "binary" fetch_and_deploy_gh_release "thelounge" "thelounge/thelounge-deb" "binary"
msg_info "Starting Service" msg_info "Starting Service"

View File

@@ -1,68 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: glabutis
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/bitfocus/companion
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 libusb-1.0-0
msg_ok "Installed Dependencies"
msg_info "Fetching Latest Bitfocus Companion Release"
RELEASE_JSON=$(curl -fsSL "https://api.bitfocus.io/v1/product/companion/packages?limit=20")
PACKAGE_JSON=$(echo "$RELEASE_JSON" | jq -c '(if type == "array" then . else .packages end) | [.[] | select(.target=="linux-tgz" and (.uri | contains("linux-x64")))] | first')
RELEASE=$(echo "$PACKAGE_JSON" | jq -r '.version // empty')
ASSET_URL=$(echo "$PACKAGE_JSON" | jq -r '.uri // empty')
if [[ -z "$RELEASE" || -z "$ASSET_URL" ]]; then
msg_error "Could not resolve a matching Linux x64 Companion package from the Bitfocus API."
exit 1
fi
msg_ok "Found Companion ${RELEASE}"
fetch_and_deploy_from_url "$ASSET_URL" "/opt/bitfocus-companion"
msg_info "Installing udev Rules"
if [[ -f /opt/bitfocus-companion/50-companion-headless.rules ]]; then
cp /opt/bitfocus-companion/50-companion-headless.rules /etc/udev/rules.d/
udevadm control --reload-rules
udevadm trigger
fi
msg_ok "Installed udev Rules"
mkdir -p /opt/bitfocus-companion-config
msg_info "Creating Service"
cat <<EOF >/etc/systemd/system/bitfocus-companion.service
[Unit]
Description=Bitfocus Companion
After=network.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/bitfocus-companion/companion_headless.sh --config-dir /opt/bitfocus-companion-config
WorkingDirectory=/opt/bitfocus-companion
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now bitfocus-companion
msg_ok "Created Service"
echo "${RELEASE}" >~/.bitfocus-companion
motd_ssh
customize
cleanup_lxc

View File

@@ -38,7 +38,7 @@ msg_info "Installing Python Dependencies with uv"
cd /opt/dispatcharr cd /opt/dispatcharr
$STD uv venv --clear $STD uv venv --clear
$STD uv sync $STD uv sync
$STD uv pip install uwsgi gevent celery redis daphne $STD uv pip install gunicorn gevent celery redis daphne
msg_ok "Installed Python Dependencies" msg_ok "Installed Python Dependencies"
msg_info "Configuring Dispatcharr" msg_info "Configuring Dispatcharr"
@@ -118,7 +118,7 @@ server {
proxy_set_header X-Forwarded-Proto \$scheme; proxy_set_header X-Forwarded-Proto \$scheme;
} }
# All other requests proxy to uWSGI # All other requests proxy to Gunicorn
location / { location / {
include proxy_params; include proxy_params;
proxy_pass http://127.0.0.1:5656; proxy_pass http://127.0.0.1:5656;
@@ -131,30 +131,20 @@ systemctl restart nginx
msg_ok "Configured Nginx" msg_ok "Configured Nginx"
msg_info "Creating Services" msg_info "Creating Services"
cat <<EOF >/opt/dispatcharr/start-uwsgi.sh cat <<EOF >/opt/dispatcharr/start-gunicorn.sh
#!/usr/bin/env bash #!/usr/bin/env bash
cd /opt/dispatcharr cd /opt/dispatcharr
set -a set -a
source .env source .env
set +a set +a
exec .venv/bin/uwsgi \\ exec uv run gunicorn \\
--chdir=/opt/dispatcharr \\
--module=dispatcharr.wsgi:application \\
--master \\
--workers=4 \\ --workers=4 \\
--gevent=400 \\ --worker-class=gevent \\
--http=0.0.0.0:5656 \\ --timeout=300 \\
--http-keepalive=1 \\ --bind 0.0.0.0:5656 \\
--http-timeout=600 \\ dispatcharr.wsgi:application
--socket-timeout=600 \\
--buffer-size=65536 \\
--post-buffering=4096 \\
--lazy-apps \\
--thunder-lock \\
--die-on-term \\
--vacuum
EOF EOF
chmod +x /opt/dispatcharr/start-uwsgi.sh chmod +x /opt/dispatcharr/start-gunicorn.sh
cat <<EOF >/opt/dispatcharr/start-celery.sh cat <<EOF >/opt/dispatcharr/start-celery.sh
#!/usr/bin/env bash #!/usr/bin/env bash
@@ -194,7 +184,7 @@ After=network.target postgresql.service redis-server.service
[Service] [Service]
Type=simple Type=simple
WorkingDirectory=/opt/dispatcharr WorkingDirectory=/opt/dispatcharr
ExecStart=/opt/dispatcharr/start-uwsgi.sh ExecStart=/opt/dispatcharr/start-gunicorn.sh
Restart=on-failure Restart=on-failure
RestartSec=10 RestartSec=10
User=root User=root

View File

@@ -31,8 +31,8 @@ cd /opt/docmost
# included in GitHub tarballs. The community NoopAuditService exists but # included in GitHub tarballs. The community NoopAuditService exists but
# is only exported by CoreModule child modules such as UserModule cannot # is only exported by CoreModule child modules such as UserModule cannot
# resolve it. Making CoreModule @Global() exposes the token app-wide. # resolve it. Making CoreModule @Global() exposes the token app-wide.
if [[ ! -f /opt/docmost/apps/server/src/ee/ee.module.ts ]] && if [[ ! -f /opt/docmost/apps/server/src/ee/ee.module.ts ]] \
! grep -q '@Global()' /opt/docmost/apps/server/src/core/core.module.ts 2>/dev/null; then && ! grep -q '@Global()' /opt/docmost/apps/server/src/core/core.module.ts 2>/dev/null; then
sed -i '/^ Module,$/a\ Global,' /opt/docmost/apps/server/src/core/core.module.ts sed -i '/^ Module,$/a\ Global,' /opt/docmost/apps/server/src/core/core.module.ts
sed -i '/^@Module({$/i @Global()' /opt/docmost/apps/server/src/core/core.module.ts sed -i '/^@Module({$/i @Global()' /opt/docmost/apps/server/src/core/core.module.ts
fi fi
@@ -45,7 +45,6 @@ sed -i -e "s|APP_SECRET=.*|APP_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z
-e "s|DRAWIO_URL=.*|DRAWIO_URL=https://embed.diagrams.net|" \ -e "s|DRAWIO_URL=.*|DRAWIO_URL=https://embed.diagrams.net|" \
-e "s|DISABLE_TELEMETRY=.*|DISABLE_TELEMETRY=true|" \ -e "s|DISABLE_TELEMETRY=.*|DISABLE_TELEMETRY=true|" \
-e "s|APP_URL=.*|APP_URL=http://$LOCAL_IP:3000|" \ -e "s|APP_URL=.*|APP_URL=http://$LOCAL_IP:3000|" \
-e "s|^STORAGE_DRIVER=azure|#STORAGE_DRIVER=azure|" \
/opt/docmost/.env /opt/docmost/.env
export NODE_OPTIONS="--max-old-space-size=2048" export NODE_OPTIONS="--max-old-space-size=2048"
$STD pnpm install $STD pnpm install

View File

@@ -20,7 +20,7 @@ $STD apt install -y \
msg_ok "Installed Dependencies" msg_ok "Installed Dependencies"
ARCH=$(uname -m) ARCH=$(uname -m)
fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "v2.7.5" "/usr/local/bin" "deno-${ARCH}-unknown-linux-gnu.zip" fetch_and_deploy_gh_release "deno" "denoland/deno" "prebuild" "latest" "/usr/local/bin" "deno-${ARCH}-unknown-linux-gnu.zip"
fetch_and_deploy_gh_release "profilarr" "Dictionarry-Hub/profilarr" "tarball" fetch_and_deploy_gh_release "profilarr" "Dictionarry-Hub/profilarr" "tarball"
PROFILARR_VERSION=$(cat ~/.profilarr) PROFILARR_VERSION=$(cat ~/.profilarr)

View File

@@ -13,7 +13,6 @@ setting_up_container
network_check network_check
update_os update_os
NODE_VERSION="22" setup_nodejs
fetch_and_deploy_gh_release "thelounge" "thelounge/thelounge-deb" "binary" fetch_and_deploy_gh_release "thelounge" "thelounge/thelounge-deb" "binary"
systemctl enable -q --now thelounge systemctl enable -q --now thelounge

View File

@@ -183,8 +183,7 @@ motd_ssh() {
PROFILE_FILE="/etc/profile.d/00_lxc-details.sh" PROFILE_FILE="/etc/profile.d/00_lxc-details.sh"
echo "[ -t 1 ] || return 0" >"$PROFILE_FILE" echo "echo -e \"\"" >"$PROFILE_FILE"
echo "echo -e \"\"" >>"$PROFILE_FILE"
echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >>"$PROFILE_FILE" echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >>"$PROFILE_FILE"
echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| GitHub: ${GN}https://github.com/community-scripts/ProxmoxVE${CL}\"" >>"$PROFILE_FILE" echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| GitHub: ${GN}https://github.com/community-scripts/ProxmoxVE${CL}\"" >>"$PROFILE_FILE"
echo "echo \"\"" >>"$PROFILE_FILE" echo "echo \"\"" >>"$PROFILE_FILE"

View File

@@ -3643,7 +3643,7 @@ start() {
run_addon_updates run_addon_updates
update_motd_ip update_motd_ip
cleanup_lxc cleanup_lxc
elif ! command -v whiptail &>/dev/null || ! [ -t 0 ] || [[ "$TERM" == "dumb" ]]; then elif ! command -v whiptail &>/dev/null || ! [ -t 0 ]; then
msg_info "No interactive terminal detected defaulting to silent update mode" msg_info "No interactive terminal detected defaulting to silent update mode"
VERBOSE="no" VERBOSE="no"
set_std_mode set_std_mode

View File

@@ -140,12 +140,10 @@ ensure_profile_loaded() {
[[ -n "${_PROFILE_LOADED:-}" ]] && return [[ -n "${_PROFILE_LOADED:-}" ]] && return
command -v pveversion &>/dev/null && return command -v pveversion &>/dev/null && return
# Source all profile.d scripts to ensure PATH is complete. # Source all profile.d scripts to ensure PATH is complete
# Redirect stdout to suppress banner/MOTD output (e.g. 00_lxc-details.sh)
# while still allowing env/PATH exports to take effect.
if [[ -d /etc/profile.d ]]; then if [[ -d /etc/profile.d ]]; then
for script in /etc/profile.d/*.sh; do for script in /etc/profile.d/*.sh; do
[[ -r "$script" ]] && source "$script" >/dev/null || true [[ -r "$script" ]] && source "$script" || true
done done
fi fi

View File

@@ -456,8 +456,7 @@ motd_ssh() {
PROFILE_FILE="/etc/profile.d/00_lxc-details.sh" PROFILE_FILE="/etc/profile.d/00_lxc-details.sh"
echo "[ -t 1 ] || return 0" >"$PROFILE_FILE" echo "echo -e \"\"" >"$PROFILE_FILE"
echo "echo -e \"\"" >>"$PROFILE_FILE"
echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >>"$PROFILE_FILE" echo -e "echo -e \"${BOLD}${APPLICATION} LXC Container${CL}"\" >>"$PROFILE_FILE"
echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| GitHub: ${GN}https://github.com/community-scripts/ProxmoxVE${CL}\"" >>"$PROFILE_FILE" echo -e "echo -e \"${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| GitHub: ${GN}https://github.com/community-scripts/ProxmoxVE${CL}\"" >>"$PROFILE_FILE"
echo "echo \"\"" >>"$PROFILE_FILE" echo "echo \"\"" >>"$PROFILE_FILE"