mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-16 02:03:25 +01:00
Compare commits
2 Commits
disable-se
...
fix/teleme
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
290bef96df | ||
|
|
58f8158c47 |
12
CHANGELOG.md
12
CHANGELOG.md
@@ -403,24 +403,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
## 2026-02-14
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- core: overwriteable app version [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11753](https://github.com/community-scripts/ProxmoxVE/pull/11753))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- core: validate container IDs cluster-wide across all nodes [@MickLesk](https://github.com/MickLesk) ([#11906](https://github.com/community-scripts/ProxmoxVE/pull/11906))
|
||||
- core: improve error reporting with structured error strings and better categorization + output formatting [@MickLesk](https://github.com/MickLesk) ([#11907](https://github.com/community-scripts/ProxmoxVE/pull/11907))
|
||||
- core: unified logging system with combined logs [@MickLesk](https://github.com/MickLesk) ([#11761](https://github.com/community-scripts/ProxmoxVE/pull/11761))
|
||||
|
||||
### 🧰 Tools
|
||||
|
||||
- lxc-updater: add patchmon aware [@failure101](https://github.com/failure101) ([#11905](https://github.com/community-scripts/ProxmoxVE/pull/11905))
|
||||
|
||||
### ❔ Uncategorized
|
||||
|
||||
- Disable UniFi script - APT packages no longer available [@Copilot](https://github.com/Copilot) ([#11898](https://github.com/community-scripts/ProxmoxVE/pull/11898))
|
||||
|
||||
6
ct/headers/jellyseerr
Normal file
6
ct/headers/jellyseerr
Normal file
@@ -0,0 +1,6 @@
|
||||
__ ____
|
||||
/ /__ / / /_ __________ ___ __________
|
||||
__ / / _ \/ / / / / / ___/ _ \/ _ \/ ___/ ___/
|
||||
/ /_/ / __/ / / /_/ (__ ) __/ __/ / / /
|
||||
\____/\___/_/_/\__, /____/\___/\___/_/ /_/
|
||||
/____/
|
||||
6
ct/headers/overseerr
Normal file
6
ct/headers/overseerr
Normal file
@@ -0,0 +1,6 @@
|
||||
____
|
||||
/ __ \_ _____ _____________ ___ __________
|
||||
/ / / / | / / _ \/ ___/ ___/ _ \/ _ \/ ___/ ___/
|
||||
/ /_/ /| |/ / __/ / (__ ) __/ __/ / / /
|
||||
\____/ |___/\___/_/ /____/\___/\___/_/ /_/
|
||||
|
||||
@@ -29,43 +29,47 @@ function update_script() {
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ -f "/opt/jellyseerr/package.json" ]] && [[ "$(grep -m1 '"version"' /opt/jellyseerr/package.json | awk -F'"' '{print $4}')" == "2.7.3" ]]; then
|
||||
echo
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "Jellyseerr v2.7.3 detected."
|
||||
echo
|
||||
echo "Seerr is the new unified Jellyseerr and Overseerr."
|
||||
echo "More info: https://docs.seerr.dev/blog/seerr-release"
|
||||
echo
|
||||
read -rp "Do you want to migrate to Seerr now? (y/N): " MIGRATE
|
||||
echo
|
||||
if [[ ! "$MIGRATE" =~ ^[Yy]$ ]]; then
|
||||
msg_info "Migration cancelled. Exiting."
|
||||
exit 0
|
||||
fi
|
||||
if [ "$(node -v | cut -c2-3)" -ne 22 ]; then
|
||||
msg_info "Updating Node.js Repository"
|
||||
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
|
||||
msg_ok "Updating Node.js Repository"
|
||||
|
||||
msg_info "Switching update script to Seerr"
|
||||
sed -i 's|https://github.com/community-scripts/ProxmoxVE/raw/main/ct/jellyseerr.sh|https://github.com/community-scripts/ProxmoxVE/raw/main/ct/seerr.sh|g' /usr/bin/update
|
||||
msg_ok "Switched update script to Seerr. Running update..."
|
||||
exec /usr/bin/update
|
||||
msg_info "Updating Packages"
|
||||
$STD apt-get update
|
||||
$STD apt-get -y upgrade
|
||||
msg_ok "Updating Packages"
|
||||
fi
|
||||
|
||||
cd /opt/jellyseerr
|
||||
output=$(git pull --no-rebase)
|
||||
|
||||
pnpm_current=$(pnpm --version 2>/dev/null)
|
||||
pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json)
|
||||
|
||||
if [ -z "$pnpm_current" ]; then
|
||||
msg_error "pnpm not found. Installing version $pnpm_desired..."
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs
|
||||
elif ! node -e "const semver = require('semver'); process.exit(semver.satisfies('$pnpm_current', '$pnpm_desired') ? 0 : 1)"; then
|
||||
msg_error "Updating pnpm from version $pnpm_current to $pnpm_desired..."
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs
|
||||
else
|
||||
msg_ok "pnpm is already installed and satisfies version $pnpm_desired."
|
||||
fi
|
||||
|
||||
msg_info "Updating Jellyseerr"
|
||||
cd /opt/jellyseerr
|
||||
systemctl stop jellyseerr
|
||||
output=$(git pull --no-rebase)
|
||||
pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json)
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs
|
||||
if echo "$output" | grep -q "Already up to date."; then
|
||||
msg_ok "$APP is already up to date."
|
||||
exit
|
||||
fi
|
||||
|
||||
systemctl stop jellyseerr
|
||||
rm -rf dist .next node_modules
|
||||
export CYPRESS_INSTALL_BINARY=0
|
||||
cd /opt/jellyseerr
|
||||
$STD pnpm install --frozen-lockfile
|
||||
export NODE_OPTIONS="--max-old-space-size=3072"
|
||||
$STD pnpm build
|
||||
|
||||
cat <<EOF >/etc/systemd/system/jellyseerr.service
|
||||
[Unit]
|
||||
Description=jellyseerr Service
|
||||
@@ -81,6 +85,7 @@ ExecStart=/usr/bin/node dist/index.js
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl start jellyseerr
|
||||
msg_ok "Updated Jellyseerr"
|
||||
|
||||
@@ -27,28 +27,6 @@ function update_script() {
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ -f "$HOME/.overseerr" ]] && [[ "$(cat "$HOME/.overseerr")" == "1.34.0" ]]; then
|
||||
echo
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "Overseerr v1.34.0 detected."
|
||||
echo
|
||||
echo "Seerr is the new unified Jellyseerr and Overseerr."
|
||||
echo "More info: https://docs.seerr.dev/blog/seerr-release"
|
||||
echo
|
||||
read -rp "Do you want to migrate to Seerr now? (y/N): " MIGRATE
|
||||
echo
|
||||
if [[ ! "$MIGRATE" =~ ^[Yy]$ ]]; then
|
||||
msg_info "Migration cancelled. Exiting."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
msg_info "Switching update script to Seerr"
|
||||
sed -i 's|https://github.com/community-scripts/ProxmoxVE/raw/main/ct/overseerr.sh|https://github.com/community-scripts/ProxmoxVE/raw/main/ct/seerr.sh|g' /usr/bin/update
|
||||
msg_ok "Switched update script to Seerr. Running update..."
|
||||
exec /usr/bin/update
|
||||
fi
|
||||
|
||||
if check_for_gh_release "overseerr" "sct/overseerr"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop overseerr
|
||||
|
||||
165
ct/seerr.sh
165
ct/seerr.sh
@@ -1,165 +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: CrazyWolf13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://docs.seerr.dev/
|
||||
|
||||
APP="Seerr"
|
||||
var_tags="${var_tags:-media}"
|
||||
var_cpu="${var_cpu:-4}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-12}"
|
||||
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/seerr && ! -d /opt/jellyseerr && ! -d /opt/overseerr ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
# Start Migration from Jellyseerr
|
||||
if [[ -f /etc/systemd/system/jellyseerr.service ]]; then
|
||||
msg_info "Stopping Jellyseerr"
|
||||
$STD systemctl stop jellyseerr || true
|
||||
$STD systemctl disable jellyseerr || true
|
||||
[ -f /etc/systemd/system/jellyseerr.service ] && rm -f /etc/systemd/system/jellyseerr.service
|
||||
msg_ok "Stopped Jellyseerr"
|
||||
|
||||
msg_info "Creating Backup (Patience)"
|
||||
tar -czf /opt/jellyseerr_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /opt jellyseerr
|
||||
msg_ok "Created Backup"
|
||||
|
||||
msg_info "Migrating Jellyseerr to seerr"
|
||||
[ -d /opt/jellyseerr ] && mv /opt/jellyseerr /opt/seerr
|
||||
[ -d /etc/jellyseerr ] && mv /etc/jellyseerr /etc/seerr
|
||||
[ -f /etc/seerr/jellyseerr.conf ] && mv /etc/seerr/jellyseerr.conf /etc/seerr/seerr.conf
|
||||
cat <<EOF >/etc/systemd/system/seerr.service
|
||||
[Unit]
|
||||
Description=Seerr Service
|
||||
Wants=network-online.target
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=/etc/seerr/seerr.conf
|
||||
Environment=NODE_ENV=production
|
||||
Type=exec
|
||||
Restart=on-failure
|
||||
WorkingDirectory=/opt/seerr
|
||||
ExecStart=/usr/bin/node dist/index.js
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl daemon-reload
|
||||
systemctl enable -q --now seerr
|
||||
msg_ok "Migrated Jellyserr to Seerr"
|
||||
fi
|
||||
# END Jellyseerr Migration
|
||||
|
||||
# Start Migration from Overseerr
|
||||
if [[ -f /etc/systemd/system/overseerr.service ]]; then
|
||||
msg_info "Stopping Overseerr"
|
||||
$STD systemctl stop overseerr || true
|
||||
$STD systemctl disable overseerr || true
|
||||
[ -f /etc/systemd/system/overseerr.service ] && rm -f /etc/systemd/system/overseerr.service
|
||||
msg_ok "Stopped Overseerr"
|
||||
|
||||
msg_info "Creating Backup (Patience)"
|
||||
tar -czf /opt/overseerr_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /opt overseerr
|
||||
msg_ok "Created Backup"
|
||||
|
||||
msg_info "Migrating Overseerr to seerr"
|
||||
[ -d /opt/overseerr ] && mv /opt/overseerr /opt/seerr
|
||||
mkdir -p /etc/seerr
|
||||
cat <<EOF >/etc/seerr/seerr.conf
|
||||
## Seerr's default port is 5055, if you want to use both, change this.
|
||||
## specify on which port to listen
|
||||
PORT=5055
|
||||
|
||||
## specify on which interface to listen, by default seerr listens on all interfaces
|
||||
#HOST=127.0.0.1
|
||||
|
||||
## Uncomment if you want to force Node.js to resolve IPv4 before IPv6 (advanced users only)
|
||||
# FORCE_IPV4_FIRST=true
|
||||
EOF
|
||||
cat <<EOF >/etc/systemd/system/seerr.service
|
||||
[Unit]
|
||||
Description=Seerr Service
|
||||
Wants=network-online.target
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=/etc/seerr/seerr.conf
|
||||
Environment=NODE_ENV=production
|
||||
Type=exec
|
||||
Restart=on-failure
|
||||
WorkingDirectory=/opt/seerr
|
||||
ExecStart=/usr/bin/node dist/index.js
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl daemon-reload
|
||||
systemctl enable -q --now seerr
|
||||
msg_ok "Migrated Overseerr to Seerr"
|
||||
fi
|
||||
# END Overseerr Migration
|
||||
|
||||
if check_for_gh_release "seerr" "seerr-team/seerr"; then
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop seerr
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Creating Backup"
|
||||
cp -a /opt/seerr/config /opt/seerr_backup
|
||||
msg_ok "Created Backup"
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "seerr" "seerr-team/seerr" "tarball"
|
||||
|
||||
msg_info "Updating PNPM Version"
|
||||
pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/seerr/package.json)
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs
|
||||
msg_ok "Updated PNPM Version"
|
||||
|
||||
msg_info "Updating Seerr"
|
||||
cd /opt/seerr
|
||||
rm -rf dist .next node_modules
|
||||
export CYPRESS_INSTALL_BINARY=0
|
||||
$STD pnpm install --frozen-lockfile
|
||||
export NODE_OPTIONS="--max-old-space-size=3072"
|
||||
$STD pnpm build
|
||||
msg_ok "Updated Seerr"
|
||||
|
||||
msg_info "Restoring Backup"
|
||||
rm -rf /opt/seerr/config
|
||||
mv /opt/seerr_backup /opt/seerr/config
|
||||
msg_ok "Restored Backup"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start seerr
|
||||
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}:5055${CL}"
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-02-14T18:07:29Z",
|
||||
"generated": "2026-02-14T12:08:41Z",
|
||||
"versions": [
|
||||
{
|
||||
"slug": "2fauth",
|
||||
@@ -116,9 +116,9 @@
|
||||
{
|
||||
"slug": "bentopdf",
|
||||
"repo": "alam00000/bentopdf",
|
||||
"version": "v2.2.1",
|
||||
"version": "v2.2.0",
|
||||
"pinned": false,
|
||||
"date": "2026-02-14T16:33:47Z"
|
||||
"date": "2026-02-09T07:07:40Z"
|
||||
},
|
||||
{
|
||||
"slug": "beszel",
|
||||
@@ -354,9 +354,9 @@
|
||||
{
|
||||
"slug": "firefly",
|
||||
"repo": "firefly-iii/firefly-iii",
|
||||
"version": "v6.4.20",
|
||||
"version": "v6.4.19",
|
||||
"pinned": false,
|
||||
"date": "2026-02-14T12:39:02Z"
|
||||
"date": "2026-02-14T11:55:40Z"
|
||||
},
|
||||
{
|
||||
"slug": "fladder",
|
||||
@@ -578,9 +578,9 @@
|
||||
{
|
||||
"slug": "jackett",
|
||||
"repo": "Jackett/Jackett",
|
||||
"version": "v0.24.1113",
|
||||
"version": "v0.24.1109",
|
||||
"pinned": false,
|
||||
"date": "2026-02-14T17:46:58Z"
|
||||
"date": "2026-02-14T05:54:26Z"
|
||||
},
|
||||
{
|
||||
"slug": "jellystat",
|
||||
@@ -1411,9 +1411,9 @@
|
||||
{
|
||||
"slug": "tandoor",
|
||||
"repo": "TandoorRecipes/recipes",
|
||||
"version": "2.5.3",
|
||||
"version": "2.5.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-14T12:42:14Z"
|
||||
"date": "2026-02-13T15:57:27Z"
|
||||
},
|
||||
{
|
||||
"slug": "tasmoadmin",
|
||||
|
||||
35
frontend/public/json/jellyseerr.json
Normal file
35
frontend/public/json/jellyseerr.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Jellyseerr",
|
||||
"slug": "jellyseerr",
|
||||
"categories": [
|
||||
14
|
||||
],
|
||||
"date_created": "2024-05-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 5055,
|
||||
"documentation": "https://docs.jellyseerr.dev/",
|
||||
"website": "https://github.com/Fallenbagel/jellyseerr",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/jellyseerr.webp",
|
||||
"config_path": "/etc/jellyseerr/jellyseerr.conf",
|
||||
"description": "Jellyseerr is a free and open source software application for managing requests for your media library. It is a a fork of Overseerr built to bring support for Jellyfin & Emby media servers.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/jellyseerr.sh",
|
||||
"resources": {
|
||||
"cpu": 4,
|
||||
"ram": 4096,
|
||||
"hdd": 8,
|
||||
"os": "debian",
|
||||
"version": "12"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
35
frontend/public/json/overseerr.json
Normal file
35
frontend/public/json/overseerr.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "Overseerr",
|
||||
"slug": "overseerr",
|
||||
"categories": [
|
||||
14
|
||||
],
|
||||
"date_created": "2024-05-02",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 5055,
|
||||
"documentation": "https://docs.overseerr.dev/",
|
||||
"website": "https://overseerr.dev/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/overseerr.webp",
|
||||
"config_path": "/opt/overseerr/config/settings.json",
|
||||
"description": "Overseerr is a request management and media discovery tool built to work with your existing Plex ecosystem.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/overseerr.sh",
|
||||
"resources": {
|
||||
"cpu": 2,
|
||||
"ram": 4096,
|
||||
"hdd": 8,
|
||||
"os": "debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
{
|
||||
"name": "Seerr",
|
||||
"slug": "seerr",
|
||||
"categories": [
|
||||
13
|
||||
],
|
||||
"date_created": "2026-01-19",
|
||||
"type": "ct",
|
||||
"updateable": true,
|
||||
"privileged": false,
|
||||
"interface_port": 5055,
|
||||
"documentation": "https://docs.seerr.dev/",
|
||||
"website": "https://seerr.dev/",
|
||||
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/seerr.webp",
|
||||
"config_path": "/etc/seerr/seerr.conf",
|
||||
"description": "Open-source media request and discovery manager for Jellyfin, Plex, and Emby. Unified version of Overseerr and Jellyseerr.",
|
||||
"install_methods": [
|
||||
{
|
||||
"type": "default",
|
||||
"script": "ct/seerr.sh",
|
||||
"resources": {
|
||||
"cpu": 4,
|
||||
"ram": 4096,
|
||||
"hdd": 12,
|
||||
"os": "Debian",
|
||||
"version": "13"
|
||||
}
|
||||
}
|
||||
],
|
||||
"default_credentials": {
|
||||
"username": null,
|
||||
"password": null
|
||||
},
|
||||
"notes": []
|
||||
}
|
||||
64
install/jellyseerr-install.sh
Normal file
64
install/jellyseerr-install.sh
Normal file
@@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://docs.jellyseerr.dev/
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y \
|
||||
git \
|
||||
build-essential
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
git clone -q https://github.com/Fallenbagel/jellyseerr.git /opt/jellyseerr
|
||||
cd /opt/jellyseerr
|
||||
$STD git checkout main
|
||||
|
||||
pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/jellyseerr/package.json)
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs
|
||||
|
||||
msg_info "Installing Jellyseerr (Patience)"
|
||||
export CYPRESS_INSTALL_BINARY=0
|
||||
cd /opt/jellyseerr
|
||||
$STD pnpm install --frozen-lockfile
|
||||
export NODE_OPTIONS="--max-old-space-size=3072"
|
||||
$STD pnpm build
|
||||
mkdir -p /etc/jellyseerr/
|
||||
cat <<EOF >/etc/jellyseerr/jellyseerr.conf
|
||||
PORT=5055
|
||||
# HOST=0.0.0.0
|
||||
# JELLYFIN_TYPE=emby
|
||||
EOF
|
||||
msg_ok "Installed Jellyseerr"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/jellyseerr.service
|
||||
[Unit]
|
||||
Description=jellyseerr Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=/etc/jellyseerr/jellyseerr.conf
|
||||
Environment=NODE_ENV=production
|
||||
Type=exec
|
||||
WorkingDirectory=/opt/jellyseerr
|
||||
ExecStart=/usr/bin/node dist/index.js
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now jellyseerr
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
44
install/overseerr-install.sh
Normal file
44
install/overseerr-install.sh
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 tteck
|
||||
# Author: tteck (tteckster)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://overseerr.dev/
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs
|
||||
fetch_and_deploy_gh_release "overseerr" "sct/overseerr" "tarball"
|
||||
|
||||
msg_info "Configuring Overseerr (Patience)"
|
||||
cd /opt/overseerr
|
||||
$STD yarn install
|
||||
$STD yarn build
|
||||
msg_ok "Configured Overseerr"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/overseerr.service
|
||||
[Unit]
|
||||
Description=Overseerr Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=exec
|
||||
WorkingDirectory=/opt/overseerr
|
||||
ExecStart=/usr/bin/yarn start
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now overseerr
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -1,67 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: CrazyWolf13
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://docs.seerr.dev/
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt-get install -y build-essential
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
fetch_and_deploy_gh_release "seerr" "seerr-team/seerr" "tarball"
|
||||
pnpm_desired=$(grep -Po '"pnpm":\s*"\K[^"]+' /opt/seerr/package.json)
|
||||
NODE_VERSION="22" NODE_MODULE="pnpm@$pnpm_desired" setup_nodejs
|
||||
|
||||
msg_info "Installing Seerr (Patience)"
|
||||
export CYPRESS_INSTALL_BINARY=0
|
||||
cd /opt/seerr
|
||||
$STD pnpm install --frozen-lockfile
|
||||
export NODE_OPTIONS="--max-old-space-size=3072"
|
||||
$STD pnpm build
|
||||
mkdir -p /etc/seerr/
|
||||
cat <<EOF >/etc/seerr/seerr.conf
|
||||
## Seerr's default port is 5055, if you want to use both, change this.
|
||||
## specify on which port to listen
|
||||
PORT=5055
|
||||
|
||||
## specify on which interface to listen, by default seerr listens on all interfaces
|
||||
HOST=0.0.0.0
|
||||
|
||||
## Uncomment if you want to force Node.js to resolve IPv4 before IPv6 (advanced users only)
|
||||
# FORCE_IPV4_FIRST=true
|
||||
EOF
|
||||
msg_ok "Installed Seerr"
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<EOF >/etc/systemd/system/seerr.service
|
||||
[Unit]
|
||||
Description=Seerr Service
|
||||
Wants=network-online.target
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
EnvironmentFile=/etc/seerr/seerr.conf
|
||||
Environment=NODE_ENV=production
|
||||
Type=exec
|
||||
Restart=on-failure
|
||||
WorkingDirectory=/opt/seerr
|
||||
ExecStart=/usr/bin/node dist/index.js
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now seerr
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -237,21 +237,16 @@ explain_exit_code() {
|
||||
# json_escape()
|
||||
#
|
||||
# - Escapes a string for safe JSON embedding
|
||||
# - Strips ANSI escape sequences and non-printable control characters
|
||||
# - Handles backslashes, quotes, newlines, tabs, and carriage returns
|
||||
# ------------------------------------------------------------------------------
|
||||
json_escape() {
|
||||
local s="$1"
|
||||
# Strip ANSI escape sequences (color codes etc.)
|
||||
s=$(printf '%s' "$s" | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g')
|
||||
s=${s//\\/\\\\}
|
||||
s=${s//"/\\"/}
|
||||
s=${s//$'\n'/\\n}
|
||||
s=${s//$'\r'/}
|
||||
s=${s//$'\t'/\\t}
|
||||
# Remove any remaining control characters (0x00-0x1F except those already handled)
|
||||
s=$(printf '%s' "$s" | tr -d '\000-\010\013\014\016-\037')
|
||||
printf '%s' "$s"
|
||||
echo "$s"
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
@@ -288,7 +283,7 @@ get_error_text() {
|
||||
fi
|
||||
|
||||
if [[ -n "$logfile" && -s "$logfile" ]]; then
|
||||
tail -n 20 "$logfile" 2>/dev/null | sed 's/\r$//' | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'
|
||||
tail -n 20 "$logfile" 2>/dev/null | sed 's/\r$//'
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -277,9 +277,8 @@ install_ssh_keys_into_ct() {
|
||||
# ------------------------------------------------------------------------------
|
||||
# validate_container_id()
|
||||
#
|
||||
# - Validates if a container ID is available for use (CLUSTER-WIDE)
|
||||
# - Checks cluster resources via pvesh for VMs/CTs on ALL nodes
|
||||
# - Falls back to local config file check if pvesh unavailable
|
||||
# - Validates if a container ID is available for use
|
||||
# - Checks if ID is already used by VM or LXC container
|
||||
# - Checks if ID is used in LVM logical volumes
|
||||
# - Returns 0 if ID is available, 1 if already in use
|
||||
# ------------------------------------------------------------------------------
|
||||
@@ -291,35 +290,11 @@ validate_container_id() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
# CLUSTER-WIDE CHECK: Query all VMs/CTs across all nodes
|
||||
# This catches IDs used on other nodes in the cluster
|
||||
# NOTE: Works on single-node too - Proxmox always has internal cluster structure
|
||||
# Falls back gracefully if pvesh unavailable or returns empty
|
||||
if command -v pvesh &>/dev/null; then
|
||||
local cluster_ids
|
||||
cluster_ids=$(pvesh get /cluster/resources --type vm --output-format json 2>/dev/null |
|
||||
grep -oP '"vmid":\s*\K[0-9]+' 2>/dev/null || true)
|
||||
if [[ -n "$cluster_ids" ]] && echo "$cluster_ids" | grep -qw "$ctid"; then
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# LOCAL FALLBACK: Check if config file exists for VM or LXC
|
||||
# This handles edge cases where pvesh might not return all info
|
||||
# Check if config file exists for VM or LXC
|
||||
if [[ -f "/etc/pve/qemu-server/${ctid}.conf" ]] || [[ -f "/etc/pve/lxc/${ctid}.conf" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check ALL nodes in cluster for config files (handles pmxcfs sync delays)
|
||||
# NOTE: On single-node, /etc/pve/nodes/ contains just the one node - still works
|
||||
if [[ -d "/etc/pve/nodes" ]]; then
|
||||
for node_dir in /etc/pve/nodes/*/; do
|
||||
if [[ -f "${node_dir}qemu-server/${ctid}.conf" ]] || [[ -f "${node_dir}lxc/${ctid}.conf" ]]; then
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Check if ID is used in LVM logical volumes
|
||||
if lvs --noheadings -o lv_name 2>/dev/null | grep -qE "(^|[-_])${ctid}($|[-_])"; then
|
||||
return 1
|
||||
@@ -331,30 +306,63 @@ validate_container_id() {
|
||||
# ------------------------------------------------------------------------------
|
||||
# get_valid_container_id()
|
||||
#
|
||||
# - Returns a valid, unused container ID (CLUSTER-AWARE)
|
||||
# - Uses pvesh /cluster/nextid as starting point (already cluster-aware)
|
||||
# - Returns a valid, unused container ID
|
||||
# - If provided ID is valid, returns it
|
||||
# - Otherwise increments until a free one is found across entire cluster
|
||||
# - Otherwise increments from suggested ID until a free one is found
|
||||
# - Calls validate_container_id() to check availability
|
||||
# ------------------------------------------------------------------------------
|
||||
get_valid_container_id() {
|
||||
local suggested_id="${1:-$(pvesh get /cluster/nextid 2>/dev/null || echo 100)}"
|
||||
|
||||
# Ensure we have a valid starting ID
|
||||
if ! [[ "$suggested_id" =~ ^[0-9]+$ ]]; then
|
||||
suggested_id=$(pvesh get /cluster/nextid 2>/dev/null || echo 100)
|
||||
fi
|
||||
|
||||
local max_attempts=1000
|
||||
local attempts=0
|
||||
local suggested_id="${1:-$(pvesh get /cluster/nextid)}"
|
||||
|
||||
while ! validate_container_id "$suggested_id"; do
|
||||
suggested_id=$((suggested_id + 1))
|
||||
done
|
||||
|
||||
echo "$suggested_id"
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# validate_container_id()
|
||||
#
|
||||
# - Validates if a container ID is available for use
|
||||
# - Checks if ID is already used by VM or LXC container
|
||||
# - Checks if ID is used in LVM logical volumes
|
||||
# - Returns 0 if ID is available, 1 if already in use
|
||||
# ------------------------------------------------------------------------------
|
||||
validate_container_id() {
|
||||
local ctid="$1"
|
||||
|
||||
# Check if ID is numeric
|
||||
if ! [[ "$ctid" =~ ^[0-9]+$ ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if config file exists for VM or LXC
|
||||
if [[ -f "/etc/pve/qemu-server/${ctid}.conf" ]] || [[ -f "/etc/pve/lxc/${ctid}.conf" ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if ID is used in LVM logical volumes
|
||||
if lvs --noheadings -o lv_name 2>/dev/null | grep -qE "(^|[-_])${ctid}($|[-_])"; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# get_valid_container_id()
|
||||
#
|
||||
# - Returns a valid, unused container ID
|
||||
# - If provided ID is valid, returns it
|
||||
# - Otherwise increments from suggested ID until a free one is found
|
||||
# - Calls validate_container_id() to check availability
|
||||
# ------------------------------------------------------------------------------
|
||||
get_valid_container_id() {
|
||||
local suggested_id="${1:-$(pvesh get /cluster/nextid)}"
|
||||
|
||||
while ! validate_container_id "$suggested_id"; do
|
||||
suggested_id=$((suggested_id + 1))
|
||||
attempts=$((attempts + 1))
|
||||
if [[ $attempts -ge $max_attempts ]]; then
|
||||
msg_error "Could not find available container ID after $max_attempts attempts"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "$suggested_id"
|
||||
|
||||
@@ -1913,7 +1913,7 @@ function fetch_and_deploy_codeberg_release() {
|
||||
local app="$1"
|
||||
local repo="$2"
|
||||
local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile | tag
|
||||
local version="${var_appversion:-${4:-latest}}"
|
||||
local version="${4:-latest}"
|
||||
local target="${5:-/opt/$app}"
|
||||
local asset_pattern="${6:-}"
|
||||
|
||||
@@ -2443,7 +2443,7 @@ function fetch_and_deploy_gh_release() {
|
||||
local app="$1"
|
||||
local repo="$2"
|
||||
local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile
|
||||
local version="${var_appversion:-${4:-latest}}"
|
||||
local version="${4:-latest}"
|
||||
local target="${5:-/opt/$app}"
|
||||
local asset_pattern="${6:-}"
|
||||
|
||||
|
||||
@@ -110,11 +110,6 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
|
||||
container_hostname=$(pct exec "$container" hostname)
|
||||
containers_needing_reboot+=("$container ($container_hostname)")
|
||||
fi
|
||||
# check if patchmon agent is present in container and run a report if found
|
||||
if pct exec "$container" -- [ -e "/usr/local/bin/patchmon-agent" ]; then
|
||||
echo -e "${BL}[Info]${GN} patchmon-agent found in ${BL} $container ${CL}, triggering report. \n"
|
||||
pct exec "$container" -- "/usr/local/bin/patchmon-agent" "report"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
wait
|
||||
|
||||
Reference in New Issue
Block a user