From abfd57f4863efd0127450c26034e844ad2a5739d Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 2 Feb 2026 16:47:16 +0100 Subject: [PATCH 01/93] hotfix vaultwarden --- ct/vaultwarden.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ct/vaultwarden.sh b/ct/vaultwarden.sh index 28d611a01..ade857bcf 100644 --- a/ct/vaultwarden.sh +++ b/ct/vaultwarden.sh @@ -72,10 +72,11 @@ function update_script() { systemctl stop vaultwarden msg_ok "Stopped Service" - fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden" "bw_web_*.tar.gz" - msg_info "Updating Web-Vault to $WVRELEASE" rm -rf /opt/vaultwarden/web-vault + + fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden" "bw_web_*.tar.gz" + chown -R root:root /opt/vaultwarden/web-vault/ msg_ok "Updated Web-Vault to ${WVRELEASE}" From d7872a824044a5e5b2cc238be395e5ecc3b0914a Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:03:02 +0100 Subject: [PATCH 02/93] Use temp dir for Web-Vault deployment Deploy the Web-Vault release into a temporary directory before moving it into /opt/vaultwarden. The change creates a mktemp -d directory, passes that to fetch_and_deploy_gh_release, moves the extracted web-vault into /opt/vaultwarden/web-vault, and removes the temp dir. This prevents partial or mixed artifacts in /opt during the fetch/extract step and keeps the existing ownership/chown behavior. --- ct/vaultwarden.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ct/vaultwarden.sh b/ct/vaultwarden.sh index ade857bcf..d12cbc979 100644 --- a/ct/vaultwarden.sh +++ b/ct/vaultwarden.sh @@ -75,7 +75,10 @@ function update_script() { msg_info "Updating Web-Vault to $WVRELEASE" rm -rf /opt/vaultwarden/web-vault - fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden" "bw_web_*.tar.gz" + TEMP_DIR=$(mktemp -d) + fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "$TEMP_DIR" "bw_web_*.tar.gz" + mv "$TEMP_DIR/web-vault" /opt/vaultwarden/web-vault + rm -rf "$TEMP_DIR" chown -R root:root /opt/vaultwarden/web-vault/ msg_ok "Updated Web-Vault to ${WVRELEASE}" From c612bfefcd83492cabe8284caa934b975da98fce Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:14:48 +0100 Subject: [PATCH 03/93] Fetch Web-Vault directly to target dir Simplify the Web-Vault update flow by creating /opt/vaultwarden/web-vault and calling fetch_and_deploy_gh_release with that path as the deployment target. Removes temporary directory creation, move and cleanup (mktemp/mv/rm -rf) and ensures the destination exists before downloading. Ownership and the success message are preserved. --- ct/vaultwarden.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ct/vaultwarden.sh b/ct/vaultwarden.sh index d12cbc979..ee7751176 100644 --- a/ct/vaultwarden.sh +++ b/ct/vaultwarden.sh @@ -74,11 +74,9 @@ function update_script() { msg_info "Updating Web-Vault to $WVRELEASE" rm -rf /opt/vaultwarden/web-vault + mkdir -p /opt/vaultwarden/web-vault - TEMP_DIR=$(mktemp -d) - fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "$TEMP_DIR" "bw_web_*.tar.gz" - mv "$TEMP_DIR/web-vault" /opt/vaultwarden/web-vault - rm -rf "$TEMP_DIR" + fetch_and_deploy_gh_release "vaultwarden_webvault" "dani-garcia/bw_web_builds" "prebuild" "latest" "/opt/vaultwarden/web-vault" "bw_web_*.tar.gz" chown -R root:root /opt/vaultwarden/web-vault/ msg_ok "Updated Web-Vault to ${WVRELEASE}" From 3d0243adb0eaa012740983e9b6e6044cab943091 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 2 Feb 2026 18:13:10 +0000 Subject: [PATCH 04/93] chore: update github-versions.json (#11488) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 29 ++++++++++++++--------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index 9d7fd8359..699ed9ffc 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-02T12:12:15Z", + "generated": "2026-02-02T18:13:02Z", "versions": [ { "slug": "2fauth", @@ -109,9 +109,9 @@ { "slug": "bentopdf", "repo": "alam00000/bentopdf", - "version": "v2.0.0", + "version": "v2.1.0", "pinned": false, - "date": "2026-01-31T10:13:47Z" + "date": "2026-02-02T14:30:55Z" }, { "slug": "beszel", @@ -669,9 +669,9 @@ { "slug": "libretranslate", "repo": "LibreTranslate/LibreTranslate", - "version": "v1.8.3", + "version": "v1.8.4", "pinned": false, - "date": "2025-12-04T21:07:00Z" + "date": "2026-02-02T17:45:16Z" }, { "slug": "lidarr", @@ -1054,9 +1054,9 @@ { "slug": "prometheus-alertmanager", "repo": "prometheus/alertmanager", - "version": "v0.30.1", + "version": "v0.31.0", "pinned": false, - "date": "2026-01-12T23:30:06Z" + "date": "2026-02-02T13:34:15Z" }, { "slug": "prometheus-blackbox-exporter", @@ -1201,9 +1201,9 @@ { "slug": "scanopy", "repo": "scanopy/scanopy", - "version": "v0.14.0", + "version": "v0.14.1", "pinned": false, - "date": "2026-02-01T17:02:37Z" + "date": "2026-02-02T04:15:19Z" }, { "slug": "scraparr", @@ -1471,12 +1471,19 @@ "pinned": false, "date": "2025-10-22T17:03:54Z" }, + { + "slug": "vaultwarden", + "repo": "dani-garcia/vaultwarden", + "version": "1.35.2", + "pinned": false, + "date": "2026-01-09T18:37:04Z" + }, { "slug": "victoriametrics", "repo": "VictoriaMetrics/VictoriaMetrics", - "version": "v1.134.0", + "version": "v1.135.0", "pinned": false, - "date": "2026-01-19T13:29:43Z" + "date": "2026-02-02T14:20:15Z" }, { "slug": "vikunja", From 13b4094ff86a9d1d51e6b674385d7faa040c07b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Slavi=C5=A1a=20Are=C5=BEina?= <58952836+tremor021@users.noreply.github.com> Date: Mon, 2 Feb 2026 20:10:55 +0100 Subject: [PATCH 05/93] Deps (#11489) --- ct/grist.sh | 2 ++ install/grist-install.sh | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ct/grist.sh b/ct/grist.sh index f197f3f18..f037922b1 100644 --- a/ct/grist.sh +++ b/ct/grist.sh @@ -29,6 +29,8 @@ function update_script() { exit fi + ensure_dependencies git + if check_for_gh_release "grist" "gristlabs/grist-core"; then msg_info "Stopping Service" systemctl stop grist diff --git a/install/grist-install.sh b/install/grist-install.sh index 3948f4ffd..c86eff323 100644 --- a/install/grist-install.sh +++ b/install/grist-install.sh @@ -17,7 +17,8 @@ msg_info "Installing Dependencies" $STD apt install -y \ make \ ca-certificates \ - python3-venv + python3-venv \ + git msg_ok "Installed Dependencies" NODE_VERSION="22" NODE_MODULE="yarn@latest" setup_nodejs fetch_and_deploy_gh_release "grist" "gristlabs/grist-core" "tarball" From 4b9adbb249b6464717b85a69237de2fc47cab021 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Mon, 2 Feb 2026 19:11:20 +0000 Subject: [PATCH 06/93] Update CHANGELOG.md (#11490) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c094d48ec..a4d5f06d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -783,6 +783,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 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)) From 991b56d41226d6f03e3cf1189ac2b2c89501df11 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:22:02 +0000 Subject: [PATCH 07/93] chore: update github-versions.json (#11491) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index 699ed9ffc..d58931587 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-02T18:13:02Z", + "generated": "2026-02-03T00:21:55Z", "versions": [ { "slug": "2fauth", @@ -95,9 +95,9 @@ { "slug": "bar-assistant", "repo": "karlomikus/bar-assistant", - "version": "v5.13.0", + "version": "v5.13.1", "pinned": false, - "date": "2026-02-01T15:49:21Z" + "date": "2026-02-02T18:47:43Z" }, { "slug": "bazarr", @@ -312,9 +312,9 @@ { "slug": "ersatztv", "repo": "ErsatzTV/ErsatzTV", - "version": "v26.1.1", + "version": "v26.2.0", "pinned": false, - "date": "2026-01-08T22:02:15Z" + "date": "2026-02-02T20:54:26Z" }, { "slug": "excalidraw", @@ -746,9 +746,9 @@ { "slug": "mealie", "repo": "mealie-recipes/mealie", - "version": "v3.9.2", + "version": "v3.10.0", "pinned": false, - "date": "2026-01-02T19:40:09Z" + "date": "2026-02-02T18:32:52Z" }, { "slug": "mediamanager", From 3b1b7035615d4a6009e48cb035c63e0b0db4ee59 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:22:27 +0000 Subject: [PATCH 08/93] Update CHANGELOG.md (#11492) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4d5f06d2..ba3d8dfbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -772,6 +772,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-02-03 + ## 2026-02-02 ### 🆕 New Scripts From 40780edbd226e91714dcaf3134b8096b172c4808 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 06:19:33 +0000 Subject: [PATCH 09/93] chore: update github-versions.json (#11493) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index d58931587..94e7ffa25 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-03T00:21:55Z", + "generated": "2026-02-03T06:19:24Z", "versions": [ { "slug": "2fauth", @@ -543,9 +543,9 @@ { "slug": "jackett", "repo": "Jackett/Jackett", - "version": "v0.24.1012", + "version": "v0.24.1019", "pinned": false, - "date": "2026-02-02T11:05:14Z" + "date": "2026-02-03T06:01:43Z" }, { "slug": "joplin-server", @@ -746,9 +746,9 @@ { "slug": "mealie", "repo": "mealie-recipes/mealie", - "version": "v3.10.0", + "version": "v3.10.1", "pinned": false, - "date": "2026-02-02T18:32:52Z" + "date": "2026-02-03T01:04:38Z" }, { "slug": "mediamanager", From 24b2a945d58b3c067e374b1854bf230ab40bed39 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Tue, 3 Feb 2026 09:35:12 +0100 Subject: [PATCH 10/93] Paginate search and lock issues silently Replace single-page search with paginated queries (per_page=100) and iterate pages up to GitHub's 1000-result limit. Remove the hardcoded cutoffDate and the logic that added comments; instead lock issues/PRs directly with lock_reason='resolved'. Add logging for pages processed, skipped items, failures, and a total locked count. This makes the workflow scalable for large repositories and avoids posting automatic comments. --- .github/workflows/lock-issue.yaml | 77 +++++++++++++++---------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/.github/workflows/lock-issue.yaml b/.github/workflows/lock-issue.yaml index 089469623..5552a0f82 100644 --- a/.github/workflows/lock-issue.yaml +++ b/.github/workflows/lock-issue.yaml @@ -18,7 +18,6 @@ jobs: with: script: | const daysBeforeLock = 3; - const cutoffDate = new Date('2026-01-27T00:00:00Z'); const lockDate = new Date(); lockDate.setDate(lockDate.getDate() - daysBeforeLock); @@ -29,48 +28,48 @@ jobs: /dependabot/i ]; - // Search for closed, unlocked issues older than 3 days - const issues = await github.rest.search.issuesAndPullRequests({ - q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`, - per_page: 50 - }); + // Search for closed, unlocked issues older than 3 days (paginated) + let page = 1; + let totalLocked = 0; - console.log(`Found ${issues.data.items.length} issues/PRs to process`); - - for (const item of issues.data.items) { - // Skip excluded items - const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title)); - if (shouldExclude) { - console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`); - continue; - } + while (true) { + const issues = await github.rest.search.issuesAndPullRequests({ + q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`, + per_page: 100, + page: page + }); - const createdAt = new Date(item.created_at); - const isNew = createdAt >= cutoffDate; + if (issues.data.items.length === 0) break; - try { - // Add comment only for new issues (created after 2026-01-27) - if (isNew) { - const comment = item.pull_request - ? 'This pull request has been automatically locked. Please open a new issue for related bugs.' - : 'This issue has been automatically locked. Please open a new issue for related bugs and reference this issue if needed.'; - - await github.rest.issues.createComment({ - ...context.repo, - issue_number: item.number, - body: comment - }); + console.log(`Processing page ${page} with ${issues.data.items.length} issues/PRs`); + + for (const item of issues.data.items) { + // Skip excluded items + const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title)); + if (shouldExclude) { + console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`); + continue; } - // Lock the issue/PR - await github.rest.issues.lock({ - ...context.repo, - issue_number: item.number, - lock_reason: 'resolved' - }); - - console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`); - } catch (error) { - console.log(`Failed to lock #${item.number}: ${error.message}`); + try { + // Lock the issue/PR silently + await github.rest.issues.lock({ + ...context.repo, + issue_number: item.number, + lock_reason: 'resolved' + }); + + totalLocked++; + console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`); + } catch (error) { + console.log(`Failed to lock #${item.number}: ${error.message}`); + } } + + page++; + + // GitHub search API limit: max 1000 results + if (page > 10) break; } + + console.log(`Total locked: ${totalLocked} issues/PRs`); From 97e37cfb1f7e9e2f956cb8966fdb9248a51d3f97 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:32:18 +0100 Subject: [PATCH 11/93] Process oldest issues first; raise page cap Add sort: 'updated' and order: 'asc' to the issues search so closed/unlocked items are processed oldest-first. Improve logging to show items per page and total_count. Increase the pagination limit from 10 to 100 (allowing up to ~10,000 results) and update related comments. --- .github/workflows/lock-issue.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lock-issue.yaml b/.github/workflows/lock-issue.yaml index 5552a0f82..6aa2e49c6 100644 --- a/.github/workflows/lock-issue.yaml +++ b/.github/workflows/lock-issue.yaml @@ -28,20 +28,22 @@ jobs: /dependabot/i ]; - // Search for closed, unlocked issues older than 3 days (paginated) + // Search for closed, unlocked issues older than 3 days (paginated, oldest first) let page = 1; let totalLocked = 0; while (true) { const issues = await github.rest.search.issuesAndPullRequests({ q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`, + sort: 'updated', + order: 'asc', per_page: 100, page: page }); if (issues.data.items.length === 0) break; - console.log(`Processing page ${page} with ${issues.data.items.length} issues/PRs`); + console.log(`Page ${page}: ${issues.data.items.length} items (total available: ${issues.data.total_count})`); for (const item of issues.data.items) { // Skip excluded items @@ -68,8 +70,8 @@ jobs: page++; - // GitHub search API limit: max 1000 results - if (page > 10) break; + // GitHub search API limit: max 10000 results (100 pages * 100) - temporarily increased + if (page > 100) break; } console.log(`Total locked: ${totalLocked} issues/PRs`); From 586a436f3d53eba9c1e8da4df7769b37afba9a43 Mon Sep 17 00:00:00 2001 From: ls-root Date: Tue, 3 Feb 2026 12:11:03 +0100 Subject: [PATCH 12/93] fix(frontend): decouple table pagination from summary fetching (#11495) Prevent the summary data from refetching unnecessarily when log pagination changes. - Split the data fetching into two separate useEffect hooks. - Summary is now fetched only on mount. - Logs refetch only when page or limit dependencies change. - Decoupled loading states to prevent chart loading animation during log updates. --- frontend/src/app/data/page.tsx | 48 +++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/frontend/src/app/data/page.tsx b/frontend/src/app/data/page.tsx index b4969e4ec..374aac0da 100644 --- a/frontend/src/app/data/page.tsx +++ b/frontend/src/app/data/page.tsx @@ -94,7 +94,8 @@ const chartConfigApps = { export default function DataPage() { const [data, setData] = useState([]); const [summary, setSummary] = useState(null); - const [loading, setLoading] = useState(true); + const [summaryLoading, setSummaryLoading] = useState(true); + const [dataLoading, setDataLoading] = useState(true); const [error, setError] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(25); @@ -105,35 +106,40 @@ export default function DataPage() { const nf = new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 }); + // Fetch summary only once on mount useEffect(() => { - const fetchData = async () => { - setLoading(true); + const fetchSummary = async () => { try { - const [summaryRes, dataRes] = await Promise.all([ - fetch("https://api.htl-braunau.at/data/summary"), - fetch( - `https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${ - itemsPerPage === 0 ? "" : itemsPerPage - }`, - ), - ]); - + const summaryRes = await fetch("https://api.htl-braunau.at/data/summary"); if (!summaryRes.ok) { throw new Error(`Failed to fetch summary: ${summaryRes.statusText}`); } + const summaryData: SummaryData = await summaryRes.json(); + setSummary(summaryData); + } catch (err) { + setError((err as Error).message); + } finally { + setSummaryLoading(false); + } + }; + + fetchSummary(); + }, []); + + useEffect(() => { + const fetchData = async () => { + setDataLoading(true); + try { + const dataRes = await fetch(`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${itemsPerPage}`); if (!dataRes.ok) { throw new Error(`Failed to fetch data: ${dataRes.statusText}`); } - - const summaryData: SummaryData = await summaryRes.json(); const pageData: DataModel[] = await dataRes.json(); - - setSummary(summaryData); setData(pageData); } catch (err) { setError((err as Error).message); } finally { - setLoading(false); + setDataLoading(false); } }; @@ -306,7 +312,7 @@ export default function DataPage() {
- {loading ? ( + {summaryLoading ? (
@@ -411,7 +417,7 @@ export default function DataPage() { - {loading ? ( + {dataLoading ? (
@@ -478,7 +484,7 @@ export default function DataPage() { variant="outline" size="sm" onClick={() => setCurrentPage((prev) => Math.max(prev - 1, 1))} - disabled={currentPage === 1 || loading} + disabled={currentPage === 1 || dataLoading} > Previous @@ -488,7 +494,7 @@ export default function DataPage() { variant="outline" size="sm" onClick={() => setCurrentPage((prev) => prev + 1)} - disabled={loading || sortedData.length < itemsPerPage} + disabled={dataLoading || sortedData.length < itemsPerPage} > Next From 3621a4ef3501875f07cd00baf1be2e490966ce2f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 11:11:30 +0000 Subject: [PATCH 13/93] Update CHANGELOG.md (#11497) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba3d8dfbc..9e07ec405 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -774,6 +774,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-02-03 +### 🌐 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 From 6967029ae3c801850a27ffcd7b0b910fc0c15082 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 12:11:46 +0000 Subject: [PATCH 14/93] chore: update github-versions.json (#11499) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index 94e7ffa25..ab79fa34c 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-03T06:19:24Z", + "generated": "2026-02-03T12:11:38Z", "versions": [ { "slug": "2fauth", @@ -186,9 +186,9 @@ { "slug": "comfyui", "repo": "comfyanonymous/ComfyUI", - "version": "v0.11.1", + "version": "v0.12.0", "pinned": false, - "date": "2026-01-29T07:52:21Z" + "date": "2026-02-03T08:54:29Z" }, { "slug": "commafeed", @@ -879,9 +879,9 @@ { "slug": "opengist", "repo": "thomiceli/opengist", - "version": "v1.12.0", + "version": "v1.12.1", "pinned": false, - "date": "2026-01-27T15:31:57Z" + "date": "2026-02-03T09:00:43Z" }, { "slug": "ots", From 6411ae1d37887f13367d02fb20063fb86ef2ec7f Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 3 Feb 2026 11:40:36 -0500 Subject: [PATCH 15/93] [FIX] Shelfmark: unpin Chromium version (#11505) --- install/shelfmark-install.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/install/shelfmark-install.sh b/install/shelfmark-install.sh index d29a8463c..7889d74a6 100644 --- a/install/shelfmark-install.sh +++ b/install/shelfmark-install.sh @@ -105,14 +105,13 @@ elif [[ "$DEPLOYMENT_TYPE" == "4" ]]; then sed -i '/_BYPASS=/s/true/false/' /etc/shelfmark/.env else DEPLOYMENT_TYPE="1" - CHROME_VERSION=$(curl -fsSL https://raw.githubusercontent.com/calibrain/shelfmark/refs/heads/main/Dockerfile | sed -n '/chromium=/s/[^=]*=//p' | awk '{print $1}') msg_info "Installing internal bypasser dependencies" $STD apt install -y --no-install-recommends \ xvfb \ ffmpeg \ - chromium-common=${CHROME_VERSION} \ - chromium=${CHROME_VERSION} \ - chromium-driver=${CHROME_VERSION} \ + chromium-common \ + chromium \ + chromium-driver \ python3-tk msg_ok "Installed internal bypasser dependencies" fi From 7c0a812b3d0d8aed0d194f8d1a9c823eb6bbe795 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 17:17:51 +0000 Subject: [PATCH 16/93] Update CHANGELOG.md (#11508) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e07ec405..e3ed22be4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -774,6 +774,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-02-03 +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - [FIX] Shelfmark: unpin Chromium version [@vhsdream](https://github.com/vhsdream) ([#11505](https://github.com/community-scripts/ProxmoxVE/pull/11505)) + ### 🌐 Website - #### 🐞 Bug Fixes From 89e53f92453542db62422b727124795dd7489487 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 18:19:52 +0000 Subject: [PATCH 17/93] chore: update github-versions.json (#11509) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index ab79fa34c..c34eb4eaa 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-03T12:11:38Z", + "generated": "2026-02-03T18:19:44Z", "versions": [ { "slug": "2fauth", @@ -830,9 +830,9 @@ { "slug": "netbox", "repo": "netbox-community/netbox", - "version": "v4.5.1", + "version": "v4.5.2", "pinned": false, - "date": "2026-01-20T19:45:05Z" + "date": "2026-02-03T13:54:26Z" }, { "slug": "nocodb", @@ -1201,9 +1201,9 @@ { "slug": "scanopy", "repo": "scanopy/scanopy", - "version": "v0.14.1", + "version": "v0.14.2", "pinned": false, - "date": "2026-02-02T04:15:19Z" + "date": "2026-02-03T00:35:22Z" }, { "slug": "scraparr", @@ -1355,9 +1355,9 @@ { "slug": "thingsboard", "repo": "thingsboard/thingsboard", - "version": "v4.3", + "version": "v4.3.0.1", "pinned": false, - "date": "2026-01-20T14:27:07Z" + "date": "2026-02-03T12:39:14Z" }, { "slug": "threadfin", @@ -1607,9 +1607,9 @@ { "slug": "zwave-js-ui", "repo": "zwave-js/zwave-js-ui", - "version": "v11.10.1", + "version": "v11.11.0", "pinned": false, - "date": "2026-01-15T15:58:06Z" + "date": "2026-02-03T13:13:05Z" } ] } From baabbc4d53b61fe7743fd4a6b2340343154eae2a Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 3 Feb 2026 13:36:45 -0500 Subject: [PATCH 18/93] [FEAT] Scanopy: automatically update integrated daemon (#11506) --- ct/scanopy.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ct/scanopy.sh b/ct/scanopy.sh index a44433cb3..b4806a949 100644 --- a/ct/scanopy.sh +++ b/ct/scanopy.sh @@ -67,11 +67,18 @@ function update_script() { mv ./target/release/server /usr/bin/scanopy-server msg_ok "Built scanopy-server" + [[ -f /etc/systemd/system/scanopy-daemon.service ]] && + fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64" && + rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh && + sed -i -e 's|usr/bin|usr/local/bin|' \ + -e 's/push/daemon_poll/' \ + -e 's/pull/server_poll/' /etc/systemd/system/scanopy-daemon.service && + systemctl daemon-reload + msg_info "Starting services" systemctl start scanopy-server [[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl start scanopy-daemon msg_ok "Updated successfully!" - msg_warn "Update your integrated daemon via the UI" fi exit } From 45aa75afc028c64f15cbe2d95854eb4e4648d81b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 18:37:11 +0000 Subject: [PATCH 19/93] Update CHANGELOG.md (#11510) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3ed22be4..778ee6dbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -780,6 +780,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - [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)) + ### 🌐 Website - #### 🐞 Bug Fixes From 18f6df752fa02ac0832102446ad2987267a012ab Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 20:36:33 +0100 Subject: [PATCH 20/93] Add wealthfolio (ct) (#11511) Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> --- ct/wealthfolio.sh | 86 ++++++++++++++++++++++++++ frontend/public/json/wealthfolio.json | 40 ++++++++++++ install/wealthfolio-install.sh | 89 +++++++++++++++++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 ct/wealthfolio.sh create mode 100644 frontend/public/json/wealthfolio.json create mode 100644 install/wealthfolio-install.sh diff --git a/ct/wealthfolio.sh b/ct/wealthfolio.sh new file mode 100644 index 000000000..059b591f6 --- /dev/null +++ b/ct/wealthfolio.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func) +# Copyright (c) 2021-2026 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://wealthfolio.app/ + +APP="Wealthfolio" +var_tags="${var_tags:-finance;portfolio}" +var_cpu="${var_cpu:-4}" +var_ram="${var_ram:-4096}" +var_disk="${var_disk:-10}" +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/wealthfolio ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "wealthfolio" "afadil/wealthfolio"; then + msg_info "Stopping Service" + systemctl stop wealthfolio + msg_ok "Stopped Service" + + msg_info "Backing up Data" + cp -r /opt/wealthfolio_data /opt/wealthfolio_data_backup + cp /opt/wealthfolio/.env /opt/wealthfolio_env_backup + msg_ok "Backed up Data" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wealthfolio" "afadil/wealthfolio" "tarball" + + msg_info "Building Frontend (patience)" + cd /opt/wealthfolio + $STD pnpm install --frozen-lockfile + $STD pnpm tsc + $STD pnpm vite build + msg_ok "Built Frontend" + + msg_info "Building Backend (patience)" + cd /opt/wealthfolio/src-server + source ~/.cargo/env + $STD cargo build --release --manifest-path Cargo.toml + cp /opt/wealthfolio/src-server/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server + chmod +x /usr/local/bin/wealthfolio-server + msg_ok "Built Backend" + + msg_info "Restoring Data" + cp -r /opt/wealthfolio_data_backup/. /opt/wealthfolio_data + cp /opt/wealthfolio_env_backup /opt/wealthfolio/.env + rm -rf /opt/wealthfolio_data_backup /opt/wealthfolio_env_backup + msg_ok "Restored Data" + + msg_info "Cleaning Up" + rm -rf /opt/wealthfolio/src-server/target + rm -rf /root/.cargo/registry + rm -rf /opt/wealthfolio/node_modules + msg_ok "Cleaned Up" + + msg_info "Starting Service" + systemctl start wealthfolio + 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/frontend/public/json/wealthfolio.json b/frontend/public/json/wealthfolio.json new file mode 100644 index 000000000..8c5508b54 --- /dev/null +++ b/frontend/public/json/wealthfolio.json @@ -0,0 +1,40 @@ +{ + "name": "Wealthfolio", + "slug": "wealthfolio", + "categories": [ + 23 + ], + "date_created": "2026-02-03", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 8080, + "documentation": "https://wealthfolio.app/docs/introduction/", + "config_path": "/opt/wealthfolio/.env", + "website": "https://wealthfolio.app/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/wealthfolio.webp", + "description": "Wealthfolio is a beautiful, privacy-focused investment tracker with local data storage. Track your portfolio across multiple accounts and asset types with detailed performance analytics, goal planning, and multi-currency support.", + "install_methods": [ + { + "type": "default", + "script": "ct/wealthfolio.sh", + "resources": { + "cpu": 4, + "ram": 4096, + "hdd": 10, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": "See ~/wealthfolio.creds" + }, + "notes": [ + { + "text": "Login password is stored in ~/wealthfolio.creds", + "type": "info" + } + ] +} diff --git a/install/wealthfolio-install.sh b/install/wealthfolio-install.sh new file mode 100644 index 000000000..2d689081d --- /dev/null +++ b/install/wealthfolio-install.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: CrazyWolf13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://wealthfolio.app/ + +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 \ + pkg-config \ + libssl-dev \ + build-essential \ + libsqlite3-dev \ + argon2 +msg_ok "Installed Dependencies" + +setup_rust +NODE_MODULE="pnpm" setup_nodejs +fetch_and_deploy_gh_release "wealthfolio" "afadil/wealthfolio" "tarball" + +msg_info "Building Frontend (patience)" +cd /opt/wealthfolio +$STD pnpm install --frozen-lockfile +$STD pnpm tsc +$STD pnpm vite build +msg_ok "Built Frontend" + +msg_info "Building Backend (patience)" +cd /opt/wealthfolio/src-server +$STD cargo build --release --manifest-path Cargo.toml +cp /opt/wealthfolio/src-server/target/release/wealthfolio-server /usr/local/bin/wealthfolio-server +chmod +x /usr/local/bin/wealthfolio-server +msg_ok "Built Backend" + +msg_info "Configuring Wealthfolio" +mkdir -p /opt/wealthfolio_data +SECRET_KEY=$(openssl rand -base64 32) +WF_PASSWORD=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-16) +WF_PASSWORD_HASH=$(echo -n "$WF_PASSWORD" | argon2 "$(openssl rand -base64 16)" -id -e) +cat </opt/wealthfolio/.env +WF_LISTEN_ADDR=0.0.0.0:8080 +WF_DB_PATH=/opt/wealthfolio_data/wealthfolio.db +WF_SECRET_KEY=${SECRET_KEY} +WF_AUTH_PASSWORD_HASH=${WF_PASSWORD_HASH} +WF_STATIC_DIR=/opt/wealthfolio/dist +WF_CORS_ALLOW_ORIGINS=* +WF_REQUEST_TIMEOUT_MS=30000 +EOF +echo "WF_PASSWORD=${WF_PASSWORD}" >~/wealthfolio.creds +msg_ok "Configured Wealthfolio" + +msg_info "Cleaning Up" +rm -rf /opt/wealthfolio/src-server/target +rm -rf /root/.cargo/registry +rm -rf /opt/wealthfolio/node_modules +msg_ok "Cleaned Up" + +msg_info "Creating Service" +cat </etc/systemd/system/wealthfolio.service +[Unit] +Description=Wealthfolio Investment Tracker +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/wealthfolio +EnvironmentFile=/opt/wealthfolio/.env +ExecStart=/usr/local/bin/wealthfolio-server +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now wealthfolio +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From fb368bc2d88279c35e2864f5c32c8b3e8547ca94 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 19:37:03 +0000 Subject: [PATCH 21/93] Update CHANGELOG.md (#11514) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 778ee6dbf..b7d8f7eb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -774,6 +774,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-02-03 +### 🆕 New Scripts + + - Wealthfolio ([#11511](https://github.com/community-scripts/ProxmoxVE/pull/11511)) + ### 🚀 Updated Scripts - #### 🐞 Bug Fixes From f9c5c1d0b44f5ab592902b949b18cbcc7ec34d93 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 20:49:48 +0100 Subject: [PATCH 22/93] Update .app files (#11513) Co-authored-by: GitHub Actions --- ct/headers/wealthfolio | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/wealthfolio diff --git a/ct/headers/wealthfolio b/ct/headers/wealthfolio new file mode 100644 index 000000000..5e2b4a2a4 --- /dev/null +++ b/ct/headers/wealthfolio @@ -0,0 +1,6 @@ + _ __ ____ __ ____ ___ +| | / /__ ____ _/ / /_/ /_ / __/___ / (_)___ +| | /| / / _ \/ __ `/ / __/ __ \/ /_/ __ \/ / / __ \ +| |/ |/ / __/ /_/ / / /_/ / / / __/ /_/ / / / /_/ / +|__/|__/\___/\__,_/_/\__/_/ /_/_/ \____/_/_/\____/ + From 0b48fdf7fdcb76bf6388d7acca93659bdd44dcf4 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 3 Feb 2026 16:08:34 -0500 Subject: [PATCH 23/93] [FIX] tools.func: trim spaces in app_lc (#11512) --- misc/tools.func | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/misc/tools.func b/misc/tools.func index 0e53ce594..e2fc09fea 100644 --- a/misc/tools.func +++ b/misc/tools.func @@ -1531,7 +1531,8 @@ check_for_gh_release() { local app="$1" local source="$2" local pinned_version_in="${3:-}" # optional - local app_lc="${app,,}" + local app_lc="" + app_lc="$(echo "${app,,}" | tr -d ' ')" local current_file="$HOME/.${app_lc}" msg_info "Checking for update: ${app}" From 057523aabb07fbed1ecfd3de07338755ba6d30d2 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 21:09:02 +0000 Subject: [PATCH 24/93] Update CHANGELOG.md (#11516) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7d8f7eb3..380bef870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -788,6 +788,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - [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 From 75e79b2100a608da73b8c9e691a86736d91bdc71 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 00:18:53 +0000 Subject: [PATCH 25/93] chore: update github-versions.json (#11519) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 45 +++++++++++++---------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index c34eb4eaa..5187ca8b4 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-03T18:19:44Z", + "generated": "2026-02-04T00:18:44Z", "versions": [ { "slug": "2fauth", @@ -158,9 +158,9 @@ { "slug": "bytestash", "repo": "jordan-dalby/ByteStash", - "version": "v1.5.10", + "version": "v1.5.11", "pinned": false, - "date": "2026-01-26T14:07:59Z" + "date": "2026-02-03T22:12:19Z" }, { "slug": "caddy", @@ -186,9 +186,9 @@ { "slug": "comfyui", "repo": "comfyanonymous/ComfyUI", - "version": "v0.12.0", + "version": "v0.12.1", "pinned": false, - "date": "2026-02-03T08:54:29Z" + "date": "2026-02-03T21:27:07Z" }, { "slug": "commafeed", @@ -291,9 +291,9 @@ { "slug": "elementsynapse", "repo": "etkecc/synapse-admin", - "version": "v0.11.1-etke52", + "version": "v0.11.1-etke53", "pinned": false, - "date": "2026-01-09T08:41:29Z" + "date": "2026-02-03T20:38:15Z" }, { "slug": "emby", @@ -375,9 +375,9 @@ { "slug": "ghostfolio", "repo": "ghostfolio/ghostfolio", - "version": "2.234.0", + "version": "2.235.0", "pinned": false, - "date": "2026-01-30T19:00:22Z" + "date": "2026-02-03T19:27:17Z" }, { "slug": "gitea", @@ -781,9 +781,9 @@ { "slug": "metube", "repo": "alexta69/metube", - "version": "2026.02.01", + "version": "2026.02.03", "pinned": false, - "date": "2026-02-01T00:20:00Z" + "date": "2026-02-03T21:49:49Z" }, { "slug": "miniflux", @@ -823,9 +823,9 @@ { "slug": "navidrome", "repo": "navidrome/navidrome", - "version": "v0.59.0", + "version": "v0.60.0", "pinned": false, - "date": "2025-12-06T18:08:42Z" + "date": "2026-02-03T18:57:04Z" }, { "slug": "netbox", @@ -1271,16 +1271,16 @@ { "slug": "speedtest-tracker", "repo": "alexjustesen/speedtest-tracker", - "version": "v1.13.5", + "version": "v1.13.6", "pinned": false, - "date": "2026-01-08T22:35:28Z" + "date": "2026-02-03T21:20:51Z" }, { "slug": "spoolman", "repo": "Donkie/Spoolman", - "version": "v0.23.0", + "version": "v0.23.1", "pinned": false, - "date": "2026-01-23T20:42:34Z" + "date": "2026-02-03T19:03:55Z" }, { "slug": "sportarr", @@ -1425,9 +1425,9 @@ { "slug": "tunarr", "repo": "chrisbenincasa/tunarr", - "version": "v1.1.11", + "version": "v1.1.12", "pinned": false, - "date": "2026-01-30T22:34:30Z" + "date": "2026-02-03T20:19:00Z" }, { "slug": "uhf", @@ -1541,6 +1541,13 @@ "pinned": false, "date": "2025-12-31T16:53:34Z" }, + { + "slug": "wealthfolio", + "repo": "afadil/wealthfolio", + "version": "v2.1.0", + "pinned": false, + "date": "2025-12-01T21:57:36Z" + }, { "slug": "web-check", "repo": "CrazyWolf13/web-check", From 56e626c8972f7ca3765bbe75d1e742774e68ef3f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 00:19:25 +0000 Subject: [PATCH 26/93] Update CHANGELOG.md (#11520) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 380bef870..6463b6917 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -772,6 +772,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit +## 2026-02-04 + ## 2026-02-03 ### 🆕 New Scripts From ce22e8ae8b77986be2bb7d7917d37d8b5f723c42 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 06:18:11 +0000 Subject: [PATCH 27/93] chore: update github-versions.json (#11523) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 30 +++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index 5187ca8b4..b940ff51f 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-04T00:18:44Z", + "generated": "2026-02-04T06:18:03Z", "versions": [ { "slug": "2fauth", @@ -186,9 +186,9 @@ { "slug": "comfyui", "repo": "comfyanonymous/ComfyUI", - "version": "v0.12.1", + "version": "v0.12.2", "pinned": false, - "date": "2026-02-03T21:27:07Z" + "date": "2026-02-04T06:09:31Z" }, { "slug": "commafeed", @@ -256,9 +256,9 @@ { "slug": "docmost", "repo": "docmost/docmost", - "version": "v0.24.1", + "version": "v0.25.0", "pinned": false, - "date": "2025-12-14T13:49:16Z" + "date": "2026-02-04T00:33:45Z" }, { "slug": "domain-locker", @@ -515,9 +515,9 @@ { "slug": "huntarr", "repo": "plexguide/Huntarr.io", - "version": "9.1.8", + "version": "9.1.9.1", "pinned": false, - "date": "2026-02-02T01:29:45Z" + "date": "2026-02-04T01:08:22Z" }, { "slug": "inspircd", @@ -536,16 +536,16 @@ { "slug": "invoiceninja", "repo": "invoiceninja/invoiceninja", - "version": "v5.12.52", + "version": "v5.12.53", "pinned": false, - "date": "2026-02-01T02:08:10Z" + "date": "2026-02-04T00:52:01Z" }, { "slug": "jackett", "repo": "Jackett/Jackett", - "version": "v0.24.1019", + "version": "v0.24.1027", "pinned": false, - "date": "2026-02-03T06:01:43Z" + "date": "2026-02-04T05:56:22Z" }, { "slug": "joplin-server", @@ -767,9 +767,9 @@ { "slug": "meilisearch", "repo": "riccox/meilisearch-ui", - "version": "v0.15.0", + "version": "v0.15.1", "pinned": false, - "date": "2026-01-29T03:54:27Z" + "date": "2026-02-04T03:56:59Z" }, { "slug": "memos", @@ -1201,9 +1201,9 @@ { "slug": "scanopy", "repo": "scanopy/scanopy", - "version": "v0.14.2", + "version": "v0.14.3", "pinned": false, - "date": "2026-02-03T00:35:22Z" + "date": "2026-02-04T01:41:01Z" }, { "slug": "scraparr", From 65e50542b0b68aa2579ebdf216a9661b90827667 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 08:38:14 +0100 Subject: [PATCH 28/93] writefreely (#11524) * Add writefreely (ct) * Create symlink for WriteFreely in /usr/local/bin Added symbolic link for WriteFreely executable * Fix date_created and update user creation instructions Updated the creation date and modified user creation instructions. * Create symlink for WriteFreely in /usr/local/bin Added a symbolic link for the WriteFreely executable. --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: CanbiZ (MickLesk) <47820557+MickLesk@users.noreply.github.com> --- ct/writefreely.sh | 72 +++++++++++++++++++++++++++ frontend/public/json/writefreely.json | 40 +++++++++++++++ install/writefreely-install.sh | 63 +++++++++++++++++++++++ 3 files changed, 175 insertions(+) create mode 100644 ct/writefreely.sh create mode 100644 frontend/public/json/writefreely.json create mode 100644 install/writefreely-install.sh diff --git a/ct/writefreely.sh b/ct/writefreely.sh new file mode 100644 index 000000000..ec465b91b --- /dev/null +++ b/ct/writefreely.sh @@ -0,0 +1,72 @@ +#!/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: StellaeAlis +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/writefreely/writefreely + +APP="WriteFreely" +var_tags="${var_tags:-writing}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-1024}" +var_disk="${var_disk:-4}" +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/writefreely ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "writefreely" "writefreely/writefreely"; then + msg_info "Stopping Services" + systemctl stop writefreely + msg_ok "Stopped Services" + + msg_info "Creating Backup" + mkdir -p /tmp/writefreely_backup + cp /opt/writefreely/keys /tmp/writefreely_backup/ 2>/dev/null + cp /opt/writefreely/config.ini /tmp/writefreely_backup/ 2>/dev/null + msg_ok "Created Backup" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz" + + msg_info "Restoring Data" + cp /tmp/writefreely_backup/config.ini /opt/writefreely/ 2>/dev/null + cp /tmp/writefreely_backup/keys/* /opt/writefreely/keys/ 2>/dev/null + rm -rf /tmp/writefreely_backup + msg_ok "Restored Data" + + msg_info "Running Post-Update Tasks" + cd /opt/writefreely + $STD ./writefreely db migrate + ln -s /opt/writefreely/writefreely /usr/local/bin/writefreely + msg_ok "Ran Post-Update Tasks" + + msg_info "Starting Services" + systemctl start writefreely + msg_ok "Started Services" + 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}${CL}" diff --git a/frontend/public/json/writefreely.json b/frontend/public/json/writefreely.json new file mode 100644 index 000000000..9c4b07378 --- /dev/null +++ b/frontend/public/json/writefreely.json @@ -0,0 +1,40 @@ +{ + "name": "WriteFreely", + "slug": "writefreely", + "categories": [ + 12 + ], + "date_created": "2026-02-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 80, + "documentation": "https://writefreely.org/docs", + "config_path": "/opt/writefreely/config.ini", + "website": "https://writefreely.org/", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/writefreely-light.webp", + "description": "WriteFreely is free and open source software for easily publishing writing on the web with support for the ActivityPub protocol. Use it to start a personal blog — or an entire community.", + "install_methods": [ + { + "type": "default", + "script": "ct/writefreely.sh", + "resources": { + "cpu": 2, + "ram": 1024, + "hdd": 4, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "After installation execute `writefreely user create --admin :` to create your user.", + "type": "info" + } + ] +} diff --git a/install/writefreely-install.sh b/install/writefreely-install.sh new file mode 100644 index 000000000..e87e89184 --- /dev/null +++ b/install/writefreely-install.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: StellaeAlis +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/writefreely/writefreely + +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 crudini +msg_ok "Installed Dependencies" + +setup_mariadb +MARIADB_DB_NAME="writefreely" MARIADB_DB_USER="writefreely" setup_mariadb_db +fetch_and_deploy_gh_release "writefreely" "writefreely/writefreely" "prebuild" "latest" "/opt/writefreely" "writefreely_*_linux_amd64.tar.gz" + +msg_info "Setting up WriteFreely" +cd /opt/writefreely +$STD ./writefreely config generate +$STD ./writefreely keys generate +msg_ok "Setup WriteFreely" + +msg_info "Configuring WriteFreely" +$STD crudini --set config.ini server port 80 +$STD crudini --set config.ini server bind $LOCAL_IP +$STD crudini --set config.ini database username $MARIADB_DB_USER +$STD crudini --set config.ini database password $MARIADB_DB_PASS +$STD crudini --set config.ini database database $MARIADB_DB_NAME +$STD crudini --set config.ini app host http://$LOCAL_IP:80 +$STD ./writefreely db init +ln -s /opt/writefreely/writefreely /usr/local/bin/writefreely +msg_ok "Configured WriteFreely" + +msg_info "Creating Service" +cat </etc/systemd/system/writefreely.service +[Unit] +Description=WriteFreely Service +After=syslog.target network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/opt/writefreely +ExecStart=/opt/writefreely/writefreely +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now writefreely +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From 0029ad0dee973f6072288995ea4e5e80ca197e31 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 07:38:36 +0000 Subject: [PATCH 29/93] Update CHANGELOG.md (#11525) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6463b6917..4456de9d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -774,6 +774,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-02-04 +### 🆕 New Scripts + + - writefreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524)) + ## 2026-02-03 ### 🆕 New Scripts From 757a54e23a421af03d7e9fe9f50f1c51cdf6bfa8 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 08:41:58 +0100 Subject: [PATCH 30/93] Update .app files (#11526) Co-authored-by: GitHub Actions --- ct/headers/writefreely | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ct/headers/writefreely diff --git a/ct/headers/writefreely b/ct/headers/writefreely new file mode 100644 index 000000000..088cfecf7 --- /dev/null +++ b/ct/headers/writefreely @@ -0,0 +1,6 @@ + _ __ _ __ ______ __ +| | / /____(_) /____ / ____/_______ ___ / /_ __ +| | /| / / ___/ / __/ _ \/ /_ / ___/ _ \/ _ \/ / / / / +| |/ |/ / / / / /_/ __/ __/ / / / __/ __/ / /_/ / +|__/|__/_/ /_/\__/\___/_/ /_/ \___/\___/_/\__, / + /____/ From e99702977cfffbb8ff924d64a8ee940ca81e40a6 Mon Sep 17 00:00:00 2001 From: "push-app-to-main[bot]" <203845782+push-app-to-main[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 11:00:15 +0100 Subject: [PATCH 31/93] Wishlist (#11527) * Add wishlist (ct) * Update wishlist.sh * Update wishlist.json * Update wishlist.json --------- Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com> Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- ct/headers/wishlist | 6 +++ ct/wishlist.sh | 82 ++++++++++++++++++++++++++++++ frontend/public/json/wishlist.json | 35 +++++++++++++ install/wishlist-install.sh | 66 ++++++++++++++++++++++++ 4 files changed, 189 insertions(+) create mode 100644 ct/headers/wishlist create mode 100644 ct/wishlist.sh create mode 100644 frontend/public/json/wishlist.json create mode 100644 install/wishlist-install.sh diff --git a/ct/headers/wishlist b/ct/headers/wishlist new file mode 100644 index 000000000..a55ad71bc --- /dev/null +++ b/ct/headers/wishlist @@ -0,0 +1,6 @@ + _ ___ __ ___ __ +| | / (_)____/ /_ / (_)____/ /_ +| | /| / / / ___/ __ \/ / / ___/ __/ +| |/ |/ / (__ ) / / / / (__ ) /_ +|__/|__/_/____/_/ /_/_/_/____/\__/ + diff --git a/ct/wishlist.sh b/ct/wishlist.sh new file mode 100644 index 000000000..80ec6fdb4 --- /dev/null +++ b/ct/wishlist.sh @@ -0,0 +1,82 @@ +#!/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: Dunky13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/cmintey/wishlist + +APP="Wishlist" +var_tags="${var_tags:-sharing}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-5}" +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/wishlist ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + + if check_for_gh_release "wishlist" "cmintey/wishlist"; then + NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs + + msg_info "Stopping Service" + systemctl stop wishlist + msg_ok "Stopped Service" + + msg_info "Creating Backup" + mkdir -p /opt/wishlist-backup + cp /opt/wishlist/.env /opt/wishlist-backup/.env + cp -a /opt/wishlist/uploads /opt/wishlist-backup + cp -a /opt/wishlist/data /opt/wishlist-backup + msg_ok "Created Backup" + + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball" + LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist") + + msg_info "Updating Wishlist" + cd /opt/wishlist + $STD pnpm install + $STD pnpm svelte-kit sync + $STD pnpm prisma generate + sed -i 's|/usr/src/app/|/opt/wishlist/|g' $(grep -rl '/usr/src/app/' /opt/wishlist) + export VERSION="v${LATEST_APP_VERSION}" + export SHA="v${LATEST_APP_VERSION}" + $STD pnpm run build + $STD pnpm prune --prod + chmod +x /opt/wishlist/entrypoint.sh + + msg_info "Restoring Backup" + cp /opt/wishlist-backup/.env /opt/wishlist/.env + cp -a /opt/wishlist-backup/uploads /opt/wishlist + cp -a /opt/wishlist-backup/data /opt/wishlist + rm -rf /opt/wishlist-backup + msg_ok "Restored Backup" + + msg_ok "Updated Wishlist" + msg_info "Starting Service" + systemctl start wishlist + 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}:3280${CL}" diff --git a/frontend/public/json/wishlist.json b/frontend/public/json/wishlist.json new file mode 100644 index 000000000..58e3eb0eb --- /dev/null +++ b/frontend/public/json/wishlist.json @@ -0,0 +1,35 @@ +{ + "name": "Wishlist", + "slug": "wishlist", + "categories": [ + 12 + ], + "date_created": "2026-02-04", + "type": "ct", + "updateable": true, + "privileged": false, + "interface_port": 3280, + "documentation": "https://github.com/cmintey/wishlist/blob/main/README.md#getting-started", + "config_path": "/opt/wishlist/.env", + "website": "https://github.com/cmintey/wishlist", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/cmintey-wishlist.webp", + "description": "Wishlist is a self-hosted wishlist application that you can share with your friends and family. You no longer have to wonder what to get your family for the holidays, simply check their wishlist and claim any available item!", + "install_methods": [ + { + "type": "default", + "script": "ct/wishlist.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 5, + "os": "Debian", + "version": "13" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [] +} diff --git a/install/wishlist-install.sh b/install/wishlist-install.sh new file mode 100644 index 000000000..f1821e0c7 --- /dev/null +++ b/install/wishlist-install.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: Dunky13 +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/cmintey/wishlist + +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 \ + openssl \ + caddy +msg_ok "Installed dependencies" + +NODE_VERSION="24" NODE_MODULE="pnpm" setup_nodejs +fetch_and_deploy_gh_release "wishlist" "cmintey/wishlist" "tarball" +LATEST_APP_VERSION=$(get_latest_github_release "cmintey/wishlist") + +msg_info "Installing Wishlist" +cd /opt/wishlist +cp .env.example .env +sed -i "s|^ORIGIN=.*|ORIGIN=http://${LOCAL_IP}:3280|" /opt/wishlist/.env +echo "" >>/opt/wishlist/.env +echo "NODE_ENV=production" >>/opt/wishlist/.env +$STD pnpm install +$STD pnpm svelte-kit sync +$STD pnpm prisma generate +sed -i 's|/usr/src/app/|/opt/wishlist/|g' $(grep -rl '/usr/src/app/' /opt/wishlist) +export VERSION="v${LATEST_APP_VERSION}" +export SHA="v${LATEST_APP_VERSION}" +$STD pnpm run build +$STD pnpm prune --prod +chmod +x /opt/wishlist/entrypoint.sh +mkdir -p /opt/wishlist/uploads +mkdir -p /opt/wishlist/data +msg_ok "Installed Wishlist" + +msg_info "Creating Service" +cat </etc/systemd/system/wishlist.service +[Unit] +Description=Wishlist Service +After=network.target + +[Service] +WorkingDirectory=/opt/wishlist +EnvironmentFile=/opt/wishlist/.env +ExecStart=/usr/bin/env sh -c './entrypoint.sh' +Restart=on-failure + +[Install] +WantedBy=multi-user.target +EOF +systemctl enable -q --now wishlist +msg_ok "Created Service" + +motd_ssh +customize +cleanup_lxc From 2e9624fdfbcce1761571e835d3d022843fadc965 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 10:00:46 +0000 Subject: [PATCH 32/93] Update CHANGELOG.md (#11530) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4456de9d0..28a517602 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -776,7 +776,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🆕 New Scripts - - writefreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524)) + - Wishlist ([#11527](https://github.com/community-scripts/ProxmoxVE/pull/11527)) +- WriteFreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524)) ## 2026-02-03 From c6dfa052eec202834c29aae9823183130d2627a9 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 11:01:30 +0100 Subject: [PATCH 33/93] Update .app files (#11529) Co-authored-by: GitHub Actions --- ct/headers/wishlist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/headers/wishlist b/ct/headers/wishlist index a55ad71bc..9571bf8fe 100644 --- a/ct/headers/wishlist +++ b/ct/headers/wishlist @@ -1,4 +1,4 @@ - _ ___ __ ___ __ + _ ___ __ ___ __ | | / (_)____/ /_ / (_)____/ /_ | | /| / / / ___/ __ \/ / / ___/ __/ | |/ |/ / (__ ) / / / / (__ ) /_ From fa86809863d44257dec125fd7886a3a29e39cb94 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 4 Feb 2026 11:16:06 +0100 Subject: [PATCH 34/93] core: create vm-core.func from dev (#11528) --- misc/vm-core.func | 620 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 620 insertions(+) create mode 100644 misc/vm-core.func diff --git a/misc/vm-core.func b/misc/vm-core.func new file mode 100644 index 000000000..125b16125 --- /dev/null +++ b/misc/vm-core.func @@ -0,0 +1,620 @@ +# Copyright (c) 2021-2026 community-scripts ORG +# License: MIT | https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/LICENSE + +set -euo pipefail +SPINNER_PID="" +SPINNER_ACTIVE=0 +SPINNER_MSG="" +declare -A MSG_INFO_SHOWN + +# ------------------------------------------------------------------------------ +# Loads core utility groups once (colors, formatting, icons, defaults). +# ------------------------------------------------------------------------------ + +[[ -n "${_CORE_FUNC_LOADED:-}" ]] && return +_CORE_FUNC_LOADED=1 + +load_functions() { + [[ -n "${__FUNCTIONS_LOADED:-}" ]] && return + __FUNCTIONS_LOADED=1 + color + formatting + icons + default_vars + set_std_mode + shell_check + get_valid_nextid + cleanup_vmid + cleanup + check_root + pve_check + arch_check +} + +# Function to download & save header files +get_header() { + local app_name=$(echo "${APP,,}" | tr ' ' '-') + local app_type=${APP_TYPE:-vm} + local header_url="https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/${app_type}/headers/${app_name}" + local local_header_path="/usr/local/community-scripts/headers/${app_type}/${app_name}" + + mkdir -p "$(dirname "$local_header_path")" + + if [ ! -s "$local_header_path" ]; then + if ! curl -fsSL "$header_url" -o "$local_header_path"; then + return 1 + fi + fi + + cat "$local_header_path" 2>/dev/null || true +} + +header_info() { + local app_name=$(echo "${APP,,}" | tr ' ' '-') + local header_content + + header_content=$(get_header "$app_name") || header_content="" + + clear + local term_width + term_width=$(tput cols 2>/dev/null || echo 120) + + if [ -n "$header_content" ]; then + echo "$header_content" + fi +} + +# ------------------------------------------------------------------------------ +# Sets ANSI color codes used for styled terminal output. +# ------------------------------------------------------------------------------ +color() { + YW=$(echo "\033[33m") + YWB=$(echo "\033[93m") + BL=$(echo "\033[36m") + RD=$(echo "\033[01;31m") + BGN=$(echo "\033[4;92m") + GN=$(echo "\033[1;92m") + DGN=$(echo "\033[32m") + CL=$(echo "\033[m") +} + +# ------------------------------------------------------------------------------ +# Defines formatting helpers like tab, bold, and line reset sequences. +# ------------------------------------------------------------------------------ +formatting() { + BFR="\\r\\033[K" + BOLD=$(echo "\033[1m") + HOLD=" " + TAB=" " + TAB3=" " +} + +# ------------------------------------------------------------------------------ +# Sets symbolic icons used throughout user feedback and prompts. +# ------------------------------------------------------------------------------ +icons() { + CM="${TAB}✔️${TAB}" + CROSS="${TAB}✖️${TAB}" + DNSOK="✔️ " + DNSFAIL="${TAB}✖️${TAB}" + INFO="${TAB}💡${TAB}${CL}" + OS="${TAB}🖥️${TAB}${CL}" + OSVERSION="${TAB}🌟${TAB}${CL}" + CONTAINERTYPE="${TAB}📦${TAB}${CL}" + DISKSIZE="${TAB}💾${TAB}${CL}" + CPUCORE="${TAB}🧠${TAB}${CL}" + RAMSIZE="${TAB}🛠️${TAB}${CL}" + SEARCH="${TAB}🔍${TAB}${CL}" + VERBOSE_CROPPED="🔍${TAB}" + VERIFYPW="${TAB}🔐${TAB}${CL}" + CONTAINERID="${TAB}🆔${TAB}${CL}" + HOSTNAME="${TAB}🏠${TAB}${CL}" + BRIDGE="${TAB}🌉${TAB}${CL}" + NETWORK="${TAB}📡${TAB}${CL}" + GATEWAY="${TAB}🌐${TAB}${CL}" + DISABLEIPV6="${TAB}🚫${TAB}${CL}" + ICON_DISABLEIPV6="${TAB}🚫${TAB}${CL}" + DEFAULT="${TAB}⚙️${TAB}${CL}" + MACADDRESS="${TAB}🔗${TAB}${CL}" + VLANTAG="${TAB}🏷️${TAB}${CL}" + ROOTSSH="${TAB}🔑${TAB}${CL}" + CREATING="${TAB}🚀${TAB}${CL}" + ADVANCED="${TAB}🧩${TAB}${CL}" + FUSE="${TAB}🗂️${TAB}${CL}" + GPU="${TAB}🎮${TAB}${CL}" + HOURGLASS="${TAB}⏳${TAB}" +} + +# ------------------------------------------------------------------------------ +# Sets default verbose mode for script and os execution. +# ------------------------------------------------------------------------------ +set_std_mode() { + if [ "${VERBOSE:-no}" = "yes" ]; then + STD="" + else + STD="silent" + fi +} + +# ------------------------------------------------------------------------------ +# default_vars() +# +# - Sets default retry and wait variables used for system actions +# - RETRY_NUM: Maximum number of retry attempts (default: 10) +# - RETRY_EVERY: Seconds to wait between retries (default: 3) +# ------------------------------------------------------------------------------ +default_vars() { + RETRY_NUM=10 + RETRY_EVERY=3 + i=$RETRY_NUM +} + +# ------------------------------------------------------------------------------ +# get_active_logfile() +# +# - Returns the appropriate log file based on execution context +# - BUILD_LOG: Host operations (VM creation) +# - Fallback to /tmp/build-.log if not set +# ------------------------------------------------------------------------------ +get_active_logfile() { + if [[ -n "${BUILD_LOG:-}" ]]; then + echo "$BUILD_LOG" + else + # Fallback for legacy scripts + echo "/tmp/build-$(date +%Y%m%d_%H%M%S).log" + fi +} + +# ------------------------------------------------------------------------------ +# silent() +# +# - Executes command with output redirected to active log file +# - On error: displays last 10 lines of log and exits with original exit code +# - Temporarily disables error trap to capture exit code correctly +# - Sources explain_exit_code() for detailed error messages +# ------------------------------------------------------------------------------ +silent() { + local cmd="$*" + local caller_line="${BASH_LINENO[0]:-unknown}" + local logfile="$(get_active_logfile)" + + set +Eeuo pipefail + trap - ERR + + "$@" >>"$logfile" 2>&1 + local rc=$? + + set -Eeuo pipefail + trap 'error_handler' ERR + + if [[ $rc -ne 0 ]]; then + # Source explain_exit_code if needed + if ! declare -f explain_exit_code >/dev/null 2>&1; then + source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/error_handler.func) 2>/dev/null || true + fi + + local explanation="" + if declare -f explain_exit_code >/dev/null 2>&1; then + explanation="$(explain_exit_code "$rc")" + fi + + printf "\e[?25h" + if [[ -n "$explanation" ]]; then + msg_error "in line ${caller_line}: exit code ${rc} (${explanation})" + else + msg_error "in line ${caller_line}: exit code ${rc}" + fi + msg_custom "→" "${YWB}" "${cmd}" + + if [[ -s "$logfile" ]]; then + local log_lines=$(wc -l <"$logfile") + echo "--- Last 10 lines of log ---" + tail -n 10 "$logfile" + echo "----------------------------" + + # Show how to view full log if there are more lines + if [[ $log_lines -gt 10 ]]; then + msg_custom "📋" "${YW}" "View full log (${log_lines} lines): ${logfile}" + fi + fi + + exit "$rc" + fi +} + +# ------------------------------------------------------------------------------ +# Performs a curl request with retry logic and inline feedback. +# ------------------------------------------------------------------------------ + +run_curl() { + if [ "$VERB" = "no" ]; then + curl "$@" >/dev/null 2>>/tmp/curl_error.log + else + curl "$@" 2>>/tmp/curl_error.log + fi +} + +curl_handler() { + local args=() + local url="" + local max_retries=0 delay=2 attempt=1 + local exit_code has_output_file=false + + for arg in "$@"; do + if [[ "$arg" != -* && -z "$url" ]]; then + url="$arg" + fi + [[ "$arg" == "-o" || "$arg" == --output ]] && has_output_file=true + args+=("$arg") + done + + if [[ -z "$url" ]]; then + msg_error "no valid url or option entered for curl_handler" + exit 1 + fi + + $STD msg_info "Fetching: $url" + + while :; do + if $has_output_file; then + $STD run_curl "${args[@]}" + exit_code=$? + else + $STD result=$(run_curl "${args[@]}") + exit_code=$? + fi + + if [[ $exit_code -eq 0 ]]; then + stop_spinner + msg_ok "Fetched: $url" + $has_output_file || printf '%s' "$result" + return 0 + fi + + if ((attempt >= max_retries)); then + stop_spinner + if [ -s /tmp/curl_error.log ]; then + local curl_stderr + curl_stderr=$(&2 + sleep "$delay" + ((attempt++)) + done +} + +# ------------------------------------------------------------------------------ +# Handles specific curl error codes and displays descriptive messages. +# ------------------------------------------------------------------------------ +__curl_err_handler() { + local exit_code="$1" + local target="$2" + local curl_msg="$3" + + case $exit_code in + 1) msg_error "Unsupported protocol: $target" ;; + 2) msg_error "Curl init failed: $target" ;; + 3) msg_error "Malformed URL: $target" ;; + 5) msg_error "Proxy resolution failed: $target" ;; + 6) msg_error "Host resolution failed: $target" ;; + 7) msg_error "Connection failed: $target" ;; + 9) msg_error "Access denied: $target" ;; + 18) msg_error "Partial file transfer: $target" ;; + 22) msg_error "HTTP error (e.g. 400/404): $target" ;; + 23) msg_error "Write error on local system: $target" ;; + 26) msg_error "Read error from local file: $target" ;; + 28) msg_error "Timeout: $target" ;; + 35) msg_error "SSL connect error: $target" ;; + 47) msg_error "Too many redirects: $target" ;; + 51) msg_error "SSL cert verify failed: $target" ;; + 52) msg_error "Empty server response: $target" ;; + 55) msg_error "Send error: $target" ;; + 56) msg_error "Receive error: $target" ;; + 60) msg_error "SSL CA not trusted: $target" ;; + 67) msg_error "Login denied by server: $target" ;; + 78) msg_error "Remote file not found (404): $target" ;; + *) msg_error "Curl failed with code $exit_code: $target" ;; + esac + + [[ -n "$curl_msg" ]] && printf "%s\n" "$curl_msg" >&2 + exit 1 +} + +# ------------------------------------------------------------------------------ +# shell_check() +# +# - Verifies that the script is running under Bash shell +# - Exits with error message if different shell is detected +# ------------------------------------------------------------------------------ +shell_check() { + if [[ "$(ps -p $$ -o comm=)" != "bash" ]]; then + clear + msg_error "Your default shell is currently not set to Bash. To use these scripts, please switch to the Bash shell." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +# ------------------------------------------------------------------------------ +# clear_line() +# +# - Clears current terminal line using tput or ANSI escape codes +# - Moves cursor to beginning of line (carriage return) +# - Fallback to ANSI codes if tput not available +# ------------------------------------------------------------------------------ +clear_line() { + tput cr 2>/dev/null || echo -en "\r" + tput el 2>/dev/null || echo -en "\033[K" +} + +# ------------------------------------------------------------------------------ +# is_verbose_mode() +# +# - Determines if script should run in verbose mode +# - Checks VERBOSE and var_verbose variables +# - Also returns true if not running in TTY (pipe/redirect scenario) +# ------------------------------------------------------------------------------ +is_verbose_mode() { + local verbose="${VERBOSE:-${var_verbose:-no}}" + [[ "$verbose" != "no" || ! -t 2 ]] +} + +### dev spinner ### +SPINNER_ACTIVE=0 +SPINNER_PID="" +SPINNER_MSG="" +declare -A MSG_INFO_SHOWN=() + +# Trap cleanup on various signals +trap 'cleanup_spinner' EXIT INT TERM HUP + +# Cleans up spinner process on exit +cleanup_spinner() { + stop_spinner + # Additional cleanup if needed +} + +start_spinner() { + local msg="${1:-Processing...}" + local frames=(⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏) + local spin_i=0 + local interval=0.1 + + # Set message and clear current line + SPINNER_MSG="$msg" + printf "\r\e[2K" >&2 + + # Stop any existing spinner + stop_spinner + + # Set active flag + SPINNER_ACTIVE=1 + + # Start spinner in background + { + while [[ "$SPINNER_ACTIVE" -eq 1 ]]; do + printf "\r\e[2K%s %b" "${TAB}${frames[spin_i]}${TAB}" "${YW}${SPINNER_MSG}${CL}" >&2 + spin_i=$(((spin_i + 1) % ${#frames[@]})) + sleep "$interval" + done + } & + + SPINNER_PID=$! + + # Disown to prevent getting "Terminated" messages + disown "$SPINNER_PID" 2>/dev/null || true +} + +stop_spinner() { + # Check if spinner is active and PID exists + if [[ "$SPINNER_ACTIVE" -eq 1 ]] && [[ -n "${SPINNER_PID}" ]]; then + SPINNER_ACTIVE=0 + + if kill -0 "$SPINNER_PID" 2>/dev/null; then + kill "$SPINNER_PID" 2>/dev/null + # Give it a moment to terminate + sleep 0.1 + # Force kill if still running + if kill -0 "$SPINNER_PID" 2>/dev/null; then + kill -9 "$SPINNER_PID" 2>/dev/null + fi + # Wait for process but ignore errors + wait "$SPINNER_PID" 2>/dev/null || true + fi + + # Clear spinner line + printf "\r\e[2K" >&2 + SPINNER_PID="" + fi +} + +spinner_guard() { + # Safely stop spinner if it's running + if [[ "$SPINNER_ACTIVE" -eq 1 ]] && [[ -n "${SPINNER_PID}" ]]; then + stop_spinner + fi +} + +msg_info() { + local msg="${1:-Information message}" + + # Only show each message once unless reset + if [[ -n "${MSG_INFO_SHOWN["$msg"]+x}" ]]; then + return + fi + MSG_INFO_SHOWN["$msg"]=1 + + spinner_guard + start_spinner "$msg" +} + +msg_ok() { + local msg="${1:-Operation completed successfully}" + stop_spinner + printf "\r\e[2K%s %b\n" "${CM}" "${GN}${msg}${CL}" >&2 + + # Remove from shown messages to allow it to be shown again + local sanitized_msg + sanitized_msg=$(printf '%s' "$msg" | sed 's/\x1b\[[0-9;]*m//g; s/[^a-zA-Z0-9_]/_/g') + unset 'MSG_INFO_SHOWN['"$sanitized_msg"']' 2>/dev/null || true +} + +msg_error() { + local msg="${1:-An error occurred}" + stop_spinner + printf "\r\e[2K%s %b\n" "${CROSS}" "${RD}${msg}${CL}" >&2 +} + +msg_warn() { + stop_spinner + local msg="$1" + echo -e "${BFR:-}${INFO:-ℹ️} ${YWB}${msg}${CL}" >&2 +} + +# Helper function to display a message with custom symbol and color +msg_custom() { + local symbol="${1:-*}" + local color="${2:-$CL}" + local msg="${3:-Custom message}" + [[ -z "$msg" ]] && return + stop_spinner + printf "\r\e[2K%s %b\n" "$symbol" "${color}${msg}${CL}" >&2 +} + +# ------------------------------------------------------------------------------ +# msg_debug() +# +# - Displays debug message with timestamp when var_full_verbose=1 +# - Automatically enables var_verbose if not already set +# - Uses bright yellow color for debug output +# ------------------------------------------------------------------------------ +msg_debug() { + if [[ "${var_full_verbose:-0}" == "1" ]]; then + [[ "${var_verbose:-0}" != "1" ]] && var_verbose=1 + echo -e "${YWB}[$(date '+%F %T')] [DEBUG]${CL} $*" + fi +} + +# Displays error message and immediately terminates script +fatal() { + msg_error "$1" + kill -INT $$ +} + +get_valid_nextid() { + local try_id + try_id=$(pvesh get /cluster/nextid) + while true; do + if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then + try_id=$((try_id + 1)) + continue + fi + if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then + try_id=$((try_id + 1)) + continue + fi + break + done + echo "$try_id" +} + +cleanup_vmid() { + if [[ -z "${VMID:-}" ]]; then + return + fi + if qm status "$VMID" &>/dev/null; then + qm stop "$VMID" &>/dev/null + qm destroy "$VMID" &>/dev/null + fi +} + +cleanup() { + if [[ "$(dirs -p | wc -l)" -gt 1 ]]; then + popd >/dev/null || true + fi +} + +check_root() { + if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then + clear + msg_error "Please run this script as root." + echo -e "\nExiting..." + sleep 2 + exit + fi +} + +pve_check() { + if ! pveversion | grep -Eq "pve-manager/(8\.[1-4]|9\.[0-1])(\.[0-9]+)*"; then + msg_error "This version of Proxmox Virtual Environment is not supported" + echo -e "Requires Proxmox Virtual Environment Version 8.1 - 8.4 or 9.0 - 9.1." + echo -e "Exiting..." + sleep 2 + exit + fi +} + +arch_check() { + if [ "$(dpkg --print-architecture)" != "amd64" ]; then + echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" + echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +exit_script() { + clear + echo -e "\n${CROSS}${RD}User exited script${CL}\n" + exit +} + +check_hostname_conflict() { + local hostname="$1" + if qm list | awk '{print $2}' | grep -qx "$hostname"; then + msg_error "Hostname $hostname already in use by another VM." + exit 1 + fi +} + +set_description() { + DESCRIPTION=$( + cat < + + Logo + + +

${NSAPP} VM

+ +

+ + spend Coffee + +

+ + + + GitHub + + + + Discussions + + + + Issues + +
+EOF + ) + qm set "$VMID" -description "$DESCRIPTION" >/dev/null + +} From c570cbe0bee0f300b55931913b4e21bee2f17e55 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 10:16:37 +0000 Subject: [PATCH 35/93] Update CHANGELOG.md (#11531) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28a517602..ade9ffca3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -779,6 +779,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - Wishlist ([#11527](https://github.com/community-scripts/ProxmoxVE/pull/11527)) - WriteFreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524)) +### 💾 Core + + - #### ✨ New Features + + - core: create vm-core.func from dev [@MickLesk](https://github.com/MickLesk) ([#11528](https://github.com/community-scripts/ProxmoxVE/pull/11528)) + ## 2026-02-03 ### 🆕 New Scripts From 81abf708513caa4c2e7a50a5f34a8e6a35240b1e Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:12:03 +0000 Subject: [PATCH 36/93] chore: update github-versions.json (#11535) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index b940ff51f..ad8283379 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-04T06:18:03Z", + "generated": "2026-02-04T12:11:53Z", "versions": [ { "slug": "2fauth", @@ -515,9 +515,9 @@ { "slug": "huntarr", "repo": "plexguide/Huntarr.io", - "version": "9.1.9.1", + "version": "9.1.11", "pinned": false, - "date": "2026-02-04T01:08:22Z" + "date": "2026-02-04T11:30:25Z" }, { "slug": "inspircd", @@ -1562,6 +1562,13 @@ "pinned": false, "date": "2026-01-08T09:50:00Z" }, + { + "slug": "wishlist", + "repo": "cmintey/wishlist", + "version": "v0.59.0", + "pinned": false, + "date": "2026-01-19T16:42:14Z" + }, { "slug": "wizarr", "repo": "wizarrrr/wizarr", @@ -1569,6 +1576,13 @@ "pinned": false, "date": "2025-12-09T14:30:23Z" }, + { + "slug": "writefreely", + "repo": "writefreely/writefreely", + "version": "v0.16.0", + "pinned": false, + "date": "2025-08-29T19:30:02Z" + }, { "slug": "yt-dlp-webui", "repo": "marcopiovanello/yt-dlp-web-ui", From 27ab446926d5e6cdfb7ea5290e6e5752a76af529 Mon Sep 17 00:00:00 2001 From: ls-root Date: Wed, 4 Feb 2026 13:27:42 +0100 Subject: [PATCH 37/93] fix(frontend): implement weighted search scoring for command menu (#11534) * fix(frontend): implement weighted search scoring for command menu The previous cmdk search was filtered correctly but then sorted by category order rather than match strength. This caused "Dokpoly" to appear above "Traefik", if you searched for Traefik, simply because its category (Containers) comes before Traefik's category alphabetically. - Flatten search results into a single "Search Results" group. - Implement scoring to prioritize name matches over descriptions. - Revert to category grouping only when the search query is empty. * perf(frontend): optimize search logic Limiting the results to 20 helps a lot. --- frontend/src/components/command-menu.tsx | 119 ++++++++++++++++++++--- 1 file changed, 104 insertions(+), 15 deletions(-) diff --git a/frontend/src/components/command-menu.tsx b/frontend/src/components/command-menu.tsx index 7596b8307..081cade24 100644 --- a/frontend/src/components/command-menu.tsx +++ b/frontend/src/components/command-menu.tsx @@ -23,6 +23,34 @@ import { Button } from "./ui/button"; import { Badge } from "./ui/badge"; import Link from "next/link"; +function search(scripts: Script[], query: string): Script[] { + const queryLower = query.toLowerCase().trim(); + const searchWords = queryLower.split(/\s+/).filter(Boolean); + + return scripts + .map(script => { + const nameLower = script.name.toLowerCase(); + const descriptionLower = (script.description || "").toLowerCase(); + + let score = 0; + + for (const word of searchWords) { + if (nameLower.includes(word)) { + score += 10; + } + if (descriptionLower.includes(word)) { + score += 5; + } + } + + return { script, score }; + }) + .filter(({ score }) => score > 0) + .sort((a, b) => b.score - a.score) + .slice(0, 20) + .map(({ script }) => script); +} + export function formattedBadge(type: string) { switch (type) { case "vm": @@ -51,9 +79,11 @@ function getRandomScript(categories: Category[], previouslySelected: Set } function CommandMenu() { + const [query, setQuery] = React.useState(""); const [open, setOpen] = React.useState(false); const [links, setLinks] = React.useState([]); const [isLoading, setIsLoading] = React.useState(false); + const [results, setResults] = React.useState([]); const [selectedScripts, setSelectedScripts] = React.useState>(new Set()); const router = useRouter(); @@ -70,6 +100,27 @@ function CommandMenu() { }); }; + React.useEffect(() => { + if (query.trim() === "") { + fetchSortedCategories(); + } + else { + const scriptMap = new Map(); + + for (const category of links) { + for (const script of category.scripts || []) { + if (!scriptMap.has(script.slug)) { + scriptMap.set(script.slug, script); + } + } + } + + const uniqueScripts = Array.from(scriptMap.values()); + const filteredResults = search(uniqueScripts, query); + setResults(filteredResults); + } + }, [query]); + React.useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "k" && (e.metaKey || e.ctrlKey)) { @@ -197,20 +248,20 @@ function CommandMenu() { { - const searchLower = search.toLowerCase().trim(); - if (!searchLower) - return 1; - const valueLower = value.toLowerCase(); - const searchWords = searchLower.split(/\s+/).filter(Boolean); - // All search words must appear somewhere in the value (name + description) - const allWordsMatch = searchWords.every((word: string) => valueLower.includes(word)); - return allWordsMatch ? 1 : 0; + onOpenChange={(open) => { + setOpen(open); + if (open) { + setQuery(""); + setResults([]); + } }} > Search scripts - + {isLoading ? ( @@ -233,9 +284,10 @@ function CommandMenu() {
)} - {Object.entries(uniqueScriptsByCategory).map(([categoryName, scripts]) => ( - - {scripts.map(script => ( + + {results.length > 0 ? ( + + {results.map(script => ( ))} - ))} + ) : ( // When no search results, show all scripts grouped by category + Object.entries(uniqueScriptsByCategory).map(([categoryName, scripts]) => ( + + {scripts.map(script => ( + { + setOpen(false); + router.push(`/scripts?id=${script.slug}`); + }} + tabIndex={0} + aria-label={`Open script ${script.name}`} + onKeyDown={(e) => { + if (e.key === "Enter" || e.key === " ") { + setOpen(false); + router.push(`/scripts?id=${script.slug}`); + } + }} + > +
setOpen(false)}> + ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)} + unoptimized + width={16} + height={16} + alt="" + className="h-5 w-5" + /> + {script.name} + {formattedBadge(script.type)} +
+
+ ))} +
+ )) + )} From 0644bef572a6b2e6ff9c1218c2909e50a3cc044a Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:28:08 +0000 Subject: [PATCH 38/93] Update CHANGELOG.md (#11536) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ade9ffca3..c993a1b11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -785,6 +785,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - core: create vm-core.func from dev [@MickLesk](https://github.com/MickLesk) ([#11528](https://github.com/community-scripts/ProxmoxVE/pull/11528)) +### 🌐 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)) + ## 2026-02-03 ### 🆕 New Scripts From c599fd755145fe784a3e6d9f0a4f400ace8fe507 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:58:19 +0100 Subject: [PATCH 39/93] fix github - changelog double history --- .github/changelogs/2026/01.md | 310 +++++++++++++-------------- CHANGELOG.md | 384 +--------------------------------- 2 files changed, 151 insertions(+), 543 deletions(-) diff --git a/.github/changelogs/2026/01.md b/.github/changelogs/2026/01.md index 1a11e9e21..eb7019ae3 100644 --- a/.github/changelogs/2026/01.md +++ b/.github/changelogs/2026/01.md @@ -1,14 +1,156 @@ -## 2026-01-27 +## 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)) + +## 2026-01-29 + +### 🆕 New Scripts + + - Alpine-Valkey [@MickLesk](https://github.com/MickLesk) ([#11320](https://github.com/community-scripts/ProxmoxVE/pull/11320)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Immich: Pin version to 2.5.2 [@vhsdream](https://github.com/vhsdream) ([#11335](https://github.com/community-scripts/ProxmoxVE/pull/11335)) + - Kollection: Update to php 8.5 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11315](https://github.com/community-scripts/ProxmoxVE/pull/11315)) + - Notifiarr: change installation check from apt to systemd service [@MickLesk](https://github.com/MickLesk) ([#11319](https://github.com/community-scripts/ProxmoxVE/pull/11319)) + + - #### ✨ New Features + + - [FEAT] Immich: Enable Maintenance Mode before update [@vhsdream](https://github.com/vhsdream) ([#11342](https://github.com/community-scripts/ProxmoxVE/pull/11342)) + - jellyfin: add logrotate instead of reducing log level [@MickLesk](https://github.com/MickLesk) ([#11326](https://github.com/community-scripts/ProxmoxVE/pull/11326)) + - core: Add config file handling options | Fix Vikunja update with interactive overwrite [@MickLesk](https://github.com/MickLesk) ([#11317](https://github.com/community-scripts/ProxmoxVE/pull/11317)) + - Immich: v2.5.0 [@vhsdream](https://github.com/vhsdream) ([#11240](https://github.com/community-scripts/ProxmoxVE/pull/11240)) + + - #### 💥 Breaking Changes + + - fix: vikunja v1 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11308](https://github.com/community-scripts/ProxmoxVE/pull/11308)) + + - #### 🔧 Refactor + + - Refactor: Byparr [@vhsdream](https://github.com/vhsdream) ([#11338](https://github.com/community-scripts/ProxmoxVE/pull/11338)) + - cloudflare: Remove deprecated DNS-over-HTTPS proxy option [@MickLesk](https://github.com/MickLesk) ([#11068](https://github.com/community-scripts/ProxmoxVE/pull/11068)) + +### 💾 Core + + - #### 🐞 Bug Fixes + + - build.func: Replace storage variable with searchdomain variable [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11322](https://github.com/community-scripts/ProxmoxVE/pull/11322)) + +### 📂 Github + + - Add workflow to lock closed issues [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11316](https://github.com/community-scripts/ProxmoxVE/pull/11316)) + +## 2026-01-28 + +### 🆕 New Scripts + + - nodecast-tv ([#11287](https://github.com/community-scripts/ProxmoxVE/pull/11287)) + +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Ubuntu 25.04 VM - Change default start from yes to no [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11292](https://github.com/community-scripts/ProxmoxVE/pull/11292)) + + - #### ✨ New Features + + - various scripts: use setup_meilisearch function [@MickLesk](https://github.com/MickLesk) ([#11259](https://github.com/community-scripts/ProxmoxVE/pull/11259)) + + - #### 🔧 Refactor + + - Refactor: NPMPlus / Default Login [@MickLesk](https://github.com/MickLesk) ([#11262](https://github.com/community-scripts/ProxmoxVE/pull/11262)) + +### 💾 Core + + - #### 🐞 Bug Fixes + + - core: sed patch for ram [@lavacano](https://github.com/lavacano) ([#11285](https://github.com/community-scripts/ProxmoxVE/pull/11285)) + - Fix installer loop caused by invalid whiptail menu separator [@Mesteriis](https://github.com/Mesteriis) ([#11237](https://github.com/community-scripts/ProxmoxVE/pull/11237)) + - core: fix Debian 13 LXC template root ownership bug [@MickLesk](https://github.com/MickLesk) ([#11277](https://github.com/community-scripts/ProxmoxVE/pull/11277)) + - tools.func: prevent systemd-tmpfiles failure in unprivileged LXC during deb install [@MickLesk](https://github.com/MickLesk) ([#11271](https://github.com/community-scripts/ProxmoxVE/pull/11271)) + - tools.func: fix php "wait_for" hint [@MickLesk](https://github.com/MickLesk) ([#11254](https://github.com/community-scripts/ProxmoxVE/pull/11254)) + + - #### ✨ New Features + + - core: update dynamic values in LXC profile on update_motd_ip [@MickLesk](https://github.com/MickLesk) ([#11268](https://github.com/community-scripts/ProxmoxVE/pull/11268)) + - tools.func: add new function - setup_meilisearch [@MickLesk](https://github.com/MickLesk) ([#11258](https://github.com/community-scripts/ProxmoxVE/pull/11258)) + +### 📂 Github + + - github: add GitHub-based versions.json updater [@MickLesk](https://github.com/MickLesk) ([#10021](https://github.com/community-scripts/ProxmoxVE/pull/10021)) + +### 🌐 Website + + - #### ✨ New Features + + - Frontend: use github-versions.json for version display [@MickLesk](https://github.com/MickLesk) ([#11281](https://github.com/community-scripts/ProxmoxVE/pull/11281)) + + - #### 📝 Script Information + + - fix: homarr: conf location [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11253](https://github.com/community-scripts/ProxmoxVE/pull/11253)) + +## 2026-01-27 ### 🚀 Updated Scripts - #### 🐞 Bug Fixes - [FIX] Jotty: backup and restore custom config [@vhsdream](https://github.com/vhsdream) ([#11212](https://github.com/community-scripts/ProxmoxVE/pull/11212)) + - Immich: update libraw [@vhsdream](https://github.com/vhsdream) ([#11233](https://github.com/community-scripts/ProxmoxVE/pull/11233)) + + - #### ✨ New Features + + - grist: enable optional enterprise features toggle [@MickLesk](https://github.com/MickLesk) ([#11239](https://github.com/community-scripts/ProxmoxVE/pull/11239)) + + - #### 🔧 Refactor + + - Termix: use nginx.conf from upstream repo [@MickLesk](https://github.com/MickLesk) ([#11228](https://github.com/community-scripts/ProxmoxVE/pull/11228)) + +### 💾 Core + + - #### ✨ New Features + + - feat: add NVIDIA driver install prompt for GPU-enabled containers [@devdecrux](https://github.com/devdecrux) ([#11184](https://github.com/community-scripts/ProxmoxVE/pull/11184)) ### 📚 Documentation - doc setup_deb822_repo arg order [@chrnie](https://github.com/chrnie) ([#11215](https://github.com/community-scripts/ProxmoxVE/pull/11215)) + - changelog: archive old entries to year/month files [@MickLesk](https://github.com/MickLesk) ([#11225](https://github.com/community-scripts/ProxmoxVE/pull/11225)) ## 2026-01-26 @@ -100,7 +242,7 @@ ### 🆕 New Scripts - Tracearr ([#11079](https://github.com/community-scripts/ProxmoxVE/pull/11079)) -- Dawarich ([#11075](https://github.com/community-scripts/ProxmoxVE/pull/11075)) + - Dawarich ([#11075](https://github.com/community-scripts/ProxmoxVE/pull/11075)) ### 🚀 Updated Scripts @@ -250,7 +392,7 @@ ### 🆕 New Scripts - Termix ([#10887](https://github.com/community-scripts/ProxmoxVE/pull/10887)) -- ThingsBoard ([#10904](https://github.com/community-scripts/ProxmoxVE/pull/10904)) + - ThingsBoard ([#10904](https://github.com/community-scripts/ProxmoxVE/pull/10904)) ### 🚀 Updated Scripts @@ -319,7 +461,7 @@ ### 🆕 New Scripts - Flatnotes ([#10857](https://github.com/community-scripts/ProxmoxVE/pull/10857)) -- Unifi OS Server ([#10856](https://github.com/community-scripts/ProxmoxVE/pull/10856)) + - Unifi OS Server ([#10856](https://github.com/community-scripts/ProxmoxVE/pull/10856)) ### 🚀 Updated Scripts @@ -385,7 +527,7 @@ ### 🆕 New Scripts - Investbrain ([#10774](https://github.com/community-scripts/ProxmoxVE/pull/10774)) -- Fladder ([#10768](https://github.com/community-scripts/ProxmoxVE/pull/10768)) + - Fladder ([#10768](https://github.com/community-scripts/ProxmoxVE/pull/10768)) ### 🚀 Updated Scripts @@ -574,7 +716,7 @@ ### 📚 Documentation - [gh] New Script template update [@tremor021](https://github.com/tremor021) ([#10607](https://github.com/community-scripts/ProxmoxVE/pull/10607)) -- chore: bump copyright to 2026 - happy new year [@CrazyWolf13](https://github.com/CrazyWolf13) ([#10585](https://github.com/community-scripts/ProxmoxVE/pull/10585)) + - chore: bump copyright to 2026 - happy new year [@CrazyWolf13](https://github.com/CrazyWolf13) ([#10585](https://github.com/community-scripts/ProxmoxVE/pull/10585)) ### 📂 Github @@ -655,7 +797,7 @@ ### ❔ Uncategorized - Wireguard: Update WGDashboard notes URL to the new link [@tremor021](https://github.com/tremor021) ([#10496](https://github.com/community-scripts/ProxmoxVE/pull/10496)) -- InvoiceNinja: Update database credentias information [@tremor021](https://github.com/tremor021) ([#10497](https://github.com/community-scripts/ProxmoxVE/pull/10497)) + - InvoiceNinja: Update database credentias information [@tremor021](https://github.com/tremor021) ([#10497](https://github.com/community-scripts/ProxmoxVE/pull/10497)) ## 2026-01-02 @@ -684,157 +826,3 @@ - #### 🐞 Bug Fixes - Fix MariaDB runtime directory persistence on container reboot [@Copilot](https://github.com/Copilot) ([#10468](https://github.com/community-scripts/ProxmoxVE/pull/10468)) - - -## 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)) - -## 2026-01-29 - -### 🆕 New Scripts - - - Alpine-Valkey [@MickLesk](https://github.com/MickLesk) ([#11320](https://github.com/community-scripts/ProxmoxVE/pull/11320)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Immich: Pin version to 2.5.2 [@vhsdream](https://github.com/vhsdream) ([#11335](https://github.com/community-scripts/ProxmoxVE/pull/11335)) - - Kollection: Update to php 8.5 [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11315](https://github.com/community-scripts/ProxmoxVE/pull/11315)) - - Notifiarr: change installation check from apt to systemd service [@MickLesk](https://github.com/MickLesk) ([#11319](https://github.com/community-scripts/ProxmoxVE/pull/11319)) - - - #### ✨ New Features - - - [FEAT] Immich: Enable Maintenance Mode before update [@vhsdream](https://github.com/vhsdream) ([#11342](https://github.com/community-scripts/ProxmoxVE/pull/11342)) - - jellyfin: add logrotate instead of reducing log level [@MickLesk](https://github.com/MickLesk) ([#11326](https://github.com/community-scripts/ProxmoxVE/pull/11326)) - - core: Add config file handling options | Fix Vikunja update with interactive overwrite [@MickLesk](https://github.com/MickLesk) ([#11317](https://github.com/community-scripts/ProxmoxVE/pull/11317)) - - Immich: v2.5.0 [@vhsdream](https://github.com/vhsdream) ([#11240](https://github.com/community-scripts/ProxmoxVE/pull/11240)) - - - #### 💥 Breaking Changes - - - fix: vikunja v1 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11308](https://github.com/community-scripts/ProxmoxVE/pull/11308)) - - - #### 🔧 Refactor - - - Refactor: Byparr [@vhsdream](https://github.com/vhsdream) ([#11338](https://github.com/community-scripts/ProxmoxVE/pull/11338)) - - cloudflare: Remove deprecated DNS-over-HTTPS proxy option [@MickLesk](https://github.com/MickLesk) ([#11068](https://github.com/community-scripts/ProxmoxVE/pull/11068)) - -### 💾 Core - - - #### 🐞 Bug Fixes - - - build.func: Replace storage variable with searchdomain variable [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11322](https://github.com/community-scripts/ProxmoxVE/pull/11322)) - -### 📂 Github - - - Add workflow to lock closed issues [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11316](https://github.com/community-scripts/ProxmoxVE/pull/11316)) - -## 2026-01-28 - -### 🆕 New Scripts - - - nodecast-tv ([#11287](https://github.com/community-scripts/ProxmoxVE/pull/11287)) - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Ubuntu 25.04 VM - Change default start from yes to no [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#11292](https://github.com/community-scripts/ProxmoxVE/pull/11292)) - - - #### ✨ New Features - - - various scripts: use setup_meilisearch function [@MickLesk](https://github.com/MickLesk) ([#11259](https://github.com/community-scripts/ProxmoxVE/pull/11259)) - - - #### 🔧 Refactor - - - Refactor: NPMPlus / Default Login [@MickLesk](https://github.com/MickLesk) ([#11262](https://github.com/community-scripts/ProxmoxVE/pull/11262)) - -### 💾 Core - - - #### 🐞 Bug Fixes - - - core: sed patch for ram [@lavacano](https://github.com/lavacano) ([#11285](https://github.com/community-scripts/ProxmoxVE/pull/11285)) - - Fix installer loop caused by invalid whiptail menu separator [@Mesteriis](https://github.com/Mesteriis) ([#11237](https://github.com/community-scripts/ProxmoxVE/pull/11237)) - - core: fix Debian 13 LXC template root ownership bug [@MickLesk](https://github.com/MickLesk) ([#11277](https://github.com/community-scripts/ProxmoxVE/pull/11277)) - - tools.func: prevent systemd-tmpfiles failure in unprivileged LXC during deb install [@MickLesk](https://github.com/MickLesk) ([#11271](https://github.com/community-scripts/ProxmoxVE/pull/11271)) - - tools.func: fix php "wait_for" hint [@MickLesk](https://github.com/MickLesk) ([#11254](https://github.com/community-scripts/ProxmoxVE/pull/11254)) - - - #### ✨ New Features - - - core: update dynamic values in LXC profile on update_motd_ip [@MickLesk](https://github.com/MickLesk) ([#11268](https://github.com/community-scripts/ProxmoxVE/pull/11268)) - - tools.func: add new function - setup_meilisearch [@MickLesk](https://github.com/MickLesk) ([#11258](https://github.com/community-scripts/ProxmoxVE/pull/11258)) - -### 📂 Github - - - github: add GitHub-based versions.json updater [@MickLesk](https://github.com/MickLesk) ([#10021](https://github.com/community-scripts/ProxmoxVE/pull/10021)) - -### 🌐 Website - - - #### ✨ New Features - - - Frontend: use github-versions.json for version display [@MickLesk](https://github.com/MickLesk) ([#11281](https://github.com/community-scripts/ProxmoxVE/pull/11281)) - - - #### 📝 Script Information - - - fix: homarr: conf location [@CrazyWolf13](https://github.com/CrazyWolf13) ([#11253](https://github.com/community-scripts/ProxmoxVE/pull/11253)) - -## 2026-01-27 - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Immich: update libraw [@vhsdream](https://github.com/vhsdream) ([#11233](https://github.com/community-scripts/ProxmoxVE/pull/11233)) - - - #### ✨ New Features - - - grist: enable optional enterprise features toggle [@MickLesk](https://github.com/MickLesk) ([#11239](https://github.com/community-scripts/ProxmoxVE/pull/11239)) - - - #### 🔧 Refactor - - - Termix: use nginx.conf from upstream repo [@MickLesk](https://github.com/MickLesk) ([#11228](https://github.com/community-scripts/ProxmoxVE/pull/11228)) - -### 💾 Core - - - #### ✨ New Features - - - feat: add NVIDIA driver install prompt for GPU-enabled containers [@devdecrux](https://github.com/devdecrux) ([#11184](https://github.com/community-scripts/ProxmoxVE/pull/11184)) - -### 📚 Documentation - - - doc setup_deb822_repo arg order [@chrnie](https://github.com/chrnie) ([#11215](https://github.com/community-scripts/ProxmoxVE/pull/11215)) -- changelog: archive old entries to year/month files [@MickLesk](https://github.com/MickLesk) ([#11225](https://github.com/community-scripts/ProxmoxVE/pull/11225)) \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c993a1b11..cec172ac4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
-

January - 27 entries

+

January - 31 entries

[View January 2026 Changelog](.github/changelogs/2026/01.md) @@ -392,386 +392,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- -
-

📜 History

- - -
-

2026

- - -
-

January (31 entries)

- -[View January 2026 Changelog](.github/changelogs/2026/01.md) - -
- -
- -
-

2025

- - -
-

December (31 entries)

- -[View December 2025 Changelog](.github/changelogs/2025/12.md) - -
- -
-

November (29 entries)

- -[View November 2025 Changelog](.github/changelogs/2025/11.md) - -
- -
-

October (30 entries)

- -[View October 2025 Changelog](.github/changelogs/2025/10.md) - -
- -
-

September (29 entries)

- -[View September 2025 Changelog](.github/changelogs/2025/09.md) - -
- -
-

August (30 entries)

- -[View August 2025 Changelog](.github/changelogs/2025/08.md) - -
- -
-

July (29 entries)

- -[View July 2025 Changelog](.github/changelogs/2025/07.md) - -
- -
-

June (29 entries)

- -[View June 2025 Changelog](.github/changelogs/2025/06.md) - -
- -
-

May (30 entries)

- -[View May 2025 Changelog](.github/changelogs/2025/05.md) - -
- -
-

April (25 entries)

- -[View April 2025 Changelog](.github/changelogs/2025/04.md) - -
- -
-

March (30 entries)

- -[View March 2025 Changelog](.github/changelogs/2025/03.md) - -
- -
-

February (26 entries)

- -[View February 2025 Changelog](.github/changelogs/2025/02.md) - -
- -
-

January (27 entries)

- -[View January 2025 Changelog](.github/changelogs/2025/01.md) - -
- -
- -
-

2024

- - -
-

December (22 entries)

- -[View December 2024 Changelog](.github/changelogs/2024/12.md) - -
- -
-

November (15 entries)

- -[View November 2024 Changelog](.github/changelogs/2024/11.md) - -
- -
-

October (9 entries)

- -[View October 2024 Changelog](.github/changelogs/2024/10.md) - -
- -
-

September (1 entries)

- -[View September 2024 Changelog](.github/changelogs/2024/09.md) - -
- -
-

August (2 entries)

- -[View August 2024 Changelog](.github/changelogs/2024/08.md) - -
- -
-

July (0 entries)

- -[View July 2024 Changelog](.github/changelogs/2024/07.md) - -
- -
-

June (8 entries)

- -[View June 2024 Changelog](.github/changelogs/2024/06.md) - -
- -
-

May (16 entries)

- -[View May 2024 Changelog](.github/changelogs/2024/05.md) - -
- -
-

April (14 entries)

- -[View April 2024 Changelog](.github/changelogs/2024/04.md) - -
- -
-

March (5 entries)

- -[View March 2024 Changelog](.github/changelogs/2024/03.md) - -
- -
-

February (9 entries)

- -[View February 2024 Changelog](.github/changelogs/2024/02.md) - -
- -
-

January (9 entries)

- -[View January 2024 Changelog](.github/changelogs/2024/01.md) - -
- -
- -
-

2023

- - -
-

December (3 entries)

- -[View December 2023 Changelog](.github/changelogs/2023/12.md) - -
- -
-

November (3 entries)

- -[View November 2023 Changelog](.github/changelogs/2023/11.md) - -
- -
-

October (7 entries)

- -[View October 2023 Changelog](.github/changelogs/2023/10.md) - -
- -
-

September (10 entries)

- -[View September 2023 Changelog](.github/changelogs/2023/09.md) - -
- -
-

August (7 entries)

- -[View August 2023 Changelog](.github/changelogs/2023/08.md) - -
- -
-

July (5 entries)

- -[View July 2023 Changelog](.github/changelogs/2023/07.md) - -
- -
-

June (5 entries)

- -[View June 2023 Changelog](.github/changelogs/2023/06.md) - -
- -
-

May (8 entries)

- -[View May 2023 Changelog](.github/changelogs/2023/05.md) - -
- -
-

April (8 entries)

- -[View April 2023 Changelog](.github/changelogs/2023/04.md) - -
- -
-

March (8 entries)

- -[View March 2023 Changelog](.github/changelogs/2023/03.md) - -
- -
-

February (6 entries)

- -[View February 2023 Changelog](.github/changelogs/2023/02.md) - -
- -
-

January (15 entries)

- -[View January 2023 Changelog](.github/changelogs/2023/01.md) - -
- -
- -
-

2022

- - -
-

December (7 entries)

- -[View December 2022 Changelog](.github/changelogs/2022/12.md) - -
- -
-

November (7 entries)

- -[View November 2022 Changelog](.github/changelogs/2022/11.md) - -
- -
-

October (2 entries)

- -[View October 2022 Changelog](.github/changelogs/2022/10.md) - -
- -
-

September (9 entries)

- -[View September 2022 Changelog](.github/changelogs/2022/09.md) - -
- -
-

August (7 entries)

- -[View August 2022 Changelog](.github/changelogs/2022/08.md) - -
- -
-

July (10 entries)

- -[View July 2022 Changelog](.github/changelogs/2022/07.md) - -
- -
-

June (1 entries)

- -[View June 2022 Changelog](.github/changelogs/2022/06.md) - -
- -
-

May (8 entries)

- -[View May 2022 Changelog](.github/changelogs/2022/05.md) - -
- -
-

April (13 entries)

- -[View April 2022 Changelog](.github/changelogs/2022/04.md) - -
- -
-

March (20 entries)

- -[View March 2022 Changelog](.github/changelogs/2022/03.md) - -
- -
-

February (15 entries)

- -[View February 2022 Changelog](.github/changelogs/2022/02.md) - -
- -
-

January (3 entries)

- -[View January 2022 Changelog](.github/changelogs/2022/01.md) - -
- -
- -
- ## 2026-02-04 ### 🆕 New Scripts @@ -1704,4 +1324,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### ❔ Uncategorized - - Extend guidance for changing the immich upload location for #10447 [@jshprentz](https://github.com/jshprentz) ([#10475](https://github.com/community-scripts/ProxmoxVE/pull/10475)) \ No newline at end of file + - Extend guidance for changing the immich upload location for #10447 [@jshprentz](https://github.com/jshprentz) ([#10475](https://github.com/community-scripts/ProxmoxVE/pull/10475)) From 5210d1bb7157091e5da66f7e0fa5f19a1110a82d Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:59:57 +0100 Subject: [PATCH 40/93] fix sorting in changelog-archive.yml --- .github/workflows/changelog-archive.yml | 65 +++++++++++++++++-------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/.github/workflows/changelog-archive.yml b/.github/workflows/changelog-archive.yml index ba5b64b60..9536904bd 100644 --- a/.github/workflows/changelog-archive.yml +++ b/.github/workflows/changelog-archive.yml @@ -54,8 +54,9 @@ jobs: console.log(`Cutoff date: ${cutoffDate.toISOString().split('T')[0]}`); - // Read changelog - const content = await fs.readFile(CHANGELOG_PATH, 'utf-8'); + // Read changelog and normalize line endings + let content = await fs.readFile(CHANGELOG_PATH, 'utf-8'); + content = content.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); const lines = content.split('\n'); // Parse entries @@ -148,30 +149,55 @@ jobs: let existingContent = ''; try { existingContent = await fs.readFile(monthPath, 'utf-8'); + // Normalize line endings to prevent regex issues + existingContent = existingContent.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); } catch (e) { // File doesn't exist } - // Merge new entries with existing (avoid duplicates) - const existingDates = new Set(); - const existingDatePattern = /^## (\d{4}-\d{2}-\d{2})$/gm; - let match; - while ((match = existingDatePattern.exec(existingContent)) !== null) { - existingDates.add(match[1]); + // Parse existing entries into a Map (date -> content) for deduplication + const allEntries = new Map(); + + // Helper function to parse entries from content + const parseEntries = (content) => { + const entries = new Map(); + const parts = content.split(/(?=^## \d{4}-\d{2}-\d{2}$)/m); + for (const part of parts) { + const trimmed = part.trim(); + if (!trimmed) continue; + const dateMatch = trimmed.match(/^## (\d{4}-\d{2}-\d{2})/); + if (dateMatch) { + entries.set(dateMatch[1], trimmed); + } + } + return entries; + }; + + // Parse existing content + if (existingContent) { + const existingEntries = parseEntries(existingContent); + for (const [date, content] of existingEntries) { + allEntries.set(date, content); + } } - const newEntries = archiveData[year][month].filter(entry => { + // Add new entries (existing entries take precedence to avoid overwriting) + let addedCount = 0; + for (const entry of archiveData[year][month]) { const dateMatch = entry.match(/^## (\d{4}-\d{2}-\d{2})/); - return dateMatch && !existingDates.has(dateMatch[1]); - }); + if (dateMatch && !allEntries.has(dateMatch[1])) { + allEntries.set(dateMatch[1], entry.trim()); + addedCount++; + } + } - if (newEntries.length > 0) { - const allContent = existingContent - ? existingContent + '\n\n' + newEntries.join('\n\n') - : newEntries.join('\n\n'); - - await fs.writeFile(monthPath, allContent, 'utf-8'); - console.log(`Updated: ${monthPath} (+${newEntries.length} entries)`); + // Sort entries by date (newest first) and write + const sortedDates = [...allEntries.keys()].sort().reverse(); + const sortedContent = sortedDates.map(date => allEntries.get(date)).join('\n\n'); + + if (addedCount > 0 || !existingContent) { + await fs.writeFile(monthPath, sortedContent + '\n', 'utf-8'); + console.log(`Updated: ${monthPath} (${allEntries.size} total entries, +${addedCount} new)`); } } } @@ -218,7 +244,8 @@ jobs: // Count entries in month file let entryCount = 0; try { - const monthContent = await fs.readFile(monthPath, 'utf-8'); + let monthContent = await fs.readFile(monthPath, 'utf-8'); + monthContent = monthContent.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); entryCount = (monthContent.match(/^## \d{4}-\d{2}-\d{2}$/gm) || []).length; } catch (e) { entryCount = (archiveData[year]?.[month] || []).length; From 17ac4f5ae752c4a17c1f5db6c47d1f44dafd5607 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:00:42 +0000 Subject: [PATCH 41/93] Archive old changelog entries (#11537) Co-authored-by: github-actions[bot] --- .github/changelogs/2026/02.md | 121 +++++++++ CHANGELOG.md | 451 +++++++++++++++++++++++++++++----- 2 files changed, 510 insertions(+), 62 deletions(-) create mode 100644 .github/changelogs/2026/02.md diff --git a/.github/changelogs/2026/02.md b/.github/changelogs/2026/02.md new file mode 100644 index 000000000..d17ef3120 --- /dev/null +++ b/.github/changelogs/2026/02.md @@ -0,0 +1,121 @@ +## 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)) + +### 💾 Core + + - #### ✨ New Features + + - core: create vm-core.func from dev [@MickLesk](https://github.com/MickLesk) ([#11528](https://github.com/community-scripts/ProxmoxVE/pull/11528)) + +### 🌐 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)) + +## 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)) diff --git a/CHANGELOG.md b/CHANGELOG.md index cec172ac4..995993ce3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -392,6 +392,394 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit + + +
+

📜 History

+ + +
+

2026

+ + +
+

February (4 entries)

+ +[View February 2026 Changelog](.github/changelogs/2026/02.md) + +
+ +
+

January (31 entries)

+ +[View January 2026 Changelog](.github/changelogs/2026/01.md) + +
+ +
+ +
+

2025

+ + +
+

December (31 entries)

+ +[View December 2025 Changelog](.github/changelogs/2025/12.md) + +
+ +
+

November (29 entries)

+ +[View November 2025 Changelog](.github/changelogs/2025/11.md) + +
+ +
+

October (30 entries)

+ +[View October 2025 Changelog](.github/changelogs/2025/10.md) + +
+ +
+

September (29 entries)

+ +[View September 2025 Changelog](.github/changelogs/2025/09.md) + +
+ +
+

August (30 entries)

+ +[View August 2025 Changelog](.github/changelogs/2025/08.md) + +
+ +
+

July (29 entries)

+ +[View July 2025 Changelog](.github/changelogs/2025/07.md) + +
+ +
+

June (29 entries)

+ +[View June 2025 Changelog](.github/changelogs/2025/06.md) + +
+ +
+

May (30 entries)

+ +[View May 2025 Changelog](.github/changelogs/2025/05.md) + +
+ +
+

April (25 entries)

+ +[View April 2025 Changelog](.github/changelogs/2025/04.md) + +
+ +
+

March (30 entries)

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

February (26 entries)

+ +[View February 2025 Changelog](.github/changelogs/2025/02.md) + +
+ +
+

January (27 entries)

+ +[View January 2025 Changelog](.github/changelogs/2025/01.md) + +
+ +
+ +
+

2024

+ + +
+

December (22 entries)

+ +[View December 2024 Changelog](.github/changelogs/2024/12.md) + +
+ +
+

November (15 entries)

+ +[View November 2024 Changelog](.github/changelogs/2024/11.md) + +
+ +
+

October (9 entries)

+ +[View October 2024 Changelog](.github/changelogs/2024/10.md) + +
+ +
+

September (1 entries)

+ +[View September 2024 Changelog](.github/changelogs/2024/09.md) + +
+ +
+

August (2 entries)

+ +[View August 2024 Changelog](.github/changelogs/2024/08.md) + +
+ +
+

July (0 entries)

+ +[View July 2024 Changelog](.github/changelogs/2024/07.md) + +
+ +
+

June (8 entries)

+ +[View June 2024 Changelog](.github/changelogs/2024/06.md) + +
+ +
+

May (16 entries)

+ +[View May 2024 Changelog](.github/changelogs/2024/05.md) + +
+ +
+

April (14 entries)

+ +[View April 2024 Changelog](.github/changelogs/2024/04.md) + +
+ +
+

March (5 entries)

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

February (9 entries)

+ +[View February 2024 Changelog](.github/changelogs/2024/02.md) + +
+ +
+

January (9 entries)

+ +[View January 2024 Changelog](.github/changelogs/2024/01.md) + +
+ +
+ +
+

2023

+ + +
+

December (3 entries)

+ +[View December 2023 Changelog](.github/changelogs/2023/12.md) + +
+ +
+

November (3 entries)

+ +[View November 2023 Changelog](.github/changelogs/2023/11.md) + +
+ +
+

October (7 entries)

+ +[View October 2023 Changelog](.github/changelogs/2023/10.md) + +
+ +
+

September (10 entries)

+ +[View September 2023 Changelog](.github/changelogs/2023/09.md) + +
+ +
+

August (7 entries)

+ +[View August 2023 Changelog](.github/changelogs/2023/08.md) + +
+ +
+

July (5 entries)

+ +[View July 2023 Changelog](.github/changelogs/2023/07.md) + +
+ +
+

June (5 entries)

+ +[View June 2023 Changelog](.github/changelogs/2023/06.md) + +
+ +
+

May (8 entries)

+ +[View May 2023 Changelog](.github/changelogs/2023/05.md) + +
+ +
+

April (8 entries)

+ +[View April 2023 Changelog](.github/changelogs/2023/04.md) + +
+ +
+

March (8 entries)

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

February (6 entries)

+ +[View February 2023 Changelog](.github/changelogs/2023/02.md) + +
+ +
+

January (15 entries)

+ +[View January 2023 Changelog](.github/changelogs/2023/01.md) + +
+ +
+ +
+

2022

+ + +
+

December (7 entries)

+ +[View December 2022 Changelog](.github/changelogs/2022/12.md) + +
+ +
+

November (7 entries)

+ +[View November 2022 Changelog](.github/changelogs/2022/11.md) + +
+ +
+

October (2 entries)

+ +[View October 2022 Changelog](.github/changelogs/2022/10.md) + +
+ +
+

September (9 entries)

+ +[View September 2022 Changelog](.github/changelogs/2022/09.md) + +
+ +
+

August (7 entries)

+ +[View August 2022 Changelog](.github/changelogs/2022/08.md) + +
+ +
+

July (10 entries)

+ +[View July 2022 Changelog](.github/changelogs/2022/07.md) + +
+ +
+

June (1 entries)

+ +[View June 2022 Changelog](.github/changelogs/2022/06.md) + +
+ +
+

May (8 entries)

+ +[View May 2022 Changelog](.github/changelogs/2022/05.md) + +
+ +
+

April (13 entries)

+ +[View April 2022 Changelog](.github/changelogs/2022/04.md) + +
+ +
+

March (20 entries)

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

February (15 entries)

+ +[View February 2022 Changelog](.github/changelogs/2022/02.md) + +
+ +
+

January (3 entries)

+ +[View January 2022 Changelog](.github/changelogs/2022/01.md) + +
+ +
+ +
+ ## 2026-02-04 ### 🆕 New Scripts @@ -1263,65 +1651,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🔧 Refactor - - Refactor: IP-Tag (Multiple IP / Performance / Execution Time) [@MickLesk](https://github.com/MickLesk) ([#10558](https://github.com/community-scripts/ProxmoxVE/pull/10558)) - -## 2026-01-04 - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - PocketID: Update PocketID for 2.x [@tremor021](https://github.com/tremor021) ([#10506](https://github.com/community-scripts/ProxmoxVE/pull/10506)) - - fix: reitti: nginx [@CrazyWolf13](https://github.com/CrazyWolf13) ([#10511](https://github.com/community-scripts/ProxmoxVE/pull/10511)) - - MagicMirror: bump to nodejs 24 [@MickLesk](https://github.com/MickLesk) ([#10534](https://github.com/community-scripts/ProxmoxVE/pull/10534)) - - - #### 🔧 Refactor - - - Refactor: SFTPGo [@tremor021](https://github.com/tremor021) ([#10518](https://github.com/community-scripts/ProxmoxVE/pull/10518)) - - Refactor: Pelican Wings [@tremor021](https://github.com/tremor021) ([#10517](https://github.com/community-scripts/ProxmoxVE/pull/10517)) - - Refactor: Pelican Panel [@tremor021](https://github.com/tremor021) ([#10516](https://github.com/community-scripts/ProxmoxVE/pull/10516)) - - Refactor: Audiobookshelf [@tremor021](https://github.com/tremor021) ([#10519](https://github.com/community-scripts/ProxmoxVE/pull/10519)) - -### 💾 Core - - - #### 🐞 Bug Fixes - - - Export IPV6_METHOD to trigger verb_ip6() function [@remz1337](https://github.com/remz1337) ([#10538](https://github.com/community-scripts/ProxmoxVE/pull/10538)) - -### 🌐 Website - - - #### 📝 Script Information - - - Prowlarr: Update config_path [@tremor021](https://github.com/tremor021) ([#10504](https://github.com/community-scripts/ProxmoxVE/pull/10504)) - -## 2026-01-03 - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Fix ownership and permissions for InvoiceNinja setup [@twinzdragonz](https://github.com/twinzdragonz) ([#10298](https://github.com/community-scripts/ProxmoxVE/pull/10298)) - - Fix headscale Caddyfile to pass non-API URLs [@IlyaSemenov](https://github.com/IlyaSemenov) ([#10493](https://github.com/community-scripts/ProxmoxVE/pull/10493)) - -### 💾 Core - - - #### 🔧 Refactor - - - [core]: Preserve log files [@tremor021](https://github.com/tremor021) ([#10509](https://github.com/community-scripts/ProxmoxVE/pull/10509)) - -### ❔ Uncategorized - - - Wireguard: Update WGDashboard notes URL to the new link [@tremor021](https://github.com/tremor021) ([#10496](https://github.com/community-scripts/ProxmoxVE/pull/10496)) -- InvoiceNinja: Update database credentias information [@tremor021](https://github.com/tremor021) ([#10497](https://github.com/community-scripts/ProxmoxVE/pull/10497)) - -## 2026-01-02 - -### 🚀 Updated Scripts - - - #### 🐞 Bug Fixes - - - Fix Intel Level Zero package conflict on Debian 13 [@Copilot](https://github.com/Copilot) ([#10467](https://github.com/community-scripts/ProxmoxVE/pull/10467)) - -### ❔ Uncategorized - - - Extend guidance for changing the immich upload location for #10447 [@jshprentz](https://github.com/jshprentz) ([#10475](https://github.com/community-scripts/ProxmoxVE/pull/10475)) + - Refactor: IP-Tag (Multiple IP / Performance / Execution Time) [@MickLesk](https://github.com/MickLesk) ([#10558](https://github.com/community-scripts/ProxmoxVE/pull/10558)) \ No newline at end of file From 338c054112feab55410781ffe8b51b6d47163940 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:04:34 +0100 Subject: [PATCH 42/93] action: prevent duplicate History section in changelog-archive workflow --- .github/workflows/changelog-archive.yml | 32 +- CHANGELOG.md | 400 +----------------------- 2 files changed, 40 insertions(+), 392 deletions(-) diff --git a/.github/workflows/changelog-archive.yml b/.github/workflows/changelog-archive.yml index 9536904bd..0a021ca2e 100644 --- a/.github/workflows/changelog-archive.yml +++ b/.github/workflows/changelog-archive.yml @@ -67,9 +67,39 @@ jobs: let currentDate = null; let currentContent = []; let inHeader = true; + let inOldHistory = false; + let historyDetailsDepth = 0; - for (const line of lines) { + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; const match = line.match(datePattern); + + // Detect the start of History section:
followed by line with 📜 History + if (inHeader && !inOldHistory && line.trim() === '
') { + // Look ahead to see if this is the History section + const nextLine = lines[i + 1] || ''; + if (nextLine.includes('📜 History')) { + inOldHistory = true; + historyDetailsDepth = 1; + continue; + } + } + + // Track nested details tags to find the end of History section + if (inOldHistory) { + if (line.trim() === '
') { + historyDetailsDepth++; + } + if (line.trim() === '
') { + historyDetailsDepth--; + if (historyDetailsDepth === 0) { + // We've closed the main History details tag + inOldHistory = false; + } + } + continue; + } + if (match) { inHeader = false; diff --git a/CHANGELOG.md b/CHANGELOG.md index 995993ce3..134674a26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,14 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
-

January - 31 entries

+

February (4 entries)

+ +[View February 2026 Changelog](.github/changelogs/2026/02.md) + +
+ +
+

January (31 entries)

[View January 2026 Changelog](.github/changelogs/2026/01.md) @@ -391,395 +398,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
- - - -
-

📜 History

- - -
-

2026

- - -
-

February (4 entries)

- -[View February 2026 Changelog](.github/changelogs/2026/02.md) - -
- -
-

January (31 entries)

- -[View January 2026 Changelog](.github/changelogs/2026/01.md) - -
- -
- -
-

2025

- - -
-

December (31 entries)

- -[View December 2025 Changelog](.github/changelogs/2025/12.md) - -
- -
-

November (29 entries)

- -[View November 2025 Changelog](.github/changelogs/2025/11.md) - -
- -
-

October (30 entries)

- -[View October 2025 Changelog](.github/changelogs/2025/10.md) - -
- -
-

September (29 entries)

- -[View September 2025 Changelog](.github/changelogs/2025/09.md) - -
- -
-

August (30 entries)

- -[View August 2025 Changelog](.github/changelogs/2025/08.md) - -
- -
-

July (29 entries)

- -[View July 2025 Changelog](.github/changelogs/2025/07.md) - -
- -
-

June (29 entries)

- -[View June 2025 Changelog](.github/changelogs/2025/06.md) - -
- -
-

May (30 entries)

- -[View May 2025 Changelog](.github/changelogs/2025/05.md) - -
- -
-

April (25 entries)

- -[View April 2025 Changelog](.github/changelogs/2025/04.md) - -
- -
-

March (30 entries)

- -[View March 2025 Changelog](.github/changelogs/2025/03.md) - -
- -
-

February (26 entries)

- -[View February 2025 Changelog](.github/changelogs/2025/02.md) - -
- -
-

January (27 entries)

- -[View January 2025 Changelog](.github/changelogs/2025/01.md) - -
- -
- -
-

2024

- - -
-

December (22 entries)

- -[View December 2024 Changelog](.github/changelogs/2024/12.md) - -
- -
-

November (15 entries)

- -[View November 2024 Changelog](.github/changelogs/2024/11.md) - -
- -
-

October (9 entries)

- -[View October 2024 Changelog](.github/changelogs/2024/10.md) - -
- -
-

September (1 entries)

- -[View September 2024 Changelog](.github/changelogs/2024/09.md) - -
- -
-

August (2 entries)

- -[View August 2024 Changelog](.github/changelogs/2024/08.md) - -
- -
-

July (0 entries)

- -[View July 2024 Changelog](.github/changelogs/2024/07.md) - -
- -
-

June (8 entries)

- -[View June 2024 Changelog](.github/changelogs/2024/06.md) - -
- -
-

May (16 entries)

- -[View May 2024 Changelog](.github/changelogs/2024/05.md) - -
- -
-

April (14 entries)

- -[View April 2024 Changelog](.github/changelogs/2024/04.md) - -
- -
-

March (5 entries)

- -[View March 2024 Changelog](.github/changelogs/2024/03.md) - -
- -
-

February (9 entries)

- -[View February 2024 Changelog](.github/changelogs/2024/02.md) - -
- -
-

January (9 entries)

- -[View January 2024 Changelog](.github/changelogs/2024/01.md) - -
- -
- -
-

2023

- - -
-

December (3 entries)

- -[View December 2023 Changelog](.github/changelogs/2023/12.md) - -
- -
-

November (3 entries)

- -[View November 2023 Changelog](.github/changelogs/2023/11.md) - -
- -
-

October (7 entries)

- -[View October 2023 Changelog](.github/changelogs/2023/10.md) - -
- -
-

September (10 entries)

- -[View September 2023 Changelog](.github/changelogs/2023/09.md) - -
- -
-

August (7 entries)

- -[View August 2023 Changelog](.github/changelogs/2023/08.md) - -
- -
-

July (5 entries)

- -[View July 2023 Changelog](.github/changelogs/2023/07.md) - -
- -
-

June (5 entries)

- -[View June 2023 Changelog](.github/changelogs/2023/06.md) - -
- -
-

May (8 entries)

- -[View May 2023 Changelog](.github/changelogs/2023/05.md) - -
- -
-

April (8 entries)

- -[View April 2023 Changelog](.github/changelogs/2023/04.md) - -
- -
-

March (8 entries)

- -[View March 2023 Changelog](.github/changelogs/2023/03.md) - -
- -
-

February (6 entries)

- -[View February 2023 Changelog](.github/changelogs/2023/02.md) - -
- -
-

January (15 entries)

- -[View January 2023 Changelog](.github/changelogs/2023/01.md) - -
- -
- -
-

2022

- - -
-

December (7 entries)

- -[View December 2022 Changelog](.github/changelogs/2022/12.md) - -
- -
-

November (7 entries)

- -[View November 2022 Changelog](.github/changelogs/2022/11.md) - -
- -
-

October (2 entries)

- -[View October 2022 Changelog](.github/changelogs/2022/10.md) - -
- -
-

September (9 entries)

- -[View September 2022 Changelog](.github/changelogs/2022/09.md) - -
- -
-

August (7 entries)

- -[View August 2022 Changelog](.github/changelogs/2022/08.md) - -
- -
-

July (10 entries)

- -[View July 2022 Changelog](.github/changelogs/2022/07.md) - -
- -
-

June (1 entries)

- -[View June 2022 Changelog](.github/changelogs/2022/06.md) - -
- -
-

May (8 entries)

- -[View May 2022 Changelog](.github/changelogs/2022/05.md) - -
- -
-

April (13 entries)

- -[View April 2022 Changelog](.github/changelogs/2022/04.md) - -
- -
-

March (20 entries)

- -[View March 2022 Changelog](.github/changelogs/2022/03.md) - -
- -
-

February (15 entries)

- -[View February 2022 Changelog](.github/changelogs/2022/02.md) - -
- -
-

January (3 entries)

- -[View January 2022 Changelog](.github/changelogs/2022/01.md) - -
- -
- -
- ## 2026-02-04 ### 🆕 New Scripts @@ -1651,4 +1269,4 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🔧 Refactor - - Refactor: IP-Tag (Multiple IP / Performance / Execution Time) [@MickLesk](https://github.com/MickLesk) ([#10558](https://github.com/community-scripts/ProxmoxVE/pull/10558)) \ No newline at end of file + - Refactor: IP-Tag (Multiple IP / Performance / Execution Time) [@MickLesk](https://github.com/MickLesk) ([#10558](https://github.com/community-scripts/ProxmoxVE/pull/10558)) From 36bf5cb57e5829b6398317b8a4551c55ae3cae48 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 4 Feb 2026 08:48:18 -0500 Subject: [PATCH 43/93] Immich: pin version to 2.5.3 (#11515) * Immich: pin version to 2.5.3 [FIX] Immich: only show OpenVINO menu if `/dev/dri` detected * Grab pnpm version from release package.json --- ct/immich.sh | 9 ++--- install/immich-install.sh | 77 ++++++++++++++++++++------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/ct/immich.sh b/ct/immich.sh index f79cca3b8..5e9937cb4 100644 --- a/ct/immich.sh +++ b/ct/immich.sh @@ -36,10 +36,6 @@ function update_script() { exit fi - setup_uv - PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')" - NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs - if [[ ! -f /etc/apt/preferences.d/preferences ]]; then msg_info "Adding Debian Testing repo" sed -i 's/ trixie-updates/ trixie-updates testing/g' /etc/apt/sources.list.d/debian.sources @@ -109,7 +105,7 @@ EOF msg_ok "Image-processing libraries up to date" fi - RELEASE="2.5.2" + RELEASE="2.5.3" if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then if [[ $(cat ~/.immich) > "2.5.1" ]]; then msg_info "Enabling Maintenance Mode" @@ -164,7 +160,10 @@ EOF rm -rf "${APP_DIR:?}"/* ) + setup_uv CLEAN_INSTALL=1 fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v${RELEASE}" "$SRC_DIR" + PNPM_VERSION="$(jq -r '.packageManager | split("@")[1]' ${SRC_DIR}/package.json)" + NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs msg_info "Updating Immich web and microservices" cd "$SRC_DIR"/server diff --git a/install/immich-install.sh b/install/immich-install.sh index b86058c12..16fb9aad3 100644 --- a/install/immich-install.sh +++ b/install/immich-install.sh @@ -13,44 +13,44 @@ setting_up_container network_check update_os -echo "" -echo "" -echo -e "🤖 ${BL}Immich Machine Learning Options${CL}" -echo "─────────────────────────────────────────" -echo "Please choose your machine-learning type:" -echo "" -echo " 1) CPU only (default)" -echo " 2) Intel OpenVINO (requires GPU passthrough)" -echo "" +if [ -d /dev/dri ]; then + echo "" + echo "" + echo -e "🤖 ${BL}Immich Machine Learning Options${CL}" + echo "─────────────────────────────────────────" + echo "Please choose your machine-learning type:" + echo "" + echo " 1) CPU only (default)" + echo " 2) Intel OpenVINO (requires GPU passthrough)" + echo "" -read -r -p "${TAB3}Select machine-learning type [1]: " ML_TYPE -ML_TYPE="${ML_TYPE:-1}" -if [[ "$ML_TYPE" == "2" ]]; then - msg_info "Installing OpenVINO dependencies" - touch ~/.openvino - $STD apt install -y --no-install-recommends patchelf - tmp_dir=$(mktemp -d) - $STD pushd "$tmp_dir" - curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile - readarray -t INTEL_URLS < <( - sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}' - sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}' - ) - for url in "${INTEL_URLS[@]}"; do - curl -fsSLO "$url" - done - $STD apt install -y ./libigdgmm12*.deb - rm ./libigdgmm12*.deb - $STD apt install -y ./*.deb - $STD apt-mark hold libigdgmm12 - $STD popd - rm -rf "$tmp_dir" - dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version - msg_ok "Installed OpenVINO dependencies" + read -r -p "${TAB3}Select machine-learning type [1]: " ML_TYPE + ML_TYPE="${ML_TYPE:-1}" + if [[ "$ML_TYPE" == "2" ]]; then + msg_info "Installing OpenVINO dependencies" + touch ~/.openvino + $STD apt install -y --no-install-recommends patchelf + tmp_dir=$(mktemp -d) + $STD pushd "$tmp_dir" + curl -fsSLO https://raw.githubusercontent.com/immich-app/base-images/refs/heads/main/server/Dockerfile + readarray -t INTEL_URLS < <( + sed -n "/intel-[igc|opencl]/p" ./Dockerfile | awk '{print $2}' + sed -n "/libigdgmm12/p" ./Dockerfile | awk '{print $3}' + ) + for url in "${INTEL_URLS[@]}"; do + curl -fsSLO "$url" + done + $STD apt install -y ./libigdgmm12*.deb + rm ./libigdgmm12*.deb + $STD apt install -y ./*.deb + $STD apt-mark hold libigdgmm12 + $STD popd + rm -rf "$tmp_dir" + dpkg-query -W -f='${Version}\n' intel-opencl-icd >~/.intel_version + msg_ok "Installed OpenVINO dependencies" + fi fi -setup_uv - msg_info "Installing dependencies" $STD apt install --no-install-recommends -y \ git \ @@ -144,8 +144,7 @@ msg_info "Installing packages from Debian Testing repo" $STD apt install -t testing --no-install-recommends -yqq libmimalloc3 libde265-dev msg_ok "Installed packages from Debian Testing repo" -PNPM_VERSION="$(curl -fsSL "https://raw.githubusercontent.com/immich-app/immich/refs/heads/main/package.json" | jq -r '.packageManager | split("@")[1]')" -NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs +setup_uv PG_VERSION="16" PG_MODULES="pgvector" setup_postgresql VCHORD_RELEASE="0.5.3" @@ -290,7 +289,9 @@ ML_DIR="${APP_DIR}/machine-learning" GEO_DIR="${INSTALL_DIR}/geodata" mkdir -p {"${APP_DIR}","${UPLOAD_DIR}","${GEO_DIR}","${INSTALL_DIR}"/cache} -fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.5.2" "$SRC_DIR" +fetch_and_deploy_gh_release "immich" "immich-app/immich" "tarball" "v2.5.3" "$SRC_DIR" +PNPM_VERSION="$(jq -r '.packageManager | split("@")[1]' ${SRC_DIR}/package.json)" +NODE_VERSION="24" NODE_MODULE="pnpm@${PNPM_VERSION}" setup_nodejs msg_info "Installing Immich (patience)" From 43044c60f0ed640f9f2007f4a20a611b6b5ad768 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:48:50 +0000 Subject: [PATCH 44/93] Update CHANGELOG.md (#11540) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 134674a26..e7d7d4e66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -405,6 +405,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - Wishlist ([#11527](https://github.com/community-scripts/ProxmoxVE/pull/11527)) - WriteFreely ([#11524](https://github.com/community-scripts/ProxmoxVE/pull/11524)) +### 🚀 Updated Scripts + + - #### 🐞 Bug Fixes + + - Immich: pin version to 2.5.3 [@vhsdream](https://github.com/vhsdream) ([#11515](https://github.com/community-scripts/ProxmoxVE/pull/11515)) + ### 💾 Core - #### ✨ New Features From 472439ce6e58f2d7a39def9faf0799a33c3be98b Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 4 Feb 2026 10:19:53 -0500 Subject: [PATCH 45/93] [ADDON] Immich Public Proxy addon (#11518) * [ADDON] Immich Public Proxy * prompt to add Immich IP or domain * fix path * fix immich port * allow localhost * add JSON * Update tools/addon/immich-public-proxy.sh Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> * NodeJS things --------- Co-authored-by: Tobias <96661824+CrazyWolf13@users.noreply.github.com> --- frontend/public/json/immich-public-proxy.json | 44 +++ tools/addon/immich-public-proxy.sh | 264 ++++++++++++++++++ 2 files changed, 308 insertions(+) create mode 100644 frontend/public/json/immich-public-proxy.json create mode 100644 tools/addon/immich-public-proxy.sh diff --git a/frontend/public/json/immich-public-proxy.json b/frontend/public/json/immich-public-proxy.json new file mode 100644 index 000000000..73e10f751 --- /dev/null +++ b/frontend/public/json/immich-public-proxy.json @@ -0,0 +1,44 @@ +{ + "name": "Immich Public Proxy", + "slug": "immich-public-proxy", + "categories": [ + 21 + ], + "date_created": "2026-02-04", + "type": "addon", + "updateable": true, + "privileged": false, + "interface_port": 3000, + "documentation": "https://github.com/alangrainger/immich-public-proxy/docs", + "website": "https://github.com/alangrainger/immich-public-proxy", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/immich-public-proxy.webp", + "config_path": "/opt/immich-proxy/app/.env", + "description": "Share your Immich photos and albums in a safe way without exposing your Immich instance to the public.", + "install_methods": [ + { + "type": "default", + "script": "tools/addon/immich-public-proxy.sh", + "resources": { + "cpu": null, + "ram": null, + "hdd": null, + "os": null, + "version": null + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "Requires Node.js 24+", + "type": "info" + }, + { + "text": "Update with: update_immich-public-proxy", + "type": "info" + } + ] +} diff --git a/tools/addon/immich-public-proxy.sh b/tools/addon/immich-public-proxy.sh new file mode 100644 index 000000000..77471722a --- /dev/null +++ b/tools/addon/immich-public-proxy.sh @@ -0,0 +1,264 @@ +#!/usr/bin/env bash + +# Copyright (c) 2021-2026 community-scripts ORG +# Author: vhsdream +# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Source: https://github.com/alangrainger/immich-public-proxy + +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func) +source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/error_handler.func) + +# Enable error handling +set -Eeuo pipefail +trap 'error_handler' ERR + +# ============================================================================== +# CONFIGURATION +# ============================================================================== +APP="Immich Public Proxy" +APP_TYPE="addon" +INSTALL_PATH="/opt/immich-proxy" +CONFIG_PATH="/opt/immich-proxy/app" +DEFAULT_PORT=3000 + +# Initialize all core functions (colors, formatting, icons, STD mode) +load_functions + +# ============================================================================== +# HEADER +# ============================================================================== +function header_info { + clear + cat <<"EOF" + ____ _ __ ____ + / _/___ ___ ____ ___ (_)____/ /_ / __ \_________ _ ____ __ + / // __ `__ \/ __ `__ \/ / ___/ __ \______/ /_/ / ___/ __ \| |/_/ / / / + _/ // / / / / / / / / / / / /__/ / / /_____/ ____/ / / /_/ /> /dev/null || true + rm -f "$SERVICE_PATH" + rm -rf "$INSTALL_PATH" + rm -f "/usr/local/bin/update_immich-public-proxy" + rm -f "$HOME/.immichpublicproxy" + msg_ok "${APP} has been uninstalled" +} + +# ============================================================================== +# UPDATE +# ============================================================================== +function update() { + if check_for_gh_release "Immich Public Proxy" "alangrainger/immich-public-proxy"; then + msg_info "Stopping service" + systemctl stop immich-proxy.service &>/dev/null || true + msg_ok "Stopped service" + + msg_info "Backing up configuration" + cp "$CONFIG_PATH"/.env /tmp/ipp.env.bak 2>/dev/null || true + cp "$CONFIG_PATH"/config.json /tmp/ipp.config.json.bak 2>/dev/null || true + msg_ok "Backed up configuration" + + NODE_VERSION="24" setup_nodejs + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Immich Public Proxy" "alangrainger/immich-public-proxy" "tarball" "latest" "$INSTALL_PATH" + + msg_info "Restoring configuration" + cp /tmp/ipp.env.bak "$CONFIG_PATH"/.env 2>/dev/null || true + cp /tmp/ipp.config.json.bak "$CONFIG_PATH"/config.json 2>/dev/null || true + rm -f /tmp/ipp.*.bak + msg_ok "Restored configuration" + + msg_info "Installing dependencies" + cd "$CONFIG_PATH" + $STD npm install + msg_ok "Installed dependencies" + + msg_info "Building ${APP}" + $STD npm run build + msg_ok "Built ${APP}" + + msg_info "Starting service" + systemctl start immich-proxy + msg_ok "Started service" + msg_ok "Updated successfully" + exit + fi +} + +# ============================================================================== +# INSTALL +# ============================================================================== +function install() { + NODE_VERSION="24" setup_nodejs + + # Force fresh download by removing version cache + rm -f "$HOME/.immichpublicproxy" + fetch_and_deploy_gh_release "Immich Public Proxy" "alangrainger/immich-public-proxy" "tarball" "latest" "$INSTALL_PATH" + + msg_info "Installing dependencies" + cd "$CONFIG_PATH" + $STD npm install + msg_ok "Installed dependencies" + + msg_info "Building ${APP}" + $STD npm run build + msg_ok "Built ${APP}" + + MAX_ATTEMPTS=3 + attempt=0 + while true; do + attempt=$((attempt + 1)) + read -rp "${TAB3}Enter your LOCAL Immich IP or domain (ex. 192.168.1.100 or immich.local.lan): " DOMAIN + if [[ -z "$DOMAIN" ]]; then + if ((attempt >= MAX_ATTEMPTS)); then + DOMAIN="${LOCAL_IP:-localhost}" + msg_warn "Using fallback: $DOMAIN" + break + fi + msg_warn "Domain cannot be empty! (Attempt $attempt/$MAX_ATTEMPTS)" + elif [[ "$DOMAIN" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then + valid_ip=true + IFS='.' read -ra octets <<<"$DOMAIN" + for octet in "${octets[@]}"; do + if ((octet > 255)); then + valid_ip=false + break + fi + done + if $valid_ip; then + break + else + msg_warn "Invalid IP address!" + fi + elif [[ "$DOMAIN" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\.[a-zA-Z]{2,}$ || "$DOMAIN" == "localhost" ]]; then + break + else + msg_warn "Invalid domain format!" + fi + done + + msg_info "Creating configuration" + cat <"$CONFIG_PATH"/.env +NODE_ENV=production +IMMICH_URL=http://${DOMAIN}:2283 +EOF + chmod 600 "$CONFIG_PATH"/.env + msg_ok "Created configuration" + + msg_info "Creating service" + cat <"$SERVICE_PATH" +[Unit] +Description=Immich Public Proxy +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=${INSTALL_PATH} +EnvironmentFile=${CONFIG_PATH}/.env +ExecStart=/usr/bin/node ${INSTALL_PATH}/app/server.js +Restart=always +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOF + systemctl enable -q --now immich-proxy + msg_ok "Created and started service" + + # Create update script (simple wrapper that calls this addon with type=update) + msg_info "Creating update script" + cat <<'UPDATEEOF' >/usr/local/bin/update_immich-public-proxy +#!/usr/bin/env bash +# Immich Public Proxy Update Script +type=update bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/addon/immich-public-proxy.sh)" +UPDATEEOF + chmod +x /usr/local/bin/update_immich-public-proxy + msg_ok "Created update script (/usr/local/bin/update_immich-public-proxy)" + + echo "" + msg_ok "${APP} is reachable at: ${BL}http://${LOCAL_IP}:${DEFAULT_PORT}${CL}" + echo "" + msg_warn "Additional configuration is available at '/opt/immich-proxy/app/config.json'" +} + +# ============================================================================== +# MAIN +# ============================================================================== + +# Handle type=update (called from update script) +if [[ "${type:-}" == "update" ]]; then + header_info + if [[ -d "$INSTALL_PATH" && -f "$SERVICE_PATH" ]]; then + update + else + msg_error "${APP} is not installed. Nothing to update." + exit 1 + fi + exit 0 +fi + +header_info +get_lxc_ip + +# Check if already installed +if [[ -d "$INSTALL_PATH" && -f "$SERVICE_PATH" ]]; then + msg_warn "${APP} is already installed." + echo "" + + echo -n "${TAB}Uninstall ${APP}? (y/N): " + read -r uninstall_prompt + if [[ "${uninstall_prompt,,}" =~ ^(y|yes)$ ]]; then + uninstall + exit 0 + fi + + echo -n "${TAB}Update ${APP}? (y/N): " + read -r update_prompt + if [[ "${update_prompt,,}" =~ ^(y|yes)$ ]]; then + update + exit 0 + fi + + msg_warn "No action selected. Exiting." + exit 0 +fi + +# Fresh installation +msg_warn "${APP} is not installed." +echo "" +echo -e "${TAB}${INFO} This will install:" +echo -e "${TAB} - Node.js 24" +echo -e "${TAB} - Immich Public Proxy" +echo "" + +echo -n "${TAB}Install ${APP}? (y/N): " +read -r install_prompt +if [[ "${install_prompt,,}" =~ ^(y|yes)$ ]]; then + install +else + msg_warn "Installation cancelled. Exiting." + exit 0 +fi From 3046eb000dfbdcc97fa3597c065fd4fc598d4207 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:20:23 +0000 Subject: [PATCH 46/93] Update CHANGELOG.md (#11542) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d7d4e66..76e33764c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -417,6 +417,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - 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 From b025fd049ce6566b68025050c69b5d18b5238c29 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:17:43 +0000 Subject: [PATCH 47/93] chore: update github-versions.json (#11544) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index ad8283379..c1e06fe83 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-04T12:11:53Z", + "generated": "2026-02-04T18:17:33Z", "versions": [ { "slug": "2fauth", @@ -256,9 +256,9 @@ { "slug": "docmost", "repo": "docmost/docmost", - "version": "v0.25.0", + "version": "v0.25.1", "pinned": false, - "date": "2026-02-04T00:33:45Z" + "date": "2026-02-04T15:19:51Z" }, { "slug": "domain-locker", @@ -515,9 +515,9 @@ { "slug": "huntarr", "repo": "plexguide/Huntarr.io", - "version": "9.1.11", + "version": "9.1.12", "pinned": false, - "date": "2026-02-04T11:30:25Z" + "date": "2026-02-04T14:28:36Z" }, { "slug": "inspircd", @@ -1096,9 +1096,9 @@ { "slug": "pulse", "repo": "rcourtman/Pulse", - "version": "v5.0.17", + "version": "v5.1.0", "pinned": false, - "date": "2026-01-20T19:07:30Z" + "date": "2026-02-04T17:43:59Z" }, { "slug": "pve-scripts-local", @@ -1271,9 +1271,9 @@ { "slug": "speedtest-tracker", "repo": "alexjustesen/speedtest-tracker", - "version": "v1.13.6", + "version": "v1.13.7", "pinned": false, - "date": "2026-02-03T21:20:51Z" + "date": "2026-02-04T16:47:42Z" }, { "slug": "spoolman", @@ -1369,9 +1369,9 @@ { "slug": "tianji", "repo": "msgbyte/tianji", - "version": "v1.31.9", + "version": "v1.31.10", "pinned": false, - "date": "2026-01-31T18:22:40Z" + "date": "2026-02-04T17:21:04Z" }, { "slug": "traccar", @@ -1411,9 +1411,9 @@ { "slug": "trip", "repo": "itskovacs/TRIP", - "version": "1.38.0", + "version": "1.38.1", "pinned": false, - "date": "2026-01-31T15:56:30Z" + "date": "2026-02-04T18:10:15Z" }, { "slug": "tududi", From 5f31954d9106c903bd4679f972d6cac38b9c07da Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 4 Feb 2026 14:21:30 -0500 Subject: [PATCH 48/93] [FIX] Immich Public Proxy docs link (#11543) --- frontend/public/json/immich-public-proxy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/json/immich-public-proxy.json b/frontend/public/json/immich-public-proxy.json index 73e10f751..7eac59dc6 100644 --- a/frontend/public/json/immich-public-proxy.json +++ b/frontend/public/json/immich-public-proxy.json @@ -9,7 +9,7 @@ "updateable": true, "privileged": false, "interface_port": 3000, - "documentation": "https://github.com/alangrainger/immich-public-proxy/docs", + "documentation": "https://github.com/alangrainger/immich-public-proxy/tree/main/docs", "website": "https://github.com/alangrainger/immich-public-proxy", "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/immich-public-proxy.webp", "config_path": "/opt/immich-proxy/app/.env", From 868446a4b6e02e27fc1c0d1c0c176e0dcc84894b Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:21:53 +0000 Subject: [PATCH 49/93] Update CHANGELOG.md (#11545) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76e33764c..cd3b91beb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -429,6 +429,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - 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 From 4bd5c7b54b9beb0c6e055f46d745b5d359626660 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 4 Feb 2026 14:57:52 -0500 Subject: [PATCH 50/93] [FIX] Scanopy: ensure Scanopy Daemon update (#11541) - It wasn't updating due to it having the same name as the server - Changed it to 'Scanopy Daemon' - Other small fixes --- ct/scanopy.sh | 19 +++++++++++-------- install/scanopy-install.sh | 6 +++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/ct/scanopy.sh b/ct/scanopy.sh index b4806a949..248bf0032 100644 --- a/ct/scanopy.sh +++ b/ct/scanopy.sh @@ -29,7 +29,7 @@ function update_script() { exit fi - if check_for_gh_release "scanopy" "scanopy/scanopy"; then + if check_for_gh_release "Scanopy" "scanopy/scanopy"; then msg_info "Stopping services" systemctl stop scanopy-server [[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl stop scanopy-daemon @@ -40,7 +40,7 @@ function update_script() { [[ -f /opt/scanopy/oidc.toml ]] && cp /opt/scanopy/oidc.toml /opt/scanopy.oidc.toml msg_ok "Backed up configurations" - CLEAN_INSTALL=1 fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" + CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" ensure_dependencies pkg-config libssl-dev TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')" @@ -61,19 +61,22 @@ function update_script() { $STD npm run build msg_ok "Created frontend UI" - msg_info "Building scanopy-server (patience)" + 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" + msg_ok "Built Scanopy Server" - [[ -f /etc/systemd/system/scanopy-daemon.service ]] && - fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64" && - rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh && + 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 + rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh sed -i -e 's|usr/bin|usr/local/bin|' \ -e 's/push/daemon_poll/' \ - -e 's/pull/server_poll/' /etc/systemd/system/scanopy-daemon.service && + -e 's/pull/server_poll/' /etc/systemd/system/scanopy-daemon.service systemctl daemon-reload + msg_ok "Updated Scanopy Daemon" + fi msg_info "Starting services" systemctl start scanopy-server diff --git a/install/scanopy-install.sh b/install/scanopy-install.sh index e832bba9b..337b7e588 100644 --- a/install/scanopy-install.sh +++ b/install/scanopy-install.sh @@ -23,7 +23,7 @@ msg_ok "Installed Dependencies" PG_VERSION=17 setup_postgresql NODE_VERSION="24" setup_nodejs PG_DB_NAME="scanopy_db" PG_DB_USER="scanopy" PG_DB_GRANT_SUPERUSER="true" setup_postgresql_db -fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" +fetch_and_deploy_gh_release "Scanopy" "scanopy/scanopy" "tarball" "latest" "/opt/scanopy" TOOLCHAIN="$(grep "channel" /opt/scanopy/backend/rust-toolchain.toml | awk -F\" '{print $2}')" RUST_TOOLCHAIN=$TOOLCHAIN setup_rust @@ -35,11 +35,11 @@ $STD npm ci --no-fund --no-audit $STD npm run build msg_ok "Created frontend UI" -msg_info "Building scanopy-server (patience)" +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" +msg_ok "Built Scanopy Server" msg_info "Configuring server for first-run" cat </opt/scanopy/.env From be994ce84f507f37df7768ec6c034fa0f21b8a0e Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:58:23 +0000 Subject: [PATCH 51/93] Update CHANGELOG.md (#11551) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd3b91beb..83bc3128a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -409,6 +409,7 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - #### 🐞 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 From 7b8a3a111dfa6e82d56e852f273fe760f1e64acc Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 21:06:58 +0100 Subject: [PATCH 52/93] Update .app files (#11550) Co-authored-by: GitHub Actions --- tools/headers/immich-public-proxy | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 tools/headers/immich-public-proxy diff --git a/tools/headers/immich-public-proxy b/tools/headers/immich-public-proxy new file mode 100644 index 000000000..3a2195356 --- /dev/null +++ b/tools/headers/immich-public-proxy @@ -0,0 +1,6 @@ + ____ _ __ ____ __ ___ ____ + / _/___ ___ ____ ___ (_)____/ /_ / __ \__ __/ /_ / (_)____ / __ \_________ _ ____ __ + / // __ `__ \/ __ `__ \/ / ___/ __ \ / /_/ / / / / __ \/ / / ___/ / /_/ / ___/ __ \| |/_/ / / / + _/ // / / / / / / / / / / / /__/ / / / / ____/ /_/ / /_/ / / / /__ / ____/ / / /_/ /> Date: Wed, 4 Feb 2026 22:59:43 +0100 Subject: [PATCH 53/93] Add log directory and permissions for koillection (#11553) Create log directory and set ownership for www-data --- ct/koillection.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ct/koillection.sh b/ct/koillection.sh index df4fb2a6f..7304390a7 100644 --- a/ct/koillection.sh +++ b/ct/koillection.sh @@ -59,6 +59,8 @@ function update_script() { $STD yarn install $STD yarn build mkdir -p /opt/koillection/public/uploads + mkdir -p /opt/koillection/var/log + chown -R www-data:www-data /opt/koillection/var/log chown -R www-data:www-data /opt/koillection/public/uploads rm -r /opt/koillection-backup From a74f6ee3c30a8153e79dc9c41181e1422195a4af Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 22:00:07 +0000 Subject: [PATCH 54/93] Update CHANGELOG.md (#11555) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83bc3128a..4352800e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -407,6 +407,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ### 🚀 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)) From 93c52abebdbb612aa5b06678f4dacd3049181c1c Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 00:22:22 +0000 Subject: [PATCH 55/93] chore: update github-versions.json (#11557) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index c1e06fe83..b409bf662 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-04T18:17:33Z", + "generated": "2026-02-05T00:22:14Z", "versions": [ { "slug": "2fauth", @@ -445,9 +445,9 @@ { "slug": "headscale", "repo": "juanfont/headscale", - "version": "v0.27.1", + "version": "v0.28.0", "pinned": false, - "date": "2025-11-11T19:32:29Z" + "date": "2026-02-04T20:40:23Z" }, { "slug": "healthchecks", @@ -536,9 +536,9 @@ { "slug": "invoiceninja", "repo": "invoiceninja/invoiceninja", - "version": "v5.12.53", + "version": "v5.12.54", "pinned": false, - "date": "2026-02-04T00:52:01Z" + "date": "2026-02-04T23:52:17Z" }, { "slug": "jackett", @@ -746,9 +746,9 @@ { "slug": "mealie", "repo": "mealie-recipes/mealie", - "version": "v3.10.1", + "version": "v3.10.2", "pinned": false, - "date": "2026-02-03T01:04:38Z" + "date": "2026-02-04T23:32:32Z" }, { "slug": "mediamanager", @@ -781,9 +781,9 @@ { "slug": "metube", "repo": "alexta69/metube", - "version": "2026.02.03", + "version": "2026.02.04", "pinned": false, - "date": "2026-02-03T21:49:49Z" + "date": "2026-02-04T20:01:18Z" }, { "slug": "miniflux", @@ -1096,9 +1096,9 @@ { "slug": "pulse", "repo": "rcourtman/Pulse", - "version": "v5.1.0", + "version": "v5.1.2", "pinned": false, - "date": "2026-02-04T17:43:59Z" + "date": "2026-02-05T00:18:57Z" }, { "slug": "pve-scripts-local", @@ -1271,9 +1271,9 @@ { "slug": "speedtest-tracker", "repo": "alexjustesen/speedtest-tracker", - "version": "v1.13.7", + "version": "v1.13.8", "pinned": false, - "date": "2026-02-04T16:47:42Z" + "date": "2026-02-04T19:24:23Z" }, { "slug": "spoolman", From ddd130dbe3850224c72ebd42e36740a4b32ac6e2 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 00:22:45 +0000 Subject: [PATCH 56/93] Update CHANGELOG.md (#11558) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4352800e8..baab98ea4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -398,6 +398,8 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
+## 2026-02-05 + ## 2026-02-04 ### 🆕 New Scripts From be9d26885ad5f02b4e693310633bb2ba75873fc7 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 06:22:30 +0000 Subject: [PATCH 57/93] chore: update github-versions.json (#11560) Co-authored-by: github-actions[bot] --- frontend/public/json/github-versions.json | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/frontend/public/json/github-versions.json b/frontend/public/json/github-versions.json index b409bf662..0a84c6419 100644 --- a/frontend/public/json/github-versions.json +++ b/frontend/public/json/github-versions.json @@ -1,5 +1,5 @@ { - "generated": "2026-02-05T00:22:14Z", + "generated": "2026-02-05T06:22:20Z", "versions": [ { "slug": "2fauth", @@ -221,9 +221,9 @@ { "slug": "cronicle", "repo": "jhuckaby/Cronicle", - "version": "v0.9.102", + "version": "v0.9.103", "pinned": false, - "date": "2025-12-19T03:45:13Z" + "date": "2026-02-05T03:09:04Z" }, { "slug": "cryptpad", @@ -494,9 +494,9 @@ { "slug": "homepage", "repo": "gethomepage/homepage", - "version": "v1.9.0", + "version": "v1.10.0", "pinned": false, - "date": "2026-01-19T05:46:09Z" + "date": "2026-02-05T06:17:32Z" }, { "slug": "homer", @@ -515,9 +515,9 @@ { "slug": "huntarr", "repo": "plexguide/Huntarr.io", - "version": "9.1.12", + "version": "9.2.0", "pinned": false, - "date": "2026-02-04T14:28:36Z" + "date": "2026-02-05T04:18:08Z" }, { "slug": "inspircd", @@ -536,16 +536,16 @@ { "slug": "invoiceninja", "repo": "invoiceninja/invoiceninja", - "version": "v5.12.54", + "version": "v5.12.55", "pinned": false, - "date": "2026-02-04T23:52:17Z" + "date": "2026-02-05T01:06:15Z" }, { "slug": "jackett", "repo": "Jackett/Jackett", - "version": "v0.24.1027", + "version": "v0.24.1032", "pinned": false, - "date": "2026-02-04T05:56:22Z" + "date": "2026-02-05T05:55:27Z" }, { "slug": "joplin-server", @@ -1292,9 +1292,9 @@ { "slug": "stirling-pdf", "repo": "Stirling-Tools/Stirling-PDF", - "version": "v2.4.3", + "version": "v2.4.4", "pinned": false, - "date": "2026-01-31T22:19:14Z" + "date": "2026-02-05T00:15:53Z" }, { "slug": "streamlink-webui", From 129f2f6329f1945f1a3d769f6ab0f731e32f060c Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Thu, 5 Feb 2026 08:03:04 +0100 Subject: [PATCH 58/93] Refactor: Docker-VM (Multi-OS / Cloud-Init / Stabilization) (#9047) * Upgrade to Debian 13 and clean up dependencies Updated the script to use Debian 13 Qcow2 Disk Image and removed redundant installation of libguestfs-tools. * Update URL for Debian Qcow2 Disk Image * Update docker-vm.sh * Update fmt.Println message from 'Hello' to 'Goodbye' * add cloudinit function --- vm/docker-vm.sh | 732 ++++++++++++++++++++++++++++-------------------- 1 file changed, 435 insertions(+), 297 deletions(-) diff --git a/vm/docker-vm.sh b/vm/docker-vm.sh index 0e845e47a..f45da27ad 100644 --- a/vm/docker-vm.sh +++ b/vm/docker-vm.sh @@ -1,71 +1,45 @@ #!/usr/bin/env bash # Copyright (c) 2021-2026 community-scripts ORG -# Author: thost96 (thost96) | Co-Author: michelroegl-brunner -# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE +# Author: thost96 (thost96) | michelroegl-brunner | MickLesk +# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/main/LICENSE -source /dev/stdin <<<$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func) +# ============================================================================== +# Docker VM - Creates a Docker-ready Virtual Machine +# ============================================================================== -function header_info() { - clear - cat <<"EOF" - ____ __ _ ____ ___ - / __ \____ _____/ /_____ _____ | | / / |/ / - / / / / __ \/ ___/ //_/ _ \/ ___/ | | / / /|_/ / - / /_/ / /_/ / /__/ ,< / __/ / | |/ / / / / -/_____/\____/\___/_/|_|\___/_/ |___/_/ /_/ +source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/api.func) 2>/dev/null +source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/vm-core.func) 2>/dev/null +source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVE/raw/branch/main/misc/cloud-init.func) 2>/dev/null || true +load_functions + +# ============================================================================== +# SCRIPT VARIABLES +# ============================================================================== +APP="Docker" +APP_TYPE="vm" +NSAPP="docker-vm" +var_os="debian" +var_version="13" -EOF -} -header_info -echo -e "\n Loading..." GEN_MAC=02:$(openssl rand -hex 5 | awk '{print toupper($0)}' | sed 's/\(..\)/\1:/g; s/.$//') RANDOM_UUID="$(cat /proc/sys/kernel/random/uuid)" METHOD="" -NSAPP="docker-vm" -var_os="debian" -var_version="12" DISK_SIZE="10G" - -YW=$(echo "\033[33m") -BL=$(echo "\033[36m") -RD=$(echo "\033[01;31m") -BGN=$(echo "\033[4;92m") -GN=$(echo "\033[1;92m") -DGN=$(echo "\033[32m") -CL=$(echo "\033[m") - -CL=$(echo "\033[m") -BOLD=$(echo "\033[1m") -BFR="\\r\\033[K" -HOLD=" " -TAB=" " - -CM="${TAB}✔️${TAB}${CL}" -CROSS="${TAB}✖️${TAB}${CL}" -INFO="${TAB}💡${TAB}${CL}" -OS="${TAB}🖥️${TAB}${CL}" -CONTAINERTYPE="${TAB}📦${TAB}${CL}" -DISKSIZE="${TAB}💾${TAB}${CL}" -CPUCORE="${TAB}🧠${TAB}${CL}" -RAMSIZE="${TAB}🛠️${TAB}${CL}" -CONTAINERID="${TAB}🆔${TAB}${CL}" -HOSTNAME="${TAB}🏠${TAB}${CL}" -BRIDGE="${TAB}🌉${TAB}${CL}" -GATEWAY="${TAB}🌐${TAB}${CL}" -DEFAULT="${TAB}⚙️${TAB}${CL}" -MACADDRESS="${TAB}🔗${TAB}${CL}" -VLANTAG="${TAB}🏷️${TAB}${CL}" -CREATING="${TAB}🚀${TAB}${CL}" -ADVANCED="${TAB}🧩${TAB}${CL}" -CLOUD="${TAB}☁️${TAB}${CL}" - +USE_CLOUD_INIT="no" +OS_TYPE="" +OS_VERSION="" THIN="discard=on,ssd=1," + +# ============================================================================== +# ERROR HANDLING & CLEANUP +# ============================================================================== set -e trap 'error_handler $LINENO "$BASH_COMMAND"' ERR trap cleanup EXIT trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM + function error_handler() { local exit_code="$?" local line_number="$1" @@ -76,140 +50,96 @@ function error_handler() { cleanup_vmid } -function get_valid_nextid() { - local try_id - try_id=$(pvesh get /cluster/nextid) - while true; do - if [ -f "/etc/pve/qemu-server/${try_id}.conf" ] || [ -f "/etc/pve/lxc/${try_id}.conf" ]; then - try_id=$((try_id + 1)) - continue +# ============================================================================== +# OS SELECTION FUNCTIONS +# ============================================================================== +function select_os() { + if OS_CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT OS" --radiolist \ + "Choose Operating System for Docker VM" 14 68 4 \ + "debian13" "Debian 13 (Trixie) - Latest" ON \ + "debian12" "Debian 12 (Bookworm) - Stable" OFF \ + "ubuntu2404" "Ubuntu 24.04 LTS (Noble)" OFF \ + "ubuntu2204" "Ubuntu 22.04 LTS (Jammy)" OFF \ + 3>&1 1>&2 2>&3); then + case $OS_CHOICE in + debian13) + OS_TYPE="debian" + OS_VERSION="13" + OS_CODENAME="trixie" + OS_DISPLAY="Debian 13 (Trixie)" + ;; + debian12) + OS_TYPE="debian" + OS_VERSION="12" + OS_CODENAME="bookworm" + OS_DISPLAY="Debian 12 (Bookworm)" + ;; + ubuntu2404) + OS_TYPE="ubuntu" + OS_VERSION="24.04" + OS_CODENAME="noble" + OS_DISPLAY="Ubuntu 24.04 LTS" + ;; + ubuntu2204) + OS_TYPE="ubuntu" + OS_VERSION="22.04" + OS_CODENAME="jammy" + OS_DISPLAY="Ubuntu 22.04 LTS" + ;; + esac + echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}${OS_DISPLAY}${CL}" + else + exit_script + fi +} + +function select_cloud_init() { + if [ "$OS_TYPE" = "ubuntu" ]; then + USE_CLOUD_INIT="yes" + echo -e "${CLOUD:-${TAB}☁️${TAB}${CL}}${BOLD}${DGN}Cloud-Init: ${BGN}yes (Ubuntu requires Cloud-Init)${CL}" + return + fi + + if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "CLOUD-INIT" \ + --yesno "Enable Cloud-Init for VM configuration?\n\nCloud-Init allows automatic configuration of:\n- User accounts and passwords\n- SSH keys\n- Network settings (DHCP/Static)\n- DNS configuration\n\nYou can also configure these settings later in Proxmox UI.\n\nNote: Debian without Cloud-Init will use nocloud image with console auto-login." 18 68); then + USE_CLOUD_INIT="yes" + echo -e "${CLOUD:-${TAB}☁️${TAB}${CL}}${BOLD}${DGN}Cloud-Init: ${BGN}yes${CL}" + else + USE_CLOUD_INIT="no" + echo -e "${CLOUD:-${TAB}☁️${TAB}${CL}}${BOLD}${DGN}Cloud-Init: ${BGN}no${CL}" + fi +} + +function get_image_url() { + local arch=$(dpkg --print-architecture) + case $OS_TYPE in + debian) + if [ "$USE_CLOUD_INIT" = "yes" ]; then + echo "https://cloud.debian.org/images/cloud/${OS_CODENAME}/latest/debian-${OS_VERSION}-generic-${arch}.qcow2" + else + echo "https://cloud.debian.org/images/cloud/${OS_CODENAME}/latest/debian-${OS_VERSION}-nocloud-${arch}.qcow2" fi - if lvs --noheadings -o lv_name | grep -qE "(^|[-_])${try_id}($|[-_])"; then - try_id=$((try_id + 1)) - continue - fi - break - done - echo "$try_id" -} - -function cleanup_vmid() { - if qm status $VMID &>/dev/null; then - qm stop $VMID &>/dev/null - qm destroy $VMID &>/dev/null - fi -} - -function cleanup() { - popd >/dev/null - post_update_to_api "done" "none" - rm -rf $TEMP_DIR -} - -TEMP_DIR=$(mktemp -d) -pushd $TEMP_DIR >/dev/null -if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Docker VM" --yesno "This will create a New Docker VM. Proceed?" 10 58; then - : -else - header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit -fi - -function msg_info() { - local msg="$1" - echo -ne "${TAB}${YW}${HOLD}${msg}${HOLD}" -} - -function msg_ok() { - local msg="$1" - echo -e "${BFR}${CM}${GN}${msg}${CL}" -} - -function msg_error() { - local msg="$1" - echo -e "${BFR}${CROSS}${RD}${msg}${CL}" -} - -function check_root() { - if [[ "$(id -u)" -ne 0 || $(ps -o comm= -p $PPID) == "sudo" ]]; then - clear - msg_error "Please run this script as root." - echo -e "\nExiting..." - sleep 2 - exit - fi -} - -# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. -# Supported: Proxmox VE 8.0.x – 8.9.x, 9.0 and 9.1 -pve_check() { - local PVE_VER - PVE_VER="$(pveversion | awk -F'/' '{print $2}' | awk -F'-' '{print $1}')" - - # Check for Proxmox VE 8.x: allow 8.0–8.9 - if [[ "$PVE_VER" =~ ^8\.([0-9]+) ]]; then - local MINOR="${BASH_REMATCH[1]}" - if ((MINOR < 0 || MINOR > 9)); then - msg_error "This version of Proxmox VE is not supported." - msg_error "Supported: Proxmox VE version 8.0 – 8.9" - exit 1 - fi - return 0 - fi - - # Check for Proxmox VE 9.x: allow 9.0 and 9.1 - if [[ "$PVE_VER" =~ ^9\.([0-9]+) ]]; then - local MINOR="${BASH_REMATCH[1]}" - if ((MINOR < 0 || MINOR > 1)); then - msg_error "This version of Proxmox VE is not supported." - msg_error "Supported: Proxmox VE version 9.0 – 9.1" - exit 1 - fi - return 0 - fi - - # All other unsupported versions - msg_error "This version of Proxmox VE is not supported." - msg_error "Supported versions: Proxmox VE 8.0 – 8.x or 9.0 – 9.1" - exit 1 -} - -function arch_check() { - if [ "$(dpkg --print-architecture)" != "amd64" ]; then - echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n" - echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" - echo -e "Exiting..." - sleep 2 - exit - fi -} - -function ssh_check() { - if command -v pveversion >/dev/null 2>&1; then - if [ -n "${SSH_CLIENT:+x}" ]; then - if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's suggested to use the Proxmox shell instead of SSH, since SSH can create issues while gathering variables. Would you like to proceed with using SSH?" 10 62; then - echo "you've been warned" - else - clear - exit - fi - fi - fi -} - -function exit-script() { - clear - echo -e "\n${CROSS}${RD}User exited script${CL}\n" - exit + ;; + ubuntu) + echo "https://cloud-images.ubuntu.com/${OS_CODENAME}/current/${OS_CODENAME}-server-cloudimg-${arch}.img" + ;; + esac } +# ============================================================================== +# SETTINGS FUNCTIONS +# ============================================================================== function default_settings() { + select_os + select_cloud_init + VMID=$(get_valid_nextid) - FORMAT=",efitype=4m" - MACHINE="" + FORMAT="" + MACHINE=" -machine q35" DISK_CACHE="" DISK_SIZE="10G" HN="docker" - CPU_TYPE="" + CPU_TYPE=" -cpu host" CORE_COUNT="2" RAM_SIZE="4096" BRG="vmbr0" @@ -218,12 +148,13 @@ function default_settings() { MTU="" START_VM="yes" METHOD="default" + echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}" - echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}Q35 (Modern)${CL}" echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}" echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}" echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}" - echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}" + echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}" echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}${CL}" echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}${BRG}${CL}" @@ -231,12 +162,22 @@ function default_settings() { echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}Default${CL}" echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}Default${CL}" echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" - echo -e "${CREATING}${BOLD}${DGN}Creating a Docker VM using the above default settings${CL}" + echo -e "${CREATING}${BOLD}${DGN}Creating a Docker VM using the above settings${CL}" } function advanced_settings() { + select_os + select_cloud_init + + # SSH Key selection for Cloud-Init VMs + if [ "$USE_CLOUD_INIT" = "yes" ]; then + configure_cloudinit_ssh_keys || true + fi + METHOD="advanced" [ -z "${VMID:-}" ] && VMID=$(get_valid_nextid) + + # VM ID while true; do if VMID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Virtual Machine ID" 8 58 $VMID --title "VIRTUAL MACHINE ID" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z "$VMID" ]; then @@ -250,27 +191,29 @@ function advanced_settings() { echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}$VMID${CL}" break else - exit-script + exit_script fi done + # Machine Type if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \ - "i440fx" "Machine i440fx" ON \ - "q35" "Machine q35" OFF \ + "q35" "Q35 (Modern, PCIe)" ON \ + "i440fx" "i440fx (Legacy, PCI)" OFF \ 3>&1 1>&2 2>&3); then if [ $MACH = q35 ]; then - echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}Q35 (Modern)${CL}" FORMAT="" MACHINE=" -machine q35" else - echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}" + echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx (Legacy)${CL}" FORMAT=",efitype=4m" MACHINE="" fi else - exit-script + exit_script fi + # Disk Size if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GiB (e.g., 10, 20)" 8 58 "$DISK_SIZE" --title "DISK SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then DISK_SIZE=$(echo "$DISK_SIZE" | tr -d ' ') if [[ "$DISK_SIZE" =~ ^[0-9]+$ ]]; then @@ -280,12 +223,13 @@ function advanced_settings() { echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}$DISK_SIZE${CL}" else echo -e "${DISKSIZE}${BOLD}${RD}Invalid Disk Size. Please use a number (e.g., 10 or 10G).${CL}" - exit-script + exit_script fi else - exit-script + exit_script fi + # Disk Cache if DISK_CACHE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISK CACHE" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ "0" "None (Default)" ON \ "1" "Write Through" OFF \ @@ -298,24 +242,25 @@ function advanced_settings() { DISK_CACHE="" fi else - exit-script + exit_script fi + # Hostname if VM_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 docker --title "HOSTNAME" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $VM_NAME ]; then HN="docker" - echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" else HN=$(echo ${VM_NAME,,} | tr -d ' ') - echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" fi + echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}$HN${CL}" else - exit-script + exit_script fi + # CPU Model if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \ - "0" "KVM64 (Default)" ON \ - "1" "Host" OFF \ + "1" "Host (Recommended)" ON \ + "0" "KVM64" OFF \ 3>&1 1>&2 2>&3); then if [ $CPU_TYPE1 = "1" ]; then echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}" @@ -325,80 +270,78 @@ function advanced_settings() { CPU_TYPE="" fi else - exit-script + exit_script fi + # CPU Cores if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $CORE_COUNT ]; then CORE_COUNT="2" - echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" - else - echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" fi + echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}$CORE_COUNT${CL}" else - exit-script + exit_script fi - if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 2048 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + # RAM Size + if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 4096 --title "RAM" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $RAM_SIZE ]; then - RAM_SIZE="2048" - echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" - else - echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" + RAM_SIZE="4096" fi + echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}$RAM_SIZE${CL}" else - exit-script + exit_script fi + # Bridge if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $BRG ]; then BRG="vmbr0" - echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" - else - echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" fi + echo -e "${BRIDGE}${BOLD}${DGN}Bridge: ${BGN}$BRG${CL}" else - exit-script + exit_script fi + # MAC Address if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $MAC1 ]; then MAC="$GEN_MAC" - echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" else MAC="$MAC1" - echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC1${CL}" fi + echo -e "${MACADDRESS}${BOLD}${DGN}MAC Address: ${BGN}$MAC${CL}" else - exit-script + exit_script fi - if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then + # VLAN + if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan (leave blank for default)" 8 58 --title "VLAN" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $VLAN1 ]; then VLAN1="Default" VLAN="" - echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" else VLAN=",tag=$VLAN1" - echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" fi + echo -e "${VLANTAG}${BOLD}${DGN}VLAN: ${BGN}$VLAN1${CL}" else - exit-script + exit_script fi + # MTU if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" --cancel-button Exit-Script 3>&1 1>&2 2>&3); then if [ -z $MTU1 ]; then MTU1="Default" MTU="" - echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" else MTU=",mtu=$MTU1" - echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" fi + echo -e "${DEFAULT}${BOLD}${DGN}Interface MTU Size: ${BGN}$MTU1${CL}" else - exit-script + exit_script fi + # Start VM if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then echo -e "${GATEWAY}${BOLD}${DGN}Start VM when completed: ${BGN}yes${CL}" START_VM="yes" @@ -407,6 +350,7 @@ function advanced_settings() { START_VM="no" fi + # Confirm if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create a Docker VM?" --no-button Do-Over 10 58); then echo -e "${CREATING}${BOLD}${DGN}Creating a Docker VM using the above advanced settings${CL}" else @@ -427,13 +371,28 @@ function start_script() { advanced_settings fi } + +# ============================================================================== +# MAIN EXECUTION +# ============================================================================== +header_info + check_root arch_check pve_check -ssh_check + +if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Docker VM" --yesno "This will create a New Docker VM. Proceed?" 10 58; then + : +else + header_info && echo -e "${CROSS}${RD}User exited script${CL}\n" && exit +fi + start_script post_to_api_vm +# ============================================================================== +# STORAGE SELECTION +# ============================================================================== msg_info "Validating Storage" while read -r line; do TAG=$(echo $line | awk '{print $1}') @@ -446,6 +405,7 @@ while read -r line; do fi STORAGE_MENU+=("$TAG" "$ITEM" "OFF") done < <(pvesm status -content images | awk 'NR>1') + VALID=$(pvesm status -content images | awk 'NR>1') if [ -z "$VALID" ]; then msg_error "Unable to detect a valid storage location." @@ -453,6 +413,8 @@ if [ -z "$VALID" ]; then elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then STORAGE=${STORAGE_MENU[0]} else + if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID >/dev/null; then kill $SPINNER_PID >/dev/null; fi + printf "\e[?25h" while [ -z "${STORAGE:+x}" ]; do STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \ @@ -462,112 +424,288 @@ else fi msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." -msg_info "Retrieving the URL for the Debian 12 Qcow2 Disk Image" -URL="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-nocloud-$(dpkg --print-architecture).qcow2" -sleep 2 -msg_ok "${CL}${BL}${URL}${CL}" -curl -f#SL -o "$(basename "$URL")" "$URL" -echo -en "\e[1A\e[0K" -FILE=$(basename $URL) -msg_ok "Downloaded ${CL}${BL}${FILE}${CL}" +# ============================================================================== +# PREREQUISITES +# ============================================================================== +if ! command -v virt-customize &>/dev/null; then + msg_info "Installing libguestfs-tools" + apt-get -qq update >/dev/null + apt-get -qq install libguestfs-tools lsb-release -y >/dev/null + apt-get -qq install dhcpcd-base -y >/dev/null 2>&1 || true + msg_ok "Installed libguestfs-tools" +fi + +# ============================================================================== +# IMAGE DOWNLOAD +# ============================================================================== +msg_info "Retrieving the URL for the ${OS_DISPLAY} Qcow2 Disk Image" +URL=$(get_image_url) +CACHE_DIR="/var/lib/vz/template/cache" +CACHE_FILE="$CACHE_DIR/$(basename "$URL")" +mkdir -p "$CACHE_DIR" +msg_ok "${CL}${BL}${URL}${CL}" + +if [[ ! -s "$CACHE_FILE" ]]; then + curl -f#SL -o "$CACHE_FILE" "$URL" + echo -en "\e[1A\e[0K" + msg_ok "Downloaded ${CL}${BL}$(basename "$CACHE_FILE")${CL}" +else + msg_ok "Using cached image ${CL}${BL}$(basename "$CACHE_FILE")${CL}" +fi + +# ============================================================================== +# STORAGE TYPE DETECTION +# ============================================================================== STORAGE_TYPE=$(pvesm status -storage "$STORAGE" | awk 'NR>1 {print $2}') case $STORAGE_TYPE in nfs | dir) DISK_EXT=".qcow2" DISK_REF="$VMID/" - DISK_IMPORT="-format qcow2" + DISK_IMPORT="--format qcow2" THIN="" ;; btrfs) DISK_EXT=".raw" DISK_REF="$VMID/" - DISK_IMPORT="-format raw" + DISK_IMPORT="--format raw" FORMAT=",efitype=4m" THIN="" ;; +*) + DISK_EXT="" + DISK_REF="" + DISK_IMPORT="--format raw" + ;; esac -for i in {0,1}; do - disk="DISK$i" - eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} - eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} + +# ============================================================================== +# IMAGE CUSTOMIZATION WITH DOCKER +# ============================================================================== +msg_info "Preparing ${OS_DISPLAY} image with Docker" + +WORK_FILE=$(mktemp --suffix=.qcow2) +cp "$CACHE_FILE" "$WORK_FILE" + +export LIBGUESTFS_BACKEND_SETTINGS=dns=8.8.8.8,1.1.1.1 + +DOCKER_PREINSTALLED="no" + +# Install qemu-guest-agent and Docker during image customization +msg_info "Installing base packages in image" +if virt-customize -a "$WORK_FILE" --install qemu-guest-agent,curl,ca-certificates >/dev/null 2>&1; then + msg_ok "Installed base packages" + + msg_info "Installing Docker (this may take 2-5 minutes)" + if virt-customize -q -a "$WORK_FILE" --run-command "curl -fsSL https://get.docker.com | sh" >/dev/null 2>&1 && + virt-customize -q -a "$WORK_FILE" --run-command "systemctl enable docker" >/dev/null 2>&1; then + msg_ok "Installed Docker" + + msg_info "Configuring Docker daemon" + # Optimize Docker daemon configuration + virt-customize -q -a "$WORK_FILE" --run-command "mkdir -p /etc/docker" >/dev/null 2>&1 + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/docker/daemon.json << EOF +{ + "storage-driver": "overlay2", + "log-driver": "json-file", + "log-opts": { + "max-size": "10m", + "max-file": "3" + } +} +EOF' >/dev/null 2>&1 + DOCKER_PREINSTALLED="yes" + msg_ok "Configured Docker daemon" + else + msg_ok "Docker will be installed on first boot" + fi +else + msg_ok "Packages will be installed on first boot" +fi + +msg_info "Finalizing image (hostname, SSH config)" +# Set hostname and prepare for unique machine-id +virt-customize -q -a "$WORK_FILE" --hostname "${HN}" >/dev/null 2>&1 +virt-customize -q -a "$WORK_FILE" --run-command "truncate -s 0 /etc/machine-id" >/dev/null 2>&1 +virt-customize -q -a "$WORK_FILE" --run-command "rm -f /var/lib/dbus/machine-id" >/dev/null 2>&1 + +# Configure SSH for Cloud-Init +if [ "$USE_CLOUD_INIT" = "yes" ]; then + virt-customize -q -a "$WORK_FILE" --run-command "sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command "sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config" >/dev/null 2>&1 || true +else + # Configure auto-login for nocloud images (no Cloud-Init) + virt-customize -q -a "$WORK_FILE" --run-command "mkdir -p /etc/systemd/system/serial-getty@ttyS0.service.d" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf << EOF +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noclear %I \$TERM +EOF' >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command "mkdir -p /etc/systemd/system/getty@tty1.service.d" >/dev/null 2>&1 || true + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF +[Service] +ExecStart= +ExecStart=-/sbin/agetty --autologin root --noclear %I \$TERM +EOF' >/dev/null 2>&1 || true +fi +msg_ok "Finalized image" + +# Create first-boot Docker install script (fallback if virt-customize failed) +if [ "$DOCKER_PREINSTALLED" = "no" ]; then + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /root/install-docker.sh << "DOCKERSCRIPT" +#!/bin/bash +exec > /var/log/install-docker.log 2>&1 +echo "[$(date)] Starting Docker installation" + +for i in {1..30}; do + ping -c 1 8.8.8.8 >/dev/null 2>&1 && break + sleep 2 done -if ! command -v virt-customize &>/dev/null; then - msg_info "Installing Pre-Requisite libguestfs-tools onto Host" - apt-get -qq update >/dev/null - apt-get -qq install libguestfs-tools lsb-release -y >/dev/null - # Workaround for Proxmox VE 9.0 libguestfs issue - apt-get -qq install dhcpcd-base -y >/dev/null 2>&1 || true - msg_ok "Installed libguestfs-tools successfully" +apt-get update +apt-get install -y qemu-guest-agent curl ca-certificates +curl -fsSL https://get.docker.com | sh +systemctl enable docker +systemctl start docker + +mkdir -p /etc/docker +cat > /etc/docker/daemon.json << DAEMON +{ + "storage-driver": "overlay2", + "log-driver": "json-file", + "log-opts": { "max-size": "10m", "max-file": "3" } +} +DAEMON +systemctl restart docker + +touch /root/.docker-installed +echo "[$(date)] Docker installation completed" +DOCKERSCRIPT +chmod +x /root/install-docker.sh' >/dev/null 2>&1 + + virt-customize -q -a "$WORK_FILE" --run-command 'cat > /etc/systemd/system/install-docker.service << "DOCKERSERVICE" +[Unit] +Description=Install Docker on First Boot +After=network-online.target +Wants=network-online.target +ConditionPathExists=!/root/.docker-installed + +[Service] +Type=oneshot +ExecStart=/root/install-docker.sh +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target +DOCKERSERVICE +systemctl enable install-docker.service' >/dev/null 2>&1 fi -msg_info "Adding Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image" -virt-customize -q -a "${FILE}" --install qemu-guest-agent,apt-transport-https,ca-certificates,curl,gnupg,software-properties-common,lsb-release >/dev/null && - virt-customize -q -a "${FILE}" --run-command "mkdir -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg" >/dev/null && - virt-customize -q -a "${FILE}" --run-command "echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable' > /etc/apt/sources.list.d/docker.list" >/dev/null && - virt-customize -q -a "${FILE}" --run-command "apt-get update -qq && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin" >/dev/null && - virt-customize -q -a "${FILE}" --run-command "systemctl enable docker" >/dev/null && - virt-customize -q -a "${FILE}" --hostname "${HN}" >/dev/null && - virt-customize -q -a "${FILE}" --run-command "echo -n > /etc/machine-id" >/dev/null -msg_ok "Added Docker and Docker Compose Plugin to Debian 12 Qcow2 Disk Image successfully" +# Resize disk to target size +msg_info "Resizing disk image to ${DISK_SIZE}" +qemu-img resize "$WORK_FILE" "${DISK_SIZE}" >/dev/null 2>&1 +msg_ok "Resized disk image" -msg_info "Expanding root partition to use full disk space" -qemu-img create -f qcow2 expanded.qcow2 ${DISK_SIZE} >/dev/null 2>&1 -virt-resize --expand /dev/sda1 ${FILE} expanded.qcow2 >/dev/null 2>&1 -mv expanded.qcow2 ${FILE} >/dev/null 2>&1 -msg_ok "Expanded image to full size" +# ============================================================================== +# VM CREATION +# ============================================================================== +msg_info "Creating Docker VM shell" -msg_info "Creating a Docker VM" qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \ - -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci -pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null -qm importdisk $VMID ${FILE} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null -qm set $VMID \ - -efidisk0 ${DISK0_REF}${FORMAT} \ - -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \ - -boot order=scsi0 \ - -serial0 socket >/dev/null -qm resize $VMID scsi0 8G >/dev/null + -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null + +msg_ok "Created VM shell" + +# ============================================================================== +# DISK IMPORT +# ============================================================================== +msg_info "Importing disk into storage ($STORAGE)" + +if qm disk import --help >/dev/null 2>&1; then + IMPORT_CMD=(qm disk import) +else + IMPORT_CMD=(qm importdisk) +fi + +IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$WORK_FILE" "$STORAGE" ${DISK_IMPORT:-} 2>&1 || true)" +DISK_REF_IMPORTED="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")" +[[ -z "$DISK_REF_IMPORTED" ]] && DISK_REF_IMPORTED="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)" +[[ -z "$DISK_REF_IMPORTED" ]] && { + msg_error "Unable to determine imported disk reference." + echo "$IMPORT_OUT" + exit 1 +} + +msg_ok "Imported disk (${CL}${BL}${DISK_REF_IMPORTED}${CL})" + +# Clean up work file +rm -f "$WORK_FILE" + +# ============================================================================== +# VM CONFIGURATION +# ============================================================================== +msg_info "Attaching EFI and root disk" + +qm set "$VMID" \ + --efidisk0 "${STORAGE}:0,efitype=4m" \ + --scsi0 "${DISK_REF_IMPORTED},${DISK_CACHE}${THIN%,}" \ + --boot order=scsi0 \ + --serial0 socket >/dev/null + qm set $VMID --agent enabled=1 >/dev/null -DESCRIPTION=$( - cat < - - Logo - +msg_ok "Attached EFI and root disk" -

Docker VM

+# Set VM description +set_description -

- - spend Coffee - -

+# Cloud-Init configuration +if [ "$USE_CLOUD_INIT" = "yes" ]; then + msg_info "Configuring Cloud-Init" + setup_cloud_init "$VMID" "$STORAGE" "$HN" "yes" + msg_ok "Cloud-Init configured" +fi - - - GitHub - - - - Discussions - - - - Issues - - -EOF -) -qm set $VMID -description "$DESCRIPTION" >/dev/null - -msg_ok "Created a Docker VM ${CL}${BL}(${HN})" +# Start VM if [ "$START_VM" == "yes" ]; then msg_info "Starting Docker VM" - qm start $VMID + qm start $VMID >/dev/null 2>&1 msg_ok "Started Docker VM" fi + +# ============================================================================== +# FINAL OUTPUT +# ============================================================================== +VM_IP="" +if [ "$START_VM" == "yes" ]; then + set +e + for i in {1..10}; do + VM_IP=$(qm guest cmd "$VMID" network-get-interfaces 2>/dev/null | + jq -r '.[] | select(.name != "lo") | ."ip-addresses"[]? | select(."ip-address-type" == "ipv4") | ."ip-address"' 2>/dev/null | + grep -v "^127\." | head -1) || true + [ -n "$VM_IP" ] && break + sleep 3 + done + set -e +fi + +echo -e "\n${INFO}${BOLD}${GN}Docker VM Configuration Summary:${CL}" +echo -e "${TAB}${DGN}VM ID: ${BGN}${VMID}${CL}" +echo -e "${TAB}${DGN}Hostname: ${BGN}${HN}${CL}" +echo -e "${TAB}${DGN}OS: ${BGN}${OS_DISPLAY}${CL}" +[ -n "$VM_IP" ] && echo -e "${TAB}${DGN}IP Address: ${BGN}${VM_IP}${CL}" + +if [ "$DOCKER_PREINSTALLED" = "yes" ]; then + echo -e "${TAB}${DGN}Docker: ${BGN}Pre-installed (via get.docker.com)${CL}" +else + echo -e "${TAB}${DGN}Docker: ${BGN}Installing on first boot${CL}" + echo -e "${TAB}${YW}⚠️ Wait 2-3 minutes for installation to complete${CL}" + echo -e "${TAB}${YW}⚠️ Check progress: ${BL}cat /var/log/install-docker.log${CL}" +fi + +if [ "$USE_CLOUD_INIT" = "yes" ]; then + display_cloud_init_info "$VMID" "$HN" 2>/dev/null || true +fi + post_update_to_api "done" "none" msg_ok "Completed successfully!\n" From 5db509eb167ca9975ba815ecb885e5182c1b855d Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 07:03:31 +0000 Subject: [PATCH 59/93] Update CHANGELOG.md (#11561) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index baab98ea4..393a073fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -400,6 +400,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-02-05 +### 🚀 Updated Scripts + + - #### ✨ New Features + + - Refactor: Docker-VM (Multi-OS / Cloud-Init / Stabilization) [@MickLesk](https://github.com/MickLesk) ([#9047](https://github.com/community-scripts/ProxmoxVE/pull/9047)) + ## 2026-02-04 ### 🆕 New Scripts From 92506cdc34b814d4b7b7e795c71fc7b71a53a43c Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Thu, 5 Feb 2026 08:11:13 +0100 Subject: [PATCH 60/93] feat(cloud-init): add interactive SSH key discovery and selection (#11547) - Add SSH key discovery from standard paths (/root/.ssh, /etc/ssh) - Add whiptail-based interactive key selection dialog - Extract key fingerprints and comments for better identification - Support multiple key selection with checkboxes - Auto-skip private keys and known_hosts files - Restore shell state after library load --- misc/cloud-init.func | 211 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 207 insertions(+), 4 deletions(-) diff --git a/misc/cloud-init.func b/misc/cloud-init.func index 63bd2a2f2..0c8597f9b 100644 --- a/misc/cloud-init.func +++ b/misc/cloud-init.func @@ -28,13 +28,210 @@ # ============================================================================== # These can be overridden before sourcing this library +# Disable 'unbound variable' errors for this library (restored at end) +_OLD_SET_STATE=$(set +o | grep -E 'set -(e|u|o)') +set +u + CLOUDINIT_DEFAULT_USER="${CLOUDINIT_DEFAULT_USER:-root}" CLOUDINIT_DNS_SERVERS="${CLOUDINIT_DNS_SERVERS:-1.1.1.1 8.8.8.8}" CLOUDINIT_SEARCH_DOMAIN="${CLOUDINIT_SEARCH_DOMAIN:-local}" -CLOUDINIT_SSH_KEYS="${CLOUDINIT_SSH_KEYS:-/root/.ssh/authorized_keys}" +CLOUDINIT_SSH_KEYS="${CLOUDINIT_SSH_KEYS:-}" # Empty by default - user must explicitly provide keys # ============================================================================== -# SECTION 2: HELPER FUNCTIONS +# SECTION 2: SSH KEY DISCOVERY AND SELECTION +# ============================================================================== + +# ------------------------------------------------------------------------------ +# _ci_ssh_extract_keys_from_file - Extracts valid SSH public keys from a file +# ------------------------------------------------------------------------------ +function _ci_ssh_extract_keys_from_file() { + local file="$1" + [[ -f "$file" && -r "$file" ]] || return 0 + grep -E '^(ssh-(rsa|ed25519|dss|ecdsa)|ecdsa-sha2-)' "$file" 2>/dev/null || true +} + +# ------------------------------------------------------------------------------ +# _ci_ssh_discover_files - Scans standard paths for SSH keys +# ------------------------------------------------------------------------------ +function _ci_ssh_discover_files() { + local -a cand=() + shopt -s nullglob + cand+=(/root/.ssh/authorized_keys /root/.ssh/authorized_keys2) + cand+=(/root/.ssh/*.pub) + cand+=(/etc/ssh/authorized_keys /etc/ssh/authorized_keys.d/*) + shopt -u nullglob + printf '%s\0' "${cand[@]}" +} + +# ------------------------------------------------------------------------------ +# _ci_ssh_build_choices - Builds whiptail checklist from SSH key files +# +# Sets: CI_SSH_CHOICES (array), CI_SSH_COUNT (int), CI_SSH_MAPFILE (path) +# ------------------------------------------------------------------------------ +function _ci_ssh_build_choices() { + local -a files=("$@") + CI_SSH_CHOICES=() + CI_SSH_COUNT=0 + CI_SSH_MAPFILE="$(mktemp)" + local id key typ fp cmt base + + for f in "${files[@]}"; do + [[ -f "$f" && -r "$f" ]] || continue + base="$(basename -- "$f")" + # Skip known_hosts and private keys + case "$base" in + known_hosts | known_hosts.* | config) continue ;; + id_*) [[ "$f" != *.pub ]] && continue ;; + esac + + while IFS= read -r key; do + [[ -n "$key" ]] || continue + + typ="" + fp="" + cmt="" + read -r _typ _b64 _cmt <<<"$key" + typ="${_typ:-key}" + cmt="${_cmt:-}" + + # Get fingerprint via ssh-keygen if available + if command -v ssh-keygen >/dev/null 2>&1; then + fp="$(printf '%s\n' "$key" | ssh-keygen -lf - 2>/dev/null | awk '{print $2}')" + fi + + # Shorten long comments + [[ ${#cmt} -gt 40 ]] && cmt="${cmt:0:37}..." + + CI_SSH_COUNT=$((CI_SSH_COUNT + 1)) + id="K${CI_SSH_COUNT}" + echo "${id}|${key}" >>"$CI_SSH_MAPFILE" + CI_SSH_CHOICES+=("$id" "[$typ] ${fp:+$fp }${cmt:+$cmt }— ${base}" "OFF") + done < <(_ci_ssh_extract_keys_from_file "$f") + done +} + +# ------------------------------------------------------------------------------ +# configure_cloudinit_ssh_keys - Interactive SSH key selection for Cloud-Init +# +# Usage: configure_cloudinit_ssh_keys +# Sets: CLOUDINIT_SSH_KEYS (path to temporary file with selected keys) +# ------------------------------------------------------------------------------ +function configure_cloudinit_ssh_keys() { + local backtitle="Proxmox VE Helper Scripts" + local ssh_key_mode + + # Create temp file for selected keys + CLOUDINIT_SSH_KEYS_TEMP="$(mktemp)" + : >"$CLOUDINIT_SSH_KEYS_TEMP" + + # Discover keys and build choices + IFS=$'\0' read -r -d '' -a _def_files < <(_ci_ssh_discover_files && printf '\0') + _ci_ssh_build_choices "${_def_files[@]}" + local default_key_count="$CI_SSH_COUNT" + + if [[ "$default_key_count" -gt 0 ]]; then + ssh_key_mode=$(whiptail --backtitle "$backtitle" --title "SSH KEY SOURCE" --menu \ + "Provision SSH keys for Cloud-Init VM:" 14 72 4 \ + "found" "Select from detected keys (${default_key_count})" \ + "manual" "Paste a single public key" \ + "folder" "Scan another folder (path or glob)" \ + "none" "No SSH keys (password auth only)" 3>&1 1>&2 2>&3) || return 1 + else + ssh_key_mode=$(whiptail --backtitle "$backtitle" --title "SSH KEY SOURCE" --menu \ + "No host keys detected. Choose:" 12 72 3 \ + "manual" "Paste a single public key" \ + "folder" "Scan another folder (path or glob)" \ + "none" "No SSH keys (password auth only)" 3>&1 1>&2 2>&3) || return 1 + fi + + case "$ssh_key_mode" in + found) + # Show checklist with individual keys + local selection + selection=$(whiptail --backtitle "$backtitle" --title "SELECT SSH KEYS" \ + --checklist "Select one or more keys to import:" 20 140 10 "${CI_SSH_CHOICES[@]}" 3>&1 1>&2 2>&3) || return 1 + + for tag in $selection; do + tag="${tag%\"}" + tag="${tag#\"}" + local line + line=$(grep -E "^${tag}\|" "$CI_SSH_MAPFILE" | head -n1 | cut -d'|' -f2-) + [[ -n "$line" ]] && printf '%s\n' "$line" >>"$CLOUDINIT_SSH_KEYS_TEMP" + done + local imported + imported=$(wc -l <"$CLOUDINIT_SSH_KEYS_TEMP") + echo -e "${ROOTSSH:- 🔑 }${BOLD}${DGN}SSH Keys: ${BGN}${imported} key(s) selected${CL}" + ;; + manual) + local pubkey + pubkey=$(whiptail --backtitle "$backtitle" --title "PASTE SSH PUBLIC KEY" \ + --inputbox "Paste your SSH public key (ssh-rsa, ssh-ed25519, etc.):" 10 76 3>&1 1>&2 2>&3) || return 1 + if [[ -n "$pubkey" ]]; then + echo "$pubkey" >"$CLOUDINIT_SSH_KEYS_TEMP" + echo -e "${ROOTSSH:- 🔑 }${BOLD}${DGN}SSH Keys: ${BGN}1 key added manually${CL}" + else + echo -e "${ROOTSSH:- 🔑 }${BOLD}${DGN}SSH Keys: ${BGN}none (empty input)${CL}" + CLOUDINIT_SSH_KEYS="" + rm -f "$CLOUDINIT_SSH_KEYS_TEMP" "$CI_SSH_MAPFILE" 2>/dev/null + return 0 + fi + ;; + folder) + local glob_path + glob_path=$(whiptail --backtitle "$backtitle" --title "SCAN FOLDER/GLOB" \ + --inputbox "Enter a folder or glob to scan (e.g. /root/.ssh/*.pub):" 10 72 3>&1 1>&2 2>&3) || return 1 + if [[ -n "$glob_path" ]]; then + shopt -s nullglob + local -a _scan_files=($glob_path) + shopt -u nullglob + if [[ "${#_scan_files[@]}" -gt 0 ]]; then + _ci_ssh_build_choices "${_scan_files[@]}" + if [[ "$CI_SSH_COUNT" -gt 0 ]]; then + local folder_selection + folder_selection=$(whiptail --backtitle "$backtitle" --title "SELECT FOLDER KEYS" \ + --checklist "Select key(s) to import:" 20 140 10 "${CI_SSH_CHOICES[@]}" 3>&1 1>&2 2>&3) || return 1 + for tag in $folder_selection; do + tag="${tag%\"}" + tag="${tag#\"}" + local line + line=$(grep -E "^${tag}\|" "$CI_SSH_MAPFILE" | head -n1 | cut -d'|' -f2-) + [[ -n "$line" ]] && printf '%s\n' "$line" >>"$CLOUDINIT_SSH_KEYS_TEMP" + done + local imported + imported=$(wc -l <"$CLOUDINIT_SSH_KEYS_TEMP") + echo -e "${ROOTSSH:- 🔑 }${BOLD}${DGN}SSH Keys: ${BGN}${imported} key(s) from folder${CL}" + else + whiptail --backtitle "$backtitle" --msgbox "No keys found in: $glob_path" 8 60 + fi + else + whiptail --backtitle "$backtitle" --msgbox "Path/glob returned no files." 8 60 + fi + fi + ;; + none | *) + echo -e "${ROOTSSH:- 🔑 }${BOLD}${DGN}SSH Keys: ${BGN}none (password auth only)${CL}" + CLOUDINIT_SSH_KEYS="" + rm -f "$CLOUDINIT_SSH_KEYS_TEMP" "$CI_SSH_MAPFILE" 2>/dev/null + return 0 + ;; + esac + + # Cleanup mapfile + rm -f "$CI_SSH_MAPFILE" 2>/dev/null + + # Set the variable for setup_cloud_init to use + if [[ -s "$CLOUDINIT_SSH_KEYS_TEMP" ]]; then + CLOUDINIT_SSH_KEYS="$CLOUDINIT_SSH_KEYS_TEMP" + else + CLOUDINIT_SSH_KEYS="" + rm -f "$CLOUDINIT_SSH_KEYS_TEMP" + fi + + return 0 +} + +# ============================================================================== +# SECTION 3: HELPER FUNCTIONS # ============================================================================== # ------------------------------------------------------------------------------ @@ -144,9 +341,10 @@ function setup_cloud_init() { local cipassword=$(openssl rand -base64 16) qm set "$vmid" --cipassword "$cipassword" >/dev/null - # Add SSH keys if available - if [ -f "$CLOUDINIT_SSH_KEYS" ]; then + # Add SSH keys only if explicitly provided (not auto-imported from host) + if [ -n "${CLOUDINIT_SSH_KEYS:-}" ] && [ -f "$CLOUDINIT_SSH_KEYS" ]; then qm set "$vmid" --sshkeys "$CLOUDINIT_SSH_KEYS" >/dev/null 2>&1 || true + _ci_msg_info "SSH keys imported from: $CLOUDINIT_SSH_KEYS" fi # Configure network @@ -459,6 +657,11 @@ export -f wait_for_cloud_init 2>/dev/null || true export -f validate_ip_cidr 2>/dev/null || true export -f validate_ip 2>/dev/null || true +# Restore previous shell options if they were saved +if [ -n "${_OLD_SET_STATE:-}" ]; then + eval "$_OLD_SET_STATE" +fi + # ============================================================================== # SECTION 7: EXAMPLES & DOCUMENTATION # ============================================================================== From 5d5c273fb61a01c076de8bc99259b0d9b04f76d7 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 07:11:37 +0000 Subject: [PATCH 61/93] Update CHANGELOG.md (#11562) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 393a073fd..b04e819a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -406,6 +406,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit - 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)) + ## 2026-02-04 ### 🆕 New Scripts From 06d9199d89d3aaa54127f8b832be42fa6ea39d46 Mon Sep 17 00:00:00 2001 From: "CanbiZ (MickLesk)" <47820557+MickLesk@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:55:32 +0100 Subject: [PATCH 62/93] feat(sqlserver): add SQL Server 2025 with Ubuntu 24.04 support & refactor 2022 (#11546) - Add new SQL Server 2025 scripts with Ubuntu 24.04 support - Refactor both versions to use setup_deb822_repo - Fix debuginfod profile causing update errors (#11522) - Use apt instead of apt-get in CT scripts - Consistent messaging and formatting --- ct/sqlserver2022.sh | 3 +- ct/sqlserver2025.sh | 45 +++++++++++++++++ frontend/public/json/sqlserver2025.json | 52 +++++++++++++++++++ install/sqlserver2022-install.sh | 37 +++++++++----- install/sqlserver2025-install.sh | 66 +++++++++++++++++++++++++ 5 files changed, 190 insertions(+), 13 deletions(-) create mode 100644 ct/sqlserver2025.sh create mode 100644 frontend/public/json/sqlserver2025.json create mode 100644 install/sqlserver2025-install.sh diff --git a/ct/sqlserver2022.sh b/ct/sqlserver2022.sh index 4e41379af..e66baa7e8 100644 --- a/ct/sqlserver2022.sh +++ b/ct/sqlserver2022.sh @@ -27,7 +27,8 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - msg_info "Updating ${APP} LXC" + msg_info "Updating SQL Server 2022" + rm -f /etc/profile.d/debuginfod.sh /etc/profile.d/debuginfod.csh $STD apt update $STD apt -y upgrade msg_ok "Updated successfully!" diff --git a/ct/sqlserver2025.sh b/ct/sqlserver2025.sh new file mode 100644 index 000000000..729c84013 --- /dev/null +++ b/ct/sqlserver2025.sh @@ -0,0 +1,45 @@ +#!/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://www.microsoft.com/en-us/sql-server/sql-server-2025 + +APP="SQL Server 2025" +var_tags="${var_tags:-sql;database}" +var_cpu="${var_cpu:-2}" +var_ram="${var_ram:-2048}" +var_disk="${var_disk:-10}" +var_os="${var_os:-ubuntu}" +var_version="${var_version:-24.04}" +var_unprivileged="${var_unprivileged:-0}" + +header_info "$APP" +variables +color +catch_errors + +function update_script() { + header_info + check_container_storage + check_container_resources + if [[ ! -d /opt/mssql ]]; then + msg_error "No ${APP} Installation Found!" + exit + fi + msg_info "Updating SQL Server 2025" + rm -f /etc/profile.d/debuginfod.sh /etc/profile.d/debuginfod.csh + $STD apt update + $STD apt -y upgrade + msg_ok "Updated successfully!" + 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 IP:${CL}" +echo -e "${TAB}${GATEWAY}${BGN}${IP}:1433${CL}" diff --git a/frontend/public/json/sqlserver2025.json b/frontend/public/json/sqlserver2025.json new file mode 100644 index 000000000..0af9ba70e --- /dev/null +++ b/frontend/public/json/sqlserver2025.json @@ -0,0 +1,52 @@ +{ + "name": "SQL Server 2025", + "slug": "sqlserver2025", + "categories": [ + 8 + ], + "date_created": "2026-02-04", + "type": "ct", + "updateable": true, + "privileged": true, + "interface_port": 1433, + "documentation": "https://learn.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver17", + "website": "https://www.microsoft.com/en-us/sql-server/sql-server-2025", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/microsoft-sql-server.webp", + "config_path": "", + "description": "Script to automatically set up a SQL Server 2025 installation with Ubuntu 24.04 support.", + "install_methods": [ + { + "type": "default", + "script": "ct/sqlserver2025.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "Ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If you choose not to run the installation setup, execute: `/opt/mssql/bin/mssql-conf setup` in LXC shell.", + "type": "info" + }, + { + "text": "You can setup the admin account 'SA' during installation", + "type": "info" + }, + { + "text": "Make sure you disable the SA account if you intend to use this in production!", + "type": "warning" + }, + { + "text": "Ubuntu 24.04 support requires SQL Server 2025 CU1 or later", + "type": "info" + } + ] +} diff --git a/install/sqlserver2022-install.sh b/install/sqlserver2022-install.sh index c074bddcb..9fc4f4161 100644 --- a/install/sqlserver2022-install.sh +++ b/install/sqlserver2022-install.sh @@ -14,24 +14,32 @@ network_check update_os msg_info "Installing Dependencies" -$STD apt install -y \ - coreutils +$STD apt install -y coreutils msg_ok "Installed Dependencies" -msg_info "Setup SQL Server 2022" -curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc >/dev/null -curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | tee /etc/apt/sources.list.d/mssql-server-2022.list >/dev/null -$STD apt-get update -y -$STD apt-get install -y mssql-server -msg_ok "Setup Server 2022" +msg_info "Setting up SQL Server 2022 Repository" +setup_deb822_repo \ + "mssql-server-2022" \ + "https://packages.microsoft.com/keys/microsoft.asc" \ + "https://packages.microsoft.com/ubuntu/22.04/mssql-server-2022" \ + "./" \ + "" +msg_ok "Repository configured" + +msg_info "Installing SQL Server 2022" +$STD apt install -y mssql-server +msg_ok "Installed SQL Server 2022" msg_info "Installing SQL Server Tools" export DEBIAN_FRONTEND=noninteractive export ACCEPT_EULA=Y -curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc >/dev/null -curl -fsSL https://packages.microsoft.com/config/ubuntu/22.04/prod.list | tee /etc/apt/sources.list.d/mssql-release.list >/dev/null -$STD apt-get update -$STD apt-get install -y -qq \ +setup_deb822_repo \ + "mssql-release" \ + "https://packages.microsoft.com/keys/microsoft.asc" \ + "https://packages.microsoft.com/ubuntu/22.04/prod" \ + "jammy" \ + "main" +$STD apt-get install -y \ mssql-tools18 \ unixodbc-dev echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >>~/.bash_profile @@ -49,6 +57,11 @@ msg_info "Start Service" systemctl enable -q --now mssql-server msg_ok "Service started" +msg_info "Cleaning up" +rm -f /etc/profile.d/debuginfod.sh +rm -f /etc/profile.d/debuginfod.csh +msg_ok "Cleaned up" + motd_ssh customize cleanup_lxc diff --git a/install/sqlserver2025-install.sh b/install/sqlserver2025-install.sh new file mode 100644 index 000000000..748cd5dcb --- /dev/null +++ b/install/sqlserver2025-install.sh @@ -0,0 +1,66 @@ +#!/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://www.microsoft.com/en-us/sql-server/sql-server-2025 + +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 coreutils +msg_ok "Installed Dependencies" + +msg_info "Setting up SQL Server 2025 Repository" +setup_deb822_repo \ + "mssql-server-2025" \ + "https://packages.microsoft.com/keys/microsoft.asc" \ + "https://packages.microsoft.com/ubuntu/24.04/mssql-server-2025" \ + "./" \ + "" +msg_ok "Repository configured" + +msg_info "Installing SQL Server 2025" +$STD apt install -y mssql-server +msg_ok "Installed SQL Server 2025" + +msg_info "Installing SQL Server Tools" +export DEBIAN_FRONTEND=noninteractive +export ACCEPT_EULA=Y +setup_deb822_repo \ + "mssql-release" \ + "https://packages.microsoft.com/keys/microsoft.asc" \ + "https://packages.microsoft.com/ubuntu/24.04/prod" \ + "noble" \ + "main" +$STD apt-get install -y \ + mssql-tools18 \ + unixodbc-dev +echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >>~/.bash_profile +source ~/.bash_profile +msg_ok "Installed SQL Server Tools" + +read -r -p "${TAB3}Do you want to run the SQL Server setup now? (Later is also possible) " prompt +if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then + /opt/mssql/bin/mssql-conf setup +else + msg_ok "Skipping SQL Server setup. You can run it later with '/opt/mssql/bin/mssql-conf setup'." +fi + +msg_info "Starting SQL Server Service" +systemctl enable -q --now mssql-server +msg_ok "Service started" + +msg_info "Cleaning up" +rm -f /etc/profile.d/debuginfod.sh /etc/profile.d/debuginfod.csh +msg_ok "Cleaned up" + +motd_ssh +customize +cleanup_lxc From 273c5c75ee7c11a94db94d2474fa769ed90b483e Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:55:52 +0000 Subject: [PATCH 63/93] Update date in json (#11568) Co-authored-by: GitHub Actions --- frontend/public/json/sqlserver2025.json | 98 ++++++++++++------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/frontend/public/json/sqlserver2025.json b/frontend/public/json/sqlserver2025.json index 0af9ba70e..6e7830c42 100644 --- a/frontend/public/json/sqlserver2025.json +++ b/frontend/public/json/sqlserver2025.json @@ -1,52 +1,52 @@ { - "name": "SQL Server 2025", - "slug": "sqlserver2025", - "categories": [ - 8 - ], - "date_created": "2026-02-04", - "type": "ct", - "updateable": true, - "privileged": true, - "interface_port": 1433, - "documentation": "https://learn.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver17", - "website": "https://www.microsoft.com/en-us/sql-server/sql-server-2025", - "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/microsoft-sql-server.webp", - "config_path": "", - "description": "Script to automatically set up a SQL Server 2025 installation with Ubuntu 24.04 support.", - "install_methods": [ - { - "type": "default", - "script": "ct/sqlserver2025.sh", - "resources": { - "cpu": 2, - "ram": 2048, - "hdd": 10, - "os": "Ubuntu", - "version": "24.04" - } - } - ], - "default_credentials": { - "username": null, - "password": null + "name": "SQL Server 2025", + "slug": "sqlserver2025", + "categories": [ + 8 + ], + "date_created": "2026-02-05", + "type": "ct", + "updateable": true, + "privileged": true, + "interface_port": 1433, + "documentation": "https://learn.microsoft.com/en-us/sql/sql-server/?view=sql-server-ver17", + "website": "https://www.microsoft.com/en-us/sql-server/sql-server-2025", + "logo": "https://cdn.jsdelivr.net/gh/selfhst/icons@main/webp/microsoft-sql-server.webp", + "config_path": "", + "description": "Script to automatically set up a SQL Server 2025 installation with Ubuntu 24.04 support.", + "install_methods": [ + { + "type": "default", + "script": "ct/sqlserver2025.sh", + "resources": { + "cpu": 2, + "ram": 2048, + "hdd": 10, + "os": "Ubuntu", + "version": "24.04" + } + } + ], + "default_credentials": { + "username": null, + "password": null + }, + "notes": [ + { + "text": "If you choose not to run the installation setup, execute: `/opt/mssql/bin/mssql-conf setup` in LXC shell.", + "type": "info" }, - "notes": [ - { - "text": "If you choose not to run the installation setup, execute: `/opt/mssql/bin/mssql-conf setup` in LXC shell.", - "type": "info" - }, - { - "text": "You can setup the admin account 'SA' during installation", - "type": "info" - }, - { - "text": "Make sure you disable the SA account if you intend to use this in production!", - "type": "warning" - }, - { - "text": "Ubuntu 24.04 support requires SQL Server 2025 CU1 or later", - "type": "info" - } - ] + { + "text": "You can setup the admin account 'SA' during installation", + "type": "info" + }, + { + "text": "Make sure you disable the SA account if you intend to use this in production!", + "type": "warning" + }, + { + "text": "Ubuntu 24.04 support requires SQL Server 2025 CU1 or later", + "type": "info" + } + ] } From b61abacb7667c734ec52d25fa7aeafed59abe800 Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:55:58 +0000 Subject: [PATCH 64/93] Update CHANGELOG.md (#11569) Co-authored-by: github-actions[bot] --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b04e819a3..26ecc78b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -400,6 +400,10 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit ## 2026-02-05 +### 🆕 New Scripts + + - New: SQL-Server 2025 | Refactor SQL-Server 2022 [@MickLesk](https://github.com/MickLesk) ([#11546](https://github.com/community-scripts/ProxmoxVE/pull/11546)) + ### 🚀 Updated Scripts - #### ✨ New Features From 833a6a248b67d2b11ad2b679b8c59f4d2012f52f Mon Sep 17 00:00:00 2001 From: "community-scripts-pr-app[bot]" <189241966+community-scripts-pr-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 12:02:06 +0100 Subject: [PATCH 66/93] Update .app files (#11570) Co-authored-by: GitHub Actions --- ct/headers/sqlserver2025 | 6 ++++++ vm/headers/docker-vm | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 ct/headers/sqlserver2025 create mode 100644 vm/headers/docker-vm diff --git a/ct/headers/sqlserver2025 b/ct/headers/sqlserver2025 new file mode 100644 index 000000000..44cbdbe4a --- /dev/null +++ b/ct/headers/sqlserver2025 @@ -0,0 +1,6 @@ + _____ ____ __ _____ ___ ____ ___ ______ + / ___// __ \ / / / ___/___ ______ _____ _____ |__ \ / __ \__ \ / ____/ + \__ \/ / / / / / \__ \/ _ \/ ___/ | / / _ \/ ___/ __/ // / / /_/ //___ \ + ___/ / /_/ / / /___ ___/ / __/ / | |/ / __/ / / __// /_/ / __/____/ / +/____/\___\_\/_____/ /____/\___/_/ |___/\___/_/ /____/\____/____/_____/ + diff --git a/vm/headers/docker-vm b/vm/headers/docker-vm new file mode 100644 index 000000000..907ffbaef --- /dev/null +++ b/vm/headers/docker-vm @@ -0,0 +1,6 @@ + ____ __ + / __ \____ _____/ /_____ _____ + / / / / __ \/ ___/ //_/ _ \/ ___/ + / /_/ / /_/ / /__/ ,< / __/ / +/_____/\____/\___/_/|_|\___/_/ + From 8f97908896b2651f76f1b77ffbea4129a33711a6 Mon Sep 17 00:00:00 2001 From: ls-root Date: Thu, 5 Feb 2026 12:37:22 +0100 Subject: [PATCH 67/93] fix(frontend): theme respective syntax highlighting (#11565) Now if the user is in light mode the syntax highlighting switches to light mode too. --- frontend/src/app/json-editor/page.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/json-editor/page.tsx b/frontend/src/app/json-editor/page.tsx index f8dc22c47..fbaf7d544 100644 --- a/frontend/src/app/json-editor/page.tsx +++ b/frontend/src/app/json-editor/page.tsx @@ -29,9 +29,10 @@ import { ScriptSchema } from "./_schemas/schemas"; import Categories from "./_components/categories"; import Note from "./_components/note"; -import { nord } from "react-syntax-highlighter/dist/esm/styles/hljs"; +import { githubGist, nord } from "react-syntax-highlighter/dist/esm/styles/hljs"; import SyntaxHighlighter from "react-syntax-highlighter"; import { ScriptItem } from "../scripts/_components/script-item"; +import { useTheme } from "next-themes"; const initialScript: Script = { name: "", @@ -58,6 +59,7 @@ const initialScript: Script = { }; export default function JSONGenerator() { + const { theme } = useTheme(); const [script, setScript] = useState