mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-03-10 19:14:56 +00:00
Compare commits
2 Commits
automated/
...
MickLesk-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b0f3afaf7 | ||
|
|
9c0fd64754 |
140
.github/workflows/close_issue_in_dev.yaml
generated
vendored
140
.github/workflows/close_issue_in_dev.yaml
generated
vendored
@@ -6,14 +6,14 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
close_issue:
|
close_issue:
|
||||||
if: github.event.pull_request.merged == true && github.repository == 'community-scripts/ProxmoxVE'
|
if: github.event.pull_request.merged == true && github.repository == 'community-scripts/ProxmoxVE'
|
||||||
runs-on: self-hosted
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout target repo (merge commit)
|
- name: Checkout target repo (main)
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: community-scripts/ProxmoxVE
|
repository: community-scripts/ProxmoxVE
|
||||||
ref: ${{ github.event.pull_request.merge_commit_sha }}
|
ref: main
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Extract and Process PR Title
|
- name: Extract and Process PR Title
|
||||||
@@ -23,39 +23,6 @@ jobs:
|
|||||||
echo "Processed Title: $title"
|
echo "Processed Title: $title"
|
||||||
echo "title=$title" >> $GITHUB_ENV
|
echo "title=$title" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Get slugs from merged PR
|
|
||||||
id: get_slugs
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
pr_files=$(gh pr view ${{ github.event.pull_request.number }} --repo community-scripts/ProxmoxVE --json files -q '.files[].path' 2>/dev/null || true)
|
|
||||||
slugs=""
|
|
||||||
for path in $pr_files; do
|
|
||||||
[[ -f "$path" ]] || continue
|
|
||||||
if [[ "$path" == frontend/public/json/*.json ]]; then
|
|
||||||
s=$(jq -r '.slug // empty' "$path" 2>/dev/null)
|
|
||||||
[[ -n "$s" ]] && slugs="$slugs $s"
|
|
||||||
elif [[ "$path" == ct/*.sh ]] || [[ "$path" == install/*.sh ]] || [[ "$path" == tools/*.sh ]] || [[ "$path" == turnkey/*.sh ]] || [[ "$path" == vm/*.sh ]]; then
|
|
||||||
base=$(basename "$path" .sh)
|
|
||||||
if [[ "$path" == install/* && "$base" == *-install ]]; then
|
|
||||||
s="${base%-install}"
|
|
||||||
else
|
|
||||||
s="$base"
|
|
||||||
fi
|
|
||||||
[[ -n "$s" ]] && slugs="$slugs $s"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
slugs=$(echo $slugs | xargs -n1 | sort -u | tr '\n' ' ')
|
|
||||||
if [[ -z "$slugs" && -n "$title" ]]; then
|
|
||||||
slugs="$title"
|
|
||||||
fi
|
|
||||||
if [[ -z "$slugs" ]]; then
|
|
||||||
echo "count=0" >> "$GITHUB_OUTPUT"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "$slugs" > pocketbase_slugs.txt
|
|
||||||
echo "count=$(echo $slugs | wc -w)" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
- name: Search for Issues with Similar Titles
|
- name: Search for Issues with Similar Titles
|
||||||
id: find_issue
|
id: find_issue
|
||||||
env:
|
env:
|
||||||
@@ -96,104 +63,3 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
gh issue comment $issue_number --repo community-scripts/ProxmoxVED --body "Merged with #${{ github.event.pull_request.number }} in ProxmoxVE"
|
gh issue comment $issue_number --repo community-scripts/ProxmoxVED --body "Merged with #${{ github.event.pull_request.number }} in ProxmoxVE"
|
||||||
gh issue close $issue_number --repo community-scripts/ProxmoxVED
|
gh issue close $issue_number --repo community-scripts/ProxmoxVED
|
||||||
|
|
||||||
- name: Set is_dev to false in PocketBase
|
|
||||||
if: steps.get_slugs.outputs.count != '0'
|
|
||||||
env:
|
|
||||||
POCKETBASE_URL: ${{ secrets.POCKETBASE_URL }}
|
|
||||||
POCKETBASE_COLLECTION: ${{ secrets.POCKETBASE_COLLECTION }}
|
|
||||||
POCKETBASE_ADMIN_EMAIL: ${{ secrets.POCKETBASE_ADMIN_EMAIL }}
|
|
||||||
POCKETBASE_ADMIN_PASSWORD: ${{ secrets.POCKETBASE_ADMIN_PASSWORD }}
|
|
||||||
PR_URL: ${{ github.server_url }}/${{ github.repository }}/pull/${{ github.event.pull_request.number }}
|
|
||||||
run: |
|
|
||||||
node << 'ENDSCRIPT'
|
|
||||||
(async function() {
|
|
||||||
const fs = require('fs');
|
|
||||||
const https = require('https');
|
|
||||||
const http = require('http');
|
|
||||||
const url = require('url');
|
|
||||||
|
|
||||||
function request(fullUrl, opts) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
const u = url.parse(fullUrl);
|
|
||||||
const isHttps = u.protocol === 'https:';
|
|
||||||
const body = opts.body;
|
|
||||||
const options = {
|
|
||||||
hostname: u.hostname,
|
|
||||||
port: u.port || (isHttps ? 443 : 80),
|
|
||||||
path: u.path,
|
|
||||||
method: opts.method || 'GET',
|
|
||||||
headers: opts.headers || {}
|
|
||||||
};
|
|
||||||
if (body) options.headers['Content-Length'] = Buffer.byteLength(body);
|
|
||||||
const lib = isHttps ? https : http;
|
|
||||||
const req = lib.request(options, function(res) {
|
|
||||||
let data = '';
|
|
||||||
res.on('data', function(chunk) { data += chunk; });
|
|
||||||
res.on('end', function() {
|
|
||||||
resolve({ ok: res.statusCode >= 200 && res.statusCode < 300, statusCode: res.statusCode, body: data });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
req.on('error', reject);
|
|
||||||
if (body) req.write(body);
|
|
||||||
req.end();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const raw = process.env.POCKETBASE_URL.replace(/\/$/, '');
|
|
||||||
const apiBase = /\/api$/i.test(raw) ? raw : raw + '/api';
|
|
||||||
const coll = process.env.POCKETBASE_COLLECTION;
|
|
||||||
const slugsText = fs.readFileSync('pocketbase_slugs.txt', 'utf8').trim();
|
|
||||||
const slugs = slugsText ? slugsText.split(/\s+/).filter(Boolean) : [];
|
|
||||||
if (slugs.length === 0) {
|
|
||||||
console.log('No slugs to update.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const authUrl = apiBase + '/collections/users/auth-with-password';
|
|
||||||
const authBody = JSON.stringify({
|
|
||||||
identity: process.env.POCKETBASE_ADMIN_EMAIL,
|
|
||||||
password: process.env.POCKETBASE_ADMIN_PASSWORD
|
|
||||||
});
|
|
||||||
const authRes = await request(authUrl, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Content-Type': 'application/json' },
|
|
||||||
body: authBody
|
|
||||||
});
|
|
||||||
if (!authRes.ok) {
|
|
||||||
throw new Error('Auth failed: ' + authRes.body);
|
|
||||||
}
|
|
||||||
const token = JSON.parse(authRes.body).token;
|
|
||||||
const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
|
|
||||||
const prUrl = process.env.PR_URL || '';
|
|
||||||
|
|
||||||
for (const slug of slugs) {
|
|
||||||
const filter = "(slug='" + slug.replace(/'/g, "''") + "')";
|
|
||||||
const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', {
|
|
||||||
headers: { 'Authorization': token }
|
|
||||||
});
|
|
||||||
const list = JSON.parse(listRes.body);
|
|
||||||
const record = list.items && list.items[0];
|
|
||||||
if (!record) {
|
|
||||||
console.log('Slug not in DB, skipping: ' + slug);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const patchRes = await request(recordsUrl + '/' + record.id, {
|
|
||||||
method: 'PATCH',
|
|
||||||
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
|
||||||
body: JSON.stringify({
|
|
||||||
name: record.name || record.slug,
|
|
||||||
last_update_commit: prUrl,
|
|
||||||
is_dev: false
|
|
||||||
})
|
|
||||||
});
|
|
||||||
if (!patchRes.ok) {
|
|
||||||
console.warn('PATCH failed for slug ' + slug + ': ' + patchRes.body);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
console.log('Set is_dev=false for slug: ' + slug);
|
|
||||||
}
|
|
||||||
console.log('Done.');
|
|
||||||
})().catch(e => { console.error(e); process.exit(1); });
|
|
||||||
ENDSCRIPT
|
|
||||||
shell: bash
|
|
||||||
|
|||||||
167
.github/workflows/update-script-timestamp-on-sh-change.yml
generated
vendored
167
.github/workflows/update-script-timestamp-on-sh-change.yml
generated
vendored
@@ -1,167 +0,0 @@
|
|||||||
name: Update script timestamp on .sh changes
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- "ct/**/*.sh"
|
|
||||||
- "install/**/*.sh"
|
|
||||||
- "tools/**/*.sh"
|
|
||||||
- "turnkey/**/*.sh"
|
|
||||||
- "vm/**/*.sh"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
update-script-timestamp:
|
|
||||||
runs-on: self-hosted
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Get changed .sh files and derive slugs
|
|
||||||
id: slugs
|
|
||||||
run: |
|
|
||||||
changed=$(git diff --name-only "${{ github.event.before }}" "${{ github.event.after }}" -- ct/ install/ tools/ turnkey/ vm/ | grep '\.sh$' || true)
|
|
||||||
if [[ -z "$changed" ]]; then
|
|
||||||
echo "No .sh files changed in ct/, install/, tools/, turnkey/, or vm/."
|
|
||||||
echo "count=0" >> "$GITHUB_OUTPUT"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
declare -A seen
|
|
||||||
slugs=""
|
|
||||||
for f in $changed; do
|
|
||||||
[[ -f "$f" ]] || continue
|
|
||||||
base="${f##*/}"
|
|
||||||
base="${base%.sh}"
|
|
||||||
if [[ "$f" == install/* && "$base" == *-install ]]; then
|
|
||||||
slug="${base%-install}"
|
|
||||||
else
|
|
||||||
slug="$base"
|
|
||||||
fi
|
|
||||||
if [[ -z "${seen[$slug]:-}" ]]; then
|
|
||||||
seen[$slug]=1
|
|
||||||
slugs="$slugs $slug"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
slugs=$(echo $slugs | xargs -n1 | sort -u)
|
|
||||||
if [[ -z "$slugs" ]]; then
|
|
||||||
echo "No slugs to update."
|
|
||||||
echo "count=0" >> "$GITHUB_OUTPUT"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "$slugs" > changed_slugs.txt
|
|
||||||
echo "count=$(echo "$slugs" | wc -w)" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
- name: Parse PR number from merge commit
|
|
||||||
id: pr
|
|
||||||
run: |
|
|
||||||
re='#([0-9]+)'
|
|
||||||
if [[ "$COMMIT_MSG" =~ $re ]]; then
|
|
||||||
echo "number=${BASH_REMATCH[1]}" >> "$GITHUB_OUTPUT"
|
|
||||||
else
|
|
||||||
echo "number=" >> "$GITHUB_OUTPUT"
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
COMMIT_MSG: ${{ github.event.head_commit.message }}
|
|
||||||
|
|
||||||
- name: Update script timestamps in PocketBase
|
|
||||||
if: steps.slugs.outputs.count != '0'
|
|
||||||
env:
|
|
||||||
POCKETBASE_URL: ${{ secrets.POCKETBASE_URL }}
|
|
||||||
POCKETBASE_COLLECTION: ${{ secrets.POCKETBASE_COLLECTION }}
|
|
||||||
POCKETBASE_ADMIN_EMAIL: ${{ secrets.POCKETBASE_ADMIN_EMAIL }}
|
|
||||||
POCKETBASE_ADMIN_PASSWORD: ${{ secrets.POCKETBASE_ADMIN_PASSWORD }}
|
|
||||||
COMMIT_URL: ${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}
|
|
||||||
PR_URL: ${{ steps.pr.outputs.number != '' && format('{0}/{1}/pull/{2}', github.server_url, github.repository, steps.pr.outputs.number) || '' }}
|
|
||||||
run: |
|
|
||||||
node << 'ENDSCRIPT'
|
|
||||||
(async function() {
|
|
||||||
const fs = require('fs');
|
|
||||||
const https = require('https');
|
|
||||||
const http = require('http');
|
|
||||||
const url = require('url');
|
|
||||||
|
|
||||||
function request(fullUrl, opts) {
|
|
||||||
return new Promise(function(resolve, reject) {
|
|
||||||
const u = url.parse(fullUrl);
|
|
||||||
const isHttps = u.protocol === 'https:';
|
|
||||||
const body = opts.body;
|
|
||||||
const options = {
|
|
||||||
hostname: u.hostname,
|
|
||||||
port: u.port || (isHttps ? 443 : 80),
|
|
||||||
path: u.path,
|
|
||||||
method: opts.method || 'GET',
|
|
||||||
headers: opts.headers || {}
|
|
||||||
};
|
|
||||||
if (body) options.headers['Content-Length'] = Buffer.byteLength(body);
|
|
||||||
const lib = isHttps ? https : http;
|
|
||||||
const req = lib.request(options, function(res) {
|
|
||||||
let data = '';
|
|
||||||
res.on('data', function(chunk) { data += chunk; });
|
|
||||||
res.on('end', function() {
|
|
||||||
resolve({ ok: res.statusCode >= 200 && res.statusCode < 300, statusCode: res.statusCode, body: data });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
req.on('error', reject);
|
|
||||||
if (body) req.write(body);
|
|
||||||
req.end();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const raw = process.env.POCKETBASE_URL.replace(/\/$/, '');
|
|
||||||
const apiBase = /\/api$/i.test(raw) ? raw : raw + '/api';
|
|
||||||
const coll = process.env.POCKETBASE_COLLECTION;
|
|
||||||
const slugsText = fs.readFileSync('changed_slugs.txt', 'utf8').trim();
|
|
||||||
const slugs = slugsText ? slugsText.split(/\s+/).filter(Boolean) : [];
|
|
||||||
if (slugs.length === 0) {
|
|
||||||
console.log('No slugs to update.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const authUrl = apiBase + '/collections/users/auth-with-password';
|
|
||||||
const authBody = JSON.stringify({
|
|
||||||
identity: process.env.POCKETBASE_ADMIN_EMAIL,
|
|
||||||
password: process.env.POCKETBASE_ADMIN_PASSWORD
|
|
||||||
});
|
|
||||||
const authRes = await request(authUrl, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Content-Type': 'application/json' },
|
|
||||||
body: authBody
|
|
||||||
});
|
|
||||||
if (!authRes.ok) {
|
|
||||||
throw new Error('Auth failed: ' + authRes.body);
|
|
||||||
}
|
|
||||||
const token = JSON.parse(authRes.body).token;
|
|
||||||
const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
|
|
||||||
|
|
||||||
for (const slug of slugs) {
|
|
||||||
const filter = "(slug='" + slug.replace(/'/g, "''") + "')";
|
|
||||||
const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1', {
|
|
||||||
headers: { 'Authorization': token }
|
|
||||||
});
|
|
||||||
const list = JSON.parse(listRes.body);
|
|
||||||
const record = list.items && list.items[0];
|
|
||||||
if (!record) {
|
|
||||||
console.log('Slug not in DB, skipping: ' + slug);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const patchRes = await request(recordsUrl + '/' + record.id, {
|
|
||||||
method: 'PATCH',
|
|
||||||
headers: { 'Authorization': token, 'Content-Type': 'application/json' },
|
|
||||||
body: JSON.stringify({
|
|
||||||
name: record.name || record.slug,
|
|
||||||
last_update_commit: process.env.PR_URL || process.env.COMMIT_URL || ''
|
|
||||||
})
|
|
||||||
});
|
|
||||||
if (!patchRes.ok) {
|
|
||||||
console.warn('PATCH failed for slug ' + slug + ': ' + patchRes.body);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
console.log('Updated timestamp for slug: ' + slug);
|
|
||||||
}
|
|
||||||
console.log('Done.');
|
|
||||||
})().catch(e => { console.error(e); process.exit(1); });
|
|
||||||
ENDSCRIPT
|
|
||||||
shell: bash
|
|
||||||
20
CHANGELOG.md
20
CHANGELOG.md
@@ -420,26 +420,12 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 2026-03-10
|
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
|
||||||
|
|
||||||
- [Fix] Immich: Pin libvips to 8.17.3 [@vhsdream](https://github.com/vhsdream) ([#12744](https://github.com/community-scripts/ProxmoxVE/pull/12744))
|
|
||||||
|
|
||||||
## 2026-03-09
|
## 2026-03-09
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|
||||||
- Pin Opencloud to 5.2.0 [@vhsdream](https://github.com/vhsdream) ([#12721](https://github.com/community-scripts/ProxmoxVE/pull/12721))
|
|
||||||
|
|
||||||
- #### 🐞 Bug Fixes
|
- #### 🐞 Bug Fixes
|
||||||
|
|
||||||
- [Hotfix] qBittorrent: Disable UPnP port forwarding by default [@vhsdream](https://github.com/vhsdream) ([#12728](https://github.com/community-scripts/ProxmoxVE/pull/12728))
|
|
||||||
- [Quickfix] Opencloud: ensure correct case for binary [@vhsdream](https://github.com/vhsdream) ([#12729](https://github.com/community-scripts/ProxmoxVE/pull/12729))
|
|
||||||
- Omada: Bump libssl [@MickLesk](https://github.com/MickLesk) ([#12724](https://github.com/community-scripts/ProxmoxVE/pull/12724))
|
|
||||||
- openwebui: Ensure required dependencies [@MickLesk](https://github.com/MickLesk) ([#12717](https://github.com/community-scripts/ProxmoxVE/pull/12717))
|
|
||||||
- Frigate: try an OpenVino model build fallback [@MickLesk](https://github.com/MickLesk) ([#12704](https://github.com/community-scripts/ProxmoxVE/pull/12704))
|
- Frigate: try an OpenVino model build fallback [@MickLesk](https://github.com/MickLesk) ([#12704](https://github.com/community-scripts/ProxmoxVE/pull/12704))
|
||||||
- Change cronjob setup to use www-data user [@opastorello](https://github.com/opastorello) ([#12695](https://github.com/community-scripts/ProxmoxVE/pull/12695))
|
- Change cronjob setup to use www-data user [@opastorello](https://github.com/opastorello) ([#12695](https://github.com/community-scripts/ProxmoxVE/pull/12695))
|
||||||
- RustDesk Server: Fix check_for_gh_release function call [@tremor021](https://github.com/tremor021) ([#12694](https://github.com/community-scripts/ProxmoxVE/pull/12694))
|
- RustDesk Server: Fix check_for_gh_release function call [@tremor021](https://github.com/tremor021) ([#12694](https://github.com/community-scripts/ProxmoxVE/pull/12694))
|
||||||
@@ -459,12 +445,6 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
|||||||
- tools: add Alpine (apk) support to ensure_dependencies and is_package_installed [@MickLesk](https://github.com/MickLesk) ([#12703](https://github.com/community-scripts/ProxmoxVE/pull/12703))
|
- tools: add Alpine (apk) support to ensure_dependencies and is_package_installed [@MickLesk](https://github.com/MickLesk) ([#12703](https://github.com/community-scripts/ProxmoxVE/pull/12703))
|
||||||
- tools.func: extend hwaccel with ROCm [@MickLesk](https://github.com/MickLesk) ([#12707](https://github.com/community-scripts/ProxmoxVE/pull/12707))
|
- tools.func: extend hwaccel with ROCm [@MickLesk](https://github.com/MickLesk) ([#12707](https://github.com/community-scripts/ProxmoxVE/pull/12707))
|
||||||
|
|
||||||
### 🌐 Website
|
|
||||||
|
|
||||||
- #### ✨ New Features
|
|
||||||
|
|
||||||
- feat: add CopycatWarningToast component for user warnings [@BramSuurdje](https://github.com/BramSuurdje) ([#12733](https://github.com/community-scripts/ProxmoxVE/pull/12733))
|
|
||||||
|
|
||||||
## 2026-03-08
|
## 2026-03-08
|
||||||
|
|
||||||
### 🚀 Updated Scripts
|
### 🚀 Updated Scripts
|
||||||
|
|||||||
@@ -380,7 +380,7 @@ function compile_imagemagick() {
|
|||||||
|
|
||||||
function compile_libvips() {
|
function compile_libvips() {
|
||||||
SOURCE=$SOURCE_DIR/libvips
|
SOURCE=$SOURCE_DIR/libvips
|
||||||
LIBVIPS_REVISION="0c9151a4f416d2f8ae20a755db218f6637050eec"
|
: "${LIBVIPS_REVISION:=$(jq -cr '.revision' "$BASE_DIR"/server/sources/libvips.json)}"
|
||||||
if [[ "$LIBVIPS_REVISION" != "$(grep 'libvips' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
if [[ "$LIBVIPS_REVISION" != "$(grep 'libvips' ~/.immich_library_revisions | awk '{print $2}')" ]]; then
|
||||||
msg_info "Recompiling libvips"
|
msg_info "Recompiling libvips"
|
||||||
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
[[ -d "$SOURCE" ]] && rm -rf "$SOURCE"
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ function update_script() {
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
RELEASE="v5.2.0"
|
RELEASE="v5.1.0"
|
||||||
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
if check_for_gh_release "OpenCloud" "opencloud-eu/opencloud" "${RELEASE}"; then
|
||||||
msg_info "Stopping services"
|
msg_info "Stopping services"
|
||||||
systemctl stop opencloud opencloud-wopi
|
systemctl stop opencloud opencloud-wopi
|
||||||
@@ -41,9 +41,7 @@ function update_script() {
|
|||||||
ensure_dependencies "inotify-tools"
|
ensure_dependencies "inotify-tools"
|
||||||
msg_ok "Updated packages"
|
msg_ok "Updated packages"
|
||||||
|
|
||||||
rm -f /usr/bin/{OpenCloud,opencloud}
|
|
||||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-amd64"
|
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "${RELEASE}" "/usr/bin" "opencloud-*-linux-amd64"
|
||||||
mv /usr/bin/OpenCloud /usr/bin/opencloud
|
|
||||||
|
|
||||||
if ! grep -q 'POSIX_WATCH' /etc/opencloud/opencloud.env; then
|
if ! grep -q 'POSIX_WATCH' /etc/opencloud/opencloud.env; then
|
||||||
sed -i '/^## External/i ## Uncomment below to enable PosixFS Collaborative Mode\
|
sed -i '/^## External/i ## Uncomment below to enable PosixFS Collaborative Mode\
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ function update_script() {
|
|||||||
msg_ok "Stopped Service"
|
msg_ok "Stopped Service"
|
||||||
|
|
||||||
msg_info "Creating Backup"
|
msg_info "Creating Backup"
|
||||||
ensure_dependencies zstd
|
|
||||||
mkdir -p /opt/{backups,z2m_backup}
|
mkdir -p /opt/{backups,z2m_backup}
|
||||||
BACKUP_VERSION="$(<"$HOME/.zigbee2mqtt")"
|
BACKUP_VERSION="$(<"$HOME/.zigbee2mqtt")"
|
||||||
BACKUP_FILE="/opt/backups/${APP}_backup_${BACKUP_VERSION}.tar.zst"
|
BACKUP_FILE="/opt/backups/${APP}_backup_${BACKUP_VERSION}.tar.zst"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"generated": "2026-03-10T18:17:10Z",
|
"generated": "2026-03-09T12:12:17Z",
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
{
|
||||||
"slug": "2fauth",
|
"slug": "2fauth",
|
||||||
@@ -11,9 +11,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "adguard",
|
"slug": "adguard",
|
||||||
"repo": "AdguardTeam/AdGuardHome",
|
"repo": "AdguardTeam/AdGuardHome",
|
||||||
"version": "v0.107.73",
|
"version": "v0.107.72",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T17:23:23Z"
|
"date": "2026-02-19T15:37:49Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "adguardhome-sync",
|
"slug": "adguardhome-sync",
|
||||||
@@ -116,9 +116,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "bentopdf",
|
"slug": "bentopdf",
|
||||||
"repo": "alam00000/bentopdf",
|
"repo": "alam00000/bentopdf",
|
||||||
"version": "v2.5.0",
|
"version": "v2.4.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T08:40:54Z"
|
"date": "2026-03-07T09:14:39Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "beszel",
|
"slug": "beszel",
|
||||||
@@ -200,9 +200,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "cleanuparr",
|
"slug": "cleanuparr",
|
||||||
"repo": "Cleanuparr/Cleanuparr",
|
"repo": "Cleanuparr/Cleanuparr",
|
||||||
"version": "v2.7.8",
|
"version": "v2.7.7",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T16:03:47Z"
|
"date": "2026-03-02T13:08:32Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "cloudreve",
|
"slug": "cloudreve",
|
||||||
@@ -228,9 +228,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "configarr",
|
"slug": "configarr",
|
||||||
"repo": "raydak-labs/configarr",
|
"repo": "raydak-labs/configarr",
|
||||||
"version": "v1.24.0",
|
"version": "v1.23.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-09T15:16:08Z"
|
"date": "2026-02-23T12:28:13Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "convertx",
|
"slug": "convertx",
|
||||||
@@ -473,9 +473,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "gokapi",
|
"slug": "gokapi",
|
||||||
"repo": "Forceu/Gokapi",
|
"repo": "Forceu/Gokapi",
|
||||||
"version": "v2.2.4",
|
"version": "v2.2.3",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T15:44:19Z"
|
"date": "2026-03-04T21:29:16Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "gotify",
|
"slug": "gotify",
|
||||||
@@ -557,9 +557,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "homebox",
|
"slug": "homebox",
|
||||||
"repo": "sysadminsmedia/homebox",
|
"repo": "sysadminsmedia/homebox",
|
||||||
"version": "v0.24.2",
|
"version": "v0.24.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-09T19:54:02Z"
|
"date": "2026-03-07T15:41:21Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "homepage",
|
"slug": "homepage",
|
||||||
@@ -613,16 +613,16 @@
|
|||||||
{
|
{
|
||||||
"slug": "invoiceninja",
|
"slug": "invoiceninja",
|
||||||
"repo": "invoiceninja/invoiceninja",
|
"repo": "invoiceninja/invoiceninja",
|
||||||
"version": "v5.13.0",
|
"version": "v5.12.70",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T03:33:02Z"
|
"date": "2026-03-06T01:53:38Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jackett",
|
"slug": "jackett",
|
||||||
"repo": "Jackett/Jackett",
|
"repo": "Jackett/Jackett",
|
||||||
"version": "v0.24.1332",
|
"version": "v0.24.1323",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T05:50:35Z"
|
"date": "2026-03-09T05:55:36Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "jellystat",
|
"slug": "jellystat",
|
||||||
@@ -823,9 +823,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "mail-archiver",
|
"slug": "mail-archiver",
|
||||||
"repo": "s1t5/mail-archiver",
|
"repo": "s1t5/mail-archiver",
|
||||||
"version": "2603.1",
|
"version": "2602.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T11:51:08Z"
|
"date": "2026-02-26T08:43:01Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "managemydamnlife",
|
"slug": "managemydamnlife",
|
||||||
@@ -837,9 +837,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "manyfold",
|
"slug": "manyfold",
|
||||||
"repo": "manyfold3d/manyfold",
|
"repo": "manyfold3d/manyfold",
|
||||||
"version": "v0.134.0",
|
"version": "v0.133.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-09T13:20:45Z"
|
"date": "2026-02-26T15:50:34Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "mealie",
|
"slug": "mealie",
|
||||||
@@ -998,9 +998,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "opencloud",
|
"slug": "opencloud",
|
||||||
"repo": "opencloud-eu/opencloud",
|
"repo": "opencloud-eu/opencloud",
|
||||||
"version": "v5.2.0",
|
"version": "v5.1.0",
|
||||||
"pinned": true,
|
"pinned": true,
|
||||||
"date": "2026-03-09T13:32:31Z"
|
"date": "2026-02-16T15:04:28Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "opengist",
|
"slug": "opengist",
|
||||||
@@ -1236,9 +1236,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "pulse",
|
"slug": "pulse",
|
||||||
"repo": "rcourtman/Pulse",
|
"repo": "rcourtman/Pulse",
|
||||||
"version": "v5.1.23",
|
"version": "v5.1.22",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-09T22:22:12Z"
|
"date": "2026-03-08T12:24:34Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "pve-scripts-local",
|
"slug": "pve-scripts-local",
|
||||||
@@ -1362,9 +1362,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "scanopy",
|
"slug": "scanopy",
|
||||||
"repo": "scanopy/scanopy",
|
"repo": "scanopy/scanopy",
|
||||||
"version": "v0.14.17",
|
"version": "v0.14.16",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-09T05:04:49Z"
|
"date": "2026-03-08T06:39:25Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "scraparr",
|
"slug": "scraparr",
|
||||||
@@ -1376,9 +1376,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "seaweedfs",
|
"slug": "seaweedfs",
|
||||||
"repo": "seaweedfs/seaweedfs",
|
"repo": "seaweedfs/seaweedfs",
|
||||||
"version": "4.16",
|
"version": "4.15",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T06:11:05Z"
|
"date": "2026-03-05T06:30:30Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "seelf",
|
"slug": "seelf",
|
||||||
@@ -1516,9 +1516,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tasmoadmin",
|
"slug": "tasmoadmin",
|
||||||
"repo": "TasmoAdmin/TasmoAdmin",
|
"repo": "TasmoAdmin/TasmoAdmin",
|
||||||
"version": "v5.0.0",
|
"version": "v4.3.4",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-09T20:51:03Z"
|
"date": "2026-01-25T22:16:41Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tautulli",
|
"slug": "tautulli",
|
||||||
@@ -1551,9 +1551,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "thingsboard",
|
"slug": "thingsboard",
|
||||||
"repo": "thingsboard/thingsboard",
|
"repo": "thingsboard/thingsboard",
|
||||||
"version": "v4.3.1",
|
"version": "v4.3.0.1",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T09:25:25Z"
|
"date": "2026-02-03T12:39:14Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "threadfin",
|
"slug": "threadfin",
|
||||||
@@ -1586,9 +1586,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "tracearr",
|
"slug": "tracearr",
|
||||||
"repo": "connorgallopo/Tracearr",
|
"repo": "connorgallopo/Tracearr",
|
||||||
"version": "v1.4.22",
|
"version": "v1.4.21",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-09T17:39:52Z"
|
"date": "2026-03-03T18:43:20Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "tracktor",
|
"slug": "tracktor",
|
||||||
@@ -1670,9 +1670,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "uptimekuma",
|
"slug": "uptimekuma",
|
||||||
"repo": "louislam/uptime-kuma",
|
"repo": "louislam/uptime-kuma",
|
||||||
"version": "2.2.1",
|
"version": "2.2.0",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-10T02:25:33Z"
|
"date": "2026-03-05T02:08:14Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "vaultwarden",
|
"slug": "vaultwarden",
|
||||||
@@ -1838,9 +1838,9 @@
|
|||||||
{
|
{
|
||||||
"slug": "zoraxy",
|
"slug": "zoraxy",
|
||||||
"repo": "tobychui/zoraxy",
|
"repo": "tobychui/zoraxy",
|
||||||
"version": "v3.3.2-rc3",
|
"version": "v3.3.2-rc2",
|
||||||
"pinned": false,
|
"pinned": false,
|
||||||
"date": "2026-03-09T13:56:45Z"
|
"date": "2026-02-27T03:31:25Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"slug": "zwave-js-ui",
|
"slug": "zwave-js-ui",
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { Inter } from "next/font/google";
|
|||||||
import Script from "next/script";
|
import Script from "next/script";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
import { CopycatWarningToast } from "@/components/copycat-warning-toast";
|
|
||||||
import { ThemeProvider } from "@/components/theme-provider";
|
import { ThemeProvider } from "@/components/theme-provider";
|
||||||
import { analytics, basePath } from "@/config/site-config";
|
import { analytics, basePath } from "@/config/site-config";
|
||||||
import QueryProvider from "@/components/query-provider";
|
import QueryProvider from "@/components/query-provider";
|
||||||
@@ -117,7 +116,6 @@ export default function RootLayout({
|
|||||||
<div className="w-full max-w-[1440px] ">
|
<div className="w-full max-w-[1440px] ">
|
||||||
{children}
|
{children}
|
||||||
<Toaster richColors />
|
<Toaster richColors />
|
||||||
<CopycatWarningToast />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Footer />
|
<Footer />
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
import { useEffect } from "react";
|
|
||||||
import { toast } from "sonner";
|
|
||||||
|
|
||||||
const STORAGE_KEY = "copycat-warning-dismissed";
|
|
||||||
|
|
||||||
export function CopycatWarningToast() {
|
|
||||||
useEffect(() => {
|
|
||||||
if (typeof window === "undefined")
|
|
||||||
return;
|
|
||||||
if (localStorage.getItem(STORAGE_KEY) === "true")
|
|
||||||
return;
|
|
||||||
|
|
||||||
toast.warning("Beware of copycat sites. Always verify the URL is correct before trusting or running scripts.", {
|
|
||||||
position: "top-center",
|
|
||||||
duration: Number.POSITIVE_INFINITY,
|
|
||||||
closeButton: true,
|
|
||||||
onDismiss: () => localStorage.setItem(STORAGE_KEY, "true"),
|
|
||||||
});
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
@@ -45,8 +45,8 @@ export const navbarLinks = [
|
|||||||
export const mostPopularScripts = ["post-pve-install", "docker", "homeassistant"];
|
export const mostPopularScripts = ["post-pve-install", "docker", "homeassistant"];
|
||||||
|
|
||||||
export const analytics = {
|
export const analytics = {
|
||||||
url: "analytics.community-scripts.org",
|
url: "analytics.bramsuurd.nl",
|
||||||
token: "e9f14e1e7232",
|
token: "f9eee289f931",
|
||||||
};
|
};
|
||||||
|
|
||||||
export const AlertColors = {
|
export const AlertColors = {
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ msg_ok "(4/5) Compiled imagemagick"
|
|||||||
|
|
||||||
msg_info "(5/5) Compiling libvips"
|
msg_info "(5/5) Compiling libvips"
|
||||||
SOURCE=$SOURCE_DIR/libvips
|
SOURCE=$SOURCE_DIR/libvips
|
||||||
LIBVIPS_REVISION="0c9151a4f416d2f8ae20a755db218f6637050eec"
|
: "${LIBVIPS_REVISION:=$(jq -cr '.revision' $BASE_DIR/server/sources/libvips.json)}"
|
||||||
$STD git clone https://github.com/libvips/libvips.git "$SOURCE"
|
$STD git clone https://github.com/libvips/libvips.git "$SOURCE"
|
||||||
cd "$SOURCE"
|
cd "$SOURCE"
|
||||||
$STD git reset --hard "$LIBVIPS_REVISION"
|
$STD git reset --hard "$LIBVIPS_REVISION"
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ fi
|
|||||||
|
|
||||||
if ! dpkg -l | grep -q 'libssl1.1'; then
|
if ! dpkg -l | grep -q 'libssl1.1'; then
|
||||||
msg_info "Installing libssl (if needed)"
|
msg_info "Installing libssl (if needed)"
|
||||||
curl -fsSL "https://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1w-0+deb11u5_amd64.deb" -o "/tmp/libssl.deb"
|
curl -fsSL "https://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1w-0+deb11u4_amd64.deb" -o "/tmp/libssl.deb"
|
||||||
$STD dpkg -i /tmp/libssl.deb
|
$STD dpkg -i /tmp/libssl.deb
|
||||||
rm -f /tmp/libssl.deb
|
rm -f /tmp/libssl.deb
|
||||||
msg_ok "Installed libssl1.1"
|
msg_ok "Installed libssl1.1"
|
||||||
|
|||||||
@@ -64,8 +64,7 @@ $STD sudo -u cool coolconfig set-admin-password --user=admin --password="$COOLPA
|
|||||||
echo "$COOLPASS" >~/.coolpass
|
echo "$COOLPASS" >~/.coolpass
|
||||||
msg_ok "Installed Collabora Online"
|
msg_ok "Installed Collabora Online"
|
||||||
|
|
||||||
fetch_and_deploy_gh_release "OpenCloud" "opencloud-eu/opencloud" "singlefile" "v5.2.0" "/usr/bin" "opencloud-*-linux-amd64"
|
fetch_and_deploy_gh_release "opencloud" "opencloud-eu/opencloud" "singlefile" "v5.1.0" "/usr/bin" "opencloud-*-linux-amd64"
|
||||||
mv /usr/bin/OpenCloud /usr/bin/opencloud
|
|
||||||
|
|
||||||
msg_info "Configuring OpenCloud"
|
msg_info "Configuring OpenCloud"
|
||||||
DATA_DIR="/var/lib/opencloud"
|
DATA_DIR="/var/lib/opencloud"
|
||||||
|
|||||||
@@ -27,9 +27,6 @@ WebUI\Password_PBKDF2="@ByteArray(amjeuVrF3xRbgzqWQmes5A==:XK3/Ra9jUmqUc4RwzCtrh
|
|||||||
WebUI\Port=8090
|
WebUI\Port=8090
|
||||||
WebUI\UseUPnP=false
|
WebUI\UseUPnP=false
|
||||||
WebUI\Username=admin
|
WebUI\Username=admin
|
||||||
|
|
||||||
[Network]
|
|
||||||
PortForwardingEnabled=false
|
|
||||||
EOF
|
EOF
|
||||||
msg_ok "Setup qBittorrent-nox"
|
msg_ok "Setup qBittorrent-nox"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user