diff --git a/.github/changelogs/2026/03.md b/.github/changelogs/2026/03.md new file mode 100644 index 000000000..9a2e0de42 --- /dev/null +++ b/.github/changelogs/2026/03.md @@ -0,0 +1,183 @@ +## 2026-03-07 + +### 🆕 New Scripts + + - ImmichFrame ([#12653](https://github.com/community-scripts/ProxmoxVE/pull/12653)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Grocy: bump PHP version from 8.3 to 8.5 [@MickLesk](https://github.com/MickLesk) ([#12651](https://github.com/community-scripts/ProxmoxVE/pull/12651)) + - Check for influxdb3 installation in update_script [@odin568](https://github.com/odin568) ([#12648](https://github.com/community-scripts/ProxmoxVE/pull/12648)) + - Update Rdtclient to dotnet 10.0 [@asylumexp](https://github.com/asylumexp) ([#12638](https://github.com/community-scripts/ProxmoxVE/pull/12638)) + - fix(immich): fix update script failing to add Debian testing repo when preferences file already exists [@Copilot](https://github.com/Copilot) ([#12631](https://github.com/community-scripts/ProxmoxVE/pull/12631)) + +### 💾 Core + + - #### ✨ New Features + + - tools: add interactive GitHub PAT prompt on rate limit / auth failure [@MickLesk](https://github.com/MickLesk) ([#12652](https://github.com/community-scripts/ProxmoxVE/pull/12652)) + +### 🌐 Website + + - #### 📝 Script Information + + - Papra: update repository URL to papra-hq/papra [@MickLesk](https://github.com/MickLesk) ([#12650](https://github.com/community-scripts/ProxmoxVE/pull/12650)) + +## 2026-03-06 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - RustDesk Server: Fix update script [@tremor021](https://github.com/tremor021) ([#12625](https://github.com/community-scripts/ProxmoxVE/pull/12625)) + - [Node-RED] Restart service after update [@Aurelien30000](https://github.com/Aurelien30000) ([#12621](https://github.com/community-scripts/ProxmoxVE/pull/12621)) + - wealthfolio: update cors [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12617](https://github.com/community-scripts/ProxmoxVE/pull/12617)) + - CryptPad: Better update handling [@tremor021](https://github.com/tremor021) ([#12611](https://github.com/community-scripts/ProxmoxVE/pull/12611)) + + - #### ✨ New Features + + - RustDesk Server: Switch to updated repository [@tremor021](https://github.com/tremor021) ([#12083](https://github.com/community-scripts/ProxmoxVE/pull/12083)) + + - #### 💥 Breaking Changes + + - Semaphore: Move from BoltDB to SQLite [@tremor021](https://github.com/tremor021) ([#12624](https://github.com/community-scripts/ProxmoxVE/pull/12624)) + +## 2026-03-05 + +### 🆕 New Scripts + + - ddclient ([#12587](https://github.com/community-scripts/ProxmoxVE/pull/12587)) +- Netbird ([#12585](https://github.com/community-scripts/ProxmoxVE/pull/12585)) +- Papra ([#12577](https://github.com/community-scripts/ProxmoxVE/pull/12577)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - fluid-calendar: add build-essential to install and update dependencies [@Copilot](https://github.com/Copilot) ([#12602](https://github.com/community-scripts/ProxmoxVE/pull/12602)) + - Refactor: BentoPDF [@vhsdream](https://github.com/vhsdream) ([#12597](https://github.com/community-scripts/ProxmoxVE/pull/12597)) + - Tianji: Fix the bug introduced by the refactor [@tremor021](https://github.com/tremor021) ([#12564](https://github.com/community-scripts/ProxmoxVE/pull/12564)) + - PowerDNS: use 'launch=' instead of 'launch+=' for gsqlite3 backend [@MickLesk](https://github.com/MickLesk) ([#12579](https://github.com/community-scripts/ProxmoxVE/pull/12579)) + +### 🗑️ Deleted Scripts + + - Suwayomi-Server: remove due to inactivity and very low usage [@MickLesk](https://github.com/MickLesk) ([#12596](https://github.com/community-scripts/ProxmoxVE/pull/12596)) + +### 💾 Core + + - #### 🔧 Refactor + + - core: add var_os / var_version to whitelist for app.vars [@MickLesk](https://github.com/MickLesk) ([#12576](https://github.com/community-scripts/ProxmoxVE/pull/12576)) + +## 2026-03-04 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - fix: gitea-mirror [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12549](https://github.com/community-scripts/ProxmoxVE/pull/12549)) + - fix(immich): correct LibRaw clone URL to official upstream [@DenislavDenev](https://github.com/DenislavDenev) ([#12526](https://github.com/community-scripts/ProxmoxVE/pull/12526)) + - update: stirling-pdf: java 25 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12552](https://github.com/community-scripts/ProxmoxVE/pull/12552)) + - Docmost: register NoopAuditService globally when EE submodule is missing [@MickLesk](https://github.com/MickLesk) ([#12551](https://github.com/community-scripts/ProxmoxVE/pull/12551)) + - jellyseer/overseer migration corrupting /usr/bin/update [@MickLesk](https://github.com/MickLesk) ([#12539](https://github.com/community-scripts/ProxmoxVE/pull/12539)) + - PowerDNS: use gsqlite3 backend instead of BIND [@MickLesk](https://github.com/MickLesk) ([#12538](https://github.com/community-scripts/ProxmoxVE/pull/12538)) + - addon migrations: /usr/bin/update replacement to prevent syntax error [@MickLesk](https://github.com/MickLesk) ([#12540](https://github.com/community-scripts/ProxmoxVE/pull/12540)) + + - #### 🔧 Refactor + + - Fluid-Calendar: NodeJS bump [@tremor021](https://github.com/tremor021) ([#12558](https://github.com/community-scripts/ProxmoxVE/pull/12558)) + - Refactor: LiteLLM [@tremor021](https://github.com/tremor021) ([#12550](https://github.com/community-scripts/ProxmoxVE/pull/12550)) + +### 💾 Core + + - #### 🐞 Bug Fixes + + - tools: fall back to distro packages for psql [@MickLesk](https://github.com/MickLesk) ([#12542](https://github.com/community-scripts/ProxmoxVE/pull/12542)) + - fix: whitelist var_searchdomain and fix the handling of var_ns and va… [@tommoyer](https://github.com/tommoyer) ([#12521](https://github.com/community-scripts/ProxmoxVE/pull/12521)) + +## 2026-03-03 + +### 🆕 New Scripts + + - Tinyauth: v5 Support & add Debian Version [@MickLesk](https://github.com/MickLesk) ([#12501](https://github.com/community-scripts/ProxmoxVE/pull/12501)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - cross-seed: install build-essential to resolve missing `make` error [@Copilot](https://github.com/Copilot) ([#12522](https://github.com/community-scripts/ProxmoxVE/pull/12522)) + - meshcentral: increased disk space to 4GB [@MickLesk](https://github.com/MickLesk) ([#12509](https://github.com/community-scripts/ProxmoxVE/pull/12509)) + + - #### 🔧 Refactor + + - opnsense-vm: harden temp dir, bridge detection and network selection [@MickLesk](https://github.com/MickLesk) ([#12513](https://github.com/community-scripts/ProxmoxVE/pull/12513)) + +### 🗑️ Deleted Scripts + + - Remove Unifi Network Server scripts (dead APT repo) [@Copilot](https://github.com/Copilot) ([#12500](https://github.com/community-scripts/ProxmoxVE/pull/12500)) + +### 💾 Core + + - #### ✨ New Features + + - core: recovery - add ENOSPC disk-full detection with auto-retry using * 2 hdd [@MickLesk](https://github.com/MickLesk) ([#12511](https://github.com/community-scripts/ProxmoxVE/pull/12511)) + +### 📚 Documentation + + - Fix config_path casing in reactive-resume.json [@ScubyG](https://github.com/ScubyG) ([#12525](https://github.com/community-scripts/ProxmoxVE/pull/12525)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - Revert #11534 PR that messed up search [@BramSuurdje](https://github.com/BramSuurdje) ([#12492](https://github.com/community-scripts/ProxmoxVE/pull/12492)) + +## 2026-03-02 + +### 🆕 New Scripts + + - PowerDNS ([#12481](https://github.com/community-scripts/ProxmoxVE/pull/12481)) +- Profilarr ([#12441](https://github.com/community-scripts/ProxmoxVE/pull/12441)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Tracearr: prepare for imminent v1.4.19 release [@durzo](https://github.com/durzo) ([#12413](https://github.com/community-scripts/ProxmoxVE/pull/12413)) + + - #### ✨ New Features + + - Frigate: Bump to v0.17 [@MickLesk](https://github.com/MickLesk) ([#12474](https://github.com/community-scripts/ProxmoxVE/pull/12474)) + + - #### 💥 Breaking Changes + + - Migrate: DokPloy, Komodo, Coolify, Dockge, Runtipi to Addons [@MickLesk](https://github.com/MickLesk) ([#12275](https://github.com/community-scripts/ProxmoxVE/pull/12275)) + + - #### 🔧 Refactor + + - ref: replace generic exit 1 with specific exit codes in ct & install [@MickLesk](https://github.com/MickLesk) ([#12475](https://github.com/community-scripts/ProxmoxVE/pull/12475)) + +### 💾 Core + + - #### ✨ New Features + + - tools.func: Improve stability with retry logic, caching, and debug mode [@MickLesk](https://github.com/MickLesk) ([#10351](https://github.com/community-scripts/ProxmoxVE/pull/10351)) + + - #### 🔧 Refactor + + - core: standardize exit codes and add mappings [@MickLesk](https://github.com/MickLesk) ([#12467](https://github.com/community-scripts/ProxmoxVE/pull/12467)) + +### 🌐 Website + + - frontend: improve detail view badges, addon texts, and HTML title [@MickLesk](https://github.com/MickLesk) ([#12461](https://github.com/community-scripts/ProxmoxVE/pull/12461)) + +## 2026-03-01 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Sparkyfitness: use pnpm [@tomfrenzel](https://github.com/tomfrenzel) ([#12445](https://github.com/community-scripts/ProxmoxVE/pull/12445)) + - OpenArchiver: Fix installation [@tremor021](https://github.com/tremor021) ([#12447](https://github.com/community-scripts/ProxmoxVE/pull/12447)) diff --git a/.github/workflows/close_issue_in_dev.yaml b/.github/workflows/close_issue_in_dev.yaml index 0a12c05a3..688f81f27 100644 --- a/.github/workflows/close_issue_in_dev.yaml +++ b/.github/workflows/close_issue_in_dev.yaml @@ -6,14 +6,14 @@ on: jobs: close_issue: if: github.event.pull_request.merged == true && github.repository == 'community-scripts/ProxmoxVE' - runs-on: ubuntu-latest - + runs-on: self-hosted + steps: - - name: Checkout target repo (main) + - name: Checkout target repo (merge commit) uses: actions/checkout@v4 with: repository: community-scripts/ProxmoxVE - ref: main + ref: ${{ github.event.pull_request.merge_commit_sha }} token: ${{ secrets.GITHUB_TOKEN }} - name: Extract and Process PR Title @@ -23,6 +23,39 @@ jobs: echo "Processed Title: $title" echo "title=$title" >> $GITHUB_ENV + - name: Get slugs from merged PR + id: get_slugs + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + pr_files=$(gh pr view ${{ github.event.pull_request.number }} --repo community-scripts/ProxmoxVE --json files -q '.files[].path' 2>/dev/null || true) + slugs="" + for path in $pr_files; do + [[ -f "$path" ]] || continue + if [[ "$path" == frontend/public/json/*.json ]]; then + s=$(jq -r '.slug // empty' "$path" 2>/dev/null) + [[ -n "$s" ]] && slugs="$slugs $s" + elif [[ "$path" == ct/*.sh ]] || [[ "$path" == install/*.sh ]] || [[ "$path" == tools/*.sh ]] || [[ "$path" == turnkey/*.sh ]] || [[ "$path" == vm/*.sh ]]; then + base=$(basename "$path" .sh) + if [[ "$path" == install/* && "$base" == *-install ]]; then + s="${base%-install}" + else + s="$base" + fi + [[ -n "$s" ]] && slugs="$slugs $s" + fi + done + slugs=$(echo $slugs | xargs -n1 | sort -u | tr '\n' ' ') + if [[ -z "$slugs" && -n "$title" ]]; then + slugs="$title" + fi + if [[ -z "$slugs" ]]; then + echo "count=0" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "$slugs" > pocketbase_slugs.txt + echo "count=$(echo $slugs | wc -w)" >> "$GITHUB_OUTPUT" + - name: Search for Issues with Similar Titles id: find_issue env: @@ -63,3 +96,104 @@ jobs: run: | gh issue comment $issue_number --repo community-scripts/ProxmoxVED --body "Merged with #${{ github.event.pull_request.number }} in ProxmoxVE" gh issue close $issue_number --repo community-scripts/ProxmoxVED + + - name: Set is_dev to false in PocketBase + if: steps.get_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 }} + PR_URL: ${{ github.server_url }}/${{ github.repository }}/pull/${{ github.event.pull_request.number }} + run: | + node << 'ENDSCRIPT' + (async function() { + const fs = require('fs'); + const https = require('https'); + const http = require('http'); + const url = require('url'); + + function request(fullUrl, opts) { + 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) { + 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 slugsText = fs.readFileSync('pocketbase_slugs.txt', 'utf8').trim(); + const slugs = slugsText ? slugsText.split(/\s+/).filter(Boolean) : []; + if (slugs.length === 0) { + console.log('No slugs to update.'); + return; + } + + const authUrl = apiBase + '/collections/users/auth-with-password'; + const authBody = JSON.stringify({ + identity: process.env.POCKETBASE_ADMIN_EMAIL, + password: process.env.POCKETBASE_ADMIN_PASSWORD + }); + const authRes = await request(authUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: authBody + }); + if (!authRes.ok) { + throw new Error('Auth failed: ' + authRes.body); + } + const token = JSON.parse(authRes.body).token; + const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records'; + const prUrl = process.env.PR_URL || ''; + + for (const slug of slugs) { + const filter = "(slug='" + slug.replace(/'/g, "''") + "')"; + const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', { + headers: { 'Authorization': token } + }); + const list = JSON.parse(listRes.body); + const record = list.items && list.items[0]; + if (!record) { + console.log('Slug not in DB, skipping: ' + slug); + continue; + } + const patchRes = await request(recordsUrl + '/' + record.id, { + method: 'PATCH', + headers: { 'Authorization': token, 'Content-Type': 'application/json' }, + body: JSON.stringify({ + name: record.name || record.slug, + last_update_commit: prUrl, + is_dev: false + }) + }); + if (!patchRes.ok) { + console.warn('PATCH failed for slug ' + slug + ': ' + patchRes.body); + continue; + } + console.log('Set is_dev=false for slug: ' + slug); + } + console.log('Done.'); + })().catch(e => { console.error(e); process.exit(1); }); + ENDSCRIPT + shell: bash diff --git a/.github/workflows/delete-pocketbase-entry-on-removal.yml b/.github/workflows/delete-pocketbase-entry-on-removal.yml new file mode 100644 index 000000000..473568efc --- /dev/null +++ b/.github/workflows/delete-pocketbase-entry-on-removal.yml @@ -0,0 +1,150 @@ +name: Delete PocketBase entry on script/JSON removal + +on: + push: + branches: + - main + paths: + - "frontend/public/json/**" + - "vm/**" + - "tools/**" + - "turnkey/**" + - "ct/**" + - "install/**" + +jobs: + delete-pocketbase-entry: + runs-on: self-hosted + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get slugs from deleted JSON and script files + id: slugs + run: | + BEFORE="${{ github.event.before }}" + AFTER="${{ github.event.after }}" + slugs="" + + # Deleted JSON files: get slug from previous commit + deleted_json=$(git diff --name-only --diff-filter=D "$BEFORE" "$AFTER" -- frontend/public/json/ | grep '\.json$' || true) + for f in $deleted_json; do + [[ -z "$f" ]] && continue + s=$(git show "$BEFORE:$f" 2>/dev/null | jq -r '.slug // empty' 2>/dev/null || true) + [[ -n "$s" ]] && slugs="$slugs $s" + done + + # Deleted script files: derive slug from path + 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 + base="${f##*/}" + base="${base%.sh}" + if [[ "$f" == install/* && "$base" == *-install ]]; then + s="${base%-install}" + else + s="$base" + fi + [[ -n "$s" ]] && slugs="$slugs $s" + done + + slugs=$(echo $slugs | xargs -n1 | sort -u | tr '\n' ' ') + if [[ -z "$slugs" ]]; then + echo "No deleted JSON or script files to remove from PocketBase." + echo "count=0" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "$slugs" > slugs_to_delete.txt + echo "count=$(echo $slugs | wc -w)" >> "$GITHUB_OUTPUT" + echo "Slugs to delete: $slugs" + + - name: Delete from PocketBase + 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: | + node << 'ENDSCRIPT' + (async function() { + const fs = require('fs'); + const https = require('https'); + const http = require('http'); + const url = require('url'); + + function request(fullUrl, opts) { + 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) { + 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 slugs = fs.readFileSync('slugs_to_delete.txt', 'utf8').trim().split(/\s+/).filter(Boolean); + + const authUrl = apiBase + '/collections/users/auth-with-password'; + const authBody = JSON.stringify({ + identity: process.env.POCKETBASE_ADMIN_EMAIL, + password: process.env.POCKETBASE_ADMIN_PASSWORD + }); + const authRes = await request(authUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: authBody + }); + if (!authRes.ok) { + throw new Error('Auth failed. Response: ' + authRes.body); + } + const token = JSON.parse(authRes.body).token; + const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records'; + + for (const slug of slugs) { + const filter = "(slug='" + slug + "')"; + const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', { + headers: { 'Authorization': token } + }); + const list = JSON.parse(listRes.body); + const existingId = list.items && list.items[0] && list.items[0].id; + if (!existingId) { + console.log('No PocketBase record for slug "' + slug + '", skipping.'); + continue; + } + const delRes = await request(recordsUrl + '/' + existingId, { + method: 'DELETE', + headers: { 'Authorization': token } + }); + if (delRes.ok) { + console.log('Deleted PocketBase record for slug "' + slug + '" (id=' + existingId + ').'); + } else { + console.warn('DELETE failed for slug "' + slug + '": ' + delRes.statusCode + ' ' + delRes.body); + } + } + console.log('Done.'); + })().catch(e => { console.error(e); process.exit(1); }); + ENDSCRIPT + shell: bash diff --git a/.github/workflows/trigger_github_pages_redirect.yml b/.github/workflows/trigger_github_pages_redirect.yml new file mode 100644 index 000000000..41a8c38a8 --- /dev/null +++ b/.github/workflows/trigger_github_pages_redirect.yml @@ -0,0 +1,41 @@ +name: Pages Redirect + +on: + workflow_dispatch: + +permissions: + pages: write + id-token: write + contents: read + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Create redirect page + run: | + mkdir site + cat < site/index.html + + + + + + + Redirecting... + + + Redirecting... + + + EOF + + - uses: actions/upload-pages-artifact@v3 + with: + path: site + + - name: Deploy + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/update-script-timestamp-on-sh-change.yml b/.github/workflows/update-script-timestamp-on-sh-change.yml new file mode 100644 index 000000000..5716e6b60 --- /dev/null +++ b/.github/workflows/update-script-timestamp-on-sh-change.yml @@ -0,0 +1,167 @@ +name: Update script timestamp on .sh changes + +on: + push: + branches: + - main + paths: + - "ct/**/*.sh" + - "install/**/*.sh" + - "tools/**/*.sh" + - "turnkey/**/*.sh" + - "vm/**/*.sh" + +jobs: + update-script-timestamp: + runs-on: self-hosted + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get changed .sh files and derive slugs + id: slugs + run: | + changed=$(git diff --name-only "${{ github.event.before }}" "${{ github.event.after }}" -- ct/ install/ tools/ turnkey/ vm/ | grep '\.sh$' || true) + if [[ -z "$changed" ]]; then + echo "No .sh files changed in ct/, install/, tools/, turnkey/, or vm/." + echo "count=0" >> "$GITHUB_OUTPUT" + exit 0 + fi + declare -A seen + slugs="" + for f in $changed; do + [[ -f "$f" ]] || continue + base="${f##*/}" + base="${base%.sh}" + if [[ "$f" == install/* && "$base" == *-install ]]; then + slug="${base%-install}" + else + slug="$base" + fi + if [[ -z "${seen[$slug]:-}" ]]; then + seen[$slug]=1 + slugs="$slugs $slug" + fi + done + slugs=$(echo $slugs | xargs -n1 | sort -u) + if [[ -z "$slugs" ]]; then + echo "No slugs to update." + echo "count=0" >> "$GITHUB_OUTPUT" + exit 0 + fi + echo "$slugs" > changed_slugs.txt + echo "count=$(echo "$slugs" | wc -w)" >> "$GITHUB_OUTPUT" + + - name: Parse PR number from merge commit + id: pr + run: | + re='#([0-9]+)' + if [[ "$COMMIT_MSG" =~ $re ]]; then + echo "number=${BASH_REMATCH[1]}" >> "$GITHUB_OUTPUT" + else + echo "number=" >> "$GITHUB_OUTPUT" + fi + env: + COMMIT_MSG: ${{ github.event.head_commit.message }} + + - name: Update script timestamps in PocketBase + 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 }} + COMMIT_URL: ${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }} + PR_URL: ${{ steps.pr.outputs.number != '' && format('{0}/{1}/pull/{2}', github.server_url, github.repository, steps.pr.outputs.number) || '' }} + run: | + node << 'ENDSCRIPT' + (async function() { + const fs = require('fs'); + const https = require('https'); + const http = require('http'); + const url = require('url'); + + function request(fullUrl, opts) { + 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) { + 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 slugsText = fs.readFileSync('changed_slugs.txt', 'utf8').trim(); + const slugs = slugsText ? slugsText.split(/\s+/).filter(Boolean) : []; + if (slugs.length === 0) { + console.log('No slugs to update.'); + return; + } + + const authUrl = apiBase + '/collections/users/auth-with-password'; + const authBody = JSON.stringify({ + identity: process.env.POCKETBASE_ADMIN_EMAIL, + password: process.env.POCKETBASE_ADMIN_PASSWORD + }); + const authRes = await request(authUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: authBody + }); + 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 slugs) { + const filter = "(slug='" + slug.replace(/'/g, "''") + "')"; + const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', { + headers: { 'Authorization': token } + }); + const list = JSON.parse(listRes.body); + const record = list.items && list.items[0]; + if (!record) { + console.log('Slug not in DB, skipping: ' + slug); + continue; + } + const patchRes = await request(recordsUrl + '/' + record.id, { + method: 'PATCH', + headers: { 'Authorization': token, 'Content-Type': 'application/json' }, + body: JSON.stringify({ + name: record.name || record.slug, + last_update_commit: process.env.PR_URL || process.env.COMMIT_URL || '' + }) + }); + if (!patchRes.ok) { + console.warn('PATCH failed for slug ' + slug + ': ' + patchRes.body); + continue; + } + console.log('Updated timestamp for slug: ' + slug); + } + console.log('Done.'); + })().catch(e => { console.error(e); process.exit(1); }); + ENDSCRIPT + shell: bash diff --git a/CHANGELOG.md b/CHANGELOG.md index 8faba68ce..6cb6b2aa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,9 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit + + +

📜 History

@@ -32,6 +35,13 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit

2026

+
+

March (7 entries)

+ +[View March 2026 Changelog](.github/changelogs/2026/03.md) + +
+

February (28 entries)

@@ -410,8 +420,110 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+## 2026-03-11 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Tracearr: Increase default disk variable from 5 to 10 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12762](https://github.com/community-scripts/ProxmoxVE/pull/12762)) + - Fix Wireguard Dashboard update [@odin568](https://github.com/odin568) ([#12767](https://github.com/community-scripts/ProxmoxVE/pull/12767)) + +### 🧰 Tools + + - #### ✨ New Features + + - Coder-Code-Server: Check if config file exists [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#12758](https://github.com/community-scripts/ProxmoxVE/pull/12758)) + +## 2026-03-10 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - [Fix] Immich: Pin libvips to 8.17.3 [@vhsdream](https://github.com/vhsdream) ([#12744](https://github.com/community-scripts/ProxmoxVE/pull/12744)) + +## 2026-03-09 + +### 🚀 Updated Scripts + + - Pin Opencloud to 5.2.0 [@vhsdream](https://github.com/vhsdream) ([#12721](https://github.com/community-scripts/ProxmoxVE/pull/12721)) + + - #### 🐞 Bug Fixes + + - [Hotfix] qBittorrent: Disable UPnP port forwarding by default [@vhsdream](https://github.com/vhsdream) ([#12728](https://github.com/community-scripts/ProxmoxVE/pull/12728)) + - [Quickfix] Opencloud: ensure correct case for binary [@vhsdream](https://github.com/vhsdream) ([#12729](https://github.com/community-scripts/ProxmoxVE/pull/12729)) + - Omada: Bump libssl [@MickLesk](https://github.com/MickLesk) ([#12724](https://github.com/community-scripts/ProxmoxVE/pull/12724)) + - openwebui: Ensure required dependencies [@MickLesk](https://github.com/MickLesk) ([#12717](https://github.com/community-scripts/ProxmoxVE/pull/12717)) + - Frigate: try an OpenVino model build fallback [@MickLesk](https://github.com/MickLesk) ([#12704](https://github.com/community-scripts/ProxmoxVE/pull/12704)) + - Change cronjob setup to use www-data user [@opastorello](https://github.com/opastorello) ([#12695](https://github.com/community-scripts/ProxmoxVE/pull/12695)) + - RustDesk Server: Fix check_for_gh_release function call [@tremor021](https://github.com/tremor021) ([#12694](https://github.com/community-scripts/ProxmoxVE/pull/12694)) + + - #### ✨ New Features + + - feat: improve zigbee2mqtt backup handler [@MickLesk](https://github.com/MickLesk) ([#12714](https://github.com/community-scripts/ProxmoxVE/pull/12714)) + + - #### 💥 Breaking Changes + + - Reactive Resume: rewrite for v5 using original repo amruthpilla/reactive-resume [@MickLesk](https://github.com/MickLesk) ([#12705](https://github.com/community-scripts/ProxmoxVE/pull/12705)) + +### 💾 Core + + - #### ✨ New Features + + - tools: add Alpine (apk) support to ensure_dependencies and is_package_installed [@MickLesk](https://github.com/MickLesk) ([#12703](https://github.com/community-scripts/ProxmoxVE/pull/12703)) + - tools.func: extend hwaccel with ROCm [@MickLesk](https://github.com/MickLesk) ([#12707](https://github.com/community-scripts/ProxmoxVE/pull/12707)) + +### 🌐 Website + + - #### ✨ New Features + + - feat: add CopycatWarningToast component for user warnings [@BramSuurdje](https://github.com/BramSuurdje) ([#12733](https://github.com/community-scripts/ProxmoxVE/pull/12733)) + +## 2026-03-08 + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - [Fix] Immich: chown install dir before machine-learning update [@vhsdream](https://github.com/vhsdream) ([#12684](https://github.com/community-scripts/ProxmoxVE/pull/12684)) + - [Fix] Scanopy: Build generate-fixtures [@vhsdream](https://github.com/vhsdream) ([#12686](https://github.com/community-scripts/ProxmoxVE/pull/12686)) + - fix: rustdeskserver: use correct repo string [@CrazyWolf13](https://github.com/CrazyWolf13) ([#12682](https://github.com/community-scripts/ProxmoxVE/pull/12682)) + - NZBGet: Fixes for RAR5 handling [@tremor021](https://github.com/tremor021) ([#12675](https://github.com/community-scripts/ProxmoxVE/pull/12675)) + +### 🌐 Website + + - #### 🐞 Bug Fixes + + - LXC-Execute: Fix slug [@tremor021](https://github.com/tremor021) ([#12681](https://github.com/community-scripts/ProxmoxVE/pull/12681)) + ## 2026-03-07 +### 🆕 New Scripts + + - ImmichFrame ([#12653](https://github.com/community-scripts/ProxmoxVE/pull/12653)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Grocy: bump PHP version from 8.3 to 8.5 [@MickLesk](https://github.com/MickLesk) ([#12651](https://github.com/community-scripts/ProxmoxVE/pull/12651)) + - Check for influxdb3 installation in update_script [@odin568](https://github.com/odin568) ([#12648](https://github.com/community-scripts/ProxmoxVE/pull/12648)) + - Update Rdtclient to dotnet 10.0 [@asylumexp](https://github.com/asylumexp) ([#12638](https://github.com/community-scripts/ProxmoxVE/pull/12638)) + - fix(immich): fix update script failing to add Debian testing repo when preferences file already exists [@Copilot](https://github.com/Copilot) ([#12631](https://github.com/community-scripts/ProxmoxVE/pull/12631)) + +### 💾 Core + + - #### ✨ New Features + + - tools: add interactive GitHub PAT prompt on rate limit / auth failure [@MickLesk](https://github.com/MickLesk) ([#12652](https://github.com/community-scripts/ProxmoxVE/pull/12652)) + +### 🌐 Website + + - #### 📝 Script Information + + - Papra: update repository URL to papra-hq/papra [@MickLesk](https://github.com/MickLesk) ([#12650](https://github.com/community-scripts/ProxmoxVE/pull/12650)) + ## 2026-03-06 ### 🚀 Updated Scripts @@ -1293,217 +1405,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### ❔ Uncategorized - - Opencloud: fix JSON [@vhsdream](https://github.com/vhsdream) ([#11617](https://github.com/community-scripts/ProxmoxVE/pull/11617)) - -## 2026-02-05 - -### 🆕 New Scripts - - - OpenCloud ([#11538](https://github.com/community-scripts/ProxmoxVE/pull/11538)) -- Nginx-UI ([#11573](https://github.com/community-scripts/ProxmoxVE/pull/11573)) -- New: SQL-Server 2025 | Refactor SQL-Server 2022 [@MickLesk](https://github.com/MickLesk) ([#11546](https://github.com/community-scripts/ProxmoxVE/pull/11546)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - OpenCloud: pin version to 5.0.2; Collabora CSP fix [@vhsdream](https://github.com/vhsdream) ([#11585](https://github.com/community-scripts/ProxmoxVE/pull/11585)) - - Wanderer: Fix repo [@tremor021](https://github.com/tremor021) ([#11567](https://github.com/community-scripts/ProxmoxVE/pull/11567)) - - - #### ✨ New Features - - - Refactor: Docker-VM (Multi-OS / Cloud-Init / Stabilization) [@MickLesk](https://github.com/MickLesk) ([#9047](https://github.com/community-scripts/ProxmoxVE/pull/9047)) - -### 💾 Core - - - #### ✨ New Features - - - cloud-init: add interactive SSH key discovery and selection [@MickLesk](https://github.com/MickLesk) ([#11547](https://github.com/community-scripts/ProxmoxVE/pull/11547)) - -### 📚 Documentation - - - github: extend docs / contribution / templates [@MickLesk](https://github.com/MickLesk) ([#10921](https://github.com/community-scripts/ProxmoxVE/pull/10921)) - -### 🌐 Website - - - #### 🐞 Bug Fixes - - - fix(frontend): theme respective syntax highlighting [@ls-root](https://github.com/ls-root) ([#11565](https://github.com/community-scripts/ProxmoxVE/pull/11565)) - -## 2026-02-04 - -### 🆕 New Scripts - - - Wishlist ([#11527](https://github.com/community-scripts/ProxmoxVE/pull/11527)) -- WriteFreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524)) - -### 🚀 Updated Scripts - - - Add log directory and permissions for koillection [@shineangelic](https://github.com/shineangelic) ([#11553](https://github.com/community-scripts/ProxmoxVE/pull/11553)) - - - #### 🐞 Bug Fixes - - - [FIX] Scanopy: ensure Scanopy Daemon update [@vhsdream](https://github.com/vhsdream) ([#11541](https://github.com/community-scripts/ProxmoxVE/pull/11541)) - - Immich: pin version to 2.5.3 [@vhsdream](https://github.com/vhsdream) ([#11515](https://github.com/community-scripts/ProxmoxVE/pull/11515)) - -### 💾 Core - - - #### ✨ New Features - - - core: create vm-core.func from dev [@MickLesk](https://github.com/MickLesk) ([#11528](https://github.com/community-scripts/ProxmoxVE/pull/11528)) - -### 🧰 Tools - - - #### ✨ New Features - - - [ADDON] Immich Public Proxy addon [@vhsdream](https://github.com/vhsdream) ([#11518](https://github.com/community-scripts/ProxmoxVE/pull/11518)) - -### 🌐 Website - - - #### 🐞 Bug Fixes - - - fix(frontend): implement weighted search scoring for command menu [@ls-root](https://github.com/ls-root) ([#11534](https://github.com/community-scripts/ProxmoxVE/pull/11534)) - -### ❔ Uncategorized - - - [FIX] Immich Public Proxy docs link [@vhsdream](https://github.com/vhsdream) ([#11543](https://github.com/community-scripts/ProxmoxVE/pull/11543)) - -## 2026-02-03 - -### 🆕 New Scripts - - - Wealthfolio ([#11511](https://github.com/community-scripts/ProxmoxVE/pull/11511)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - [FIX] Shelfmark: unpin Chromium version [@vhsdream](https://github.com/vhsdream) ([#11505](https://github.com/community-scripts/ProxmoxVE/pull/11505)) - - - #### ✨ New Features - - - [FEAT] Scanopy: automatically update integrated daemon [@vhsdream](https://github.com/vhsdream) ([#11506](https://github.com/community-scripts/ProxmoxVE/pull/11506)) - -### 💾 Core - - - #### 🐞 Bug Fixes - - - [FIX] tools.func: trim spaces in app_lc when checking for gh release [@vhsdream](https://github.com/vhsdream) ([#11512](https://github.com/community-scripts/ProxmoxVE/pull/11512)) - -### 🌐 Website - - - #### 🐞 Bug Fixes - - - fix(frontend): decouple table pagination from summary fetching [@ls-root](https://github.com/ls-root) ([#11495](https://github.com/community-scripts/ProxmoxVE/pull/11495)) - -## 2026-02-02 - -### 🆕 New Scripts - - - rustypaste | Alpine-rustypaste ([#11457](https://github.com/community-scripts/ProxmoxVE/pull/11457)) -- KitchenOwl ([#11453](https://github.com/community-scripts/ProxmoxVE/pull/11453)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Grist: Update dependencies [@tremor021](https://github.com/tremor021) ([#11489](https://github.com/community-scripts/ProxmoxVE/pull/11489)) - - Allow "downgrade" of libigdgmm12 [@vhsdream](https://github.com/vhsdream) ([#11478](https://github.com/community-scripts/ProxmoxVE/pull/11478)) - - Disable NPM install and update due to OpenResty SHA-1 signature issues [@MickLesk](https://github.com/MickLesk) ([#11471](https://github.com/community-scripts/ProxmoxVE/pull/11471)) - - - #### ✨ New Features - - - Refactor: Forgejo & readeck - migrate to codeberg functions [@MickLesk](https://github.com/MickLesk) ([#11460](https://github.com/community-scripts/ProxmoxVE/pull/11460)) - - - #### 💥 Breaking Changes - - - [FIX] Scanopy: remove daemon build [@vhsdream](https://github.com/vhsdream) ([#11444](https://github.com/community-scripts/ProxmoxVE/pull/11444)) - - - #### 🔧 Refactor - - - Refactor: Vaultwarden [@MickLesk](https://github.com/MickLesk) ([#11445](https://github.com/community-scripts/ProxmoxVE/pull/11445)) - - various scripts: use ensure_dependencies instead of apt [@MickLesk](https://github.com/MickLesk) ([#11463](https://github.com/community-scripts/ProxmoxVE/pull/11463)) - -### 🌐 Website - - - cleanup(frontend): remove unused /category-view route [@ls-root](https://github.com/ls-root) ([#11461](https://github.com/community-scripts/ProxmoxVE/pull/11461)) - - - #### ✨ New Features - - - feat(frontend): preview tab [@ls-root](https://github.com/ls-root) ([#11475](https://github.com/community-scripts/ProxmoxVE/pull/11475)) - -## 2026-02-01 - -### 🚀 Updated Scripts - - - fix headers [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11422](https://github.com/community-scripts/ProxmoxVE/pull/11422)) - - - #### 🐞 Bug Fixes - - - 2fauth: export PHP_VERSION for nginx config [@MickLesk](https://github.com/MickLesk) ([#11441](https://github.com/community-scripts/ProxmoxVE/pull/11441)) - - Prometheus Paperless NGX Exporter: Set correct binary path in systemd unit file [@andygrunwald](https://github.com/andygrunwald) ([#11438](https://github.com/community-scripts/ProxmoxVE/pull/11438)) - - tracearr: install/update new prestart script from upstream [@durzo](https://github.com/durzo) ([#11433](https://github.com/community-scripts/ProxmoxVE/pull/11433)) - - n8n: Fix dependencies [@tremor021](https://github.com/tremor021) ([#11429](https://github.com/community-scripts/ProxmoxVE/pull/11429)) - - [Hotfix] Bunkerweb update [@vhsdream](https://github.com/vhsdream) ([#11402](https://github.com/community-scripts/ProxmoxVE/pull/11402)) - - [Hotfix] Immich: revert healthcheck feature [@vhsdream](https://github.com/vhsdream) ([#11427](https://github.com/community-scripts/ProxmoxVE/pull/11427)) - - - #### ✨ New Features - - - tools.func: add codeberg functions & autocaliweb: migrate from GitHub to Codeberg [@MickLesk](https://github.com/MickLesk) ([#11440](https://github.com/community-scripts/ProxmoxVE/pull/11440)) - - Immich Refactor #2 [@vhsdream](https://github.com/vhsdream) ([#11375](https://github.com/community-scripts/ProxmoxVE/pull/11375)) - - - #### 🔧 Refactor - - - WordPress: Refactor [@tremor021](https://github.com/tremor021) ([#11408](https://github.com/community-scripts/ProxmoxVE/pull/11408)) - - Refactor: Whisparr [@tremor021](https://github.com/tremor021) ([#11411](https://github.com/community-scripts/ProxmoxVE/pull/11411)) - -### 💾 Core - - - #### ✨ New Features - - - [tools]: Update `fetch_and_deply_from_url()` [@tremor021](https://github.com/tremor021) ([#11410](https://github.com/community-scripts/ProxmoxVE/pull/11410)) - -### 🌐 Website - - - feat(frontend): implement UX refinements and syntax highlighting [@ls-root](https://github.com/ls-root) ([#11423](https://github.com/community-scripts/ProxmoxVE/pull/11423)) - - - #### ✨ New Features - - - feat(frontend): add contribution CTA to empty search state [@ls-root](https://github.com/ls-root) ([#11412](https://github.com/community-scripts/ProxmoxVE/pull/11412)) - -## 2026-01-31 - -### 🆕 New Scripts - - - shelfmark ([#11371](https://github.com/community-scripts/ProxmoxVE/pull/11371)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - fix: yubal: add git [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11394](https://github.com/community-scripts/ProxmoxVE/pull/11394)) - -## 2026-01-30 - -### 🆕 New Scripts - - - languagetool ([#11370](https://github.com/community-scripts/ProxmoxVE/pull/11370)) -- Ampache ([#11369](https://github.com/community-scripts/ProxmoxVE/pull/11369)) - -### 🚀 Updated Scripts - - - #### 🔧 Refactor - - - Refactor: remove redundant PHP_MODULE entries in several scripts [@MickLesk](https://github.com/MickLesk) ([#11362](https://github.com/community-scripts/ProxmoxVE/pull/11362)) - - Refactor: Koillection [@MickLesk](https://github.com/MickLesk) ([#11361](https://github.com/community-scripts/ProxmoxVE/pull/11361)) - -### 💾 Core - - - #### 🐞 Bug Fixes - - - core: meilisearch - add data migration for version upgrades [@MickLesk](https://github.com/MickLesk) ([#11356](https://github.com/community-scripts/ProxmoxVE/pull/11356)) - - - #### ✨ New Features - - - [tools] Add `fetch_and_deploy_from_url()` [@tremor021](https://github.com/tremor021) ([#11376](https://github.com/community-scripts/ProxmoxVE/pull/11376)) - - core: php - improve module handling and prevent installation failures [@MickLesk](https://github.com/MickLesk) ([#11358](https://github.com/community-scripts/ProxmoxVE/pull/11358)) \ No newline at end of file + - Opencloud: fix JSON [@vhsdream](https://github.com/vhsdream) ([#11617](https://github.com/community-scripts/ProxmoxVE/pull/11617)) \ No newline at end of file diff --git a/ct/grocy.sh b/ct/grocy.sh index 38a7b8272..215cfd8c8 100644 --- a/ct/grocy.sh +++ b/ct/grocy.sh @@ -28,8 +28,8 @@ function update_script() { exit fi php_ver=$(php -v | head -n 1 | awk '{print $2}') - if [[ ! $php_ver == "8.3"* ]]; then - PHP_VERSION="8.3" PHP_APACHE="YES" setup_php + if [[ ! $php_ver == "8.5"* ]]; then + PHP_VERSION="8.5" PHP_APACHE="YES" setup_php fi if check_for_gh_release "grocy" "grocy/grocy"; then msg_info "Updating grocy" diff --git a/ct/headers/immichframe b/ct/headers/immichframe new file mode 100644 index 000000000..864f13fd1 --- /dev/null +++ b/ct/headers/immichframe @@ -0,0 +1,6 @@ + ____ _ __ ______ + / _/___ ___ ____ ___ (_)____/ /_ / ____/________ _____ ___ ___ + / // __ `__ \/ __ `__ \/ / ___/ __ \/ /_ / ___/ __ `/ __ `__ \/ _ \ + _/ // / / / / / / / / / / / /__/ / / / __/ / / / /_/ / / / / / / __/ +/___/_/ /_/ /_/_/ /_/ /_/_/\___/_/ /_/_/ /_/ \__,_/_/ /_/ /_/\___/ + diff --git a/ct/immich.sh b/ct/immich.sh index e2f2e01a8..4e40372ce 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -36,9 +36,13 @@ function update_script() { exit fi - if [[ ! -f /etc/apt/preferences.d/preferences ]]; then + if ! grep -qE '(^|[[:space:]])testing([[:space:]]|$)' /etc/apt/sources.list.d/debian.sources 2>/dev/null; then msg_info "Adding Debian Testing repo" - sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources + if grep -q "trixie-updates" /etc/apt/sources.list.d/debian.sources 2>/dev/null; then + sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources + else + sed -i '/^[[:space:]]*Suites:.*trixie/ s/$/ testing/' /etc/apt/sources.list.d/debian.sources + fi cat </etc/apt/preferences.d/preferences Package: * Pin: release a=unstable @@ -209,7 +213,8 @@ EOF msg_ok "Updated Immich server, web, cli and plugins" cd "$SRC_DIR"/machine-learning - mkdir -p "$ML_DIR" && chown -R immich:immich "$ML_DIR" + mkdir -p "$ML_DIR" + chown -R immich:immich "$INSTALL_DIR" chown immich:immich ./uv.lock export VIRTUAL_ENV="${ML_DIR}"/ml-venv if [[ -f ~/.openvino ]]; then @@ -375,7 +380,7 @@ function compile_imagemagick() { function compile_libvips() { SOURCE=$SOURCE_DIR/libvips - : "${LIBVIPS_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libvips.json)}" + LIBVIPS_REVISION="0c9151a4f416d2f8ae20a755db218f6637050eec" 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/immichframe.sh b/ct/immichframe.sh new file mode 100644 index 000000000..bbd10a835 --- /dev/null +++ b/ct/immichframe.sh @@ -0,0 +1,81 @@ +#!/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: Thiago Canozzo Lahr (tclahr) +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/immichFrame/ImmichFrame + +APP="ImmichFrame" +var_tags="${var_tags:-photos;slideshow}" +var_cpu="${var_cpu:-1}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-8}" +var_os="${var_os:-debian}" +var_version="${var_version:-13}" +var_unprivileged="${var_unprivileged:-1}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + + if [[ ! -d /opt/immichframe ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "immichframe" "immichFrame/ImmichFrame"; then + msg_info "Stopping Service" + systemctl stop immichframe + msg_ok "Stopped Service" + + msg_info "Backing up Configuration" + cp -r /opt/immichframe/Config /tmp/immichframe_config.bak + msg_ok "Backed up Configuration" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immichframe" "immichFrame/ImmichFrame" "tarball" "latest" "/tmp/immichframe" + + msg_info "Setting up ImmichFrame" + cd /tmp/immichframe + $STD dotnet publish ImmichFrame.WebApi/ImmichFrame.WebApi.csproj \ + --configuration Release \ + --runtime linux-x64 \ + --self-contained false \ + --output /opt/immichframe + + cd /tmp/immichframe/immichFrame.Web + $STD npm ci --silent + $STD npm run build + rm -rf /opt/immichframe/wwwroot/* + cp -r build/* /opt/immichframe/wwwroot + rm -rf /tmp/immichframe + msg_ok "Setup ImmichFrame" + + msg_info "Restoring Configuration" + cp -r /tmp/immichframe_config.bak/* /opt/immichframe/Config/ + rm -rf /tmp/immichframe_config.bak + chown -R immichframe:immichframe /opt/immichframe + msg_ok "Restored Configuration" + + + msg_info "Starting Service" + systemctl start immichframe + 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}:8080${CL}" diff --git a/ct/influxdb.sh b/ct/influxdb.sh index a4421e019..15b971e81 100644 --- a/ct/influxdb.sh +++ b/ct/influxdb.sh @@ -23,7 +23,7 @@ function update_script() { header_info check_container_storage check_container_resources - if [[ ! -f /usr/bin/influxd ]]; then + if [[ ! -f /usr/bin/influxd && ! -f /usr/bin/influxdb3 ]]; then msg_error "No ${APP} Installation Found!" exit fi diff --git a/ct/nzbget.sh b/ct/nzbget.sh index 834e7bfdc..c90eb28ad 100644 --- a/ct/nzbget.sh +++ b/ct/nzbget.sh @@ -27,6 +27,16 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi + + if ! command -v unrar &>/dev/null; then + setup_nonfree + $STD apt install -y unrar + + if grep -q "UnrarCmd=unrar-free" /var/lib/nzbget/nzbget.conf; then + sed -i "s|UnrarCmd=unrar-free|UnrarCmd=unrar|g" /var/lib/nzbget/nzbget.conf + fi + fi + msg_info "Updating NZBGet" $STD apt update $STD apt upgrade -y diff --git a/ct/opencloud.sh b/ct/opencloud.sh index 988291236..39f8b3577 100644 --- a/ct/opencloud.sh +++ b/ct/opencloud.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - RELEASE="v5.1.0" + RELEASE="v5.2.0" if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}"; then msg_info "Stopping services" systemctl stop opencloud opencloud-wopi @@ -41,7 +41,9 @@ function update_script() { ensure_dependencies "inotify-tools" msg_ok "Updated packages" + rm -f /usr/bin/{OpenCloud,opencloud} CLEAN_INSTALL=1 fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-amd64" + mv /usr/bin/OpenCloud /usr/bin/opencloud if ! grep -q 'POSIX_WATCH' /etc/opencloud/opencloud.env; then sed -i '/^## External/i ## Uncomment below to enable PosixFS Collaborative Mode\ diff --git a/ct/openwebui.sh b/ct/openwebui.sh index 17ce1d3fd..cce154863 100644 --- a/ct/openwebui.sh +++ b/ct/openwebui.sh @@ -25,6 +25,8 @@ function update_script() { check_container_storage check_container_resources + ensure_dependencies zstd build-essential libmariadb-dev + if [[ -d /opt/open-webui ]]; then msg_warn "Legacy installation detected — migrating to uv based install..." msg_info "Stopping Service" @@ -92,7 +94,6 @@ EOF OLLAMA_VERSION=$(ollama -v | awk '{print $NF}') RELEASE=$(curl -s https://api.github.com/repos/ollama/ollama/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') if [ "$OLLAMA_VERSION" != "$RELEASE" ]; then - ensure_dependencies zstd msg_info "Ollama update available: v$OLLAMA_VERSION -> v$RELEASE" msg_info "Downloading Ollama v$RELEASE \n" curl -fS#LO https://github.com/ollama/ollama/releases/download/v${RELEASE}/ollama-linux-amd64.tar.zst diff --git a/ct/rdtclient.sh b/ct/rdtclient.sh index abb3cb2a6..bec3bc8ad 100755 --- a/ct/rdtclient.sh +++ b/ct/rdtclient.sh @@ -39,9 +39,9 @@ function update_script() { fetch_and_deploy_gh_release "rdt-client" "rogerfar/rdt-client" "prebuild" "latest" "/opt/rdtc" "RealDebridClient.zip" cp -R /opt/rdtc-backup/appsettings.json /opt/rdtc/ - if dpkg-query -W dotnet-sdk-8.0 >/dev/null 2>&1; then - $STD apt remove --purge -y dotnet-sdk-8.0 - ensure_dependencies aspnetcore-runtime-9.0 + if dpkg-query -W aspnetcore-runtime-9.0 >/dev/null 2>&1; then + $STD apt remove --purge -y aspnetcore-runtime-9.0 + ensure_dependencies aspnetcore-runtime-10.0 fi rm -rf /opt/rdtc-backup diff --git a/ct/reactive-resume.sh b/ct/reactive-resume.sh index a88004da6..fbde8ba69 100644 --- a/ct/reactive-resume.sh +++ b/ct/reactive-resume.sh @@ -1,9 +1,9 @@ #!/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: vhsdream +# Author: vhsdream | MickLesk (CanbiZ) # License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE -# Source: https://rxresume.org | Github: https://github.com/lazy-media/Reactive-Resume +# Source: https://rxresume.org | Github: https://github.com/amruthpillai/reactive-resume APP="Reactive-Resume" var_tags="${var_tags:-documents}" @@ -24,62 +24,29 @@ function update_script() { check_container_storage check_container_resources - if [[ ! -f /etc/systemd/system/Reactive-Resume.service ]]; then + if [[ ! -f /etc/systemd/system/reactive-resume.service ]]; then msg_error "No $APP Installation Found!" exit fi - if check_for_gh_release "Reactive-Resume" "lazy-media/Reactive-Resume"; then + if check_for_gh_release "reactive-resume" "amruthpillai/reactive-resume"; then msg_info "Stopping services" - systemctl stop Reactive-Resume + systemctl stop reactive-resume msg_ok "Stopped services" - cp /opt/Reactive-Resume/.env /opt/rxresume.env - fetch_and_deploy_gh_release "Reactive-Resume" "lazy-media/Reactive-Resume" "tarball" "latest" "/opt/Reactive-Resume" + cp /opt/reactive-resume/.env /opt/reactive-resume.env.bak + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "reactive-resume" "amruthpillai/reactive-resume" "tarball" "latest" "/opt/reactive-resume" - msg_info "Updating Reactive-Resume" - cd /opt/Reactive-Resume - export PUPPETEER_SKIP_DOWNLOAD="true" - export NEXT_TELEMETRY_DISABLED=1 + msg_info "Updating Reactive Resume (Patience)" + cd /opt/reactive-resume export CI="true" export NODE_ENV="production" $STD pnpm install --frozen-lockfile $STD pnpm run build - $STD pnpm run prisma:generate - mv /opt/rxresume.env /opt/Reactive-Resume/.env - msg_ok "Updated Reactive-Resume" - - msg_info "Updating Minio" - systemctl stop minio - cd /tmp - curl -fsSL https://dl.min.io/server/minio/release/linux-amd64/minio.deb -o minio.deb - $STD dpkg -i minio.deb - rm -f /tmp/minio.deb - msg_ok "Updated Minio" - - msg_info "Updating Browserless (Patience)" - systemctl stop browserless - cp /opt/browserless/.env /opt/browserless.env - rm -rf /opt/browserless - brwsr_tmp=$(mktemp) - TAG=$(curl -fsSL https://api.github.com/repos/browserless/browserless/tags?per_page=1 | grep "name" | awk '{print substr($2, 3, length($2)-4) }') - curl -fsSL https://github.com/browserless/browserless/archive/refs/tags/v"$TAG".zip -o "$brwsr_tmp" - $STD unzip "$brwsr_tmp" - mv browserless-"$TAG"/ /opt/browserless - cd /opt/browserless - $STD npm install typescript - $STD npm install esbuild - $STD npm install - rm -rf src/routes/{chrome,edge,firefox,webkit} - $STD node_modules/playwright-core/cli.js install --with-deps chromium - $STD npm run build - $STD npm run build:function - $STD npm prune production - mv /opt/browserless.env /opt/browserless/.env - rm -f "$brwsr_tmp" - msg_ok "Updated Browserless" + mv /opt/reactive-resume.env.bak /opt/reactive-resume/.env + msg_ok "Updated Reactive Resume" msg_info "Restarting services" - systemctl start minio Reactive-Resume browserless + systemctl start chromium-printer reactive-resume msg_ok "Restarted services" msg_ok "Updated successfully!" fi diff --git a/ct/rustdeskserver.sh b/ct/rustdeskserver.sh index 2cd759509..adfb42e23 100644 --- a/ct/rustdeskserver.sh +++ b/ct/rustdeskserver.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - if check_for_gh_release "rustdesk-api"; then + if check_for_gh_release "rustdesk-hbbs" "lejianwen/rustdesk-server"; then msg_info "Stopping Service" systemctl stop rustdesk-hbbr systemctl stop rustdesk-hbbs diff --git a/ct/scanopy.sh b/ct/scanopy.sh index 248bf0032..e06de906e 100644 --- a/ct/scanopy.sh +++ b/ct/scanopy.sh @@ -53,6 +53,13 @@ function update_script() { fi sed -i 's|_TARGET=.*$|_URL=http://127.0.0.1:60072|' /opt/scanopy/.env + msg_info "Building Scanopy Server (patience)" + cd /opt/scanopy/backend + $STD cargo build --release --bin server --bin generate-fixtures + $STD ./target/release/generate-fixtures --output-dir /opt/scanopy/ui/src/lib/data + mv ./target/release/server /usr/bin/scanopy-server + msg_ok "Built Scanopy Server" + msg_info "Creating frontend UI" export PUBLIC_SERVER_HOSTNAME=default export PUBLIC_SERVER_PORT="" @@ -61,12 +68,6 @@ function update_script() { $STD npm run build msg_ok "Created frontend UI" - msg_info "Building Scanopy Server (patience)" - cd /opt/scanopy/backend - $STD cargo build --release --bin server - mv ./target/release/server /usr/bin/scanopy-server - msg_ok "Built Scanopy Server" - if [[ -f /etc/systemd/system/scanopy-daemon.service ]]; then fetch_and_deploy_gh_release "Scanopy Daemon" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64" mv "/usr/local/bin/Scanopy Daemon" /usr/local/bin/scanopy-daemon diff --git a/ct/tracearr.sh b/ct/tracearr.sh index 4d1cd5726..e79736932 100644 --- a/ct/tracearr.sh +++ b/ct/tracearr.sh @@ -9,7 +9,7 @@ APP="Tracearr" var_tags="${var_tags:-media}" var_cpu="${var_cpu:-2}" var_ram="${var_ram:-2048}" -var_disk="${var_disk:-5}" +var_disk="${var_disk:-10}" var_os="${var_os:-debian}" var_version="${var_version:-13}" var_unprivileged="${var_unprivileged:-1}" diff --git a/ct/wireguard.sh b/ct/wireguard.sh index 7edace668..83800accc 100644 --- a/ct/wireguard.sh +++ b/ct/wireguard.sh @@ -37,7 +37,7 @@ function update_script() { if [[ -d /etc/wgdashboard ]]; then sleep 2 cd /etc/wgdashboard/src - $STD ./wgd.sh update + $STD ./wgd.sh update -y $STD ./wgd.sh start fi msg_ok "Updated LXC" diff --git a/ct/zigbee2mqtt.sh b/ct/zigbee2mqtt.sh index c04d6ca48..e61e21e57 100644 --- a/ct/zigbee2mqtt.sh +++ b/ct/zigbee2mqtt.sh @@ -35,13 +35,16 @@ function update_script() { msg_ok "Stopped Service" msg_info "Creating Backup" - rm -rf /opt/${APP}_backup*.tar.gz - mkdir -p /opt/z2m_backup - $STD tar -czf /opt/z2m_backup/${APP}_backup_$(date +%Y%m%d%H%M%S).tar.gz -C /opt zigbee2mqtt - mv /opt/zigbee2mqtt/data /opt/z2m_backup - msg_ok "Backup Created" + ensure_dependencies zstd + mkdir -p /opt/{backups,z2m_backup} + BACKUP_VERSION="$(<"$HOME/.zigbee2mqtt")" + BACKUP_FILE="/opt/backups/${APP}_backup_${BACKUP_VERSION}.tar.zst" + $STD tar -cf - -C /opt zigbee2mqtt | zstd -q -o "$BACKUP_FILE" + ls -t /opt/backups/${APP}_backup_*.tar.zst 2>/dev/null | tail -n +6 | xargs -r rm -f + mv /opt/zigbee2mqtt/data /opt/z2m_backup/data + msg_ok "Backup Created (${BACKUP_VERSION})" - fetch_and_deploy_gh_release "Zigbee2MQTT" "Koenkk/zigbee2mqtt" "tarball" "latest" "/opt/zigbee2mqtt" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Zigbee2MQTT" "Koenkk/zigbee2mqtt" "tarball" "latest" "/opt/zigbee2mqtt" msg_info "Updating Zigbee2MQTT" rm -rf /opt/zigbee2mqtt/data diff --git a/frontend/public/json/execute.json b/frontend/public/json/execute.json index 9535f86d0..56e4d112a 100644 --- a/frontend/public/json/execute.json +++ b/frontend/public/json/execute.json @@ -1,6 +1,6 @@ { "name": "PVE LXC Execute Command", - "slug": "lxc-execute", + "slug": "execute", "categories": [ 1 ], diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index 10be29faf..9a9542c9f 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,19 +1,19 @@ { - "generated": "2026-03-07T00:19:56Z", + "generated": "2026-03-11T12:12:40Z", "versions": [ { "slug": "2fauth", "repo": "Bubka/2FAuth", - "version": "v6.0.0", + "version": "v6.1.0", "pinned": false, - "date": "2026-01-14T16:00:58Z" + "date": "2026-03-11T07:48:27Z" }, { "slug": "adguard", "repo": "AdguardTeam/AdGuardHome", - "version": "v0.107.72", + "version": "v0.107.73", "pinned": false, - "date": "2026-02-19T15:37:49Z" + "date": "2026-03-10T17:23:23Z" }, { "slug": "adguardhome-sync", @@ -67,9 +67,9 @@ { "slug": "autobrr", "repo": "autobrr/autobrr", - "version": "v1.73.0", + "version": "v1.74.0", "pinned": false, - "date": "2026-02-13T16:37:28Z" + "date": "2026-03-08T21:45:41Z" }, { "slug": "autocaliweb", @@ -88,9 +88,9 @@ { "slug": "backrest", "repo": "garethgeorge/backrest", - "version": "v1.12.0", + "version": "v1.12.1", "pinned": false, - "date": "2026-02-22T06:49:49Z" + "date": "2026-03-11T06:16:22Z" }, { "slug": "baikal", @@ -102,9 +102,9 @@ { "slug": "bar-assistant", "repo": "karlomikus/bar-assistant", - "version": "v5.13.1", + "version": "v5.13.2", "pinned": false, - "date": "2026-02-02T18:47:43Z" + "date": "2026-03-08T10:47:13Z" }, { "slug": "bazarr", @@ -116,9 +116,9 @@ { "slug": "bentopdf", "repo": "alam00000/bentopdf", - "version": "v2.4.0", + "version": "v2.5.0", "pinned": false, - "date": "2026-03-01T14:25:43Z" + "date": "2026-03-10T08:40:54Z" }, { "slug": "beszel", @@ -151,9 +151,9 @@ { "slug": "booklore", "repo": "booklore-app/BookLore", - "version": "v2.0.6", + "version": "v2.1.0", "pinned": false, - "date": "2026-03-06T19:16:29Z" + "date": "2026-03-08T20:27:24Z" }, { "slug": "bookstack", @@ -200,9 +200,9 @@ { "slug": "cleanuparr", "repo": "Cleanuparr/Cleanuparr", - "version": "v2.7.7", + "version": "v2.7.9", "pinned": false, - "date": "2026-03-02T13:08:32Z" + "date": "2026-03-10T18:51:23Z" }, { "slug": "cloudreve", @@ -214,9 +214,9 @@ { "slug": "comfyui", "repo": "comfyanonymous/ComfyUI", - "version": "v0.16.3", + "version": "v0.16.4", "pinned": false, - "date": "2026-03-05T23:18:25Z" + "date": "2026-03-07T22:37:49Z" }, { "slug": "commafeed", @@ -228,9 +228,9 @@ { "slug": "configarr", "repo": "raydak-labs/configarr", - "version": "v1.23.0", + "version": "v1.24.0", "pinned": false, - "date": "2026-02-23T12:28:13Z" + "date": "2026-03-09T15:16:08Z" }, { "slug": "convertx", @@ -270,23 +270,23 @@ { "slug": "databasus", "repo": "databasus/databasus", - "version": "v3.17.0", + "version": "v3.19.1", "pinned": false, - "date": "2026-03-06T07:07:22Z" + "date": "2026-03-11T10:25:28Z" }, { "slug": "dawarich", "repo": "Freika/dawarich", - "version": "1.3.1", + "version": "1.3.2", "pinned": false, - "date": "2026-02-27T19:47:40Z" + "date": "2026-03-08T20:37:50Z" }, { "slug": "discopanel", "repo": "nickheyer/discopanel", - "version": "v2.0.0", + "version": "v2.0.3", "pinned": false, - "date": "2026-03-06T08:19:39Z" + "date": "2026-03-11T07:29:10Z" }, { "slug": "dispatcharr", @@ -312,16 +312,16 @@ { "slug": "domain-monitor", "repo": "Hosteroid/domain-monitor", - "version": "v1.1.4", + "version": "v1.1.5", "pinned": false, - "date": "2026-03-02T09:25:01Z" + "date": "2026-03-08T19:17:09Z" }, { "slug": "donetick", "repo": "donetick/donetick", - "version": "v0.1.74", + "version": "v0.1.75-beta.3", "pinned": false, - "date": "2026-02-14T23:21:45Z" + "date": "" }, { "slug": "drawio", @@ -347,9 +347,9 @@ { "slug": "elementsynapse", "repo": "etkecc/synapse-admin", - "version": "v0.11.1-etke53", + "version": "v0.11.4-etke54", "pinned": false, - "date": "2026-02-03T20:38:15Z" + "date": "2026-03-08T12:37:07Z" }, { "slug": "emby", @@ -389,9 +389,9 @@ { "slug": "fladder", "repo": "DonutWare/Fladder", - "version": "v0.10.1", + "version": "v0.10.2", "pinned": false, - "date": "2026-02-21T12:45:53Z" + "date": "2026-03-08T15:28:11Z" }, { "slug": "flaresolverr", @@ -438,9 +438,9 @@ { "slug": "ghostfolio", "repo": "ghostfolio/ghostfolio", - "version": "2.247.0", + "version": "2.249.0", "pinned": false, - "date": "2026-03-04T07:48:00Z" + "date": "2026-03-10T19:26:50Z" }, { "slug": "gitea", @@ -452,9 +452,9 @@ { "slug": "gitea-mirror", "repo": "RayLabsHQ/gitea-mirror", - "version": "v3.12.4", + "version": "v3.12.5", "pinned": false, - "date": "2026-03-06T05:02:40Z" + "date": "2026-03-07T01:30:40Z" }, { "slug": "glance", @@ -473,9 +473,9 @@ { "slug": "gokapi", "repo": "Forceu/Gokapi", - "version": "v2.2.3", + "version": "v2.2.4", "pinned": false, - "date": "2026-03-04T21:29:16Z" + "date": "2026-03-10T15:44:19Z" }, { "slug": "gotify", @@ -557,9 +557,9 @@ { "slug": "homebox", "repo": "sysadminsmedia/homebox", - "version": "v0.24.0", + "version": "v0.24.2", "pinned": false, - "date": "2026-03-03T16:09:55Z" + "date": "2026-03-09T19:54:02Z" }, { "slug": "homepage", @@ -589,6 +589,13 @@ "pinned": false, "date": "2026-03-02T21:28:06Z" }, + { + "slug": "immichframe", + "repo": "immichFrame/ImmichFrame", + "version": "v1.0.32.0", + "pinned": false, + "date": "2026-03-02T22:56:06Z" + }, { "slug": "inspircd", "repo": "inspircd/inspircd", @@ -606,16 +613,16 @@ { "slug": "invoiceninja", "repo": "invoiceninja/invoiceninja", - "version": "v5.12.70", + "version": "v5.13.1", "pinned": false, - "date": "2026-03-06T01:53:38Z" + "date": "2026-03-10T23:45:05Z" }, { "slug": "jackett", "repo": "Jackett/Jackett", - "version": "v0.24.1292", + "version": "v0.24.1341", "pinned": false, - "date": "2026-03-06T05:57:21Z" + "date": "2026-03-11T05:55:00Z" }, { "slug": "jellystat", @@ -669,9 +676,9 @@ { "slug": "kima-hub", "repo": "Chevron7Locked/kima-hub", - "version": "v1.6.2", + "version": "v1.6.3", "pinned": false, - "date": "2026-03-05T05:38:02Z" + "date": "2026-03-10T22:26:12Z" }, { "slug": "kimai", @@ -816,9 +823,9 @@ { "slug": "mail-archiver", "repo": "s1t5/mail-archiver", - "version": "2602.4", + "version": "2603.1", "pinned": false, - "date": "2026-02-26T08:43:01Z" + "date": "2026-03-10T11:51:08Z" }, { "slug": "managemydamnlife", @@ -830,16 +837,16 @@ { "slug": "manyfold", "repo": "manyfold3d/manyfold", - "version": "v0.133.1", + "version": "v0.134.0", "pinned": false, - "date": "2026-02-26T15:50:34Z" + "date": "2026-03-09T13:20:45Z" }, { "slug": "mealie", "repo": "mealie-recipes/mealie", - "version": "v3.11.0", + "version": "v3.12.0", "pinned": false, - "date": "2026-02-17T04:13:35Z" + "date": "2026-03-07T21:59:11Z" }, { "slug": "mediamanager", @@ -872,9 +879,9 @@ { "slug": "metube", "repo": "alexta69/metube", - "version": "2026.03.06", + "version": "2026.03.08", "pinned": false, - "date": "2026-03-06T13:52:56Z" + "date": "2026-03-08T20:28:19Z" }, { "slug": "miniflux", @@ -991,9 +998,9 @@ { "slug": "opencloud", "repo": "opencloud-eu/opencloud", - "version": "v5.1.0", + "version": "v5.2.0", "pinned": true, - "date": "2026-02-16T15:04:28Z" + "date": "2026-03-09T13:32:31Z" }, { "slug": "opengist", @@ -1145,9 +1152,9 @@ { "slug": "pocketid", "repo": "pocket-id/pocket-id", - "version": "v2.3.0", + "version": "v2.4.0", "pinned": false, - "date": "2026-02-23T19:50:48Z" + "date": "2026-03-07T17:51:41Z" }, { "slug": "powerdns", @@ -1229,9 +1236,9 @@ { "slug": "pulse", "repo": "rcourtman/Pulse", - "version": "v5.1.21", + "version": "v5.1.23", "pinned": false, - "date": "2026-03-06T12:13:08Z" + "date": "2026-03-09T22:22:12Z" }, { "slug": "pve-scripts-local", @@ -1298,10 +1305,10 @@ }, { "slug": "reactive-resume", - "repo": "lazy-media/Reactive-Resume", - "version": "v1.2.7", + "repo": "amruthpillai/reactive-resume", + "version": "v5.0.11", "pinned": false, - "date": "2026-01-20T11:59:40Z" + "date": "2026-03-04T20:39:11Z" }, { "slug": "recyclarr", @@ -1320,16 +1327,16 @@ { "slug": "revealjs", "repo": "hakimel/reveal.js", - "version": "5.2.1", + "version": "6.0.0", "pinned": false, - "date": "2025-03-28T13:00:23Z" + "date": "2026-03-11T11:54:59Z" }, { "slug": "romm", "repo": "RetroAchievements/RALibretro", - "version": "1.8.2", + "version": "1.8.3", "pinned": false, - "date": "2026-01-23T17:03:31Z" + "date": "2026-03-07T23:41:29Z" }, { "slug": "rustdeskserver", @@ -1355,9 +1362,9 @@ { "slug": "scanopy", "repo": "scanopy/scanopy", - "version": "v0.14.14", + "version": "v0.14.17", "pinned": false, - "date": "2026-03-06T06:50:38Z" + "date": "2026-03-09T05:04:49Z" }, { "slug": "scraparr", @@ -1369,9 +1376,9 @@ { "slug": "seaweedfs", "repo": "seaweedfs/seaweedfs", - "version": "4.15", + "version": "4.17", "pinned": false, - "date": "2026-03-05T06:30:30Z" + "date": "2026-03-11T09:30:38Z" }, { "slug": "seelf", @@ -1390,9 +1397,9 @@ { "slug": "semaphore", "repo": "semaphoreui/semaphore", - "version": "v2.17.16", + "version": "v2.17.21", "pinned": false, - "date": "2026-03-05T12:39:05Z" + "date": "2026-03-09T09:33:06Z" }, { "slug": "shelfmark", @@ -1467,9 +1474,9 @@ { "slug": "sportarr", "repo": "Sportarr/Sportarr", - "version": "v4.0.986.1061", + "version": "v4.0.988.1063", "pinned": false, - "date": "2026-03-06T01:04:24Z" + "date": "2026-03-07T12:15:33Z" }, { "slug": "stirling-pdf", @@ -1509,9 +1516,9 @@ { "slug": "tasmoadmin", "repo": "TasmoAdmin/TasmoAdmin", - "version": "v4.3.4", + "version": "v5.0.0", "pinned": false, - "date": "2026-01-25T22:16:41Z" + "date": "2026-03-09T20:51:03Z" }, { "slug": "tautulli", @@ -1530,9 +1537,9 @@ { "slug": "termix", "repo": "Termix-SSH/Termix", - "version": "release-1.11.1-tag", + "version": "release-1.11.2-tag", "pinned": false, - "date": "2026-02-13T04:49:16Z" + "date": "2026-03-08T23:27:30Z" }, { "slug": "the-lounge", @@ -1544,9 +1551,9 @@ { "slug": "thingsboard", "repo": "thingsboard/thingsboard", - "version": "v4.3.0.1", + "version": "v4.3.1", "pinned": false, - "date": "2026-02-03T12:39:14Z" + "date": "2026-03-10T09:25:25Z" }, { "slug": "threadfin", @@ -1565,9 +1572,9 @@ { "slug": "tinyauth", "repo": "steveiliop56/tinyauth", - "version": "v5.0.1", + "version": "v5.0.2", "pinned": false, - "date": "2026-03-04T21:05:05Z" + "date": "2026-03-08T15:46:59Z" }, { "slug": "traccar", @@ -1579,9 +1586,9 @@ { "slug": "tracearr", "repo": "connorgallopo/Tracearr", - "version": "v1.4.21", + "version": "v1.4.22", "pinned": false, - "date": "2026-03-03T18:43:20Z" + "date": "2026-03-09T17:39:52Z" }, { "slug": "tracktor", @@ -1600,9 +1607,9 @@ { "slug": "trilium", "repo": "TriliumNext/Trilium", - "version": "v0.102.0", + "version": "v0.102.1", "pinned": false, - "date": "2026-03-01T20:37:40Z" + "date": "2026-03-08T09:11:01Z" }, { "slug": "trip", @@ -1621,9 +1628,9 @@ { "slug": "tunarr", "repo": "chrisbenincasa/tunarr", - "version": "v1.1.18", + "version": "v1.1.19", "pinned": false, - "date": "2026-02-26T22:09:44Z" + "date": "2026-03-11T02:21:06Z" }, { "slug": "uhf", @@ -1663,9 +1670,9 @@ { "slug": "uptimekuma", "repo": "louislam/uptime-kuma", - "version": "2.2.0", + "version": "2.2.1", "pinned": false, - "date": "2026-03-05T02:08:14Z" + "date": "2026-03-10T02:25:33Z" }, { "slug": "vaultwarden", @@ -1705,9 +1712,9 @@ { "slug": "wanderer", "repo": "meilisearch/meilisearch", - "version": "v1.37.0", + "version": "v1.38.2", "pinned": false, - "date": "2026-03-02T09:16:36Z" + "date": "2026-03-11T11:36:01Z" }, { "slug": "warracker", @@ -1719,9 +1726,9 @@ { "slug": "watcharr", "repo": "sbondCo/Watcharr", - "version": "v3.0.0", + "version": "v3.0.1", "pinned": false, - "date": "2026-03-04T09:29:14Z" + "date": "2026-03-09T11:33:44Z" }, { "slug": "watchyourlan", @@ -1796,9 +1803,9 @@ { "slug": "yubal", "repo": "guillevc/yubal", - "version": "v0.6.2", + "version": "v0.7.0", "pinned": false, - "date": "2026-02-24T15:15:46Z" + "date": "2026-03-08T13:37:49Z" }, { "slug": "zerobyte", @@ -1824,16 +1831,16 @@ { "slug": "zitadel", "repo": "zitadel/zitadel", - "version": "v4.12.1", + "version": "v4.12.2", "pinned": false, - "date": "2026-03-04T12:40:17Z" + "date": "2026-03-11T07:50:10Z" }, { "slug": "zoraxy", "repo": "tobychui/zoraxy", - "version": "v3.3.2-rc2", + "version": "v3.3.2-rc3", "pinned": false, - "date": "2026-02-27T03:31:25Z" + "date": "2026-03-09T13:56:45Z" }, { "slug": "zwave-js-ui", diff --git a/frontend/public/json/immichframe.json b/frontend/public/json/immichframe.json new file mode 100644 index 000000000..2e88f892b --- /dev/null +++ b/frontend/public/json/immichframe.json @@ -0,0 +1,40 @@ +{ + "name": "ImmichFrame", + "slug": "immichframe", + "categories": [ + 13 + ], + "date_created": "2026-03-07", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://immichframe.dev/docs/overview", + "config_path": "/opt/immichframe/Config/Settings.yml", + "website": "https://immichframe.dev/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/immich-frame.webp", + "description": "ImmichFrame is a digital photo frame web application that connects to your Immich server and displays your photos as a fullscreen slideshow.", + "install_methods": [ + { + "type": "default", + "script": "ct/immichframe.sh", + "resources": { + "cpu": 1, + "ram": 1024, + "hdd": 8, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After installation, edit `/opt/immichframe/Config/Settings.yml` and set ImmichServerUrl and ApiKey. Then restart the service with `systemctl restart immichframe`.", + "type": "warning" + } + ] +} diff --git a/frontend/public/json/papra.json b/frontend/public/json/papra.json index e362caba0..7f812520b 100644 --- a/frontend/public/json/papra.json +++ b/frontend/public/json/papra.json @@ -9,8 +9,8 @@ "updateable": true, "privileged": false, "interface_port": 1221, - "documentation": "https://github.com/CorentinTh/papra", - "website": "https://github.com/CorentinTh/papra", + "documentation": "https://github.com/papra-hq/papra", + "website": "https://github.com/papra-hq/papra", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/papra.webp", "config_path": "/opt/papra/.env", "description": "Papra is a modern, self-hosted document management system with full-text search, OCR support, and automatic document processing. Built with Node.js and featuring a clean web interface for organizing and managing your documents.", diff --git a/frontend/public/json/reactive-resume.json b/frontend/public/json/reactive-resume.json index e9991953f..f4a73ee72 100644 --- a/frontend/public/json/reactive-resume.json +++ b/frontend/public/json/reactive-resume.json @@ -12,7 +12,7 @@ "documentation": "https://docs.rxresume.org/", "website": "https://rxresume.org", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/reactive-resume.webp", - "config_path": "/opt/Reactive-Resume/.env", + "config_path": "/opt/reactive-resume/.env", "description": "A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever.", "install_methods": [ { diff --git a/frontend/public/json/tracearr.json b/frontend/public/json/tracearr.json index 4fb66ace7..1f65ae049 100644 --- a/frontend/public/json/tracearr.json +++ b/frontend/public/json/tracearr.json @@ -21,7 +21,7 @@ "resources": { "cpu": 2, "ram": 2048, - "hdd": 5, + "hdd": 10, "os": "Debian", "version": "13" } diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 911d48d44..cb551cad7 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -5,6 +5,7 @@ import { Inter } from "next/font/google"; import Script from "next/script"; import React from "react"; +import { CopycatWarningToast } from "@/components/copycat-warning-toast"; import { ThemeProvider } from "@/components/theme-provider"; import { analytics, basePath } from "@/config/site-config"; import QueryProvider from "@/components/query-provider"; @@ -116,6 +117,7 @@ export default function RootLayout({
{children} +