Compare commits

..

22 Commits

Author SHA1 Message Date
GitHub Actions 9dda1ef299 Update .app files 2026-06-16 09:12:13 +00:00
Michel Roegl-Brunner e60c1f31c2 Stop spinner for deleted/disabled info messages
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 11:11:23 +02:00
community-scripts-pr-app[bot] f13782704e Update CHANGELOG.md (#15128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-16 08:57:08 +00:00
Michel Roegl-Brunner 7ee47be436 Add runtime status guard and deleted script stubs (#15125)
* Add runtime script status guard and deleted-script stubs.

Prevent disabled/deleted scripts from running updates with clear user messages, and ensure deleted ct scripts are stubbed automatically so legacy update commands no longer fail with 404.

* Delete ct/ente.sh

* Update booklore.sh
2026-06-16 10:56:29 +02:00
community-scripts-pr-app[bot] 868b256603 Update CHANGELOG.md (#15121)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-15 19:33:52 +00:00
community-scripts-pr-app[bot] 16bd4f473b Update CHANGELOG.md (#15120)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-15 19:33:43 +00:00
CanbiZ (MickLesk) 77eb109927 degoog: add curl-impersonate to script (#15117)
* jotty: add curl-impersonate to script

* Ensure clean install for curl-impersonate deployment
2026-06-15 21:33:23 +02:00
Slaviša Arežina 55703ab0ec Watcharr: Clean install on update (#15119)
* Clean install

* Update
2026-06-15 21:33:12 +02:00
community-scripts-pr-app[bot] 3c42589ff0 Update CHANGELOG.md (#15112)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-15 08:10:04 +00:00
community-scripts-pr-app[bot] 0d271f55a6 Update CHANGELOG.md (#15111)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-15 08:09:42 +00:00
CanbiZ (MickLesk) 6762208d66 core: improve mirror selection and error handling (#15108) 2026-06-15 10:09:38 +02:00
community-scripts-pr-app[bot] dee66b996e Update CHANGELOG.md (#15110)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-15 08:09:30 +00:00
CanbiZ (MickLesk) 4b20b8dab5 tools.func: extend mesa-vulkan-drivers and vulkan-tools to installation for ARC GPU's (#15106) 2026-06-15 10:09:14 +02:00
community-scripts-pr-app[bot] a2f987f07b Update CHANGELOG.md (#15109)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-15 08:08:57 +00:00
CanbiZ (MickLesk) 96d828f379 Vaultwarden: extend version check for VaultWarden update (#15105) 2026-06-15 10:08:49 +02:00
CanbiZ (MickLesk) 293d4b73a1 core: implement gateway validation for DHCP and static networks (#15107) 2026-06-15 10:08:24 +02:00
community-scripts-pr-app[bot] cfb84ae12d Update CHANGELOG.md (#15101)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-14 12:32:32 +00:00
Slaviša Arežina f37bf50a47 Refactor (#15096) 2026-06-14 14:32:06 +02:00
community-scripts-pr-app[bot] 4a09cac506 Update CHANGELOG.md (#15100)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-14 12:00:59 +00:00
community-scripts-pr-app[bot] 5831cc246a Update CHANGELOG.md (#15099)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-06-14 12:00:36 +00:00
CanbiZ (MickLesk) bcea631c30 Iinvoiceninja: fix nginx setup assets port (#15090) 2026-06-14 14:00:32 +02:00
CanbiZ (MickLesk) d9e6e6ea3d fix(checkmk): remove stale backup site before creating new backup during update (#15088) 2026-06-14 14:00:10 +02:00
36 changed files with 409 additions and 355 deletions
+143
View File
@@ -27,6 +27,7 @@ jobs:
BEFORE="${{ github.event.before }}"
AFTER="${{ github.event.after }}"
slugs=""
ct_slugs=""
# Deleted JSON files: get slug from previous commit
deleted_json=$(git diff --name-only --diff-filter=D "$BEFORE" "$AFTER" -- json/ | grep '\.json$' || true)
@@ -37,6 +38,14 @@ jobs:
done
# Deleted script files: derive slug from path
deleted_ct=$(git diff --name-only --diff-filter=D "$BEFORE" "$AFTER" -- ct/ | grep '\.sh$' || true)
for f in $deleted_ct; do
[[ -z "$f" ]] && continue
base="${f##*/}"
base="${base%.sh}"
[[ -n "$base" ]] && ct_slugs="$ct_slugs $base"
done
deleted_sh=$(git diff --name-only --diff-filter=D "$BEFORE" "$AFTER" -- ct/ install/ tools/ turnkey/ vm/ | grep '\.sh$' || true)
for f in $deleted_sh; do
[[ -z "$f" ]] && continue
@@ -51,14 +60,17 @@ jobs:
done
slugs=$(echo $slugs | xargs -n1 | sort -u | tr '\n' ' ')
ct_slugs=$(echo $ct_slugs | xargs -n1 2>/dev/null | sort -u | tr '\n' ' ')
if [[ -z "$slugs" ]]; then
echo "No deleted JSON or script files to mark as deleted in PocketBase."
echo "count=0" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "$slugs" > slugs_to_delete.txt
echo "$ct_slugs" > ct_slugs_to_stub.txt
echo "count=$(echo $slugs | wc -w)" >> "$GITHUB_OUTPUT"
echo "Slugs to mark as deleted: $slugs"
[[ -n "$ct_slugs" ]] && echo "CT stubs to generate: $ct_slugs"
- name: Mark as deleted in PocketBase
if: steps.slugs.outputs.count != '0'
@@ -159,3 +171,134 @@ jobs:
})().catch(e => { console.error(e); process.exit(1); });
ENDSCRIPT
shell: bash
- name: Generate CT stubs for deleted scripts
if: steps.slugs.outputs.count != '0'
env:
POCKETBASE_URL: ${{ secrets.POCKETBASE_URL }}
POCKETBASE_COLLECTION: ${{ secrets.POCKETBASE_COLLECTION }}
POCKETBASE_ADMIN_EMAIL: ${{ secrets.POCKETBASE_ADMIN_EMAIL }}
POCKETBASE_ADMIN_PASSWORD: ${{ secrets.POCKETBASE_ADMIN_PASSWORD }}
run: |
if [[ ! -s ct_slugs_to_stub.txt ]]; then
echo "No deleted ct/*.sh files; skipping stub generation."
exit 0
fi
node << 'ENDSCRIPT'
(async function() {
const fs = require('fs');
const https = require('https');
const http = require('http');
const path = require('path');
const url = require('url');
function request(fullUrl, opts, redirectCount) {
redirectCount = redirectCount || 0;
return new Promise(function(resolve, reject) {
const u = url.parse(fullUrl);
const isHttps = u.protocol === 'https:';
const body = opts.body;
const options = {
hostname: u.hostname,
port: u.port || (isHttps ? 443 : 80),
path: u.path,
method: opts.method || 'GET',
headers: opts.headers || {}
};
if (body) options.headers['Content-Length'] = Buffer.byteLength(body);
const lib = isHttps ? https : http;
const req = lib.request(options, function(res) {
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
if (redirectCount >= 5) return reject(new Error('Too many redirects from ' + fullUrl));
const redirectUrl = url.resolve(fullUrl, res.headers.location);
res.resume();
resolve(request(redirectUrl, opts, redirectCount + 1));
return;
}
let data = '';
res.on('data', function(chunk) { data += chunk; });
res.on('end', function() {
resolve({ ok: res.statusCode >= 200 && res.statusCode < 300, statusCode: res.statusCode, body: data });
});
});
req.on('error', reject);
if (body) req.write(body);
req.end();
});
}
const raw = process.env.POCKETBASE_URL.replace(/\/$/, '');
const apiBase = /\/api$/i.test(raw) ? raw : raw + '/api';
const coll = process.env.POCKETBASE_COLLECTION;
const ctSlugs = fs.readFileSync('ct_slugs_to_stub.txt', 'utf8').trim().split(/\s+/).filter(Boolean);
if (!ctSlugs.length) {
console.log('No ct slugs to process.');
return;
}
const authRes = await request(apiBase + '/collections/users/auth-with-password', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
identity: process.env.POCKETBASE_ADMIN_EMAIL,
password: process.env.POCKETBASE_ADMIN_PASSWORD
})
});
if (!authRes.ok) throw new Error('Auth failed: ' + authRes.body);
const token = JSON.parse(authRes.body).token;
const recordsUrl = apiBase + '/collections/' + encodeURIComponent(coll) + '/records';
for (const slug of ctSlugs) {
const filter = "(slug='" + slug + "')";
const listRes = await request(recordsUrl + '?filter=' + encodeURIComponent(filter) + '&perPage=1&fields=slug,name,deleted_message', {
headers: { 'Authorization': token }
});
if (!listRes.ok) {
console.warn('Failed to fetch record for slug "' + slug + '"');
continue;
}
const list = JSON.parse(listRes.body);
const rec = list.items && list.items[0];
const appName = (rec && rec.name) ? rec.name : slug;
const deletedMessage = (rec && rec.deleted_message && rec.deleted_message.trim())
? rec.deleted_message.trim()
: 'This script was removed and cannot be installed or updated.';
const stubPath = path.join('ct', slug + '.sh');
const content =
`#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
APP="${appName.replace(/"/g, '\\"')}"
header_info "$APP"
variables
color
msg_error "This script is no longer available in community-scripts."
msg_error "${deletedMessage.replace(/"/g, '\\"')}"
msg_warn "More info: https://community-scripts.org/scripts/${slug}"
exit 1
`;
fs.writeFileSync(stubPath, content);
console.log('Generated stub: ' + stubPath);
}
})().catch(e => { console.error(e); process.exit(1); });
ENDSCRIPT
shell: bash
- name: Commit generated stubs
if: steps.slugs.outputs.count != '0'
run: |
if git diff --quiet -- ct; then
echo "No generated ct stubs to commit."
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add ct/*.sh
git commit -m "chore: add deleted script stubs"
git push
shell: bash
+41
View File
@@ -483,8 +483,49 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
</details>
## 2026-06-16
### 🆕 New Scripts
- Add runtime status guard and deleted script stubs [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15125](https://github.com/community-scripts/ProxmoxVE/pull/15125))
## 2026-06-15
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Watcharr: Clean install on update [@tremor021](https://github.com/tremor021) ([#15119](https://github.com/community-scripts/ProxmoxVE/pull/15119))
- Vaultwarden: extend version check for VaultWarden update [@MickLesk](https://github.com/MickLesk) ([#15105](https://github.com/community-scripts/ProxmoxVE/pull/15105))
- #### ✨ New Features
- degoog: add curl-impersonate to script [@MickLesk](https://github.com/MickLesk) ([#15117](https://github.com/community-scripts/ProxmoxVE/pull/15117))
### 💾 Core
- #### ✨ New Features
- tools.func: extend mesa-vulkan-drivers and vulkan-tools to installation for ARC GPU's [@MickLesk](https://github.com/MickLesk) ([#15106](https://github.com/community-scripts/ProxmoxVE/pull/15106))
- #### 🔧 Refactor
- core: improve mirror selection and error handling [@MickLesk](https://github.com/MickLesk) ([#15108](https://github.com/community-scripts/ProxmoxVE/pull/15108))
- core: implement gateway validation for DHCP and static networks [@MickLesk](https://github.com/MickLesk) ([#15107](https://github.com/community-scripts/ProxmoxVE/pull/15107))
## 2026-06-14
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Iinvoiceninja: fix nginx setup assets port [@MickLesk](https://github.com/MickLesk) ([#15090](https://github.com/community-scripts/ProxmoxVE/pull/15090))
- CheckMK: remove stale backup site before creating new backup during update [@MickLesk](https://github.com/MickLesk) ([#15088](https://github.com/community-scripts/ProxmoxVE/pull/15088))
- #### 🔧 Refactor
- Refactor: Implement backup functions for scripts C-D [@tremor021](https://github.com/tremor021) ([#15096](https://github.com/community-scripts/ProxmoxVE/pull/15096))
## 2026-06-13
### 🆕 New Scripts
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
APP="BookLore"
header_info "$APP"
variables
color
msg_error "This script is no longer available in community-scripts."
msg_error "The Booklore or the Grimmory Fork will for now not return to community-scripts. Due to the unstable nature of these projects we decided to remove them and will decide at later point if they come back, which will most likley not happen. Plese do not create Issues for this."
msg_warn "More info: https://community-scripts.org/scripts/booklore"
exit 1
+3 -9
View File
@@ -35,10 +35,8 @@ function update_script() {
systemctl stop calibre-web
msg_ok "Stopped Service"
msg_info "Backing up Data"
cp -r /opt/calibre-web/app.db /opt/app.db_backup
cp -r /opt/calibre-web/data /opt/data_backup
msg_ok "Backed up Data"
create_backup /opt/calibre-web/app.db \
/opt/calibre-web/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Calibre-Web" "janeczku/calibre-web" "prebuild" "latest" "/opt/calibre-web" "calibre-web*.tar.gz"
setup_uv
@@ -50,11 +48,7 @@ function update_script() {
$STD uv pip install --python /opt/calibre-web/.venv/bin/python --no-cache-dir -r requirements.txt
msg_ok "Installed Dependencies"
msg_info "Restoring Data"
cp /opt/app.db_backup /opt/calibre-web/app.db 2>/dev/null
cp -r /opt/data_backup /opt/calibre-web/data 2>/dev/null
rm -rf /opt/app.db_backup /opt/data_backup
msg_ok "Restored Data"
restore_backup
msg_info "Starting Service"
systemctl start calibre-web
+2 -7
View File
@@ -35,16 +35,11 @@ function update_script() {
systemctl stop certimate
msg_ok "Stopped Service"
msg_info "Backing up Data"
cp -r /opt/certimate/pb_data /opt/certimate_pb_data_backup
msg_ok "Backed up Data"
create_backup /opt/certimate/pb_data
fetch_and_deploy_gh_release "certimate" "certimate-go/certimate" "prebuild" "latest" "/opt/certimate" "certimate_*_linux_amd64.zip"
msg_info "Restoring Data"
cp -r /opt/certimate_pb_data_backup/. /opt/certimate/pb_data
rm -rf /opt/certimate_pb_data_backup
msg_ok "Restored Data"
restore_backup
msg_info "Starting Service"
systemctl start certimate
+3 -8
View File
@@ -35,10 +35,8 @@ function update_script() {
systemctl stop checkmate-server checkmate-client nginx
msg_ok "Stopped Services"
msg_info "Backing up Data"
cp /opt/checkmate/server/.env /opt/checkmate_server.env.bak
[ -f /opt/checkmate/client/.env.local ] && cp /opt/checkmate/client/.env.local /opt/checkmate_client.env.local.bak
msg_ok "Backed up Data"
create_backup /opt/checkmate/server/.env \
/opt/checkmate/client/.env.local
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "checkmate" "bluewave-labs/Checkmate" "tarball"
@@ -56,10 +54,7 @@ function update_script() {
VITE_APP_API_BASE_URL="/api/v1" UPTIME_APP_API_BASE_URL="/api/v1" VITE_APP_LOG_LEVEL="warn" $STD npm run build
msg_ok "Updated Checkmate Client"
msg_info "Restoring Data"
mv /opt/checkmate_server.env.bak /opt/checkmate/server/.env
[ -f /opt/checkmate_client.env.local.bak ] && mv /opt/checkmate_client.env.local.bak /opt/checkmate/client/.env.local
msg_ok "Restored Data"
restore_backup
msg_info "Starting Services"
systemctl start checkmate-server checkmate-client nginx
+1
View File
@@ -33,6 +33,7 @@ function update_script() {
RELEASE="${RELEASE%%+*}"
msg_info "Updating checkmk"
$STD omd stop monitoring
$STD omd -f rm monitoringbackup 2>/dev/null || true
$STD omd cp monitoring monitoringbackup
curl_download "/opt/checkmk.deb" "https://download.checkmk.com/checkmk/${RELEASE}/check-mk-community-${RELEASE}_0.$(get_os_info codename)_amd64.deb"
$STD apt install -y /opt/checkmk.deb
+2 -7
View File
@@ -33,16 +33,11 @@ function update_script() {
systemctl stop cleanuparr
msg_ok "Stopped Service"
msg_info "Backing up config"
cp -r /opt/cleanuparr/config /opt/cleanuparr_config_backup
msg_ok "Backed up config"
create_backup /opt/cleanuparr/config
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "Cleanuparr" "Cleanuparr/Cleanuparr" "prebuild" "latest" "/opt/cleanuparr" "*linux-amd64.zip"
msg_info "Restoring config"
[[ -d /opt/cleanuparr/config ]] && rm -rf /opt/cleanuparr/config
mv /opt/cleanuparr_config_backup /opt/cleanuparr/config
msg_ok "Restored config"
restore_backup
msg_info "Starting Service"
systemctl start cleanuparr
+2 -11
View File
@@ -36,20 +36,11 @@ function update_script() {
msg_ok "Stopped Service"
ensure_dependencies rsync
if [ -d /opt/commafeed/data ] && [ "$(ls -A /opt/commafeed/data)" ]; then
msg_info "Backing up existing data"
mv /opt/commafeed/data /opt/data.bak
msg_ok "Backed up existing data"
fi
create_backup /opt/commafeed/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "commafeed" "Athou/commafeed" "prebuild" "latest" "/opt/commafeed" "commafeed-*-h2-jvm.zip"
if [ -d /opt/data.bak ] && [ "$(ls -A /opt/data.bak)" ]; then
msg_info "Restoring data"
mv /opt/data.bak /opt/commafeed/data
msg_ok "Restored data"
fi
restore_backup
msg_info "Starting Service"
systemctl start commafeed
+6 -4
View File
@@ -33,11 +33,13 @@ function update_script() {
systemctl stop configarr-task.timer
msg_ok "Stopped Service"
mkdir -p /opt/backup/
mv /opt/configarr/{config.yml,secrets.yml,.env} /opt/backup/
create_backup /opt/configarr/config.yml \
/opt/configarr/secrets.yml \
/opt/configarr/.env
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "configarr" "raydak-labs/configarr" "prebuild" "latest" "/opt/configarr" "configarr-linux-x64.tar.xz"
mv /opt/backup/{config.yml,secrets.yml,.env} /opt/configarr/
rm -rf /opt/backup
restore_backup
msg_info "Starting Service"
systemctl start configarr-task.timer
+4 -9
View File
@@ -36,19 +36,14 @@ function update_script() {
ensure_dependencies libreoffice-writer
msg_info "Move data-Folder"
if [[ -d /opt/convertx/data ]]; then
mv /opt/convertx/data /opt/data
fi
msg_ok "Moved data-Folder"
create_backup /opt/convertx/data
fetch_and_deploy_gh_release "ConvertX" "C4illin/ConvertX" "tarball" "latest" "/opt/convertx"
restore_backup
msg_info "Updating ConvertX"
if [[ -d /opt/data ]]; then
mv /opt/data /opt/convertx/data
fi
cd /opt/convertx
cd /opt/convertx
$STD bun install
msg_ok "Updated ConvertX"
+7 -13
View File
@@ -30,20 +30,17 @@ function update_script() {
fi
RELEASE=$(curl -fsSL "https://gitlab.com/api/v4/projects/20430749/releases" | grep -o '"tag_name":"v[^"]*"' | head -n 1 | sed 's/"tag_name":"v//;s/"//')
if [[ ! -f /opt/crafty-controller_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/crafty-controller_version.txt)" ]]; then
if [[ ! -f /opt/crafty-controller_version.txt ]] || [[ ${RELEASE} != "$(cat /opt/crafty-controller_version.txt)" ]]; then
msg_info "Stopping Crafty-Controller"
systemctl stop crafty-controller
msg_ok "Stopped Crafty-Controller"
msg_info "Creating Backup of config"
cp -a /opt/crafty-controller/crafty/crafty-4/app/config/. /opt/crafty-controller/backup
rm /opt/crafty-controller/backup/version.json
rm /opt/crafty-controller/backup/credits.json
rm /opt/crafty-controller/backup/logging.json
rm /opt/crafty-controller/backup/default.json.example
rm /opt/crafty-controller/backup/motd_format.json
msg_ok "Backup Created"
create_backup /opt/crafty-controller/crafty/crafty-4/app/config/version.json \
/opt/crafty-controller/crafty/crafty-4/app/config/credits.json \
/opt/crafty-controller/crafty/crafty-4/app/config/logging.json \
/opt/crafty-controller/crafty/crafty-4/app/config/default.json.example \
/opt/crafty-controller/crafty/crafty-4/app/config/motd_format.json
msg_info "Updating Crafty-Controller to v${RELEASE}"
curl -fsSL "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip" -o $(basename "https://gitlab.com/crafty-controller/crafty-4/-/archive/v${RELEASE}/crafty-4-v${RELEASE}.zip")
@@ -58,11 +55,8 @@ function update_script() {
echo "${RELEASE}" >"/opt/crafty-controller_version.txt"
msg_ok "Updated Crafty-Controller to v${RELEASE}"
msg_info "Restoring Backup of config"
cp -a /opt/crafty-controller/backup/. /opt/crafty-controller/crafty/crafty-4/app/config
rm -rf /opt/crafty-controller/backup
restore_backup
chown -R crafty:crafty /opt/crafty-controller/
msg_ok "Backup Restored"
msg_info "Starting Crafty-Controller"
systemctl start crafty-controller
+9 -12
View File
@@ -34,21 +34,18 @@ function update_script() {
systemctl stop cryptpad
msg_info "Stopped Service"
msg_info "Creating backup"
[ -f /opt/cryptpad/config/config.js ] && mv /opt/cryptpad/config/config.js /opt/
for dir in blob block customize data datastore www/common/onlyoffice/dist onlyoffice-conf; do
[ -d "/opt/cryptpad/${dir}" ] && mv "/opt/cryptpad/${dir}" "/tmp/cryptpad_${dir//\//_}"
done
msg_ok "Created backup"
create_backup /opt/cryptpad/config/config.js \
/opt/cryptpad/blob \
/opt/cryptpad/block \
/opt/cryptpad/customize \
/opt/cryptpad/data \
/opt/cryptpad/datastore \
/opt/cryptpad/www/common/onlyoffice/dist \
/opt/cryptpad/onlyoffice-conf
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "cryptpad" "cryptpad/cryptpad" "tarball"
msg_info "Restoring backup"
mv /opt/config.js /opt/cryptpad/config/
for dir in blob block customize data datastore www/common/onlyoffice/dist onlyoffice-conf; do
[ -d "/tmp/cryptpad_${dir//\//_}" ] && mv "/tmp/cryptpad_${dir//\//_}" "/opt/cryptpad/${dir}"
done
msg_ok "Restored backup"
restore_backup
msg_info "Updating CryptPad"
cd /opt/cryptpad
+2 -8
View File
@@ -35,17 +35,11 @@ function update_script() {
systemctl stop dagu
msg_ok "Stopped Service"
msg_info "Backing up Data"
cp -r /opt/dagu/data /opt/dagu_data_backup
msg_ok "Backed up Data"
create_backup /opt/dagu/data
fetch_and_deploy_gh_release "dagu" "dagucloud/dagu" "prebuild" "latest" "/opt/dagu" "dagu_*_linux_amd64.tar.gz"
msg_info "Restoring Data"
mkdir -p /opt/dagu/data
cp -r /opt/dagu_data_backup/. /opt/dagu/data
rm -rf /opt/dagu_data_backup
msg_ok "Restored Data"
restore_backup
msg_info "Starting Service"
systemctl start dagu
+2 -8
View File
@@ -36,10 +36,7 @@ function update_script() {
systemctl stop dashy
msg_ok "Stopped Service"
msg_info "Backing up user-data"
rm -rf /opt/dashy_user_data_backup
cp -r /opt/dashy/user-data /opt/dashy_user_data_backup
msg_ok "Backed up user-data"
create_backup /opt/dashy/user-data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dashy" "lissy93/dashy" "prebuild" "latest" "/opt/dashy" "dashy-*.tar.gz"
@@ -48,10 +45,7 @@ function update_script() {
$STD yarn install --ignore-engines --network-timeout 300000
msg_ok "Updated Dashy"
msg_info "Restoring user-data"
cp -r /opt/dashy_user_data_backup/. /opt/dashy/user-data/
rm -rf /opt/dashy_user_data_backup
msg_ok "Restored user-data"
restore_backup
msg_info "Starting Dashy"
systemctl start dashy
+2 -11
View File
@@ -35,12 +35,7 @@ function update_script() {
$STD systemctl stop databasus
msg_ok "Stopped Databasus"
msg_info "Backing up Configuration"
[[ ! -f /.env && -f /opt/databasus/.env ]] && cp /opt/databasus/.env /.env
chmod 600 /.env
cp /.env /opt/databasus.env.bak
chmod 600 /opt/databasus.env.bak
msg_ok "Backed up Configuration"
create_backup /opt/databasus/.env
msg_info "Ensuring Database Clients"
# Create PostgreSQL version symlinks for compatibility
@@ -87,11 +82,7 @@ function update_script() {
chown -R postgres:postgres /opt/databasus
msg_ok "Updated Databasus"
msg_info "Restoring Configuration"
cp /opt/databasus.env.bak /.env
rm -f /opt/databasus.env.bak
chmod 600 /.env
msg_ok "Restored Configuration"
restore_backup
if ! grep -q "EnvironmentFile=/.env" /etc/systemd/system/databasus.service; then
msg_info "Updating Service"
+4 -11
View File
@@ -37,11 +37,9 @@ function update_script() {
systemctl stop dawarich-web dawarich-worker
msg_ok "Stopped Services"
msg_info "Backing up Data"
cp -r /opt/dawarich/app/storage /opt/dawarich_storage_backup 2>/dev/null || true
cp /opt/dawarich/app/config/master.key /opt/dawarich_master.key 2>/dev/null || true
cp /opt/dawarich/app/config/credentials.yml.enc /opt/dawarich_credentials.yml.enc 2>/dev/null || true
msg_ok "Backed up Data"
create_backup /opt/dawarich/app/storage \
/opt/dawarich/app/config/master.key \
/opt/dawarich/app/config/credentials.yml.enc
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dawarich" "Freika/dawarich" "tarball" "latest" "/opt/dawarich/app"
@@ -85,12 +83,7 @@ function update_script() {
$STD bundle exec rake data:migrate
msg_ok "Ran Migrations"
msg_info "Restoring Data"
cp -r /opt/dawarich_storage_backup/. /opt/dawarich/app/storage/ 2>/dev/null || true
cp /opt/dawarich_master.key /opt/dawarich/app/config/master.key 2>/dev/null || true
cp /opt/dawarich_credentials.yml.enc /opt/dawarich/app/config/credentials.yml.enc 2>/dev/null || true
rm -rf /opt/dawarich_storage_backup /opt/dawarich_master.key /opt/dawarich_credentials.yml.enc
msg_ok "Restored Data"
restore_backup
msg_info "Starting Services"
systemctl start dawarich-web dawarich-worker
+2 -7
View File
@@ -33,16 +33,11 @@ function update_script() {
systemctl stop ddns-updater
msg_ok "Stopped Service"
msg_info "Backing up Data"
cp -r /opt/ddns-updater/data /opt/ddns-updater_data_backup
msg_ok "Backed up Data"
create_backup /opt/ddns-updater/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ddns-updater" "qdm12/ddns-updater" "singlefile" "latest" "/opt/ddns-updater" "ddns-updater_*_linux_amd64"
msg_info "Restoring Data"
cp -r /opt/ddns-updater_data_backup/. /opt/ddns-updater/data/
rm -rf /opt/ddns-updater_data_backup
msg_ok "Restored Data"
restore_backup
msg_info "Starting Service"
systemctl start ddns-updater
+4 -7
View File
@@ -35,10 +35,8 @@ function update_script() {
systemctl stop degoog
msg_ok "Stopped Service"
msg_info "Backing up Configuration & Data"
[[ -f /opt/degoog/.env ]] && cp /opt/degoog/.env /opt/degoog.env.bak
[[ -d /opt/degoog/data ]] && mv /opt/degoog/data /opt/degoog_data_backup
msg_ok "Backed up Configuration & Data"
create_backup /opt/degoog/.env \
/opt/degoog/data
if ! command -v bun >/dev/null 2>&1; then
msg_info "Installing Bun"
@@ -54,10 +52,9 @@ function update_script() {
msg_ok "Updated Valkey"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "degoog" "fccview/degoog" "prebuild" "latest" "/opt/degoog" "degoog_*_prebuild.tar.gz"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "curl-impersonate" "lexiforest/curl-impersonate" "prebuild" "latest" "/usr/local/bin" "curl-impersonate-v*.$(uname -m)-linux-gnu.tar.gz"
msg_info "Restoring Configuration & Data"
[[ -f /opt/degoog.env.bak ]] && mv /opt/degoog.env.bak /opt/degoog/.env
[[ -d /opt/degoog_data_backup ]] && mv /opt/degoog_data_backup /opt/degoog/data
restore_backup
if [[ -f /opt/degoog/.env ]]; then
grep -q "^DEGOOG_VALKEY_URL=" /opt/degoog/.env && sed -i "s|^DEGOOG_VALKEY_URL=.*|DEGOOG_VALKEY_URL=redis://valkey:6379|" /opt/degoog/.env || echo "DEGOOG_VALKEY_URL=redis://valkey:6379" >>/opt/degoog/.env
+2 -9
View File
@@ -37,19 +37,12 @@ function update_script() {
systemctl stop discopanel
msg_ok "Stopped Service"
msg_info "Creating Backup"
mkdir -p /opt/discopanel_backup_temp
cp /opt/discopanel/data/discopanel.db /opt/discopanel_backup_temp/discopanel.db
msg_ok "Created Backup"
create_backup /opt/discopanel/data/discopanel.db
fetch_and_deploy_gh_release "discopanel" "nickheyer/discopanel" "prebuild" "latest" "/opt/discopanel" "discopanel-linux-amd64.tar.gz"
ln -sf /opt/discopanel/discopanel-linux-amd64 /opt/discopanel/discopanel
msg_info "Restoring Data"
mkdir -p /opt/discopanel/data
mv /opt/discopanel_backup_temp/discopanel.db /opt/discopanel/data/discopanel.db
rm -rf /opt/discopanel_backup_temp
msg_ok "Restored Data"
restore_backup
msg_info "Starting Service"
systemctl start discopanel
+5 -11
View File
@@ -37,25 +37,19 @@ function update_script() {
systemctl stop docmost
msg_ok "Stopped Service"
msg_info "Backing up data"
cp /opt/docmost/.env /opt/
cp -r /opt/docmost/data /opt/
rm -rf /opt/docmost
msg_ok "Data backed up"
create_backup /opt/docmost/.env \
/opt/docmost/data
fetch_and_deploy_gh_release "docmost" "docmost/docmost" "tarball"
msg_info "Updating ${APP}"
cd /opt/docmost
mv /opt/.env /opt/docmost/.env
mv /opt/data /opt/docmost/data
restore_backup
# Fix: Docmost EE (audit logs etc.) lives in a git submodule that is NOT
# included in GitHub tarballs. The community NoopAuditService exists but
# is only exported by CoreModule child modules such as UserModule cannot
# resolve it. Making CoreModule @Global() exposes the token app-wide.
if [[ ! -f /opt/docmost/apps/server/src/ee/ee.module.ts ]] \
&& ! grep -q '@Global()' /opt/docmost/apps/server/src/core/core.module.ts 2>/dev/null; then
if [[ ! -f /opt/docmost/apps/server/src/ee/ee.module.ts ]] &&
! grep -q '@Global()' /opt/docmost/apps/server/src/core/core.module.ts 2>/dev/null; then
sed -i '/^ Module,$/a\ Global,' /opt/docmost/apps/server/src/core/core.module.ts
sed -i '/^@Module({$/i @Global()' /opt/docmost/apps/server/src/core/core.module.ts
fi
+4 -9
View File
@@ -35,24 +35,19 @@ function update_script() {
systemctl stop docuseal docuseal-sidekiq
msg_ok "Stopped Services"
msg_info "Backing up Data"
cp /opt/docuseal/.env /opt/docuseal.env.bak
[[ -d /opt/docuseal/data ]] && mv /opt/docuseal/data /opt/docuseal_data.bak
msg_ok "Backed up Data"
create_backup /opt/docuseal/.env \
/opt/docuseal/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "docuseal" "docusealco/docuseal" "tarball"
local required_ruby current_ruby
required_ruby=$(grep -m1 '^ruby ' /opt/docuseal/Gemfile | grep -oP '[0-9]+\.[0-9]+\.[0-9]+')
current_ruby=$(PATH="/root/.rbenv/bin:/root/.rbenv/shims:${PATH}" rbenv global 2>/dev/null || true)
if [[ -n "$required_ruby" && "$required_ruby" != "$current_ruby" ]]; then
if [[ -n $required_ruby && $required_ruby != "$current_ruby" ]]; then
RUBY_VERSION="${required_ruby}" RUBY_INSTALL_RAILS="false" HOME=/root setup_ruby
fi
msg_info "Restoring Data"
mv /opt/docuseal.env.bak /opt/docuseal/.env
[[ -d /opt/docuseal_data.bak ]] && mv /opt/docuseal_data.bak /opt/docuseal/data
msg_ok "Restored Data"
restore_backup
msg_info "Building Application"
cd /opt/docuseal
+2 -6
View File
@@ -43,9 +43,7 @@ function update_script() {
systemctl stop apache2
msg_info "Service stopped"
msg_info "Creating backup"
mv /opt/domain-monitor/.env /opt
msg_ok "Created backup"
create_backup /opt/domain-monitor/.env
setup_composer
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "domain-monitor" "Hosteroid/domain-monitor" "prebuild" "latest" "/opt/domain-monitor" "domain-monitor-v*.zip"
@@ -56,9 +54,7 @@ function update_script() {
chown -R www-data:www-data /opt/domain-monitor
msg_ok "Updated Domain Monitor"
msg_info "Restoring backup"
mv /opt/.env /opt/domain-monitor
msg_ok "Restored backup"
restore_backup
msg_info "Restarting Services"
systemctl start apache2
+3 -7
View File
@@ -35,18 +35,14 @@ function update_script() {
systemctl stop donetick
msg_ok "Stopped Service"
msg_info "Backing Up Configurations"
mv /opt/donetick/config/selfhosted.yaml /opt/donetick/donetick.db /opt
msg_ok "Backed Up Configurations"
create_backup /opt/donetick/config/selfhosted.yaml \
/opt/donetick/donetick.db
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "donetick" "donetick/donetick" "prebuild" "latest" "/opt/donetick" "donetick_Linux_x86_64.tar.gz"
msg_info "Restoring Configurations"
mv /opt/selfhosted.yaml /opt/donetick/config
restore_backup
grep -q 'http://localhost"$' /opt/donetick/config/selfhosted.yaml || sed -i '/https:\/\/localhost"$/a\ - "http://localhost"' /opt/donetick/config/selfhosted.yaml
grep -q 'capacitor://localhost' /opt/donetick/config/selfhosted.yaml || sed -i '/http:\/\/localhost"$/a\ - "capacitor://localhost"' /opt/donetick/config/selfhosted.yaml
mv /opt/donetick.db /opt/donetick
msg_ok "Restored Configurations"
msg_info "Starting Service"
systemctl start donetick
+4 -10
View File
@@ -35,19 +35,13 @@ function update_script() {
systemctl stop dynacat
msg_ok "Stopped Service"
msg_info "Backing up Data"
cp -r /opt/dynacat/config /opt/dynacat_config_backup
cp -r /opt/dynacat/assets /opt/dynacat_assets_backup
cp -r /opt/dynacat/data /opt/dynacat_data_backup
msg_ok "Backed up Data"
create_backup /opt/dynacat/config \
/opt/dynacat/assets \
/opt/dynacat/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "dynacat" "Panonim/dynacat" "prebuild" "latest" "/opt/dynacat" "dynacat-linux-amd64.tar.gz"
msg_info "Restoring Data"
cp -r /opt/dynacat_config_backup/. /opt/dynacat/config
cp -r /opt/dynacat_assets_backup/. /opt/dynacat/assets
cp -r /opt/dynacat_data_backup/. /opt/dynacat/data
rm -rf /opt/dynacat_config_backup /opt/dynacat_assets_backup /opt/dynacat_data_backup
restore_backup
chmod +x /opt/dynacat/dynacat
msg_ok "Restored Data"
+6
View File
@@ -0,0 +1,6 @@
____ __ __
/ __ )____ ____ / /__/ / ____ ________
/ __ / __ \/ __ \/ //_/ / / __ \/ ___/ _ \
/ /_/ / /_/ / /_/ / ,< / /___/ /_/ / / / __/
/_____/\____/\____/_/|_/_____/\____/_/ \___/
+6
View File
@@ -0,0 +1,6 @@
__ _ __ __ __ __ ___
/ / (_) /____ / / / / / |/ /
/ / / / __/ _ \/ / / / / /|_/ /
/ /___/ / /_/ __/ /___/ /___/ / / /
/_____/_/\__/\___/_____/_____/_/ /_/
+15
View File
@@ -0,0 +1,15 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
APP="LiteLLM"
header_info "$APP"
variables
color
msg_error "This script is no longer available in community-scripts."
msg_error "This script was removed and cannot be installed or updated."
msg_warn "More info: https://community-scripts.org/scripts/litellm"
exit 1
+4 -69
View File
@@ -1,80 +1,15 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/minio/minio
APP="MinIO"
var_tags="${var_tags:-object-storage}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-5}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_arm64="${var_arm64:-no}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /usr/local/bin/minio ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
FEATURE_RICH_VERSION="2025-04-22T22-12-26Z"
RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}')
CURRENT_VERSION=""
[[ -f /opt/${APP}_version.txt ]] && CURRENT_VERSION=$(cat /opt/${APP}_version.txt)
RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}')
if [[ "${CURRENT_VERSION}" == "${FEATURE_RICH_VERSION}" && "${RELEASE}" != "${FEATURE_RICH_VERSION}" ]]; then
echo
echo "You are currently running the last feature-rich community version: ${FEATURE_RICH_VERSION}"
echo "WARNING: Updating to the latest version will REMOVE most management features from the Console UI."
echo "Do you still want to upgrade to the latest version? [y/N]: "
read -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
msg_ok "No update performed. Staying on the feature-rich version."
exit
fi
fi
if [[ "${CURRENT_VERSION}" != "${RELEASE}" ]]; then
msg_info "Stopping Service"
systemctl stop minio
msg_ok "Stopped Service"
msg_info "Updating ${APP} to ${RELEASE}"
mv /usr/local/bin/minio /usr/local/bin/minio_bak
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/minio" -o /usr/local/bin/minio
chmod +x /usr/local/bin/minio
rm -f /usr/local/bin/minio_bak
echo "${RELEASE}" >/opt/${APP}_version.txt
msg_ok "Updated ${APP}"
msg_info "Starting Service"
systemctl start minio
msg_ok "Started Service"
msg_ok "Updated successfully!"
else
msg_ok "No update required. ${APP} is already at ${RELEASE}"
fi
exit
}
start
build_container
description
msg_ok "Completed successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW}Access it using the following URL:${CL}"
echo -e "${GATEWAY}${BGN}http://${IP}:9000${CL}"
msg_error "This script is no longer available in community-scripts."
msg_error "Repository is archived. Minio is gone"
msg_warn "More info: https://community-scripts.org/scripts/minio"
exit 1
+5
View File
@@ -37,6 +37,11 @@ function update_script() {
"2" "Set Admin Token")
if [ "$UPD" == "1" ]; then
INSTALLED_VERSION="$(/opt/vaultwarden/bin/vaultwarden --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)"
if [[ -n "$INSTALLED_VERSION" ]] &&
! grep -qxF "$INSTALLED_VERSION" "$HOME/.vaultwarden" 2>/dev/null; then
printf '%s\n' "$INSTALLED_VERSION" >"$HOME/.vaultwarden"
fi
if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then
msg_info "Stopping Service"
systemctl stop vaultwarden
+3 -3
View File
@@ -34,9 +34,9 @@ function update_script() {
systemctl stop watcharr
msg_ok "Stopped Service"
rm -f /opt/watcharr/server/watcharr
rm -rf /opt/watcharr/server/ui
fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
create_backup /opt/watcharr/server/data
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "watcharr" "sbondCo/Watcharr" "tarball"
restore_backup
msg_info "Updating Watcharr"
cd /opt/watcharr
+1
View File
@@ -27,6 +27,7 @@ ln -sf /root/.bun/bin/bun /usr/local/bin/bun
ln -sf /root/.bun/bin/bunx /usr/local/bin/bunx
msg_ok "Installed Bun"
fetch_and_deploy_gh_release "curl-impersonate" "lexiforest/curl-impersonate" "prebuild" "latest" "/usr/local/bin" "curl-impersonate-v*.$(uname -m)-linux-gnu.tar.gz"
fetch_and_deploy_gh_release "degoog" "fccview/degoog" "prebuild" "latest" "/opt/degoog" "degoog_*_prebuild.tar.gz"
msg_info "Setting up degoog"
+2
View File
@@ -133,6 +133,8 @@ server {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param HTTP_X_FORWARDED_HOST $http_host;
fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;
fastcgi_read_timeout 300;
}
-95
View File
@@ -1,95 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2026 community-scripts ORG
# Author: MickLesk (CanbiZ)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/minio/minio
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
color
verb_ip6
catch_errors
setting_up_container
network_check
update_os
FEATURE_RICH_VERSION="2025-04-22T22-12-26Z"
echo
echo "MinIO recently removed many management features from the Console UI."
echo "The last feature-complete version is: $FEATURE_RICH_VERSION"
echo "Latest versions require the paid edition for full UI functionality."
echo
echo "Choose which version to install:"
echo " [N] Feature-rich community version ($FEATURE_RICH_VERSION) [Recommended]"
echo " [Y] Latest version (may lack UI features)"
echo
read -p "Install latest MinIO version? [y/N]: " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
USE_LATEST=true
else
USE_LATEST=false
fi
msg_info "Setting up MinIO"
if [[ "$USE_LATEST" == "true" ]]; then
RELEASE=$(curl -fsSL https://api.github.com/repos/minio/minio/releases/latest | grep '"tag_name"' | awk -F '"' '{print $4}')
DOWNLOAD_URL="https://dl.min.io/server/minio/release/linux-amd64/minio"
else
RELEASE="$FEATURE_RICH_VERSION"
DOWNLOAD_URL="https://dl.min.io/server/minio/release/linux-amd64/archive/minio.RELEASE.${FEATURE_RICH_VERSION}"
fi
curl -fsSL "$DOWNLOAD_URL" -o /usr/local/bin/minio
chmod +x /usr/local/bin/minio
useradd -r minio-user -s /sbin/nologin
mkdir -p /home/minio-user
chown minio-user:minio-user /home/minio-user
mkdir -p /data
chown minio-user:minio-user /data
MINIO_ADMIN_USER="minioadmin"
MINIO_ADMIN_PASSWORD="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | cut -c1-13)"
cat <<EOF >/etc/default/minio
MINIO_ROOT_USER=${MINIO_ADMIN_USER}
MINIO_ROOT_PASSWORD=${MINIO_ADMIN_PASSWORD}
EOF
{
echo ""
echo "MinIO Credentials"
echo "MinIO Admin User: $MINIO_ADMIN_USER"
echo "MinIO Admin Password: $MINIO_ADMIN_PASSWORD"
} >>~/minio.creds
echo "${RELEASE}" >/opt/${APPLICATION,,}_version.txt
msg_ok "Setup MinIO"
msg_info "Creating service"
cat <<EOF >/etc/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
[Service]
User=minio-user
Group=minio-user
EnvironmentFile=-/etc/default/minio
ExecStart=/usr/local/bin/minio server --console-address ":9001" /data
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl enable -q --now minio
msg_ok "Service created"
motd_ssh
customize
cleanup_lxc
+85 -4
View File
@@ -979,6 +979,20 @@ base_settings() {
IPV6_METHOD=${var_ipv6_method:-"none"}
GATE=${var_gateway:-""}
# Guard against invalid gateway combinations from defaults/app vars:
# - DHCP must not force a static gateway
# - Static IPv4 must use a gateway in the same subnet
if [[ "$NET" == "dhcp" && -n "$GATE" ]]; then
msg_warn "Ignoring var_gateway '$GATE' because var_net is 'dhcp'"
GATE=""
elif [[ "$NET" != "dhcp" && -n "$GATE" ]]; then
if ! validate_gateway_in_subnet "$NET" "$GATE"; then
msg_warn "Ignoring var_gateway '$GATE' because it is not in subnet of var_net '$NET'"
GATE=""
fi
fi
APT_CACHER=${var_apt_cacher:-""}
APT_CACHER_IP=${var_apt_cacher_ip:-""}
@@ -3631,6 +3645,53 @@ run_addon_updates() {
done
}
runtime_script_status_guard() {
local script_slug="${SCRIPT_SLUG:-${NSAPP:-}}"
script_slug="$(echo "$script_slug" | tr '[:upper:]' '[:lower:]' | tr ' ' '-')"
[[ -z "$script_slug" ]] && return 0
local api_url="https://db.community-scripts.org/api/collections/script_scripts/records?filter=(slug='${script_slug}')&perPage=1&fields=slug,is_disabled,is_deleted,disable_message,deleted_message"
local response
if ! response=$(curl -fsSL --connect-timeout 2 --max-time 3 "$api_url" 2>/dev/null); then
msg_warn "Script status check is unavailable. Continuing without status verification."
return 0
fi
if ! command -v jq >/dev/null 2>&1; then
msg_warn "Missing jq for script status check. Continuing without status verification."
return 0
fi
local has_record is_deleted is_disabled deleted_message disable_message info_url
has_record=$(printf '%s' "$response" | jq -r '.items | length')
[[ "$has_record" == "0" ]] && return 0
is_deleted=$(printf '%s' "$response" | jq -r '.items[0].is_deleted // false')
is_disabled=$(printf '%s' "$response" | jq -r '.items[0].is_disabled // false')
deleted_message=$(printf '%s' "$response" | jq -r '.items[0].deleted_message // ""')
disable_message=$(printf '%s' "$response" | jq -r '.items[0].disable_message // ""')
info_url="https://community-scripts.org/scripts/${script_slug}"
if [[ "$is_deleted" == "true" ]]; then
msg_error "This script is no longer available in community-scripts."
[[ -n "$deleted_message" ]] && msg_error "$deleted_message"
[[ -z "$deleted_message" ]] && msg_error "This script was removed and cannot be installed or updated."
msg_warn "More info: ${info_url}"
return 1
fi
if [[ "$is_disabled" == "true" ]]; then
msg_error "This script is currently disabled in community-scripts."
[[ -n "$disable_message" ]] && msg_error "$disable_message"
[[ -z "$disable_message" ]] && msg_error "Updates and installs are temporarily disabled for this script."
msg_warn "More info: ${info_url}"
return 1
fi
return 0
}
# ------------------------------------------------------------------------------
# start()
#
@@ -3639,9 +3700,11 @@ run_addon_updates() {
# - In silent mode: runs update_script with automatic cleanup
# - Otherwise: shows update/setting menu and runs update_script with cleanup
# ------------------------------------------------------------------------------
start() {
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
if command -v pveversion >/dev/null 2>&1; then
runtime_script_status_guard || return 0
install_script || return 0
return 0
elif [ ! -z ${PHS_SILENT+x} ] && [[ "${PHS_SILENT}" == "1" ]]; then
@@ -3649,6 +3712,7 @@ start() {
set_std_mode
ensure_profile_loaded
get_lxc_ip
runtime_script_status_guard || return 0
update_script
run_addon_updates
update_motd_ip
@@ -3659,6 +3723,7 @@ start() {
set_std_mode
ensure_profile_loaded
get_lxc_ip
runtime_script_status_guard || return 0
update_script
run_addon_updates
update_motd_ip
@@ -3688,6 +3753,7 @@ start() {
esac
ensure_profile_loaded
get_lxc_ip
runtime_script_status_guard || return 0
update_script
run_addon_updates
update_motd_ip
@@ -4379,10 +4445,12 @@ EOF
pct exec "$CTID" -- bash -c "apt-get update 2>&1 && apt-get install -y ${_base_pkgs} 2>&1" >>"$BUILD_LOG" 2>&1 || {
local failed_mirror
failed_mirror=$(pct exec "$CTID" -- bash -c "grep -m1 -oP '(?<=URIs: https?://)[^/]+' /etc/apt/sources.list.d/debian.sources 2>/dev/null || grep -m1 -oP '(?<=deb https?://)[^/]+' /etc/apt/sources.list 2>/dev/null" 2>/dev/null || echo "unknown")
msg_warn "apt-get update failed (${failed_mirror}), trying alternate mirrors..."
msg_warn "apt-get update failed (${failed_mirror})."
msg_custom "️" "${YW}" "Probing alternate mirrors (this can take 1-2 minutes on network issues)"
local mirror_exit=0
pct exec "$CTID" -- env APT_BASE="$_base_pkgs" bash -c '
DISTRO=$(. /etc/os-release 2>/dev/null && echo "$ID" || echo "debian")
echo " Mirror fallback for distro: $DISTRO"
if [ "$DISTRO" = "ubuntu" ]; then
EU_MIRRORS="de.archive.ubuntu.com fr.archive.ubuntu.com se.archive.ubuntu.com nl.archive.ubuntu.com it.archive.ubuntu.com ch.archive.ubuntu.com mirrors.xtom.de"
@@ -4440,15 +4508,21 @@ EOF
}
# Phase 1: Scan global mirrors first (independent of local CDN issues)
echo " Phase 1/3: Scanning global mirrors for reachability..."
OTHERS_OK=$(scan_reachable "$OTHERS")
OTHERS_PICK=$(printf "%s\n" $OTHERS_OK | shuf | head -3 | xargs)
if [ -z "$OTHERS_PICK" ]; then
echo " No reachable global mirrors found"
fi
for mirror in $OTHERS_PICK; do
echo " Attempting mirror: $mirror"
try_mirrors "$mirror" && exit 0
done
# Phase 2: Try primary mirror
echo " Phase 2/3: Trying primary mirror..."
if [ "$DISTRO" = "ubuntu" ]; then
PRIMARY="archive.ubuntu.com"
else
@@ -4460,9 +4534,14 @@ EOF
fi
# Phase 3: Fall back to regional mirrors
echo " Phase 3/3: Scanning regional mirrors..."
REGIONAL_OK=$(scan_reachable "$REGIONAL")
REGIONAL_PICK=$(printf "%s\n" $REGIONAL_OK | shuf | head -3 | xargs)
if [ -z "$REGIONAL_PICK" ]; then
echo " No reachable regional mirrors found"
fi
for mirror in $REGIONAL_PICK; do
echo " Attempting mirror: $mirror"
try_mirrors "$mirror" && exit 0
@@ -4496,12 +4575,14 @@ EOF
msg_warn "Mirror '${custom_mirror}' also failed. Try another or type 'skip'."
done
if [[ "$custom_mirror" == "skip" ]]; then
msg_error "apt-get base packages installation failed"
install_exit_code=1
msg_warn "Mirror selection aborted by user ('skip')"
msg_warn "Aborting installation before base package bootstrap"
post_update_to_api "aborted" "130" "force"
install_exit_code=130
fi
elif [[ $mirror_exit -ne 0 ]]; then
msg_error "apt-get base packages installation failed"
install_exit_code=1
install_exit_code=100
fi
}
fi
+8
View File
@@ -5267,6 +5267,8 @@ _setup_intel_arc() {
intel-media-va-driver-non-free \
intel-opencl-icd \
libmfx-gen1.2 \
mesa-vulkan-drivers \
vulkan-tools \
vainfo \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel Arc packages failed"
@@ -5301,6 +5303,8 @@ _setup_intel_arc() {
ocl-icd-libopencl1 \
libvpl2 \
libmfx-gen1.2 \
mesa-vulkan-drivers \
vulkan-tools \
vainfo \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel Arc packages failed"
@@ -5324,6 +5328,8 @@ _setup_intel_modern() {
va-driver-all \
intel-media-va-driver \
ocl-icd-libopencl1 \
mesa-vulkan-drivers \
vulkan-tools \
vainfo \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel packages failed"
@@ -5358,6 +5364,8 @@ _setup_intel_modern() {
$STD apt -y install \
intel-media-va-driver-non-free \
ocl-icd-libopencl1 \
mesa-vulkan-drivers \
vulkan-tools \
vainfo \
libmfx-gen1.2 \
intel-gpu-tools 2>/dev/null || msg_warn "Some Intel packages failed"