diff --git a/.github/changelogs/2026/06.md b/.github/changelogs/2026/06.md
index 93b3f0602..ddd1c030d 100644
--- a/.github/changelogs/2026/06.md
+++ b/.github/changelogs/2026/06.md
@@ -1,3 +1,130 @@
+## 2026-06-13
+
+### đ New Scripts
+
+ - BookOrbit ([#15080](https://github.com/community-scripts/ProxmoxVE/pull/15080))
+
+### đ Updated Scripts
+
+ - Update authentik version to 2026.5.3 [@thieneret](https://github.com/thieneret) ([#15093](https://github.com/community-scripts/ProxmoxVE/pull/15093))
+
+ - #### đ Bug Fixes
+
+ - Immich: Update image-processing libraries [@vhsdream](https://github.com/vhsdream) ([#15082](https://github.com/community-scripts/ProxmoxVE/pull/15082))
+ - HomeBox: Support v0.26.0 [@tomfrenzel](https://github.com/tomfrenzel) ([#15086](https://github.com/community-scripts/ProxmoxVE/pull/15086))
+
+ - #### đ§ Refactor
+
+ - Refactor: Implement backup functions for scripts A-B [@tremor021](https://github.com/tremor021) ([#15075](https://github.com/community-scripts/ProxmoxVE/pull/15075))
+
+## 2026-06-12
+
+### đ New Scripts
+
+ - Twenty ([#15047](https://github.com/community-scripts/ProxmoxVE/pull/15047))
+- Alpine-Cinny ([#15044](https://github.com/community-scripts/ProxmoxVE/pull/15044))
+
+### đž Core
+
+ - #### ⨠New Features
+
+ - [core] Implement backup and restore functions [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15067](https://github.com/community-scripts/ProxmoxVE/pull/15067))
+
+## 2026-06-11
+
+### đ New Scripts
+
+ - Clickhouse ([#15045](https://github.com/community-scripts/ProxmoxVE/pull/15045))
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Manyfold: add new dependency [@MickLesk](https://github.com/MickLesk) ([#15040](https://github.com/community-scripts/ProxmoxVE/pull/15040))
+ - OpenArchiver: switch Rebuild Function [@MickLesk](https://github.com/MickLesk) ([#15042](https://github.com/community-scripts/ProxmoxVE/pull/15042))
+ - CLIProxyAPI: Save management password to creds file [@tremor021](https://github.com/tremor021) ([#15051](https://github.com/community-scripts/ProxmoxVE/pull/15051))
+ - Jotty: Fix wrong path test in config restore [@vhsdream](https://github.com/vhsdream) ([#15038](https://github.com/community-scripts/ProxmoxVE/pull/15038))
+ - Fix for cross-seed after node upgrade [@TorinFrancis](https://github.com/TorinFrancis) ([#15025](https://github.com/community-scripts/ProxmoxVE/pull/15025))
+
+ - #### đ§ Refactor
+
+ - Alpine-Nextcloud: Upgrade PHP and dependencies in installation script [@MickLesk](https://github.com/MickLesk) ([#15039](https://github.com/community-scripts/ProxmoxVE/pull/15039))
+ - [arm64] porting stage 1: set script arm64 statuses to yes [@asylumexp](https://github.com/asylumexp) ([#15052](https://github.com/community-scripts/ProxmoxVE/pull/15052))
+
+### đž Core
+
+ - #### ⨠New Features
+
+ - misc scripts: add support for arm64 [@asylumexp](https://github.com/asylumexp) ([#12639](https://github.com/community-scripts/ProxmoxVE/pull/12639))
+
+ - #### đ§ Refactor
+
+ - [arm64] remove logic for custom debian arm64 template [@asylumexp](https://github.com/asylumexp) ([#15050](https://github.com/community-scripts/ProxmoxVE/pull/15050))
+
+### đ Documentation
+
+ - (github): Revise script request template [@MickLesk](https://github.com/MickLesk) ([#15058](https://github.com/community-scripts/ProxmoxVE/pull/15058))
+
+## 2026-06-10
+
+### đ New Scripts
+
+ - Baserow ([#14968](https://github.com/community-scripts/ProxmoxVE/pull/14968))
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Koillection: Fix update procedure [@tremor021](https://github.com/tremor021) ([#15033](https://github.com/community-scripts/ProxmoxVE/pull/15033))
+
+## 2026-06-09
+
+### đ New Scripts
+
+ - paperclip ([#14990](https://github.com/community-scripts/ProxmoxVE/pull/14990))
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - endurain: Install pytz package during backend setup [@MickLesk](https://github.com/MickLesk) ([#15014](https://github.com/community-scripts/ProxmoxVE/pull/15014))
+
+ - #### đ§ Refactor
+
+ - Refactor: Proxmox Backup Server - use deb822 [@MickLesk](https://github.com/MickLesk) ([#15013](https://github.com/community-scripts/ProxmoxVE/pull/15013))
+
+## 2026-06-08
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - security: Fix HTTP to HTTPS for all package and repository downloads [@MickLesk](https://github.com/MickLesk) ([#15009](https://github.com/community-scripts/ProxmoxVE/pull/15009))
+ - homelable: preserve MCP server config across updates [@ferr079](https://github.com/ferr079) ([#14996](https://github.com/community-scripts/ProxmoxVE/pull/14996))
+ - changedetection: migrate Python install to uv venv [@ferr079](https://github.com/ferr079) ([#14995](https://github.com/community-scripts/ProxmoxVE/pull/14995))
+
+ - #### đ§ Refactor
+
+ - Update Flowwiseai to node 24 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14999](https://github.com/community-scripts/ProxmoxVE/pull/14999))
+
+### đ§° Tools
+
+ - #### đ Bug Fixes
+
+ - security: Fix MITM RCE vulnerability in microcode scripts (CVE) [@MickLesk](https://github.com/MickLesk) ([#15007](https://github.com/community-scripts/ProxmoxVE/pull/15007))
+
+## 2026-06-07
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Immich: use actual installed PostgreSQL version for vchord package [@MickLesk](https://github.com/MickLesk) ([#14989](https://github.com/community-scripts/ProxmoxVE/pull/14989))
+
+ - #### đ§ Refactor
+
+ - Navidrome: remove genereic filebrowser addon setup [@MickLesk](https://github.com/MickLesk) ([#14991](https://github.com/community-scripts/ProxmoxVE/pull/14991))
+
## 2026-06-06
### đ New Scripts
diff --git a/.github/workflows/close-new-script-prs.yml b/.github/workflows/close-new-script-prs.yml
index d3541e21b..d7b6d2458 100644
--- a/.github/workflows/close-new-script-prs.yml
+++ b/.github/workflows/close-new-script-prs.yml
@@ -28,6 +28,7 @@ jobs:
const allowedBots = [
"push-app-to-main[bot]",
"push-app-to-main",
+ "community-scripts-pr-app"
];
if (allowedBots.includes(author)) {
diff --git a/.github/workflows/delete-pocketbase-entry-on-removal.yml b/.github/workflows/delete-pocketbase-entry-on-removal.yml
index 5e6fcee61..03056dc1e 100644
--- a/.github/workflows/delete-pocketbase-entry-on-removal.yml
+++ b/.github/workflows/delete-pocketbase-entry-on-removal.yml
@@ -27,6 +27,7 @@ jobs:
BEFORE="${{ github.event.before }}"
AFTER="${{ github.event.after }}"
slugs=""
+ ct_slugs=""
# Deleted JSON files: get slug from previous commit
deleted_json=$(git diff --name-only --diff-filter=D "$BEFORE" "$AFTER" -- json/ | grep '\.json$' || true)
@@ -37,6 +38,14 @@ jobs:
done
# Deleted script files: derive slug from path
+ deleted_ct=$(git diff --name-only --diff-filter=D "$BEFORE" "$AFTER" -- ct/ | grep '\.sh$' || true)
+ for f in $deleted_ct; do
+ [[ -z "$f" ]] && continue
+ base="${f##*/}"
+ base="${base%.sh}"
+ [[ -n "$base" ]] && ct_slugs="$ct_slugs $base"
+ done
+
deleted_sh=$(git diff --name-only --diff-filter=D "$BEFORE" "$AFTER" -- ct/ install/ tools/ turnkey/ vm/ | grep '\.sh$' || true)
for f in $deleted_sh; do
[[ -z "$f" ]] && continue
@@ -51,14 +60,17 @@ jobs:
done
slugs=$(echo $slugs | xargs -n1 | sort -u | tr '\n' ' ')
+ ct_slugs=$(echo $ct_slugs | xargs -n1 2>/dev/null | sort -u | tr '\n' ' ')
if [[ -z "$slugs" ]]; then
echo "No deleted JSON or script files to mark as deleted in PocketBase."
echo "count=0" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "$slugs" > slugs_to_delete.txt
+ echo "$ct_slugs" > ct_slugs_to_stub.txt
echo "count=$(echo $slugs | wc -w)" >> "$GITHUB_OUTPUT"
echo "Slugs to mark as deleted: $slugs"
+ [[ -n "$ct_slugs" ]] && echo "CT stubs to generate: $ct_slugs"
- name: Mark as deleted in PocketBase
if: steps.slugs.outputs.count != '0'
@@ -159,3 +171,134 @@ jobs:
})().catch(e => { console.error(e); process.exit(1); });
ENDSCRIPT
shell: bash
+
+ - name: Generate CT stubs for deleted scripts
+ if: steps.slugs.outputs.count != '0'
+ env:
+ POCKETBASE_URL: ${{ secrets.POCKETBASE_URL }}
+ POCKETBASE_COLLECTION: ${{ secrets.POCKETBASE_COLLECTION }}
+ POCKETBASE_ADMIN_EMAIL: ${{ secrets.POCKETBASE_ADMIN_EMAIL }}
+ POCKETBASE_ADMIN_PASSWORD: ${{ secrets.POCKETBASE_ADMIN_PASSWORD }}
+ run: |
+ if [[ ! -s ct_slugs_to_stub.txt ]]; then
+ echo "No deleted ct/*.sh files; skipping stub generation."
+ exit 0
+ fi
+ node << 'ENDSCRIPT'
+ (async function() {
+ const fs = require('fs');
+ const https = require('https');
+ const http = require('http');
+ const path = require('path');
+ const url = require('url');
+
+ function request(fullUrl, opts, redirectCount) {
+ redirectCount = redirectCount || 0;
+ return new Promise(function(resolve, reject) {
+ const u = url.parse(fullUrl);
+ const isHttps = u.protocol === 'https:';
+ const body = opts.body;
+ const options = {
+ hostname: u.hostname,
+ port: u.port || (isHttps ? 443 : 80),
+ path: u.path,
+ method: opts.method || 'GET',
+ headers: opts.headers || {}
+ };
+ if (body) options.headers['Content-Length'] = Buffer.byteLength(body);
+ const lib = isHttps ? https : http;
+ const req = lib.request(options, function(res) {
+ if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
+ if (redirectCount >= 5) return reject(new Error('Too many redirects from ' + fullUrl));
+ const redirectUrl = url.resolve(fullUrl, res.headers.location);
+ res.resume();
+ resolve(request(redirectUrl, opts, redirectCount + 1));
+ return;
+ }
+ let data = '';
+ res.on('data', function(chunk) { data += chunk; });
+ res.on('end', function() {
+ resolve({ ok: res.statusCode >= 200 && res.statusCode < 300, statusCode: res.statusCode, body: data });
+ });
+ });
+ req.on('error', reject);
+ if (body) req.write(body);
+ req.end();
+ });
+ }
+
+ const raw = process.env.POCKETBASE_URL.replace(/\/$/, '');
+ const apiBase = /\/api$/i.test(raw) ? raw : raw + '/api';
+ const coll = process.env.POCKETBASE_COLLECTION;
+ const ctSlugs = fs.readFileSync('ct_slugs_to_stub.txt', 'utf8').trim().split(/\s+/).filter(Boolean);
+ if (!ctSlugs.length) {
+ console.log('No ct slugs to process.');
+ return;
+ }
+
+ const authRes = await request(apiBase + '/collections/users/auth-with-password', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ identity: process.env.POCKETBASE_ADMIN_EMAIL,
+ password: process.env.POCKETBASE_ADMIN_PASSWORD
+ })
+ });
+ if (!authRes.ok) throw new Error('Auth failed: ' + authRes.body);
+ const token = JSON.parse(authRes.body).token;
+ const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
+
+ for (const slug of ctSlugs) {
+ const filter = "(slug='" + slug + "')";
+ const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1&fields=slug,name,deleted_message', {
+ headers: { 'Authorization': token }
+ });
+ if (!listRes.ok) {
+ console.warn('Failed to fetch record for slug "' + slug + '"');
+ continue;
+ }
+ const list = JSON.parse(listRes.body);
+ const rec = list.items && list.items[0];
+ const appName = (rec && rec.name) ? rec.name : slug;
+ const deletedMessage = (rec && rec.deleted_message && rec.deleted_message.trim())
+ ? rec.deleted_message.trim()
+ : 'This script was removed and cannot be installed or updated.';
+
+ const stubPath = path.join('ct', slug + '.sh');
+ const content =
+`#!/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
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+APP="${appName.replace(/"/g, '\\"')}"
+
+header_info "$APP"
+variables
+color
+
+msg_error "This script is no longer available in community-scripts."
+msg_error "${deletedMessage.replace(/"/g, '\\"')}"
+msg_warn "More info: https://community-scripts.org/scripts/${slug}"
+exit 1
+`;
+ fs.writeFileSync(stubPath, content);
+ console.log('Generated stub: ' + stubPath);
+ }
+ })().catch(e => { console.error(e); process.exit(1); });
+ ENDSCRIPT
+ shell: bash
+
+ - name: Commit generated stubs
+ if: steps.slugs.outputs.count != '0'
+ run: |
+ if git diff --quiet -- ct; then
+ echo "No generated ct stubs to commit."
+ exit 0
+ fi
+ git config user.name "github-actions[bot]"
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+ git add ct/*.sh
+ git commit -m "chore: add deleted script stubs"
+ git push
+ shell: bash
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1b97d8760..c2cdefe39 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -62,6 +62,9 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+
+
+
@@ -75,7 +78,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
-June (6 entries)
+June (13 entries)
[View June 2026 Changelog](.github/changelogs/2026/06.md)
@@ -480,6 +483,117 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+## 2026-06-18
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - flowise: add deps / uv / python 3.11 [@MickLesk](https://github.com/MickLesk) ([#15177](https://github.com/community-scripts/ProxmoxVE/pull/15177))
+
+ - #### đĨ Breaking Changes
+
+ - refactor: crafty-controller [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15178](https://github.com/community-scripts/ProxmoxVE/pull/15178))
+
+## 2026-06-17
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - kasm: fix release detection [@CrazyWolf13](https://github.com/CrazyWolf13) ([#15151](https://github.com/community-scripts/ProxmoxVE/pull/15151))
+
+ - #### ⨠New Features
+
+ - trek: update install and upgrade workflow for v3.1.0 [@MickLesk](https://github.com/MickLesk) ([#15165](https://github.com/community-scripts/ProxmoxVE/pull/15165))
+
+ - #### đĨ Breaking Changes
+
+ - TREK: Pin version [@tremor021](https://github.com/tremor021) ([#15156](https://github.com/community-scripts/ProxmoxVE/pull/15156))
+
+ - #### đ§ Refactor
+
+ - chore(paperless-ngx): pin version to prevent v3 update [@tomfrenzel](https://github.com/tomfrenzel) ([#15171](https://github.com/community-scripts/ProxmoxVE/pull/15171))
+
+### đ§° Tools
+
+ - #### đ Bug Fixes
+
+ - immich public proxy: replace npm install with npm ci for consistent dependency installation [@MickLesk](https://github.com/MickLesk) ([#15166](https://github.com/community-scripts/ProxmoxVE/pull/15166))
+
+## 2026-06-16
+
+### đ New Scripts
+
+ - Feishin ([#15130](https://github.com/community-scripts/ProxmoxVE/pull/15130))
+- Kiwix ([#15131](https://github.com/community-scripts/ProxmoxVE/pull/15131))
+- Add runtime status guard and deleted script stubs [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15125](https://github.com/community-scripts/ProxmoxVE/pull/15125))
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - fix(degoog): use localhost for valkey url [@ethan-hgwr](https://github.com/ethan-hgwr) ([#15149](https://github.com/community-scripts/ProxmoxVE/pull/15149))
+ - Fix InvoiceShelf install/update Yarn package manager mismatch [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15141](https://github.com/community-scripts/ProxmoxVE/pull/15141))
+ - fix storyteller install failure with yarn 4 corepack [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15140](https://github.com/community-scripts/ProxmoxVE/pull/15140))
+ - fix: generate policy-compliant OpenObserve root password [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15137](https://github.com/community-scripts/ProxmoxVE/pull/15137))
+
+## 2026-06-15
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Watcharr: Clean install on update [@tremor021](https://github.com/tremor021) ([#15119](https://github.com/community-scripts/ProxmoxVE/pull/15119))
+ - Vaultwarden: extend version check for VaultWarden update [@MickLesk](https://github.com/MickLesk) ([#15105](https://github.com/community-scripts/ProxmoxVE/pull/15105))
+
+ - #### ⨠New Features
+
+ - degoog: add curl-impersonate to script [@MickLesk](https://github.com/MickLesk) ([#15117](https://github.com/community-scripts/ProxmoxVE/pull/15117))
+
+### đž Core
+
+ - #### ⨠New Features
+
+ - tools.func: extend mesa-vulkan-drivers and vulkan-tools to installation for ARC GPU's [@MickLesk](https://github.com/MickLesk) ([#15106](https://github.com/community-scripts/ProxmoxVE/pull/15106))
+
+ - #### đ§ Refactor
+
+ - core: improve mirror selection and error handling [@MickLesk](https://github.com/MickLesk) ([#15108](https://github.com/community-scripts/ProxmoxVE/pull/15108))
+ - core: implement gateway validation for DHCP and static networks [@MickLesk](https://github.com/MickLesk) ([#15107](https://github.com/community-scripts/ProxmoxVE/pull/15107))
+
+## 2026-06-14
+
+### đ Updated Scripts
+
+ - #### đ Bug Fixes
+
+ - Iinvoiceninja: fix nginx setup assets port [@MickLesk](https://github.com/MickLesk) ([#15090](https://github.com/community-scripts/ProxmoxVE/pull/15090))
+ - CheckMK: remove stale backup site before creating new backup during update [@MickLesk](https://github.com/MickLesk) ([#15088](https://github.com/community-scripts/ProxmoxVE/pull/15088))
+
+ - #### đ§ Refactor
+
+ - Refactor: Implement backup functions for scripts C-D [@tremor021](https://github.com/tremor021) ([#15096](https://github.com/community-scripts/ProxmoxVE/pull/15096))
+
+## 2026-06-13
+
+### đ New Scripts
+
+ - BookOrbit ([#15080](https://github.com/community-scripts/ProxmoxVE/pull/15080))
+
+### đ Updated Scripts
+
+ - Update authentik version to 2026.5.3 [@thieneret](https://github.com/thieneret) ([#15093](https://github.com/community-scripts/ProxmoxVE/pull/15093))
+
+ - #### đ Bug Fixes
+
+ - Immich: Update image-processing libraries [@vhsdream](https://github.com/vhsdream) ([#15082](https://github.com/community-scripts/ProxmoxVE/pull/15082))
+ - HomeBox: Support v0.26.0 [@tomfrenzel](https://github.com/tomfrenzel) ([#15086](https://github.com/community-scripts/ProxmoxVE/pull/15086))
+
+ - #### đ§ Refactor
+
+ - Refactor: Implement backup functions for scripts A-B [@tremor021](https://github.com/tremor021) ([#15075](https://github.com/community-scripts/ProxmoxVE/pull/15075))
+
## 2026-06-12
### đ New Scripts
@@ -1030,124 +1144,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- #### đ Bug Fixes
- - core: fall back to silent mode when no TTY or whiptail unavailable [@MickLesk](https://github.com/MickLesk) ([#14497](https://github.com/community-scripts/ProxmoxVE/pull/14497))
-
-## 2026-05-14
-
-### đ New Scripts
-
- - CLIProxyAPI ([#14443](https://github.com/community-scripts/ProxmoxVE/pull/14443))
-
-## 2026-05-13
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - Fix: Broken Manifold update [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#14468](https://github.com/community-scripts/ProxmoxVE/pull/14468))
- - SoulSync: Fix update function [@tremor021](https://github.com/tremor021) ([#14465](https://github.com/community-scripts/ProxmoxVE/pull/14465))
- - Reactive-Resume: fix PDF generation timeout in LXC containers [@MickLesk](https://github.com/MickLesk) ([#14416](https://github.com/community-scripts/ProxmoxVE/pull/14416))
- - (calibre-web) Add --no-sandbox for PDF conversion [@jamesmyatt](https://github.com/jamesmyatt) ([#14461](https://github.com/community-scripts/ProxmoxVE/pull/14461))
-
-### đž Core
-
- - #### đ§ Refactor
-
- - tools.func: encode GitHub tag, refine pin logic, add Codeberg [@MickLesk](https://github.com/MickLesk) ([#14473](https://github.com/community-scripts/ProxmoxVE/pull/14473))
-
-## 2026-05-12
-
-### đ New Scripts
-
- - DocuSeal ([#14445](https://github.com/community-scripts/ProxmoxVE/pull/14445))
-- Authentik ([#14440](https://github.com/community-scripts/ProxmoxVE/pull/14440))
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - Save Omada version [@lucacome](https://github.com/lucacome) ([#14433](https://github.com/community-scripts/ProxmoxVE/pull/14433))
-
- - #### ⨠New Features
-
- - OpenCloud: bump version to 6.2.0 [@vhsdream](https://github.com/vhsdream) ([#14451](https://github.com/community-scripts/ProxmoxVE/pull/14451))
-
- - #### đ§ Refactor
-
- - misc: bump node versions [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14447](https://github.com/community-scripts/ProxmoxVE/pull/14447))
-
-## 2026-05-11
-
-### đ New Scripts
-
- - Lychee ([#14424](https://github.com/community-scripts/ProxmoxVE/pull/14424))
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - Termix: fix nginx pid path and log paths on update (#) [@MickLesk](https://github.com/MickLesk) ([#14419](https://github.com/community-scripts/ProxmoxVE/pull/14419))
- - Nginxproxymanager: restore NPM nginx.conf after OpenResty rebuid [@MickLesk](https://github.com/MickLesk) ([#14421](https://github.com/community-scripts/ProxmoxVE/pull/14421))
-
- - #### đ§ Refactor
-
- - InvestBrain: add commented reverse proxy config hints to .env [@MickLesk](https://github.com/MickLesk) ([#14422](https://github.com/community-scripts/ProxmoxVE/pull/14422))
-
-### đ§° Tools
-
- - #### đ Bug Fixes
-
- - Cronmaster: fix unexpected EOF in update_cronmaster script [@MickLesk](https://github.com/MickLesk) ([#14420](https://github.com/community-scripts/ProxmoxVE/pull/14420))
-
-## 2026-05-10
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - Save Beszel version [@lucacome](https://github.com/lucacome) ([#14389](https://github.com/community-scripts/ProxmoxVE/pull/14389))
- - karakeep: Fix SERVER_VERSION update [@MickLesk](https://github.com/MickLesk) ([#14378](https://github.com/community-scripts/ProxmoxVE/pull/14378))
- - inspIRCd: Fix service not autostarting [@tremor021](https://github.com/tremor021) ([#14368](https://github.com/community-scripts/ProxmoxVE/pull/14368))
-
- - #### đ§ Refactor
-
- - refactor: webcheck [@CrazyWolf13](https://github.com/CrazyWolf13) ([#14391](https://github.com/community-scripts/ProxmoxVE/pull/14391))
-
-### đž Core
-
- - #### đ Bug Fixes
-
- - [tools.func]: Pin `pnpm` version [@tremor021](https://github.com/tremor021) ([#14386](https://github.com/community-scripts/ProxmoxVE/pull/14386))
-
-## 2026-05-09
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - FlowiseAI: Migrate to pnpm [@MickLesk](https://github.com/MickLesk) ([#14344](https://github.com/community-scripts/ProxmoxVE/pull/14344))
- - Purge openresty [@lucacome](https://github.com/lucacome) ([#14353](https://github.com/community-scripts/ProxmoxVE/pull/14353))
- - Check for release for Sonarr [@lucacome](https://github.com/lucacome) ([#14354](https://github.com/community-scripts/ProxmoxVE/pull/14354))
- - fix(termix-install.sh): add tmpfiles.d persistence and systemd PIDFile path [@runnylogan](https://github.com/runnylogan) ([#14350](https://github.com/community-scripts/ProxmoxVE/pull/14350))
- - ERPNext: start bench Redis services before bench new-site [@MickLesk](https://github.com/MickLesk) ([#14343](https://github.com/community-scripts/ProxmoxVE/pull/14343))
- - [Hotfix]Jotty: use absolute path when creating data dir [@vhsdream](https://github.com/vhsdream) ([#14355](https://github.com/community-scripts/ProxmoxVE/pull/14355))
-
-## 2026-05-08
-
-### đ Updated Scripts
-
- - #### đ Bug Fixes
-
- - wishlist: pin pnpm to v10 to match engine requirements [@MickLesk](https://github.com/MickLesk) ([#14342](https://github.com/community-scripts/ProxmoxVE/pull/14342))
- - [pelican] fix env copy regression [@LetterN](https://github.com/LetterN) ([#14328](https://github.com/community-scripts/ProxmoxVE/pull/14328))
- - fix(homepage): fix ERR_PNPM_IGNORED_BUILDS error [@Sergih28](https://github.com/Sergih28) ([#14315](https://github.com/community-scripts/ProxmoxVE/pull/14315))
-
- - #### ⨠New Features
-
- - tools.func: add setup_nltk as new function [@MickLesk](https://github.com/MickLesk) ([#14314](https://github.com/community-scripts/ProxmoxVE/pull/14314))
-
-### đž Core
-
- - #### đ Bug Fixes
-
- - tools.func: fix meilisearch import-dump background process handling [@MickLesk](https://github.com/MickLesk) ([#14341](https://github.com/community-scripts/ProxmoxVE/pull/14341))
\ No newline at end of file
+ - core: fall back to silent mode when no TTY or whiptail unavailable [@MickLesk](https://github.com/MickLesk) ([#14497](https://github.com/community-scripts/ProxmoxVE/pull/14497))
\ No newline at end of file
diff --git a/ct/2fauth.sh b/ct/2fauth.sh
index 3906ec971..506f140d8 100644
--- a/ct/2fauth.sh
+++ b/ct/2fauth.sh
@@ -35,8 +35,10 @@ function update_script() {
$STD apt -y upgrade
msg_info "Creating Backup"
- rm -rf /opt/2fauth-backup
- mv /opt/2fauth /opt/2fauth-backup
+ create_backup \
+ /opt/2fauth/.env \
+ /opt/2fauth/storage
+
if ! dpkg -l | grep -q 'php8.4'; then
cp /etc/nginx/conf.d/2fauth.conf /etc/nginx/conf.d/2fauth.conf.bak
fi
@@ -46,11 +48,13 @@ function update_script() {
PHP_VERSION="8.4" PHP_FPM="YES" setup_php
sed -i 's/php8\.[0-9]/php8.4/g' /etc/nginx/conf.d/2fauth.conf
fi
+
fetch_and_deploy_gh_release "2fauth" "Bubka/2FAuth" "tarball"
setup_composer
- cp /opt/2fauth-backup/.env /opt/2fauth/.env
- cp -r /opt/2fauth-backup/storage /opt/2fauth/storage
- cd /opt/2fauth || return
+ restore_backup
+
+ msg_info "Configuring 2FAuth"
+ cd /opt/2fauth
export COMPOSER_ALLOW_SUPERUSER=1
$STD composer install --no-dev --prefer-dist
php artisan 2fauth:install
@@ -58,7 +62,7 @@ function update_script() {
chmod -R 755 /opt/2fauth
$STD systemctl restart php8.4-fpm
$STD systemctl restart nginx
- rm -rf /opt/2fauth-backup
+ msg_ok "Configured 2FAuth"
msg_ok "Updated successfully!"
fi
exit
diff --git a/ct/adventurelog.sh b/ct/adventurelog.sh
index f794d7f95..0da4c09c0 100644
--- a/ct/adventurelog.sh
+++ b/ct/adventurelog.sh
@@ -35,10 +35,8 @@ function update_script() {
systemctl stop adventurelog-frontend
msg_ok "Services Stopped"
- msg_info "Backup Old Installation"
- cp -r /opt/adventurelog /opt/adventurelog-backup
- rm -rf /opt/adventurelog
- msg_ok "Backup done"
+ create_backup /opt/adventurelog/backend/server/.env \
+ /opt/adventurelog/backend/server/media
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog" "tarball"
PYTHON_VERSION="3.13" setup_uv
@@ -47,9 +45,9 @@ function update_script() {
$STD sudo -u postgres psql -d adventurelog_db -c "CREATE EXTENSION IF NOT EXISTS postgis;"
msg_ok "PostgreSQL Extensions Ready"
- msg_info "Updating ${APP}"
- cp /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
- cp -r /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
+ restore_backup
+
+ msg_info "Updating AdventureLog"
cd /opt/adventurelog/backend/server
if [[ ! -x .venv/bin/python ]]; then
$STD uv venv --clear .venv
@@ -61,12 +59,10 @@ function update_script() {
$STD .venv/bin/python -m manage collectstatic --noinput
$STD .venv/bin/python -m manage migrate
- cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
cd /opt/adventurelog/frontend
$STD pnpm i
$STD pnpm build
- rm -rf /opt/adventurelog-backup
- msg_ok "Updated ${APP}"
+ msg_ok "Updated AdventureLog"
msg_info "Starting Services"
systemctl daemon-reexec
diff --git a/ct/ampache.sh b/ct/ampache.sh
index cb5738f46..92eb11a70 100644
--- a/ct/ampache.sh
+++ b/ct/ampache.sh
@@ -34,24 +34,16 @@ function update_script() {
systemctl stop apache2
msg_ok "Stopped Service"
- msg_info "Creating Backup"
- cp /opt/ampache/config/ampache.cfg.php /tmp/ampache.cfg.php.backup
- cp /opt/ampache/public/rest/.htaccess /tmp/ampache_rest.htaccess.backup
- cp /opt/ampache/public/play/.htaccess /tmp/ampache_play.htaccess.backup
- rm -rf /opt/ampache_backup
- mv /opt/ampache /opt/ampache_backup
- msg_ok "Created Backup"
+ create_backup /opt/ampache/config/ampache.cfg.php \
+ /opt/ampache/public/rest/.htaccess \
+ /opt/ampache/public/play/.htaccess \
+ /opt/ampache/advanced-config
fetch_and_deploy_gh_release "Ampache" "ampache/ampache" "prebuild" "latest" "/opt/ampache" "ampache-*_all_php8.4.zip"
- msg_info "Restoring Backup"
- cp /tmp/ampache.cfg.php.backup /opt/ampache/config/ampache.cfg.php
- cp /tmp/ampache_rest.htaccess.backup /opt/ampache/public/rest/.htaccess
- cp /tmp/ampache_play.htaccess.backup /opt/ampache/public/play/.htaccess
+ restore_backup
chmod 664 /opt/ampache/public/rest/.htaccess /opt/ampache/public/play/.htaccess
chown -R www-data:www-data /opt/ampache
- rm -f /tmp/ampache*.backup
- msg_ok "Restored Configuration"
msg_info "Starting Service"
systemctl start apache2
diff --git a/ct/anchor.sh b/ct/anchor.sh
index 58b912bb1..45ae5aaf9 100644
--- a/ct/anchor.sh
+++ b/ct/anchor.sh
@@ -35,9 +35,7 @@ function update_script() {
systemctl stop anchor-web anchor-server
msg_ok "Stopped Services"
- msg_info "Backing up Configuration"
- cp /opt/anchor/.env /opt/anchor.env.bak
- msg_ok "Backed up Configuration"
+ create_backup /opt/anchor/.env
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "anchor" "ZhFahim/anchor" "tarball"
@@ -57,8 +55,7 @@ function update_script() {
cp -r public .next/standalone/public
msg_ok "Built Web Interface"
- cp /opt/anchor.env.bak /opt/anchor/.env
- rm -f /opt/anchor.env.bak
+ restore_backup
msg_info "Running Database Migrations"
cd /opt/anchor/server
diff --git a/ct/anytype-server.sh b/ct/anytype-server.sh
index e1711c267..fdee48529 100644
--- a/ct/anytype-server.sh
+++ b/ct/anytype-server.sh
@@ -36,17 +36,12 @@ function update_script() {
systemctl stop anytype
msg_ok "Stopped Service"
- msg_info "Backing up Data"
- cp -r /opt/anytype/data /opt/anytype_data_backup
- msg_ok "Backed up Data"
+ create_backup /opt/anytype/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "anytype" "grishy/any-sync-bundle" "prebuild" "latest" "/opt/anytype" "any-sync-bundle_*_linux_$(get_arch_value).tar.gz"
chmod +x /opt/anytype/any-sync-bundle
- msg_info "Restoring Data"
- cp -r /opt/anytype_data_backup/. /opt/anytype/data
- rm -rf /opt/anytype_data_backup
- msg_ok "Restored Data"
+ restore_backup
msg_info "Starting Service"
systemctl start anytype
diff --git a/ct/apache-tomcat.sh b/ct/apache-tomcat.sh
index 0b56b54f1..0b605c6b5 100644
--- a/ct/apache-tomcat.sh
+++ b/ct/apache-tomcat.sh
@@ -26,26 +26,26 @@ function update_script() {
check_container_resources
TOMCAT_DIR=$(ls -d /opt/tomcat-* 2>/dev/null | head -n1)
- if [[ -z "$TOMCAT_DIR" || ! -d "$TOMCAT_DIR" ]]; then
+ if [[ -z $TOMCAT_DIR || ! -d $TOMCAT_DIR ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
# Detect major version and current version from install path (e.g., /opt/tomcat-11 -> 11)
TOMCAT_MAJOR=$(basename "$TOMCAT_DIR" | grep -oP 'tomcat-\K[0-9]+')
- if [[ -z "$TOMCAT_MAJOR" ]]; then
+ if [[ -z $TOMCAT_MAJOR ]]; then
msg_error "Cannot determine Tomcat major version from path: $TOMCAT_DIR"
exit
fi
CURRENT_VERSION=$(grep -oP 'Apache Tomcat Version \K[0-9.]+' "$TOMCAT_DIR/RELEASE-NOTES" 2>/dev/null || echo "unknown")
LATEST_VERSION=$(curl -fsSL "https://dlcdn.apache.org/tomcat/tomcat-${TOMCAT_MAJOR}/" | grep -oP 'v[0-9]+\.[0-9]+\.[0-9]+(-M[0-9]+)?/' | sort -V | tail -n1 | sed 's/\/$//; s/v//')
- if [[ -z "$LATEST_VERSION" ]]; then
+ if [[ -z $LATEST_VERSION ]]; then
msg_error "Failed to fetch latest version for Tomcat ${TOMCAT_MAJOR}"
exit
fi
- if [[ "$CURRENT_VERSION" == "$LATEST_VERSION" ]]; then
+ if [[ $CURRENT_VERSION == "$LATEST_VERSION" ]]; then
msg_ok "${APP} ${CURRENT_VERSION} is already up to date"
exit
fi
@@ -54,13 +54,9 @@ function update_script() {
systemctl stop tomcat
msg_ok "Stopped Tomcat service"
- msg_info "Backing up configuration and applications"
- BACKUP_DIR="/tmp/tomcat-backup-$$"
- mkdir -p "$BACKUP_DIR"
- cp -a "$TOMCAT_DIR/conf" "$BACKUP_DIR/conf"
- cp -a "$TOMCAT_DIR/webapps" "$BACKUP_DIR/webapps"
- [[ -d "$TOMCAT_DIR/lib" ]] && cp -a "$TOMCAT_DIR/lib" "$BACKUP_DIR/lib"
- msg_ok "Backed up configuration and applications"
+ create_backup $TOMCAT_DIR/conf
+ [[ -d $TOMCAT_DIR/webapps ]] && create_backup $TOMCAT_DIR/webapps
+ [[ -d $TOMCAT_DIR/lib ]] && create_backup $TOMCAT_DIR/lib
msg_info "Downloading Tomcat ${LATEST_VERSION}"
TOMCAT_URL="https://dlcdn.apache.org/tomcat/tomcat-${TOMCAT_MAJOR}/v${LATEST_VERSION}/bin/apache-tomcat-${LATEST_VERSION}.tar.gz"
@@ -78,7 +74,7 @@ function update_script() {
cp -a "$BACKUP_DIR/webapps"/* "$TOMCAT_DIR/webapps/" 2>/dev/null || true
if [[ -d "$BACKUP_DIR/lib" ]]; then
for jar in "$BACKUP_DIR/lib"/*.jar; do
- [[ -f "$jar" ]] || continue
+ [[ -f $jar ]] || continue
jar_name=$(basename "$jar")
if [[ ! -f "$TOMCAT_DIR/lib/$jar_name" ]]; then
cp "$jar" "$TOMCAT_DIR/lib/"
diff --git a/ct/authentik.sh b/ct/authentik.sh
index f3ce0f014..bbd7965c2 100644
--- a/ct/authentik.sh
+++ b/ct/authentik.sh
@@ -42,7 +42,7 @@ function update_script() {
RUST_PROFILE="minimal" RUST_TOOLCHAIN="stable" setup_rust
setup_yq
- AUTHENTIK_VERSION="version/2026.5.2"
+ AUTHENTIK_VERSION="version/2026.5.3"
# Source: https://github.com/goauthentik/fips/blob/main/Makefile#L26
XMLSEC_VERSION="1.3.11"
diff --git a/ct/babybuddy.sh b/ct/babybuddy.sh
index 66d5f71f7..29fc7703a 100644
--- a/ct/babybuddy.sh
+++ b/ct/babybuddy.sh
@@ -37,16 +37,17 @@ function update_script() {
systemctl stop uwsgi
msg_ok "Services Stopped"
+ create_backup /opt/babybuddy/babybuddy/settings/production.py
+
msg_info "Cleaning old files"
- cp /opt/babybuddy/babybuddy/settings/production.py /tmp/production.py.bak
find . -mindepth 1 -maxdepth 1 ! -name '.venv' -exec rm -rf {} +
msg_ok "Cleaned old files"
fetch_and_deploy_gh_release "babybuddy" "babybuddy/babybuddy" "tarball"
+ restore_backup
msg_info "Updating ${APP}"
cd /opt/babybuddy
- mv /tmp/production.py.bak /opt/babybuddy/babybuddy/settings/production.py
source .venv/bin/activate
$STD uv pip install -r requirements.txt
export DJANGO_SETTINGS_MODULE=babybuddy.settings.production
diff --git a/ct/baikal.sh b/ct/baikal.sh
index cc568f039..74550dd8e 100644
--- a/ct/baikal.sh
+++ b/ct/baikal.sh
@@ -34,22 +34,19 @@ function update_script() {
systemctl stop apache2
msg_ok "Stopped Service"
- msg_info "Backing up data"
- mv /opt/baikal /opt/baikal-backup
- msg_ok "Backed up data"
+ create_backup /opt/baikal/config/baikal.yaml \
+ /opt/baikal/Specific/
PHP_APACHE="YES" PHP_VERSION="8.3" setup_php
setup_composer
fetch_and_deploy_gh_release "baikal" "sabre-io/Baikal" "tarball"
-
- msg_info "Configuring Baikal"
- cp -r /opt/baikal-backup/config/baikal.yaml /opt/baikal/config/
- cp -r /opt/baikal-backup/Specific/ /opt/baikal/
+ restore_backup
chown -R www-data:www-data /opt/baikal/
chmod -R 755 /opt/baikal/
+
+ msg_info "Configuring Baikal"
cd /opt/baikal
$STD composer install
- rm -rf /opt/baikal-backup
msg_ok "Configured Baikal"
msg_info "Starting Service"
diff --git a/ct/bambuddy.sh b/ct/bambuddy.sh
index b80a05c38..470cd2055 100644
--- a/ct/bambuddy.sh
+++ b/ct/bambuddy.sh
@@ -38,11 +38,11 @@ function update_script() {
msg_ok "Stopped Service"
msg_info "Backing up Configuration and Data"
- cp /opt/bambuddy/.env /opt/bambuddy.env.bak
- cp -r /opt/bambuddy/data /opt/bambuddy_data_bak
- [[ -f /opt/bambuddy/bambuddy.db ]] && cp /opt/bambuddy/bambuddy.db /opt/bambuddy.db.bak
- [[ -f /opt/bambuddy/bambutrack.db ]] && cp /opt/bambuddy/bambutrack.db /opt/bambutrack.db.bak
- [[ -d /opt/bambuddy/archive ]] && cp -r /opt/bambuddy/archive /opt/bambuddy_archive_bak
+ create_backup /opt/bambuddy/.env \
+ /opt/bambuddy/data \
+ /opt/bambuddy/bambuddy.db \
+ /opt/bambuddy/bambutrack.db \
+ /opt/bambuddy/archive
msg_ok "Backed up Configuration and Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bambuddy" "maziggy/bambuddy" "tarball" "latest" "/opt/bambuddy"
@@ -59,19 +59,7 @@ function update_script() {
$STD npm run build
msg_ok "Rebuilt Frontend"
- msg_info "Restoring Configuration and Data"
- mkdir -p /opt/bambuddy/data
- cp /opt/bambuddy.env.bak /opt/bambuddy/.env
- cp -r /opt/bambuddy_data_bak/. /opt/bambuddy/data/
- [[ -f /opt/bambuddy.db.bak ]] && cp /opt/bambuddy.db.bak /opt/bambuddy/bambuddy.db
- [[ -f /opt/bambutrack.db.bak ]] && cp /opt/bambutrack.db.bak /opt/bambuddy/bambutrack.db
- if [[ -d /opt/bambuddy_archive_bak ]]; then
- mkdir -p /opt/bambuddy/archive
- cp -r /opt/bambuddy_archive_bak/. /opt/bambuddy/archive/
- fi
- rm -f /opt/bambuddy.env.bak /opt/bambuddy.db.bak /opt/bambutrack.db.bak
- rm -rf /opt/bambuddy_data_bak /opt/bambuddy_archive_bak
- msg_ok "Restored Configuration and Data"
+ restore_backup
msg_info "Starting Service"
systemctl start bambuddy
diff --git a/ct/bar-assistant.sh b/ct/bar-assistant.sh
index be0b90f24..d38393ef0 100644
--- a/ct/bar-assistant.sh
+++ b/ct/bar-assistant.sh
@@ -37,16 +37,15 @@ function update_script() {
PHP_VERSION="8.4" PHP_FPM="YES" PHP_MODULE="pdo-sqlite" setup_php
- msg_info "Backing up Bar Assistant"
- mv /opt/bar-assistant /opt/bar-assistant-backup
- msg_ok "Backed up Bar Assistant"
+ create_backup /opt/bar-assistant/.env \
+ /opt/bar-assistant/storage/bar-assistant
fetch_and_deploy_gh_release "bar-assistant" "karlomikus/bar-assistant" "tarball" "latest" "/opt/bar-assistant"
setup_composer
- msg_info "Updating Bar-Assistant"
- cp -r /opt/bar-assistant-backup/.env /opt/bar-assistant/.env
- cp -r /opt/bar-assistant-backup/storage/bar-assistant /opt/bar-assistant/storage/bar-assistant
+ restore_backup
+
+ msg_info "Configuring Bar-Assistant"
cd /opt/bar-assistant
$STD composer install --no-interaction
$STD php artisan migrate --force
@@ -57,8 +56,7 @@ function update_script() {
$STD php artisan route:cache
$STD php artisan event:cache
chown -R www-data:www-data /opt/bar-assistant
- rm -rf /opt/bar-assistant-backup
- msg_ok "Updated Bar-Assistant"
+ msg_ok "Configured Bar-Assistant"
msg_info "Starting nginx"
systemctl start nginx
@@ -66,23 +64,21 @@ function update_script() {
fi
if check_for_gh_release "vue-salt-rim" "karlomikus/vue-salt-rim"; then
- msg_info "Backing up Vue Salt Rim"
- mv /opt/vue-salt-rim /opt/vue-salt-rim-backup
- msg_ok "Backed up Vue Salt Rim"
+
+ create_backup /opt/vue-salt-rim/public/config.js
msg_info "Stopping nginx"
systemctl stop nginx
msg_ok "Stopped nginx"
fetch_and_deploy_gh_release "vue-salt-rim" "karlomikus/vue-salt-rim" "tarball" "latest" "/opt/vue-salt-rim"
+ restore_backup
- msg_info "Updating Vue Salt Rim"
- cp /opt/vue-salt-rim-backup/public/config.js /opt/vue-salt-rim/public/config.js
+ msg_info "Configuring Vue Salt Rim"
cd /opt/vue-salt-rim
$STD npm install
$STD npm run build
- rm -rf /opt/vue-salt-rim-backup
- msg_ok "Updated Vue Salt Rim"
+ msg_ok "Configured Vue Salt Rim"
msg_info "Starting nginx"
systemctl start nginx
diff --git a/ct/baserow.sh b/ct/baserow.sh
index 34ce68ccf..fa0d044db 100644
--- a/ct/baserow.sh
+++ b/ct/baserow.sh
@@ -35,27 +35,20 @@ function update_script() {
systemctl stop baserow-backend baserow-celery baserow-celery-beat baserow-celery-export baserow-frontend
msg_ok "Stopped Services"
- msg_info "Backing up Data"
- cp /opt/baserow/.env /opt/baserow.env.bak
- msg_ok "Backed up Data"
-
+ create_backup /opt/baserow/.env
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "baserow" "baserow/baserow" "tarball"
+ restore_backup
- msg_info "Restoring Configuration"
- cp /opt/baserow.env.bak /opt/baserow/.env
- rm -f /opt/baserow.env.bak
- msg_ok "Restored Configuration"
-
- msg_info "Updating Backend Dependencies"
+ msg_info "Configuring Baserow"
cd /opt/baserow/backend
$STD uv sync --frozen --no-dev
- msg_ok "Updated Backend Dependencies"
+ msg_ok "Configured Baserow"
- msg_info "Updating Frontend"
+ msg_info "Rebuilding Frontend"
cd /opt/baserow/web-frontend
$STD npm install
$STD npm run build
- msg_ok "Updated Frontend"
+ msg_ok "Rebuilt Frontend"
msg_info "Running Migrations"
cd /opt/baserow/backend
diff --git a/ct/bentopdf.sh b/ct/bentopdf.sh
index cd313d892..c4123cbcb 100644
--- a/ct/bentopdf.sh
+++ b/ct/bentopdf.sh
@@ -36,18 +36,13 @@ function update_script() {
systemctl stop bentopdf
msg_ok "Stopped Service"
- [[ -f /opt/bentopdf/.env.production ]] && cp /opt/bentopdf/.env.production /opt/production.env
-
+ create_backup /opt/bentopdf/.env.production
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bentopdf" "alam00000/bentopdf" "tarball" "latest" "/opt/bentopdf"
+ restore_backup
- msg_info "Updating BentoPDF"
+ msg_info "Configuring BentoPDF"
cd /opt/bentopdf
$STD npm ci --no-audit --no-fund
- if [[ -f /opt/production.env ]]; then
- mv /opt/production.env ./.env.production
- else
- cp ./.env.example ./.env.production
- fi
export NODE_OPTIONS="--max-old-space-size=3072"
export SIMPLE_MODE=true
export VITE_USE_CDN=true
@@ -64,9 +59,9 @@ EOF
if [[ ! -f /etc/ssl/private/bentopdf-selfsigned.key || ! -f /etc/ssl/certs/bentopdf-selfsigned.crt ]]; then
CERT_CN="$(hostname -I | awk '{print $1}')"
$STD openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
- -keyout /etc/ssl/private/bentopdf-selfsigned.key \
- -out /etc/ssl/certs/bentopdf-selfsigned.crt \
- -subj "/CN=${CERT_CN}"
+ -keyout /etc/ssl/private/bentopdf-selfsigned.key \
+ -out /etc/ssl/certs/bentopdf-selfsigned.crt \
+ -subj "/CN=${CERT_CN}"
fi
cat <<'EOF' >/etc/nginx/sites-available/bentopdf
server {
diff --git a/ct/bichon.sh b/ct/bichon.sh
index e16d28f24..8bb8d2dc7 100644
--- a/ct/bichon.sh
+++ b/ct/bichon.sh
@@ -35,14 +35,14 @@ function update_script() {
fi
MIGRATE_V1=0
- if [[ "$CURRENT_VERSION" == 0.* ]]; then
+ if [[ $CURRENT_VERSION == 0.* ]]; then
MIGRATE_V1=1
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt 50 ]; then
echo -e "\n${RD}Warning: Less than 50% free storage remaining on the root disk.${CL}"
echo -e "${RD}Bichon v1 data migration temporarily duplicates data and requires free space for it.${CL}"
read -r -p "Are you sure you want to proceed with the update? (y/N): " proceed
- if [[ ! "$proceed" =~ ^[Yy]$ ]]; then
+ if [[ ! $proceed =~ ^[Yy]$ ]]; then
msg_error "Update cancelled by user."
exit
fi
@@ -53,7 +53,7 @@ function update_script() {
echo -e "\n${RD}Warning: LXC has less than 2GB of RAM allocated (${RAM_TOTAL}MB).${CL}"
echo -e "${RD}Bichon v1 data migration consumes significant memory and may crash if insufficient.${CL}"
read -r -p "Are you sure you want to proceed with the update? (y/N): " proceed_ram
- if [[ ! "$proceed_ram" =~ ^[Yy]$ ]]; then
+ if [[ ! $proceed_ram =~ ^[Yy]$ ]]; then
msg_error "Update cancelled by user."
exit
fi
@@ -65,12 +65,12 @@ function update_script() {
systemctl stop bichon
msg_ok "Stopped service"
- cp /opt/bichon/bichon.env /tmp/bichon.env.backup
+ create_backup /opt/bichon/bichon.env
if [ "$MIGRATE_V1" -eq 1 ] && [ "$CURRENT_VERSION" != "0.3.7" ]; then
msg_info "Updating to intermediate version v0.3.7"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bichon" "rustmailer/bichon" "prebuild" "v0.3.7" "/opt/bichon" "bichon-*-$(get_arch_value "x86_64" "aarch64")-unknown-linux-gnu.tar.gz"
- cp /tmp/bichon.env.backup /opt/bichon/bichon.env
+ restore_backup
systemctl start bichon
sleep 30
systemctl stop bichon
@@ -78,7 +78,7 @@ function update_script() {
fi
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bichon" "rustmailer/bichon" "prebuild" "latest" "/opt/bichon" "bichon-*-$(get_arch_value "x86_64" "aarch64")-unknown-linux-gnu.tar.gz"
- cp /tmp/bichon.env.backup /opt/bichon/bichon.env
+ restore_backup
if [ "$MIGRATE_V1" -eq 1 ]; then
msg_info "Running Bichon v1 Data Migration (patience)"
@@ -133,4 +133,4 @@ 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 "${GATEWAY}${BGN}http://${IP}:15630${CL}"
+echo -e "${GATEWAY}${BGN}http://${IP}:15630${CL}"
\ No newline at end of file
diff --git a/ct/bitmagnet.sh b/ct/bitmagnet.sh
index ab4d534d1..8d8d5b875 100644
--- a/ct/bitmagnet.sh
+++ b/ct/bitmagnet.sh
@@ -56,21 +56,19 @@ function update_script() {
bitmagnet \
>/tmp/backup.sql
mv /tmp/backup.sql /opt/
- [ -f /opt/bitmagnet/.env ] && cp /opt/bitmagnet/.env /opt/
- [ -f /opt/bitmagnet/config.yml ] && cp /opt/bitmagnet/config.yml /opt/
+ create_backup /opt/bitmagnet/.env \
+ /opt/bitmagnet/config.yml
msg_ok "Data backed up"
- rm -rf /opt/bitmagnet
- fetch_and_deploy_gh_release "bitmagnet" "bitmagnet-io/bitmagnet" "tarball"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bitmagnet" "bitmagnet-io/bitmagnet" "tarball"
+ restore_backup
- msg_info "Updating Bitmagnet"
+ msg_info "Configuring Bitmagnet"
cd /opt/bitmagnet
VREL=v$(curl -fsSL https://api.github.com/repos/bitmagnet-io/bitmagnet/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
$STD go build -ldflags "-s -w -X github.com/bitmagnet-io/bitmagnet/internal/version.GitTag=$VREL"
chmod +x bitmagnet
- [ -f "/opt/.env" ] && cp "/opt/.env" /opt/bitmagnet/
- [ -f "/opt/config.yml" ] && cp "/opt/config.yml" /opt/bitmagnet/
- msg_ok "Updated Bitmagnet"
+ msg_ok "Configured Bitmagnet"
msg_info "Starting Service"
systemctl start bitmagnet-web
diff --git a/ct/blocky.sh b/ct/blocky.sh
index f28b873d8..ea01d8486 100644
--- a/ct/blocky.sh
+++ b/ct/blocky.sh
@@ -33,15 +33,9 @@ function update_script() {
systemctl stop blocky
msg_ok "Stopped Service"
- msg_info "Backup Config"
- mv /opt/blocky/config.yml /opt/config.yml
- msg_ok "Backed Up Config"
-
+ create_backup /opt/blocky/config.yml
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "blocky" "0xERR0R/blocky" "prebuild" "latest" "/opt/blocky" "blocky_*_Linux_$(get_arch_value "x86_64" "arm64").tar.gz"
-
- msg_info "Restore Config"
- mv /opt/config.yml /opt/blocky/config.yml
- msg_ok "Restored Config"
+ restore_backup
msg_info "Starting Service"
systemctl start blocky
@@ -58,4 +52,4 @@ 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 "${GATEWAY}${BGN}http://${IP}${CL}"
+echo -e "${GATEWAY}${BGN}http://${IP}${CL}"
\ No newline at end of file
diff --git a/ct/booklore.sh b/ct/booklore.sh
new file mode 100644
index 000000000..349bb2796
--- /dev/null
+++ b/ct/booklore.sh
@@ -0,0 +1,15 @@
+#!/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
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+APP="BookLore"
+
+header_info "$APP"
+variables
+color
+
+msg_error "This script is no longer available in community-scripts."
+msg_error "The Booklore or the Grimmory Fork will for now not return to community-scripts. Due to the unstable nature of these projects we decided to remove them and will decide at later point if they come back, which will most likley not happen. Plese do not create Issues for this."
+msg_warn "More info: https://community-scripts.org/scripts/booklore"
+exit 1
diff --git a/ct/bookorbit.sh b/ct/bookorbit.sh
new file mode 100644
index 000000000..25b19cddf
--- /dev/null
+++ b/ct/bookorbit.sh
@@ -0,0 +1,78 @@
+#!/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/bookorbit/bookorbit
+
+APP="BookOrbit"
+var_tags="${var_tags:-books;library;reading}"
+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_arm64="${var_arm64:-no}"
+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/bookorbit ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "bookorbit" "bookorbit/bookorbit"; then
+ msg_info "Stopping Service"
+ systemctl stop bookorbit
+ msg_ok "Stopped Service"
+
+ create_backup /opt/bookorbit/.env
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bookorbit" "bookorbit/bookorbit" "tarball"
+
+ msg_info "Rebuilding Application"
+ cd /opt/bookorbit
+ PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/bookorbit/package.json)
+ $STD corepack enable
+ $STD corepack prepare "pnpm@${PNPM_VERSION}" --activate
+ $STD pnpm install --frozen-lockfile
+ $STD pnpm --filter client run build-only
+ $STD pnpm --filter server run build
+ cp -r /opt/bookorbit/client/dist /opt/bookorbit/server/public
+ mkdir -p /opt/bookorbit/server/migrations
+ cp -r /opt/bookorbit/server/src/db/migrations/. /opt/bookorbit/server/migrations/
+ chmod +x /opt/bookorbit/server/bin/kepubify/*
+ APP_VER=$(cat ~/.bookorbit)
+ sed -i "s/^APP_VERSION=.*/APP_VERSION=v$APP_VER/" /opt/bookorbit/.env
+ msg_ok "Rebuilt Application"
+
+ msg_info "Updating Kobo Python Runtime"
+ $STD uv pip install --python /opt/bookorbit-python/bin/python -r /opt/bookorbit/server/requirements/kobo-cloudscraper.txt
+ msg_ok "Updated Kobo Python Runtime"
+
+
+ msg_info "Starting Service"
+ systemctl start bookorbit
+ 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}:3000${CL}"
diff --git a/ct/bookstack.sh b/ct/bookstack.sh
index eafc91657..caa720d4b 100644
--- a/ct/bookstack.sh
+++ b/ct/bookstack.sh
@@ -36,20 +36,14 @@ function update_script() {
systemctl stop apache2
msg_ok "Services Stopped"
- msg_info "Backing up data"
- mv /opt/bookstack /opt/bookstack-backup
- msg_ok "Backup finished"
-
+ create_backup /opt/bookstack/.env \
+ /opt/bookstack/public/uploads \
+ /opt/bookstack/storage/uploads \
+ /opt/bookstack/themes
fetch_and_deploy_gh_release "bookstack" "BookStackApp/BookStack" "tarball"
PHP_VERSION="8.3" PHP_APACHE="YES" PHP_FPM="YES" PHP_MODULE="ldap,tidy,mysqli" setup_php
setup_composer
-
- msg_info "Restoring backup"
- cp /opt/bookstack-backup/.env /opt/bookstack/.env
- [[ -d /opt/bookstack-backup/public/uploads ]] && cp -a /opt/bookstack-backup/public/uploads/. /opt/bookstack/public/uploads/
- [[ -d /opt/bookstack-backup/storage/uploads ]] && cp -a /opt/bookstack-backup/storage/uploads/. /opt/bookstack/storage/uploads/
- [[ -d /opt/bookstack-backup/themes ]] && cp -a /opt/bookstack-backup/themes/. /opt/bookstack/themes/
- msg_ok "Backup restored"
+ restore_backup
msg_info "Configuring BookStack"
cd /opt/bookstack
@@ -60,7 +54,6 @@ function update_script() {
chmod -R 755 /opt/bookstack /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads /opt/bookstack/storage
chmod -R 775 /opt/bookstack/storage /opt/bookstack/bootstrap/cache /opt/bookstack/public/uploads
chmod -R 640 /opt/bookstack/.env
- rm -rf /opt/bookstack-backup
msg_ok "Configured BookStack"
msg_info "Starting Apache2"
diff --git a/ct/bytestash.sh b/ct/bytestash.sh
index 5a65a9b76..c71e100ae 100644
--- a/ct/bytestash.sh
+++ b/ct/bytestash.sh
@@ -34,25 +34,10 @@ function update_script() {
systemctl stop bytestash-backend bytestash-frontend
msg_ok "Services Stopped"
- msg_info "Backing up data"
- tmp_dir="/opt/bytestash-data-backup"
- mkdir -p "$tmp_dir"
- if [[ -d /opt/bytestash/data ]]; then
- cp -r /opt/bytestash/data "$tmp_dir"/data
- elif [[ -d /opt/data ]]; then
- cp -r /opt/data "$tmp_dir"/data
- fi
- msg_ok "Data backed up"
-
+ [[ -d /opt/bytestash/data ]] && create_backup /opt/bytestash/data
+ [[ -d /opt/data ]] && create_backup /opt/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "bytestash" "jordan-dalby/ByteStash" "tarball"
-
- msg_info "Restoring data"
- if [[ -d "$tmp_dir"/data ]]; then
- mkdir -p /opt/bytestash/data
- cp -r "$tmp_dir"/data/* /opt/bytestash/data/
- rm -rf "$tmp_dir"
- fi
- msg_ok "Data restored"
+ restore_backup
msg_info "Configuring ByteStash"
cd /opt/bytestash/server
diff --git a/ct/calibre-web.sh b/ct/calibre-web.sh
index a12b14583..1138d1727 100644
--- a/ct/calibre-web.sh
+++ b/ct/calibre-web.sh
@@ -35,10 +35,8 @@ function update_script() {
systemctl stop calibre-web
msg_ok "Stopped Service"
- msg_info "Backing up Data"
- cp -r /opt/calibre-web/app.db /opt/app.db_backup
- cp -r /opt/calibre-web/data /opt/data_backup
- msg_ok "Backed up Data"
+ create_backup /opt/calibre-web/app.db \
+ /opt/calibre-web/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Calibre-Web" "janeczku/calibre-web" "prebuild" "latest" "/opt/calibre-web" "calibre-web*.tar.gz"
setup_uv
@@ -50,11 +48,7 @@ function update_script() {
$STD uv pip install --python /opt/calibre-web/.venv/bin/python --no-cache-dir -r requirements.txt
msg_ok "Installed Dependencies"
- msg_info "Restoring Data"
- cp /opt/app.db_backup /opt/calibre-web/app.db 2>/dev/null
- cp -r /opt/data_backup /opt/calibre-web/data 2>/dev/null
- rm -rf /opt/app.db_backup /opt/data_backup
- msg_ok "Restored Data"
+ restore_backup
msg_info "Starting Service"
systemctl start calibre-web
diff --git a/ct/certimate.sh b/ct/certimate.sh
index cb65f1bc3..34d66706c 100644
--- a/ct/certimate.sh
+++ b/ct/certimate.sh
@@ -35,16 +35,11 @@ function update_script() {
systemctl stop certimate
msg_ok "Stopped Service"
- msg_info "Backing up Data"
- cp -r /opt/certimate/pb_data /opt/certimate_pb_data_backup
- msg_ok "Backed up Data"
+ create_backup /opt/certimate/pb_data
fetch_and_deploy_gh_release "certimate" "certimate-go/certimate" "prebuild" "latest" "/opt/certimate" "certimate_*_linux_$(get_arch_value).zip"
- msg_info "Restoring Data"
- cp -r /opt/certimate_pb_data_backup/. /opt/certimate/pb_data
- rm -rf /opt/certimate_pb_data_backup
- msg_ok "Restored Data"
+ restore_backup
msg_info "Starting Service"
systemctl start certimate
diff --git a/ct/checkmate.sh b/ct/checkmate.sh
index 14fa8420d..471b7e4f7 100644
--- a/ct/checkmate.sh
+++ b/ct/checkmate.sh
@@ -35,10 +35,8 @@ function update_script() {
systemctl stop checkmate-server checkmate-client nginx
msg_ok "Stopped Services"
- msg_info "Backing up Data"
- cp /opt/checkmate/server/.env /opt/checkmate_server.env.bak
- [ -f /opt/checkmate/client/.env.local ] && cp /opt/checkmate/client/.env.local /opt/checkmate_client.env.local.bak
- msg_ok "Backed up Data"
+ create_backup /opt/checkmate/server/.env \
+ /opt/checkmate/client/.env.local
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate" "tarball"
@@ -56,10 +54,7 @@ function update_script() {
VITE_APP_API_BASE_URL="/api/v1" UPTIME_APP_API_BASE_URL="/api/v1" VITE_APP_LOG_LEVEL="warn" $STD npm run build
msg_ok "Updated Checkmate Client"
- msg_info "Restoring Data"
- mv /opt/checkmate_server.env.bak /opt/checkmate/server/.env
- [ -f /opt/checkmate_client.env.local.bak ] && mv /opt/checkmate_client.env.local.bak /opt/checkmate/client/.env.local
- msg_ok "Restored Data"
+ restore_backup
msg_info "Starting Services"
systemctl start checkmate-server checkmate-client nginx
diff --git a/ct/checkmk.sh b/ct/checkmk.sh
index 43ccaf5e1..a9ea34d29 100644
--- a/ct/checkmk.sh
+++ b/ct/checkmk.sh
@@ -33,6 +33,7 @@ function update_script() {
RELEASE="${RELEASE%%+*}"
msg_info "Updating checkmk"
$STD omd stop monitoring
+ $STD omd -f rm monitoringbackup 2>/dev/null || true
$STD omd cp monitoring monitoringbackup
curl_download "/opt/checkmk.deb" "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-community-${RELEASE}_0.$(get_os_info codename)_amd64.deb"
$STD apt install -y /opt/checkmk.deb
diff --git a/ct/cleanuparr.sh b/ct/cleanuparr.sh
index 9150149b3..1cf034efa 100644
--- a/ct/cleanuparr.sh
+++ b/ct/cleanuparr.sh
@@ -33,16 +33,11 @@ function update_script() {
systemctl stop cleanuparr
msg_ok "Stopped Service"
- msg_info "Backing up config"
- cp -r /opt/cleanuparr/config /opt/cleanuparr_config_backup
- msg_ok "Backed up config"
+ create_backup /opt/cleanuparr/config
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "latest" "/opt/cleanuparr" "*linux-$(get_arch_value).zip"
- msg_info "Restoring config"
- [[ -d /opt/cleanuparr/config ]] && rm -rf /opt/cleanuparr/config
- mv /opt/cleanuparr_config_backup /opt/cleanuparr/config
- msg_ok "Restored config"
+ restore_backup
msg_info "Starting Service"
systemctl start cleanuparr
diff --git a/ct/commafeed.sh b/ct/commafeed.sh
index 2a6411e46..d842c3c7f 100644
--- a/ct/commafeed.sh
+++ b/ct/commafeed.sh
@@ -36,20 +36,11 @@ function update_script() {
msg_ok "Stopped Service"
ensure_dependencies rsync
-
- if [ -d /opt/commafeed/data ] && [ "$(ls -A /opt/commafeed/data)" ]; then
- msg_info "Backing up existing data"
- mv /opt/commafeed/data /opt/data.bak
- msg_ok "Backed up existing data"
- fi
+ create_backup /opt/commafeed/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "commafeed" "Athou/commafeed" "prebuild" "latest" "/opt/commafeed" "commafeed-*-h2-jvm.zip"
- if [ -d /opt/data.bak ] && [ "$(ls -A /opt/data.bak)" ]; then
- msg_info "Restoring data"
- mv /opt/data.bak /opt/commafeed/data
- msg_ok "Restored data"
- fi
+ restore_backup
msg_info "Starting Service"
systemctl start commafeed
diff --git a/ct/configarr.sh b/ct/configarr.sh
index c465c2f41..636e3d8a8 100644
--- a/ct/configarr.sh
+++ b/ct/configarr.sh
@@ -33,11 +33,13 @@ function update_script() {
systemctl stop configarr-task.timer
msg_ok "Stopped Service"
- mkdir -p /opt/backup/
- mv /opt/configarr/{config.yml,secrets.yml,.env} /opt/backup/
+ create_backup /opt/configarr/config.yml \
+ /opt/configarr/secrets.yml \
+ /opt/configarr/.env
+
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "configarr" "raydak-labs/configarr" "prebuild" "latest" "/opt/configarr" "configarr-linux-x64.tar.xz"
- mv /opt/backup/{config.yml,secrets.yml,.env} /opt/configarr/
- rm -rf /opt/backup
+
+ restore_backup
msg_info "Starting Service"
systemctl start configarr-task.timer
diff --git a/ct/convertx.sh b/ct/convertx.sh
index 96f40fa84..2ec368dc4 100644
--- a/ct/convertx.sh
+++ b/ct/convertx.sh
@@ -36,19 +36,14 @@ function update_script() {
ensure_dependencies libreoffice-writer
- msg_info "Move data-Folder"
- if [[ -d /opt/convertx/data ]]; then
- mv /opt/convertx/data /opt/data
- fi
- msg_ok "Moved data-Folder"
+ create_backup /opt/convertx/data
fetch_and_deploy_gh_release "ConvertX" "C4illin/ConvertX" "tarball" "latest" "/opt/convertx"
+ restore_backup
+
msg_info "Updating ConvertX"
- if [[ -d /opt/data ]]; then
- mv /opt/data /opt/convertx/data
- fi
- cd /opt/convertx
+ cd /opt/convertx
$STD bun install
msg_ok "Updated ConvertX"
diff --git a/ct/crafty-controller.sh b/ct/crafty-controller.sh
index 5fd0fa963..2c31aee82 100644
--- a/ct/crafty-controller.sh
+++ b/ct/crafty-controller.sh
@@ -29,48 +29,37 @@ function update_script() {
exit
fi
- RELEASE=$(curl -fsSL "https://gitlab.com/api/v4/projects/20430749/releases" | grep -o '"tag_name":"v[^"]*"' | head -n 1 | sed 's/"tag_name":"v//;s/"//')
- if [[ ! -f /opt/crafty-controller_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/crafty-controller_version.txt)" ]]; then
-
+ if check_for_gl_release "Crafty-Controller" "crafty-controller/crafty-4"; then
msg_info "Stopping Crafty-Controller"
systemctl stop crafty-controller
msg_ok "Stopped Crafty-Controller"
- msg_info "Creating Backup of config"
- cp -a /opt/crafty-controller/crafty/crafty-4/app/config/. /opt/crafty-controller/backup
- rm /opt/crafty-controller/backup/version.json
- rm /opt/crafty-controller/backup/credits.json
- rm /opt/crafty-controller/backup/logging.json
- rm /opt/crafty-controller/backup/default.json.example
- rm /opt/crafty-controller/backup/motd_format.json
- msg_ok "Backup Created"
+ create_backup \
+ "/opt/crafty-controller/crafty/crafty-4/app/config/db" \
+ "/opt/crafty-controller/crafty/crafty-4/app/config/config.json" \
+ "/opt/crafty-controller/crafty/crafty-4/app/config/web" \
+ "/opt/crafty-controller/crafty/crafty-4/servers" \
+ "/opt/crafty-controller/crafty/crafty-4/backups" \
+ "/opt/crafty-controller/crafty/crafty-4/import"
- msg_info "Updating Crafty-Controller to v${RELEASE}"
- curl -fsSL "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip" -o $(basename "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip")
- $STD unzip crafty-4-v"${RELEASE}".zip
- cp -a crafty-4-v"${RELEASE}"/. /opt/crafty-controller/crafty/crafty-4/
- rm -rf crafty-4-v"${RELEASE}"
+ CLEAN_INSTALL=1 fetch_and_deploy_gl_release "Crafty-Controller" "crafty-controller/crafty-4" "tarball" "latest" "/opt/crafty-controller/crafty/crafty-4"
+
+ restore_backup
+
+ msg_info "Updating Python dependencies"
+ chown -R crafty:crafty /opt/crafty-controller
cd /opt/crafty-controller/crafty/crafty-4
- sudo -u crafty bash -c '
- source /opt/crafty-controller/crafty/.venv/bin/activate
- pip3 install --no-cache-dir -r requirements.txt
- ' &>/dev/null
- echo "${RELEASE}" >"/opt/crafty-controller_version.txt"
- msg_ok "Updated Crafty-Controller to v${RELEASE}"
-
- msg_info "Restoring Backup of config"
- cp -a /opt/crafty-controller/backup/. /opt/crafty-controller/crafty/crafty-4/app/config
- rm -rf /opt/crafty-controller/backup
- chown -R crafty:crafty /opt/crafty-controller/
- msg_ok "Backup Restored"
+ $STD sudo -u crafty bash -c '
+ source /opt/crafty-controller/crafty/.venv/bin/activate
+ pip3 install --no-cache-dir -r requirements.txt
+ '
+ msg_ok "Updated Python dependencies"
msg_info "Starting Crafty-Controller"
systemctl start crafty-controller
msg_ok "Started Crafty-Controller"
msg_ok "Updated successfully!"
- else
- msg_ok "No update required. ${APP} is already at v${RELEASE}"
fi
exit
}
diff --git a/ct/cryptpad.sh b/ct/cryptpad.sh
index abb180246..0480c0b66 100644
--- a/ct/cryptpad.sh
+++ b/ct/cryptpad.sh
@@ -34,21 +34,18 @@ function update_script() {
systemctl stop cryptpad
msg_info "Stopped Service"
- msg_info "Creating backup"
- [ -f /opt/cryptpad/config/config.js ] && mv /opt/cryptpad/config/config.js /opt/
- for dir in blob block customize data datastore www/common/onlyoffice/dist onlyoffice-conf; do
- [ -d "/opt/cryptpad/${dir}" ] && mv "/opt/cryptpad/${dir}" "/tmp/cryptpad_${dir//\//_}"
- done
- msg_ok "Created backup"
+ create_backup /opt/cryptpad/config/config.js \
+ /opt/cryptpad/blob \
+ /opt/cryptpad/block \
+ /opt/cryptpad/customize \
+ /opt/cryptpad/data \
+ /opt/cryptpad/datastore \
+ /opt/cryptpad/www/common/onlyoffice/dist \
+ /opt/cryptpad/onlyoffice-conf
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cryptpad" "cryptpad/cryptpad" "tarball"
- msg_info "Restoring backup"
- mv /opt/config.js /opt/cryptpad/config/
- for dir in blob block customize data datastore www/common/onlyoffice/dist onlyoffice-conf; do
- [ -d "/tmp/cryptpad_${dir//\//_}" ] && mv "/tmp/cryptpad_${dir//\//_}" "/opt/cryptpad/${dir}"
- done
- msg_ok "Restored backup"
+ restore_backup
msg_info "Updating CryptPad"
cd /opt/cryptpad
diff --git a/ct/dagu.sh b/ct/dagu.sh
index 94507958a..f9fca276f 100644
--- a/ct/dagu.sh
+++ b/ct/dagu.sh
@@ -35,17 +35,11 @@ function update_script() {
systemctl stop dagu
msg_ok "Stopped Service"
- msg_info "Backing up Data"
- cp -r /opt/dagu/data /opt/dagu_data_backup
- msg_ok "Backed up Data"
+ create_backup /opt/dagu/data
fetch_and_deploy_gh_release "dagu" "dagucloud/dagu" "prebuild" "latest" "/opt/dagu" "dagu_*_linux_$(get_arch_value).tar.gz"
- msg_info "Restoring Data"
- mkdir -p /opt/dagu/data
- cp -r /opt/dagu_data_backup/. /opt/dagu/data
- rm -rf /opt/dagu_data_backup
- msg_ok "Restored Data"
+ restore_backup
msg_info "Starting Service"
systemctl start dagu
diff --git a/ct/dashy.sh b/ct/dashy.sh
index 3211b3b2b..4a5488256 100644
--- a/ct/dashy.sh
+++ b/ct/dashy.sh
@@ -36,10 +36,7 @@ function update_script() {
systemctl stop dashy
msg_ok "Stopped Service"
- msg_info "Backing up user-data"
- rm -rf /opt/dashy_user_data_backup
- cp -r /opt/dashy/user-data /opt/dashy_user_data_backup
- msg_ok "Backed up user-data"
+ create_backup /opt/dashy/user-data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dashy" "lissy93/dashy" "prebuild" "latest" "/opt/dashy" "dashy-*.tar.gz"
@@ -48,10 +45,7 @@ function update_script() {
$STD yarn install --ignore-engines --network-timeout 300000
msg_ok "Updated Dashy"
- msg_info "Restoring user-data"
- cp -r /opt/dashy_user_data_backup/. /opt/dashy/user-data/
- rm -rf /opt/dashy_user_data_backup
- msg_ok "Restored user-data"
+ restore_backup
msg_info "Starting Dashy"
systemctl start dashy
diff --git a/ct/databasus.sh b/ct/databasus.sh
index 645f75be5..be1079e58 100644
--- a/ct/databasus.sh
+++ b/ct/databasus.sh
@@ -35,12 +35,7 @@ function update_script() {
$STD systemctl stop databasus
msg_ok "Stopped Databasus"
- msg_info "Backing up Configuration"
- [[ ! -f /.env && -f /opt/databasus/.env ]] && cp /opt/databasus/.env /.env
- chmod 600 /.env
- cp /.env /opt/databasus.env.bak
- chmod 600 /opt/databasus.env.bak
- msg_ok "Backed up Configuration"
+ create_backup /opt/databasus/.env
msg_info "Ensuring Database Clients"
# Create PostgreSQL version symlinks for compatibility
@@ -90,11 +85,7 @@ function update_script() {
chown -R postgres:postgres /opt/databasus
msg_ok "Updated Databasus"
- msg_info "Restoring Configuration"
- cp /opt/databasus.env.bak /.env
- rm -f /opt/databasus.env.bak
- chmod 600 /.env
- msg_ok "Restored Configuration"
+ restore_backup
if ! grep -q "EnvironmentFile=/.env" /etc/systemd/system/databasus.service; then
msg_info "Updating Service"
diff --git a/ct/dawarich.sh b/ct/dawarich.sh
index a7513508f..9e4c64bfe 100644
--- a/ct/dawarich.sh
+++ b/ct/dawarich.sh
@@ -37,11 +37,9 @@ function update_script() {
systemctl stop dawarich-web dawarich-worker
msg_ok "Stopped Services"
- msg_info "Backing up Data"
- cp -r /opt/dawarich/app/storage /opt/dawarich_storage_backup 2>/dev/null || true
- cp /opt/dawarich/app/config/master.key /opt/dawarich_master.key 2>/dev/null || true
- cp /opt/dawarich/app/config/credentials.yml.enc /opt/dawarich_credentials.yml.enc 2>/dev/null || true
- msg_ok "Backed up Data"
+ create_backup /opt/dawarich/app/storage \
+ /opt/dawarich/app/config/master.key \
+ /opt/dawarich/app/config/credentials.yml.enc
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dawarich" "Freika/dawarich" "tarball" "latest" "/opt/dawarich/app"
@@ -85,12 +83,7 @@ function update_script() {
$STD bundle exec rake data:migrate
msg_ok "Ran Migrations"
- msg_info "Restoring Data"
- cp -r /opt/dawarich_storage_backup/. /opt/dawarich/app/storage/ 2>/dev/null || true
- cp /opt/dawarich_master.key /opt/dawarich/app/config/master.key 2>/dev/null || true
- cp /opt/dawarich_credentials.yml.enc /opt/dawarich/app/config/credentials.yml.enc 2>/dev/null || true
- rm -rf /opt/dawarich_storage_backup /opt/dawarich_master.key /opt/dawarich_credentials.yml.enc
- msg_ok "Restored Data"
+ restore_backup
msg_info "Starting Services"
systemctl start dawarich-web dawarich-worker
diff --git a/ct/ddns-updater.sh b/ct/ddns-updater.sh
index 5ed3fee03..0c61aee4e 100644
--- a/ct/ddns-updater.sh
+++ b/ct/ddns-updater.sh
@@ -33,16 +33,11 @@ function update_script() {
systemctl stop ddns-updater
msg_ok "Stopped Service"
- msg_info "Backing up Data"
- cp -r /opt/ddns-updater/data /opt/ddns-updater_data_backup
- msg_ok "Backed up Data"
+ create_backup /opt/ddns-updater/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ddns-updater" "qdm12/ddns-updater" "singlefile" "latest" "/opt/ddns-updater" "ddns-updater_*_linux_$(get_arch_value)"
- msg_info "Restoring Data"
- cp -r /opt/ddns-updater_data_backup/. /opt/ddns-updater/data/
- rm -rf /opt/ddns-updater_data_backup
- msg_ok "Restored Data"
+ restore_backup
msg_info "Starting Service"
systemctl start ddns-updater
diff --git a/ct/degoog.sh b/ct/degoog.sh
index 0dbe0c4d5..fa98bbf99 100644
--- a/ct/degoog.sh
+++ b/ct/degoog.sh
@@ -35,10 +35,8 @@ function update_script() {
systemctl stop degoog
msg_ok "Stopped Service"
- msg_info "Backing up Configuration & Data"
- [[ -f /opt/degoog/.env ]] && cp /opt/degoog/.env /opt/degoog.env.bak
- [[ -d /opt/degoog/data ]] && mv /opt/degoog/data /opt/degoog_data_backup
- msg_ok "Backed up Configuration & Data"
+ create_backup /opt/degoog/.env \
+ /opt/degoog/data
if ! command -v bun >/dev/null 2>&1; then
msg_info "Installing Bun"
@@ -54,10 +52,9 @@ function update_script() {
msg_ok "Updated Valkey"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "degoog" "fccview/degoog" "prebuild" "latest" "/opt/degoog" "degoog_*_prebuild.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "curl-impersonate" "lexiforest/curl-impersonate" "prebuild" "latest" "/usr/local/bin" "curl-impersonate-v*.$(uname -m)-linux-gnu.tar.gz"
- msg_info "Restoring Configuration & Data"
- [[ -f /opt/degoog.env.bak ]] && mv /opt/degoog.env.bak /opt/degoog/.env
- [[ -d /opt/degoog_data_backup ]] && mv /opt/degoog_data_backup /opt/degoog/data
+ restore_backup
if [[ -f /opt/degoog/.env ]]; then
grep -q "^DEGOOG_VALKEY_URL=" /opt/degoog/.env && sed -i "s|^DEGOOG_VALKEY_URL=.*|DEGOOG_VALKEY_URL=redis://valkey:6379|" /opt/degoog/.env || echo "DEGOOG_VALKEY_URL=redis://valkey:6379" >>/opt/degoog/.env
diff --git a/ct/discopanel.sh b/ct/discopanel.sh
index 65bcecb77..0e6ea36c1 100644
--- a/ct/discopanel.sh
+++ b/ct/discopanel.sh
@@ -37,19 +37,12 @@ function update_script() {
systemctl stop discopanel
msg_ok "Stopped Service"
- msg_info "Creating Backup"
- mkdir -p /opt/discopanel_backup_temp
- cp /opt/discopanel/data/discopanel.db /opt/discopanel_backup_temp/discopanel.db
- msg_ok "Created Backup"
+ create_backup /opt/discopanel/data/discopanel.db
fetch_and_deploy_gh_release "discopanel" "nickheyer/discopanel" "prebuild" "latest" "/opt/discopanel" "discopanel-linux-$(get_arch_value).tar.gz"
ln -sf /opt/discopanel/discopanel-linux-$(get_arch_value) /opt/discopanel/discopanel
- msg_info "Restoring Data"
- mkdir -p /opt/discopanel/data
- mv /opt/discopanel_backup_temp/discopanel.db /opt/discopanel/data/discopanel.db
- rm -rf /opt/discopanel_backup_temp
- msg_ok "Restored Data"
+ restore_backup
msg_info "Starting Service"
systemctl start discopanel
diff --git a/ct/docmost.sh b/ct/docmost.sh
index c50f59c3d..c3392c585 100644
--- a/ct/docmost.sh
+++ b/ct/docmost.sh
@@ -37,25 +37,19 @@ function update_script() {
systemctl stop docmost
msg_ok "Stopped Service"
- msg_info "Backing up data"
- cp /opt/docmost/.env /opt/
- cp -r /opt/docmost/data /opt/
- rm -rf /opt/docmost
- msg_ok "Data backed up"
+ create_backup /opt/docmost/.env \
+ /opt/docmost/data
fetch_and_deploy_gh_release "docmost" "docmost/docmost" "tarball"
- msg_info "Updating ${APP}"
- cd /opt/docmost
- mv /opt/.env /opt/docmost/.env
- mv /opt/data /opt/docmost/data
+ restore_backup
# Fix: Docmost EE (audit logs etc.) lives in a git submodule that is NOT
# included in GitHub tarballs. The community NoopAuditService exists but
# is only exported by CoreModule â child modules such as UserModule cannot
# resolve it. Making CoreModule @Global() exposes the token app-wide.
- 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
+ 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
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
fi
diff --git a/ct/docuseal.sh b/ct/docuseal.sh
index cac476528..bbed854bc 100644
--- a/ct/docuseal.sh
+++ b/ct/docuseal.sh
@@ -35,24 +35,19 @@ function update_script() {
systemctl stop docuseal docuseal-sidekiq
msg_ok "Stopped Services"
- msg_info "Backing up Data"
- cp /opt/docuseal/.env /opt/docuseal.env.bak
- [[ -d /opt/docuseal/data ]] && mv /opt/docuseal/data /opt/docuseal_data.bak
- msg_ok "Backed up Data"
+ create_backup /opt/docuseal/.env \
+ /opt/docuseal/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "docuseal" "docusealco/docuseal" "tarball"
local required_ruby current_ruby
required_ruby=$(grep -m1 '^ruby ' /opt/docuseal/Gemfile | grep -oP '[0-9]+\.[0-9]+\.[0-9]+')
current_ruby=$(PATH="/root/.rbenv/bin:/root/.rbenv/shims:${PATH}" rbenv global 2>/dev/null || true)
- if [[ -n "$required_ruby" && "$required_ruby" != "$current_ruby" ]]; then
+ if [[ -n $required_ruby && $required_ruby != "$current_ruby" ]]; then
RUBY_VERSION="${required_ruby}" RUBY_INSTALL_RAILS="false" HOME=/root setup_ruby
fi
- msg_info "Restoring Data"
- mv /opt/docuseal.env.bak /opt/docuseal/.env
- [[ -d /opt/docuseal_data.bak ]] && mv /opt/docuseal_data.bak /opt/docuseal/data
- msg_ok "Restored Data"
+ restore_backup
msg_info "Building Application"
cd /opt/docuseal
diff --git a/ct/domain-monitor.sh b/ct/domain-monitor.sh
index b5ced7a7e..110be28bf 100644
--- a/ct/domain-monitor.sh
+++ b/ct/domain-monitor.sh
@@ -43,9 +43,7 @@ function update_script() {
systemctl stop apache2
msg_info "Service stopped"
- msg_info "Creating backup"
- mv /opt/domain-monitor/.env /opt
- msg_ok "Created backup"
+ create_backup /opt/domain-monitor/.env
setup_composer
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "domain-monitor" "Hosteroid/domain-monitor" "prebuild" "latest" "/opt/domain-monitor" "domain-monitor-v*.zip"
@@ -56,9 +54,7 @@ function update_script() {
chown -R www-data:www-data /opt/domain-monitor
msg_ok "Updated Domain Monitor"
- msg_info "Restoring backup"
- mv /opt/.env /opt/domain-monitor
- msg_ok "Restored backup"
+ restore_backup
msg_info "Restarting Services"
systemctl start apache2
diff --git a/ct/donetick.sh b/ct/donetick.sh
index 8b3952f38..46bd633f4 100644
--- a/ct/donetick.sh
+++ b/ct/donetick.sh
@@ -35,18 +35,14 @@ function update_script() {
systemctl stop donetick
msg_ok "Stopped Service"
- msg_info "Backing Up Configurations"
- mv /opt/donetick/config/selfhosted.yaml /opt/donetick/donetick.db /opt
- msg_ok "Backed Up Configurations"
+ create_backup /opt/donetick/config/selfhosted.yaml \
+ /opt/donetick/donetick.db
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "donetick" "donetick/donetick" "prebuild" "latest" "/opt/donetick" "donetick_Linux_$(get_arch_value "x86_64" "arm64").tar.gz"
- msg_info "Restoring Configurations"
- mv /opt/selfhosted.yaml /opt/donetick/config
+ restore_backup
grep -q 'http://localhost"$' /opt/donetick/config/selfhosted.yaml || sed -i '/https:\/\/localhost"$/a\ - "http://localhost"' /opt/donetick/config/selfhosted.yaml
grep -q 'capacitor://localhost' /opt/donetick/config/selfhosted.yaml || sed -i '/http:\/\/localhost"$/a\ - "capacitor://localhost"' /opt/donetick/config/selfhosted.yaml
- mv /opt/donetick.db /opt/donetick
- msg_ok "Restored Configurations"
msg_info "Starting Service"
systemctl start donetick
diff --git a/ct/dynacat.sh b/ct/dynacat.sh
index c35d5601c..30d20d3fd 100644
--- a/ct/dynacat.sh
+++ b/ct/dynacat.sh
@@ -35,19 +35,13 @@ function update_script() {
systemctl stop dynacat
msg_ok "Stopped Service"
- msg_info "Backing up Data"
- cp -r /opt/dynacat/config /opt/dynacat_config_backup
- cp -r /opt/dynacat/assets /opt/dynacat_assets_backup
- cp -r /opt/dynacat/data /opt/dynacat_data_backup
- msg_ok "Backed up Data"
+ create_backup /opt/dynacat/config \
+ /opt/dynacat/assets \
+ /opt/dynacat/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dynacat" "Panonim/dynacat" "prebuild" "latest" "/opt/dynacat" "dynacat-linux-$(get_arch_value).tar.gz"
- msg_info "Restoring Data"
- cp -r /opt/dynacat_config_backup/. /opt/dynacat/config
- cp -r /opt/dynacat_assets_backup/. /opt/dynacat/assets
- cp -r /opt/dynacat_data_backup/. /opt/dynacat/data
- rm -rf /opt/dynacat_config_backup /opt/dynacat_assets_backup /opt/dynacat_data_backup
+ restore_backup
chmod +x /opt/dynacat/dynacat
msg_ok "Restored Data"
diff --git a/ct/feishin.sh b/ct/feishin.sh
new file mode 100644
index 000000000..b13b280e5
--- /dev/null
+++ b/ct/feishin.sh
@@ -0,0 +1,77 @@
+#!/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/jeffvli/feishin
+
+APP="Feishin"
+var_tags="${var_tags:-music;player;streaming}"
+var_cpu="${var_cpu:-2}"
+var_ram="${var_ram:-4096}"
+var_disk="${var_disk:-8}"
+var_os="${var_os:-debian}"
+var_version="${var_version:-13}"
+var_arm64="${var_arm64:-no}"
+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/feishin ]]; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ if check_for_gh_release "feishin" "jeffvli/feishin"; then
+ create_backup /opt/feishin/.env
+
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "feishin" "jeffvli/feishin" "tarball"
+
+ msg_info "Rebuilding Feishin Web"
+ cd /opt/feishin
+ #PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/feishin/package.json)
+ $STD corepack enable
+ $STD corepack prepare "pnpm@10" --activate
+ $STD pnpm install
+ $STD pnpm run build:web
+ msg_ok "Rebuilt Feishin Web"
+
+ restore_backup
+
+ msg_info "Publishing Web Assets"
+ rm -rf /usr/share/nginx/html
+ mkdir -p /usr/share/nginx/html
+ cp -r /opt/feishin/out/web/. /usr/share/nginx/html/
+
+ set -a
+ source /opt/feishin/.env
+ set +a
+
+ envsubst /etc/nginx/conf.d/settings.js
+ envsubst '${PUBLIC_PATH}' /etc/nginx/sites-available/feishin
+ ln -sf /etc/nginx/sites-available/feishin /etc/nginx/sites-enabled/feishin
+ rm -f /etc/nginx/sites-enabled/default
+ systemctl restart nginx
+ msg_ok "Published Web Assets"
+
+ 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}:9180${CL}"
diff --git a/ct/flowiseai.sh b/ct/flowiseai.sh
index 4e7e139dc..7d4c6468e 100644
--- a/ct/flowiseai.sh
+++ b/ct/flowiseai.sh
@@ -29,7 +29,7 @@ function update_script() {
exit
fi
- NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs
+ NODE_VERSION="22" NODE_MODULE="pnpm" setup_nodejs
msg_info "Updating FlowiseAI (this may take some time)"
systemctl stop flowise
diff --git a/ct/headers/booklore b/ct/headers/booklore
new file mode 100644
index 000000000..267b0346f
--- /dev/null
+++ b/ct/headers/booklore
@@ -0,0 +1,6 @@
+ ____ __ __
+ / __ )____ ____ / /__/ / ____ ________
+ / __ / __ \/ __ \/ //_/ / / __ \/ ___/ _ \
+ / /_/ / /_/ / /_/ / ,< / /___/ /_/ / / / __/
+/_____/\____/\____/_/|_/_____/\____/_/ \___/
+
diff --git a/ct/headers/bookorbit b/ct/headers/bookorbit
new file mode 100644
index 000000000..0fddb4d33
--- /dev/null
+++ b/ct/headers/bookorbit
@@ -0,0 +1,6 @@
+ ____ __ ____ __ _ __
+ / __ )____ ____ / /__/ __ \_____/ /_ (_) /_
+ / __ / __ \/ __ \/ //_/ / / / ___/ __ \/ / __/
+ / /_/ / /_/ / /_/ / ,< / /_/ / / / /_/ / / /_
+/_____/\____/\____/_/|_|\____/_/ /_.___/_/\__/
+
diff --git a/ct/headers/feishin b/ct/headers/feishin
new file mode 100644
index 000000000..d8d1ad3f5
--- /dev/null
+++ b/ct/headers/feishin
@@ -0,0 +1,6 @@
+ ______ _ __ _
+ / ____/__ (_)____/ /_ (_)___
+ / /_ / _ \/ / ___/ __ \/ / __ \
+ / __/ / __/ (__ ) / / / / / / /
+/_/ \___/_/____/_/ /_/_/_/ /_/
+
diff --git a/ct/headers/kiwix b/ct/headers/kiwix
new file mode 100644
index 000000000..743f3c30d
--- /dev/null
+++ b/ct/headers/kiwix
@@ -0,0 +1,6 @@
+ __ __ _ _
+ / //_/(_) __(_) __
+ / ,< / / | /| / / / |/_/
+ / /| |/ /| |/ |/ / /> <
+/_/ |_/_/ |__/|__/_/_/|_|
+
diff --git a/ct/headers/litellm b/ct/headers/litellm
new file mode 100644
index 000000000..1360a8ff9
--- /dev/null
+++ b/ct/headers/litellm
@@ -0,0 +1,6 @@
+ __ _ __ __ __ __ ___
+ / / (_) /____ / / / / / |/ /
+ / / / / __/ _ \/ / / / / /|_/ /
+ / /___/ / /_/ __/ /___/ /___/ / / /
+/_____/_/\__/\___/_____/_____/_/ /_/
+
diff --git a/ct/homebox.sh b/ct/homebox.sh
index c87879060..bc36c2547 100644
--- a/ct/homebox.sh
+++ b/ct/homebox.sh
@@ -39,14 +39,16 @@ function update_script() {
systemctl stop homebox
msg_ok "Stopped Service"
- if [ -f /opt/homebox ] && [ -x /opt/homebox ]; then
- rm -f /opt/homebox
- fi
- fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "latest" "/opt/homebox" "homebox_Linux_x86_64.tar.gz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "latest" "/opt/homebox" "homebox_Linux_x86_64.tar.gz"
chmod +x /opt/homebox/homebox
[ -f /opt/.env ] && mv /opt/.env /opt/homebox/.env
[ -d /opt/.data ] && mv /opt/.data /opt/homebox/.data
+ if ! grep -q "HBOX_AUTH_API_KEY_PEPPER" /opt/homebox/.env; then
+ AUTH_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)
+ echo "HBOX_AUTH_API_KEY_PEPPER=${AUTH_KEY}" >>/opt/homebox/.env
+ fi
+
msg_info "Starting Service"
systemctl start homebox
msg_ok "Started Service"
diff --git a/ct/immich.sh b/ct/immich.sh
index c3ba5dff9..f0362c2df 100644
--- a/ct/immich.sh
+++ b/ct/immich.sh
@@ -310,7 +310,7 @@ function compile_libjxl() {
SOURCE=${SOURCE_DIR}/libjxl
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
- LIBJXL_REVISION="794a5dcf0d54f9f0b20d288a12e87afb91d20dfc"
+ LIBJXL_REVISION="332feb17d17311c748445f7ee75c4fb55cc38530"
# : "${LIBJXL_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libjxl.json)}"
if [[ "$LIBJXL_REVISION" != "$(grep 'libjxl' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
msg_info "Recompiling libjxl"
@@ -355,7 +355,7 @@ function compile_libjxl() {
function compile_libheif() {
SOURCE=${SOURCE_DIR}/libheif
ensure_dependencies libaom-dev
- LIBHEIF_REVISION="35dad50a9145332a7bfdf1ff6aef6801fb613d68"
+ LIBHEIF_REVISION="62f1b8c76ed4d8305071fdacbe74ef9717bacac5"
# : "${LIBHEIF_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libheif.json)}"
if [[ "${update:-}" ]] || [[ "$LIBHEIF_REVISION" != "$(grep 'libheif' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
msg_info "Recompiling libheif"
@@ -387,7 +387,7 @@ function compile_libheif() {
function compile_libraw() {
SOURCE=${SOURCE_DIR}/libraw
- LIBRAW_REVISION="0b56545a4f828743f28a4345cdfdd4c49f9f9a2a"
+ LIBRAW_REVISION="b860248a89d9082b8e0a1e202e516f46af9adb29"
# : "${LIBRAW_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libraw.json)}"
if [[ "$LIBRAW_REVISION" != "$(grep 'libraw' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
msg_info "Recompiling libraw"
@@ -430,7 +430,7 @@ function compile_imagemagick() {
function compile_libvips() {
SOURCE=$SOURCE_DIR/libvips
- LIBVIPS_REVISION="0c9151a4f416d2f8ae20a755db218f6637050eec"
+ LIBVIPS_REVISION="17ad2f62dda7e39985955da189183e594683d45e"
if [[ "$LIBVIPS_REVISION" != "$(grep 'libvips' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
msg_info "Recompiling libvips"
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
diff --git a/ct/invoiceshelf.sh b/ct/invoiceshelf.sh
index e6dee2377..15fa2c368 100644
--- a/ct/invoiceshelf.sh
+++ b/ct/invoiceshelf.sh
@@ -52,8 +52,14 @@ function update_script() {
msg_info "Updating Application"
cd /opt/invoiceshelf
$STD composer install --no-dev --optimize-autoloader
- $STD yarn install
- $STD yarn build
+ if command -v corepack >/dev/null 2>&1; then
+ $STD corepack enable
+ $STD corepack yarn install
+ $STD corepack yarn build
+ else
+ $STD yarn install
+ $STD yarn build
+ fi
$STD php artisan migrate --force
$STD php artisan optimize:clear
chown -R www-data:www-data /opt/invoiceshelf
diff --git a/ct/kasm.sh b/ct/kasm.sh
index 0b7a8f38e..930e0748f 100644
--- a/ct/kasm.sh
+++ b/ct/kasm.sh
@@ -1,7 +1,7 @@
#!/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: Omar Minaya
+# Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.kasmweb.com/docs/latest/index.html
@@ -16,7 +16,7 @@ var_arm64="${var_arm64:-yes}"
var_unprivileged="${var_unprivileged:-0}"
var_fuse="${var_fuse:-yes}"
var_tun="${var_tun:-yes}"
-var_kasm_version="${var_kasm_version:-}"
+var_kasm_version="${var_kasm_version:-1.19.0}"
header_info "$APP"
variables
@@ -34,19 +34,18 @@ function update_script() {
msg_info "Checking for new version"
CURRENT_VERSION=$(readlink -f /opt/kasm/current | awk -F'/' '{print $4}')
- KASM_VERSION=$(curl -s https://kasm.com/downloads | grep -oP '
]*>.*?
' | sed -E 's/<\/?h1[^>]*>//g' | grep -oP '\d+\.\d+\.\d+')
- KASM_URL="https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION:-var_kasm_version}.tar.gz"
+ KASM_URL=$(curl -s https://kasm.com/downloads \
+ | grep -oP 'https://kasm-static-content\.s3\.amazonaws\.com/kasm_release_\d+\.\d+\.\d+-latest\.tar\.gz' \
+ | head -1)
+ KASM_VERSION=$(echo "$KASM_URL" | grep -oP '\d+\.\d+\.\d+(?=-latest)')
- # KASM_URL=$(curl -fsSL "https://www.kasm.com/downloads" | tr '\n' ' ' | grep -oE 'https://kasm-static-content[^"]*kasm_release_[0-9]+\.[0-9]+\.[0-9]+\.[a-z0-9]+\.tar\.gz' | head -n 1)
- # if [[ -z "$KASM_URL" ]]; then
- # SERVICE_IMAGE_URL=$(curl -fsSL "https://www.kasm.com/downloads" | tr '\n' ' ' | grep -oE 'https://kasm-static-content[^"]*kasm_release_service_images_amd64_[0-9]+\.[0-9]+\.[0-9]+\.tar\.gz' | head -n 1)
- # if [[ -n "$SERVICE_IMAGE_URL" ]]; then
- # KASM_VERSION=$(echo "$SERVICE_IMAGE_URL" | sed -E 's/.*kasm_release_service_images_amd64_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
- # KASM_URL="https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}.tar.gz"
- # fi
- # else
- # KASM_VERSION=$(echo "$KASM_URL" | sed -E 's/.*kasm_release_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
- # fi
+ # Fallback to predefined version if online lookup failed.
+ if [[ -z "$KASM_VERSION" ]] || [[ -z "$KASM_URL" ]]; then
+ msg_warn "Unable to fetch latest Kasm release online, falling back to v${var_kasm_version}"
+ fi
+
+ KASM_VERSION="${KASM_VERSION:-$var_kasm_version}"
+ KASM_URL="${KASM_URL:-https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}-latest.tar.gz}"
if [[ -z "$KASM_VERSION" ]] || [[ -z "$KASM_URL" ]]; then
msg_error "Unable to detect latest Kasm release URL."
diff --git a/ct/kiwix.sh b/ct/kiwix.sh
new file mode 100644
index 000000000..88016ef4e
--- /dev/null
+++ b/ct/kiwix.sh
@@ -0,0 +1,75 @@
+#!/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
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/kiwix/kiwix-tools
+
+APP="Kiwix"
+var_tags="${var_tags:-documentation;offline}"
+var_cpu="${var_cpu:-1}"
+var_ram="${var_ram:-512}"
+var_disk="${var_disk:-4}"
+var_os="${var_os:-ubuntu}"
+var_version="${var_version:-24.04}"
+var_arm64="${var_arm64:-no}"
+var_unprivileged="${var_unprivileged:-1}"
+
+header_info "$APP"
+variables
+color
+catch_errors
+
+function update_script() {
+ header_info
+ check_container_storage
+ check_container_resources
+
+ if ! dpkg -s kiwix-tools &>/dev/null; then
+ msg_error "No ${APP} Installation Found!"
+ exit
+ fi
+
+ CURRENT=$(dpkg-query -W -f='${Version}' kiwix-tools 2>/dev/null)
+
+ msg_info "Updating Package Index"
+ $STD apt update
+ msg_ok "Updated Package Index"
+
+ CANDIDATE=$(apt-cache policy kiwix-tools | awk '/Candidate:/{print $2}')
+ if [[ -z "$CANDIDATE" || "$CANDIDATE" == "(none)" ]]; then
+ msg_error "No Candidate Version Found for kiwix-tools"
+ exit
+ fi
+
+ if [[ "$CURRENT" == "$CANDIDATE" ]]; then
+ echo "${CURRENT}" >/root/.kiwix
+ msg_ok "Already on latest version: ${CURRENT}"
+ exit
+ fi
+
+ msg_info "Stopping Service"
+ systemctl stop kiwix-serve
+ msg_ok "Stopped Service"
+
+ msg_info "Updating Kiwix-Tools"
+ $STD apt install -y --only-upgrade kiwix-tools
+ RELEASE=$(dpkg-query -W -f='${Version}' kiwix-tools 2>/dev/null)
+ echo "${RELEASE}" >/root/.kiwix
+ msg_ok "Updated Kiwix-Tools"
+ msg_ok "Updated successfully from ${CURRENT} to ${RELEASE}!"
+
+ msg_info "Starting Service"
+ systemctl start kiwix-serve
+ msg_ok "Started Service"
+ 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}:8080${CL}"
diff --git a/ct/litellm.sh b/ct/litellm.sh
new file mode 100644
index 000000000..16d078f40
--- /dev/null
+++ b/ct/litellm.sh
@@ -0,0 +1,15 @@
+#!/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
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+
+APP="LiteLLM"
+
+header_info "$APP"
+variables
+color
+
+msg_error "This script is no longer available in community-scripts."
+msg_error "This script was removed and cannot be installed or updated."
+msg_warn "More info: https://community-scripts.org/scripts/litellm"
+exit 1
diff --git a/ct/minio.sh b/ct/minio.sh
index 95b9facbc..a9ee5c0b1 100644
--- a/ct/minio.sh
+++ b/ct/minio.sh
@@ -1,80 +1,15 @@
#!/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/minio/minio
APP="MinIO"
-var_tags="${var_tags:-object-storage}"
-var_cpu="${var_cpu:-1}"
-var_ram="${var_ram:-1024}"
-var_disk="${var_disk:-5}"
-var_os="${var_os:-debian}"
-var_version="${var_version:-13}"
-var_arm64="${var_arm64:-no}"
-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 /usr/local/bin/minio ]]; then
- msg_error "No ${APP} Installation Found!"
- exit
- fi
- FEATURE_RICH_VERSION="2025-04-22T22-12-26Z"
- RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}')
- CURRENT_VERSION=""
- [[ -f /opt/${APP}_version.txt ]] && CURRENT_VERSION=$(cat /opt/${APP}_version.txt)
- RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}')
-
- if [[ "${CURRENT_VERSION}" == "${FEATURE_RICH_VERSION}" && "${RELEASE}" != "${FEATURE_RICH_VERSION}" ]]; then
- echo
- echo "You are currently running the last feature-rich community version: ${FEATURE_RICH_VERSION}"
- echo "WARNING: Updating to the latest version will REMOVE most management features from the Console UI."
- echo "Do you still want to upgrade to the latest version? [y/N]: "
- read -n 1 -r
- echo
- if [[ ! $REPLY =~ ^[Yy]$ ]]; then
- msg_ok "No update performed. Staying on the feature-rich version."
- exit
- fi
- fi
-
- if [[ "${CURRENT_VERSION}" != "${RELEASE}" ]]; then
- msg_info "Stopping Service"
- systemctl stop minio
- msg_ok "Stopped Service"
-
- msg_info "Updating ${APP} to ${RELEASE}"
- mv /usr/local/bin/minio /usr/local/bin/minio_bak
- curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/minio" -o /usr/local/bin/minio
- chmod +x /usr/local/bin/minio
- rm -f /usr/local/bin/minio_bak
- echo "${RELEASE}" >/opt/${APP}_version.txt
- msg_ok "Updated ${APP}"
-
- msg_info "Starting Service"
- systemctl start minio
- msg_ok "Started Service"
- msg_ok "Updated successfully!"
- else
- msg_ok "No update required. ${APP} is already at ${RELEASE}"
- 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 "${GATEWAY}${BGN}http://${IP}:9000${CL}"
+msg_error "This script is no longer available in community-scripts."
+msg_error "Repository is archived. Minio is gone"
+msg_warn "More info: https://community-scripts.org/scripts/minio"
+exit 1
diff --git a/ct/paperless-ngx.sh b/ct/paperless-ngx.sh
index 9328c3522..da6dffd0d 100644
--- a/ct/paperless-ngx.sh
+++ b/ct/paperless-ngx.sh
@@ -49,7 +49,8 @@ function update_script() {
fi
fi
- if check_for_gh_release "paperless" "paperless-ngx/paperless-ngx"; then
+ RELEASE="v2.20.15"
+ if check_for_gh_release "paperless" "paperless-ngx/paperless-ngx" "${RELEASE}" "v3 needs further testing"; then
msg_info "Stopping all Paperless-ngx Services"
systemctl stop paperless-consumer paperless-webserver paperless-scheduler paperless-task-queue
msg_ok "Stopped all Paperless-ngx Services"
@@ -63,7 +64,7 @@ function update_script() {
msg_ok "Backup completed to $BACKUP_DIR"
PYTHON_VERSION="3.13" setup_uv
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "latest" "/opt/paperless" "paperless*tar.xz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "${RELEASE}" "/opt/paperless" "paperless*tar.xz"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jbig2enc" "ie13/jbig2enc" "tarball" "latest" "/opt/jbig2enc"
. /etc/os-release
@@ -138,7 +139,7 @@ function update_script() {
msg_ok "Backup completed to $BACKUP_DIR"
PYTHON_VERSION="3.13" setup_uv
- CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "latest" "/opt/paperless" "paperless*tar.xz"
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "${RELEASE}" "/opt/paperless" "paperless*tar.xz"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "jbig2enc" "ie13/jbig2enc" "tarball" "latest" "/opt/jbig2enc"
. /etc/os-release
diff --git a/ct/storyteller.sh b/ct/storyteller.sh
index 6ac3a38a3..a461a6d02 100644
--- a/ct/storyteller.sh
+++ b/ct/storyteller.sh
@@ -48,13 +48,14 @@ function update_script() {
msg_info "Rebuilding Storyteller"
cd /opt/storyteller
export NODE_OPTIONS="--max-old-space-size=4096"
- $STD yarn install --network-timeout 600000
+ $STD corepack enable
+ $STD corepack yarn install --network-timeout 600000
$STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so
export CI=1
export NODE_ENV=production
export NEXT_TELEMETRY_DISABLED=1
export SQLITE_NATIVE_BINDING=/opt/storyteller/node_modules/better-sqlite3/build/Release/better_sqlite3.node
- $STD yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
+ $STD corepack yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
mkdir -p /opt/storyteller/web/.next/standalone/web/.next/static
cp -rT /opt/storyteller/web/.next/static /opt/storyteller/web/.next/standalone/web/.next/static
if [[ -d /opt/storyteller/web/public ]]; then
diff --git a/ct/trek.sh b/ct/trek.sh
index 8ad25d7a3..9d411730d 100644
--- a/ct/trek.sh
+++ b/ct/trek.sh
@@ -33,47 +33,80 @@ function update_script() {
NODE_VERSION="24" setup_nodejs
if check_for_gh_release "trek" "mauriceboe/TREK"; then
+ MIGRATION=0
+ grep -qF "ExecStart=/usr/bin/node --import tsx src/index.ts" \
+ /etc/systemd/system/trek.service && MIGRATION=1
+
msg_info "Stopping Service"
systemctl stop trek
msg_ok "Stopped Service"
- msg_info "Backing up Data"
- cp /opt/trek/server/.env /opt/trek.env.bak
- mv /opt/trek/data /opt/trek-data.bak
- mv /opt/trek/uploads /opt/trek-uploads.bak
- msg_ok "Backed up Data"
+ ensure_dependencies "libkitinerary-bin"
+
+ create_backup /opt/trek/server/.env \
+ /opt/trek/data \
+ /opt/trek/uploads
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "trek" "mauriceboe/TREK" "tarball"
- msg_info "Building Client"
- cd /opt/trek/client
+ msg_info "Building TREK"
+ cd /opt/trek
$STD npm ci
- $STD npm run build
- mkdir -p /opt/trek/server/public
- cp -r /opt/trek/client/dist/* /opt/trek/server/public/
- cp -r /opt/trek/client/public/fonts /opt/trek/server/public/fonts 2>/dev/null || true
- msg_ok "Built Client"
+ $STD npm run build --workspace=shared
+ $STD npm run build --workspace=client
+ $STD npm run build --workspace=server
+ msg_ok "Built TREK"
- msg_info "Installing Server Dependencies"
- cd /opt/trek/server
- $STD npm ci
- msg_ok "Installed Server Dependencies"
+ msg_info "Setting up TREK Workspace"
+ rm -rf /opt/trek/server/public
+ mkdir -p /opt/trek/server/public/fonts
+ cp -a /opt/trek/client/dist/. /opt/trek/server/public/
+ cp -a /opt/trek/client/public/fonts/. /opt/trek/server/public/fonts/
+
+ restore_backup
- msg_info "Restoring Data"
- mv /opt/trek-data.bak /opt/trek/data
- mv /opt/trek-uploads.bak /opt/trek/uploads
rm -rf /opt/trek/server/data /opt/trek/server/uploads
ln -s /opt/trek/data /opt/trek/server/data
ln -s /opt/trek/uploads /opt/trek/server/uploads
- cp /opt/trek.env.bak /opt/trek/server/.env
- rm -f /opt/trek.env.bak
- msg_ok "Restored Data"
+
+ rm -rf /opt/trek/node_modules
+ cd /opt/trek
+ $STD npm ci --workspace=server --omit=dev
+ msg_ok "Set up TREK Workspace"
+
+ if [[ "$MIGRATION" == "1" ]]; then
+ msg_info "Migrating TREK Service"
+ cat </etc/systemd/system/trek.service
+[Unit]
+Description=TREK Travel Planner
+Documentation=https://github.com/mauriceboe/TREK
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/trek/server
+EnvironmentFile=/opt/trek/server/.env
+Environment=XDG_CACHE_HOME=/tmp/trek-kf6-cache
+Environment=QT_QPA_PLATFORM=offscreen
+ExecStart=/usr/bin/node --require tsconfig-paths/register dist/index.js
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+ systemctl daemon-reload
+ msg_ok "Migrated TREK Service"
+ fi
msg_info "Starting Service"
systemctl start trek
msg_ok "Started Service"
msg_ok "Updated Successfully!"
fi
+
exit
}
diff --git a/ct/vaultwarden.sh b/ct/vaultwarden.sh
index a33dd40a1..a7d6e598e 100644
--- a/ct/vaultwarden.sh
+++ b/ct/vaultwarden.sh
@@ -37,6 +37,11 @@ function update_script() {
"2" "Set Admin Token")
if [ "$UPD" == "1" ]; then
+ INSTALLED_VERSION="$(/opt/vaultwarden/bin/vaultwarden --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)"
+ if [[ -n "$INSTALLED_VERSION" ]] &&
+ ! grep -qxF "$INSTALLED_VERSION" "$HOME/.vaultwarden" 2>/dev/null; then
+ printf '%s\n' "$INSTALLED_VERSION" >"$HOME/.vaultwarden"
+ fi
if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then
msg_info "Stopping Service"
systemctl stop vaultwarden
diff --git a/ct/watcharr.sh b/ct/watcharr.sh
index 3dd3b1106..149841389 100644
--- a/ct/watcharr.sh
+++ b/ct/watcharr.sh
@@ -34,9 +34,9 @@ function update_script() {
systemctl stop watcharr
msg_ok "Stopped Service"
- rm -f /opt/watcharr/server/watcharr
- rm -rf /opt/watcharr/server/ui
- fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
+ create_backup /opt/watcharr/server/data
+ CLEAN_INSTALL=1 fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
+ restore_backup
msg_info "Updating Watcharr"
cd /opt/watcharr
diff --git a/install/authentik-install.sh b/install/authentik-install.sh
index 77251987d..a539c0d03 100644
--- a/install/authentik-install.sh
+++ b/install/authentik-install.sh
@@ -59,7 +59,7 @@ PG_VERSION="17" setup_postgresql
PG_DB_NAME="authentik" PG_DB_USER="authentik" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db
XMLSEC_VERSION="1.3.11"
-AUTHENTIK_VERSION="version/2026.5.2"
+AUTHENTIK_VERSION="version/2026.5.3"
fetch_and_deploy_gh_release "xmlsec" "lsh123/xmlsec" "tarball" "${XMLSEC_VERSION}" "/opt/xmlsec"
fetch_and_deploy_gh_release "authentik" "goauthentik/authentik" "tarball" "${AUTHENTIK_VERSION}" "/opt/authentik"
fetch_and_deploy_gh_release "geoipupdate" "maxmind/geoipupdate" "binary"
diff --git a/install/bookorbit-install.sh b/install/bookorbit-install.sh
new file mode 100644
index 000000000..48c249a2d
--- /dev/null
+++ b/install/bookorbit-install.sh
@@ -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/bookorbit/bookorbit
+
+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 \
+ build-essential \
+ ffmpeg \
+ poppler-utils
+msg_ok "Installed Dependencies"
+
+PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql
+PG_DB_NAME="bookorbit" PG_DB_USER="bookorbit" PG_DB_EXTENSIONS="uuid-ossp,pg_trgm,vector" setup_postgresql_db
+NODE_VERSION="24" setup_nodejs
+setup_uv
+
+fetch_and_deploy_gh_release "bookorbit" "bookorbit/bookorbit" "tarball"
+
+msg_info "Building Application"
+cd /opt/bookorbit
+PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/bookorbit/package.json)
+$STD corepack enable
+$STD corepack prepare "pnpm@${PNPM_VERSION}" --activate
+$STD pnpm install --frozen-lockfile
+$STD pnpm --filter client run build-only
+$STD pnpm --filter server run build
+cp -r /opt/bookorbit/client/dist /opt/bookorbit/server/public
+mkdir -p /opt/bookorbit/server/migrations
+cp -r /opt/bookorbit/server/src/db/migrations/. /opt/bookorbit/server/migrations/
+chmod +x /opt/bookorbit/server/bin/kepubify/*
+msg_ok "Built Application"
+
+msg_info "Setting up Python Runtime"
+$STD uv venv /opt/bookorbit-python
+$STD uv pip install --python /opt/bookorbit-python/bin/python -r /opt/bookorbit/server/requirements/kobo-cloudscraper.txt
+msg_ok "Set up Python Runtime"
+
+msg_info "Configuring Application"
+mkdir -p /opt/bookorbit-data/covers /opt/bookorbit-data/book-bucket /opt/bookorbit-books
+APP_VER=$(cat ~/.bookorbit)
+JWT_SECRET=$(openssl rand -hex 32)
+SETUP_BOOTSTRAP_TOKEN=$(openssl rand -hex 16)
+cat <>~/bookorbit.creds
+
+Setup Token: ${SETUP_BOOTSTRAP_TOKEN}
+EOF
+cat </opt/bookorbit/.env
+NODE_ENV=production
+PORT=3000
+DATABASE_URL=postgres://${PG_DB_USER}:${PG_DB_PASS}@127.0.0.1:5432/${PG_DB_NAME}
+JWT_SECRET=${JWT_SECRET}
+SETUP_BOOTSTRAP_TOKEN=${SETUP_BOOTSTRAP_TOKEN}
+APP_URL=http://${LOCAL_IP}:3000
+CLIENT_URL=http://${LOCAL_IP}:3000
+NODE_OPTIONS=--max-old-space-size=2048
+APP_DATA_PATH=/opt/bookorbit-data
+KOBO_CLOUDSCRAPER_PYTHON=/opt/bookorbit-python/bin/python
+BOOK_DOCK_PATH=/opt/bookorbit-data/book-bucket
+APP_VERSION=v${APP_VER}
+EOF
+msg_ok "Configured Application"
+
+msg_info "Creating Service"
+cat </etc/systemd/system/bookorbit.service
+[Unit]
+Description=BookOrbit Service
+After=network.target postgresql.service
+Requires=postgresql.service
+
+[Service]
+Type=simple
+User=root
+WorkingDirectory=/opt/bookorbit/server
+EnvironmentFile=/opt/bookorbit/.env
+ExecStartPre=/usr/bin/node /opt/bookorbit/server/dist/scripts/migrate.js
+ExecStart=/usr/bin/node /opt/bookorbit/server/dist/main.js
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now bookorbit
+msg_ok "Created Service"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/crafty-controller-install.sh b/install/crafty-controller-install.sh
index 309d4c4d0..87a1b3a24 100644
--- a/install/crafty-controller-install.sh
+++ b/install/crafty-controller-install.sh
@@ -16,29 +16,22 @@ update_os
msg_info "Setting up TemurinJDK"
setup_java
$STD apt install -y temurin-{8,11,17,21,25}-jre
-sudo update-alternatives --set java /usr/lib/jvm/temurin-25-jre-$(get_arch_value)/bin/java
+$STD update-alternatives --set java /usr/lib/jvm/temurin-25-jre-$(get_arch_value)/bin/java
msg_ok "Installed TemurinJDK"
msg_info "Setup Python3"
$STD apt install -y \
- python3 \
python3-dev \
python3-pip \
python3-venv
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
msg_ok "Setup Python3"
-msg_info "Installing Crafty-Controller (Patience)"
useradd crafty -m -s /bin/bash
-cd /opt
mkdir -p /opt/crafty-controller/crafty /opt/crafty-controller/server
-RELEASE=$(curl -fsSL "https://gitlab.com/api/v4/projects/20430749/releases" | grep -o '"tag_name":"v[^"]*"' | head -n 1 | sed 's/"tag_name":"v//;s/"//')
-echo "${RELEASE}" >"/opt/crafty-controller_version.txt"
-curl -fsSL "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip" -o "crafty-4-v${RELEASE}.zip"
-$STD unzip crafty-4-v"${RELEASE}".zip
-cp -a crafty-4-v"${RELEASE}"/. /opt/crafty-controller/crafty/crafty-4/
-rm -rf crafty-4-v"${RELEASE}"
+fetch_and_deploy_gl_release "Crafty-Controller" "crafty-controller/crafty-4" "tarball" "latest" "/opt/crafty-controller/crafty/crafty-4"
+msg_info "Installing Crafty-Controller dependencies (Patience)"
cd /opt/crafty-controller/crafty
python3 -m venv .venv
chown -R crafty:crafty /opt/crafty-controller/
@@ -47,7 +40,7 @@ $STD sudo -u crafty bash -c '
cd /opt/crafty-controller/crafty/crafty-4
pip3 install --no-cache-dir -r requirements.txt
'
-msg_ok "Installed Craft-Controller and dependencies"
+msg_ok "Installed Crafty-Controller dependencies"
msg_info "Setting up service"
cat </etc/systemd/system/crafty-controller.service
@@ -80,7 +73,6 @@ if [[ -f "$CREDS_FILE" ]]; then
} >>~/crafty-controller.creds
fi
msg_ok "Service started"
-
motd_ssh
customize
-cleanup_lxc
+cleanup_lxc
\ No newline at end of file
diff --git a/install/degoog-install.sh b/install/degoog-install.sh
index 4411b2789..7e120eb2c 100644
--- a/install/degoog-install.sh
+++ b/install/degoog-install.sh
@@ -27,6 +27,7 @@ ln -sf /root/.bun/bin/bun /usr/local/bin/bun
ln -sf /root/.bun/bin/bunx /usr/local/bin/bunx
msg_ok "Installed Bun"
+fetch_and_deploy_gh_release "curl-impersonate" "lexiforest/curl-impersonate" "prebuild" "latest" "/usr/local/bin" "curl-impersonate-v*.$(uname -m)-linux-gnu.tar.gz"
fetch_and_deploy_gh_release "degoog" "fccview/degoog" "prebuild" "latest" "/opt/degoog" "degoog_*_prebuild.tar.gz"
msg_info "Setting up degoog"
@@ -39,7 +40,7 @@ DEGOOG_PLUGINS_DIR=/opt/degoog/data/plugins
DEGOOG_THEMES_DIR=/opt/degoog/data/themes
DEGOOG_ALIASES_FILE=/opt/degoog/data/aliases.json
DEGOOG_PLUGIN_SETTINGS_FILE=/opt/degoog/data/plugin-settings.json
-DEGOOG_VALKEY_URL=redis://valkey:6379
+DEGOOG_VALKEY_URL=redis://127.0.0.1:6379
DEGOOG_CACHE_MAX_ENTRIES=1000
DEGOOG_CACHE_TTL_MS=43200000
# DEGOOG_SETTINGS_PASSWORDS=changeme
diff --git a/install/feishin-install.sh b/install/feishin-install.sh
new file mode 100644
index 000000000..68669db7d
--- /dev/null
+++ b/install/feishin-install.sh
@@ -0,0 +1,68 @@
+#!/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/jeffvli/feishin
+
+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 \
+ gettext-base
+msg_ok "Installed Dependencies"
+
+NODE_VERSION="24" setup_nodejs
+
+fetch_and_deploy_gh_release "feishin" "jeffvli/feishin" "tarball"
+
+msg_info "Building Feishin Web"
+cd /opt/feishin
+#PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/feishin/package.json)
+$STD corepack enable
+$STD corepack prepare "pnpm@10" --activate
+$STD pnpm install
+$STD pnpm run build:web
+msg_ok "Built Feishin Web"
+
+msg_info "Configuring Environment"
+cat </opt/feishin/.env
+SERVER_NAME=jellyfin
+SERVER_LOCK=false
+SERVER_TYPE=jellyfin
+SERVER_URL=http://localhost:8096
+REMOTE_URL=
+LEGACY_AUTHENTICATION=false
+ANALYTICS_DISABLED=false
+PUBLIC_PATH=/
+EOF
+msg_ok "Configured Environment"
+
+msg_info "Publishing Web Assets"
+rm -rf /usr/share/nginx/html
+mkdir -p /usr/share/nginx/html
+cp -r /opt/feishin/out/web/. /usr/share/nginx/html/
+
+set -a
+source /opt/feishin/.env
+set +a
+
+envsubst /etc/nginx/conf.d/settings.js
+envsubst '${PUBLIC_PATH}' /etc/nginx/sites-available/feishin
+
+ln -sf /etc/nginx/sites-available/feishin /etc/nginx/sites-enabled/feishin
+rm -f /etc/nginx/sites-enabled/default
+systemctl enable -q --now nginx
+systemctl reload nginx
+msg_ok "Published Web Assets"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/flowiseai-install.sh b/install/flowiseai-install.sh
index 1af403d16..769d734fd 100644
--- a/install/flowiseai-install.sh
+++ b/install/flowiseai-install.sh
@@ -14,12 +14,17 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y build-essential python3-dev
+$STD apt install -y \
+ build-essential \
+ pkg-config
msg_ok "Installed Dependencies"
-NODE_VERSION="24" setup_nodejs
+PYTHON_VERSION="3.11" setup_uv
+NODE_VERSION="22" setup_nodejs #needed because better-sql break
msg_info "Installing FlowiseAI (Patience)"
+PYTHON_BIN="$(uv python find 3.11)"
+export npm_config_python="$PYTHON_BIN"
$STD npm install -g flowise \
@opentelemetry/exporter-trace-otlp-grpc \
@opentelemetry/exporter-trace-otlp-proto \
diff --git a/install/homebox-install.sh b/install/homebox-install.sh
index 70d370249..065a16874 100644
--- a/install/homebox-install.sh
+++ b/install/homebox-install.sh
@@ -18,11 +18,13 @@ fetch_and_deploy_gh_release "homebox" "sysadminsmedia/homebox" "prebuild" "lates
msg_info "Configuring Homebox"
chmod +x /opt/homebox/homebox
+AUTH_KEY="$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | cut -c1-32)"
cat </opt/homebox/.env
# For possible environment variables check here: https://homebox.software/en/configure-homebox
HBOX_MODE=production
HBOX_WEB_PORT=7745
HBOX_WEB_HOST=0.0.0.0
+HBOX_AUTH_API_KEY_PEPPER=${AUTH_KEY}
EOF
msg_ok "Configured Homebox"
diff --git a/install/immich-install.sh b/install/immich-install.sh
index a31ad9e45..378dd0642 100644
--- a/install/immich-install.sh
+++ b/install/immich-install.sh
@@ -178,7 +178,7 @@ cd "$STAGING_DIR"
SOURCE=${SOURCE_DIR}/libjxl
JPEGLI_LIBJPEG_LIBRARY_SOVERSION="62"
JPEGLI_LIBJPEG_LIBRARY_VERSION="62.3.0"
-LIBJXL_REVISION="794a5dcf0d54f9f0b20d288a12e87afb91d20dfc"
+LIBJXL_REVISION="332feb17d17311c748445f7ee75c4fb55cc38530"
# : "${LIBJXL_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libjxl.json)}"
$STD git clone https://github.com/libjxl/libjxl.git "$SOURCE"
cd "$SOURCE"
@@ -216,7 +216,7 @@ msg_ok "(1/5) Compiled libjxl"
msg_info "(2/5) Compiling libheif"
SOURCE=${SOURCE_DIR}/libheif
-LIBHEIF_REVISION="35dad50a9145332a7bfdf1ff6aef6801fb613d68"
+LIBHEIF_REVISION="62f1b8c76ed4d8305071fdacbe74ef9717bacac5"
# : "${LIBHEIF_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libheif.json)}"
$STD git clone https://github.com/strukturag/libheif.git "$SOURCE"
cd "$SOURCE"
@@ -242,7 +242,7 @@ msg_ok "(2/5) Compiled libheif"
msg_info "(3/5) Compiling libraw"
SOURCE=${SOURCE_DIR}/libraw
-LIBRAW_REVISION="0b56545a4f828743f28a4345cdfdd4c49f9f9a2a"
+LIBRAW_REVISION="b860248a89d9082b8e0a1e202e516f46af9adb29"
# : "${LIBRAW_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libraw.json)}"
$STD git clone https://github.com/LibRaw/LibRaw.git "$SOURCE"
cd "$SOURCE"
@@ -272,7 +272,7 @@ msg_ok "(4/5) Compiled imagemagick"
msg_info "(5/5) Compiling libvips"
SOURCE=$SOURCE_DIR/libvips
-LIBVIPS_REVISION="0c9151a4f416d2f8ae20a755db218f6637050eec"
+LIBVIPS_REVISION="17ad2f62dda7e39985955da189183e594683d45e"
$STD git clone https://github.com/libvips/libvips.git "$SOURCE"
cd "$SOURCE"
$STD git reset --hard "$LIBVIPS_REVISION"
diff --git a/install/invoiceninja-install.sh b/install/invoiceninja-install.sh
index 0cc5af74a..cfd2379cb 100644
--- a/install/invoiceninja-install.sh
+++ b/install/invoiceninja-install.sh
@@ -133,6 +133,8 @@ server {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
+ fastcgi_param HTTP_X_FORWARDED_HOST $http_host;
+ fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;
fastcgi_read_timeout 300;
}
diff --git a/install/invoiceshelf-install.sh b/install/invoiceshelf-install.sh
index 6160c66f5..368fcf6e6 100644
--- a/install/invoiceshelf-install.sh
+++ b/install/invoiceshelf-install.sh
@@ -39,8 +39,14 @@ sed -i "s|^DB_USERNAME=.*|DB_USERNAME=${PG_DB_USER}|" .env
sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=${PG_DB_PASS}|" .env
COMPOSER_ALLOW_SUPERUSER=1 $STD composer install --no-dev --optimize-autoloader --no-interaction
$STD php artisan key:generate
-$STD yarn install
-$STD yarn build
+if command -v corepack >/dev/null 2>&1; then
+ $STD corepack enable
+ $STD corepack yarn install
+ $STD corepack yarn build
+else
+ $STD yarn install
+ $STD yarn build
+fi
mkdir -p storage/framework/{cache,sessions,views} storage/logs bootstrap/cache
chown -R www-data:www-data /opt/invoiceshelf
chmod -R 775 storage bootstrap/cache
diff --git a/install/kasm-install.sh b/install/kasm-install.sh
index 3b9bafa10..f5dbd024f 100644
--- a/install/kasm-install.sh
+++ b/install/kasm-install.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
-# Author: Omar Minaya
+# Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.kasmweb.com/docs/latest/index.html
@@ -18,19 +18,18 @@ $STD sh <(curl -fsSL https://get.docker.com/)
msg_ok "Installed Docker"
msg_info "Detecting latest Kasm Workspaces release"
-KASM_VERSION=$(curl -s https://kasm.com/downloads | grep -oP ']*>.*?
' | sed -E 's/<\/?h1[^>]*>//g' | grep -oP '\d+\.\d+\.\d+')
-KASM_URL="https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION:-var_kasm_version}.tar.gz"
+KASM_URL=$(curl -s https://kasm.com/downloads \
+ | grep -oP 'https://kasm-static-content\.s3\.amazonaws\.com/kasm_release_\d+\.\d+\.\d+-latest\.tar\.gz' \
+ | head -1)
+KASM_VERSION=$(echo "$KASM_URL" | grep -oP '\d+\.\d+\.\d+(?=-latest)')
-# KASM_URL=$(curl -fsSL "https://www.kasm.com/downloads" | tr '\n' ' ' | grep -oE 'https://kasm-static-content[^"]*kasm_release_[0-9]+\.[0-9]+\.[0-9]+\.[a-z0-9]+\.tar\.gz' | head -n 1)
-# if [[ -z "$KASM_URL" ]]; then
-# SERVICE_IMAGE_URL=$(curl -fsSL "https://www.kasm.com/downloads" | tr '\n' ' ' | grep -oE 'https://kasm-static-content[^"]*kasm_release_service_images_amd64_[0-9]+\.[0-9]+\.[0-9]+\.tar\.gz' | head -n 1)
-# if [[ -n "$SERVICE_IMAGE_URL" ]]; then
-# KASM_VERSION=$(echo "$SERVICE_IMAGE_URL" | sed -E 's/.*kasm_release_service_images_amd64_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
-# KASM_URL="https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}.tar.gz"
-# fi
-# else
-# KASM_VERSION=$(echo "$KASM_URL" | sed -E 's/.*kasm_release_([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
-# fi
+# Fallback to predefined version if online lookup failed.
+if [[ -z "$KASM_VERSION" ]] || [[ -z "$KASM_URL" ]]; then
+ msg_warn "Unable to fetch latest Kasm release online, falling back to v${var_kasm_version}"
+fi
+
+KASM_VERSION="${KASM_VERSION:-$var_kasm_version}"
+KASM_URL="${KASM_URL:-https://kasm-static-content.s3.amazonaws.com/kasm_release_${KASM_VERSION}-latest.tar.gz}"
if [[ -z "$KASM_VERSION" ]] || [[ -z "$KASM_URL" ]]; then
msg_error "Unable to detect latest Kasm release URL."
diff --git a/install/kiwix-install.sh b/install/kiwix-install.sh
new file mode 100644
index 000000000..9208c6998
--- /dev/null
+++ b/install/kiwix-install.sh
@@ -0,0 +1,80 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2021-2026 community-scripts ORG
+# Author: MickLesk (CanbiZ) | tewalds
+# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
+# Source: https://github.com/kiwix/kiwix-tools
+
+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 software-properties-common
+msg_ok "Installed Dependencies"
+
+msg_info "Adding Kiwix PPA"
+add-apt-repository -y ppa:kiwixteam/release >>"$(get_active_logfile)" 2>&1
+$STD apt update
+msg_ok "Added Kiwix PPA"
+
+msg_info "Installing Kiwix-Tools"
+$STD apt install -y kiwix-tools
+RELEASE=$(dpkg -s kiwix-tools 2>/dev/null | awk '/^Version:/{print $2}')
+mkdir -p /data
+echo "${RELEASE}" >/root/.kiwix
+msg_ok "Installed Kiwix-Tools"
+
+msg_info "Downloading Kiwix Test Archive"
+ZIM_BASE_URL="https://download.kiwix.org/zim/wikipedia"
+ZIM_FILE="$(CURL_TIMEOUT=60 CURL_CONNECT_TO=15 curl_with_retry "${ZIM_BASE_URL}/" "-" |
+ grep -oE 'href="speedtest_en_blob_[0-9]{4}-[0-9]{2}\.zim"' |
+ sed -E 's/^href="|"$//g' |
+ sort -V |
+ tail -n 1)" || true
+
+if [[ -z "${ZIM_FILE}" ]]; then
+ msg_warn "No Kiwix speedtest ZIM archive found - skipping optional download"
+else
+ ZIM_URL="${ZIM_BASE_URL}/${ZIM_FILE}"
+ ZIM_TEMP="/data/.${ZIM_FILE}.tmp"
+ ZIM_TARGET="/data/${ZIM_FILE}"
+ if ! CURL_TIMEOUT=120 CURL_CONNECT_TO=15 curl_with_retry "${ZIM_URL}" "${ZIM_TEMP}"; then
+ rm -f "${ZIM_TEMP}"
+ msg_warn "Failed to download Kiwix ZIM archive - skipping optional download"
+ ZIM_FILE=""
+ elif [[ ! -s "${ZIM_TEMP}" ]]; then
+ rm -f "${ZIM_TEMP}"
+ msg_warn "Downloaded Kiwix ZIM archive is empty - skipping optional download"
+ ZIM_FILE=""
+ else
+ mv "${ZIM_TEMP}" "${ZIM_TARGET}"
+ msg_ok "Downloaded Kiwix Test Archive (${ZIM_FILE})"
+ fi
+fi
+
+msg_info "Creating Service"
+cat <<'EOF' >/etc/systemd/system/kiwix-serve.service
+[Unit]
+Description=Kiwix ZIM Server
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/bin/sh -c 'exec /usr/bin/kiwix-serve --port 8080 /data/*.zim'
+Restart=on-failure
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+systemctl enable -q --now kiwix-serve
+msg_ok "Created Service"
+
+motd_ssh
+customize
+cleanup_lxc
diff --git a/install/minio-install.sh b/install/minio-install.sh
deleted file mode 100644
index 4596fa9ad..000000000
--- a/install/minio-install.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/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/minio/minio
-
-source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
-color
-verb_ip6
-catch_errors
-setting_up_container
-network_check
-update_os
-
-FEATURE_RICH_VERSION="2025-04-22T22-12-26Z"
-
-echo
-echo "MinIO recently removed many management features from the Console UI."
-echo "The last feature-complete version is: $FEATURE_RICH_VERSION"
-echo "Latest versions require the paid edition for full UI functionality."
-echo
-echo "Choose which version to install:"
-echo " [N] Feature-rich community version ($FEATURE_RICH_VERSION) [Recommended]"
-echo " [Y] Latest version (may lack UI features)"
-echo
-read -p "Install latest MinIO version? [y/N]: " -n 1 -r
-echo
-if [[ $REPLY =~ ^[Yy]$ ]]; then
- USE_LATEST=true
-else
- USE_LATEST=false
-fi
-
-msg_info "Setting up MinIO"
-if [[ "$USE_LATEST" == "true" ]]; then
- RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}')
- DOWNLOAD_URL="https://dl.min.io/server/minio/release/linux-amd64/minio"
-else
- RELEASE="$FEATURE_RICH_VERSION"
- DOWNLOAD_URL="https://dl.min.io/server/minio/release/linux-amd64/archive/minio.RELEASE.${FEATURE_RICH_VERSION}"
-fi
-
-curl -fsSL "$DOWNLOAD_URL" -o /usr/local/bin/minio
-chmod +x /usr/local/bin/minio
-useradd -r minio-user -s /sbin/nologin
-mkdir -p /home/minio-user
-chown minio-user:minio-user /home/minio-user
-mkdir -p /data
-chown minio-user:minio-user /data
-
-MINIO_ADMIN_USER="minioadmin"
-MINIO_ADMIN_PASSWORD="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)"
-
-cat </etc/default/minio
-MINIO_ROOT_USER=${MINIO_ADMIN_USER}
-MINIO_ROOT_PASSWORD=${MINIO_ADMIN_PASSWORD}
-EOF
-
-{
- echo ""
- echo "MinIO Credentials"
- echo "MinIO Admin User: $MINIO_ADMIN_USER"
- echo "MinIO Admin Password: $MINIO_ADMIN_PASSWORD"
-} >>~/minio.creds
-echo "${RELEASE}" >/opt/${APPLICATION,,}_version.txt
-msg_ok "Setup MinIO"
-
-msg_info "Creating service"
-cat </etc/systemd/system/minio.service
-[Unit]
-Description=MinIO
-Documentation=https://docs.min.io
-Wants=network-online.target
-After=network-online.target
-
-[Service]
-User=minio-user
-Group=minio-user
-EnvironmentFile=-/etc/default/minio
-ExecStart=/usr/local/bin/minio server --console-address ":9001" /data
-Restart=always
-RestartSec=5
-LimitNOFILE=65536
-
-[Install]
-WantedBy=multi-user.target
-EOF
-
-systemctl enable -q --now minio
-msg_ok "Service created"
-
-motd_ssh
-customize
-cleanup_lxc
diff --git a/install/openobserve-install.sh b/install/openobserve-install.sh
index 651fcad52..1057ff629 100644
--- a/install/openobserve-install.sh
+++ b/install/openobserve-install.sh
@@ -17,7 +17,7 @@ msg_info "Installing OpenObserve"
mkdir -p /opt/openobserve/data
RELEASE=$(get_latest_github_release "openobserve/openobserve")
tar zxf <(curl -fsSL https://downloads.openobserve.ai/releases/openobserve/v$RELEASE/openobserve-v$RELEASE-linux-amd64.tar.gz) -C /opt/openobserve
-ROOT_PASS=$(openssl rand -base64 18 | cut -c1-13)
+ROOT_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c9)Aa1!"
cat </opt/openobserve/data/.env
ZO_ROOT_USER_EMAIL = "admin@example.com"
diff --git a/install/paperless-ngx-install.sh b/install/paperless-ngx-install.sh
index b7d1745a4..639783a89 100644
--- a/install/paperless-ngx-install.sh
+++ b/install/paperless-ngx-install.sh
@@ -46,7 +46,7 @@ msg_ok "Installed Dependencies"
PG_VERSION="16" setup_postgresql
PG_DB_NAME="paperlessdb" PG_DB_USER="paperless" setup_postgresql_db
PYTHON_VERSION="3.13" setup_uv
-fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "latest" "/opt/paperless" "paperless*tar.xz"
+fetch_and_deploy_gh_release "paperless" "paperless-ngx/paperless-ngx" "prebuild" "v2.20.15" "/opt/paperless" "paperless*tar.xz"
msg_info "Setup Paperless-ngx"
cd /opt/paperless
diff --git a/install/storyteller-install.sh b/install/storyteller-install.sh
index e02ee1a6b..3bf66cea6 100644
--- a/install/storyteller-install.sh
+++ b/install/storyteller-install.sh
@@ -32,7 +32,8 @@ fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "ta
msg_info "Setting up Storyteller"
cd /opt/storyteller
-$STD yarn install --network-timeout 600000
+$STD corepack enable
+$STD corepack yarn install --network-timeout 600000
$STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so
STORYTELLER_SECRET_KEY=$(openssl rand -base64 32)
cat </opt/storyteller/.env
@@ -58,7 +59,7 @@ export CI=1
export NODE_ENV=production
export NEXT_TELEMETRY_DISABLED=1
export SQLITE_NATIVE_BINDING=/opt/storyteller/node_modules/better-sqlite3/build/Release/better_sqlite3.node
-$STD yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
+$STD corepack yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
mkdir -p /opt/storyteller/web/.next/standalone/web/.next/static
cp -rT /opt/storyteller/web/.next/static /opt/storyteller/web/.next/standalone/web/.next/static
if [[ -d /opt/storyteller/web/public ]]; then
diff --git a/install/trek-install.sh b/install/trek-install.sh
index 48656e935..c189afc1b 100644
--- a/install/trek-install.sh
+++ b/install/trek-install.sh
@@ -14,57 +14,82 @@ network_check
update_os
msg_info "Installing Dependencies"
-$STD apt install -y build-essential
+$STD apt install -y \
+ build-essential \
+ libkitinerary-bin
msg_ok "Installed Dependencies"
NODE_VERSION="24" setup_nodejs
fetch_and_deploy_gh_release "trek" "mauriceboe/TREK" "tarball"
-msg_info "Building Client"
-cd /opt/trek/client
+msg_info "Setup TREK"
+cd /opt/trek
$STD npm ci
-$STD npm run build
-msg_ok "Built Client"
+$STD npm run build --workspace=shared
+$STD npm run build --workspace=client
+$STD npm run build --workspace=server
+msg_ok "Setup TREK"
-msg_info "Setting up Server"
-cd /opt/trek/server
-$STD npm ci
+msg_info "Setting up TREK Workspace"
+rm -rf /opt/trek/server/public
mkdir -p /opt/trek/server/public
-cp -r /opt/trek/client/dist/* /opt/trek/server/public/
-cp -r /opt/trek/client/public/fonts /opt/trek/server/public/fonts 2>/dev/null || true
-mkdir -p /opt/trek/{data/logs,uploads/{files,covers,avatars,photos}}
-rm -rf /opt/trek/server/data /opt/trek/server/uploads
+cp -a /opt/trek/client/dist/. /opt/trek/server/public/
+if [[ -d /opt/trek/client/public/fonts ]]; then
+ mkdir -p /opt/trek/server/public/fonts
+ cp -a /opt/trek/client/public/fonts/. /opt/trek/server/public/fonts/
+fi
+mkdir -p \
+ /opt/trek/data/logs \
+ /opt/trek/uploads/files \
+ /opt/trek/uploads/covers \
+ /opt/trek/uploads/avatars \
+ /opt/trek/uploads/photos
+rm -rf /opt/trek/server/data
+rm -rf /opt/trek/server/uploads
ln -s /opt/trek/data /opt/trek/server/data
ln -s /opt/trek/uploads /opt/trek/server/uploads
+cd /opt/trek
+$STD npm prune --omit=dev
+msg_ok "Set up TREK Workspace"
+
+msg_info "Configuring TREK"
ENCRYPTION_KEY=$(openssl rand -hex 32)
ADMIN_EMAIL="admin@trek.local"
ADMIN_PASSWORD=$(openssl rand -base64 18 | tr -dc 'A-Za-z0-9' | head -c 16)
cat </opt/trek/server/.env
NODE_ENV=production
+HOST=0.0.0.0
PORT=3000
ENCRYPTION_KEY=${ENCRYPTION_KEY}
ADMIN_EMAIL=${ADMIN_EMAIL}
ADMIN_PASSWORD=${ADMIN_PASSWORD}
+TZ=UTC
+LOG_LEVEL=info
+DEFAULT_LANGUAGE=en
+ALLOWED_ORIGINS=
COOKIE_SECURE=false
FORCE_HTTPS=false
-LOG_LEVEL=info
-TZ=UTC
+TRUST_PROXY=1
EOF
chmod 600 /opt/trek/server/.env
-msg_ok "Set up Server"
+msg_ok "Configured TREK"
msg_info "Creating Service"
cat </etc/systemd/system/trek.service
[Unit]
Description=TREK Travel Planner
-After=network.target
+Documentation=https://github.com/mauriceboe/TREK
+After=network-online.target
+Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/trek/server
EnvironmentFile=/opt/trek/server/.env
-ExecStart=/usr/bin/node --import tsx src/index.ts
+Environment=XDG_CACHE_HOME=/tmp/trek-kf6-cache
+Environment=QT_QPA_PLATFORM=offscreen
+ExecStart=/usr/bin/node --require tsconfig-paths/register dist/index.js
Restart=on-failure
RestartSec=5
diff --git a/misc/build.func b/misc/build.func
index be4c6be0d..b90c89901 100644
--- a/misc/build.func
+++ b/misc/build.func
@@ -979,6 +979,20 @@ base_settings() {
IPV6_METHOD=${var_ipv6_method:-"none"}
GATE=${var_gateway:-""}
+
+ # Guard against invalid gateway combinations from defaults/app vars:
+ # - DHCP must not force a static gateway
+ # - Static IPv4 must use a gateway in the same subnet
+ if [[ "$NET" == "dhcp" && -n "$GATE" ]]; then
+ msg_warn "Ignoring var_gateway '$GATE' because var_net is 'dhcp'"
+ GATE=""
+ elif [[ "$NET" != "dhcp" && -n "$GATE" ]]; then
+ if ! validate_gateway_in_subnet "$NET" "$GATE"; then
+ msg_warn "Ignoring var_gateway '$GATE' because it is not in subnet of var_net '$NET'"
+ GATE=""
+ fi
+ fi
+
APT_CACHER=${var_apt_cacher:-""}
APT_CACHER_IP=${var_apt_cacher_ip:-""}
@@ -3631,6 +3645,53 @@ run_addon_updates() {
done
}
+
+runtime_script_status_guard() {
+ local script_slug="${SCRIPT_SLUG:-${NSAPP:-}}"
+ script_slug="$(echo "$script_slug" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')"
+ [[ -z "$script_slug" ]] && return 0
+
+ local api_url="https://db.community-scripts.org/api/collections/script_scripts/records?filter=(slug='${script_slug}')&perPage=1&fields=slug,is_disabled,is_deleted,disable_message,deleted_message"
+ local response
+ if ! response=$(curl -fsSL --connect-timeout 2 --max-time 3 "$api_url" 2>/dev/null); then
+ msg_warn "Script status check is unavailable. Continuing without status verification."
+ return 0
+ fi
+
+ if ! command -v jq >/dev/null 2>&1; then
+ msg_warn "Missing jq for script status check. Continuing without status verification."
+ return 0
+ fi
+
+ local has_record is_deleted is_disabled deleted_message disable_message info_url
+ has_record=$(printf '%s' "$response" | jq -r '.items | length')
+ [[ "$has_record" == "0" ]] && return 0
+
+ is_deleted=$(printf '%s' "$response" | jq -r '.items[0].is_deleted // false')
+ is_disabled=$(printf '%s' "$response" | jq -r '.items[0].is_disabled // false')
+ deleted_message=$(printf '%s' "$response" | jq -r '.items[0].deleted_message // ""')
+ disable_message=$(printf '%s' "$response" | jq -r '.items[0].disable_message // ""')
+ info_url="https://community-scripts.org/scripts/${script_slug}"
+
+ if [[ "$is_deleted" == "true" ]]; then
+ msg_error "This script is no longer available in community-scripts."
+ [[ -n "$deleted_message" ]] && msg_error "$deleted_message"
+ [[ -z "$deleted_message" ]] && msg_error "This script was removed and cannot be installed or updated."
+ msg_warn "More info: ${info_url}"
+ return 1
+ fi
+
+ if [[ "$is_disabled" == "true" ]]; then
+ msg_error "This script is currently disabled in community-scripts."
+ [[ -n "$disable_message" ]] && msg_error "$disable_message"
+ [[ -z "$disable_message" ]] && msg_error "Updates and installs are temporarily disabled for this script."
+ msg_warn "More info: ${info_url}"
+ return 1
+ fi
+
+ return 0
+}
+
# ------------------------------------------------------------------------------
# start()
#
@@ -3639,9 +3700,11 @@ run_addon_updates() {
# - In silent mode: runs update_script with automatic cleanup
# - Otherwise: shows update/setting menu and runs update_script with cleanup
# ------------------------------------------------------------------------------
+
start() {
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
if command -v pveversion >/dev/null 2>&1; then
+ runtime_script_status_guard || return 0
install_script || return 0
return 0
elif [ ! -z ${PHS_SILENT+x} ] && [[ "${PHS_SILENT}" == "1" ]]; then
@@ -3649,6 +3712,7 @@ start() {
set_std_mode
ensure_profile_loaded
get_lxc_ip
+ runtime_script_status_guard || return 0
update_script
run_addon_updates
update_motd_ip
@@ -3659,6 +3723,7 @@ start() {
set_std_mode
ensure_profile_loaded
get_lxc_ip
+ runtime_script_status_guard || return 0
update_script
run_addon_updates
update_motd_ip
@@ -3688,6 +3753,7 @@ start() {
esac
ensure_profile_loaded
get_lxc_ip
+ runtime_script_status_guard || return 0
update_script
run_addon_updates
update_motd_ip
@@ -4380,10 +4446,12 @@ EOF
pct exec "$CTID" -- bash -c "apt-get update 2>&1 && apt-get install -y ${_base_pkgs} 2>&1" >>"$BUILD_LOG" 2>&1 || {
local failed_mirror
failed_mirror=$(pct exec "$CTID" -- bash -c "grep -m1 -oP '(?<=URIs: https?://)[^/]+' /etc/apt/sources.list.d/debian.sources 2>/dev/null || grep -m1 -oP '(?<=deb https?://)[^/]+' /etc/apt/sources.list 2>/dev/null" 2>/dev/null || echo "unknown")
- msg_warn "apt-get update failed (${failed_mirror}), trying alternate mirrors..."
+ msg_warn "apt-get update failed (${failed_mirror})."
+ msg_custom "âšī¸" "${YW}" "Probing alternate mirrors (this can take 1-2 minutes on network issues)"
local mirror_exit=0
pct exec "$CTID" -- env APT_BASE="$_base_pkgs" bash -c '
DISTRO=$(. /etc/os-release 2>/dev/null && echo "$ID" || echo "debian")
+ echo " Mirror fallback for distro: $DISTRO"
if [ "$DISTRO" = "ubuntu" ]; then
EU_MIRRORS="de.archive.ubuntu.com fr.archive.ubuntu.com se.archive.ubuntu.com nl.archive.ubuntu.com it.archive.ubuntu.com ch.archive.ubuntu.com mirrors.xtom.de"
@@ -4441,15 +4509,21 @@ EOF
}
# Phase 1: Scan global mirrors first (independent of local CDN issues)
+ echo " Phase 1/3: Scanning global mirrors for reachability..."
OTHERS_OK=$(scan_reachable "$OTHERS")
OTHERS_PICK=$(printf "%s\n" $OTHERS_OK | shuf | head -3 | xargs)
+ if [ -z "$OTHERS_PICK" ]; then
+ echo " No reachable global mirrors found"
+ fi
+
for mirror in $OTHERS_PICK; do
echo " Attempting mirror: $mirror"
try_mirrors "$mirror" && exit 0
done
# Phase 2: Try primary mirror
+ echo " Phase 2/3: Trying primary mirror..."
if [ "$DISTRO" = "ubuntu" ]; then
PRIMARY="archive.ubuntu.com"
else
@@ -4461,9 +4535,14 @@ EOF
fi
# Phase 3: Fall back to regional mirrors
+ echo " Phase 3/3: Scanning regional mirrors..."
REGIONAL_OK=$(scan_reachable "$REGIONAL")
REGIONAL_PICK=$(printf "%s\n" $REGIONAL_OK | shuf | head -3 | xargs)
+ if [ -z "$REGIONAL_PICK" ]; then
+ echo " No reachable regional mirrors found"
+ fi
+
for mirror in $REGIONAL_PICK; do
echo " Attempting mirror: $mirror"
try_mirrors "$mirror" && exit 0
@@ -4497,12 +4576,14 @@ EOF
msg_warn "Mirror '${custom_mirror}' also failed. Try another or type 'skip'."
done
if [[ "$custom_mirror" == "skip" ]]; then
- msg_error "apt-get base packages installation failed"
- install_exit_code=1
+ msg_warn "Mirror selection aborted by user ('skip')"
+ msg_warn "Aborting installation before base package bootstrap"
+ post_update_to_api "aborted" "130" "force"
+ install_exit_code=130
fi
elif [[ $mirror_exit -ne 0 ]]; then
msg_error "apt-get base packages installation failed"
- install_exit_code=1
+ install_exit_code=100
fi
}
fi
diff --git a/misc/tools.func b/misc/tools.func
index 705950667..6a0c3ed88 100644
--- a/misc/tools.func
+++ b/misc/tools.func
@@ -5267,6 +5267,8 @@ _setup_intel_arc() {
intel-media-va-driver-non-free \
intel-opencl-icd \
libmfx-gen1.2 \
+ mesa-vulkan-drivers \
+ vulkan-tools \
vainfo \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel Arc packages failed"
@@ -5301,6 +5303,8 @@ _setup_intel_arc() {
ocl-icd-libopencl1 \
libvpl2 \
libmfx-gen1.2 \
+ mesa-vulkan-drivers \
+ vulkan-tools \
vainfo \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel Arc packages failed"
@@ -5324,6 +5328,8 @@ _setup_intel_modern() {
va-driver-all \
intel-media-va-driver \
ocl-icd-libopencl1 \
+ mesa-vulkan-drivers \
+ vulkan-tools \
vainfo \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel packages failed"
@@ -5358,6 +5364,8 @@ _setup_intel_modern() {
$STD apt -y install \
intel-media-va-driver-non-free \
ocl-icd-libopencl1 \
+ mesa-vulkan-drivers \
+ vulkan-tools \
vainfo \
libmfx-gen1.2 \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel packages failed"
@@ -8108,7 +8116,7 @@ setup_postgresql_db() {
IFS=',' read -ra EXT_LIST <<<"${PG_DB_EXTENSIONS:-}"
for ext in "${EXT_LIST[@]}"; do
ext=$(echo "$ext" | xargs) # Trim whitespace
- $STD sudo -u postgres psql -d "$PG_DB_NAME" -c "CREATE EXTENSION IF NOT EXISTS $ext;"
+ $STD sudo -u postgres psql -d "$PG_DB_NAME" -c "CREATE EXTENSION IF NOT EXISTS \"$ext\";"
done
fi
diff --git a/tools/addon/immich-public-proxy.sh b/tools/addon/immich-public-proxy.sh
index e464382d5..f6d72fd51 100644
--- a/tools/addon/immich-public-proxy.sh
+++ b/tools/addon/immich-public-proxy.sh
@@ -99,7 +99,7 @@ function update() {
msg_info "Installing dependencies"
cd "$CONFIG_PATH"
- $STD npm install
+ $STD npm ci
msg_ok "Installed dependencies"
msg_info "Building ${APP}"
@@ -151,7 +151,7 @@ function install() {
msg_info "Installing dependencies"
cd "$CONFIG_PATH"
- $STD npm install
+ $STD npm ci
msg_ok "Installed dependencies"
msg_info "Building ${APP}"