mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-06-16 20:41:19 +02:00
Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7c0896f80f | |||
| 4d4e1d7654 | |||
| 6b25e35ecf | |||
| 6c23883d94 | |||
| e08719ac3f | |||
| 0683d4942c | |||
| b0896dbdeb | |||
| f1ee2a2b91 | |||
| 691ce33090 | |||
| 5f5881c757 | |||
| af7e83300f | |||
| 29c25a0ab8 | |||
| e60c1f31c2 | |||
| f13782704e | |||
| 7ee47be436 | |||
| 868b256603 | |||
| 16bd4f473b | |||
| 77eb109927 | |||
| 55703ab0ec | |||
| 3c42589ff0 | |||
| 0d271f55a6 | |||
| 6762208d66 | |||
| dee66b996e | |||
| 4b20b8dab5 | |||
| a2f987f07b | |||
| 96d828f379 | |||
| 293d4b73a1 | |||
| cfb84ae12d | |||
| f37bf50a47 | |||
| 4a09cac506 | |||
| 5831cc246a | |||
| bcea631c30 | |||
| d9e6e6ea3d |
+1
@@ -28,6 +28,7 @@ jobs:
|
||||
const allowedBots = [
|
||||
"push-app-to-main[bot]",
|
||||
"push-app-to-main",
|
||||
"community-scripts-pr-app"
|
||||
];
|
||||
|
||||
if (allowedBots.includes(author)) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -483,8 +483,59 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
</details>
|
||||
|
||||
## 2026-06-16
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
- Feishin ([#15130](https://github.com/community-scripts/ProxmoxVE/pull/15130))
|
||||
- Kiwix ([#15131](https://github.com/community-scripts/ProxmoxVE/pull/15131))
|
||||
- Add runtime status guard and deleted script stubs [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15125](https://github.com/community-scripts/ProxmoxVE/pull/15125))
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix storyteller install failure with yarn 4 corepack [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15140](https://github.com/community-scripts/ProxmoxVE/pull/15140))
|
||||
- Fix InvoiceShelf install/update Yarn package manager mismatch [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15141](https://github.com/community-scripts/ProxmoxVE/pull/15141))
|
||||
- fix: generate policy-compliant OpenObserve root password [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#15137](https://github.com/community-scripts/ProxmoxVE/pull/15137))
|
||||
|
||||
## 2026-06-15
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Watcharr: Clean install on update [@tremor021](https://github.com/tremor021) ([#15119](https://github.com/community-scripts/ProxmoxVE/pull/15119))
|
||||
- Vaultwarden: extend version check for VaultWarden update [@MickLesk](https://github.com/MickLesk) ([#15105](https://github.com/community-scripts/ProxmoxVE/pull/15105))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- degoog: add curl-impersonate to script [@MickLesk](https://github.com/MickLesk) ([#15117](https://github.com/community-scripts/ProxmoxVE/pull/15117))
|
||||
|
||||
### 💾 Core
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- tools.func: extend mesa-vulkan-drivers and vulkan-tools to installation for ARC GPU's [@MickLesk](https://github.com/MickLesk) ([#15106](https://github.com/community-scripts/ProxmoxVE/pull/15106))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- core: improve mirror selection and error handling [@MickLesk](https://github.com/MickLesk) ([#15108](https://github.com/community-scripts/ProxmoxVE/pull/15108))
|
||||
- core: implement gateway validation for DHCP and static networks [@MickLesk](https://github.com/MickLesk) ([#15107](https://github.com/community-scripts/ProxmoxVE/pull/15107))
|
||||
|
||||
## 2026-06-14
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- Iinvoiceninja: fix nginx setup assets port [@MickLesk](https://github.com/MickLesk) ([#15090](https://github.com/community-scripts/ProxmoxVE/pull/15090))
|
||||
- CheckMK: remove stale backup site before creating new backup during update [@MickLesk](https://github.com/MickLesk) ([#15088](https://github.com/community-scripts/ProxmoxVE/pull/15088))
|
||||
|
||||
- #### 🔧 Refactor
|
||||
|
||||
- Refactor: Implement backup functions for scripts C-D [@tremor021](https://github.com/tremor021) ([#15096](https://github.com/community-scripts/ProxmoxVE/pull/15096))
|
||||
|
||||
## 2026-06-13
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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"
|
||||
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/jeffvli/feishin
|
||||
|
||||
APP="Feishin"
|
||||
var_tags="${var_tags:-music;player;streaming}"
|
||||
var_cpu="${var_cpu:-2}"
|
||||
var_ram="${var_ram:-4096}"
|
||||
var_disk="${var_disk:-8}"
|
||||
var_os="${var_os:-debian}"
|
||||
var_version="${var_version:-13}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if [[ ! -d /opt/feishin ]]; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
if check_for_gh_release "feishin" "jeffvli/feishin"; then
|
||||
create_backup /opt/feishin/.env
|
||||
|
||||
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "feishin" "jeffvli/feishin" "tarball"
|
||||
|
||||
msg_info "Rebuilding Feishin Web"
|
||||
cd /opt/feishin
|
||||
#PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/feishin/package.json)
|
||||
$STD corepack enable
|
||||
$STD corepack prepare "pnpm@10" --activate
|
||||
$STD pnpm install
|
||||
$STD pnpm run build:web
|
||||
msg_ok "Rebuilt Feishin Web"
|
||||
|
||||
restore_backup
|
||||
|
||||
msg_info "Publishing Web Assets"
|
||||
rm -rf /usr/share/nginx/html
|
||||
mkdir -p /usr/share/nginx/html
|
||||
cp -r /opt/feishin/out/web/. /usr/share/nginx/html/
|
||||
|
||||
set -a
|
||||
source /opt/feishin/.env
|
||||
set +a
|
||||
|
||||
envsubst </opt/feishin/settings.js.template >/etc/nginx/conf.d/settings.js
|
||||
envsubst '${PUBLIC_PATH}' </opt/feishin/ng.conf.template >/etc/nginx/sites-available/feishin
|
||||
ln -sf /etc/nginx/sites-available/feishin /etc/nginx/sites-enabled/feishin
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
systemctl restart nginx
|
||||
msg_ok "Published Web Assets"
|
||||
|
||||
msg_ok "Updated successfully!"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed Successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:9180${CL}"
|
||||
@@ -0,0 +1,6 @@
|
||||
____ __ __
|
||||
/ __ )____ ____ / /__/ / ____ ________
|
||||
/ __ / __ \/ __ \/ //_/ / / __ \/ ___/ _ \
|
||||
/ /_/ / /_/ / /_/ / ,< / /___/ /_/ / / / __/
|
||||
/_____/\____/\____/_/|_/_____/\____/_/ \___/
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
______ _ __ _
|
||||
/ ____/__ (_)____/ /_ (_)___
|
||||
/ /_ / _ \/ / ___/ __ \/ / __ \
|
||||
/ __/ / __/ (__ ) / / / / / / /
|
||||
/_/ \___/_/____/_/ /_/_/_/ /_/
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
__ __ _ _
|
||||
/ //_/(_) __(_) __
|
||||
/ ,< / / | /| / / / |/_/
|
||||
/ /| |/ /| |/ |/ / /> <
|
||||
/_/ |_/_/ |__/|__/_/_/|_|
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
__ _ __ __ __ __ ___
|
||||
/ / (_) /____ / / / / / |/ /
|
||||
/ / / / __/ _ \/ / / / / /|_/ /
|
||||
/ /___/ / /_/ __/ /___/ /___/ / / /
|
||||
/_____/_/\__/\___/_____/_____/_/ /_/
|
||||
|
||||
+8
-2
@@ -52,8 +52,14 @@ function update_script() {
|
||||
msg_info "Updating Application"
|
||||
cd /opt/invoiceshelf
|
||||
$STD composer install --no-dev --optimize-autoloader
|
||||
$STD yarn install
|
||||
$STD yarn build
|
||||
if command -v corepack >/dev/null 2>&1; then
|
||||
$STD corepack enable
|
||||
$STD corepack yarn install
|
||||
$STD corepack yarn build
|
||||
else
|
||||
$STD yarn install
|
||||
$STD yarn build
|
||||
fi
|
||||
$STD php artisan migrate --force
|
||||
$STD php artisan optimize:clear
|
||||
chown -R www-data:www-data /opt/invoiceshelf
|
||||
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/kiwix/kiwix-tools
|
||||
|
||||
APP="Kiwix"
|
||||
var_tags="${var_tags:-documentation;offline}"
|
||||
var_cpu="${var_cpu:-1}"
|
||||
var_ram="${var_ram:-512}"
|
||||
var_disk="${var_disk:-4}"
|
||||
var_os="${var_os:-ubuntu}"
|
||||
var_version="${var_version:-24.04}"
|
||||
var_arm64="${var_arm64:-no}"
|
||||
var_unprivileged="${var_unprivileged:-1}"
|
||||
|
||||
header_info "$APP"
|
||||
variables
|
||||
color
|
||||
catch_errors
|
||||
|
||||
function update_script() {
|
||||
header_info
|
||||
check_container_storage
|
||||
check_container_resources
|
||||
|
||||
if ! dpkg -s kiwix-tools &>/dev/null; then
|
||||
msg_error "No ${APP} Installation Found!"
|
||||
exit
|
||||
fi
|
||||
|
||||
CURRENT=$(dpkg-query -W -f='${Version}' kiwix-tools 2>/dev/null)
|
||||
|
||||
msg_info "Updating Package Index"
|
||||
$STD apt update
|
||||
msg_ok "Updated Package Index"
|
||||
|
||||
CANDIDATE=$(apt-cache policy kiwix-tools | awk '/Candidate:/{print $2}')
|
||||
if [[ -z "$CANDIDATE" || "$CANDIDATE" == "(none)" ]]; then
|
||||
msg_error "No Candidate Version Found for kiwix-tools"
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ "$CURRENT" == "$CANDIDATE" ]]; then
|
||||
echo "${CURRENT}" >/root/.kiwix
|
||||
msg_ok "Already on latest version: ${CURRENT}"
|
||||
exit
|
||||
fi
|
||||
|
||||
msg_info "Stopping Service"
|
||||
systemctl stop kiwix-serve
|
||||
msg_ok "Stopped Service"
|
||||
|
||||
msg_info "Updating Kiwix-Tools"
|
||||
$STD apt install -y --only-upgrade kiwix-tools
|
||||
RELEASE=$(dpkg-query -W -f='${Version}' kiwix-tools 2>/dev/null)
|
||||
echo "${RELEASE}" >/root/.kiwix
|
||||
msg_ok "Updated Kiwix-Tools"
|
||||
msg_ok "Updated successfully from ${CURRENT} to ${RELEASE}!"
|
||||
|
||||
msg_info "Starting Service"
|
||||
systemctl start kiwix-serve
|
||||
msg_ok "Started Service"
|
||||
exit
|
||||
}
|
||||
|
||||
start
|
||||
build_container
|
||||
description
|
||||
|
||||
msg_ok "Completed successfully!\n"
|
||||
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
|
||||
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
|
||||
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"
|
||||
@@ -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
@@ -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
|
||||
|
||||
+3
-2
@@ -48,13 +48,14 @@ function update_script() {
|
||||
msg_info "Rebuilding Storyteller"
|
||||
cd /opt/storyteller
|
||||
export NODE_OPTIONS="--max-old-space-size=4096"
|
||||
$STD yarn install --network-timeout 600000
|
||||
$STD corepack enable
|
||||
$STD corepack yarn install --network-timeout 600000
|
||||
$STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so
|
||||
export CI=1
|
||||
export NODE_ENV=production
|
||||
export NEXT_TELEMETRY_DISABLED=1
|
||||
export SQLITE_NATIVE_BINDING=/opt/storyteller/node_modules/better-sqlite3/build/Release/better_sqlite3.node
|
||||
$STD yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
|
||||
$STD corepack yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
|
||||
mkdir -p /opt/storyteller/web/.next/standalone/web/.next/static
|
||||
cp -rT /opt/storyteller/web/.next/static /opt/storyteller/web/.next/standalone/web/.next/static
|
||||
if [[ -d /opt/storyteller/web/public ]]; then
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ)
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/jeffvli/feishin
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y \
|
||||
nginx \
|
||||
gettext-base
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
NODE_VERSION="24" setup_nodejs
|
||||
|
||||
fetch_and_deploy_gh_release "feishin" "jeffvli/feishin" "tarball"
|
||||
|
||||
msg_info "Building Feishin Web"
|
||||
cd /opt/feishin
|
||||
#PNPM_VERSION=$(jq -r '.packageManager | ltrimstr("pnpm@")' /opt/feishin/package.json)
|
||||
$STD corepack enable
|
||||
$STD corepack prepare "pnpm@10" --activate
|
||||
$STD pnpm install
|
||||
$STD pnpm run build:web
|
||||
msg_ok "Built Feishin Web"
|
||||
|
||||
msg_info "Configuring Environment"
|
||||
cat <<EOF >/opt/feishin/.env
|
||||
SERVER_NAME=jellyfin
|
||||
SERVER_LOCK=false
|
||||
SERVER_TYPE=jellyfin
|
||||
SERVER_URL=http://localhost:8096
|
||||
REMOTE_URL=
|
||||
LEGACY_AUTHENTICATION=false
|
||||
ANALYTICS_DISABLED=false
|
||||
PUBLIC_PATH=/
|
||||
EOF
|
||||
msg_ok "Configured Environment"
|
||||
|
||||
msg_info "Publishing Web Assets"
|
||||
rm -rf /usr/share/nginx/html
|
||||
mkdir -p /usr/share/nginx/html
|
||||
cp -r /opt/feishin/out/web/. /usr/share/nginx/html/
|
||||
|
||||
set -a
|
||||
source /opt/feishin/.env
|
||||
set +a
|
||||
|
||||
envsubst </opt/feishin/settings.js.template >/etc/nginx/conf.d/settings.js
|
||||
envsubst '${PUBLIC_PATH}' </opt/feishin/ng.conf.template >/etc/nginx/sites-available/feishin
|
||||
|
||||
ln -sf /etc/nginx/sites-available/feishin /etc/nginx/sites-enabled/feishin
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
systemctl enable -q --now nginx
|
||||
systemctl reload nginx
|
||||
msg_ok "Published Web Assets"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,8 +39,14 @@ sed -i "s|^DB_USERNAME=.*|DB_USERNAME=${PG_DB_USER}|" .env
|
||||
sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=${PG_DB_PASS}|" .env
|
||||
COMPOSER_ALLOW_SUPERUSER=1 $STD composer install --no-dev --optimize-autoloader --no-interaction
|
||||
$STD php artisan key:generate
|
||||
$STD yarn install
|
||||
$STD yarn build
|
||||
if command -v corepack >/dev/null 2>&1; then
|
||||
$STD corepack enable
|
||||
$STD corepack yarn install
|
||||
$STD corepack yarn build
|
||||
else
|
||||
$STD yarn install
|
||||
$STD yarn build
|
||||
fi
|
||||
mkdir -p storage/framework/{cache,sessions,views} storage/logs bootstrap/cache
|
||||
chown -R www-data:www-data /opt/invoiceshelf
|
||||
chmod -R 775 storage bootstrap/cache
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2021-2026 community-scripts ORG
|
||||
# Author: MickLesk (CanbiZ) | tewalds
|
||||
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
||||
# Source: https://github.com/kiwix/kiwix-tools
|
||||
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
color
|
||||
verb_ip6
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Dependencies"
|
||||
$STD apt install -y software-properties-common
|
||||
msg_ok "Installed Dependencies"
|
||||
|
||||
msg_info "Adding Kiwix PPA"
|
||||
add-apt-repository -y ppa:kiwixteam/release >>"$(get_active_logfile)" 2>&1
|
||||
$STD apt update
|
||||
msg_ok "Added Kiwix PPA"
|
||||
|
||||
msg_info "Installing Kiwix-Tools"
|
||||
$STD apt install -y kiwix-tools
|
||||
RELEASE=$(dpkg -s kiwix-tools 2>/dev/null | awk '/^Version:/{print $2}')
|
||||
mkdir -p /data
|
||||
echo "${RELEASE}" >/root/.kiwix
|
||||
msg_ok "Installed Kiwix-Tools"
|
||||
|
||||
msg_info "Downloading Kiwix Test Archive"
|
||||
ZIM_BASE_URL="https://download.kiwix.org/zim/wikipedia"
|
||||
ZIM_FILE="$(CURL_TIMEOUT=60 CURL_CONNECT_TO=15 curl_with_retry "${ZIM_BASE_URL}/" "-" |
|
||||
grep -oE 'href="speedtest_en_blob_[0-9]{4}-[0-9]{2}\.zim"' |
|
||||
sed -E 's/^href="|"$//g' |
|
||||
sort -V |
|
||||
tail -n 1)" || true
|
||||
|
||||
if [[ -z "${ZIM_FILE}" ]]; then
|
||||
msg_warn "No Kiwix speedtest ZIM archive found - skipping optional download"
|
||||
else
|
||||
ZIM_URL="${ZIM_BASE_URL}/${ZIM_FILE}"
|
||||
ZIM_TEMP="/data/.${ZIM_FILE}.tmp"
|
||||
ZIM_TARGET="/data/${ZIM_FILE}"
|
||||
if ! CURL_TIMEOUT=120 CURL_CONNECT_TO=15 curl_with_retry "${ZIM_URL}" "${ZIM_TEMP}"; then
|
||||
rm -f "${ZIM_TEMP}"
|
||||
msg_warn "Failed to download Kiwix ZIM archive - skipping optional download"
|
||||
ZIM_FILE=""
|
||||
elif [[ ! -s "${ZIM_TEMP}" ]]; then
|
||||
rm -f "${ZIM_TEMP}"
|
||||
msg_warn "Downloaded Kiwix ZIM archive is empty - skipping optional download"
|
||||
ZIM_FILE=""
|
||||
else
|
||||
mv "${ZIM_TEMP}" "${ZIM_TARGET}"
|
||||
msg_ok "Downloaded Kiwix Test Archive (${ZIM_FILE})"
|
||||
fi
|
||||
fi
|
||||
|
||||
msg_info "Creating Service"
|
||||
cat <<'EOF' >/etc/systemd/system/kiwix-serve.service
|
||||
[Unit]
|
||||
Description=Kiwix ZIM Server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/bin/sh -c 'exec /usr/bin/kiwix-serve --port 8080 /data/*.zim'
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
systemctl enable -q --now kiwix-serve
|
||||
msg_ok "Created Service"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
@@ -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
|
||||
@@ -17,7 +17,7 @@ msg_info "Installing OpenObserve"
|
||||
mkdir -p /opt/openobserve/data
|
||||
RELEASE=$(get_latest_github_release "openobserve/openobserve")
|
||||
tar zxf <(curl -fsSL https://downloads.openobserve.ai/releases/openobserve/v$RELEASE/openobserve-v$RELEASE-linux-amd64.tar.gz) -C /opt/openobserve
|
||||
ROOT_PASS=$(openssl rand -base64 18 | cut -c1-13)
|
||||
ROOT_PASS="$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c9)Aa1!"
|
||||
|
||||
cat <<EOF >/opt/openobserve/data/.env
|
||||
ZO_ROOT_USER_EMAIL = "admin@example.com"
|
||||
|
||||
@@ -32,7 +32,8 @@ fetch_and_deploy_gl_release "storyteller" "storyteller-platform/storyteller" "ta
|
||||
|
||||
msg_info "Setting up Storyteller"
|
||||
cd /opt/storyteller
|
||||
$STD yarn install --network-timeout 600000
|
||||
$STD corepack enable
|
||||
$STD corepack yarn install --network-timeout 600000
|
||||
$STD gcc -g -fPIC -rdynamic -shared web/sqlite/uuid.c -o web/sqlite/uuid.c.so
|
||||
STORYTELLER_SECRET_KEY=$(openssl rand -base64 32)
|
||||
cat <<EOF >/opt/storyteller/.env
|
||||
@@ -58,7 +59,7 @@ export CI=1
|
||||
export NODE_ENV=production
|
||||
export NEXT_TELEMETRY_DISABLED=1
|
||||
export SQLITE_NATIVE_BINDING=/opt/storyteller/node_modules/better-sqlite3/build/Release/better_sqlite3.node
|
||||
$STD yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
|
||||
$STD corepack yarn workspaces foreach -Rpt --from @storyteller-platform/web --exclude @storyteller-platform/eslint run build
|
||||
mkdir -p /opt/storyteller/web/.next/standalone/web/.next/static
|
||||
cp -rT /opt/storyteller/web/.next/static /opt/storyteller/web/.next/standalone/web/.next/static
|
||||
if [[ -d /opt/storyteller/web/public ]]; then
|
||||
|
||||
+85
-4
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user