Compare commits

..

22 Commits

Author SHA1 Message Date
Chris
629f48e670 Update ct/seerr.sh 2026-02-15 09:14:19 -05:00
Chris
a0bb6f072b Rename seer-install.sh to seerr-install.sh 2026-02-15 09:07:34 -05:00
Chris
4d9354c911 Rename seer.sh to seerr.sh 2026-02-15 09:07:04 -05:00
Tobias
72fc2d9d36 Delete frontend/public/json/overseerr.json 2026-02-15 13:10:18 +01:00
Tobias
e56acaedef Delete install/overseerr-install.sh 2026-02-15 13:10:09 +01:00
Tobias
303592834a Delete ct/headers/overseerr 2026-02-15 13:09:56 +01:00
Tobias
015688e394 Update jellyseerr.sh 2026-02-15 13:06:57 +01:00
Tobias
03c53252f6 Update jellyseerr.sh 2026-02-15 12:36:09 +01:00
Tobias
d40a0829f5 Delete ct/headers/jellyseerr 2026-02-15 12:29:27 +01:00
Tobias
21b98df1fd Delete frontend/public/json/jellyseerr.json 2026-02-15 12:29:16 +01:00
Tobias
6aee01f1eb Delete install/jellyseerr-install.sh 2026-02-15 12:29:04 +01:00
Tobias
51249d5987 Update overseerr.sh 2026-02-15 12:28:40 +01:00
Tobias
166b3afa77 Create seerr.json 2026-02-15 12:19:33 +01:00
Tobias
55f6049cd1 Create seer-install.sh 2026-02-15 12:17:33 +01:00
Tobias
dcadd3683b Create seer.sh 2026-02-15 12:16:58 +01:00
community-scripts-pr-app[bot]
da915b87f6 chore: update github-versions.json (#11917)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-14 18:07:36 +00:00
community-scripts-pr-app[bot]
b46dddbd7d Update CHANGELOG.md (#11916)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-14 15:43:15 +00:00
community-scripts-pr-app[bot]
b3e3ed5fb3 Update CHANGELOG.md (#11915)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-14 15:42:52 +00:00
failure101
7b767ff58b Feature/lxc update patchmon aware (#11905)
* update-lxcs.sh ist now patchmon-agent aware: if patchmon agent is detected inside LXC,
then it is called after updating the container

it is called with the argument "report" to relay the current update situation back to the patchmon system

* Added status message if patchmon agent is found

* whitespace added

* Update tools/pve/update-lxcs.sh

Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>

* Update tools/pve/update-lxcs.sh

Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>

* removed os differentiation, removed use of explicit shell during call of patchmon-agent

* removed os differentiation
removed use of explicit shell during call of patchmon-agent
fixed whitespace

* Delete .git-setup-info

not needed

---------

Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com>
2026-02-14 16:42:29 +01:00
community-scripts-pr-app[bot]
79baf4360e Update CHANGELOG.md (#11914)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-02-14 15:37:34 +00:00
Tobias
773f3f67b8 core: overwriteable app version (#11753)
* refactor: homepage

* add: overwriteable app version var

* fix wrong commit

* fix: wrong commit

* fix: wrong commit

* Remove APPLICATION_VERSION export

* Change APPLICATION_VERSION to var_appversion
2026-02-14 16:37:13 +01:00
CanbiZ (MickLesk)
9a95d81f17 Strip ANSI and control chars in json_escape & logs
Enhance json_escape to remove ANSI escape sequences (color codes) and other non-printable control characters before escaping backslashes, quotes, newlines, tabs and carriage returns. Also update get_error_text to strip ANSI sequences from tailed logfile output. These changes ensure safe JSON embedding of strings and prevent control characters / terminal color codes from leaking into logs or JSON payloads.
2026-02-14 16:13:05 +01:00
16 changed files with 352 additions and 243 deletions

View File

@@ -403,6 +403,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
## 2026-02-14 ## 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 ### 💾 Core
- #### ✨ New Features - #### ✨ New Features
@@ -411,6 +417,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- 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: 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)) - 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 ### ❔ Uncategorized
- Disable UniFi script - APT packages no longer available [@Copilot](https://github.com/Copilot) ([#11898](https://github.com/community-scripts/ProxmoxVE/pull/11898)) - Disable UniFi script - APT packages no longer available [@Copilot](https://github.com/Copilot) ([#11898](https://github.com/community-scripts/ProxmoxVE/pull/11898))

View File

@@ -1,6 +0,0 @@
__ ____
/ /__ / / /_ __________ ___ __________
__ / / _ \/ / / / / / ___/ _ \/ _ \/ ___/ ___/
/ /_/ / __/ / / /_/ (__ ) __/ __/ / / /
\____/\___/_/_/\__, /____/\___/\___/_/ /_/
/____/

View File

@@ -1,6 +0,0 @@
____
/ __ \_ _____ _____________ ___ __________
/ / / / | / / _ \/ ___/ ___/ _ \/ _ \/ ___/ ___/
/ /_/ /| |/ / __/ / (__ ) __/ __/ / / /
\____/ |___/\___/_/ /____/\___/\___/_/ /_/

View File

@@ -29,47 +29,43 @@ function update_script() {
exit exit
fi fi
if [ "$(node -v | cut -c2-3)" -ne 22 ]; then if [[ -f "/opt/jellyseerr/package.json" ]] && [[ "$(grep -m1 '"version"' /opt/jellyseerr/package.json | awk -F'"' '{print $4}')" == "2.7.3" ]]; then
msg_info "Updating Node.js Repository" echo
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 echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
msg_ok "Updating Node.js Repository" 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
msg_info "Updating Packages" msg_info "Switching update script to Seerr"
$STD apt-get update 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
$STD apt-get -y upgrade msg_ok "Switched update script to Seerr. Running update..."
msg_ok "Updating Packages" exec /usr/bin/update
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 fi
msg_info "Updating Jellyseerr" 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 if echo "$output" | grep -q "Already up to date."; then
msg_ok "$APP is already up to date." msg_ok "$APP is already up to date."
exit exit
fi fi
systemctl stop jellyseerr
rm -rf dist .next node_modules rm -rf dist .next node_modules
export CYPRESS_INSTALL_BINARY=0 export CYPRESS_INSTALL_BINARY=0
cd /opt/jellyseerr cd /opt/jellyseerr
$STD pnpm install --frozen-lockfile $STD pnpm install --frozen-lockfile
export NODE_OPTIONS="--max-old-space-size=3072" export NODE_OPTIONS="--max-old-space-size=3072"
$STD pnpm build $STD pnpm build
cat <<EOF >/etc/systemd/system/jellyseerr.service cat <<EOF >/etc/systemd/system/jellyseerr.service
[Unit] [Unit]
Description=jellyseerr Service Description=jellyseerr Service
@@ -85,7 +81,6 @@ ExecStart=/usr/bin/node dist/index.js
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl daemon-reload systemctl daemon-reload
systemctl start jellyseerr systemctl start jellyseerr
msg_ok "Updated Jellyseerr" msg_ok "Updated Jellyseerr"

View File

@@ -27,6 +27,28 @@ function update_script() {
msg_error "No ${APP} Installation Found!" msg_error "No ${APP} Installation Found!"
exit exit
fi 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 if check_for_gh_release "overseerr" "sct/overseerr"; then
msg_info "Stopping Service" msg_info "Stopping Service"
systemctl stop overseerr systemctl stop overseerr

165
ct/seerr.sh Normal file
View File

@@ -0,0 +1,165 @@
#!/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}"

View File

@@ -1,5 +1,5 @@
{ {
"generated": "2026-02-14T12:08:41Z", "generated": "2026-02-14T18:07:29Z",
"versions": [ "versions": [
{ {
"slug": "2fauth", "slug": "2fauth",
@@ -116,9 +116,9 @@
{ {
"slug": "bentopdf", "slug": "bentopdf",
"repo": "alam00000/bentopdf", "repo": "alam00000/bentopdf",
"version": "v2.2.0", "version": "v2.2.1",
"pinned": false, "pinned": false,
"date": "2026-02-09T07:07:40Z" "date": "2026-02-14T16:33:47Z"
}, },
{ {
"slug": "beszel", "slug": "beszel",
@@ -354,9 +354,9 @@
{ {
"slug": "firefly", "slug": "firefly",
"repo": "firefly-iii/firefly-iii", "repo": "firefly-iii/firefly-iii",
"version": "v6.4.19", "version": "v6.4.20",
"pinned": false, "pinned": false,
"date": "2026-02-14T11:55:40Z" "date": "2026-02-14T12:39:02Z"
}, },
{ {
"slug": "fladder", "slug": "fladder",
@@ -578,9 +578,9 @@
{ {
"slug": "jackett", "slug": "jackett",
"repo": "Jackett/Jackett", "repo": "Jackett/Jackett",
"version": "v0.24.1109", "version": "v0.24.1113",
"pinned": false, "pinned": false,
"date": "2026-02-14T05:54:26Z" "date": "2026-02-14T17:46:58Z"
}, },
{ {
"slug": "jellystat", "slug": "jellystat",
@@ -1411,9 +1411,9 @@
{ {
"slug": "tandoor", "slug": "tandoor",
"repo": "TandoorRecipes/recipes", "repo": "TandoorRecipes/recipes",
"version": "2.5.1", "version": "2.5.3",
"pinned": false, "pinned": false,
"date": "2026-02-13T15:57:27Z" "date": "2026-02-14T12:42:14Z"
}, },
{ {
"slug": "tasmoadmin", "slug": "tasmoadmin",

View File

@@ -1,35 +0,0 @@
{
"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": []
}

View File

@@ -1,35 +0,0 @@
{
"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": []
}

View File

@@ -0,0 +1,35 @@
{
"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": []
}

View File

@@ -1,64 +0,0 @@
#!/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

View File

@@ -1,44 +0,0 @@
#!/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

67
install/seerr-install.sh Normal file
View File

@@ -0,0 +1,67 @@
#!/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

View File

@@ -237,16 +237,21 @@ explain_exit_code() {
# json_escape() # json_escape()
# #
# - Escapes a string for safe JSON embedding # - Escapes a string for safe JSON embedding
# - Strips ANSI escape sequences and non-printable control characters
# - Handles backslashes, quotes, newlines, tabs, and carriage returns # - Handles backslashes, quotes, newlines, tabs, and carriage returns
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
json_escape() { json_escape() {
local s="$1" 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//"/\\"/} s=${s//"/\\"/}
s=${s//$'\n'/\\n} s=${s//$'\n'/\\n}
s=${s//$'\r'/} s=${s//$'\r'/}
s=${s//$'\t'/\\t} s=${s//$'\t'/\\t}
echo "$s" # 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"
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
@@ -283,7 +288,7 @@ get_error_text() {
fi fi
if [[ -n "$logfile" && -s "$logfile" ]]; then if [[ -n "$logfile" && -s "$logfile" ]]; then
tail -n 20 "$logfile" 2>/dev/null | sed 's/\r$//' tail -n 20 "$logfile" 2>/dev/null | sed 's/\r$//' | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'
fi fi
} }
@@ -402,19 +407,14 @@ detect_ram() {
if command -v dmidecode &>/dev/null; then if command -v dmidecode &>/dev/null; then
# Get configured memory speed (actual running speed) # Get configured memory speed (actual running speed)
RAM_SPEED=$(dmidecode -t memory 2>/dev/null | grep -m1 "Configured Memory Speed:" | grep -oE "[0-9]+" | head -1 || true) RAM_SPEED=$(dmidecode -t memory 2>/dev/null | grep -m1 "Configured Memory Speed:" | grep -oE "[0-9]+" | head -1)
# Fallback to Speed: if Configured not available # Fallback to Speed: if Configured not available
if [[ -z "$RAM_SPEED" ]]; then if [[ -z "$RAM_SPEED" ]]; then
RAM_SPEED=$(dmidecode -t memory 2>/dev/null | grep -m1 "Speed:" | grep -oE "[0-9]+" | head -1 || true) RAM_SPEED=$(dmidecode -t memory 2>/dev/null | grep -m1 "Speed:" | grep -oE "[0-9]+" | head -1)
fi fi
fi fi
# Ensure RAM_SPEED is a valid integer (PocketBase stores it as integer)
if [[ -z "$RAM_SPEED" || ! "$RAM_SPEED" =~ ^[0-9]+$ ]]; then
RAM_SPEED=0
fi
export RAM_SPEED export RAM_SPEED
} }
@@ -509,7 +509,7 @@ post_to_api() {
"gpu_vendor": "${gpu_vendor}", "gpu_vendor": "${gpu_vendor}",
"gpu_model": "${gpu_model}", "gpu_model": "${gpu_model}",
"gpu_passthrough": "${gpu_passthrough}", "gpu_passthrough": "${gpu_passthrough}",
"ram_speed": ${ram_speed:-0}, "ram_speed": "${ram_speed}",
"repo_source": "${REPO_SOURCE}" "repo_source": "${REPO_SOURCE}"
} }
EOF EOF
@@ -613,7 +613,7 @@ post_to_api_vm() {
"gpu_vendor": "${gpu_vendor}", "gpu_vendor": "${gpu_vendor}",
"gpu_model": "${gpu_model}", "gpu_model": "${gpu_model}",
"gpu_passthrough": "${gpu_passthrough}", "gpu_passthrough": "${gpu_passthrough}",
"ram_speed": ${ram_speed:-0}, "ram_speed": "${ram_speed}",
"repo_source": "${REPO_SOURCE}" "repo_source": "${REPO_SOURCE}"
} }
EOF EOF
@@ -747,7 +747,7 @@ post_update_to_api() {
"gpu_vendor": "${gpu_vendor}", "gpu_vendor": "${gpu_vendor}",
"gpu_model": "${gpu_model}", "gpu_model": "${gpu_model}",
"gpu_passthrough": "${gpu_passthrough}", "gpu_passthrough": "${gpu_passthrough}",
"ram_speed": ${ram_speed:-0}, "ram_speed": "${ram_speed}",
"repo_source": "${REPO_SOURCE}" "repo_source": "${REPO_SOURCE}"
} }
EOF EOF
@@ -789,7 +789,7 @@ EOF
"gpu_vendor": "${gpu_vendor}", "gpu_vendor": "${gpu_vendor}",
"gpu_model": "${gpu_model}", "gpu_model": "${gpu_model}",
"gpu_passthrough": "${gpu_passthrough}", "gpu_passthrough": "${gpu_passthrough}",
"ram_speed": ${ram_speed:-0}, "ram_speed": "${ram_speed}",
"repo_source": "${REPO_SOURCE}" "repo_source": "${REPO_SOURCE}"
} }
EOF EOF
@@ -886,7 +886,7 @@ categorize_error() {
# Signal/Process errors (SIGTERM, SIGPIPE, SIGSEGV) # Signal/Process errors (SIGTERM, SIGPIPE, SIGSEGV)
139 | 141 | 143) echo "signal" ;; 139 | 141 | 143) echo "signal" ;;
# Shell errors (general error, syntax error) # Shell errors (general error, syntax error)
1 | 2) echo "shell" ;; 1 | 2) echo "shell" ;;
# Default - truly unknown # Default - truly unknown

View File

@@ -1913,7 +1913,7 @@ function fetch_and_deploy_codeberg_release() {
local app="$1" local app="$1"
local repo="$2" local repo="$2"
local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile | tag local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile | tag
local version="${4:-latest}" local version="${var_appversion:-${4:-latest}}"
local target="${5:-/opt/$app}" local target="${5:-/opt/$app}"
local asset_pattern="${6:-}" local asset_pattern="${6:-}"
@@ -2443,7 +2443,7 @@ function fetch_and_deploy_gh_release() {
local app="$1" local app="$1"
local repo="$2" local repo="$2"
local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile local mode="${3:-tarball}" # tarball | binary | prebuild | singlefile
local version="${4:-latest}" local version="${var_appversion:-${4:-latest}}"
local target="${5:-/opt/$app}" local target="${5:-/opt/$app}"
local asset_pattern="${6:-}" local asset_pattern="${6:-}"

View File

@@ -110,6 +110,11 @@ for container in $(pct list | awk '{if(NR>1) print $1}'); do
container_hostname=$(pct exec "$container" hostname) container_hostname=$(pct exec "$container" hostname)
containers_needing_reboot+=("$container ($container_hostname)") containers_needing_reboot+=("$container ($container_hostname)")
fi 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 fi
done done
wait wait